From 08f32dfc504d0becc14bb1d03bacf2c4034d6fe4 Mon Sep 17 00:00:00 2001 From: Dmitrii Date: Fri, 17 May 2024 11:33:04 +0300 Subject: [PATCH] Refactor: Changing packages structure, cleaning up JPA entities (RA-79) --- .../rosetta/RosettaApiApplication.java | 12 ++ .../model/entity/AddressBalanceEntity.java | 9 +- .../model/entity/AddressBalanceId.java | 14 -- .../model/entity/AddressUtxoEntity.java | 8 +- .../entity/StakeAddressBalanceEntity.java | 11 +- .../model/entity/StakeAddressBalanceId.java | 11 -- .../api/account/model/entity/UtxoId.java | 12 -- .../account/service/AccountServiceImpl.java | 4 +- .../block/model/entity/BlockAwareEntity.java | 15 +-- .../api/block/model/entity/BlockEntity.java | 7 +- .../block/model/entity/DelegationEntity.java | 8 +- .../api/block/model/entity/DelegationId.java | 3 - .../block/model/entity/EpochParamEntity.java | 23 +--- .../model/entity/PoolRegistrationEntity.java | 10 +- .../model/entity/PoolRegistrationId.java | 4 - .../model/entity/PoolRetirementEntity.java | 15 +-- .../block/model/entity/PoolRetirementId.java | 4 - .../model/entity/ProtocolParamsEntity.java | 7 +- .../model/entity/StakeRegistrationEntity.java | 8 +- .../model/entity/StakeRegistrationId.java | 3 - .../api/block/model/entity/TxInputEntity.java | 11 +- .../api/block/model/entity/TxOuput.java | 26 ---- .../block/model/entity/TxScriptEntity.java | 8 +- .../api/block/model/entity/TxnEntity.java | 4 +- .../api/block/model/entity/UtxoKey.java | 2 - .../block/model/entity/WithdrawalEntity.java | 7 +- .../api/block/model/entity/WithdrawalId.java | 11 +- .../block/service/LedgerBlockServiceImpl.java | 4 +- .../service/CardanoConstructionService.java | 5 + .../CardanoConstructionServiceImpl.java | 60 ++++++++- .../service/ConstructionApiServiceImpl.java | 6 +- .../service}/LedgerDataProviderService.java | 2 +- .../PostgresLedgerDataProviderService.java | 6 +- .../rosetta/common/enumeration/NetworkId.java | 6 - .../common/enumeration/RewardType.java | 9 -- .../common/enumeration/ScriptPurposetype.java | 4 - .../common/enumeration/SyncStateType.java | 4 - .../exception/GlobalExceptionHandler.java | 6 + .../CustomRequestBodyAdviceAdapter.java | 36 ------ .../CustomResponseBodyAdviceAdapter.java | 38 ------ .../common/interceptor/LogInterceptor.java | 30 ----- .../rosetta/common/mapper/DataMapper.java | 121 +++++++++--------- .../services/CardanoAddressService.java | 13 -- .../common/services/LoggingService.java | 10 -- .../common/services/ProtocolParamService.java | 6 +- .../services/ProtocolParamServiceImpl.java | 47 +++++++ .../impl/CardanoAddressServiceImpl.java | 74 ----------- .../services/impl/LoggingServiceImpl.java | 92 ------------- .../impl/ProtocolParamServiceImpl.java | 62 --------- .../rosetta/config/SpringWebConfig.java | 10 -- .../resources/config/application-dev.yaml | 19 +++ .../main/resources/config/application-h2.yaml | 22 ++++ .../resources/config/application-staging.yaml | 9 ++ .../resources/config/application-test.yaml | 9 ++ .../model/domain/AddressBalanceTest.java | 7 +- .../api/account/model/domain/UtxoTest.java | 5 +- .../service/AccountServiceImplTest.java | 8 +- .../WithdrawalEntityToWithdrawalTest.java | 5 +- .../mapper/ProtocolParamsToEntityTest.java | 5 +- .../impl/CardanoAddressServiceImplTest.java | 94 -------------- .../CardanoConstructionServiceImplTest.java | 77 +++++++++++ .../impl/ProtocolParamServiceImplTest.java | 20 ++- 62 files changed, 404 insertions(+), 784 deletions(-) delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxOuput.java rename api/src/main/java/org/cardanofoundation/rosetta/{common/services => api/construction/service}/LedgerDataProviderService.java (91%) rename api/src/main/java/org/cardanofoundation/rosetta/{common/services/impl => api/construction/service}/PostgresLedgerDataProviderService.java (93%) delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkId.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/RewardType.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/ScriptPurposetype.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/SyncStateType.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomRequestBodyAdviceAdapter.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomResponseBodyAdviceAdapter.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/LogInterceptor.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/services/CardanoAddressService.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/services/LoggingService.java create mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/services/ProtocolParamServiceImpl.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/CardanoAddressServiceImpl.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/LoggingServiceImpl.java delete mode 100644 api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImpl.java delete mode 100644 api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoAddressServiceImplTest.java diff --git a/api/src/main/java/org/cardanofoundation/rosetta/RosettaApiApplication.java b/api/src/main/java/org/cardanofoundation/rosetta/RosettaApiApplication.java index 409bc47c9..00f3d4ce4 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/RosettaApiApplication.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/RosettaApiApplication.java @@ -14,6 +14,7 @@ import org.springframework.core.Ordered; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.RestTemplate; +import org.springframework.web.filter.CommonsRequestLoggingFilter; import org.springframework.web.filter.ForwardedHeaderFilter; import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.info.Info; @@ -58,4 +59,15 @@ public JsonNullableModule jsonNullableModule() { public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } + + @Bean + public CommonsRequestLoggingFilter logFilter() { + CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); + filter.setIncludeQueryString(true); + filter.setIncludePayload(true); + filter.setMaxPayloadLength(10000); + filter.setIncludeHeaders(false); + filter.setAfterMessagePrefix("REQUEST DATA: \n"); + return filter; + } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceEntity.java index ead4bef44..be5e58889 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceEntity.java @@ -8,21 +8,16 @@ import jakarta.persistence.Table; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -import org.hibernate.annotations.DynamicUpdate; - -@Data +@Getter @NoArgsConstructor @AllArgsConstructor -@SuperBuilder @Entity @Table(name = "address_balance") @IdClass(AddressBalanceId.class) -@DynamicUpdate public class AddressBalanceEntity { @Id diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceId.java index dce047a45..5e87937d9 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressBalanceId.java @@ -1,27 +1,13 @@ package org.cardanofoundation.rosetta.api.account.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -@Getter -@NoArgsConstructor -@AllArgsConstructor @EqualsAndHashCode -@Builder public class AddressBalanceId implements Serializable { - @Column(name = "address") private String address; - - @Column(name = "unit") private String unit; - - @Column(name = "slot") private Long slot; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java index 3e54c3c9b..736e1623e 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java @@ -8,24 +8,20 @@ import jakarta.persistence.Table; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import io.hypersistence.utils.hibernate.type.json.JsonType; -import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.Type; import org.cardanofoundation.rosetta.api.account.model.domain.Amt; -@Data +@Getter @NoArgsConstructor @AllArgsConstructor -@SuperBuilder @Entity @Table(name = "address_utxo") @IdClass(UtxoId.class) -@DynamicUpdate public class AddressUtxoEntity { @Id diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceEntity.java index 3efc2e8f5..399e6a911 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceEntity.java @@ -7,25 +7,18 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import org.hibernate.annotations.DynamicUpdate; import org.cardanofoundation.rosetta.api.block.model.entity.BlockAwareEntity; @EqualsAndHashCode(callSuper = true) -@Data @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder +@Getter @Entity @Table(name = "stake_address_balance") @IdClass(StakeAddressBalanceId.class) -@DynamicUpdate public class StakeAddressBalanceEntity extends BlockAwareEntity { @Id diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceId.java index c1cca646b..3c90df139 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/StakeAddressBalanceId.java @@ -1,23 +1,12 @@ package org.cardanofoundation.rosetta.api.account.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -@Getter -@NoArgsConstructor -@AllArgsConstructor @EqualsAndHashCode -@Builder public class StakeAddressBalanceId implements Serializable { - @Column(name = "address") private String address; - @Column(name = "slot") private Long slot; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/UtxoId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/UtxoId.java index ab45ea11e..d61f32ff0 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/UtxoId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/UtxoId.java @@ -1,24 +1,12 @@ package org.cardanofoundation.rosetta.api.account.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -@Getter -@NoArgsConstructor -@AllArgsConstructor @EqualsAndHashCode -@Builder public class UtxoId implements Serializable { - @Column(name = "tx_hash") private String txHash; - - @Column(name = "output_index") private Integer outputIndex; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImpl.java index 1c717648f..f52919ac1 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImpl.java @@ -20,9 +20,9 @@ import org.cardanofoundation.rosetta.api.block.model.domain.Block; import org.cardanofoundation.rosetta.api.block.model.domain.StakeAddressBalance; import org.cardanofoundation.rosetta.api.block.service.LedgerBlockService; +import org.cardanofoundation.rosetta.api.construction.service.LedgerDataProviderService; import org.cardanofoundation.rosetta.common.exception.ExceptionFactory; import org.cardanofoundation.rosetta.common.mapper.DataMapper; -import org.cardanofoundation.rosetta.common.services.LedgerDataProviderService; import org.cardanofoundation.rosetta.common.util.CardanoAddressUtils; import org.cardanofoundation.rosetta.common.util.ValidationUtil; @@ -83,7 +83,7 @@ public AccountCoinsResponse getAccountCoins(AccountCoinsRequest accountCoinsRequ private AccountBalanceResponse findBalanceDataByAddressAndBlock(String address, Long number, String hash) { - return findBlockOrLast(number, hash) + return findBlockOrLast(number, hash) .map(blockDto -> { log.info("Looking for utxos for address {} and block {}", address, diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockAwareEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockAwareEntity.java index 0f4f2dcde..8d01f9224 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockAwareEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockAwareEntity.java @@ -4,18 +4,14 @@ import jakarta.persistence.Column; import jakarta.persistence.MappedSuperclass; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -import org.hibernate.annotations.UpdateTimestamp; - -@Data -@MappedSuperclass +@Getter +@EqualsAndHashCode @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder +@MappedSuperclass public class BlockAwareEntity { @Column(name = "block") @@ -24,7 +20,6 @@ public class BlockAwareEntity { @Column(name = "block_time") private Long blockTime; - @UpdateTimestamp @Column(name = "update_datetime") private LocalDateTime updateDateTime; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java index 382baaaaa..4c2b66a32 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java @@ -14,13 +14,11 @@ import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; - -@Data +@Getter @NoArgsConstructor @AllArgsConstructor @Builder @@ -44,7 +42,6 @@ public class BlockEntity { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "prev_hash", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT, name = "none")) - @EqualsAndHashCode.Exclude private BlockEntity prev; @OneToMany(fetch = FetchType.LAZY, mappedBy = "block") diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationEntity.java index 81415d006..42cc6f148 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationEntity.java @@ -6,15 +6,11 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -@Data +@Getter @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder @Entity @Table(name = "delegation") @IdClass(DelegationId.class) diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationId.java index acd120916..3489f8f1b 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/DelegationId.java @@ -1,15 +1,12 @@ package org.cardanofoundation.rosetta.api.block.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; import lombok.EqualsAndHashCode; @EqualsAndHashCode public class DelegationId implements Serializable { - @Column(name = "tx_hash") private String txHash; - @Column(name = "cert_index") private long certIndex; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/EpochParamEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/EpochParamEntity.java index 9deda7715..537591335 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/EpochParamEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/EpochParamEntity.java @@ -3,26 +3,20 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; -import jakarta.persistence.PrePersist; import jakarta.persistence.Table; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -import lombok.extern.slf4j.Slf4j; import io.hypersistence.utils.hibernate.type.json.JsonType; import org.hibernate.annotations.Type; - -@Data -@NoArgsConstructor +@Getter @AllArgsConstructor -@SuperBuilder +@NoArgsConstructor @Entity @Table(name = "epoch_param") -@Slf4j public class EpochParamEntity { @Id @@ -33,15 +27,4 @@ public class EpochParamEntity { @Column(name = "params", columnDefinition = "json") private ProtocolParamsEntity params; - @PrePersist - public void preSave() { - if (this.getParams() == null) { - return; - } - - //reset these fields - if (this.getParams().getCostModels() != null) { - this.getParams().setCostModels(null); - } - } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationEntity.java index fbffd3b62..52811cab0 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationEntity.java @@ -9,24 +9,18 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import com.bloxbean.cardano.yaci.core.model.Relay; import io.hypersistence.utils.hibernate.type.json.JsonType; -import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.Type; -@Data +@Getter @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder @Entity @Table(name = "pool_registration") @IdClass(PoolRegistrationId.class) -@DynamicUpdate public class PoolRegistrationEntity { @Id diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationId.java index 62375666c..526ceeb50 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRegistrationId.java @@ -1,16 +1,12 @@ package org.cardanofoundation.rosetta.api.block.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; import lombok.EqualsAndHashCode; @EqualsAndHashCode public class PoolRegistrationId implements Serializable { - @Column(name = "tx_hash") private String txHash; - - @Column(name = "cert_index") private int certIndex; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementEntity.java index 57a27a6eb..483003dbf 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementEntity.java @@ -6,21 +6,15 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -import org.hibernate.annotations.DynamicUpdate; -@Data +@Getter @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder @Entity @Table(name = "pool_retirement") @IdClass(PoolRetirementId.class) -@DynamicUpdate public class PoolRetirementEntity { @Id @@ -34,9 +28,8 @@ public class PoolRetirementEntity { @Column(name = "pool_id") private String poolId; - // TODO check which epoch to use. Current or retirement epoch -// @Column(name = "retirement_epoch") -// private int retirementEpoch; + // TO check which epoch to use. Current or retirement epoch + // Could be used another column to fetch the retirement epoch (retirement_epoch) @Column(name = "epoch") private Integer epoch; //current epoch diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementId.java index 4b5a71348..b62d65ec8 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/PoolRetirementId.java @@ -1,16 +1,12 @@ package org.cardanofoundation.rosetta.api.block.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; import lombok.EqualsAndHashCode; @EqualsAndHashCode public class PoolRetirementId implements Serializable { - @Column(name = "tx_hash") private String txHash; - - @Column(name = "cert_index") private int certIndex; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/ProtocolParamsEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/ProtocolParamsEntity.java index eb556da71..a998c4194 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/ProtocolParamsEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/ProtocolParamsEntity.java @@ -6,8 +6,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; @@ -15,7 +16,8 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder @@ -23,6 +25,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class ProtocolParamsEntity { + private Integer minFeeA; //0 private Integer minFeeB; //1 private Integer maxBlockSize; //2 diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationEntity.java index 9fb15a31d..5c77269e4 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationEntity.java @@ -8,17 +8,13 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import com.bloxbean.cardano.yaci.core.model.certs.CertificateType; -@Data +@Getter @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder @Entity @Table(name = "stake_registration") @IdClass(StakeRegistrationId.class) diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationId.java index 5c86bd10b..9f6bb0099 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/StakeRegistrationId.java @@ -1,15 +1,12 @@ package org.cardanofoundation.rosetta.api.block.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; import lombok.EqualsAndHashCode; @EqualsAndHashCode public class StakeRegistrationId implements Serializable { - @Column(name = "tx_hash") private String txHash; - @Column(name = "cert_index") private long certIndex; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxInputEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxInputEntity.java index 8658f2623..0bd21ec93 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxInputEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxInputEntity.java @@ -6,23 +6,16 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import org.hibernate.annotations.DynamicUpdate; import org.cardanofoundation.rosetta.api.account.model.entity.UtxoId; -@Data +@Getter @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder @Entity @Table(name = "tx_input") @IdClass(UtxoId.class) -@DynamicUpdate public class TxInputEntity { @Id diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxOuput.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxOuput.java deleted file mode 100644 index 95b1b2fc4..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxOuput.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.cardanofoundation.rosetta.api.block.model.entity; - -import java.io.Serializable; -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import org.cardanofoundation.rosetta.api.account.model.domain.Amt; - -//Not used -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class TxOuput implements Serializable { - - private String address; - - private List amounts; - private String dataHash; - private String inlineDatum; - private String referenceScriptHash; -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxScriptEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxScriptEntity.java index 5d9c3f071..1b5fac580 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxScriptEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxScriptEntity.java @@ -11,19 +11,15 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import com.bloxbean.cardano.client.plutus.spec.RedeemerTag; import org.cardanofoundation.rosetta.common.enumeration.ScriptType; -@Data +@Getter @NoArgsConstructor -@AllArgsConstructor -@SuperBuilder @Entity @Table(name = "transaction_scripts") public class TxScriptEntity { diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxnEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxnEntity.java index c35e35d8c..14ee6f83a 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxnEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/TxnEntity.java @@ -15,13 +15,13 @@ import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; import io.hypersistence.utils.hibernate.type.json.JsonType; import org.hibernate.annotations.Type; -@Data +@Getter @NoArgsConstructor @AllArgsConstructor @Builder diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/UtxoKey.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/UtxoKey.java index 6776d8d39..a68d3162d 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/UtxoKey.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/UtxoKey.java @@ -3,7 +3,6 @@ import java.io.Serializable; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,7 +14,6 @@ @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode -@Builder @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class UtxoKey implements Serializable { diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalEntity.java index 6bf3d72dc..1188bc68d 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalEntity.java @@ -8,18 +8,17 @@ import jakarta.persistence.Table; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -@Data +@Getter @NoArgsConstructor @AllArgsConstructor -@SuperBuilder @Entity @Table(name = "withdrawal") @IdClass(WithdrawalId.class) public class WithdrawalEntity { + @Id @Column(name = "address") private String address; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalId.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalId.java index 1354445d9..7f934d9cc 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalId.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/WithdrawalId.java @@ -1,15 +1,12 @@ package org.cardanofoundation.rosetta.api.block.model.entity; import java.io.Serializable; -import jakarta.persistence.Column; -import lombok.EqualsAndHashCode; +import lombok.Data; -@EqualsAndHashCode +@Data public class WithdrawalId implements Serializable { - @Column(name = "address") - private String address; - @Column(name = "tx_hash") - private String txHash; + private String address; + private String txHash; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java index 3ca57c2b7..f6d696e4e 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import jakarta.transaction.Transactional; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; @@ -120,6 +121,7 @@ public GenesisBlock findGenesisBlock() { } + @Transactional private void populateTransaction(BlockTx transaction) { Optional.ofNullable(transaction.getInputs()) @@ -167,7 +169,7 @@ private void populateTransaction(BlockTx transaction) { .map(withdrawalEntityToWithdrawal::fromEntity) .toList()); - ProtocolParams pps = protocolParamService.findProtocolParametersFromIndexerAndConfig(); + ProtocolParams pps = protocolParamService.findProtocolParametersFromIndexer(); transaction.setSize(calcSize(transaction, pps)); } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionService.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionService.java index eff3b87cf..306ad93a8 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionService.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionService.java @@ -14,12 +14,14 @@ import com.bloxbean.cardano.client.transaction.spec.TransactionWitnessSet; import org.openapitools.client.model.DepositParameters; import org.openapitools.client.model.Operation; +import org.openapitools.client.model.PublicKey; import org.openapitools.client.model.SigningPayload; import org.cardanofoundation.rosetta.api.block.model.domain.ProcessOperations; import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams; import org.cardanofoundation.rosetta.common.enumeration.AddressType; import org.cardanofoundation.rosetta.common.enumeration.EraAddressType; +import org.cardanofoundation.rosetta.common.enumeration.NetworkEnum; import org.cardanofoundation.rosetta.common.enumeration.NetworkIdentifierType; import org.cardanofoundation.rosetta.common.model.cardano.crypto.Signatures; import org.cardanofoundation.rosetta.common.model.cardano.transaction.TransactionParsed; @@ -65,4 +67,7 @@ ProcessOperations convertRosettaOperations(NetworkIdentifierType networkIdentifi DepositParameters getDepositParameters(); String extractTransactionIfNeeded(String txWithExtraData); + + String getCardanoAddress(AddressType addressType, PublicKey stakingCredential, + PublicKey publicKey, NetworkEnum networkEnum); } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java index 8a6320cd7..9eac4e0e5 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java @@ -25,10 +25,13 @@ import co.nstant.in.cbor.model.MajorType; import co.nstant.in.cbor.model.UnicodeString; import co.nstant.in.cbor.model.UnsignedInteger; +import com.bloxbean.cardano.client.address.Address; +import com.bloxbean.cardano.client.address.AddressProvider; import com.bloxbean.cardano.client.address.ByronAddress; import com.bloxbean.cardano.client.common.cbor.CborSerializationUtil; import com.bloxbean.cardano.client.crypto.Blake2bUtil; import com.bloxbean.cardano.client.crypto.VerificationKey; +import com.bloxbean.cardano.client.crypto.bip32.key.HdPublicKey; import com.bloxbean.cardano.client.exception.AddressExcepion; import com.bloxbean.cardano.client.exception.CborDeserializationException; import com.bloxbean.cardano.client.exception.CborSerializationException; @@ -43,6 +46,7 @@ import org.openapitools.client.model.AccountIdentifier; import org.openapitools.client.model.DepositParameters; import org.openapitools.client.model.Operation; +import org.openapitools.client.model.PublicKey; import org.openapitools.client.model.SignatureType; import org.openapitools.client.model.SigningPayload; @@ -53,6 +57,7 @@ import org.cardanofoundation.rosetta.api.block.service.LedgerBlockService; import org.cardanofoundation.rosetta.common.enumeration.AddressType; import org.cardanofoundation.rosetta.common.enumeration.EraAddressType; +import org.cardanofoundation.rosetta.common.enumeration.NetworkEnum; import org.cardanofoundation.rosetta.common.enumeration.NetworkIdentifierType; import org.cardanofoundation.rosetta.common.exception.ApiException; import org.cardanofoundation.rosetta.common.exception.ExceptionFactory; @@ -536,7 +541,7 @@ public String submitTransaction(String signedTransaction) throws ApiException { */ @Override public DepositParameters getDepositParameters() { - ProtocolParams pp = protocolParamService.findProtocolParametersFromIndexerAndConfig(); + ProtocolParams pp = protocolParamService.findProtocolParametersFromIndexer(); return new DepositParameters(pp.getKeyDeposit().toString(), pp.getPoolDeposit().toString()); } @@ -566,4 +571,57 @@ public String extractTransactionIfNeeded(String txWithExtraData) { return txWithExtraData; } } + + @Override + public String getCardanoAddress(AddressType addressType, PublicKey stakingCredential, PublicKey publicKey, NetworkEnum networkEnum) { + if(publicKey == null) + throw ExceptionFactory.publicKeyMissing(); + String address; + switch (addressType) { + case BASE: + log.debug("Deriving base address"); + if(stakingCredential == null) + throw ExceptionFactory.missingStakingKeyError(); + log.debug("Deriving base address with staking credential: {}", stakingCredential); + Address baseAddress = AddressProvider.getBaseAddress(getHdPublicKeyFromRosettaKey(publicKey), getHdPublicKeyFromRosettaKey(stakingCredential), networkEnum.getNetwork()); + address = baseAddress.getAddress(); + break; + case REWARD: + log.debug("Deriving reward address"); + Address rewardAddress; + if(stakingCredential == null) { + rewardAddress= AddressProvider.getRewardAddress(getHdPublicKeyFromRosettaKey(publicKey), networkEnum.getNetwork()); + log.debug("Deriving reward address with staking credential: {}", publicKey); + } else { + rewardAddress= AddressProvider.getRewardAddress(getHdPublicKeyFromRosettaKey(stakingCredential), networkEnum.getNetwork()); + log.debug("Deriving reward address with staking credential: {}", stakingCredential); + } + address = rewardAddress.getAddress(); + break; + case ENTERPRISE: + log.info("Deriving enterprise address"); + Address enterpriseAddress = AddressProvider.getEntAddress(getHdPublicKeyFromRosettaKey(publicKey), networkEnum.getNetwork()); + address = enterpriseAddress.getAddress(); + break; + default: + log.error("Invalid address type: {}", addressType); + throw ExceptionFactory.invalidAddressTypeError(); + } + return address; + } + + public HdPublicKey getHdPublicKeyFromRosettaKey(PublicKey publicKey) { + byte[] pubKeyBytes = HexUtil.decodeHexString(publicKey.getHexBytes()); + HdPublicKey pubKey; + if(pubKeyBytes.length == 32) { + pubKey = new HdPublicKey(); + pubKey.setKeyData(pubKeyBytes); + } else if(pubKeyBytes.length == 64) { + pubKey = HdPublicKey.fromBytes(pubKeyBytes); + } else { + log.error("Invalid public key length: {}", pubKeyBytes.length); + throw new IllegalArgumentException("Invalid public key length"); + } + return pubKey; + } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java index a4bc6c056..ebe4cb347 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java @@ -51,7 +51,6 @@ import org.cardanofoundation.rosetta.common.model.cardano.transaction.TransactionExtraData; import org.cardanofoundation.rosetta.common.model.cardano.transaction.TransactionParsed; import org.cardanofoundation.rosetta.common.model.cardano.transaction.UnsignedTransaction; -import org.cardanofoundation.rosetta.common.services.CardanoAddressService; import org.cardanofoundation.rosetta.common.services.ProtocolParamService; import org.cardanofoundation.rosetta.common.util.CborEncodeUtil; import org.cardanofoundation.rosetta.common.util.Constants; @@ -61,7 +60,6 @@ @RequiredArgsConstructor public class ConstructionApiServiceImpl implements ConstructionApiService { - private final CardanoAddressService cardanoAddressService; private final CardanoConstructionService cardanoConstructionService; private final ProtocolParamService protocolParamService; private final DataMapper dataMapper; @@ -88,7 +86,7 @@ public ConstructionDeriveResponse constructionDeriveService( stakingCredential = Optional.ofNullable(metadata.getStakingCredential()) .orElseThrow(ExceptionFactory::missingStakingKeyError); } - String address = cardanoAddressService.getCardanoAddress(addressType, stakingCredential, + String address = cardanoConstructionService.getCardanoAddress(addressType, stakingCredential, publicKey, network); return new ConstructionDeriveResponse(null, new AccountIdentifier(address, null, null), null); } @@ -135,7 +133,7 @@ public ConstructionMetadataResponse constructionMetadataService( Long updatedTxSize = cardanoConstructionService.updateTxSize(txSize.longValue(), 0L, ttl); log.debug("[constructionMetadata] updated txSize size is ${updatedTxSize}"); ProtocolParams protocolParams = - protocolParamService.findProtocolParametersFromIndexerAndConfig(); + protocolParamService.findProtocolParametersFromIndexer(); log.debug("[constructionMetadata] received protocol parameters from block-service {}", protocolParams); Long suggestedFee = cardanoConstructionService.calculateTxMinimumFee(updatedTxSize, diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/services/LedgerDataProviderService.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/LedgerDataProviderService.java similarity index 91% rename from api/src/main/java/org/cardanofoundation/rosetta/common/services/LedgerDataProviderService.java rename to api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/LedgerDataProviderService.java index 9efae7a73..7aacda9f5 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/services/LedgerDataProviderService.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/LedgerDataProviderService.java @@ -1,4 +1,4 @@ -package org.cardanofoundation.rosetta.common.services; +package org.cardanofoundation.rosetta.api.construction.service; import java.util.List; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/PostgresLedgerDataProviderService.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/PostgresLedgerDataProviderService.java similarity index 93% rename from api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/PostgresLedgerDataProviderService.java rename to api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/PostgresLedgerDataProviderService.java index e36c2bce5..6c30e2c5d 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/PostgresLedgerDataProviderService.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/PostgresLedgerDataProviderService.java @@ -1,4 +1,4 @@ -package org.cardanofoundation.rosetta.common.services.impl; +package org.cardanofoundation.rosetta.api.construction.service; import java.util.List; @@ -20,7 +20,6 @@ import org.cardanofoundation.rosetta.api.block.model.domain.StakeAddressBalance; import org.cardanofoundation.rosetta.api.block.model.entity.UtxoKey; import org.cardanofoundation.rosetta.api.block.model.repository.StakeAddressRepository; -import org.cardanofoundation.rosetta.common.services.LedgerDataProviderService; import org.cardanofoundation.rosetta.common.util.Formatters; @Slf4j @@ -60,8 +59,7 @@ public List findUtxoByAddressAndCurrency(String address, List cu private Utxo createUtxoModel(List currencies, AddressUtxoEntity entity) { Utxo utxoModel = mapper.map( - UtxoKey.builder().outputIndex(entity.getOutputIndex()).txHash(entity.getTxHash()).build(), - Utxo.class); + new UtxoKey(entity.getTxHash(), entity.getOutputIndex()), Utxo.class); utxoModel.setAmounts(getAmts(currencies, entity)); return utxoModel; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkId.java b/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkId.java deleted file mode 100644 index ff07dd6c9..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkId.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.cardanofoundation.rosetta.common.enumeration; - -public enum NetworkId { - TESTNET, - MAINNET -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/RewardType.java b/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/RewardType.java deleted file mode 100644 index bebcbe944..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/RewardType.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.cardanofoundation.rosetta.common.enumeration; - -public enum RewardType { - LEADER, - MEMBER, - RESERVES, - TREASURY, - REFUND -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/ScriptPurposetype.java b/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/ScriptPurposetype.java deleted file mode 100644 index b937a586b..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/ScriptPurposetype.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.cardanofoundation.rosetta.common.enumeration; - -public enum ScriptPurposetype { -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/SyncStateType.java b/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/SyncStateType.java deleted file mode 100644 index f4af6b011..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/SyncStateType.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.cardanofoundation.rosetta.common.enumeration; - -public enum SyncStateType { -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/exception/GlobalExceptionHandler.java b/api/src/main/java/org/cardanofoundation/rosetta/common/exception/GlobalExceptionHandler.java index 880f63cc4..a78cf321d 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/exception/GlobalExceptionHandler.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/exception/GlobalExceptionHandler.java @@ -3,6 +3,8 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; + import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -11,12 +13,14 @@ import org.cardanofoundation.rosetta.common.util.RosettaConstants.RosettaErrorType; +@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity handleGlobalException(Exception exception, HttpServletRequest request) { + log.error("An error occurred during the request", exception); Error errorResponse = RosettaErrorType.UNSPECIFIED_ERROR.toRosettaError(true, new Details("An error occurred for request " + request.getRequestId() + ": " @@ -27,12 +31,14 @@ public ResponseEntity handleGlobalException(Exception exception, @ExceptionHandler(ApiException.class) public ResponseEntity handleApiException(ApiException apiException) { + log.error("An API exception has raised", apiException); return new ResponseEntity<>(apiException.getError(), HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleMethodArgumentNotValidException( MethodArgumentNotValidException methodArgumentNotValidException, HttpServletRequest request) { + log.error("An error occurred during the validation", methodArgumentNotValidException); List errors = methodArgumentNotValidException.getBindingResult().getFieldErrors() .stream() diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomRequestBodyAdviceAdapter.java b/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomRequestBodyAdviceAdapter.java deleted file mode 100644 index 5e81fddad..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomRequestBodyAdviceAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.cardanofoundation.rosetta.common.interceptor; - -import java.lang.reflect.Type; -import jakarta.servlet.http.HttpServletRequest; - -import lombok.RequiredArgsConstructor; - -import org.springframework.core.MethodParameter; -import org.springframework.http.HttpInputMessage; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter; - -import org.cardanofoundation.rosetta.common.services.LoggingService; - -@ControllerAdvice -@RequiredArgsConstructor -public class CustomRequestBodyAdviceAdapter extends RequestBodyAdviceAdapter { - - final LoggingService loggingService; - - final HttpServletRequest httpServletRequest; - - @Override - public boolean supports(MethodParameter methodParameter, Type type, Class> aClass) { - return true; - } - - @Override - public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, - Class> converterType) { - loggingService.logRequest(httpServletRequest, body); - - return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType); - } -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomResponseBodyAdviceAdapter.java b/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomResponseBodyAdviceAdapter.java deleted file mode 100644 index e5a09ba89..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/CustomResponseBodyAdviceAdapter.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.cardanofoundation.rosetta.common.interceptor; - -import lombok.RequiredArgsConstructor; - -import org.springframework.core.MethodParameter; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.http.server.ServletServerHttpRequest; -import org.springframework.http.server.ServletServerHttpResponse; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; - -import org.cardanofoundation.rosetta.common.services.LoggingService; - -@ControllerAdvice -@RequiredArgsConstructor -public class CustomResponseBodyAdviceAdapter implements ResponseBodyAdvice { - - final LoggingService loggingService; - - @Override - public boolean supports(MethodParameter methodParameter, Class> aClass) { - return true; - } - - @Override - public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, - Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { - if (serverHttpRequest instanceof ServletServerHttpRequest && serverHttpResponse instanceof ServletServerHttpResponse) { - loggingService.logResponse(((ServletServerHttpRequest) serverHttpRequest).getServletRequest(), - ((ServletServerHttpResponse) serverHttpResponse).getServletResponse(), o); - } - - return o; - } -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/LogInterceptor.java b/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/LogInterceptor.java deleted file mode 100644 index 8c0f81064..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/interceptor/LogInterceptor.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.cardanofoundation.rosetta.common.interceptor; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import lombok.RequiredArgsConstructor; - -import org.springframework.http.HttpMethod; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.HandlerInterceptor; - -import org.cardanofoundation.rosetta.common.services.LoggingService; - -@Component -@RequiredArgsConstructor -public class LogInterceptor implements HandlerInterceptor { - - final LoggingService loggingService; - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - - if (DispatcherType.REQUEST.name().equals(request.getDispatcherType().name()) && request.getMethod().equals(HttpMethod.GET.name())) { - loggingService.logRequest(request, null); - } - - return true; - } -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/mapper/DataMapper.java b/api/src/main/java/org/cardanofoundation/rosetta/common/mapper/DataMapper.java index e47789d9f..85ef1bdc6 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/mapper/DataMapper.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/mapper/DataMapper.java @@ -19,8 +19,6 @@ import org.openapitools.client.model.Amount; import org.openapitools.client.model.BlockIdentifier; import org.openapitools.client.model.Coin; -import org.openapitools.client.model.CoinAction; -import org.openapitools.client.model.CoinChange; import org.openapitools.client.model.CoinIdentifier; import org.openapitools.client.model.CoinTokens; import org.openapitools.client.model.ConstructionMetadataResponse; @@ -52,20 +50,23 @@ public class DataMapper { private final ProtocolParamsToRosettaProtocolParameters protocolParamsToRosettaProtocolParameters; + /** * Maps a NetworkRequest to a NetworkOptionsResponse. + * * @param supportedNetwork The supported network * @return The NetworkOptionsResponse */ public NetworkListResponse mapToNetworkListResponse(Network supportedNetwork) { NetworkIdentifier identifier = NetworkIdentifier.builder().blockchain(Constants.CARDANO) - .network(Objects.requireNonNull( - NetworkEnum.fromProtocolMagic(supportedNetwork.getProtocolMagic())).getValue()).build(); + .network(Objects.requireNonNull( + NetworkEnum.fromProtocolMagic(supportedNetwork.getProtocolMagic())).getValue()).build(); return NetworkListResponse.builder().networkIdentifiers(List.of(identifier)).build(); } /** * Maps a NetworkRequest to a NetworkOptionsResponse. + * * @param networkStatus The network status * @return The NetworkOptionsResponse */ @@ -74,20 +75,21 @@ public NetworkStatusResponse mapToNetworkStatusResponse(NetworkStatus networkSta GenesisBlock genesisBlock = networkStatus.getGenesisBlock(); List peers = networkStatus.getPeers(); return NetworkStatusResponse.builder() - .currentBlockIdentifier( - BlockIdentifier.builder().index(latestBlock.getNumber()).hash(latestBlock.getHash()) - .build()) - .currentBlockTimestamp(latestBlock.getCreatedAt()) - .genesisBlockIdentifier(BlockIdentifier.builder().index( - genesisBlock.getNumber() != null ? genesisBlock.getNumber() : 0) - .hash(genesisBlock.getHash()).build()) - .peers(peers.stream().map(peer -> new Peer(peer.getPeerId(), null)).toList()) - .build(); + .currentBlockIdentifier( + BlockIdentifier.builder().index(latestBlock.getNumber()).hash(latestBlock.getHash()) + .build()) + .currentBlockTimestamp(latestBlock.getCreatedAt()) + .genesisBlockIdentifier(BlockIdentifier.builder().index( + genesisBlock.getNumber() != null ? genesisBlock.getNumber() : 0) + .hash(genesisBlock.getHash()).build()) + .peers(peers.stream().map(peer -> new Peer(peer.getPeerId(), null)).toList()) + .build(); } /** * Basic mapping if a value is spent or not. + * * @param value value to be mapped * @param spent if the value is spent. Will add a "-" in front of the value if spent. * @return the mapped value @@ -96,16 +98,11 @@ public static String mapValue(String value, boolean spent) { return spent ? "-" + value : value; } - public static CoinChange getCoinChange(int index, String hash, CoinAction coinAction) { - CoinIdentifier coinIdentifier = new CoinIdentifier(); - coinIdentifier.setIdentifier(hash + ":" + index); - - return CoinChange.builder().coinIdentifier(coinIdentifier).coinAction(coinAction).build(); - } - /** - * Creates a Rosetta compatible Amount for ADA. The value is the amount in lovelace and the currency is ADA. + * Creates a Rosetta compatible Amount for ADA. The value is the amount in lovelace and the + * currency is ADA. + * * @param value The amount in lovelace * @return The Rosetta compatible Amount */ @@ -115,21 +112,23 @@ public static Amount mapAmount(String value) { } Currency currency = Currency.builder() - .decimals(Constants.ADA_DECIMALS) - .symbol(Constants.ADA).build(); + .decimals(Constants.ADA_DECIMALS) + .symbol(Constants.ADA).build(); return Amount.builder().value(value).currency(currency).build(); } /** - * Creates a Rosetta compatible Amount. Symbol and decimals are optional. If not provided, ADA and 6 decimals are used. - * @param value The amount of the token - * @param symbol The symbol of the token - it will be hex encoded + * Creates a Rosetta compatible Amount. Symbol and decimals are optional. If not provided, ADA and + * 6 decimals are used. + * + * @param value The amount of the token + * @param symbol The symbol of the token - it will be hex encoded * @param decimals The number of decimals of the token * @param metadata The metadata of the token * @return The Rosetta compatible Amount */ public static Amount mapAmount(String value, String symbol, Integer decimals, - CurrencyMetadata metadata) { + CurrencyMetadata metadata) { if (Objects.isNull(symbol)) { symbol = Constants.ADA; } @@ -139,23 +138,24 @@ public static Amount mapAmount(String value, String symbol, Integer decimals, Amount amount = new Amount(); amount.setValue(value); amount.setCurrency(Currency.builder() - .symbol(symbol) - .decimals(decimals) - .metadata(metadata) - .build()); + .symbol(symbol) + .decimals(decimals) + .metadata(metadata) + .build()); return amount; } /** * Maps a list of AddressBalanceDTOs to a Rosetta compatible AccountBalanceResponse. * - * @param block The block from where the balances are calculated into the past - * @param balances The list of filtered balances up to {@code block} number. - * Each unit should occur only one time with the latest balance. - * Native assets should be present only as a lovelace unit. + * @param block The block from where the balances are calculated into the past + * @param balances The list of filtered balances up to {@code block} number. Each unit should + * occur only one time with the latest balance. Native assets should be present + * only as a lovelace unit. * @return The Rosetta compatible AccountBalanceResponse */ - public static AccountBalanceResponse mapToAccountBalanceResponse(Block block, List balances) { + public static AccountBalanceResponse mapToAccountBalanceResponse(Block block, + List balances) { BigInteger lovelaceAmount = balances.stream() .filter(b -> Constants.LOVELACE.equals(b.unit())) .map(AddressBalance::quantity) @@ -182,14 +182,15 @@ public static AccountBalanceResponse mapToAccountBalanceResponse(Block block, Li .build(); } - public static AccountBalanceResponse mapToStakeAddressBalanceResponse(Block block, StakeAddressBalance balance) { + public static AccountBalanceResponse mapToStakeAddressBalanceResponse(Block block, + StakeAddressBalance balance) { return AccountBalanceResponse.builder() - .blockIdentifier(BlockIdentifier.builder() - .hash(block.getHash()) - .index(block.getNumber()) - .build()) - .balances(List.of(Objects.requireNonNull(mapAmount(balance.getQuantity().toString())))) - .build(); + .blockIdentifier(BlockIdentifier.builder() + .hash(block.getHash()) + .index(block.getNumber()) + .build()) + .balances(List.of(Objects.requireNonNull(mapAmount(balance.getQuantity().toString())))) + .build(); } public static AccountCoinsResponse mapToAccountCoinsResponse(Block block, List utxos) { @@ -208,7 +209,8 @@ public static AccountCoinsResponse mapToAccountCoinsResponse(Block block, List> mapCoinMetadata(Utxo utxo) { return coinTokens.isEmpty() ? null : Map.of(key, coinTokens); } - public ConstructionMetadataResponse mapToMetadataResponse(ProtocolParams protocolParams, Long ttl, Long suggestedFee) { + public ConstructionMetadataResponse mapToMetadataResponse(ProtocolParams protocolParams, Long ttl, + Long suggestedFee) { return ConstructionMetadataResponse.builder() - .metadata(ConstructionMetadataResponseMetadata.builder() - .ttl(new BigDecimal(ttl)) - .protocolParameters(protocolParamsToRosettaProtocolParameters.toProtocolParameters(protocolParams)) + .metadata(ConstructionMetadataResponseMetadata.builder() + .ttl(new BigDecimal(ttl)) + .protocolParameters( + protocolParamsToRosettaProtocolParameters.toProtocolParameters(protocolParams)) + .build()) + .suggestedFee(List.of(Amount.builder() + .value(suggestedFee.toString()) + .currency(Currency.builder() + .decimals(Constants.ADA_DECIMALS) + .symbol(Constants.ADA) .build()) - .suggestedFee(List.of(Amount.builder() - .value(suggestedFee.toString()) - .currency(Currency.builder() - .decimals(Constants.ADA_DECIMALS) - .symbol(Constants.ADA) - .build()) - .build())) - .build(); + .build())) + .build(); } public static List mapRosettaSignatureToSignaturesList(List signatures) { @@ -264,11 +268,12 @@ public static List mapRosettaSignatureToSignaturesList(List parameters = buildParametersMap(httpServletRequest); - - stringBuilder.append("REQUEST "); - stringBuilder.append("method=[").append(httpServletRequest.getMethod()).append("] "); - stringBuilder.append("path=[").append(httpServletRequest.getRequestURI()).append("] "); - stringBuilder.append("headers=[").append(buildHeadersMap(httpServletRequest)).append("] "); - - if (!parameters.isEmpty()) { - stringBuilder.append("parameters=[").append(parameters).append("] "); - } - - if (body != null) { - stringBuilder.append("body=[" + body + "]"); - } - - log.info(stringBuilder.toString()); - } - - @Override - public void logResponse(HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse, Object body) { - StringBuilder stringBuilder = new StringBuilder(); - - stringBuilder.append("RESPONSE "); - stringBuilder.append("method=[").append(httpServletRequest.getMethod()).append("] "); - stringBuilder.append("path=[").append(httpServletRequest.getRequestURI()).append("] "); - stringBuilder.append("responseHeaders=[").append(buildHeadersMap(httpServletResponse)) - .append("] "); - stringBuilder.append("responseBody=[").append(body).append("] "); - - log.info(stringBuilder.toString()); - } - - private Map buildParametersMap(HttpServletRequest httpServletRequest) { - Map resultMap = new HashMap<>(); - Enumeration parameterNames = httpServletRequest.getParameterNames(); - - while (parameterNames.hasMoreElements()) { - String key = parameterNames.nextElement(); - String value = httpServletRequest.getParameter(key); - resultMap.put(key, value); - } - - return resultMap; - } - - private Map buildHeadersMap(HttpServletRequest request) { - Map map = new HashMap<>(); - - Enumeration headerNames = request.getHeaderNames(); - while (headerNames.hasMoreElements()) { - String key = headerNames.nextElement(); - String value = request.getHeader(key); - map.put(key, value); - } - - return map; - } - - private Map buildHeadersMap(HttpServletResponse response) { - Map map = new HashMap<>(); - - Collection headerNames = response.getHeaderNames(); - for (String header : headerNames) { - map.put(header, response.getHeader(header)); - } - - return map; - } -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImpl.java deleted file mode 100644 index 1aafa7cd4..000000000 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.cardanofoundation.rosetta.common.services.impl; - -import java.io.IOException; -import java.util.Optional; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.json.JSONObject; - -import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams; -import org.cardanofoundation.rosetta.api.block.model.entity.ProtocolParamsEntity; -import org.cardanofoundation.rosetta.api.block.model.repository.EpochParamRepository; -import org.cardanofoundation.rosetta.common.exception.ExceptionFactory; -import org.cardanofoundation.rosetta.common.mapper.ProtocolParamsToEntity; -import org.cardanofoundation.rosetta.common.services.ProtocolParamService; -import org.cardanofoundation.rosetta.common.util.FileUtils; - -@Service -@Slf4j -@RequiredArgsConstructor -public class ProtocolParamServiceImpl implements ProtocolParamService { - - @Value("${cardano.rosetta.GENESIS_SHELLEY_PATH}") - private String genesisShelleyPath; - - private final ObjectMapper objectMapper; - private final EpochParamRepository epochParamRepository; - private final ProtocolParamsToEntity mapperProtocolParams; - - - @Override - public ProtocolParams getProtocolParameters() { - try { - String shelleyContent = FileUtils.fileReader(genesisShelleyPath); - JSONObject shelleyJsonObject = new JSONObject(shelleyContent); - return fromJSONObject(shelleyJsonObject); - } catch (IOException e) { - log.error("Error reading genesis shelley file: {}", genesisShelleyPath); - throw ExceptionFactory.configNotFoundException(); - } - } - - private ProtocolParams fromJSONObject(JSONObject shelleyJsonObject) - throws JsonProcessingException { - var params = shelleyJsonObject.getJSONObject("protocolParams"); - String s = Optional.ofNullable(params).map(JSONObject::toString).orElse("{}"); - return objectMapper.readValue(s, ProtocolParams.class); - } - - @Override - public ProtocolParams findProtocolParametersFromIndexerAndConfig() { - ProtocolParamsEntity paramsEntity = epochParamRepository.findLatestProtocolParams(); - ProtocolParams protocolParams = mapperProtocolParams.fromEntity(paramsEntity); - ProtocolParams protocolParametersFromConfigFile = getProtocolParameters(); - return mapperProtocolParams.merge(protocolParams, protocolParametersFromConfigFile); - } -} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/config/SpringWebConfig.java b/api/src/main/java/org/cardanofoundation/rosetta/config/SpringWebConfig.java index 17f842aef..4f916319c 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/config/SpringWebConfig.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/config/SpringWebConfig.java @@ -9,20 +9,15 @@ import org.springframework.core.convert.converter.Converter; import org.springframework.format.FormatterRegistry; import org.springframework.lang.NonNull; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.cardanofoundation.rosetta.common.interceptor.LogInterceptor; - @Configuration @RequiredArgsConstructor public class SpringWebConfig implements WebMvcConfigurer { - final LogInterceptor logInterceptor; - @Override public void addFormatters(final FormatterRegistry registry) { registry.addConverter(new Converter>() { @@ -49,9 +44,4 @@ public LinkedHashMap convert(@NonNull final String source) { } }); } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(logInterceptor); - } } diff --git a/api/src/main/resources/config/application-dev.yaml b/api/src/main/resources/config/application-dev.yaml index 82c0ba59d..c6bd33701 100644 --- a/api/src/main/resources/config/application-dev.yaml +++ b/api/src/main/resources/config/application-dev.yaml @@ -30,6 +30,11 @@ spring: hibernate: ddl-auto: none show-sql: true + mvc: + log-resolved-exception: true + output: + ansi: + enabled: always api: exception: @@ -49,3 +54,17 @@ cardano: DEVKIT_ENABLED: ${DEVKIT_ENABLED:false} DEVKIT_URL: ${DEVKIT_URL:localhost} DEVKIT_PORT: ${DEVKIT_PORT:3333} + +logging: + level: + root: INFO + org: + springframework: + web: + filter: + CommonsRequestLoggingFilter: DEBUG + path: ${LOG_FILE_PATH:logs} + file: + name: ${LOG_FILE_NAME:logs/rosetta-api.log} + max-size: ${LOG_FILE_MAX_SIZE:10MB} + max-history: ${LOG_FILE_MAX_HISTORY:10} diff --git a/api/src/main/resources/config/application-h2.yaml b/api/src/main/resources/config/application-h2.yaml index 5145a05d6..0f3ead573 100644 --- a/api/src/main/resources/config/application-h2.yaml +++ b/api/src/main/resources/config/application-h2.yaml @@ -30,6 +30,11 @@ spring: hibernate: ddl-auto: none show-sql: true + mvc: + log-resolved-exception: true + output: + ansi: + enabled: detect api: exception: @@ -49,3 +54,20 @@ cardano: DEVKIT_ENABLED: ${DEVKIT_ENABLED:false} DEVKIT_URL: ${DEVKIT_URL:yaci-cli} DEVKIT_PORT: ${DEVKIT_PORT:3333} + +logging: + level: + root: INFO + org: + springframework: + transaction: DEBUG + orm: + jpa: DEBUG + web: + filter: + CommonsRequestLoggingFilter: DEBUG + path: ${LOG_FILE_PATH:logs} + file: + name: ${LOG_FILE_NAME:logs/rosetta-api.log} + max-size: ${LOG_FILE_MAX_SIZE:10MB} + max-history: ${LOG_FILE_MAX_HISTORY:10} diff --git a/api/src/main/resources/config/application-staging.yaml b/api/src/main/resources/config/application-staging.yaml index 75eccc722..b7a234935 100644 --- a/api/src/main/resources/config/application-staging.yaml +++ b/api/src/main/resources/config/application-staging.yaml @@ -49,3 +49,12 @@ cardano: DEVKIT_ENABLED: ${DEVKIT_ENABLED:false} DEVKIT_URL: ${DEVKIT_URL:yaci-cli} DEVKIT_PORT: ${DEVKIT_PORT:3333} + +logging: + level: + root: INFO + path: ${LOG_FILE_PATH:logs} + file: + name: ${LOG_FILE_NAME:logs/rosetta-api.log} + max-size: ${LOG_FILE_MAX_SIZE:10MB} + max-history: ${LOG_FILE_MAX_HISTORY:10} diff --git a/api/src/main/resources/config/application-test.yaml b/api/src/main/resources/config/application-test.yaml index 14646fa05..b26835daf 100644 --- a/api/src/main/resources/config/application-test.yaml +++ b/api/src/main/resources/config/application-test.yaml @@ -49,3 +49,12 @@ cardano: DEVKIT_ENABLED: ${DEVKIT_ENABLED:false} DEVKIT_URL: ${DEVKIT_URL:yaci-cli} DEVKIT_PORT: ${DEVKIT_PORT:3333} + +logging: + level: + root: INFO + org: + springframework: + web: + filter: + CommonsRequestLoggingFilter: DEBUG diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/AddressBalanceTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/AddressBalanceTest.java index 786a7ffa0..993cff3cb 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/AddressBalanceTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/AddressBalanceTest.java @@ -13,11 +13,8 @@ class AddressBalanceTest { @Test void fromEntityPositiveTest() { - AddressBalanceEntity addressBalanceEntity = new AddressBalanceEntity(); - addressBalanceEntity.setAddress("address"); - addressBalanceEntity.setUnit("unit"); - addressBalanceEntity.setSlot(1L); - addressBalanceEntity.setQuantity(BigInteger.ONE); + AddressBalanceEntity addressBalanceEntity = new AddressBalanceEntity("address", "unit", 1L, + BigInteger.ONE, null); AddressBalance addressBalance = AddressBalance.fromEntity(addressBalanceEntity); diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/UtxoTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/UtxoTest.java index f002b5d74..891f7312f 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/UtxoTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/account/model/domain/UtxoTest.java @@ -33,9 +33,8 @@ void fromUtxoKeyNullTest() { @Test void populateFromUtxoEntityPositiveTest() { - AddressUtxoEntity entity = new AddressUtxoEntity(); - entity.setOwnerAddr("ownerAddr"); - entity.setAmounts(Collections.emptyList()); + AddressUtxoEntity entity = new AddressUtxoEntity(null, null, "ownerAddr", + Collections.emptyList()); Utxo utxo = new Utxo("txHash", 1); mapper.map(entity, utxo); diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImplTest.java index 5fecbb9f2..36f5805b2 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/account/service/AccountServiceImplTest.java @@ -27,9 +27,9 @@ import org.cardanofoundation.rosetta.api.block.model.domain.Block; import org.cardanofoundation.rosetta.api.block.model.domain.StakeAddressBalance; import org.cardanofoundation.rosetta.api.block.service.LedgerBlockService; +import org.cardanofoundation.rosetta.api.construction.service.LedgerDataProviderService; import org.cardanofoundation.rosetta.common.enumeration.StakeAddressPrefix; import org.cardanofoundation.rosetta.common.exception.ApiException; -import org.cardanofoundation.rosetta.common.services.LedgerDataProviderService; import org.cardanofoundation.rosetta.common.util.Constants; import org.cardanofoundation.rosetta.common.util.RosettaConstants.RosettaErrorType; @@ -75,7 +75,8 @@ void getAccountBalanceNoStakeAddressPositiveTest() { assertEquals("1000", actual.getBalances().getFirst().getValue()); assertNotNull(actual.getBalances().getFirst().getCurrency().getSymbol()); assertEquals(Constants.ADA, actual.getBalances().getFirst().getCurrency().getSymbol()); - assertEquals(Constants.ADA_DECIMALS, actual.getBalances().getFirst().getCurrency().getDecimals()); + assertEquals(Constants.ADA_DECIMALS, + actual.getBalances().getFirst().getCurrency().getDecimals()); assertEquals(blockIdentifier.getIndex(), actual.getBlockIdentifier().getIndex()); assertEquals(blockIdentifier.getHash(), actual.getBlockIdentifier().getHash()); verify(ledgerBlockService).findBlock(1L, HASH); @@ -138,7 +139,8 @@ void getAccountBalanceNoStakeAddressNullBlockIdentifierPositiveTest() { assertEquals("1000", actual.getBalances().getFirst().getValue()); assertNotNull(actual.getBalances().getFirst().getCurrency().getSymbol()); assertEquals(Constants.ADA, actual.getBalances().getFirst().getCurrency().getSymbol()); - assertEquals(Constants.ADA_DECIMALS, actual.getBalances().getFirst().getCurrency().getDecimals()); + assertEquals(Constants.ADA_DECIMALS, + actual.getBalances().getFirst().getCurrency().getDecimals()); assertEquals(block.getNumber(), actual.getBlockIdentifier().getIndex()); assertEquals(block.getHash(), actual.getBlockIdentifier().getHash()); verify(ledgerBlockService).findLatestBlock(); diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/block/mapper/WithdrawalEntityToWithdrawalTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/block/mapper/WithdrawalEntityToWithdrawalTest.java index fe832cee8..4b254875f 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/block/mapper/WithdrawalEntityToWithdrawalTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/block/mapper/WithdrawalEntityToWithdrawalTest.java @@ -27,10 +27,7 @@ public void fromEntity() { } private WithdrawalEntity newWithdrawalEntity() { - return WithdrawalEntity.builder() - .address("address") - .amount(BigInteger.ONE) - .build(); + return new WithdrawalEntity("address", null, BigInteger.ONE); } } diff --git a/api/src/test/java/org/cardanofoundation/rosetta/common/mapper/ProtocolParamsToEntityTest.java b/api/src/test/java/org/cardanofoundation/rosetta/common/mapper/ProtocolParamsToEntityTest.java index 05cf468a6..5b9d7aa97 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/common/mapper/ProtocolParamsToEntityTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/common/mapper/ProtocolParamsToEntityTest.java @@ -59,10 +59,7 @@ void merge_Test_ok() { } private EpochParamEntity newEpochParamEntity() { - return EpochParamEntity.builder() - .params(newEpochParams()) - .epoch(1) - .build(); + return new EpochParamEntity(1, newEpochParams()); } private ProtocolParamsEntity newEpochParams() { diff --git a/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoAddressServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoAddressServiceImplTest.java deleted file mode 100644 index 551f58d50..000000000 --- a/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoAddressServiceImplTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.cardanofoundation.rosetta.common.services.impl; - -import org.mockito.junit.jupiter.MockitoExtension; -import org.openapitools.client.model.PublicKey; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import org.cardanofoundation.rosetta.common.enumeration.AddressType; -import org.cardanofoundation.rosetta.common.exception.ApiException; - -import static org.cardanofoundation.rosetta.EntityGenerator.givenPublicKey; -import static org.cardanofoundation.rosetta.common.enumeration.AddressType.BASE; -import static org.cardanofoundation.rosetta.common.enumeration.AddressType.REWARD; -import static org.cardanofoundation.rosetta.common.enumeration.NetworkEnum.PREPROD; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.openapitools.client.model.CurveType.EDWARDS25519; - -@SuppressWarnings("java:S5778") -@ExtendWith(MockitoExtension.class) -class CardanoAddressServiceImplTest { - - CardanoAddressServiceImpl genesisService = new CardanoAddressServiceImpl(); - - @Test - void getCardanoBaseAddressTest() { - PublicKey stakingCredential = givenPublicKey(); - PublicKey publicKey = givenPublicKey(); - - String cardanoAddress = genesisService - .getCardanoAddress(BASE, stakingCredential, publicKey, PREPROD); - - assertEquals("addr_test1qza5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7amgrc6v3au3rqm66mn3kuwke340kfxga82tl7kh2nke8aslzyvu5", - cardanoAddress); - } - - @Test - void getCardanoBaseAddressMissingPubKeyTest() { - ApiException exception = assertThrows(ApiException.class, - () -> genesisService.getCardanoAddress(BASE, null, null, PREPROD)); - - assertEquals("Public key is missing", exception.getError().getMessage()); - } - - @Test - void getCardanoBaseAddressMissingStakingTest() { - ApiException exception = assertThrows(ApiException.class, - () -> genesisService.getCardanoAddress(BASE, null, new PublicKey(), PREPROD)); - - assertEquals("Staking key is required for this type of address", exception.getError().getMessage()); - } - - @Test - void getCardanoRewardAddressTest() { - PublicKey stakingCredential = givenPublicKey(); - PublicKey publicKey = givenPublicKey(); - - String cardanoAddress = genesisService - .getCardanoAddress(REWARD, stakingCredential, publicKey, PREPROD); - - assertEquals("stake_test1uza5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7c6nuuef", cardanoAddress); - } - - @Test - void getCardanoRewardAddressWOStakingTest() { - PublicKey publicKey = givenPublicKey(); - - String cardanoAddress = genesisService - .getCardanoAddress(REWARD, null, publicKey, PREPROD); - - assertEquals("stake_test1uza5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7c6nuuef", cardanoAddress); - } - - @Test - void getCardanoNullAddressTest() { - ApiException exception = assertThrows(ApiException.class, - () -> genesisService.getCardanoAddress(AddressType.POOL_KEY_HASH, - null, new PublicKey(), PREPROD)); - - assertEquals("Provided address type is invalid", exception.getError().getMessage()); - } - - @Test - void getHdPublicKeyFromRosettaKeyTest() { - PublicKey publicKey = new PublicKey("48656C6C6F2C20776F726C6421", EDWARDS25519); - - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, - () -> genesisService.getHdPublicKeyFromRosettaKey(publicKey)); - - assertEquals("Invalid public key length", exception.getMessage()); - } - -} diff --git a/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoConstructionServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoConstructionServiceImplTest.java index e74bf48b6..fe2e8897e 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoConstructionServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/CardanoConstructionServiceImplTest.java @@ -19,12 +19,14 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import org.openapitools.client.model.PublicKey; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.cardanofoundation.rosetta.api.construction.service.CardanoConstructionServiceImpl; +import org.cardanofoundation.rosetta.common.enumeration.AddressType; import org.cardanofoundation.rosetta.common.enumeration.NetworkIdentifierType; import org.cardanofoundation.rosetta.common.exception.ApiException; import org.cardanofoundation.rosetta.common.exception.Error; @@ -33,6 +35,10 @@ import org.cardanofoundation.rosetta.common.util.Constants; import org.cardanofoundation.rosetta.common.util.RosettaConstants.RosettaErrorType; +import static org.cardanofoundation.rosetta.EntityGenerator.givenPublicKey; +import static org.cardanofoundation.rosetta.common.enumeration.AddressType.BASE; +import static org.cardanofoundation.rosetta.common.enumeration.AddressType.REWARD; +import static org.cardanofoundation.rosetta.common.enumeration.NetworkEnum.PREPROD; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -43,6 +49,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.openapitools.client.model.CurveType.EDWARDS25519; @ExtendWith(MockitoExtension.class) class CardanoConstructionServiceImplTest { @@ -273,6 +280,76 @@ void submitTransactionTest_tx_submit_error() { } } + @Test + void getCardanoBaseAddressTest() { + PublicKey stakingCredential = givenPublicKey(); + PublicKey publicKey = givenPublicKey(); + + String cardanoAddress = cardanoService + .getCardanoAddress(BASE, stakingCredential, publicKey, PREPROD); + + assertEquals("addr_test1qza5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7amgrc6v3au3rqm66mn3kuwke340kfxga82tl7kh2nke8aslzyvu5", + cardanoAddress); + } + + @Test + void getCardanoBaseAddressMissingPubKeyTest() { + ApiException exception = assertThrows(ApiException.class, + () -> cardanoService.getCardanoAddress(BASE, null, null, PREPROD)); + + assertEquals("Public key is missing", exception.getError().getMessage()); + } + + @Test + @SuppressWarnings("java:S5778") + void getCardanoBaseAddressMissingStakingTest() { + ApiException exception = assertThrows(ApiException.class, + () -> cardanoService.getCardanoAddress(BASE, null, new PublicKey(), PREPROD)); + + assertEquals("Staking key is required for this type of address", exception.getError().getMessage()); + } + + @Test + void getCardanoRewardAddressTest() { + PublicKey stakingCredential = givenPublicKey(); + PublicKey publicKey = givenPublicKey(); + + String cardanoAddress = cardanoService + .getCardanoAddress(REWARD, stakingCredential, publicKey, PREPROD); + + assertEquals("stake_test1uza5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7c6nuuef", cardanoAddress); + } + + @Test + void getCardanoRewardAddressWOStakingTest() { + PublicKey publicKey = givenPublicKey(); + + String cardanoAddress = cardanoService + .getCardanoAddress(REWARD, null, publicKey, PREPROD); + + assertEquals("stake_test1uza5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7c6nuuef", cardanoAddress); + } + + @Test + @SuppressWarnings("java:S5778") + void getCardanoNullAddressTest() { + ApiException exception = assertThrows(ApiException.class, + () -> cardanoService.getCardanoAddress(AddressType.POOL_KEY_HASH, + null, new PublicKey(), PREPROD)); + + assertEquals("Provided address type is invalid", exception.getError().getMessage()); + } + + @Test + void getHdPublicKeyFromRosettaKeyTest() { + PublicKey publicKey = new PublicKey("48656C6C6F2C20776F726C6421", EDWARDS25519); + + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> cardanoService.getHdPublicKeyFromRosettaKey(publicKey)); + + assertEquals("Invalid public key length", exception.getMessage()); + } + @NotNull private HttpHeaders given() { ReflectionTestUtils.setField(cardanoService, "nodeSubmitApiPort", 8080); diff --git a/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImplTest.java index b6511a75f..5791eeac7 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/common/services/impl/ProtocolParamServiceImplTest.java @@ -1,37 +1,33 @@ package org.cardanofoundation.rosetta.common.services.impl; -import org.springframework.test.util.ReflectionTestUtils; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams; import org.cardanofoundation.rosetta.api.block.model.repository.EpochParamRepository; import org.cardanofoundation.rosetta.common.mapper.ProtocolParamsToEntity; +import org.cardanofoundation.rosetta.common.services.ProtocolParamServiceImpl; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class ProtocolParamServiceImplTest { - ObjectMapper objectMapper = new ObjectMapper(); - @Mock EpochParamRepository epochParamRepository; @Mock ProtocolParamsToEntity protocolParamsToEntity; - - ProtocolParamServiceImpl genesisService = - new ProtocolParamServiceImpl(objectMapper,epochParamRepository,protocolParamsToEntity); + @InjectMocks + ProtocolParamServiceImpl genesisService; @Test void getProtocolParameters() { - - String genesisPath = "../config/preprod/shelley-genesis.json"; - ReflectionTestUtils.setField(genesisService, "genesisShelleyPath", genesisPath); - - assertNotNull(genesisService.getProtocolParameters().getPoolDeposit()); + when(genesisService.findProtocolParametersFromIndexer()).thenReturn(new ProtocolParams()); + assertNotNull(genesisService.findProtocolParametersFromIndexer()); } }