Skip to content

Commit

Permalink
Implement Horizon Protocol 14 API changes (#295)
Browse files Browse the repository at this point in the history
This PR implements support for Horizon's Protocol 14 API changes.
  • Loading branch information
tamirms authored Oct 2, 2020
1 parent 467adeb commit 74ea7c3
Show file tree
Hide file tree
Showing 89 changed files with 4,999 additions and 197 deletions.
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ dependencies {
compile 'com.google.code.gson:gson:2.8.5'
compile 'commons-io:commons-io:2.6'
compile 'net.i2p.crypto:eddsa:0.3.0'

compile 'org.threeten:threetenbp:1.4.4'

testCompile 'org.mockito:mockito-core:2.21.0'
testCompile "com.squareup.okhttp3:mockwebserver:${okhttpclientVersion}"
testCompile 'junit:junit:4.12'
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/org/stellar/sdk/Asset.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@
public abstract class Asset {
Asset() {}

/**
* Parses an asset string and returns the equivalent Asset instance.
* The asset string is expected to either be "native" or a string of the form "CODE:ISSUER"
*
* @param canonicalForm Canonical string representation of an asset
*/
public static Asset create(String canonicalForm) {
if (canonicalForm.equals("native")) {
return new AssetTypeNative();
}
String [] parts = canonicalForm.split(":");
if (parts.length != 2) {
throw new IllegalArgumentException("invalid asset "+ canonicalForm);
}
return Asset.createNonNativeAsset(parts[0], parts[1]);
}

public static Asset create(String type, String code, String issuer) {
if (type.equals("native")) {
return new AssetTypeNative();
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/stellar/sdk/AssetTypeCreditAlphaNum.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ public String getIssuer() {
return new String(mIssuer);
}

@Override
public String toString() {
return getCode() + ":" + getIssuer();
}

@Override
public int hashCode() {
return Objects.hashCode(this.mCode, this.mIssuer);
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/stellar/sdk/AssetTypeNative.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ public final class AssetTypeNative extends Asset {

public AssetTypeNative() {}

@Override
public String toString() {
return "native";
}

@Override
public String getType() {
return "native";
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/org/stellar/sdk/Claimant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.stellar.sdk;

import com.google.gson.annotations.SerializedName;
import org.stellar.sdk.Predicate;

/**
* Represents an entity who is eligible to claim the claimable balance.
*/
public class Claimant {
@SerializedName("destination")
private final String destination;
@SerializedName("predicate")
private final Predicate predicate;

public Claimant(String destination, Predicate predicate) {
this.destination = destination;
this.predicate = predicate;
}

public String getDestination() {
return destination;
}

public Predicate getPredicate() {
return predicate;
}

}
255 changes: 255 additions & 0 deletions src/main/java/org/stellar/sdk/Predicate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
package org.stellar.sdk;

import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import org.stellar.sdk.xdr.ClaimPredicate;
import org.stellar.sdk.xdr.ClaimPredicateType;
import org.stellar.sdk.xdr.Int64;
import org.threeten.bp.Instant;

import java.util.Date;
import java.util.List;

public abstract class Predicate {

private static List<Predicate> convertXDRPredicates(ClaimPredicate[] predicates) {
List<Predicate> list = Lists.newArrayList();
for (ClaimPredicate p : predicates) {
list.add(fromXdr(p));
}
return list;
}

/**
* Generates Predicate object from a given XDR object
* @param xdr XDR object
*/
public static Predicate fromXdr(org.stellar.sdk.xdr.ClaimPredicate xdr) {
switch (xdr.getDiscriminant()) {
case CLAIM_PREDICATE_UNCONDITIONAL:
return new Unconditional();
case CLAIM_PREDICATE_AND:
return new And(convertXDRPredicates(xdr.getAndPredicates()));
case CLAIM_PREDICATE_OR:
return new Or(convertXDRPredicates(xdr.getOrPredicates()));
case CLAIM_PREDICATE_NOT:
return new Not(fromXdr(xdr.getNotPredicate()));
case CLAIM_PREDICATE_BEFORE_RELATIVE_TIME:
return new RelBefore(xdr.getRelBefore().getInt64());
case CLAIM_PREDICATE_BEFORE_ABSOLUTE_TIME:
return new AbsBefore(xdr.getAbsBefore().getInt64());
default:
throw new IllegalArgumentException("Unknown asset type " + xdr.getDiscriminant());
}
}

@Override
public abstract boolean equals(Object object);

/**
* Generates XDR object from a given Asset object
*/
public abstract org.stellar.sdk.xdr.ClaimPredicate toXdr();

public static class Unconditional extends Predicate {
@Override
public boolean equals(Object o) {
return (this == o) || (getClass() == o.getClass());
}

@Override
public int hashCode() {
return 0;
}

@Override
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_UNCONDITIONAL);
return xdr;
}
}

public static class Not extends Predicate {
private final Predicate inner;
public Not(Predicate inner) {
this.inner = inner;
}

public Predicate getInner() {
return inner;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
return (getClass() == o.getClass()) && Objects.equal(inner, ((Not)o).inner);
}

@Override
public int hashCode() {
return Objects.hashCode(inner);
}

@Override
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_NOT);
xdr.setNotPredicate(inner.toXdr());
return xdr;
}
}

public static class Or extends Predicate {
private final List<Predicate> inner;

public Or(List<Predicate> inner) {
this.inner = inner;
}

public List<Predicate> getInner() {
return inner;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
return (getClass() == o.getClass()) && Objects.equal(inner, ((Or)o).inner);
}

@Override
public int hashCode() {
return Objects.hashCode(inner);
}

@Override
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_OR);
ClaimPredicate[] xdrInner = new ClaimPredicate[inner.size()];
for (int i = 0; i < inner.size(); i++) {
xdrInner[i] = inner.get(i).toXdr();
}
xdr.setOrPredicates(xdrInner);
return xdr;
}
}


public static class And extends Predicate {
private final List<Predicate> inner;

public And(List<Predicate> inner) {
this.inner = inner;
}

public List<Predicate> getInner() {
return inner;
}


@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
return (getClass() == o.getClass()) && Objects.equal(inner, ((And)o).inner);
}

@Override
public int hashCode() {
return Objects.hashCode(inner);
}

@Override
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_AND);
ClaimPredicate[] xdrInner = new ClaimPredicate[inner.size()];
for (int i = 0; i < inner.size(); i++) {
xdrInner[i] = inner.get(i).toXdr();
}
xdr.setAndPredicates(xdrInner);
return xdr;
}
}

public static class AbsBefore extends Predicate {
private final long epochSeconds;

public AbsBefore(long epochSeconds) {
this.epochSeconds = epochSeconds;
}

public long getTimestampSeconds() {
return epochSeconds;
}

public Instant getDate() {
return Instant.ofEpochSecond(epochSeconds);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
return (getClass() == o.getClass()) && Objects.equal(epochSeconds, ((AbsBefore)o).epochSeconds);
}

@Override
public int hashCode() {
return Objects.hashCode(epochSeconds);
}

@Override
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_BEFORE_ABSOLUTE_TIME);
Int64 t = new Int64();
t.setInt64(epochSeconds);
xdr.setAbsBefore(t);
return xdr;
}
}

public static class RelBefore extends Predicate {
private final long secondsSinceClose;

public RelBefore(long secondsSinceClose) {
this.secondsSinceClose = secondsSinceClose;
}

public long getSecondsSinceClose() {
return secondsSinceClose;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
return (getClass() == o.getClass()) && Objects.equal(secondsSinceClose, ((RelBefore)o).secondsSinceClose);
}

@Override
public int hashCode() {
return Objects.hashCode(secondsSinceClose);
}

@Override
public ClaimPredicate toXdr() {
org.stellar.sdk.xdr.ClaimPredicate xdr = new org.stellar.sdk.xdr.ClaimPredicate();
xdr.setDiscriminant(ClaimPredicateType.CLAIM_PREDICATE_BEFORE_RELATIVE_TIME);
Int64 t = new Int64();
t.setInt64(secondsSinceClose);
xdr.setRelBefore(t);
return xdr;
}
}

}
7 changes: 7 additions & 0 deletions src/main/java/org/stellar/sdk/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,13 @@ public AssetsRequestBuilder assets() {
return new AssetsRequestBuilder(httpClient, serverURI);
}

/**
* Returns {@link ClaimableBalancesRequestBuilder} instance.
*/
public ClaimableBalancesRequestBuilder claimableBalances() {
return new ClaimableBalancesRequestBuilder(httpClient, serverURI);
}

/**
* Returns {@link EffectsRequestBuilder} instance.
*/
Expand Down
Loading

0 comments on commit 74ea7c3

Please sign in to comment.