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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.13.1</version>
<version>5.14.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down Expand Up @@ -175,19 +175,14 @@
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility-proxy</artifactId>
<version>3.1.6</version>
<version>4.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-api</artifactId>
<version>3.3.4</version>
<version>3.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,6 @@ public Signature signInner(final P privateKeyable, final Batch batchTransaction)
return this.abstractTransactionSigner.signInner(privateKeyable, batchTransaction);
}

@Override
public SingleSignedTransaction<Batch> signOuter(final P privateKeyable, final Batch batchTransaction) {
return this.abstractTransactionSigner.signOuter(privateKeyable, batchTransaction);
}

@Override
public <T extends Transaction> Signature multiSign(final P privateKeyable, final T transaction) {
return abstractTransactionSigner.multiSign(privateKeyable, transaction);
Expand All @@ -128,11 +123,6 @@ public Signature multiSignInner(final P privateKeyable, final Batch batchTransac
return abstractTransactionSigner.multiSignInner(privateKeyable, batchTransaction);
}

@Override
public Signature multiSignOuter(final P privateKeyable, final Batch batchTransaction) {
return abstractTransactionSigner.multiSignOuter(privateKeyable, batchTransaction);
}

@Override
public <T extends Transaction> boolean verify(final Signer signer, final T unsignedTransaction) {
return abstractTransactionVerifier.verify(signer, unsignedTransaction);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
* =========================LICENSE_END==================================
*/

import com.google.common.annotations.Beta;
import org.xrpl.xrpl4j.codec.addresses.UnsignedByteArray;
import org.xrpl.xrpl4j.crypto.keys.PrivateKeyReference;
import org.xrpl.xrpl4j.crypto.keys.PrivateKeyable;
Expand Down Expand Up @@ -56,11 +55,6 @@ public <T extends Transaction> SingleSignedTransaction<T> sign(final P privateKe
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(transaction);

// The Batch transaction requires special handling when signing, so disallow it from this method.
if (Batch.class.isAssignableFrom(transaction.getClass())) {
throw new RuntimeException("Batch transactions must be signed using signInner() or signOuter()");
}

final UnsignedByteArray signableTransactionBytes = this.signatureUtils.toSignableBytes(transaction);
final Signature signature = this.signingHelper(privateKeyable, signableTransactionBytes);
return this.signatureUtils.addSignatureToTransaction(transaction, signature);
Expand Down Expand Up @@ -92,24 +86,11 @@ public Signature signInner(final P privateKeyable, final Batch batchTransaction)
return this.signingHelper(privateKeyable, signableBytes);
}

@Override
public SingleSignedTransaction<Batch> signOuter(final P privateKeyable, final Batch batchTransaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(batchTransaction);
final UnsignedByteArray signableBytes = this.signatureUtils.toSignableBytes(batchTransaction);
final Signature signature = this.signingHelper(privateKeyable, signableBytes);
return this.signatureUtils.addSignatureToTransaction(batchTransaction, signature);
}

@Override
public <T extends Transaction> Signature multiSign(final P privateKeyable, final T transaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(transaction);

if (Batch.class.isAssignableFrom(transaction.getClass())) {
throw new RuntimeException("Batch transactions must be signed using multiSignInner() or multiSignOuter()");
}

final Address address = derivePublicKey(privateKeyable).deriveAddress();
final UnsignedByteArray signableTransactionBytes = this.signatureUtils.toMultiSignableBytes(transaction, address);
return this.signingHelper(privateKeyable, signableTransactionBytes);
Expand All @@ -126,17 +107,6 @@ public Signature multiSignInner(final P privateKeyable, final Batch batchTransac
return this.signingHelper(privateKeyable, signableBytes);
}

@Override
public Signature multiSignOuter(final P privateKeyable, final Batch batchTransaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(batchTransaction);

final Address address = derivePublicKey(privateKeyable).deriveAddress();
final UnsignedByteArray signableBytes = this.signatureUtils.toMultiSignableBytes(batchTransaction, address);

return this.signingHelper(privateKeyable, signableBytes);
}

/**
* Helper to generate a signature based upon an {@link UnsignedByteArray} of transaction bytes.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public interface TransactionSigner<P extends PrivateKeyable> {

/**
* Accessor for the public-key corresponding to the supplied key meta-data. This method exists to support
* implementations that hold private-key material internally, yet need a way for external callers to determine the
* implementations that hold private-key material internally yet need a way for external callers to determine the
* actual public key for signature verification or other purposes.
*
* @param privateKeyable A {@link PrivateKeyable} to derive a public key from.
Expand All @@ -48,8 +48,7 @@ public interface TransactionSigner<P extends PrivateKeyable> {
PublicKey derivePublicKey(P privateKeyable);

/**
* Obtain a singly-signed signature for the supplied transaction using {@code privateKeyable} and the single-sign
* mechanism.
* Get a transaction with a single-sig using {@code privateKeyable}.
*
* @param privateKeyable The {@link P} used to sign {@code transaction}.
* @param transaction The {@link Transaction} to sign.
Expand Down Expand Up @@ -84,7 +83,7 @@ public interface TransactionSigner<P extends PrivateKeyable> {
Signature sign(P privateKeyable, Attestation attestation);

/**
* Obtain a signature for a batch transaction using the supplied {@link P}.
* Get a signature for a batch transaction using the supplied {@link P}.
*
* <p>Per XLS-0056, BatchSigners sign a specific format: HashPrefix::batch + flags + count + inner tx IDs.
* This differs from both single-signing and multi-signing.</p>
Expand All @@ -100,23 +99,6 @@ public interface TransactionSigner<P extends PrivateKeyable> {
@Beta
Signature signInner(P privateKeyable, Batch batchTransaction);

/**
* Obtain a signature for a batch transaction using the supplied {@link P}.
*
* <p>Per XLS-0056, BatchSigners sign a specific format: HashPrefix::batch + flags + count + inner tx IDs.
* This differs from both single-signing and multi-signing.</p>
*
* <p>This method will be marked {@link Beta} until the featureBatch amendment is enabled on mainnet.
* Its API is subject to change.</p>
*
* @param privateKeyable The {@link P} used to sign {@code batchTransaction}.
* @param batchTransaction The {@link Batch} transaction to sign.
*
* @return A {@link Signature} for the batch transaction.
*/
@Beta
SingleSignedTransaction<Batch> signOuter(P privateKeyable, Batch batchTransaction);

/**
* Get a signature for the supplied unsigned transaction using the supplied {@link P}. The primary reason this
* method's signature diverges from {@link #sign(PrivateKeyable, Transaction)} is that for multi-sign scenarios, the
Expand Down Expand Up @@ -151,8 +133,6 @@ public interface TransactionSigner<P extends PrivateKeyable> {
*/
Signature multiSignInner(P privateKeyable, Batch batchTransaction);

Signature multiSignOuter(P privateKeyable, Batch batchTransaction);

/**
* Obtain a signature for the supplied unsigned transaction using the supplied {@link P}.
* <p>
Expand All @@ -177,16 +157,19 @@ public interface TransactionSigner<P extends PrivateKeyable> {
* @param <T> The type of the transaction to be signed.
*
* @return A {@link Signature} for the transaction.
*
* @deprecated Use {@link #multiSign(PrivateKeyable, Transaction)} instead and assemble a {@link Signer} manually.
* This will allow callers to better manage public-key derivation, especially for derived key scenarios like an HSM
* where public-key derivation is expensive and may only need to be done once for multiple multi-sig operations.
*/
@Deprecated
default <T extends Transaction> Signer multiSignToSigner(P privateKeyable, T transaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(transaction);

// Compute this only once, just in case public-key derivation is expensive (e.g., a remote HSM).
final PublicKey signingPublicKey = this.derivePublicKey(privateKeyable);
return Signer.builder()
.signingPublicKey(signingPublicKey)
.transactionSignature(multiSign(privateKeyable, transaction))
.build();
return Signer.builder().signingPublicKey(signingPublicKey)
.transactionSignature(multiSign(privateKeyable, transaction)).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,28 +150,13 @@ public Signature signInner(final PrivateKeyReference privateKeyable, final Batch
return getTransactionSigner(privateKeyable).signInner(batchTransaction);
}

@Override
public SingleSignedTransaction<Batch> signOuter(final PrivateKeyReference privateKeyable,
final Batch batchTransaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(batchTransaction);
return getTransactionSigner(privateKeyable).signOuter(batchTransaction);
}

@Override
public Signature multiSignInner(final PrivateKeyReference privateKeyable, final Batch batchTransaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(batchTransaction);
return getTransactionSigner(privateKeyable).multiSignInner(batchTransaction);
}

@Override
public Signature multiSignOuter(final PrivateKeyReference privateKeyable, final Batch batchTransaction) {
Objects.requireNonNull(privateKeyable);
Objects.requireNonNull(batchTransaction);
return getTransactionSigner(privateKeyable).multiSignOuter(batchTransaction);
}

@Override
public <T extends Transaction> Signer multiSignToSigner(PrivateKeyReference privateKeyable, T transaction) {
return getTransactionSigner(privateKeyable).multiSignToSigner(transaction);
Expand Down Expand Up @@ -344,6 +329,8 @@ public <T extends Transaction> Signature multiSign(final T transaction) {
return bcSignatureService.multiSign(this.privateKey, transaction);
}

// @deprecated See comment in `TransactionSigner#multiSignToSigner`.
@Deprecated
public <T extends Transaction> Signer multiSignToSigner(T transaction) {
return bcSignatureService.multiSignToSigner(this.privateKey, transaction);
}
Expand All @@ -352,18 +339,10 @@ public final Signature signInner(final Batch transaction) {
return bcSignatureService.signInner(this.privateKey, transaction);
}

public final SingleSignedTransaction<Batch> signOuter(final Batch transaction) {
return bcSignatureService.signOuter(this.privateKey, transaction);
}

public final Signature multiSignInner(final Batch transaction) {
return bcSignatureService.multiSignInner(this.privateKey, transaction);
}

public final Signature multiSignOuter(final Batch transaction) {
return bcSignatureService.multiSignOuter(this.privateKey, transaction);
}

public PublicKey getPublicKey() {
return BcKeyUtils.toPublicKey(this.privateKey);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Expand All @@ -33,8 +33,6 @@
import org.xrpl.xrpl4j.model.transactions.Hash256;
import org.xrpl.xrpl4j.model.transactions.Transaction;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Optional;

Expand All @@ -50,7 +48,7 @@
using = AccountTransactionsTransactionDeserializer.class
)
public interface AccountTransactionsTransaction<T extends Transaction> {

/**
* Construct a builder for this class.
*
Expand Down Expand Up @@ -86,17 +84,16 @@ static <T extends Transaction> ImmutableAccountTransactionsTransaction.Builder<T
LedgerIndex ledgerIndex();

/**
* The approximate close time (using Ripple Epoch) of the ledger containing this transaction.
* This is an undocumented field.
* The approximate close time (using Ripple Epoch) of the ledger containing this transaction. This is an undocumented
* field.
*
* @return An optionally-present {@link UnsignedLong}.
*/
@JsonProperty("date")
Optional<UnsignedLong> closeDate();

/**
* The approximate close time in UTC offset.
* This is derived from undocumented field.
* The approximate close time in UTC offset. This is derived from undocumented field.
*
* @return An optionally-present {@link ZonedDateTime}.
*/
Expand All @@ -105,5 +102,5 @@ static <T extends Transaction> ImmutableAccountTransactionsTransaction.Builder<T
default Optional<ZonedDateTime> closeDateHuman() {
return closeDate().map(TimeUtils::xrplTimeToZonedDateTime);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.google.common.primitives.UnsignedLong;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

/**
Expand All @@ -25,7 +25,7 @@ public class TimeUtils {
* @return A {@link ZonedDateTime} in UTC.
*/
public static ZonedDateTime xrplTimeToZonedDateTime(UnsignedLong xrplTime) {
return Instant.ofEpochSecond(RIPPLE_EPOCH.plus(xrplTime).longValue()).atZone(ZoneId.of("UTC"));
return Instant.ofEpochSecond(RIPPLE_EPOCH.plus(xrplTime).longValue()).atZone(ZoneOffset.UTC);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Expand All @@ -36,8 +36,6 @@
import org.xrpl.xrpl4j.model.transactions.Transaction;
import org.xrpl.xrpl4j.model.transactions.TransactionMetadata;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Optional;

Expand Down Expand Up @@ -82,6 +80,7 @@ static <T extends Transaction> ImmutableTransactionResult.Builder<T> builder() {
* Get {@link #ledgerIndex()}, or throw an {@link IllegalStateException} if {@link #ledgerIndex()} is empty.
*
* @return The value of {@link #ledgerIndex()}.
*
* @throws IllegalStateException If {@link #ledgerIndex()} is empty.
*/
@JsonIgnore
Expand Down Expand Up @@ -118,17 +117,16 @@ default boolean validated() {
Optional<TransactionMetadata> metadata();

/**
* The approximate close time (using Ripple Epoch) of the ledger containing this transaction.
* This is an undocumented field.
* The approximate close time (using Ripple Epoch) of the ledger containing this transaction. This is an undocumented
* field.
*
* @return An optionally-present {@link UnsignedLong}.
*/
@JsonProperty("date")
Optional<UnsignedLong> closeDate();

/**
* The approximate close time in UTC offset.
* This is derived from undocumented field.
* The approximate close time in UTC offset. This is derived from undocumented field.
*
* @return An optionally-present {@link ZonedDateTime}.
*/
Expand Down
Loading
Loading