From 7e76a8576607704fc93d1b31c3830224eda4e89d Mon Sep 17 00:00:00 2001 From: Jun Luo <4catcode@gmail.com> Date: Tue, 6 Aug 2024 14:33:33 +0800 Subject: [PATCH 1/3] refactor: refactor the parts in Preconditions that are inconsistent with the specifications. --- CHANGELOG.md | 2 ++ .../stellar/sdk/TransactionPreconditions.java | 17 +++++----- .../stellar/sdk/FeeBumpTransactionTest.java | 2 +- .../sdk/TransactionPreconditionsTest.java | 32 +++++++++++++++++++ .../java/org/stellar/sdk/TransactionTest.java | 28 ++++++++-------- 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd262dc2c..003478490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,8 @@ As this project is pre 1.0, breaking changes may happen for minor version bumps. - feat: optimize `RequestTimeoutException`, when a timeout occurs, if the server returns some information, you can read them. - refactor!: mark `Asset#create(String, String, String)` as deprecated, use `Asset.createNonNativeAsset(String, String)` or `Asset.createNativeAsset()` instead. - refactor!: remove `LiquidityPoolID`. Use `String` to represent the liquidity pool ID. +- refactor!: `TransactionPreconditions#TransactionPreconditions(LedgerBounds, Long, BigInteger, long, List, TimeBounds)` has been removed, use `TransactionPreconditions#TransactionPreconditions(TimeBounds, LedgerBounds, Long, BigInteger, long, List)` instead. +- refactor: Set the default value of `TransactionPreconditions.extraSigners` to `new ArrayList<>()`, it is not nullable. ## 0.44.0 ### Update diff --git a/src/main/java/org/stellar/sdk/TransactionPreconditions.java b/src/main/java/org/stellar/sdk/TransactionPreconditions.java index 10d56e949..c1bcfdac9 100644 --- a/src/main/java/org/stellar/sdk/TransactionPreconditions.java +++ b/src/main/java/org/stellar/sdk/TransactionPreconditions.java @@ -1,12 +1,13 @@ package org.stellar.sdk; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lombok.Builder; import lombok.NonNull; -import lombok.Singular; import lombok.Value; +import org.jetbrains.annotations.Nullable; import org.stellar.sdk.xdr.Duration; import org.stellar.sdk.xdr.Int64; import org.stellar.sdk.xdr.PreconditionType; @@ -29,21 +30,24 @@ public class TransactionPreconditions { public static final long MAX_EXTRA_SIGNERS_COUNT = 2; public static final BigInteger TIMEOUT_INFINITE = BigInteger.ZERO; + /** The time bounds for the transaction. */ + @Nullable TimeBounds timeBounds; + /** The ledger bounds for the transaction. */ - LedgerBounds ledgerBounds; + @Nullable LedgerBounds ledgerBounds; /** * The minimum source account sequence number this transaction is valid for. if null, * the transaction is valid when **source account's sequence number == tx.sequence - 1**. */ - Long minSeqNumber; // int64 + @Nullable Long minSeqNumber; // int64 /** * The minimum amount of time between source account sequence time and the ledger time when this * transaction will become valid. If the value is 0, the transaction is unrestricted * by the account sequence age. Cannot be negative. */ - @Builder.Default BigInteger minSeqAge = BigInteger.ZERO; // uint64 + @Builder.Default @NonNull BigInteger minSeqAge = BigInteger.ZERO; // uint64 /** * The minimum number of ledgers between source account sequence and the ledger number when this @@ -53,10 +57,7 @@ public class TransactionPreconditions { long minSeqLedgerGap; // uint32 /** Required extra signers. */ - @Singular @NonNull List extraSigners; - - /** The time bounds for the transaction. */ - TimeBounds timeBounds; + @Builder.Default @NonNull List extraSigners = new ArrayList<>(); /** * Validates the preconditions. diff --git a/src/test/java/org/stellar/sdk/FeeBumpTransactionTest.java b/src/test/java/org/stellar/sdk/FeeBumpTransactionTest.java index 807e5bc27..d10ff3bdd 100644 --- a/src/test/java/org/stellar/sdk/FeeBumpTransactionTest.java +++ b/src/test/java/org/stellar/sdk/FeeBumpTransactionTest.java @@ -330,7 +330,7 @@ public void testCreateWithBaseFeeWithSorobanOp() { account.getIncrementedSequenceNumber(), new org.stellar.sdk.operations.Operation[] {invokeHostFunctionOperation}, null, - new TransactionPreconditions(null, null, BigInteger.ZERO, 0, new ArrayList<>(), null), + new TransactionPreconditions(null, null, null, BigInteger.ZERO, 0, new ArrayList<>()), sorobanData, Network.TESTNET); diff --git a/src/test/java/org/stellar/sdk/TransactionPreconditionsTest.java b/src/test/java/org/stellar/sdk/TransactionPreconditionsTest.java index 71091fd9f..bddd11f74 100644 --- a/src/test/java/org/stellar/sdk/TransactionPreconditionsTest.java +++ b/src/test/java/org/stellar/sdk/TransactionPreconditionsTest.java @@ -1,6 +1,7 @@ package org.stellar.sdk; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -8,7 +9,9 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.math.BigInteger; import java.util.Arrays; +import java.util.LinkedList; import org.junit.Test; import org.stellar.sdk.xdr.Duration; import org.stellar.sdk.xdr.Int64; @@ -60,6 +63,7 @@ public void itConvertsFromXdr() throws IOException { assertEquals(transactionPreconditions.getLedgerBounds().getMaxLedger(), 2); assertEquals(transactionPreconditions.getMinSeqNumber(), Long.valueOf(4)); assertEquals(transactionPreconditions.getMinSeqLedgerGap(), 0); + assertEquals(transactionPreconditions.getExtraSigners().size(), 0); } @Test @@ -256,4 +260,32 @@ public void itChecksV2Status() { TransactionPreconditions transactionPreconditions = TransactionPreconditions.fromXdr(xdr); assertTrue(transactionPreconditions.hasV2()); } + + @Test + public void testSetTimeBoundsOnly() { + TimeBounds timeBounds = new TimeBounds(1, 2); + TransactionPreconditions preconditions = + TransactionPreconditions.builder().timeBounds(timeBounds).build(); + assertEquals(timeBounds, preconditions.getTimeBounds()); + assertEquals(0, preconditions.getExtraSigners().size()); + assertEquals(BigInteger.ZERO, preconditions.getMinSeqAge()); + assertNull(preconditions.getLedgerBounds()); + assertNull(preconditions.getMinSeqNumber()); + assertEquals(0, preconditions.getMinSeqLedgerGap()); + assertFalse(preconditions.hasV2()); + } + + @Test + public void testEquals() { + TimeBounds timeBounds = new TimeBounds(1, 2); + TransactionPreconditions preconditions0 = + TransactionPreconditions.builder().timeBounds(timeBounds).build(); + TransactionPreconditions preconditions1 = + TransactionPreconditions.fromXdr(preconditions0.toXdr()); + assertEquals(preconditions0, preconditions1); + TransactionPreconditions preconditions2 = + new TransactionPreconditions( + timeBounds, null, null, BigInteger.ZERO, 0, new LinkedList<>()); + assertEquals(preconditions0, preconditions2); + } } diff --git a/src/test/java/org/stellar/sdk/TransactionTest.java b/src/test/java/org/stellar/sdk/TransactionTest.java index 8aff4c7ff..23adfefd1 100644 --- a/src/test/java/org/stellar/sdk/TransactionTest.java +++ b/src/test/java/org/stellar/sdk/TransactionTest.java @@ -72,7 +72,7 @@ public void testParseV0Transaction() throws FormatException, IOException { }, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.PUBLIC); @@ -117,7 +117,7 @@ public void testAddingSignaturesDirectly() { }, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.PUBLIC); @@ -157,7 +157,7 @@ public void testSha256HashSigning() throws FormatException { }, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.PUBLIC); @@ -196,7 +196,7 @@ public void testToBase64EnvelopeXdrBuilderNoSignatures() throws FormatException, }, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); @@ -277,7 +277,7 @@ public void testConstructorWithSorobanData() throws IOException { new org.stellar.sdk.operations.Operation[] {invokeHostFunctionOperation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), sorobanData, Network.TESTNET); @@ -313,7 +313,7 @@ public void testIsSorobanTransactionInvokeHostFunctionOperation() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); assertTrue(transaction.isSorobanTransaction()); @@ -350,7 +350,7 @@ public void testIsSorobanTransactionExtendFootprintTTLOperation() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), sorobanData, Network.TESTNET); assertTrue(transaction.isSorobanTransaction()); @@ -386,7 +386,7 @@ public void testIsSorobanTransactionRestoreFootprintOperation() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), sorobanData, Network.TESTNET); assertTrue(transaction.isSorobanTransaction()); @@ -415,7 +415,7 @@ public void testIsSorobanTransactionMultiOperations() { new org.stellar.sdk.operations.Operation[] {operation, operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); assertFalse(transaction.isSorobanTransaction()); @@ -437,7 +437,7 @@ public void testIsSorobanTransactionBumpSequenceOperation() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); assertFalse(transaction.isSorobanTransaction()); @@ -459,7 +459,7 @@ public void testHashCodeAndEquals() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); @@ -472,7 +472,7 @@ public void testHashCodeAndEquals() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); assertEquals(transaction1.hashCode(), transaction2.hashCode()); @@ -487,7 +487,7 @@ public void testHashCodeAndEquals() { new org.stellar.sdk.operations.Operation[] {operation}, Memo.text("not equal tx"), new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.TESTNET); assertNotEquals(transaction1, transaction3); @@ -501,7 +501,7 @@ public void testHashCodeAndEquals() { new org.stellar.sdk.operations.Operation[] {operation}, null, new TransactionPreconditions( - null, null, BigInteger.ZERO, 0, new ArrayList(), null), + null, null, null, BigInteger.ZERO, 0, new ArrayList()), null, Network.PUBLIC); assertNotEquals(transaction1, transaction4); From 2e7c287eb341818860463cf7857b8143d6e7bf0a Mon Sep 17 00:00:00 2001 From: Jun Luo <4catcode@gmail.com> Date: Tue, 6 Aug 2024 14:41:18 +0800 Subject: [PATCH 2/3] refactor: refactor the parts in Preconditions that are inconsistent with the specifications. --- src/main/java/org/stellar/sdk/TransactionPreconditions.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/stellar/sdk/TransactionPreconditions.java b/src/main/java/org/stellar/sdk/TransactionPreconditions.java index c1bcfdac9..a6976d336 100644 --- a/src/main/java/org/stellar/sdk/TransactionPreconditions.java +++ b/src/main/java/org/stellar/sdk/TransactionPreconditions.java @@ -30,8 +30,9 @@ public class TransactionPreconditions { public static final long MAX_EXTRA_SIGNERS_COUNT = 2; public static final BigInteger TIMEOUT_INFINITE = BigInteger.ZERO; + // We strongly recommend setting it, but in fact, a transaction without timebounds will also be accepted by stellar-core. /** The time bounds for the transaction. */ - @Nullable TimeBounds timeBounds; + TimeBounds timeBounds; /** The ledger bounds for the transaction. */ @Nullable LedgerBounds ledgerBounds; From 46662b8293415c9fd328380b42821f335c626c47 Mon Sep 17 00:00:00 2001 From: Jun Luo <4catcode@gmail.com> Date: Tue, 6 Aug 2024 15:02:34 +0800 Subject: [PATCH 3/3] refactor: refactor the parts in Preconditions that are inconsistent with the specifications. --- src/main/java/org/stellar/sdk/TransactionPreconditions.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/stellar/sdk/TransactionPreconditions.java b/src/main/java/org/stellar/sdk/TransactionPreconditions.java index a6976d336..cb374566d 100644 --- a/src/main/java/org/stellar/sdk/TransactionPreconditions.java +++ b/src/main/java/org/stellar/sdk/TransactionPreconditions.java @@ -30,7 +30,8 @@ public class TransactionPreconditions { public static final long MAX_EXTRA_SIGNERS_COUNT = 2; public static final BigInteger TIMEOUT_INFINITE = BigInteger.ZERO; - // We strongly recommend setting it, but in fact, a transaction without timebounds will also be accepted by stellar-core. + // We strongly recommend setting it, but in fact, a transaction without timebounds will also be + // accepted by stellar-core. /** The time bounds for the transaction. */ TimeBounds timeBounds;