Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ All notable changes to this project will be documented in this file.

## [[NEXT]](https://github.com/iExecBlockchainComputing/iexec-blockchain-adapter-api/releases/tag/vNEXT) 2023

### New Features
- Remove `nexus.intra.iex.ec` repository. (#96)
### Bug Fixes
- Fix and harmonize `Dockerfile entrypoint` in all Spring Boot applications. (#102)
### Quality
- Remove `nexus.intra.iex.ec` repository. (#96)
- Upgrade to Gradle 8.2.1 with up-to-date plugins. (#100)
- Clean TODOs. (#104)
- `ChainConfig` instance is immutable and validated. Application will fail to start if chain config parameters violate constraints. (#105)
### Dependency Upgrades
- Upgrade to `eclipse-temurin` 11.0.20. (#98)
- Upgrade to Spring Boot 2.7.14. (#99)
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/iexec/blockchain/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
@SpringBootApplication
@ConfigurationPropertiesScan
public class Application {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ public PublicConfigurationController(ChainConfig chainConfig) {
*/
@GetMapping("/chain")
public ResponseEntity<PublicChainConfig> getPublicChainConfig() {
final Integer blockTime = chainConfig.getBlockTime();
final int blockTime = chainConfig.getBlockTime();
final PublicChainConfig publicChainConfig = PublicChainConfig
.builder()
.chainId(chainConfig.getChainId())
.chainId(chainConfig.getId())
.sidechain(chainConfig.isSidechain())
.chainNodeUrl(chainConfig.getNodeAddress())
.iexecHubContractAddress(chainConfig.getHubAddress())
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/iexec/blockchain/signer/SignerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ public class SignerService {
private final OrderSigner orderSigner;

public SignerService(ChainConfig chainConfig, CredentialsService credentialsService) {
this.orderSigner = new OrderSigner(chainConfig.getChainId(),
this.orderSigner = new OrderSigner(
chainConfig.getId(),
chainConfig.getHubAddress(),
credentialsService.getCredentials().getEcKeyPair());
}
Expand Down
60 changes: 25 additions & 35 deletions src/main/java/com/iexec/blockchain/tool/ChainConfig.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2020 IEXEC BLOCKCHAIN TECH
* Copyright 2020-2023 IEXEC BLOCKCHAIN TECH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -17,66 +17,56 @@
package com.iexec.blockchain.tool;

import com.iexec.common.chain.validation.ValidNonZeroEthereumAddress;
import lombok.*;
import lombok.Builder;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;

import javax.annotation.PostConstruct;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import javax.validation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import java.util.Set;

@Component
@Getter
@ToString
@Slf4j
@Value
@Builder
@AllArgsConstructor
@ConstructorBinding
@ConfigurationProperties(prefix = "chain")
public class ChainConfig {

@Value("${chain.id}")
@Positive(message = "Chain id should be positive")
@NotNull
private Integer chainId;
int id;

@Value("${chain.node-address}")
@URL
@NotEmpty
private String nodeAddress;
String nodeAddress;

@Value("${chain.block-time}")
@Positive(message = "Block time should be positive")
@NotNull
private Integer blockTime;
int blockTime;

@Value("${chain.hub-address}")
@ValidNonZeroEthereumAddress
private String hubAddress;
String hubAddress;

@Value("${chain.is-sidechain}")
private boolean isSidechain;
boolean isSidechain;

@Value("${chain.gas-price-multiplier}")
private float gasPriceMultiplier;
float gasPriceMultiplier;

@Value("${chain.gas-price-cap}")
private long gasPriceCap;

@Getter(AccessLevel.NONE) // no getter
private final Validator validator;

@Autowired
public ChainConfig(Validator validator) {
this.validator = validator;
}
long gasPriceCap;

@PostConstruct
private void validate() {
if (!validator.validate(this).isEmpty()) {
throw new ConstraintViolationException(validator.validate(this));
try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
Validator validator = factory.getValidator();
Set<ConstraintViolation<ChainConfig>> violations = validator.validate(this);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/iexec/blockchain/tool/Web3jService.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class Web3jService extends Web3jAbstractService {

public Web3jService(ChainConfig chainConfig) {
super(
chainConfig.getChainId(),
chainConfig.getId(),
chainConfig.getNodeAddress(),
Duration.ofSeconds(chainConfig.getBlockTime()),
chainConfig.getGasPriceMultiplier(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,45 +20,45 @@
import com.iexec.common.config.PublicChainConfig;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.http.ResponseEntity;

import java.time.Duration;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.mockito.Mockito.when;

class PublicConfigurationControllerTests {

@Mock
ChainConfig chainConfig;
private static final int ID = 65535;
private static final String NODE_ADDRESS = "http://localhost:8545";
private static final String HUB_ADDRESS = "0xC129e7917b7c7DeDfAa5Fff1FB18d5D7050fE8ca";
private static final int BLOCK_TIME = 5;
private static final boolean IS_SIDECHAIN = true;

ChainConfig chainConfig = ChainConfig.builder()
.id(ID)
.nodeAddress(NODE_ADDRESS)
.hubAddress(HUB_ADDRESS)
.blockTime(BLOCK_TIME)
.isSidechain(IS_SIDECHAIN)
.build();

@InjectMocks
PublicConfigurationController controller;

@BeforeEach
void init() {
MockitoAnnotations.openMocks(this);
controller = new PublicConfigurationController(chainConfig);
}

@Test
void shouldReturnConfig() {
int blockTime = 5;
PublicChainConfig expectedConfig = PublicChainConfig
.builder()
.sidechain(true)
.chainId(65535)
.chainNodeUrl("http://localhost:8545")
.iexecHubContractAddress("0xC129e7917b7c7DeDfAa5Fff1FB18d5D7050fE8ca")
.blockTime(Duration.ofSeconds(blockTime))
.sidechain(IS_SIDECHAIN)
.chainId(ID)
.chainNodeUrl(NODE_ADDRESS)
.iexecHubContractAddress(HUB_ADDRESS)
.blockTime(Duration.ofSeconds(BLOCK_TIME))
.build();
when(chainConfig.getChainId()).thenReturn(expectedConfig.getChainId());
when(chainConfig.isSidechain()).thenReturn(expectedConfig.isSidechain());
when(chainConfig.getNodeAddress()).thenReturn(expectedConfig.getChainNodeUrl());
when(chainConfig.getHubAddress()).thenReturn(expectedConfig.getIexecHubContractAddress());
when(chainConfig.getBlockTime()).thenReturn(blockTime);
ResponseEntity<PublicChainConfig> response = controller.getPublicChainConfig();
assertThat(response.getBody())
.isNotNull()
Expand Down
Loading