diff --git a/CHANGELOG.md b/CHANGELOG.md index 889513ff7..937eb8eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## Unreleased changes +- Added typing for baker keys and moved `createBakerKeys` to `BakerKeys`. Likewise the `TransactionFactory.newUpdateBakerKeys` takes + the in generated baker keys. - Added support for `getBlockTransactionEvents` for retrieving events emitted by transactions. - Added support for `InvokeInstance` for executing a smart contract instance locally. - Removed `Account` instead one should simply use `AccountAddress`. diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/ClientV2MapperExtensions.java b/concordium-sdk/src/main/java/com/concordium/sdk/ClientV2MapperExtensions.java index de7abf7ba..6a92795ca 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/ClientV2MapperExtensions.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/ClientV2MapperExtensions.java @@ -22,11 +22,13 @@ import com.concordium.grpc.v2.ProtocolVersion; import com.concordium.grpc.v2.ReleaseSchedule; import com.concordium.grpc.v2.*; +import com.concordium.sdk.crypto.bls.BLSPublicKey; import com.concordium.sdk.crypto.bulletproof.BulletproofGenerators; import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; import com.concordium.sdk.crypto.elgamal.ElgamalPublicKey; import com.concordium.sdk.crypto.pedersencommitment.PedersenCommitmentKey; import com.concordium.sdk.crypto.pointchevalsanders.PSPublicKey; +import com.concordium.sdk.crypto.vrf.VRFPublicKey; import com.concordium.sdk.requests.AccountQuery; import com.concordium.sdk.requests.BlockQuery; import com.concordium.sdk.responses.Epoch; @@ -346,8 +348,8 @@ static Baker to(com.concordium.grpc.v2.AccountStakingInfo.Baker stake) { .stakedAmount(to(stake.getStakedAmount())) .bakerPoolInfo(to(stake.getPoolInfo())) .bakerId(to(stake.getBakerInfo().getBakerId())) - .bakerAggregationVerifyKey(ED25519PublicKey.from(stake.getBakerInfo().getAggregationKey().getValue().toByteArray())) - .bakerElectionVerifyKey(ED25519PublicKey.from(stake.getBakerInfo().getElectionKey().getValue().toByteArray())) + .bakerAggregationVerifyKey(BLSPublicKey.from(stake.getBakerInfo().getAggregationKey().getValue().toByteArray())) + .bakerElectionVerifyKey(VRFPublicKey.from(stake.getBakerInfo().getElectionKey().getValue().toByteArray())) .bakerSignatureVerifyKey(ED25519PublicKey.from(stake.getBakerInfo().getSignatureKey().getValue().toByteArray())) .build(); } @@ -989,6 +991,7 @@ static Summary to(BlockItemSummary blockItemSummary) { .type(Type.ACCOUNT_CREATION) .accountCreationDetails(AccountCreationDetails.from(accountCreation)) .build()); + break; case UPDATE: val details = ChainUpdateDetails.from(blockItemSummary.getUpdate()); summary.details(Details diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/KeyJsonSerializer.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/KeyJsonSerializer.java new file mode 100644 index 000000000..db7644ca1 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/KeyJsonSerializer.java @@ -0,0 +1,16 @@ +package com.concordium.sdk.crypto; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.apache.commons.codec.binary.Hex; + +import java.io.IOException; + +public class KeyJsonSerializer extends JsonSerializer { + + @Override + public void serialize(RawKey value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(Hex.encodeHexString(value.getRawBytes())); + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/RawKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/RawKey.java new file mode 100644 index 000000000..bc1626266 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/RawKey.java @@ -0,0 +1,9 @@ +package com.concordium.sdk.crypto; + +/** + * Interface for keys exposed in a raw format i.e. a byte array. + */ +public interface RawKey { + + byte[] getRawBytes(); +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeys.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeys.java index d6d5c6d85..93d389656 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeys.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeys.java @@ -3,19 +3,68 @@ import com.concordium.sdk.crypto.CryptoJniNative; import com.concordium.sdk.crypto.CryptoJniResultCode; import com.concordium.sdk.crypto.NativeResolver; +import com.concordium.sdk.crypto.bls.BLSPublicKey; +import com.concordium.sdk.crypto.bls.BLSSecretKey; +import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; +import com.concordium.sdk.crypto.ed25519.ED25519SecretKey; +import com.concordium.sdk.crypto.vrf.VRFPublicKey; +import com.concordium.sdk.crypto.vrf.VRFSecretKey; import com.concordium.sdk.exceptions.CryptoJniException; +import com.concordium.sdk.requests.AccountQuery; +import com.concordium.sdk.requests.BlockQuery; +import com.concordium.sdk.responses.BakerId; +import com.concordium.sdk.responses.accountinfo.Baker; import com.concordium.sdk.serializing.JsonMapper; +import com.concordium.sdk.transactions.TransactionFactory; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.core.JsonProcessingException; -import lombok.val; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.*; +import lombok.extern.jackson.Jacksonized; +import java.io.IOException; +import java.io.Writer; + +@Jacksonized +@Builder +@Data public final class BakerKeys { //static block to load native library static { NativeResolver.loadLib(); } - //Method to create baker keys - public static BakerKeysJniOutput createBakerKeys() { + /** + * New public key for participating in the election lottery. + */ + private final VRFPublicKey electionVerifyKey; + /** + * A private key for participating in the election lottery. + */ + private final VRFSecretKey electionPrivateKey; + /** + * New public key for verifying this baker's signature on finalization records. + */ + private final BLSPublicKey aggregationVerifyKey; + /** + * A secret key used by bakers and finalizers to sign finalization records. + */ + private final BLSSecretKey aggregationSignKey; + /** + * New public key for verifying this baker's signatures. + */ + private final ED25519PublicKey signatureVerifyKey; + /** + * A secret key used by a baker to sign blocks. + */ + private final ED25519SecretKey signatureSignKey; + + /** + * Create a fresh set of baker keys. + * @return the generated baker keys. + */ + public static BakerKeys createBakerKeys() { BakerKeysResult result = null; try { @@ -35,6 +84,31 @@ public static BakerKeysJniOutput createBakerKeys() { } + + /** + * Write the {@link BakerCredentials} to the provided Writer with the supplied baker id. + * Note that the supplied {@link BakerId} must be the one for the account that sent the + * {@link com.concordium.sdk.transactions.ConfigureBaker} transaction. + *
+ * The baker id can be looked up via {@link com.concordium.sdk.ClientV2#getAccountInfo(BlockQuery, AccountQuery)} if + * the account is registered as a baker this will yield a {@link Baker#getBakerId()} + * @param writer where to output the baker credentials. + * @param bakerId the baker id + */ + @SneakyThrows + public void createBakerCredentials(Writer writer, BakerId bakerId) { + JsonMapper.INSTANCE.writeValue(writer, new BakerCredentials(bakerId, this)); + } + + @AllArgsConstructor + private static class BakerCredentials { + @JsonProperty("bakerId") + private final BakerId bakerId; + @JsonUnwrapped + private final BakerKeys bakerKeys; + + } + } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysJniOutput.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysJniOutput.java deleted file mode 100644 index 56ad68395..000000000 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysJniOutput.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.concordium.sdk.crypto.bakertransactions; - -import lombok.Builder; -import lombok.Data; -import lombok.extern.jackson.Jacksonized; - -@Jacksonized -@Builder -@Data -public class BakerKeysJniOutput { - /** - * New public key for participating in the election lottery. - */ - private final String electionVerifyKey; - /** - * New public key for verifying this baker's signatures. - */ - private final String signatureVerifyKey; - /** - * New public key for verifying this baker's signature on finalization records. - */ - private final String aggregationVerifyKey; - /** - * A secret key used by a baker to sign blocks. - */ - private final String signatureSignKey; - /** - * A private key for participating in the election lottery. - */ - private final String electionPrivateKey; - /** - * A secret key used by bakers and finalizers to sign finalization records. - */ - private final String aggregationSignKey; -} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysResult.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysResult.java index 4b84848db..c6965c7d8 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysResult.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysResult.java @@ -18,7 +18,7 @@ public class BakerKeysResult { * An optional `BakerKeysJniOutput` object, containing the output of the generate baker keys function. */ @JsonProperty("Ok") - private final Optional ok; + private final Optional ok; /** * An optional `CryptoJniResultCode` object, containing an error code if the generate baker keys function failed. @@ -28,7 +28,7 @@ public class BakerKeysResult { @JsonCreator BakerKeysResult( - @JsonProperty("Ok") BakerKeysJniOutput ok, + @JsonProperty("Ok") BakerKeys ok, @JsonProperty("Err") CryptoJniResultCode err ) { this.ok = Optional.ofNullable(ok); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/ConfigureBakerKeysJniInput.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/ConfigureBakerKeysJniInput.java index 73473457e..207158188 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/ConfigureBakerKeysJniInput.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bakertransactions/ConfigureBakerKeysJniInput.java @@ -17,5 +17,5 @@ public class ConfigureBakerKeysJniInput { /** * The baker keys that will be configured for the account */ - private final BakerKeysJniOutput keys; + private final BakerKeys keys; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bls/BLSPublicKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bls/BLSPublicKey.java new file mode 100644 index 000000000..66d0fe580 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bls/BLSPublicKey.java @@ -0,0 +1,55 @@ +package com.concordium.sdk.crypto.bls; + +import com.concordium.sdk.crypto.RawKey; +import com.concordium.sdk.crypto.KeyJsonSerializer; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +import java.util.Arrays; + +@RequiredArgsConstructor +@Getter +@EqualsAndHashCode +@JsonSerialize(using = KeyJsonSerializer.class) +public class BLSPublicKey implements RawKey { + /** + * The bytes of the public key. + */ + private final byte[] bytes; + + @JsonCreator + public static BLSPublicKey from(String hexKey) { + try { + return from(Hex.decodeHex(hexKey)); + } catch (DecoderException e) { + throw new IllegalArgumentException("Cannot create BLSPublicKey", e); + } + } + + /** + * Creates an BLS Public Key from {@link byte} Array. + * + * @param bytes Input Byte Array + * @return Instance of {@link BLSPublicKey} + */ + public static BLSPublicKey from(final byte[] bytes) { + return new BLSPublicKey(Arrays.copyOf(bytes, bytes.length)); + } + + @Override + @JsonValue + public String toString() { + return Hex.encodeHexString(this.bytes); + } + + @Override + public byte[] getRawBytes() { + return this.bytes; + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bls/BLSSecretKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bls/BLSSecretKey.java new file mode 100644 index 000000000..85c8cb8b0 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/bls/BLSSecretKey.java @@ -0,0 +1,55 @@ +package com.concordium.sdk.crypto.bls; + +import com.concordium.sdk.crypto.RawKey; +import com.concordium.sdk.crypto.KeyJsonSerializer; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +import java.util.Arrays; + +@RequiredArgsConstructor +@Getter +@EqualsAndHashCode +@JsonSerialize(using = KeyJsonSerializer.class) +public class BLSSecretKey implements RawKey { + /** + * The bytes of the public key. + */ + private final byte[] bytes; + + @JsonCreator + public static BLSSecretKey from(String hexKey) { + try { + return from(Hex.decodeHex(hexKey)); + } catch (DecoderException e) { + throw new IllegalArgumentException("Cannot create BLSSecretKey", e); + } + } + + /** + * Creates an BLS Public Key from {@link byte} Array. + * + * @param bytes Input Byte Array + * @return Instance of {@link BLSSecretKey} + */ + public static BLSSecretKey from(final byte[] bytes) { + return new BLSSecretKey(Arrays.copyOf(bytes, bytes.length)); + } + + @Override + @JsonValue + public String toString() { + return Hex.encodeHexString(this.bytes); + } + + @Override + public byte[] getRawBytes() { + return this.bytes; + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519PublicKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519PublicKey.java index ea8c847f3..8b200e426 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519PublicKey.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519PublicKey.java @@ -1,9 +1,12 @@ package com.concordium.sdk.crypto.ed25519; import com.concordium.grpc.v2.BakerSignatureVerifyKey; +import com.concordium.sdk.crypto.RawKey; +import com.concordium.sdk.crypto.KeyJsonSerializer; import com.concordium.sdk.exceptions.ED25519Exception; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NonNull; @@ -14,7 +17,8 @@ @Getter @EqualsAndHashCode -public final class ED25519PublicKey { +@JsonSerialize(using = KeyJsonSerializer.class) +public final class ED25519PublicKey implements RawKey { private final byte[] bytes; private ED25519PublicKey(byte[] bytes) { @@ -81,4 +85,9 @@ public static ED25519PublicKey from(BakerSignatureVerifyKey signKey) { public String toString() { return Hex.encodeHexString(this.getBytes()); } + + @Override + public byte[] getRawBytes() { + return this.bytes; + } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519SecretKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519SecretKey.java index 90f6cb3af..f6ef43b0c 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519SecretKey.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/ed25519/ED25519SecretKey.java @@ -1,7 +1,11 @@ package com.concordium.sdk.crypto.ed25519; +import com.concordium.sdk.crypto.RawKey; +import com.concordium.sdk.crypto.KeyJsonSerializer; import com.concordium.sdk.exceptions.ED25519Exception; import com.concordium.sdk.transactions.Signer; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.EqualsAndHashCode; import lombok.Getter; import org.apache.commons.codec.DecoderException; @@ -9,7 +13,8 @@ @Getter @EqualsAndHashCode -public final class ED25519SecretKey implements Signer { +@JsonSerialize(using = KeyJsonSerializer.class) +public final class ED25519SecretKey implements Signer, RawKey { private final byte[] bytes; @@ -17,6 +22,7 @@ private ED25519SecretKey(byte[] bytes) { this.bytes = bytes; } + @JsonCreator public static ED25519SecretKey from(String hexKey) { try { return new ED25519SecretKey(Hex.decodeHex(hexKey)); @@ -60,4 +66,9 @@ public byte[] sign(byte[] message) { public static ED25519SecretKey createNew() { return ED25519.makeSecretKey(); } + + @Override + public byte[] getRawBytes() { + return this.bytes; + } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/vrf/VRFPublicKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/vrf/VRFPublicKey.java new file mode 100644 index 000000000..950b9511a --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/vrf/VRFPublicKey.java @@ -0,0 +1,55 @@ +package com.concordium.sdk.crypto.vrf; + +import com.concordium.sdk.crypto.RawKey; +import com.concordium.sdk.crypto.KeyJsonSerializer; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +import java.util.Arrays; + +@RequiredArgsConstructor +@Getter +@EqualsAndHashCode +@JsonSerialize(using = KeyJsonSerializer.class) +public class VRFPublicKey implements RawKey { + /** + * The bytes of the public key. + */ + private final byte[] bytes; + + @JsonCreator + public static VRFPublicKey from(String hexKey) { + try { + return from(Hex.decodeHex(hexKey)); + } catch (DecoderException e) { + throw new IllegalArgumentException("Cannot create VRFPublicKey", e); + } + } + + /** + * Creates an BLS Public Key from {@link byte} Array. + * + * @param bytes Input Byte Array + * @return Instance of {@link VRFPublicKey} + */ + public static VRFPublicKey from(final byte[] bytes) { + return new VRFPublicKey(Arrays.copyOf(bytes, bytes.length)); + } + + @Override + @JsonValue + public String toString() { + return Hex.encodeHexString(this.bytes); + } + + @Override + public byte[] getRawBytes() { + return this.bytes; + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/crypto/vrf/VRFSecretKey.java b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/vrf/VRFSecretKey.java new file mode 100644 index 000000000..24ab3039b --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/crypto/vrf/VRFSecretKey.java @@ -0,0 +1,55 @@ +package com.concordium.sdk.crypto.vrf; + +import com.concordium.sdk.crypto.RawKey; +import com.concordium.sdk.crypto.KeyJsonSerializer; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +import java.util.Arrays; + +@RequiredArgsConstructor +@Getter +@EqualsAndHashCode +@JsonSerialize(using = KeyJsonSerializer.class) +public class VRFSecretKey implements RawKey { + /** + * The bytes of the public key. + */ + private final byte[] bytes; + + @JsonCreator + public static VRFSecretKey from(String hexKey) { + try { + return from(Hex.decodeHex(hexKey)); + } catch (DecoderException e) { + throw new IllegalArgumentException("Cannot create VRFSecretKey", e); + } + } + + /** + * Creates an BLS Public Key from {@link byte} Array. + * + * @param bytes Input Byte Array + * @return Instance of {@link VRFSecretKey} + */ + public static VRFSecretKey from(final byte[] bytes) { + return new VRFSecretKey(Arrays.copyOf(bytes, bytes.length)); + } + + @Override + @JsonValue + public String toString() { + return Hex.encodeHexString(this.bytes); + } + + @Override + public byte[] getRawBytes() { + return this.getBytes(); + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/AccountIndex.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/AccountIndex.java index 7176d5ca6..12ccd11d1 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/AccountIndex.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/AccountIndex.java @@ -19,7 +19,7 @@ */ @Getter @EqualsAndHashCode -public final class AccountIndex { +public final class AccountIndex implements ID{ /** * The account index @@ -53,4 +53,9 @@ public byte[] getBytes() { public String toString() { return index.toString(); } + + @Override + public long getId() { + return this.index.getValue(); + } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/BakerId.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/BakerId.java index ab8652471..e9fa9aeb9 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/BakerId.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/BakerId.java @@ -3,6 +3,7 @@ import com.concordium.sdk.serializing.JsonMapper; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.common.collect.ImmutableList; import lombok.Data; import lombok.val; @@ -14,7 +15,8 @@ * Account index of the baking account. */ @Data -public class BakerId { +@JsonSerialize(using = IdJsonSerializer.class) +public class BakerId implements ID { /** * The account index of the baker. @@ -67,4 +69,9 @@ public static Optional> fromJsonArray(String jsonValue) { public byte[] getBytes() { return this.id.getBytes(); } + + @Override + public long getId() { + return this.id.getId(); + } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/Fraction.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/Fraction.java index f5465c476..5caa0820c 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/Fraction.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/Fraction.java @@ -4,6 +4,7 @@ import com.concordium.sdk.types.UInt64; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -29,34 +30,16 @@ public class Fraction { @JsonCreator public Fraction(@JsonProperty("numerator") UInt64 numerator, @JsonProperty("denominator") UInt64 denominator) { - val num = numerator.getValue(); - val den = denominator.getValue(); - if (den == 0) { - throw new IllegalArgumentException("Unable to compute gcd."); - } - - val gcd = getGcd(num, den); - if (gcd == 0) { - this.numerator = UInt64.from(num); - this.denominator = UInt64.from(den); - } else { - this.numerator = UInt64.from(num / gcd); - this.denominator = UInt64.from(den / gcd); - } - } - - /** - * get the greatest common divisor using the Euclidean algorithm. - */ - private static long getGcd(long a, long b) { - if (b == 0) { - return a; - } - return getGcd(b, a % b); + this.numerator = numerator; + this.denominator = denominator; } public static Fraction from(Ratio value) { - return Fraction.builder().numerator(UInt64.from(value.getNumerator())).denominator(UInt64.from(value.getDenominator())).build(); + return Fraction + .builder() + .numerator(UInt64.from(value.getNumerator())) + .denominator(UInt64.from(value.getDenominator())) + .build(); } public static Fraction from(long num, long den) { diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/ID.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/ID.java new file mode 100644 index 000000000..2f31bd136 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/ID.java @@ -0,0 +1,8 @@ +package com.concordium.sdk.responses; + +/** + * A common abstraction for ids used for json serializing. + */ +public interface ID { + long getId(); +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/IdJsonSerializer.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/IdJsonSerializer.java new file mode 100644 index 000000000..195e35591 --- /dev/null +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/IdJsonSerializer.java @@ -0,0 +1,17 @@ +package com.concordium.sdk.responses; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * Serializing ids to json. + */ +public class IdJsonSerializer extends JsonSerializer { + @Override + public void serialize(ID value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeNumber(value.getId()); + } +} diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/Baker.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/Baker.java index 641df2bbe..ebe15a7a0 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/Baker.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/Baker.java @@ -1,6 +1,10 @@ package com.concordium.sdk.responses.accountinfo; +import com.concordium.sdk.crypto.bls.BLSPublicKey; import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; +import com.concordium.sdk.crypto.elgamal.ElgamalPublicKey; +import com.concordium.sdk.crypto.pointchevalsanders.PSPublicKey; +import com.concordium.sdk.crypto.vrf.VRFPublicKey; import com.concordium.sdk.responses.BakerId; import com.concordium.sdk.transactions.CCDAmount; import com.fasterxml.jackson.annotation.JsonProperty; @@ -40,7 +44,7 @@ public final class Baker { * The baker's public VRF key used to verify that the baker has won the lottery. */ @JsonProperty("bakerElectionVerifyKey") - private final ED25519PublicKey bakerElectionVerifyKey; + private final VRFPublicKey bakerElectionVerifyKey; /** * The baker's public key, used to verify baker's signatures on the blocks and finalization messages. @@ -52,7 +56,7 @@ public final class Baker { * The baker's public key used to verify the baker's signature on finalization records in case the baker is a finalizer. */ @JsonProperty("bakerAggregationVerifyKey") - private final ED25519PublicKey bakerAggregationVerifyKey; + private final BLSPublicKey bakerAggregationVerifyKey; /** * The pending changes for the baker. diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/ReleaseSchedule.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/ReleaseSchedule.java index d07b85f95..909ce2eb6 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/ReleaseSchedule.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/ReleaseSchedule.java @@ -6,7 +6,9 @@ import lombok.*; import lombok.extern.jackson.Jacksonized; +import java.util.Collections; import java.util.List; +import java.util.Objects; @Getter @ToString @@ -21,6 +23,11 @@ public final class ReleaseSchedule { ReleaseSchedule(@JsonProperty("total") CCDAmount total, @Singular(value = "scheduleRelease") @JsonProperty("schedule") List newSchedule) { this.total = total; - this.schedule = ImmutableList.copyOf(newSchedule); + if(Objects.isNull(newSchedule)) { + this.schedule = ImmutableList.of(); + } else { + this.schedule = ImmutableList.copyOf(newSchedule); + + } } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/credential/Credential.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/credential/Credential.java index af786067d..15d5462f8 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/credential/Credential.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/accountinfo/credential/Credential.java @@ -7,7 +7,9 @@ import com.google.common.collect.ImmutableMap; import lombok.*; +import java.util.Collections; import java.util.Map; +import java.util.Objects; import static com.google.common.collect.ImmutableMap.copyOf; @@ -54,10 +56,10 @@ public final class Credential { * The public keys for the credential including its `threshold`. */ private final CredentialPublicKeys credentialPublicKeys; + /** * Anonymity revocation data associated with this credential. */ - private final Map arData; public ImmutableMap getArData() { @@ -83,7 +85,7 @@ public ImmutableMap getArData() { this.policy = policy; this.commitments = commitments; this.credentialPublicKeys = credentialPublicKeys; - this.arData = copyOf(arData); + this.arData = arData; } @JsonCreator @@ -97,6 +99,11 @@ public ImmutableMap getArData() { this.policy = value.getContents().getPolicy(); this.commitments = value.getContents().getCommitments(); this.credentialPublicKeys = value.getContents().getCredentialPublicKeys(); - this.arData = copyOf(value.getContents().getArData()); + if (Objects.isNull(value.getContents().getArData())) { + this.arData = Collections.emptyMap(); + } else { + this.arData = copyOf(value.getContents().getArData()); + + } } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/AccountTransactionDetails.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/AccountTransactionDetails.java index c91c9b22e..b92417d4c 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/AccountTransactionDetails.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/AccountTransactionDetails.java @@ -1,5 +1,6 @@ package com.concordium.sdk.responses.blockitemsummary; +import com.concordium.grpc.v2.AccountTransactionEffects; import com.concordium.sdk.responses.modulelist.ModuleRef; import com.concordium.sdk.responses.smartcontracts.ContractTraceElement; import com.concordium.sdk.responses.transactionstatus.*; @@ -13,6 +14,11 @@ /** * Details of a transaction with a sender account. + * + * Users should always check whether the {@link AccountTransactionDetails} is {@link AccountTransactionDetails#isSuccessful()} or not. + * If this returns false, then one should consult the {@link AccountTransactionDetails#rejectReason} for why the transaction failed. + * If the transaction was successful then first check the type via {@link AccountTransactionDetails#getType()} and use the corresponding + * getter for getting the concrete event. */ @EqualsAndHashCode @ToString(doNotUseGetters = true) @@ -33,6 +39,8 @@ public class AccountTransactionDetails { /** * Type of the outcome. + * Note that the type is only set if the transaction was successfully executed + * i.e., {@link AccountTransactionDetails#isSuccessful()} returns true. */ private final TransactionResultEventType type; @@ -46,13 +54,6 @@ public class AccountTransactionDetails { */ private final boolean successful; - public Optional getRejectReason() { - if (!this.successful) { - return Optional.of(rejectReason); - } - return Optional.empty(); - } - /** * The module reference if a module was deployed if the transaction * deployed a module. @@ -60,13 +61,6 @@ public Optional getRejectReason() { */ private final ModuleRef moduleDeployed; - public Optional getModuleDeployed() { - if (this.type == TransactionResultEventType.MODULE_DEPLOYED) { - return Optional.of(moduleDeployed); - } - return Optional.empty(); - } - /** * The result of a contract being initialized if the transaction * initialized a contract. @@ -74,13 +68,6 @@ public Optional getModuleDeployed() { */ private final ContractInitializedResult contractInitialized; - public Optional getContractInitialized() { - if (this.type == TransactionResultEventType.CONTRACT_INITIALIZED) { - return Optional.of(contractInitialized); - } - return Optional.empty(); - } - /** * The resulting list of events of a contract being updated if the transaction * updated a smart contract. @@ -88,13 +75,6 @@ public Optional getContractInitialized() { */ private final List contractUpdated; - public Optional> getContractUpdated() { - if (this.type == TransactionResultEventType.CONTRACT_UPDATED) { - return Optional.of(contractUpdated); - } - return Optional.empty(); - } - /** * The result of an account transfer if the transaction * updated was such one. @@ -102,28 +82,12 @@ public Optional> getContractUpdated() { */ private final TransferredResult accountTransfer; - - public Optional getAccountTransfer() { - if (this.type == TransactionResultEventType.TRANSFERRED) { - return Optional.of(accountTransfer); - } - return Optional.empty(); - } - /** * The result of a baker being added to the chain. * Present if the transaction was a {@link ConfigureBaker} */ private final BakerAddedResult bakerAdded; - - public Optional getBakerAdded() { - if (this.type == TransactionResultEventType.BAKER_ADDED) { - return Optional.of(bakerAdded); - } - return Optional.empty(); - } - /** * The result of a baker being removed from the chain. * Present if the transaction was a {@link ConfigureBaker} with an @@ -132,145 +96,65 @@ public Optional getBakerAdded() { private final BakerRemovedResult bakerRemoved; - public Optional getBakerRemoved() { - if (this.type == TransactionResultEventType.BAKER_REMOVED) { - return Optional.of(bakerRemoved); - } - return Optional.empty(); - } - /** * The result of a baker having its stake updated. * Present if the transaction was a {@link ConfigureBaker} with an updated stake. */ private final BakerStakeUpdated bakerStakeUpdated; - - public Optional getBakerStakeUpdated() { - if (this.type == TransactionResultEventType.BAKER_STAKE_UPDATED) { - return Optional.of(bakerStakeUpdated); - } - return Optional.empty(); - } - /** * The result of a baker having its restake flag updated. * Present if the transaction was a {@link ConfigureBaker} with a new re-stake flag. */ private final BakerSetRestakeEarningsResult bakerRestakeEarningsUpdated; - - public Optional getBakerRestakeEarningsUpdated() { - if (this.type == TransactionResultEventType.BAKER_SET_RESTAKE_EARNINGS) { - return Optional.of(bakerRestakeEarningsUpdated); - } - return Optional.empty(); - } - /** * The result of a baker having its keys updated. * Present if the transaction was a {@link ConfigureBaker} with new keys. */ private final BakerKeysUpdatedResult bakerKeysUpdated; - - public Optional getBakerKeysUpdated() { - if (this.type == TransactionResultEventType.BAKER_KEYS_UPDATED) { - return Optional.of(bakerKeysUpdated); - } - return Optional.empty(); - } - /** * The result of a transaction that is transferring CCD with a schedule. * Present if the transaction was a {@link TransferScheduleTransaction}. */ private final TransferredWithScheduleResult transferredWithSchedule; - public Optional getTransferredWithSchedule() { - if (this.type == TransactionResultEventType.TRANSFERRED_WITH_SCHEDULE) { - return Optional.of(transferredWithSchedule); - } - return Optional.empty(); - } - /** * The result of the sender updating keys. * Present if the transaction was a {@link UpdateCredentialKeysTransaction}. */ private final CredentialKeysUpdatedResult credentialKeysUpdated; - public Optional getCredentialKeysUpdated() { - if (this.type == TransactionResultEventType.CREDENTIAL_KEYS_UPDATED) { - return Optional.of(credentialKeysUpdated); - } - return Optional.empty(); - } - /** * The result of a credential being updated. */ private final CredentialsUpdatedResult credentialsUpdated; - public Optional getCredentialsUpdated() { - if (this.type == TransactionResultEventType.CREDENTIALS_UPDATED) { - return Optional.of(credentialsUpdated); - } - return Optional.empty(); - } - /** * The result of the sender registering data on the chain. * Present if the transaction was a {@link RegisterDataTransaction}. */ private final DataRegisteredResult dataRegistered; - public Optional getDataRegistered() { - if (this.type == TransactionResultEventType.DATA_REGISTERED) { - return Optional.of(dataRegistered); - } - return Optional.empty(); - } - /** * The result of the sender configuring baking. * Present if the transaction was a {@link ConfigureBaker}. */ private final BakerConfigured bakerConfigured; - public Optional getBakerConfigured() { - if (this.type == TransactionResultEventType.BAKER_CONFIGURED) { - return Optional.of(bakerConfigured); - } - return Optional.empty(); - } - /** * The result of the sender configuring delegation. * Present if the transaction was a {@link ConfigureDelegation}. */ private final DelegatorConfigured delegatorConfigured; - public Optional getDelegatorConfigured() { - if (this.type == TransactionResultEventType.DELEGATION_CONFIGURED) { - return Optional.of(delegatorConfigured); - } - return Optional.empty(); - } - /** * The result of the sender sending an encrypted transfer. * Present if the transaction was an {@link EncryptedTransfer}. */ private final EncryptedTransferResult encryptedTransfer; - public Optional getEncryptedTransfer() { - if (this.type == TransactionResultEventType.NEW_ENCRYPTED_AMOUNT) { - return Optional.of(encryptedTransfer); - } - return Optional.empty(); - } - /** * The result of the sender adding CCD to its encrypted balance from its * non-encrypted balance. @@ -278,13 +162,6 @@ public Optional getEncryptedTransfer() { */ private final EncryptedSelfAmountAddedResult addedToEncryptedBalance; - public Optional getAddedToEncryptedBalance() { - if (this.type == TransactionResultEventType.ENCRYPTED_SELF_AMOUNT_ADDED) { - return Optional.of(addedToEncryptedBalance); - } - return Optional.empty(); - } - /** * The result of the sender subtracting CCD from its encrypted balance to its * non-encrypted balance. @@ -292,13 +169,6 @@ public Optional getAddedToEncryptedBalance() { */ private final EncryptedAmountsRemovedResult removedFromEncryptedBalance; - public Optional getRemovedFromEncryptedBalance() { - if (this.type == TransactionResultEventType.ENCRYPTED_AMOUNTS_REMOVED) { - return Optional.of(removedFromEncryptedBalance); - } - return Optional.empty(); - } - public static AccountTransactionDetails from(com.concordium.grpc.v2.AccountTransactionDetails tx) { val sender = AccountAddress.from(tx.getSender()); val detailsBuilder = AccountTransactionDetails @@ -306,7 +176,6 @@ public static AccountTransactionDetails from(com.concordium.grpc.v2.AccountTrans .sender(sender) .cost(CCDAmount.from(tx.getCost())) .successful(true); - val effects = tx.getEffects(); switch (effects.getEffectCase()) { case NONE: @@ -315,10 +184,14 @@ public static AccountTransactionDetails from(com.concordium.grpc.v2.AccountTrans .rejectReason(RejectReasonType.from(effects.getNone().getRejectReason())); break; case MODULE_DEPLOYED: - detailsBuilder.moduleDeployed(ModuleRef.from(effects.getModuleDeployed().getValue().toByteArray())); + detailsBuilder + .type(TransactionResultEventType.MODULE_DEPLOYED) + .moduleDeployed(ModuleRef.from(effects.getModuleDeployed().getValue().toByteArray())); break; case CONTRACT_INITIALIZED: - detailsBuilder.contractInitialized(ContractInitializedResult.from(effects.getContractInitialized())); + detailsBuilder + .type(TransactionResultEventType.CONTRACT_INITIALIZED) + .contractInitialized(ContractInitializedResult.from(effects.getContractInitialized())); break; case CONTRACT_UPDATE_ISSUED: val updateEvents = effects @@ -327,55 +200,85 @@ public static AccountTransactionDetails from(com.concordium.grpc.v2.AccountTrans .stream() .map(ContractTraceElement::from) .collect(Collectors.toList()); - detailsBuilder.contractUpdated(updateEvents); + detailsBuilder + .type(TransactionResultEventType.CONTRACT_UPDATED) + .contractUpdated(updateEvents); break; case ACCOUNT_TRANSFER: - if (effects.getAccountTransfer().hasMemo()) { - break; - } - detailsBuilder.accountTransfer(TransferredResult.from(effects.getAccountTransfer(), sender)); + detailsBuilder + .type(TransactionResultEventType.TRANSFERRED) + .accountTransfer(TransferredResult.from(effects.getAccountTransfer(), sender)); + break; case BAKER_ADDED: - detailsBuilder.bakerAdded(BakerAddedResult.from(effects.getBakerAdded())); + detailsBuilder + .type(TransactionResultEventType.BAKER_ADDED) + .bakerAdded(BakerAddedResult.from(effects.getBakerAdded())); break; case BAKER_REMOVED: - detailsBuilder.bakerRemoved(BakerRemovedResult.from(effects.getBakerRemoved(), sender)); + detailsBuilder + .type(TransactionResultEventType.BAKER_REMOVED) + .bakerRemoved(BakerRemovedResult.from(effects.getBakerRemoved(), sender)); break; case BAKER_STAKE_UPDATED: - detailsBuilder.bakerStakeUpdated(BakerStakeUpdated.from(effects.getBakerStakeUpdated(), sender)); + detailsBuilder + .type(TransactionResultEventType.BAKER_STAKE_UPDATED) + .bakerStakeUpdated(BakerStakeUpdated.from(effects.getBakerStakeUpdated(), sender)); break; case BAKER_RESTAKE_EARNINGS_UPDATED: - detailsBuilder.bakerRestakeEarningsUpdated(BakerSetRestakeEarningsResult.from(effects.getBakerRestakeEarningsUpdated(), sender)); + detailsBuilder + .type(TransactionResultEventType.BAKER_SET_RESTAKE_EARNINGS) + .bakerRestakeEarningsUpdated(BakerSetRestakeEarningsResult.from(effects.getBakerRestakeEarningsUpdated(), sender)); break; case BAKER_KEYS_UPDATED: - detailsBuilder.bakerKeysUpdated(BakerKeysUpdatedResult.from(effects.getBakerKeysUpdated(), sender)); + detailsBuilder + .type(TransactionResultEventType.BAKER_KEYS_UPDATED) + .bakerKeysUpdated(BakerKeysUpdatedResult.from(effects.getBakerKeysUpdated(), sender)); break; case ENCRYPTED_AMOUNT_TRANSFERRED: - detailsBuilder.encryptedTransfer(EncryptedTransferResult.from(effects.getEncryptedAmountTransferred())); + detailsBuilder + .type(TransactionResultEventType.ENCRYPTED_TRANSFER) + .encryptedTransfer(EncryptedTransferResult.from(effects.getEncryptedAmountTransferred())); break; case TRANSFERRED_TO_ENCRYPTED: - detailsBuilder.addedToEncryptedBalance(EncryptedSelfAmountAddedResult.from(effects.getTransferredToEncrypted())); + detailsBuilder + .type(TransactionResultEventType.ENCRYPTED_SELF_AMOUNT_ADDED) + .addedToEncryptedBalance(EncryptedSelfAmountAddedResult.from(effects.getTransferredToEncrypted())); break; case TRANSFERRED_TO_PUBLIC: - detailsBuilder.removedFromEncryptedBalance(EncryptedAmountsRemovedResult.from(effects.getTransferredToPublic().getRemoved())); + detailsBuilder + .type(TransactionResultEventType.ENCRYPTED_AMOUNTS_REMOVED) + .removedFromEncryptedBalance(EncryptedAmountsRemovedResult.from(effects.getTransferredToPublic().getRemoved())); break; case TRANSFERRED_WITH_SCHEDULE: - detailsBuilder.transferredWithSchedule(TransferredWithScheduleResult.from(effects.getTransferredWithSchedule(), sender)); + detailsBuilder + .type(TransactionResultEventType.TRANSFERRED_WITH_SCHEDULE) + .transferredWithSchedule(TransferredWithScheduleResult.from(effects.getTransferredWithSchedule(), sender)); break; case CREDENTIAL_KEYS_UPDATED: - detailsBuilder.credentialKeysUpdated(CredentialKeysUpdatedResult.from(effects.getCredentialKeysUpdated())); + detailsBuilder + .type(TransactionResultEventType.CREDENTIAL_KEYS_UPDATED) + .credentialKeysUpdated(CredentialKeysUpdatedResult.from(effects.getCredentialKeysUpdated())); break; case CREDENTIALS_UPDATED: - detailsBuilder.credentialsUpdated(CredentialsUpdatedResult.from(effects.getCredentialsUpdated(), sender)); + detailsBuilder + .type(TransactionResultEventType.CREDENTIALS_UPDATED) + .credentialsUpdated(CredentialsUpdatedResult.from(effects.getCredentialsUpdated(), sender)); break; case DATA_REGISTERED: - detailsBuilder.dataRegistered(DataRegisteredResult.from(effects.getDataRegistered())); + detailsBuilder + .type(TransactionResultEventType.DATA_REGISTERED) + .dataRegistered(DataRegisteredResult.from(effects.getDataRegistered())); break; case BAKER_CONFIGURED: - detailsBuilder.bakerConfigured(BakerConfigured.from(effects.getBakerConfigured(), sender)); + detailsBuilder + .type(TransactionResultEventType.BAKER_CONFIGURED) + .bakerConfigured(BakerConfigured.from(effects.getBakerConfigured(), sender)); break; case DELEGATION_CONFIGURED: - detailsBuilder.delegatorConfigured(DelegatorConfigured.from(effects.getDelegationConfigured(), sender)); + detailsBuilder + .type(TransactionResultEventType.DELEGATION_CONFIGURED) + .delegatorConfigured(DelegatorConfigured.from(effects.getDelegationConfigured(), sender)); break; case EFFECT_NOT_SET: throw new IllegalArgumentException("Unrecognized effect."); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/BakerConfigured.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/BakerConfigured.java index 4300f5824..e404fe291 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/BakerConfigured.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/BakerConfigured.java @@ -62,6 +62,6 @@ public static BakerConfigured from(AccountTransactionEffects.BakerConfigured bak throw new IllegalArgumentException("Baker event was not set."); } } - throw new IllegalArgumentException("Unrecognized baker event."); + return builder.build(); } } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/ChainUpdateDetails.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/ChainUpdateDetails.java index 254f966c4..beeedc654 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/ChainUpdateDetails.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/ChainUpdateDetails.java @@ -11,10 +11,8 @@ import com.concordium.sdk.transactions.CCDAmount; import com.concordium.sdk.types.AccountAddress; import com.concordium.sdk.types.Timestamp; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import lombok.val; +import com.fasterxml.jackson.annotation.JsonUnwrapped; +import lombok.*; import java.time.Duration; import java.util.Optional; @@ -25,7 +23,8 @@ */ @EqualsAndHashCode(doNotUseGetters = true) @Builder -@ToString +@ToString(doNotUseGetters = true) +@Getter public class ChainUpdateDetails { private final Timestamp effectiveTime; @@ -37,25 +36,12 @@ public class ChainUpdateDetails { */ private final ProtocolUpdate protocolUpdate; - public Optional getProtocolUpdate() { - if (this.type == UpdateType.UPDATE_PROTOCOL) { - return Optional.of(this.protocolUpdate); - } - return Optional.empty(); - } - /** * The election difficulty update. * This is only non-null if the type is {@link UpdateType#UPDATE_ELECTION_DIFFICULTY} */ private final double electionDifficultyUpdate; - public Optional getElectionDifficultyUpdate() { - if (this.type == UpdateType.UPDATE_ELECTION_DIFFICULTY) { - return Optional.of(this.electionDifficultyUpdate); - } - return Optional.empty(); - } /** * The euro per energy update. @@ -63,247 +49,114 @@ public Optional getElectionDifficultyUpdate() { */ private final Fraction euroPerEnergyUpdate; - public Optional getEuroPerEnergy() { - if (this.type == UpdateType.UPDATE_EURO_PER_ENERGY) { - return Optional.of(this.euroPerEnergyUpdate); - } - return Optional.empty(); - } - /** * The micro CCD per euro update. * This is only non-null if the type is {@link UpdateType#UPDATE_MICRO_CCD_PER_EURO} */ private final Fraction microCCDPerEuroUpdate; - public Optional getMicroCCDPerEuroUpdate() { - if (this.type == UpdateType.UPDATE_MICRO_CCD_PER_EURO) { - return Optional.of(this.microCCDPerEuroUpdate); - } - return Optional.empty(); - } - /** * The foundation account update. * This is only non-null if the type is {@link UpdateType#UPDATE_FOUNDATION_ACCOUNT} */ private final AccountAddress foundationAccountUpdate; - public Optional getFoundationAccountUpdate() { - if (this.type == UpdateType.UPDATE_MICRO_CCD_PER_EURO) { - return Optional.of(this.foundationAccountUpdate); - } - return Optional.empty(); - } - /** * The mint distribution update. * This is only non-null if the type is {@link UpdateType#UPDATE_MINT_DISTRIBUTION} */ private final MintDistribution mintDistributionUpdate; - public Optional getMintDistributionUpdate() { - if (this.type == UpdateType.UPDATE_MINT_DISTRIBUTION) { - return Optional.of(this.mintDistributionUpdate); - } - return Optional.empty(); - } - /** * The transaction fee distribution update. * This is only non-null if the type is {@link UpdateType#UPDATE_TRANSACTION_FEE_DISTRIBUTION} */ private final TransactionFeeDistribution transactionFeeDistributionUpdate; - public Optional getTransactionFeeDistributionUpdate() { - if (this.type == UpdateType.UPDATE_TRANSACTION_FEE_DISTRIBUTION) { - return Optional.of(this.transactionFeeDistributionUpdate); - } - return Optional.empty(); - } - /** * The GAS rewards update. * This is only non-null if the type is {@link UpdateType#UPDATE_GAS_REWARDS} */ private final GasRewards gasRewardsUpdate; - public Optional getGasRewardsUpdate() { - if (this.type == UpdateType.UPDATE_GAS_REWARDS) { - return Optional.of(this.gasRewardsUpdate); - } - return Optional.empty(); - } - /** * The baker stake threshold update. * This is only non-null if the type is {@link UpdateType#BAKER_STAKE_THRESHOLD_UPDATE} */ private final CCDAmount bakerStakeThresholdUpdate; - public Optional getBakerStakeThresholdUpdate() { - if (this.type == UpdateType.BAKER_STAKE_THRESHOLD_UPDATE) { - return Optional.of(this.bakerStakeThresholdUpdate); - } - return Optional.empty(); - } - /** * The pool parameters update. * This is only non-null if the type is {@link UpdateType#UPDATE_POOL_PARAMETERS} */ private final PoolParameters poolParametersUpdate; - public Optional getPoolParametersUpdate() { - if (this.type == UpdateType.UPDATE_POOL_PARAMETERS) { - return Optional.of(this.poolParametersUpdate); - } - return Optional.empty(); - } - /** * An anonymity revoker was added. * This is only non-null if the type is {@link UpdateType#ADD_ANONYMITY_REVOKER} */ private final AnonymityRevokerInfo anonymityRevokerInfoUpdate; - public Optional getAnonymityRevokerInfoUpdate() { - if (this.type == UpdateType.ADD_ANONYMITY_REVOKER) { - return Optional.of(this.anonymityRevokerInfoUpdate); - } - return Optional.empty(); - } - /** * An identity provider was added. * This is only non-null if the type is {@link UpdateType#ADD_IDENTITY_PROVIDER} */ private final IdentityProviderInfo identityProviderInfoUpdate; - public Optional getIdentityProviderInfoUpdate() { - if (this.type == UpdateType.ADD_IDENTITY_PROVIDER) { - return Optional.of(this.identityProviderInfoUpdate); - } - return Optional.empty(); - } - /** * Root keys was altered. * This is only non-null if the type is {@link UpdateType#UPDATE_ROOT_KEYS} */ private final RootKeysUpdate rootKeysUpdate; - public Optional getRootKeysUpdate() { - if (this.type == UpdateType.UPDATE_ROOT_KEYS) { - return Optional.of(this.rootKeysUpdate); - } - return Optional.empty(); - } - /** * Level 1 keys was altered. * This is only non-null if the type is {@link UpdateType#UPDATE_LEVEL1_KEYS} */ private final Level1KeysUpdate level1KeysUpdate; - public Optional getLevel1KeysUpdate() { - if (this.type == UpdateType.UPDATE_LEVEL1_KEYS) { - return Optional.of(this.level1KeysUpdate); - } - return Optional.empty(); - } - /** * Level 2 keys was altered. * This is only non-null if the type is {@link UpdateType#UPDATE_LEVEL2_KEYS} */ private final Authorizations level2KeysUpdate; - public Optional getLevel2KeysUpdate() { - if (this.type == UpdateType.UPDATE_LEVEL2_KEYS) { - return Optional.of(this.level2KeysUpdate); - } - return Optional.empty(); - } - /** * Cooldown parameters was changed. * This is only non-null if the type is {@link UpdateType#UPDATE_COOLDOWN_PARAMETERS} */ private final CooldownParameter cooldownParametersUpdate; - public Optional getCooldownParametersUpdate() { - if (this.type == UpdateType.UPDATE_COOLDOWN_PARAMETERS) { - return Optional.of(this.cooldownParametersUpdate); - } - return Optional.empty(); - } - /** * Time parameters was changed. * This is only non-null if the type is {@link UpdateType#UPDATE_TIME_PARAMETERS} */ private final TimeParameters timeParametersUpdate; - public Optional getTimeParametersUpdate() { - if (this.type == UpdateType.UPDATE_TIME_PARAMETERS) { - return Optional.of(this.timeParametersUpdate); - } - return Optional.empty(); - } - /** * Timeout parameters was changed. * This is only non-null if the type is {@link UpdateType#UPDATE_TIMEOUT_PARAMETERS} */ private final TimeoutParameters timeoutParametersUpdate; - public Optional getTimeoutParametersUpdate() { - if (this.type == UpdateType.UPDATE_TIMEOUT_PARAMETERS) { - return Optional.of(this.timeoutParametersUpdate); - } - return Optional.empty(); - } - /** * The minimum block time was changed. * This is only non-null if the type is {@link UpdateType#UPDATE_MIN_BLOCK_TIME} */ private final Duration minBlockTimeUpdate; - public Optional getMinBlockTimeUpdate() { - if (this.type == UpdateType.UPDATE_MIN_BLOCK_TIME) { - return Optional.of(this.minBlockTimeUpdate); - } - return Optional.empty(); - } - /** * The maximum energy a block can spend when executing was changed. * This is only non-null if the type is {@link UpdateType#UPDATE_BLOCK_ENERGY_LIMIT} */ private final Energy blockEnergyLimitUpdate; - public Optional getBlockEnergyLimitUpdate() { - if (this.type == UpdateType.UPDATE_BLOCK_ENERGY_LIMIT) { - return Optional.of(this.blockEnergyLimitUpdate); - } - return Optional.empty(); - } - /** * The maximum energy a block can spend when executing was changed. * This is only non-null if the type is {@link UpdateType#UPDATE_FINALIZATION_COMMITTEE_PARAMETERS} */ private final FinalizationCommitteeParameters finalizationCommitteeParametersUpdate; - public Optional getFinalizationCommitteeParametersUpdate() { - if (this.type == UpdateType.UPDATE_FINALIZATION_COMMITTEE_PARAMETERS) { - return Optional.of(this.finalizationCommitteeParametersUpdate); - } - return Optional.empty(); - } - public static ChainUpdateDetails from(UpdateDetails update) { val chainUpdateDetailsBuilder = ChainUpdateDetails .builder() @@ -381,17 +234,13 @@ public static ChainUpdateDetails from(UpdateDetails update) { break; case COOLDOWN_PARAMETERS_CPV_1_UPDATE: chainUpdateDetailsBuilder - .type(UpdateType.UPDATE_COOLDOWN_PARAMETERS); - if (payload.hasCooldownParametersCpv1Update()) { - chainUpdateDetailsBuilder.cooldownParametersUpdate(CooldownParametersCpv1.from(payload.getCooldownParametersCpv1Update())); - } + .type(UpdateType.UPDATE_COOLDOWN_PARAMETERS) + .cooldownParametersUpdate(CooldownParametersCpv1.from(payload.getCooldownParametersCpv1Update())); break; case POOL_PARAMETERS_CPV_1_UPDATE: chainUpdateDetailsBuilder - .type(UpdateType.UPDATE_POOL_PARAMETERS); - if (payload.hasPoolParametersCpv1Update()) { - chainUpdateDetailsBuilder.poolParametersUpdate(PoolParameters.from(payload.getPoolParametersCpv1Update())); - } + .type(UpdateType.UPDATE_POOL_PARAMETERS). + poolParametersUpdate(PoolParameters.from(payload.getPoolParametersCpv1Update())); break; case TIME_PARAMETERS_CPV_1_UPDATE: chainUpdateDetailsBuilder diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/EncryptedTransferResult.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/EncryptedTransferResult.java index c30f761b7..133f4a048 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/EncryptedTransferResult.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/blockitemsummary/EncryptedTransferResult.java @@ -17,7 +17,15 @@ @EqualsAndHashCode @ToString(doNotUseGetters = true) public class EncryptedTransferResult { + + /** + * Event on the sender account. + */ private final EncryptedAmountsRemovedResult sender; + + /** + * Event on the receiver account. + */ private final NewEncryptedAmountResult receiver; /** diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV0.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV0.java index a7e778572..23db99eae 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV0.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV0.java @@ -1,5 +1,6 @@ package com.concordium.sdk.responses.chainparameters; +import com.concordium.sdk.responses.AccountIndex; import com.concordium.sdk.responses.Fraction; import com.concordium.sdk.responses.transactionstatus.PartsPerHundredThousand; import com.concordium.sdk.transactions.CCDAmount; @@ -96,7 +97,8 @@ public class ChainParametersV0 extends ChainParameters { @JsonProperty("electionDifficulty") double electionDifficulty, @JsonProperty("euroPerEnergy") Fraction euroPerEnergy, @JsonProperty("minimumThresholdForBaking") CCDAmount bakerStakeThreshold, - @JsonProperty("bakerCooldownEpochs") long bakerCooldownEpochs) { + @JsonProperty("bakerCooldownEpochs") long bakerCooldownEpochs, + @JsonProperty("foundationAccountIndex") AccountIndex foundationAccountIndex) { this.euroPerEnergy = euroPerEnergy; this.microCCDPerEuro = microCCDPerEuro; this.credentialsPerBlockLimit = accountCreationLimit; diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV1.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV1.java index 3bcf1d7d5..ae7acb112 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV1.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/ChainParametersV1.java @@ -1,12 +1,14 @@ package com.concordium.sdk.responses.chainparameters; import com.concordium.sdk.Range; +import com.concordium.sdk.responses.AccountIndex; import com.concordium.sdk.responses.Fraction; import com.concordium.sdk.responses.transactionstatus.PartsPerHundredThousand; import com.concordium.sdk.transactions.CCDAmount; import com.concordium.sdk.types.AccountAddress; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -115,7 +117,8 @@ public class ChainParametersV1 extends ChainParameters { @JsonProperty("passiveBakingCommission") double passiveBakingCommission, @JsonProperty("leverageBound") Fraction leverageBound, @JsonProperty("passiveFinalizationCommission") double passiveFinalizationCommission, - @JsonProperty("capitalBound") double capitalBound + @JsonProperty("capitalBound") double capitalBound, + @JsonProperty("foundationAccountIndex") AccountIndex foundationAccountIndex ) { this.mintDistribution = (MintDistributionCpV1) rewardParameters.getMintDistribution(); this.gasRewards = rewardParameters.getGasRewards(); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistribution.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistribution.java index b7c937ea0..819a3ea95 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistribution.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistribution.java @@ -1,5 +1,9 @@ package com.concordium.sdk.responses.chainparameters; +/** + * A common class for {@link MintDistributionCpV0} and {@link MintDistributionCpV1} + * Check with {@link MintDistribution#getType()} before casting. + */ public abstract class MintDistribution { public abstract MintDistributionType getType(); diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV0.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV0.java index deaff50bd..3e1524e71 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV0.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV0.java @@ -1,6 +1,8 @@ package com.concordium.sdk.responses.chainparameters; import com.concordium.sdk.responses.transactionstatus.PartsPerHundredThousand; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -30,6 +32,17 @@ public class MintDistributionCpV0 extends MintDistribution { */ private final double finalizationReward; + @JsonCreator + public MintDistributionCpV0( + @JsonProperty("mintPerSlot") double mintPerSlot, + @JsonProperty("bakingReward") double bakingReward, + @JsonProperty("finalizationReward") double finalizationReward) { + this.mintPerSlot = mintPerSlot; + this.bakingReward = bakingReward; + this.finalizationReward = finalizationReward; + } + + public static MintDistributionCpV0 from(com.concordium.grpc.v2.MintDistributionCpv0 value) { return MintDistributionCpV0 .builder() diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV1.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV1.java index a874afa61..38fcac385 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV1.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/MintDistributionCpV1.java @@ -2,6 +2,8 @@ import com.concordium.grpc.v2.MintDistributionCpv1; import com.concordium.sdk.responses.transactionstatus.PartsPerHundredThousand; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -22,6 +24,13 @@ public class MintDistributionCpV1 extends MintDistribution { */ private final double finalizationReward; + @JsonCreator + public MintDistributionCpV1(@JsonProperty("bakingReward") double bakingReward, + @JsonProperty("finalizationReward") double finalizationReward) { + this.bakingReward = bakingReward; + this.finalizationReward = finalizationReward; + } + public static MintDistributionCpV1 from(MintDistributionCpv1 update) { return MintDistributionCpV1 .builder() diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/RewardParameters.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/RewardParameters.java index bb40a6a4d..d9ddd7faa 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/RewardParameters.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/RewardParameters.java @@ -1,7 +1,9 @@ package com.concordium.sdk.responses.chainparameters; +import com.concordium.sdk.serializing.JsonMapper; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; import lombok.Getter; import lombok.ToString; @@ -17,11 +19,14 @@ public final class RewardParameters { private final GasRewards gasRewards; @JsonCreator - RewardParameters(@JsonProperty("mintDistribution") MintDistribution mintDistribution, + RewardParameters(@JsonProperty("mintDistribution") JsonNode mintDistribution, @JsonProperty("transactionFeeDistribution") TransactionFeeDistribution transactionFeeDistribution, @JsonProperty("gASRewards") GasRewards gasRewards) { - this.mintDistribution = mintDistribution; - + if (!mintDistribution.findPath("mintPerSlot").isMissingNode()) { + this.mintDistribution = JsonMapper.INSTANCE.convertValue(mintDistribution, MintDistributionCpV0.class); + } else { + this.mintDistribution = JsonMapper.INSTANCE.convertValue(mintDistribution, MintDistributionCpV1.class); + } this.transactionFeeDistribution = transactionFeeDistribution; this.gasRewards = gasRewards; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/TransactionFeeDistribution.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/TransactionFeeDistribution.java index 223c56403..1bda6dab5 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/TransactionFeeDistribution.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/chainparameters/TransactionFeeDistribution.java @@ -1,6 +1,8 @@ package com.concordium.sdk.responses.chainparameters; import com.concordium.sdk.responses.transactionstatus.PartsPerHundredThousand; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -24,7 +26,9 @@ public class TransactionFeeDistribution { */ private final double allocatedForGASAccount; - public TransactionFeeDistribution(double allocatedForBaker, double allocatedForGASAccount) { + @JsonCreator + public TransactionFeeDistribution(@JsonProperty("baker") double allocatedForBaker, + @JsonProperty("gasAccount") double allocatedForGASAccount) { this.allocatedForBaker = allocatedForBaker; this.allocatedForGASAccount = allocatedForGASAccount; } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransactionResultEventType.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransactionResultEventType.java index 8a09bad17..aa320d2b1 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransactionResultEventType.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransactionResultEventType.java @@ -4,7 +4,7 @@ /** * Events emitted by transactions. - * Should match https://github.com/Concordium/concordium-base/blob/8dcee8746e40d663222aa3b4b04eaa3710e2779e/haskell-src/Concordium/Types/Execution.hs#L736 + * Should match https://github.com/Concordium/concordium-base/blob/8dcee8746e40d663222aa3b4b04eaa3710e2779e/haskell-src/Concordium/Types/Execution.hs */ public enum TransactionResultEventType { @JsonProperty("ModuleDeployed") @@ -84,7 +84,12 @@ public enum TransactionResultEventType { @JsonProperty("BakerConfigured") BAKER_CONFIGURED, @JsonProperty("DelegationConfigured") - DELEGATION_CONFIGURED; + DELEGATION_CONFIGURED, + // An event that occurs when an account send an + // encrypted transfer. + // The result of such a transaction is a 'NEW_ENCRYPTED_AMOUNT' event for the + // account receiving and 'ENCRYPTED_AMOUNTS_REMOVED' for sender account. + ENCRYPTED_TRANSFER; // Convenience methods for doing 'safe' casting. public T convert(TransactionResultEvent event) { diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredResult.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredResult.java index 065b5816a..f2111ea48 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredResult.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredResult.java @@ -4,6 +4,7 @@ import com.concordium.sdk.responses.smartcontracts.ContractTraceElement; import com.concordium.sdk.responses.smartcontracts.ContractTraceElementType; import com.concordium.sdk.transactions.CCDAmount; +import com.concordium.sdk.transactions.Memo; import com.concordium.sdk.types.AbstractAddress; import com.concordium.sdk.types.AccountAddress; import com.concordium.sdk.types.ContractAddress; @@ -13,6 +14,7 @@ import java.util.Map; import java.util.Objects; +import java.util.Optional; @Getter @ToString @@ -36,6 +38,15 @@ public final class TransferredResult implements TransactionResultEvent, Contract */ private CCDAmount amount; + /** + * A memo if the transfer was with a memo. + */ + private Memo memo; + + public Optional getMemo() { + return Optional.ofNullable(this.memo); + } + @JsonCreator TransferredResult(@JsonProperty("to") Map to, @JsonProperty("from") Map from, @@ -49,14 +60,19 @@ public final class TransferredResult implements TransactionResultEvent, Contract } public static TransferredResult from(AccountTransactionEffects.AccountTransfer accountTransfer, AccountAddress sender) { - return TransferredResult + TransferredResultBuilder builder = TransferredResult .builder() .from(sender) .to(AccountAddress.from(accountTransfer.getReceiver())) - .amount(CCDAmount.from(accountTransfer.getAmount())) + .amount(CCDAmount.from(accountTransfer.getAmount())); + if (accountTransfer.hasMemo()) { + builder.memo(Memo.from(accountTransfer.getMemo())); + } + return builder .build(); } + @Override public TransactionResultEventType getType() { return TransactionResultEventType.TRANSFERRED; diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredWithScheduleResult.java b/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredWithScheduleResult.java index 77559a11c..12b0954b1 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredWithScheduleResult.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/responses/transactionstatus/TransferredWithScheduleResult.java @@ -1,23 +1,36 @@ package com.concordium.sdk.responses.transactionstatus; import com.concordium.grpc.v2.AccountTransactionEffects; +import com.concordium.sdk.transactions.Memo; import com.concordium.sdk.types.AccountAddress; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.*; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @Getter @ToString @Builder @EqualsAndHashCode +@AllArgsConstructor public final class TransferredWithScheduleResult implements TransactionResultEvent { private final List releases; private final AccountAddress to; private final AccountAddress from; + private final Memo memo; + + /** + * Get the memo if there was such one. + * @return the memo. + */ + private Optional getMemo() { + return Optional.ofNullable(memo); + } + @JsonCreator TransferredWithScheduleResult(@JsonProperty("amount") List releases, // list of tuples @JsonProperty("to") AccountAddress to, @@ -25,15 +38,20 @@ public final class TransferredWithScheduleResult implements TransactionResultEve this.releases = releases; this.to = to; this.from = from; + this.memo = null; } public static TransferredWithScheduleResult from(AccountTransactionEffects.TransferredWithSchedule transferredWithSchedule, AccountAddress sender) { val releases = transferredWithSchedule.getAmountList().stream().map(TransferRelease::from).collect(Collectors.toList()); - return TransferredWithScheduleResult + TransferredWithScheduleResultBuilder builder = TransferredWithScheduleResult .builder() .from(sender) .to(AccountAddress.from(transferredWithSchedule.getReceiver())) - .releases(releases) + .releases(releases); + if(transferredWithSchedule.hasMemo()) { + builder.memo(Memo.from(transferredWithSchedule.getMemo())); + } + return builder .build(); } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/transactions/ConfigureBakerKeysPayload.java b/concordium-sdk/src/main/java/com/concordium/sdk/transactions/ConfigureBakerKeysPayload.java index edb2ae565..a602e8bcf 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/transactions/ConfigureBakerKeysPayload.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/transactions/ConfigureBakerKeysPayload.java @@ -31,9 +31,7 @@ public static ConfigureBakerKeysPayload from(ConfigureBakerKeysJniOutput jniOutp * @param sender The account address of the sender * @return The newly generated ConfigureBakerKeysPayload */ - public static ConfigureBakerKeysPayload getNewConfigureBakerKeysPayload(AccountAddress sender) { - // Create a new set of baker keys - BakerKeysJniOutput bakerKeys = BakerKeys.createBakerKeys(); + public static ConfigureBakerKeysPayload getNewConfigureBakerKeysPayload(AccountAddress sender, BakerKeys bakerKeys) { // Create the input for the ConfigureBakerKeys JNI function ConfigureBakerKeysJniInput input = ConfigureBakerKeysJniInput.builder() .keys(bakerKeys) diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/transactions/TransactionFactory.java b/concordium-sdk/src/main/java/com/concordium/sdk/transactions/TransactionFactory.java index c0e06e938..9edd61a27 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/transactions/TransactionFactory.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/transactions/TransactionFactory.java @@ -1,5 +1,6 @@ package com.concordium.sdk.transactions; +import com.concordium.sdk.crypto.bakertransactions.BakerKeys; import com.concordium.sdk.crypto.elgamal.ElgamalPublicKey; import com.concordium.sdk.crypto.elgamal.ElgamalSecretKey; import com.concordium.sdk.crypto.encryptedtransfers.EncryptedTransfers; @@ -296,9 +297,9 @@ public static ConfigureBakerTransaction.ConfigureBakerTransactionBuilder newUpda * * @return the builder for a {@link ConfigureBakerTransaction} */ - public static ConfigureBakerTransaction.ConfigureBakerTransactionBuilder newUpdateBakerKeys(AccountAddress accountAddress) { + public static ConfigureBakerTransaction.ConfigureBakerTransactionBuilder newUpdateBakerKeys(AccountAddress accountAddress, BakerKeys bakerKeys) { val payload = ConfigureBakerPayload.builder() - .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress)) + .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress, bakerKeys)) .build(); return ConfigureBakerTransaction.builder().payload(payload); } diff --git a/concordium-sdk/src/main/java/com/concordium/sdk/types/UInt64.java b/concordium-sdk/src/main/java/com/concordium/sdk/types/UInt64.java index 6d8fbff74..ad6a261ca 100644 --- a/concordium-sdk/src/main/java/com/concordium/sdk/types/UInt64.java +++ b/concordium-sdk/src/main/java/com/concordium/sdk/types/UInt64.java @@ -1,21 +1,34 @@ package com.concordium.sdk.types; +import com.fasterxml.jackson.annotation.JsonCreator; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.val; +import java.math.BigInteger; import java.nio.ByteBuffer; @Getter @EqualsAndHashCode -public final class UInt64 { +public final class UInt64 implements Comparable { public static final int BYTES = Long.BYTES; + + /** + * The internal value. + * This should be treated as an unsigned + */ private final long value; - private UInt64(long value) { + @JsonCreator + public UInt64(long value) { this.value = value; } + @JsonCreator + public UInt64(BigInteger value) { + this.value = UInt64.from(value.toString()).getValue(); + } + public byte[] getBytes() { val buffer = ByteBuffer.allocate(Long.BYTES); buffer.putLong(this.value); @@ -27,9 +40,6 @@ public static UInt64 from(String value) { } public static UInt64 from(long value) { - if (value < 0) { - throw new NumberFormatException("Value of UInt64 can not be negative"); - } return new UInt64(value); } @@ -48,6 +58,11 @@ public static UInt64 fromBytes(ByteBuffer source) { @Override public String toString() { - return String.valueOf(value); + return Long.toUnsignedString(value); + } + + @Override + public int compareTo(UInt64 other) { + return Long.compareUnsigned(this.value, other.value); } } diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetAccountInfoTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetAccountInfoTest.java index 2af383bfe..aa477e5b5 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetAccountInfoTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetAccountInfoTest.java @@ -8,9 +8,11 @@ import com.concordium.grpc.v2.Policy; import com.concordium.grpc.v2.ReleaseSchedule; import com.concordium.grpc.v2.*; +import com.concordium.sdk.crypto.bls.BLSPublicKey; import com.concordium.sdk.crypto.ed25519.ED25519PublicKey; import com.concordium.sdk.crypto.ed25519.ED25519SecretKey; import com.concordium.sdk.crypto.elgamal.ElgamalPublicKey; +import com.concordium.sdk.crypto.vrf.VRFPublicKey; import com.concordium.sdk.requests.AccountQuery; import com.concordium.sdk.requests.BlockQuery; import com.concordium.sdk.responses.accountinfo.*; @@ -266,8 +268,8 @@ private static Commitment toCommitment(byte[] commitmentCredCounter) { .restakeEarnings(RESTAKE_EARNINGS) .pendingChange(PENDING_CHANGE) .bakerId(com.concordium.sdk.responses.BakerId.from(BAKER_ID)) - .bakerAggregationVerifyKey(ED25519PublicKey.from(BAKER_AGGREGATION_KEY)) - .bakerElectionVerifyKey(ED25519PublicKey.from(BAKER_ELECTION_VERIFY_KEY)) + .bakerAggregationVerifyKey(BLSPublicKey.from(BAKER_AGGREGATION_KEY)) + .bakerElectionVerifyKey(VRFPublicKey.from(BAKER_ELECTION_VERIFY_KEY)) .bakerSignatureVerifyKey(ED25519PublicKey.from(BAKER_SIGNATURE_VERIFY_KEY)) .bakerPoolInfo(com.concordium.sdk.responses.accountinfo.BakerPoolInfo.builder() .metadataUrl(BAKER_POOL_URL) diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetBlockItemStatusTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetBlockItemStatusTest.java index c3ca77d16..5c691baa4 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetBlockItemStatusTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/ClientV2GetBlockItemStatusTest.java @@ -6,6 +6,7 @@ import com.concordium.sdk.responses.blockitemsummary.Details; import com.concordium.sdk.responses.blockitemsummary.Summary; import com.concordium.sdk.responses.transactionstatus.Status; +import com.concordium.sdk.responses.transactionstatus.TransactionResultEventType; import com.concordium.sdk.responses.transactionstatus.TransferredResult; import com.concordium.sdk.transactions.CCDAmount; import com.concordium.sdk.transactions.Hash; @@ -90,6 +91,7 @@ public class ClientV2GetBlockItemStatusTest { .accountTransactionDetails(com.concordium.sdk.responses.blockitemsummary.AccountTransactionDetails .builder() .successful(true) + .type(TransactionResultEventType.TRANSFERRED) .sender(AccountAddress.from(SENDER_ADDRESS)) .cost(CCDAmount.fromMicro(TRANSACTION_COST)) .accountTransfer(TransferredResult diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysTest.java index 9f9f3fde5..849217aa7 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/crypto/bakertransactions/BakerKeysTest.java @@ -25,7 +25,7 @@ public void shouldCreateBakerKeysTest() { @SneakyThrows @Test public void shouldConfigureEmptyBakerKeysTest() { - BakerKeysJniOutput bakerKeys = BakerKeys.createBakerKeys(); + BakerKeys bakerKeys = BakerKeys.createBakerKeys(); AccountAddress sender = AccountAddress.from("48x2Uo8xCMMxwGuSQnwbqjzKtVqK5MaUud4vG7QEUgDmYkV85e"); ConfigureBakerKeysJniInput input = ConfigureBakerKeysJniInput.builder() .keys(bakerKeys) @@ -45,7 +45,7 @@ public void shouldConfigureEmptyBakerKeysTest() { @Test public void shouldCreateNewBakerKeysTest() { AccountAddress sender = AccountAddress.from("48x2Uo8xCMMxwGuSQnwbqjzKtVqK5MaUud4vG7QEUgDmYkV85e"); - val bakerKeys = ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(sender); + val bakerKeys = ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(sender, BakerKeys.createBakerKeys()); assertEquals(352, bakerKeys.getBytes().length); } } diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/queries/AccountInfoTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/queries/AccountInfoTest.java new file mode 100644 index 000000000..af7254451 --- /dev/null +++ b/concordium-sdk/src/test/java/com/concordium/sdk/queries/AccountInfoTest.java @@ -0,0 +1,29 @@ +package com.concordium.sdk.queries; + +import com.concordium.sdk.responses.accountinfo.AccountInfo; +import com.concordium.sdk.responses.accountinfo.credential.CredentialType; +import com.concordium.sdk.types.AccountAddress; +import com.concordium.sdk.types.Nonce; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class AccountInfoTest { + + private static final String NORMAL_ACCOUNT = "{\"accountNonce\":1,\"accountAmount\":\"6491901100476745\",\"accountReleaseSchedule\":{\"total\":\"0\",\"schedule\":[]},\"accountCredentials\":{\"0\":{\"v\":0,\"value\":{\"contents\":{\"arData\":{\"1\":{\"encIdCredPubShare\":\"983494cc4c2ab98fe7ebc46d50dccf1931c3cd2e6b6d7b7893c9cf6a219d6d3bfa34081b2c98b28437858aa0f1acfeb28f4b760539681de1f0c361c3cd2015cf41c789c4878605344635059d4aee7a18cde57b3e2fb8fa9d0651d81ab8c3b483\"},\"2\":{\"encIdCredPubShare\":\"8897b4ff71b734933c33f7335cb4621ae04e64d49f1e9e93d55ce927d784062f923fd05d20cabeff1b2c7545d3ea5a3982ee0e10fac4577e261184a03ff3ce81584793cccfa9aa7e44eaf03629c9620b65e467cbf7f1cd819c20f7e737910197\"},\"3\":{\"encIdCredPubShare\":\"93b4800087a0436170816dc44524db13c725237e075ea81dafe246eb8c000a7db7d54e92dc1b36f6f99f459b70c45807b368b4fbe5e3c6e605dcb86831bfc17d7d29854d7566e9aa26a519babab8e57d0de55ded296cce4422d9849d236b260d\"}},\"commitments\":{\"cmmAttributes\":{},\"cmmCredCounter\":\"8591edaeea0ff975d5c29df754d7f036899f80bffcb039a643e5f6fc74030ac67eaf364d5c7ac17ffd7315959b4026e3\",\"cmmIdCredSecSharingCoeff\":[\"95818b92e5b7b840bac34bfd14258c53a5dfb0ce0e9c97940853bcebae4128b9d7e00aa7d1d100e0fdae344da5d5b20b\",\"936018384d4354dd90b5f993e939a1088f968e51e71de3861146b35302e66134bb2c9cf1733869eca923aa1f0d5ca212\"],\"cmmMaxAccounts\":\"8da7f0dd3e4b02b7d03d1d577334f4e1126607f9ad096b4c8f95caafe442a1067f3c5ed556f76063e0efb00c6f6ef638\",\"cmmPrf\":\"b0ad110899b52c001e27c6907f6d1af740b481d78889597141319e9abf8c6b4d699acfa54ac0d30f2e355b965916cad4\"},\"credId\":\"995cd68b3fd17b43a9fb4e05da09d9922932667a2e42580075d9f9aca006b69e186c4370096eaf8fd3e5bb49f59b263d\",\"credentialPublicKeys\":{\"keys\":{\"0\":{\"schemeId\":\"Ed25519\",\"verifyKey\":\"d8755ef010d0e556b18e9b0ca5b1b2e244be63b505dde117f8b94592f7d66f4a\"}},\"threshold\":1},\"ipIdentity\":0,\"policy\":{\"createdAt\":\"202307\",\"revealedAttributes\":{},\"validTo\":\"202807\"},\"revocationThreshold\":1},\"type\":\"normal\"}}},\"accountThreshold\":1,\"accountEncryptedAmount\":{\"incomingAmounts\":[],\"selfAmount\":\"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\"startIndex\":0},\"accountEncryptionKey\":\"b14cbfe44a02c6b1f78711176d5f437295367aa4f2a8c2551ee10d25a03adc69d61a332a058971919dad7312e1fc94c5995cd68b3fd17b43a9fb4e05da09d9922932667a2e42580075d9f9aca006b69e186c4370096eaf8fd3e5bb49f59b263d\",\"accountIndex\":1,\"accountAddress\":\"4HeFCY84KJpZz6AUAFkKfk4ktV6sghX9UVh5MVqfb8TFSGr3MU\",\"accountBaker\":{\"bakerAggregationVerifyKey\":\"90097744501a5d4fcdaee001c435b221e85c8afaf22124f0399b9556e864dd7746914d24f05bc64ca0f998bdde0d5cc809a6bb57c75cd3fb1b4847792e79062c62f07fb62b8bca94a883527968e4231d05cf7606f910850d89c6d49452f143eb\",\"bakerElectionVerifyKey\":\"66672c1d0dcdd1e6186c18b9516823a7abb62c8b80ae0b2811db4d6087d2cc65\",\"bakerId\":1,\"bakerPoolInfo\":{\"commissionRates\":{\"bakingCommission\":1.0,\"finalizationCommission\":0.1,\"transactionCommission\":1.0},\"metadataUrl\":\"\",\"openStatus\":\"openForAll\"},\"bakerSignatureVerifyKey\":\"7d46410f28a48d7596460f6759e2b49c2a7a54ec81df326d00416b33328e4e10\",\"restakeEarnings\":false,\"stakedAmount\":\"1000000000000000\"}}\n"; + private static final String INITIALI_ACCOUNT = "{\"accountNonce\":3,\"accountAmount\":\"19999317365\",\"accountReleaseSchedule\":{\"total\":\"0\",\"schedule\":[]},\"accountCredentials\":{\"0\":{\"v\":0,\"value\":{\"contents\":{\"credentialPublicKeys\":{\"keys\":{\"0\":{\"schemeId\":\"Ed25519\",\"verifyKey\":\"fea507e53a6cf34bc952dc6db1a9a35a53e746daa62ef8b8fbfe8dd825f5559e\"}},\"threshold\":1},\"ipIdentity\":0,\"policy\":{\"createdAt\":\"202307\",\"revealedAttributes\":{},\"validTo\":\"202407\"},\"regId\":\"8021f898d984228ee6868a377b49b3e67ddde0639eed4e59d49cec081c3afc49ef2fc757332a65535453dd0f12d9a333\"},\"type\":\"initial\"}}},\"accountThreshold\":1,\"accountEncryptedAmount\":{\"incomingAmounts\":[],\"selfAmount\":\"c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\"startIndex\":0},\"accountEncryptionKey\":\"b14cbfe44a02c6b1f78711176d5f437295367aa4f2a8c2551ee10d25a03adc69d61a332a058971919dad7312e1fc94c58021f898d984228ee6868a377b49b3e67ddde0639eed4e59d49cec081c3afc49ef2fc757332a65535453dd0f12d9a333\",\"accountIndex\":156,\"accountAddress\":\"3hk5D6yZaAebRmX6RYy46Lbd9BzQLXwoHLass4cXQoAdUGSSmz\"}\n"; + + @Test + public void testDeserializeAccountInfo() { + AccountInfo accountInfo = AccountInfo.fromJson(NORMAL_ACCOUNT); + assertEquals(AccountAddress.from("4HeFCY84KJpZz6AUAFkKfk4ktV6sghX9UVh5MVqfb8TFSGr3MU"), accountInfo.getAccountAddress()); + assertEquals(Nonce.from(1), accountInfo.getAccountNonce()); + assertEquals(CredentialType.NORMAL, accountInfo.getAccountCredentials().values().iterator().next().getType()); + + AccountInfo accountInfo2 = AccountInfo.fromJson(INITIALI_ACCOUNT); + assertEquals(AccountAddress.from("3hk5D6yZaAebRmX6RYy46Lbd9BzQLXwoHLass4cXQoAdUGSSmz"), accountInfo2.getAccountAddress()); + assertEquals(Nonce.from(3), accountInfo2.getAccountNonce()); + assertEquals(CredentialType.INITIAL, accountInfo2.getAccountCredentials().values().iterator().next().getType()); + } + +} diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/transactions/ConfigureBakerTransactionTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/transactions/ConfigureBakerTransactionTest.java index c21999db9..b68722eef 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/transactions/ConfigureBakerTransactionTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/transactions/ConfigureBakerTransactionTest.java @@ -1,11 +1,15 @@ package com.concordium.sdk.transactions; +import com.concordium.sdk.crypto.bakertransactions.BakerKeys; +import com.concordium.sdk.responses.BakerId; import com.concordium.sdk.types.AccountAddress; import com.concordium.sdk.types.UInt32; import lombok.SneakyThrows; import lombok.val; import org.junit.Test; +import java.io.StringWriter; + import static org.junit.Assert.assertEquals; public class ConfigureBakerTransactionTest { @@ -15,11 +19,12 @@ public class ConfigureBakerTransactionTest { public void shouldAddBakerKeysTest() { val accountAddress = AccountAddress.from("48x2Uo8xCMMxwGuSQnwbqjzKtVqK5MaUud4vG7QEUgDmYkV85e"); + BakerKeys bakerKeys = BakerKeys.createBakerKeys(); val payload = ConfigureBakerPayload.builder() .capital(CCDAmount.fromMicro("14000000000")) .restakeEarnings(true) .openForDelegation(0) - .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress)) + .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress, bakerKeys)) .metadataUrl("abc@xyz.com") .transactionFeeCommission(UInt32.from(10000)) .bakingRewardCommission(UInt32.from(10000)) @@ -68,7 +73,7 @@ public void shouldAddBakerKeysWithoutMetadataUrlTest() { .capital(CCDAmount.fromMicro("14000000000")) .restakeEarnings(true) .openForDelegation(0) - .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress)) + .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress, BakerKeys.createBakerKeys())) .transactionFeeCommission(UInt32.from(10000)) .bakingRewardCommission(UInt32.from(10000)) .finalizationRewardCommission(UInt32.from(100000)) @@ -92,7 +97,7 @@ public void shouldConfigureBakerKeysWithOnlyKeysTest() { val accountAddress = AccountAddress.from("48x2Uo8xCMMxwGuSQnwbqjzKtVqK5MaUud4vG7QEUgDmYkV85e"); val payload = ConfigureBakerPayload.builder() - .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress)) + .keysWithProofs(ConfigureBakerKeysPayload.getNewConfigureBakerKeysPayload(accountAddress, BakerKeys.createBakerKeys())) .build(); @@ -106,4 +111,11 @@ public void shouldConfigureBakerKeysWithOnlyKeysTest() { assertEquals(554, transaction.getVersionedBytes().length); } + + @SneakyThrows + @Test + public void testCreateBakerCredentials() { + StringWriter stringWriter = new StringWriter(); + BakerKeys.createBakerKeys().createBakerCredentials(stringWriter, BakerId.from(0)); + } } diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/transactions/TransactionFactoryTest.java b/concordium-sdk/src/test/java/com/concordium/sdk/transactions/TransactionFactoryTest.java index 6e9e2fe85..054bfdd90 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/transactions/TransactionFactoryTest.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/transactions/TransactionFactoryTest.java @@ -1,5 +1,6 @@ package com.concordium.sdk.transactions; +import com.concordium.sdk.crypto.bakertransactions.BakerKeys; import com.concordium.sdk.types.AccountAddress; import lombok.val; import org.junit.Test; @@ -97,7 +98,8 @@ public void testCanUpdateBakerRestakeEarningsFactory() { @Test public void testCanUpdateBakerKeysFactory() { AccountAddress sender = AccountAddress.from("3JwD2Wm3nMbsowCwb1iGEpnt47UQgdrtnq2qT6opJc3z2AgCrc"); - val builder = TransactionFactory.newUpdateBakerKeys(sender); + BakerKeys bakerKeys = BakerKeys.createBakerKeys(); + val builder = TransactionFactory.newUpdateBakerKeys(sender, bakerKeys); assertNotNull(builder); } diff --git a/concordium-sdk/src/test/java/com/concordium/sdk/types/UInt64Test.java b/concordium-sdk/src/test/java/com/concordium/sdk/types/UInt64Test.java index 22750791c..fdc4a3462 100644 --- a/concordium-sdk/src/test/java/com/concordium/sdk/types/UInt64Test.java +++ b/concordium-sdk/src/test/java/com/concordium/sdk/types/UInt64Test.java @@ -10,21 +10,10 @@ public class UInt64Test { @Test public void testCreation() { - checkNegativeNumber(); UInt64.from("18446744073709551615"); //(2^64)-1 checkTooLargeNumber(); } - private void checkNegativeNumber() { - try { - UInt64.from(-13); - fail("Should not be able to create a negative UInt64"); - } catch (RuntimeException e) { - if (!e.getMessage().equals("Value of UInt64 can not be negative")) { - fail("Unexpected error when creating UInt64: " + e.getMessage()); - } - } - } private void checkTooLargeNumber() { try {