From 57f2444feffe76798b5317d0464bce6a2b8e1cbb Mon Sep 17 00:00:00 2001 From: overcat <4catcode@gmail.com> Date: Thu, 20 Jul 2023 11:55:13 +0800 Subject: [PATCH 1/4] Add support for BumpFootprintExpirationOperation and RestoreFootprintOperation. --- .../sdk/BumpFootprintExpirationOperation.java | 57 ++++++++++ src/main/java/org/stellar/sdk/Operation.java | 6 ++ .../sdk/RestoreFootprintOperation.java | 46 ++++++++ .../sdk/responses/OperationDeserializer.java | 4 + ...pFootprintExpirationOperationResponse.java | 24 +++++ .../RestoreFootprintOperationResponse.java | 11 ++ .../BumpFootprintExpirationOperationTest.java | 91 ++++++++++++++++ .../sdk/RestoreFootprintOperationTest.java | 56 ++++++++++ .../responses/OperationDeserializerTest.java | 100 ++++++++++++++++++ 9 files changed, 395 insertions(+) create mode 100644 src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java create mode 100644 src/main/java/org/stellar/sdk/RestoreFootprintOperation.java create mode 100644 src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java create mode 100644 src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java create mode 100644 src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java create mode 100644 src/test/java/org/stellar/sdk/RestoreFootprintOperationTest.java diff --git a/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java b/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java new file mode 100644 index 000000000..510b61fc6 --- /dev/null +++ b/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java @@ -0,0 +1,57 @@ +package org.stellar.sdk; + +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.SuperBuilder; +import org.stellar.sdk.xdr.BumpFootprintExpirationOp; +import org.stellar.sdk.xdr.ExtensionPoint; +import org.stellar.sdk.xdr.OperationType; +import org.stellar.sdk.xdr.Uint32; + +/** + * Represents BumpFootprintExpiration operation. + * + *

Bump the expiration of a footprint (read and written ledger keys). + * + * @see List of Operations + */ +@EqualsAndHashCode(callSuper = true) +@SuperBuilder(toBuilder = true) +@Value +public class BumpFootprintExpirationOperation extends Operation { + + /** + * the number of ledgers past the LCL (last closed ledger) by which to extend the validity of the + * ledger keys in this transaction + */ + @NonNull Integer ledgersToExpire; + + /** + * Constructs a new BumpFootprintExpirationOperation object from the XDR representation of the + * {@link BumpFootprintExpirationOperation}. + * + * @param op the XDR representation of the {@link BumpFootprintExpirationOperation}. + */ + public static BumpFootprintExpirationOperation fromXdr(BumpFootprintExpirationOp op) { + return BumpFootprintExpirationOperation.builder() + .ledgersToExpire(op.getLedgersToExpire().getUint32()) + .build(); + } + + @Override + org.stellar.sdk.xdr.Operation.OperationBody toOperationBody(AccountConverter accountConverter) { + BumpFootprintExpirationOp op = new BumpFootprintExpirationOp(); + op.setExt(new ExtensionPoint.Builder().discriminant(0).build()); + op.setLedgersToExpire(new Uint32(ledgersToExpire)); + + org.stellar.sdk.xdr.Operation.OperationBody body = + new org.stellar.sdk.xdr.Operation.OperationBody(); + body.setDiscriminant(OperationType.BUMP_FOOTPRINT_EXPIRATION); + body.setBumpFootprintExpirationOp(op); + return body; + } +} diff --git a/src/main/java/org/stellar/sdk/Operation.java b/src/main/java/org/stellar/sdk/Operation.java index b8b3a0a21..54d479295 100644 --- a/src/main/java/org/stellar/sdk/Operation.java +++ b/src/main/java/org/stellar/sdk/Operation.java @@ -209,6 +209,12 @@ public static Operation fromXdr( case INVOKE_HOST_FUNCTION: operation = InvokeHostFunctionOperation.fromXdr(body.getInvokeHostFunctionOp()); break; + case BUMP_FOOTPRINT_EXPIRATION: + operation = BumpFootprintExpirationOperation.fromXdr(body.getBumpFootprintExpirationOp()); + break; + case RESTORE_FOOTPRINT: + operation = RestoreFootprintOperation.fromXdr(body.getRestoreFootprintOp()); + break; default: throw new RuntimeException("Unknown operation body " + body.getDiscriminant()); } diff --git a/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java b/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java new file mode 100644 index 000000000..1fd88e564 --- /dev/null +++ b/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java @@ -0,0 +1,46 @@ +package org.stellar.sdk; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.experimental.SuperBuilder; +import org.stellar.sdk.xdr.ExtensionPoint; +import org.stellar.sdk.xdr.OperationType; +import org.stellar.sdk.xdr.RestoreFootprintOp; + +/** + * Represents RestoreFootprint operation. + * + * @see List of Operations + */ +@EqualsAndHashCode(callSuper = true) +@SuperBuilder(toBuilder = true) +@Value +public class RestoreFootprintOperation extends Operation { + + private RestoreFootprintOperation() {} + + /** + * Constructs a new RestoreFootprintOperation object from the XDR representation of the {@link + * RestoreFootprintOperation}. + * + * @param op the XDR representation of the {@link RestoreFootprintOperation}. + */ + public static RestoreFootprintOperation fromXdr(RestoreFootprintOp op) { + return new RestoreFootprintOperation(); + } + + @Override + org.stellar.sdk.xdr.Operation.OperationBody toOperationBody(AccountConverter accountConverter) { + RestoreFootprintOp op = new RestoreFootprintOp(); + op.setExt(new ExtensionPoint.Builder().discriminant(0).build()); + + org.stellar.sdk.xdr.Operation.OperationBody body = + new org.stellar.sdk.xdr.Operation.OperationBody(); + body.setDiscriminant(OperationType.RESTORE_FOOTPRINT); + body.setRestoreFootprintOp(op); + return body; + } +} diff --git a/src/main/java/org/stellar/sdk/responses/OperationDeserializer.java b/src/main/java/org/stellar/sdk/responses/OperationDeserializer.java index 961cc1474..550cad8ab 100644 --- a/src/main/java/org/stellar/sdk/responses/OperationDeserializer.java +++ b/src/main/java/org/stellar/sdk/responses/OperationDeserializer.java @@ -89,6 +89,10 @@ public OperationResponse deserialize( return gson.fromJson(json, LiquidityPoolWithdrawOperationResponse.class); case INVOKE_HOST_FUNCTION: return gson.fromJson(json, InvokeHostFunctionOperationResponse.class); + case BUMP_FOOTPRINT_EXPIRATION: + return gson.fromJson(json, BumpFootprintExpirationOperationResponse.class); + case RESTORE_FOOTPRINT: + return gson.fromJson(json, RestoreFootprintOperationResponse.class); default: throw new RuntimeException("Invalid operation type"); } diff --git a/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java b/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java new file mode 100644 index 000000000..ec0ce8f9e --- /dev/null +++ b/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java @@ -0,0 +1,24 @@ +package org.stellar.sdk.responses.operations; + +import com.google.gson.annotations.SerializedName; + +/** + * Represents BumpFootprintExpiration operation response. + * + * @see Operation documentation + * @see org.stellar.sdk.requests.OperationsRequestBuilder + * @see org.stellar.sdk.Server#operations() + */ +public class BumpFootprintExpirationOperationResponse extends OperationResponse { + @SerializedName("ledgers_to_expire") + private final Long ledgers_to_expire; + + public BumpFootprintExpirationOperationResponse(Long ledgersToExpire) { + ledgers_to_expire = ledgersToExpire; + } + + public Long getLedgers_to_expire() { + return ledgers_to_expire; + } +} diff --git a/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java b/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java new file mode 100644 index 000000000..cb5ca73b7 --- /dev/null +++ b/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java @@ -0,0 +1,11 @@ +package org.stellar.sdk.responses.operations; + +/** + * Represents RestoreFootprint operation response. + * + * @see Operation documentation + * @see org.stellar.sdk.requests.OperationsRequestBuilder + * @see org.stellar.sdk.Server#operations() + */ +public class RestoreFootprintOperationResponse extends OperationResponse {} diff --git a/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java b/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java new file mode 100644 index 000000000..7a8309e95 --- /dev/null +++ b/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java @@ -0,0 +1,91 @@ +package org.stellar.sdk; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNull; + +import org.junit.Assert; +import org.junit.Test; + +public class BumpFootprintExpirationOperationTest { + @Test + public void testBuilderWithSource() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + BumpFootprintExpirationOperation op = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(123) + .sourceAccount(source) + .build(); + assertEquals(Integer.valueOf(123), op.getLedgersToExpire()); + assertEquals(source, op.getSourceAccount()); + String expectXdr = "AAAAAQAAAAAk4TTtavBWsGnEN3KxHw4Ohwi22ZJHWi8hlamN5pm0TgAAABkAAAAAAAAAew=="; + assertEquals(expectXdr, op.toXdrBase64()); + } + + @Test + public void testBuilderWithoutSource() { + BumpFootprintExpirationOperation op = + BumpFootprintExpirationOperation.builder().ledgersToExpire(123).build(); + assertEquals(Integer.valueOf(123), op.getLedgersToExpire()); + assertNull(op.getSourceAccount()); + String expectXdr = "AAAAAAAAABkAAAAAAAAAew=="; + assertEquals(expectXdr, op.toXdrBase64()); + } + + @Test + public void testFromXdr() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + BumpFootprintExpirationOperation originOp = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(123) + .sourceAccount(source) + .build(); + org.stellar.sdk.xdr.Operation xdrObject = originOp.toXdr(); + Operation restartOp = Operation.fromXdr(xdrObject); + Assert.assertEquals(restartOp, originOp); + } + + @Test + public void testEquals() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + BumpFootprintExpirationOperation operation1 = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(123) + .sourceAccount(source) + .build(); + BumpFootprintExpirationOperation operation2 = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(123) + .sourceAccount(source) + .build(); + assertEquals(operation1, operation2); + } + + @Test + public void testNotEquals() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + BumpFootprintExpirationOperation operation1 = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(123) + .sourceAccount(source) + .build(); + BumpFootprintExpirationOperation operation2 = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(124) + .sourceAccount(source) + .build(); + Assert.assertNotEquals(operation1, operation2); + } + + @Test + public void testNotEqualsSource() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + BumpFootprintExpirationOperation operation1 = + BumpFootprintExpirationOperation.builder() + .ledgersToExpire(123) + .sourceAccount(source) + .build(); + BumpFootprintExpirationOperation operation2 = + BumpFootprintExpirationOperation.builder().ledgersToExpire(123).build(); + Assert.assertNotEquals(operation1, operation2); + } +} diff --git a/src/test/java/org/stellar/sdk/RestoreFootprintOperationTest.java b/src/test/java/org/stellar/sdk/RestoreFootprintOperationTest.java new file mode 100644 index 000000000..ac55cd8dd --- /dev/null +++ b/src/test/java/org/stellar/sdk/RestoreFootprintOperationTest.java @@ -0,0 +1,56 @@ +package org.stellar.sdk; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNull; + +import org.junit.Assert; +import org.junit.Test; + +public class RestoreFootprintOperationTest { + @Test + public void testBuilderWithSource() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + RestoreFootprintOperation op = + RestoreFootprintOperation.builder().sourceAccount(source).build(); + assertEquals(source, op.getSourceAccount()); + String expectXdr = "AAAAAQAAAAAk4TTtavBWsGnEN3KxHw4Ohwi22ZJHWi8hlamN5pm0TgAAABoAAAAA"; + assertEquals(expectXdr, op.toXdrBase64()); + } + + @Test + public void testBuilderWithoutSource() { + RestoreFootprintOperation op = RestoreFootprintOperation.builder().build(); + assertNull(op.getSourceAccount()); + String expectXdr = "AAAAAAAAABoAAAAA"; + assertEquals(expectXdr, op.toXdrBase64()); + } + + @Test + public void testFromXdr() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + RestoreFootprintOperation originOp = + RestoreFootprintOperation.builder().sourceAccount(source).build(); + org.stellar.sdk.xdr.Operation xdrObject = originOp.toXdr(); + Operation restartOp = Operation.fromXdr(xdrObject); + Assert.assertEquals(restartOp, originOp); + } + + @Test + public void testEquals() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + RestoreFootprintOperation operation1 = + RestoreFootprintOperation.builder().sourceAccount(source).build(); + RestoreFootprintOperation operation2 = + RestoreFootprintOperation.builder().sourceAccount(source).build(); + assertEquals(operation1, operation2); + } + + @Test + public void testNotEquals() { + String source = "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW"; + RestoreFootprintOperation operation1 = + RestoreFootprintOperation.builder().sourceAccount(source).build(); + RestoreFootprintOperation operation2 = RestoreFootprintOperation.builder().build(); + Assert.assertNotEquals(operation1, operation2); + } +} diff --git a/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java b/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java index 9bca0d33b..f3df20461 100644 --- a/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java +++ b/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java @@ -18,6 +18,7 @@ import org.stellar.sdk.Price; import org.stellar.sdk.responses.operations.AccountMergeOperationResponse; import org.stellar.sdk.responses.operations.AllowTrustOperationResponse; +import org.stellar.sdk.responses.operations.BumpFootprintExpirationOperationResponse; import org.stellar.sdk.responses.operations.BumpSequenceOperationResponse; import org.stellar.sdk.responses.operations.ChangeTrustOperationResponse; import org.stellar.sdk.responses.operations.ClaimClaimableBalanceOperationResponse; @@ -36,6 +37,7 @@ import org.stellar.sdk.responses.operations.PathPaymentStrictReceiveOperationResponse; import org.stellar.sdk.responses.operations.PathPaymentStrictSendOperationResponse; import org.stellar.sdk.responses.operations.PaymentOperationResponse; +import org.stellar.sdk.responses.operations.RestoreFootprintOperationResponse; import org.stellar.sdk.responses.operations.SetOptionsOperationResponse; import org.stellar.sdk.responses.operations.SetTrustLineFlagsOperationResponse; @@ -1956,4 +1958,102 @@ public void testDeserializeInvokeHostFunctionOperation() { "GBMLPRFCZDZJPKUPHUSHCKA737GOZL7ERZLGGMJ6YGHBFJZ6ZKMKCZTM"); assertEquals(operation.getAssetBalanceChanges().get(0).getAmount(), "500.0000000"); } + + @Test + public void testDeserializeBumpFootprintExpirationOperation() { + String json = + "{\n" + + " \"_links\": {\n" + + " \"self\": {\n" + + " \"href\": \"http://127.0.0.1:8000/operations/2224793063426\"\n" + + " },\n" + + " \"transaction\": {\n" + + " \"href\": \"http://127.0.0.1:8000/transactions/c452cd9d1ff9692499d0d2aa2f8e898b8c38025300c0f293f4a2adde7295c82f\"\n" + + " },\n" + + " \"effects\": {\n" + + " \"href\": \"http://127.0.0.1:8000/operations/2224793063426/effects\"\n" + + " },\n" + + " \"succeeds\": {\n" + + " \"href\": \"http://127.0.0.1:8000/effects?order=desc&cursor=2224793063426\"\n" + + " },\n" + + " \"precedes\": {\n" + + " \"href\": \"http://127.0.0.1:8000/effects?order=asc&cursor=2224793063426\"\n" + + " }\n" + + " },\n" + + " \"id\": \"2224793063426\",\n" + + " \"paging_token\": \"2224793063426\",\n" + + " \"transaction_successful\": true,\n" + + " \"source_account\": \"GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54\",\n" + + " \"type\": \"bump_footprint_expiration\",\n" + + " \"type_i\": 25,\n" + + " \"created_at\": \"2023-07-20T10:44:56Z\",\n" + + " \"transaction_hash\": \"c452cd9d1ff9692499d0d2aa2f8e898b8c38025300c0f293f4a2adde7295c82f\",\n" + + " \"ledgers_to_expire\": \"2343241\"\n" + + "}"; + + BumpFootprintExpirationOperationResponse operation = + (BumpFootprintExpirationOperationResponse) + GsonSingleton.getInstance().fromJson(json, OperationResponse.class); + assertEquals( + operation.getLinks().getSelf().getHref(), "http://127.0.0.1:8000/operations/2224793063426"); + assertEquals(operation.getId().longValue(), 2224793063426L); + assertEquals(operation.getPagingToken(), "2224793063426"); + // assertEquals(operation.getTransactionSuccessful(), true); + assertEquals( + operation.getSourceAccount(), "GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54"); + assertEquals(operation.getType(), "bump_footprint_expiration"); + assertEquals(operation.getCreatedAt(), "2023-07-20T10:44:56Z"); + assertEquals( + operation.getTransactionHash(), + "c452cd9d1ff9692499d0d2aa2f8e898b8c38025300c0f293f4a2adde7295c82f"); + assertEquals(operation.getLedgers_to_expire().longValue(), 2343241); + } + + @Test + public void testDeserializeRestoreFootprintOperationResponse() { + String json = + "{\n" + + " \"_links\": {\n" + + " \"self\": {\n" + + " \"href\": \"http://127.0.0.1:8000/operations/2224793063427\"\n" + + " },\n" + + " \"transaction\": {\n" + + " \"href\": \"http://127.0.0.1:8000/transactions/b6932dacb25e05ca8e3d006d2a5a119683602f70474cc9f5de9fc53e99f627f8\"\n" + + " },\n" + + " \"effects\": {\n" + + " \"href\": \"http://127.0.0.1:8000/operations/2224793063427/effects\"\n" + + " },\n" + + " \"succeeds\": {\n" + + " \"href\": \"http://127.0.0.1:8000/effects?order=desc&cursor=2224793063427\"\n" + + " },\n" + + " \"precedes\": {\n" + + " \"href\": \"http://127.0.0.1:8000/effects?order=asc&cursor=2224793063427\"\n" + + " }\n" + + " },\n" + + " \"id\": \"2224793063427\",\n" + + " \"paging_token\": \"2224793063427\",\n" + + " \"transaction_successful\": true,\n" + + " \"source_account\": \"GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54\",\n" + + " \"type\": \"restore_footprint\",\n" + + " \"type_i\": 26,\n" + + " \"created_at\": \"2023-07-20T10:44:56Z\",\n" + + " \"transaction_hash\": \"b6932dacb25e05ca8e3d006d2a5a119683602f70474cc9f5de9fc53e99f627f8\"\n" + + "}"; + + RestoreFootprintOperationResponse operation = + (RestoreFootprintOperationResponse) + GsonSingleton.getInstance().fromJson(json, OperationResponse.class); + assertEquals( + operation.getLinks().getSelf().getHref(), "http://127.0.0.1:8000/operations/2224793063427"); + assertEquals(operation.getId().longValue(), 2224793063427L); + assertEquals(operation.getPagingToken(), "2224793063427"); + // assertEquals(operation.getTransactionSuccessful(), true); + assertEquals( + operation.getSourceAccount(), "GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54"); + assertEquals(operation.getType(), "restore_footprint"); + assertEquals(operation.getCreatedAt(), "2023-07-20T10:44:56Z"); + assertEquals( + operation.getTransactionHash(), + "b6932dacb25e05ca8e3d006d2a5a119683602f70474cc9f5de9fc53e99f627f8"); + } } From 230069dfeb0fe2a4e5a12b4fff8f86d1759139eb Mon Sep 17 00:00:00 2001 From: overcat <4catcode@gmail.com> Date: Wed, 26 Jul 2023 14:16:43 +0800 Subject: [PATCH 2/4] Add validation for BumpFootprintExpirationOperation.ledgersToExpire. --- .../sdk/BumpFootprintExpirationOperation.java | 14 +++++++++++++ .../sdk/RestoreFootprintOperation.java | 6 +++--- .../BumpFootprintExpirationOperationTest.java | 20 +++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java b/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java index 510b61fc6..f9c7989c7 100644 --- a/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java +++ b/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java @@ -54,4 +54,18 @@ org.stellar.sdk.xdr.Operation.OperationBody toOperationBody(AccountConverter acc body.setBumpFootprintExpirationOp(op); return body; } + + /** Customizing builder methods. Rest of the builder code will be auto generated by Lombok. */ + public abstract static class BumpFootprintExpirationOperationBuilder< + C extends BumpFootprintExpirationOperation, + B extends BumpFootprintExpirationOperationBuilder> + extends OperationBuilder { + public B ledgersToExpire(Integer ledgersToExpire) { + if (ledgersToExpire <= 0) { + throw new IllegalArgumentException("ledgersToExpire isn't a ledger quantity (uint32)"); + } + this.ledgersToExpire = ledgersToExpire; + return self(); + } + } } diff --git a/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java b/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java index 1fd88e564..46f66f9a7 100644 --- a/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java +++ b/src/main/java/org/stellar/sdk/RestoreFootprintOperation.java @@ -1,6 +1,8 @@ package org.stellar.sdk; +import lombok.AccessLevel; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import lombok.Value; import lombok.experimental.SuperBuilder; import org.stellar.sdk.xdr.ExtensionPoint; @@ -18,10 +20,8 @@ @EqualsAndHashCode(callSuper = true) @SuperBuilder(toBuilder = true) @Value +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class RestoreFootprintOperation extends Operation { - - private RestoreFootprintOperation() {} - /** * Constructs a new RestoreFootprintOperation object from the XDR representation of the {@link * RestoreFootprintOperation}. diff --git a/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java b/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java index 7a8309e95..21411c5df 100644 --- a/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java +++ b/src/test/java/org/stellar/sdk/BumpFootprintExpirationOperationTest.java @@ -88,4 +88,24 @@ public void testNotEqualsSource() { BumpFootprintExpirationOperation.builder().ledgersToExpire(123).build(); Assert.assertNotEquals(operation1, operation2); } + + @Test + public void testLedgersToExpireIsInvalidThrows() { + try { + BumpFootprintExpirationOperation.builder().ledgersToExpire(-1).build(); + Assert.fail(); + } catch (IllegalArgumentException e) { + Assert.assertEquals("ledgersToExpire isn't a ledger quantity (uint32)", e.getMessage()); + } + } + + @Test + public void testLedgersToExpireIsNullThrows() { + try { + BumpFootprintExpirationOperation.builder().build(); + Assert.fail(); + } catch (NullPointerException e) { + Assert.assertEquals("ledgersToExpire is marked non-null but is null", e.getMessage()); + } + } } From 3eb0d1a63707653df7ee111b3682f729127c6197 Mon Sep 17 00:00:00 2001 From: overcat <4catcode@gmail.com> Date: Thu, 27 Jul 2023 10:57:56 +0800 Subject: [PATCH 3/4] Update docs link --- .../java/org/stellar/sdk/BumpFootprintExpirationOperation.java | 2 +- src/main/java/org/stellar/sdk/InvokeHostFunctionOperation.java | 2 +- src/main/java/org/stellar/sdk/RestoreFootprintOperation.java | 2 +- .../operations/BumpFootprintExpirationOperationResponse.java | 3 +++ .../operations/InvokeHostFunctionOperationResponse.java | 3 +++ .../operations/RestoreFootprintOperationResponse.java | 3 +++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java b/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java index f9c7989c7..4949a5ea5 100644 --- a/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java +++ b/src/main/java/org/stellar/sdk/BumpFootprintExpirationOperation.java @@ -11,7 +11,7 @@ /** * Represents BumpFootprintExpiration operation. * *

Bump the expiration of a footprint (read and written ledger keys). diff --git a/src/main/java/org/stellar/sdk/InvokeHostFunctionOperation.java b/src/main/java/org/stellar/sdk/InvokeHostFunctionOperation.java index e0ed9cccd..914c547e1 100644 --- a/src/main/java/org/stellar/sdk/InvokeHostFunctionOperation.java +++ b/src/main/java/org/stellar/sdk/InvokeHostFunctionOperation.java @@ -14,7 +14,7 @@ /** * Represents InvokeHostFunction operation. * * @see RestoreFootprint operation. * * @see Horizon + * Protocol * @see Operation documentation * @see org.stellar.sdk.requests.OperationsRequestBuilder diff --git a/src/main/java/org/stellar/sdk/responses/operations/InvokeHostFunctionOperationResponse.java b/src/main/java/org/stellar/sdk/responses/operations/InvokeHostFunctionOperationResponse.java index 47a677921..45764b231 100644 --- a/src/main/java/org/stellar/sdk/responses/operations/InvokeHostFunctionOperationResponse.java +++ b/src/main/java/org/stellar/sdk/responses/operations/InvokeHostFunctionOperationResponse.java @@ -7,6 +7,9 @@ /** * Represents InvokeHostFunction operation response. * + * @see Horizon + * Protocol * @see Operation documentation * @see org.stellar.sdk.requests.OperationsRequestBuilder diff --git a/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java b/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java index cb5ca73b7..f6795f56c 100644 --- a/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java +++ b/src/main/java/org/stellar/sdk/responses/operations/RestoreFootprintOperationResponse.java @@ -3,6 +3,9 @@ /** * Represents RestoreFootprint operation response. * + * @see Horizon + * Protocol * @see Operation documentation * @see org.stellar.sdk.requests.OperationsRequestBuilder From 758746597f480d1df08d55ec0b279dfc61867a89 Mon Sep 17 00:00:00 2001 From: overcat <4catcode@gmail.com> Date: Thu, 27 Jul 2023 11:04:02 +0800 Subject: [PATCH 4/4] fix typo --- .../BumpFootprintExpirationOperationResponse.java | 8 ++++---- .../stellar/sdk/responses/OperationDeserializerTest.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java b/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java index 635a8a77d..1e23f0ac4 100644 --- a/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java +++ b/src/main/java/org/stellar/sdk/responses/operations/BumpFootprintExpirationOperationResponse.java @@ -15,13 +15,13 @@ */ public class BumpFootprintExpirationOperationResponse extends OperationResponse { @SerializedName("ledgers_to_expire") - private final Long ledgers_to_expire; + private final Long ledgersToExpire; public BumpFootprintExpirationOperationResponse(Long ledgersToExpire) { - ledgers_to_expire = ledgersToExpire; + this.ledgersToExpire = ledgersToExpire; } - public Long getLedgers_to_expire() { - return ledgers_to_expire; + public Long getLedgersToExpire() { + return ledgersToExpire; } } diff --git a/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java b/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java index f3df20461..955b13eff 100644 --- a/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java +++ b/src/test/java/org/stellar/sdk/responses/OperationDeserializerTest.java @@ -2006,7 +2006,7 @@ public void testDeserializeBumpFootprintExpirationOperation() { assertEquals( operation.getTransactionHash(), "c452cd9d1ff9692499d0d2aa2f8e898b8c38025300c0f293f4a2adde7295c82f"); - assertEquals(operation.getLedgers_to_expire().longValue(), 2343241); + assertEquals(operation.getLedgersToExpire().longValue(), 2343241); } @Test