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;
+ }
+
+ /** 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 Allows you to directly inspect the current state of contracts, contract's code, or any other
+ * ledger entries.
+ *
+ * @see getLedgerEntries documentation
+ * @param keys The key of the contract data to load, at least one key must be provided.
+ * @return A {@link GetLedgerEntriesResponse} object containing the current values.
+ * @throws IOException If the request could not be executed due to cancellation, a connectivity
+ * problem or timeout. Because networks can fail during an exchange, it is possible that the
+ * remote server accepted the request before the failure.
+ * @throws SorobanRpcErrorResponse If the Soroban-RPC instance returns an error response.
+ */
+ public GetLedgerEntriesResponse getLedgerEntries(Collection When submitting a transaction, client should poll this to tell when the transaction has
+ * completed.
+ *
+ * @see getTransaction documentation
+ * @param hash The hash of the transaction to check. Encoded as a hex string.
+ * @return A {@link GetTransactionResponse} object containing the transaction status, result, and
+ * other details.
+ * @throws IOException If the request could not be executed due to cancellation, a connectivity
+ * problem or timeout. Because networks can fail during an exchange, it is possible that the
+ * remote server accepted the request before the failure.
+ * @throws SorobanRpcErrorResponse If the Soroban-RPC instance returns an error response.
+ */
+ public GetTransactionResponse getTransaction(String hash)
+ throws IOException, SorobanRpcErrorResponse {
+ GetTransactionRequest params = new GetTransactionRequest(hash);
+ return this.sendRequest(
+ "getTransaction", params, new TypeToken The returned transaction will also have an updated fee that is the sum of fee set on
+ * incoming transaction with the contract resource fees estimated from simulation. It is advisable
+ * to check the fee on returned transaction and validate or take appropriate measures for
+ * interaction with user to confirm it is acceptable.
+ *
+ * You can call the {@link SorobanServer#simulateTransaction} method directly first if you want
+ * to inspect estimated fees for a given transaction in detail first, if that is of importance.
+ *
+ * @param transaction The transaction to prepare. It should include exactly one operation, which
+ * must be one of {@link InvokeHostFunctionOperation}, {@link
+ * BumpFootprintExpirationOperation}, or {@link RestoreFootprintOperation}. Any provided
+ * footprint will be ignored. You can use {@link Transaction#isSorobanTransaction()} to check
+ * if a transaction is a Soroban transaction.
+ * @return Returns a copy of the {@link Transaction}, with the expected authorizations (in the
+ * case of invocation) and ledger footprint added. The transaction fee will also automatically
+ * be padded with the contract's minimum resource fees discovered from the simulation.
+ * @throws PrepareTransactionException If preparing the transaction fails.
+ * @throws IOException If the request could not be executed due to cancellation, a connectivity
+ * problem or timeout. Because networks can fail during an exchange, it is possible that the
+ * remote server accepted the request before the failure.
+ * @throws SorobanRpcErrorResponse If the Soroban-RPC instance returns an error response.
+ */
+ public Transaction prepareTransaction(Transaction transaction)
+ throws IOException, SorobanRpcErrorResponse, PrepareTransactionException {
+ SimulateTransactionResponse simulateTransactionResponse = this.simulateTransaction(transaction);
+ if (simulateTransactionResponse.getError() != null) {
+ throw new PrepareTransactionException(
+ "simulation transaction failed, the response contains error information.",
+ simulateTransactionResponse);
+ }
+ if (simulateTransactionResponse.getResults() == null
+ || simulateTransactionResponse.getResults().size() != 1) {
+ throw new PrepareTransactionException(
+ "simulation transaction failed, the \"results\" field contains multiple records, but it should only contain one.",
+ simulateTransactionResponse);
+ }
+ return assembleTransaction(transaction, simulateTransactionResponse);
+ }
+
+ /**
+ * Submit a real transaction to the Stellar network. This is the only way to make changes
+ * "on-chain". Unlike Horizon, Soroban-RPC does not wait for transaction completion. It simply
+ * validates the transaction and enqueues it. Clients should call {@link
+ * SorobanServer#getTransaction} to learn about transaction's status.
+ *
+ * @see sendTransaction documentation
+ * @param transaction The transaction to submit.
+ * @return A {@link SendTransactionResponse} object containing some details about the transaction
+ * that was submitted.
+ * @throws IOException If the request could not be executed due to cancellation, a connectivity
+ * problem or timeout. Because networks can fail during an exchange, it is possible that the
+ * remote server accepted the request before the failure.
+ * @throws SorobanRpcErrorResponse If the Soroban-RPC instance returns an error response.
+ */
+ public SendTransactionResponse sendTransaction(Transaction transaction)
+ throws IOException, SorobanRpcErrorResponse {
+ // TODO: In the future, it may be necessary to consider FeeBumpTransaction.
+ SendTransactionRequest params = new SendTransactionRequest(transaction.toEnvelopeXdrBase64());
+ return this.sendRequest(
+ "sendTransaction", params, new TypeToken If you want to get the real epoch, use {@link #getTimestampSeconds()} instead.
+ *
+ * @return Instant the java date representation of the predicate
+ */
public Instant getDate() {
- return Instant.ofEpochSecond(timePoint.getTimePoint().getUint64());
+ Instant instantMax = Instant.MAX;
+ if (getTimestampSeconds().compareTo(BigInteger.valueOf(instantMax.getEpochSecond())) > 0) {
+ return instantMax;
+ }
+
+ return Instant.ofEpochSecond(timePoint.getTimePoint().getUint64().getNumber().longValue());
}
@Override
@@ -214,7 +239,7 @@ public int hashCode() {
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_BEFORE_ABSOLUTE_TIME);
- xdr.setAbsBefore(new Int64(timePoint.getTimePoint().getUint64()));
+ xdr.setAbsBefore(new Int64(timePoint.getTimePoint().getUint64().getNumber().longValue()));
return xdr;
}
}
@@ -228,11 +253,11 @@ public RelBefore(Duration secondsSinceClose) {
}
public RelBefore(long secondsSinceClose) {
- this(new Duration(new Uint64(secondsSinceClose)));
+ this(new Duration(new Uint64(new XdrUnsignedHyperInteger(secondsSinceClose))));
}
public long getSecondsSinceClose() {
- return duration.getDuration().getUint64();
+ return duration.getDuration().getUint64().getNumber().longValue();
}
@Override
@@ -252,7 +277,7 @@ public int hashCode() {
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_BEFORE_RELATIVE_TIME);
- xdr.setRelBefore(new Int64(duration.getDuration().getUint64()));
+ xdr.setRelBefore(new Int64(duration.getDuration().getUint64().getNumber().longValue()));
return xdr;
}
}
diff --git a/src/main/java/org/stellar/sdk/Sep10Challenge.java b/src/main/java/org/stellar/sdk/Sep10Challenge.java
index 567df3de3..be86cd019 100644
--- a/src/main/java/org/stellar/sdk/Sep10Challenge.java
+++ b/src/main/java/org/stellar/sdk/Sep10Challenge.java
@@ -6,6 +6,7 @@
import com.google.common.collect.Multimap;
import com.google.common.io.BaseEncoding;
import java.io.IOException;
+import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Collections;
@@ -18,7 +19,7 @@
import org.stellar.sdk.xdr.SignatureHint;
public class Sep10Challenge {
- static final int GRACE_PERIOD_SECONDS = 5 * 60;
+ static final BigInteger GRACE_PERIOD_SECONDS = BigInteger.valueOf(5 * 60);
static final String CLIENT_DOMAIN_DATA_NAME = "client_domain";
private static final String HOME_DOMAIN_MANAGER_DATA_NAME_FLAG = "auth";
private static final String WEB_AUTH_DOMAIN_MANAGER_DATA_NAME = "web_auth_domain";
@@ -247,14 +248,15 @@ public static ChallengeTransaction readChallengeTransaction(
throw new InvalidSep10ChallengeException("only memo type `id` is supported");
}
- long maxTime = transaction.getTimeBounds().getMaxTime();
- long minTime = transaction.getTimeBounds().getMinTime();
- if (maxTime == 0L) {
+ BigInteger maxTime = transaction.getTimeBounds().getMaxTime();
+ BigInteger minTime = transaction.getTimeBounds().getMinTime();
+ if (maxTime.equals(BigInteger.ZERO)) {
throw new InvalidSep10ChallengeException("Transaction requires non-infinite timebounds.");
}
- long currentTime = System.currentTimeMillis() / 1000L;
- if ((currentTime + GRACE_PERIOD_SECONDS) < minTime || currentTime > maxTime) {
+ BigInteger currentTime = BigInteger.valueOf(System.currentTimeMillis() / 1000L);
+ if (currentTime.add(GRACE_PERIOD_SECONDS).compareTo(minTime) < 0
+ || currentTime.compareTo(maxTime) > 0) {
throw new InvalidSep10ChallengeException(
"Transaction is not within range of the specified timebounds.");
}
diff --git a/src/main/java/org/stellar/sdk/SetOptionsOperation.java b/src/main/java/org/stellar/sdk/SetOptionsOperation.java
index b57960d84..0a3e94927 100644
--- a/src/main/java/org/stellar/sdk/SetOptionsOperation.java
+++ b/src/main/java/org/stellar/sdk/SetOptionsOperation.java
@@ -131,32 +131,32 @@ org.stellar.sdk.xdr.Operation.OperationBody toOperationBody(AccountConverter acc
}
if (clearFlags != null) {
Uint32 clearFlags = new Uint32();
- clearFlags.setUint32(this.clearFlags);
+ clearFlags.setUint32(new XdrUnsignedInteger(this.clearFlags));
op.setClearFlags(clearFlags);
}
if (setFlags != null) {
Uint32 setFlags = new Uint32();
- setFlags.setUint32(this.setFlags);
+ setFlags.setUint32(new XdrUnsignedInteger(this.setFlags));
op.setSetFlags(setFlags);
}
if (masterKeyWeight != null) {
Uint32 uint32 = new Uint32();
- uint32.setUint32(masterKeyWeight);
+ uint32.setUint32(new XdrUnsignedInteger(masterKeyWeight));
op.setMasterWeight(uint32);
}
if (lowThreshold != null) {
Uint32 uint32 = new Uint32();
- uint32.setUint32(lowThreshold);
+ uint32.setUint32(new XdrUnsignedInteger(lowThreshold));
op.setLowThreshold(uint32);
}
if (mediumThreshold != null) {
Uint32 uint32 = new Uint32();
- uint32.setUint32(mediumThreshold);
+ uint32.setUint32(new XdrUnsignedInteger(mediumThreshold));
op.setMedThreshold(uint32);
}
if (highThreshold != null) {
Uint32 uint32 = new Uint32();
- uint32.setUint32(highThreshold);
+ uint32.setUint32(new XdrUnsignedInteger(highThreshold));
op.setHighThreshold(uint32);
}
if (homeDomain != null) {
@@ -167,7 +167,7 @@ org.stellar.sdk.xdr.Operation.OperationBody toOperationBody(AccountConverter acc
if (signer != null) {
org.stellar.sdk.xdr.Signer signer = new org.stellar.sdk.xdr.Signer();
Uint32 weight = new Uint32();
- weight.setUint32(signerWeight & 0xFF);
+ weight.setUint32(new XdrUnsignedInteger(signerWeight & 0xFF));
signer.setKey(this.signer);
signer.setWeight(weight);
op.setSigner(signer);
@@ -203,29 +203,29 @@ public static class Builder {
inflationDestination = StrKey.encodeStellarAccountId(op.getInflationDest());
}
if (op.getClearFlags() != null) {
- clearFlags = op.getClearFlags().getUint32();
+ clearFlags = op.getClearFlags().getUint32().getNumber().intValue();
}
if (op.getSetFlags() != null) {
- setFlags = op.getSetFlags().getUint32();
+ setFlags = op.getSetFlags().getUint32().getNumber().intValue();
}
if (op.getMasterWeight() != null) {
- masterKeyWeight = op.getMasterWeight().getUint32();
+ masterKeyWeight = op.getMasterWeight().getUint32().getNumber().intValue();
}
if (op.getLowThreshold() != null) {
- lowThreshold = op.getLowThreshold().getUint32();
+ lowThreshold = op.getLowThreshold().getUint32().getNumber().intValue();
}
if (op.getMedThreshold() != null) {
- mediumThreshold = op.getMedThreshold().getUint32();
+ mediumThreshold = op.getMedThreshold().getUint32().getNumber().intValue();
}
if (op.getHighThreshold() != null) {
- highThreshold = op.getHighThreshold().getUint32();
+ highThreshold = op.getHighThreshold().getUint32().getNumber().intValue();
}
if (op.getHomeDomain() != null) {
homeDomain = op.getHomeDomain().getString32().toString();
}
if (op.getSigner() != null) {
signer = op.getSigner().getKey();
- signerWeight = op.getSigner().getWeight().getUint32() & 0xFF;
+ signerWeight = op.getSigner().getWeight().getUint32().getNumber().intValue() & 0xFF;
}
}
diff --git a/src/main/java/org/stellar/sdk/SetTrustlineFlagsOperation.java b/src/main/java/org/stellar/sdk/SetTrustlineFlagsOperation.java
index baad5b619..ba959f18e 100644
--- a/src/main/java/org/stellar/sdk/SetTrustlineFlagsOperation.java
+++ b/src/main/java/org/stellar/sdk/SetTrustlineFlagsOperation.java
@@ -53,7 +53,7 @@ private static Uint32 bitwiseOr(EnumSet This is recommended for when you are building {@link BumpFootprintExpirationOperation} and
+ * {@link RestoreFootprintOperation} operations to avoid (re)building the entire data structure from
+ * scratch.
+ */
+public class SorobanDataBuilder {
+ private final SorobanTransactionData data;
+
+ /** Creates a new builder with an empty {@link SorobanTransactionData}. */
+ public SorobanDataBuilder() {
+ data =
+ new SorobanTransactionData.Builder()
+ .resources(
+ new SorobanResources.Builder()
+ .footprint(
+ new LedgerFootprint.Builder()
+ .readOnly(new LedgerKey[] {})
+ .readWrite(new LedgerKey[] {})
+ .build())
+ .instructions(new Uint32(new XdrUnsignedInteger(0)))
+ .readBytes(new Uint32(new XdrUnsignedInteger(0)))
+ .writeBytes(new Uint32(new XdrUnsignedInteger(0)))
+ .extendedMetaDataSizeBytes(new Uint32(new XdrUnsignedInteger(0)))
+ .build())
+ .refundableFee(new Int64(0L))
+ .ext(new ExtensionPoint.Builder().discriminant(0).build())
+ .build();
+ }
+
+ /**
+ * Creates a new builder from a base64 representation of {@link SorobanTransactionData}.
+ *
+ * @param sorobanData base64 representation of {@link SorobanTransactionData}
+ */
+ public SorobanDataBuilder(String sorobanData) {
+ try {
+ data = SorobanTransactionData.fromXdrBase64(sorobanData);
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Invalid SorobanData: " + sorobanData, e);
+ }
+ }
+
+ /**
+ * Creates a new builder from a {@link SorobanTransactionData}.
+ *
+ * @param sorobanData {@link SorobanTransactionData}.
+ */
+ public SorobanDataBuilder(SorobanTransactionData sorobanData) {
+ try {
+ data = SorobanTransactionData.fromXdrByteArray(sorobanData.toXdrByteArray());
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Invalid SorobanData: " + sorobanData, e);
+ }
+ }
+
+ /**
+ * Sets the "refundable" fee portion of the Soroban data.
+ *
+ * @param fee the refundable fee to set (int64)
+ * @return this builder instance
+ */
+ public SorobanDataBuilder setRefundableFee(long fee) {
+ data.setRefundableFee(new Int64(fee));
+ return this;
+ }
+
+ /**
+ * Sets up the resource metrics.
+ *
+ * You should almost NEVER need this, as its often generated/provided to you by transaction
+ * simulation/preflight from a Soroban RPC server.
+ *
+ * @param resources the resource metrics to set
+ * @return this builder instance
+ */
+ public SorobanDataBuilder setResources(Resources resources) {
+ data.getResources()
+ .setInstructions(new Uint32(new XdrUnsignedInteger(resources.getCpuInstructions())));
+ data.getResources().setReadBytes(new Uint32(new XdrUnsignedInteger(resources.getReadBytes())));
+ data.getResources()
+ .setWriteBytes(new Uint32(new XdrUnsignedInteger(resources.getWriteBytes())));
+ data.getResources()
+ .setExtendedMetaDataSizeBytes(
+ new Uint32(new XdrUnsignedInteger(resources.getMetadataBytes())));
+ return this;
+ }
+
+ /**
+ * Sets the read-only portion of the storage access footprint to be a certain set of ledger keys.
+ *
+ * Passing {@code null} will leave that portion of the footprint untouched. If you want to
+ * clear a portion of the footprint, pass an empty collection.
+ *
+ * @param readOnly the set of ledger keys to set in the read-only portion of the transaction's
+ * sorobanData
+ * @return this builder instance
+ */
+ public SorobanDataBuilder setReadOnly(@Nullable Collection Passing {@code null} will leave that portion of the footprint untouched. If you want to
+ * clear a portion of the footprint, pass an empty collection.
+ *
+ * @param readWrite the set of ledger keys to set in the read-write portion of the transaction's
+ * sorobanData
+ * @return this builder instance
+ */
+ public SorobanDataBuilder setReadWrite(@Nullable Collection For non-contract(non-Soroban) transactions, this setting has no effect. In the case of
+ * Soroban transactions, this is either an instance of {@link SorobanTransactionData} or a
+ * base64-encoded string of said structure. This is usually obtained from the simulation response
+ * based on a transaction with a Soroban operation (e.g. {@link InvokeHostFunctionOperation},
+ * providing necessary resource and storage footprint estimations for contract invocation.
*
* @param sorobanData Soroban data to set
* @return Builder object so you can chain methods.
*/
public TransactionBuilder setSorobanData(SorobanTransactionData sorobanData) {
- this.mSorobanData = sorobanData;
+ this.mSorobanData = new SorobanDataBuilder(sorobanData).build();
return this;
}
/**
- * Sets Soroban data to the transaction. TODO: After adding SorobanServer, add more descriptions.
+ * Sets the transaction's internal Soroban transaction data (resources, footprint, etc.).
+ *
+ * For non-contract(non-Soroban) transactions, this setting has no effect. In the case of
+ * Soroban transactions, this is either an instance of {@link SorobanTransactionData} or a
+ * base64-encoded string of said structure. This is usually obtained from the simulation response
+ * based on a transaction with a Soroban operation (e.g. {@link InvokeHostFunctionOperation},
+ * providing necessary resource and storage footprint estimations for contract invocation.
*
* @param sorobanData Soroban data to set
* @return Builder object so you can chain methods.
*/
public TransactionBuilder setSorobanData(String sorobanData) {
- SorobanTransactionData data;
- try {
- data = SorobanTransactionData.fromXdrBase64(sorobanData);
- } catch (IOException e) {
- throw new IllegalArgumentException("Invalid Soroban data: " + sorobanData, e);
- }
- return setSorobanData(data);
+ this.mSorobanData = new SorobanDataBuilder(sorobanData).build();
+ return this;
}
}
diff --git a/src/test/java/org/stellar/sdk/SorobanDataBuilderTest.java b/src/test/java/org/stellar/sdk/SorobanDataBuilderTest.java
new file mode 100644
index 000000000..f55a4ae74
--- /dev/null
+++ b/src/test/java/org/stellar/sdk/SorobanDataBuilderTest.java
@@ -0,0 +1,145 @@
+package org.stellar.sdk;
+
+import static com.google.common.collect.ImmutableList.of;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import org.junit.Test;
+import org.stellar.sdk.xdr.ExtensionPoint;
+import org.stellar.sdk.xdr.Int64;
+import org.stellar.sdk.xdr.LedgerEntryType;
+import org.stellar.sdk.xdr.LedgerFootprint;
+import org.stellar.sdk.xdr.LedgerKey;
+import org.stellar.sdk.xdr.SorobanResources;
+import org.stellar.sdk.xdr.SorobanTransactionData;
+import org.stellar.sdk.xdr.Uint32;
+import org.stellar.sdk.xdr.XdrUnsignedInteger;
+
+public class SorobanDataBuilderTest {
+ LedgerKey readOnly =
+ new LedgerKey.Builder()
+ .discriminant(LedgerEntryType.ACCOUNT)
+ .account(
+ new LedgerKey.LedgerKeyAccount.Builder()
+ .accountID(
+ KeyPair.fromAccountId(
+ "GB7TAYRUZGE6TVT7NHP5SMIZRNQA6PLM423EYISAOAP3MKYIQMVYP2JO")
+ .getXdrAccountId())
+ .build())
+ .build();
+ LedgerKey readWrite =
+ new LedgerKey.Builder()
+ .discriminant(LedgerEntryType.ACCOUNT)
+ .account(
+ new LedgerKey.LedgerKeyAccount.Builder()
+ .accountID(
+ KeyPair.fromAccountId(
+ "GAHJJJKMOKYE4RVPZEWZTKH5FVI4PA3VL7GK2LFNUBSGBV6OJP7TQSLX")
+ .getXdrAccountId())
+ .build())
+ .build();
+
+ SorobanTransactionData emptySorobanData =
+ new SorobanTransactionData.Builder()
+ .resources(
+ new SorobanResources.Builder()
+ .footprint(
+ new LedgerFootprint.Builder()
+ .readOnly(new LedgerKey[] {})
+ .readWrite(new LedgerKey[] {})
+ .build())
+ .instructions(new Uint32(new XdrUnsignedInteger(0)))
+ .readBytes(new Uint32(new XdrUnsignedInteger(0)))
+ .writeBytes(new Uint32(new XdrUnsignedInteger(0)))
+ .extendedMetaDataSizeBytes(new Uint32(new XdrUnsignedInteger(0)))
+ .build())
+ .refundableFee(new Int64(0L))
+ .ext(new ExtensionPoint.Builder().discriminant(0).build())
+ .build();
+
+ SorobanTransactionData presetSorobanData =
+ new SorobanTransactionData.Builder()
+ .resources(
+ new SorobanResources.Builder()
+ .footprint(
+ new LedgerFootprint.Builder()
+ .readOnly(new LedgerKey[] {readOnly})
+ .readWrite(new LedgerKey[] {readWrite})
+ .build())
+ .instructions(new Uint32(new XdrUnsignedInteger(1)))
+ .readBytes(new Uint32(new XdrUnsignedInteger(2)))
+ .writeBytes(new Uint32(new XdrUnsignedInteger(3)))
+ .extendedMetaDataSizeBytes(new Uint32(new XdrUnsignedInteger(4)))
+ .build())
+ .refundableFee(new Int64(5L))
+ .ext(new ExtensionPoint.Builder().discriminant(0).build())
+ .build();
+
+ @Test
+ public void testConstructorFromEmpty() {
+ SorobanTransactionData actualData = new SorobanDataBuilder().build();
+ assertEquals(emptySorobanData, actualData);
+ }
+
+ @Test
+ public void testConstructorFromBase64() throws IOException {
+ String base64 = presetSorobanData.toXdrBase64();
+ SorobanTransactionData actualData = new SorobanDataBuilder(base64).build();
+ assertEquals(presetSorobanData, actualData);
+ }
+
+ @Test
+ public void testConstructorFromSorobanTransactionData() {
+ SorobanTransactionData actualData = new SorobanDataBuilder(presetSorobanData).build();
+ assertEquals(presetSorobanData, actualData);
+ }
+
+ @Test
+ public void testSetProperties() {
+ SorobanTransactionData actualData =
+ new SorobanDataBuilder()
+ .setReadOnly(of(readOnly))
+ .setReadWrite(of(readWrite))
+ .setRefundableFee(5)
+ .setResources(
+ new SorobanDataBuilder.Resources.ResourcesBuilder()
+ .cpuInstructions(1L)
+ .readBytes(2L)
+ .writeBytes(3L)
+ .metadataBytes(4L)
+ .build())
+ .build();
+ assertEquals(presetSorobanData, actualData);
+ }
+
+ @Test
+ public void testLeavesUntouchedFootprintsUntouched() {
+ SorobanTransactionData data0 =
+ new SorobanDataBuilder(presetSorobanData).setReadOnly(null).build();
+ assertArrayEquals(
+ new LedgerKey[] {readOnly}, data0.getResources().getFootprint().getReadOnly());
+
+ SorobanTransactionData data1 =
+ new SorobanDataBuilder(presetSorobanData).setReadOnly(new ArrayList<>()).build();
+ assertArrayEquals(new LedgerKey[] {}, data1.getResources().getFootprint().getReadOnly());
+
+ SorobanTransactionData data3 =
+ new SorobanDataBuilder(presetSorobanData).setReadWrite(null).build();
+ assertArrayEquals(
+ new LedgerKey[] {readWrite}, data3.getResources().getFootprint().getReadWrite());
+
+ SorobanTransactionData data4 =
+ new SorobanDataBuilder(presetSorobanData).setReadWrite(new ArrayList<>()).build();
+ assertArrayEquals(new LedgerKey[] {}, data4.getResources().getFootprint().getReadWrite());
+ }
+
+ @Test
+ public void testBuildCopy() {
+ SorobanTransactionData actualData = new SorobanDataBuilder(presetSorobanData).build();
+ assertEquals(presetSorobanData, actualData);
+ assertNotSame(presetSorobanData, actualData);
+ }
+}
diff --git a/src/test/java/org/stellar/sdk/SorobanServerTest.java b/src/test/java/org/stellar/sdk/SorobanServerTest.java
index c8671d791..572c1f68a 100644
--- a/src/test/java/org/stellar/sdk/SorobanServerTest.java
+++ b/src/test/java/org/stellar/sdk/SorobanServerTest.java
@@ -1353,35 +1353,40 @@ private Transaction buildSorobanTransaction(
auth = new ArrayList<>();
}
- return new TransactionBuilder(AccountConverter.enableMuxed(), source, Network.STANDALONE)
- .setBaseFee(50000)
- .addPreconditions(
- TransactionPreconditions.builder().timeBounds(new TimeBounds(0, 0)).build())
- .addOperation(
- InvokeHostFunctionOperation.builder()
- .sourceAccount(opInvokerKp.getAccountId())
- .hostFunction(
- new HostFunction.Builder()
- .discriminant(HostFunctionType.HOST_FUNCTION_TYPE_INVOKE_CONTRACT)
- .invokeContract(
- new SCVec(
- new SCVal[] {
- new Address(contractId).toSCVal(),
- new SCVal.Builder()
- .discriminant(SCValType.SCV_SYMBOL)
- .sym(new SCSymbol(new XdrString("increment")))
- .build(),
- new Address(opInvokerKp.getAccountId()).toSCVal(),
- new SCVal.Builder()
- .discriminant(SCValType.SCV_U32)
- .u32(new Uint32(new XdrUnsignedInteger(10)))
- .build()
- }))
- .build())
- .auth(auth)
- .build())
- .setSorobanData(sorobanData)
- .build();
+ TransactionBuilder transactionBuilder =
+ new TransactionBuilder(AccountConverter.enableMuxed(), source, Network.STANDALONE)
+ .setBaseFee(50000)
+ .addPreconditions(
+ TransactionPreconditions.builder().timeBounds(new TimeBounds(0, 0)).build())
+ .addOperation(
+ InvokeHostFunctionOperation.builder()
+ .sourceAccount(opInvokerKp.getAccountId())
+ .hostFunction(
+ new HostFunction.Builder()
+ .discriminant(HostFunctionType.HOST_FUNCTION_TYPE_INVOKE_CONTRACT)
+ .invokeContract(
+ new SCVec(
+ new SCVal[] {
+ new Address(contractId).toSCVal(),
+ new SCVal.Builder()
+ .discriminant(SCValType.SCV_SYMBOL)
+ .sym(new SCSymbol(new XdrString("increment")))
+ .build(),
+ new Address(opInvokerKp.getAccountId()).toSCVal(),
+ new SCVal.Builder()
+ .discriminant(SCValType.SCV_U32)
+ .u32(new Uint32(new XdrUnsignedInteger(10)))
+ .build()
+ }))
+ .build())
+ .auth(auth)
+ .build());
+
+ if (sorobanData != null) {
+ transactionBuilder.setSorobanData(sorobanData);
+ }
+
+ return transactionBuilder.build();
}
private static SorobanAuthorizationEntry sorobanAuthorizationEntryFromXdrBase64(
From 712f0711239370a21d5d96bd6d7396e8d65f1c4e Mon Sep 17 00:00:00 2001
From: overcat <4catcode@gmail.com>
Date: Mon, 14 Aug 2023 23:45:06 +0800
Subject: [PATCH 12/29] Bump version.
---
CHANGELOG.md | 21 +++++++++++++++++++++
build.gradle | 2 +-
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index acec00728..e176af5ed 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,27 @@ As this project is pre 1.0, breaking changes may happen for minor version bumps.
## Pending
+## 0.41.0-beta.0
+* Add support for Soroban Preview 10. ([#490](https://github.com/stellar/java-stellar-sdk/issues/490))
+* Correct the data type of certain fields to store the expected design values. ([#497](https://github.com/stellar/java-stellar-sdk/pull/497))
+* Add source account comparison to `ClawbackClaimableBalanceOperation`, `LiquidityPoolWithdrawOperation`, and `LiquidityPoolDepositOperation` for equality check. ([#484](https://github.com/stellar/java-stellar-sdk/pull/484))
+* Add basic implementation of `liquidity_pools?account` ([#426](https://github.com/stellar/java-stellar-sdk/pull/426))
+
+### Breaking changes
+* `Utils.claimableBalanceIdToXDR` and `Utils.xdrToClaimableBalanceId` have been removed. ([#503](https://github.com/stellar/java-stellar-sdk/pull/503))
+* The types of the following fields have changed. ([#498](https://github.com/stellar/java-stellar-sdk/pull/498))
+ | field | before | now |
+ | ----------------------------------------- | ------ | ---------- |
+ | LedgerBounds.minLedger | int | long |
+ | LedgerBounds.maxLedger | int | long |
+ | MemoId.id | long | BigInteger |
+ | TimeBounds.minTime | long | BigInteger |
+ | TimeBounds.maxTime | long | BigInteger |
+ | TransactionBuilder.baseFee | int | long |
+ | TransactionPreconditions.TIMEOUT_INFINITE | long | BigInteger |
+ | TransactionPreconditions.minSeqAge | Long | BigInteger |
+ | TransactionPreconditions.minSeqLedgerGap | int | long |
+
## 0.40.0
* Add strkey support for contract ids ([#471](https://github.com/stellar/java-stellar-sdk/pull/471))
* Fix NPE in `KeyPair.equals()` method ([#474](https://github.com/stellar/java-stellar-sdk/pull/474))
diff --git a/build.gradle b/build.gradle
index a8455fde2..b52c646e7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,7 +25,7 @@ spotless {
sourceCompatibility = JavaVersion.VERSION_1_8.toString()
-version = '0.40.0'
+version = '0.41.0-beta.0'
group = 'stellar'
jar.enabled = false
From 8be63cd8e9b6bbdf3b936132090e3b7b7412e39d Mon Sep 17 00:00:00 2001
From: Jun Luo <4catcode@gmail.com>
Date: Wed, 16 Aug 2023 23:35:52 +0800
Subject: [PATCH 13/29] Use JDK 11 for CI builds & Bump version. (#511)
---
CHANGELOG.md | 3 +++
build.gradle | 2 +-
jitpack.yml | 7 +++++++
3 files changed, 11 insertions(+), 1 deletion(-)
create mode 100644 jitpack.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e176af5ed..f6984dc57 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,9 @@ As this project is pre 1.0, breaking changes may happen for minor version bumps.
## Pending
+## 0.41.0-beta.1
+* Use JDK 11 for CI builds. ([#511](https://github.com/stellar/java-stellar-sdk/issues/511))
+
## 0.41.0-beta.0
* Add support for Soroban Preview 10. ([#490](https://github.com/stellar/java-stellar-sdk/issues/490))
* Correct the data type of certain fields to store the expected design values. ([#497](https://github.com/stellar/java-stellar-sdk/pull/497))
diff --git a/build.gradle b/build.gradle
index b52c646e7..6c700d0f0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,7 +25,7 @@ spotless {
sourceCompatibility = JavaVersion.VERSION_1_8.toString()
-version = '0.41.0-beta.0'
+version = '0.41.0-beta.1'
group = 'stellar'
jar.enabled = false
diff --git a/jitpack.yml b/jitpack.yml
new file mode 100644
index 000000000..f81efc783
--- /dev/null
+++ b/jitpack.yml
@@ -0,0 +1,7 @@
+jdk:
+ - openjdk11
+
+before_install:
+ - sdk install java 11.0.23-open
+ - sdk use java 11.0.23-open
+
From ea4e12c31bb0104364b09bcc290dfc0585792ba2 Mon Sep 17 00:00:00 2001
From: Jun Luo <4catcode@gmail.com>
Date: Mon, 21 Aug 2023 16:33:37 +0800
Subject: [PATCH 14/29] Migrate to GitHub Actions. (#512)
---
.circleci/config.yml | 73 -------------
.github/workflows/test-deploy.yml | 100 ++++++++++++++++++
after_deploy.sh | 16 ---
build.gradle | 12 +++
src/main/java/org/stellar/sdk/KeyPair.java | 4 +-
.../java/org/stellar/sdk/LedgerBounds.java | 2 +-
.../org/stellar/sdk/SignedPayloadSigner.java | 7 +-
.../java/org/stellar/sdk/SorobanServer.java | 2 +-
.../org/stellar/sdk/TransactionBuilder.java | 2 +-
.../stellar/sdk/TransactionPreconditions.java | 2 +-
.../sdk/requests/AccountsRequestBuilder.java | 4 +-
.../sorobanrpc/SorobanRpcErrorResponse.java | 2 +-
.../sorobanrpc/SorobanRpcRequest.java | 2 +-
.../sdk/responses/TransactionResponse.java | 2 +-
.../sorobanrpc/SorobanRpcResponse.java | 2 +-
15 files changed, 128 insertions(+), 104 deletions(-)
delete mode 100644 .circleci/config.yml
create mode 100644 .github/workflows/test-deploy.yml
delete mode 100755 after_deploy.sh
diff --git a/.circleci/config.yml b/.circleci/config.yml
deleted file mode 100644
index 5ae388ee2..000000000
--- a/.circleci/config.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-version: 2.1
-
-jobs:
- test:
- docker:
- - image: circleci/openjdk:11
- steps:
- - checkout
- - run: ./gradlew check
- shadow_jar:
- docker:
- - image: circleci/openjdk:11
- steps:
- - checkout
- - run: ./gradlew shadowJar
- - persist_to_workspace:
- root: build
- paths:
- - libs/stellar-sdk.jar
- deploy:
- docker:
- - image: cimg/go:1.17
- steps:
- - attach_workspace:
- at: ./build
- - run:
- name: "Install github.com/github-release/github-release v0.10.0"
- command: |
- go get github.com/github-release/github-release@v0.10.0
- - run:
- name: "Upload JAR to GitHub Release"
- command: |
- github-release upload -s ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} -f ./build/libs/stellar-sdk.jar -n java-stellar-sdk.jar
-
- after_deploy:
- docker:
- - image: circleci/openjdk:11
- steps:
- - checkout
- - run: ./after_deploy.sh
-
-workflows:
- version: 2
- test-and-deploy:
- jobs:
- - test:
- filters: # required since `deploy` has tag filters AND requires `build`
- tags:
- only: /.*/
- - shadow_jar:
- requires:
- - test
- filters:
- tags:
- only: /.*/
- branches:
- ignore: /.*/
- - deploy:
- requires:
- - shadow_jar
- filters:
- tags:
- only: /.*/
- branches:
- ignore: /.*/
- - after_deploy:
- requires:
- - deploy
- filters:
- tags:
- only: /.*/
- branches:
- ignore: /.*/
diff --git a/.github/workflows/test-deploy.yml b/.github/workflows/test-deploy.yml
new file mode 100644
index 000000000..094cca8e9
--- /dev/null
+++ b/.github/workflows/test-deploy.yml
@@ -0,0 +1,100 @@
+name: "Test and Deploy"
+
+on:
+ push:
+ branches:
+ - master
+ - soroban
+ pull_request:
+ release:
+ types:
+ - created
+
+env:
+ JAVA_VERSION: '11'
+ JAVA_DISTRIBUTION: 'microsoft'
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up JDK
+ uses: actions/setup-java@v2
+ with:
+ java-version: ${{ env.JAVA_VERSION }}
+ distribution: ${{ env.JAVA_DISTRIBUTION }}
+ - name: Test
+ run: ./gradlew check
+
+ shadow_jar:
+ needs: test
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up JDK
+ uses: actions/setup-java@v2
+ with:
+ java-version: ${{ env.JAVA_VERSION }}
+ distribution: ${{ env.JAVA_DISTRIBUTION }}
+ - name: Build JAR
+ run: ./gradlew shadowJar
+ - name: Persist JAR Artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: jar
+ path: build/libs/stellar-sdk.jar
+
+ javadoc:
+ needs: test
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Set up JDK
+ uses: actions/setup-java@v2
+ with:
+ java-version: ${{ env.JAVA_VERSION }}
+ distribution: ${{ env.JAVA_DISTRIBUTION }}
+ - name: Generate Documentation
+ run: ./gradlew javadoc
+ - name: Persist Documentation
+ uses: actions/upload-artifact@v3
+ with:
+ name: javadoc
+ path: javadoc
+
+ deploy:
+ needs: [ shadow_jar, javadoc ]
+ permissions:
+ contents: write
+ if: github.event_name == 'release' && github.event.action == 'created'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Download JAR Artifact
+ uses: actions/download-artifact@v2
+ with:
+ name: jar
+ path: jar
+ - name: Download Java Documentation
+ uses: actions/download-artifact@v2
+ with:
+ name: javadoc
+ path: javadoc
+ - name: Archive Documentation
+ run: tar -czf stellar-sdk-javadoc.tar.gz javadoc
+ - name: Upload artifacts to GitHub Release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ jar/stellar-sdk.jar
+ stellar-sdk-javadoc.tar.gz
+ - name: Upload Documentation to GitHub Pages
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ folder: javadoc
+
diff --git a/after_deploy.sh b/after_deploy.sh
deleted file mode 100755
index 4df2347b8..000000000
--- a/after_deploy.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-echo "machine github.com login stellar-jenkins password $GITHUB_TOKEN" >~/.netrc
-git clone -b gh-pages "https://stellar-jenkins@github.com/stellar/java-stellar-sdk.git" javadoc
-
-if [ ! -d "javadoc" ]; then
- echo "Error cloning"
- exit 1
-fi
-
-rm -rf javadoc/* # Remove all files without hidden (.git)
-javadoc -public -splitindex -windowtitle "java-stellar-sdk documentation" -d ./javadoc -sourcepath ./src/main/java/ -subpackages org.stellar.sdk -exclude org.stellar.sdk.xdr
-cd javadoc
-git config user.name "post-release-script"
-git config user.email "post-release-script@stellar.org"
-git add .
-git commit -m $CIRCLE_TAG
-git push origin gh-pages
diff --git a/build.gradle b/build.gradle
index 6c700d0f0..7a6ba7ef8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -102,4 +102,16 @@ tasks.register('updateGitHook', Copy) {
rename { fileName ->
fileName.endsWith('.sh') ? fileName[0..-4] : fileName
}
+}
+
+tasks.javadoc {
+ destinationDir = file('javadoc')
+ failOnError = true
+ exclude("org/stellar/sdk/xdr/**")
+ // cast options to StandardJavadocDocletOptions
+ // https://docs.gradle.org/current/javadoc/org/gradle/external/javadoc/StandardJavadocDocletOptions.html
+ StandardJavadocDocletOptions options = options as StandardJavadocDocletOptions
+ options.setSplitIndex(true)
+ options.setMemberLevel(JavadocMemberLevel.PUBLIC)
+ options.setEncoding('UTF-8')
}
\ No newline at end of file
diff --git a/src/main/java/org/stellar/sdk/KeyPair.java b/src/main/java/org/stellar/sdk/KeyPair.java
index 9787b5fe0..55533db5a 100644
--- a/src/main/java/org/stellar/sdk/KeyPair.java
+++ b/src/main/java/org/stellar/sdk/KeyPair.java
@@ -266,8 +266,8 @@ public DecoratedSignature signDecorated(byte[] data) {
/**
* Sign the provided payload data for payload signer where the input is the data being signed. Per
* the {@link DecoratedSignature}.
+ * href="https://github.com/stellar/stellar-protocol/blob/master/core/cap-0040.md#signature-hint">CAP-40
+ * Signature spec {@link DecoratedSignature}.
*
* @param signerPayload the payload signers raw data to sign
* @return DecoratedSignature
diff --git a/src/main/java/org/stellar/sdk/LedgerBounds.java b/src/main/java/org/stellar/sdk/LedgerBounds.java
index 37c75ac15..057cb78a2 100644
--- a/src/main/java/org/stellar/sdk/LedgerBounds.java
+++ b/src/main/java/org/stellar/sdk/LedgerBounds.java
@@ -8,7 +8,7 @@
@lombok.Builder
/**
* LedgerBounds are Preconditions of a transaction per CAP-21
+ * href="https://github.com/stellar/stellar-protocol/blob/master/core/cap-0021.md#specification">CAP-21 The returned transaction will also have an updated fee that is the sum of fee set on
* incoming transaction with the contract resource fees estimated from simulation. It is advisable
diff --git a/src/main/java/org/stellar/sdk/TransactionBuilder.java b/src/main/java/org/stellar/sdk/TransactionBuilder.java
index c1b900697..44dcb4794 100644
--- a/src/main/java/org/stellar/sdk/TransactionBuilder.java
+++ b/src/main/java/org/stellar/sdk/TransactionBuilder.java
@@ -89,7 +89,7 @@ public TransactionBuilder addOperations(Collection C%4
zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{
ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT
zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh
zOBLA>$~P3r4b*NcqR;y6pwyhZ FJ$wK}0tWNB{uH;AM~i
literal 0
HcmV?d00001
diff --git a/android_test/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android_test/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0
GIT binary patch
literal 1900
zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~
zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy
zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_
zEXHhFG$0{addPreconditions()
*
with TimeBound set instead for more control over preconditions.
*/
- public TransactionBuilder setTimeout(long timeout) {
+ public TransactionBuilder setTimeout(BigInteger timeout) {
if (mPreconditions.getTimeBounds() != null
- && mPreconditions.getTimeBounds().getMaxTime() != TIMEOUT_INFINITE) {
+ && !TIMEOUT_INFINITE.equals(mPreconditions.getTimeBounds().getMaxTime())) {
throw new RuntimeException(
"TimeBounds.max_time has been already set - setting timeout would overwrite it.");
}
- if (timeout < 0) {
+ if (timeout.compareTo(BigInteger.ZERO) < 0) {
throw new RuntimeException("timeout cannot be negative");
}
- long timeoutTimestamp =
- timeout != TIMEOUT_INFINITE
- ? System.currentTimeMillis() / 1000L + timeout
+ BigInteger timeoutTimestamp =
+ !TIMEOUT_INFINITE.equals(timeout)
+ ? timeout.add(BigInteger.valueOf(System.currentTimeMillis() / 1000L))
: TIMEOUT_INFINITE;
TransactionPreconditionsBuilder preconditionsBuilder = mPreconditions.toBuilder();
if (mPreconditions.getTimeBounds() == null) {
- preconditionsBuilder.timeBounds(new TimeBounds(0, timeoutTimestamp));
+ preconditionsBuilder.timeBounds(new TimeBounds(BigInteger.ZERO, timeoutTimestamp));
} else {
preconditionsBuilder.timeBounds(
new TimeBounds(mPreconditions.getTimeBounds().getMinTime(), timeoutTimestamp));
@@ -182,7 +184,19 @@ public TransactionBuilder setTimeout(long timeout) {
return this;
}
- public TransactionBuilder setBaseFee(int baseFee) {
+ /**
+ * An alias for {@link #setTimeout(BigInteger)} with timeout
in seconds.
+ *
+ * @param timeout Timeout in seconds.
+ * @return updated Builder
+ * @deprecated this method will be removed in upcoming releases, use addPreconditions()
+ *
with TimeBound set instead for more control over preconditions.
+ */
+ public TransactionBuilder setTimeout(long timeout) {
+ return setTimeout(BigInteger.valueOf(timeout));
+ }
+
+ public TransactionBuilder setBaseFee(long baseFee) {
if (baseFee < AbstractTransaction.MIN_BASE_FEE) {
throw new IllegalArgumentException(
"baseFee cannot be smaller than the BASE_FEE ("
@@ -240,10 +254,11 @@ public Long apply(TransactionBuilderAccount sourceAccount) {
}
};
+ @Deprecated
public static org.stellar.sdk.xdr.TimeBounds buildTimeBounds(long minTime, long maxTime) {
return new org.stellar.sdk.xdr.TimeBounds.Builder()
- .minTime(new TimePoint(new Uint64(minTime)))
- .maxTime(new TimePoint(new Uint64(maxTime)))
+ .minTime(new TimePoint(new Uint64(new XdrUnsignedHyperInteger(minTime))))
+ .maxTime(new TimePoint(new Uint64(new XdrUnsignedHyperInteger(maxTime))))
.build();
}
diff --git a/src/main/java/org/stellar/sdk/TransactionPreconditions.java b/src/main/java/org/stellar/sdk/TransactionPreconditions.java
index 6d8b37b8c..e25b7ab4e 100644
--- a/src/main/java/org/stellar/sdk/TransactionPreconditions.java
+++ b/src/main/java/org/stellar/sdk/TransactionPreconditions.java
@@ -1,5 +1,6 @@
package org.stellar.sdk;
+import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;
import lombok.Builder;
@@ -15,6 +16,8 @@
import org.stellar.sdk.xdr.SignerKey;
import org.stellar.sdk.xdr.Uint32;
import org.stellar.sdk.xdr.Uint64;
+import org.stellar.sdk.xdr.XdrUnsignedHyperInteger;
+import org.stellar.sdk.xdr.XdrUnsignedInteger;
@Value
@Builder(toBuilder = true)
@@ -24,12 +27,12 @@
*/
public class TransactionPreconditions {
public static final long MAX_EXTRA_SIGNERS_COUNT = 2;
- public static final long TIMEOUT_INFINITE = 0;
+ public static final BigInteger TIMEOUT_INFINITE = BigInteger.ZERO;
LedgerBounds ledgerBounds;
- Long minSeqNumber;
- long minSeqAge;
- int minSeqLedgerGap;
+ Long minSeqNumber; // int64
+ @Builder.Default BigInteger minSeqAge = BigInteger.ZERO; // uint64
+ long minSeqLedgerGap; // uint32
@Singular @NonNull ListTevUD5@?*P8)voa?kEe@_hl{_h8j&5eB-5FrYW&*FHVt$
z$kRF9Nstj6TRVf@tUFHB079o4MBIh{M~4>WwnGgesQH