tangem-app-android-audited/app/src/main/java/org/stellar/sdk/Operation.java
2019-01-13 15:11:34 +03:00

134 lines
4.3 KiB
Java

package org.stellar.sdk;
import com.google.common.io.BaseEncoding;
import org.stellar.sdk.xdr.AccountID;
import org.stellar.sdk.xdr.XdrDataOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Abstract class for operations.
*/
public abstract class Operation {
Operation() {}
private KeyPair mSourceAccount;
private static final BigDecimal ONE = new BigDecimal(10).pow(7);
protected static long toXdrAmount(String value) {
value = checkNotNull(value, "value cannot be null");
BigDecimal amount = new BigDecimal(value).multiply(Operation.ONE);
return amount.longValueExact();
}
protected static String fromXdrAmount(long value) {
BigDecimal amount = new BigDecimal(value).divide(Operation.ONE);
return amount.toPlainString();
}
/**
* Generates Operation XDR object.
*/
public org.stellar.sdk.xdr.Operation toXdr() {
org.stellar.sdk.xdr.Operation xdr = new org.stellar.sdk.xdr.Operation();
if (getSourceAccount() != null) {
AccountID sourceAccount = new AccountID();
sourceAccount.setAccountID(getSourceAccount().getXdrPublicKey());
xdr.setSourceAccount(sourceAccount);
}
xdr.setBody(toOperationBody());
return xdr;
}
/**
* Returns base64-encoded Operation XDR object.
*/
public String toXdrBase64() {
try {
org.stellar.sdk.xdr.Operation operation = this.toXdr();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
XdrDataOutputStream xdrOutputStream = new XdrDataOutputStream(outputStream);
org.stellar.sdk.xdr.Operation.encode(xdrOutputStream, operation);
BaseEncoding base64Encoding = BaseEncoding.base64();
return base64Encoding.encode(outputStream.toByteArray());
} catch (IOException e) {
throw new AssertionError(e);
}
}
/**
* Returns new Operation object from Operation XDR object.
* @param xdr XDR object
*/
public static Operation fromXdr(org.stellar.sdk.xdr.Operation xdr) {
org.stellar.sdk.xdr.Operation.OperationBody body = xdr.getBody();
Operation operation;
switch (body.getDiscriminant()) {
case CREATE_ACCOUNT:
operation = new CreateAccountOperation.Builder(body.getCreateAccountOp()).build();
break;
case PAYMENT:
operation = new PaymentOperation.Builder(body.getPaymentOp()).build();
break;
case PATH_PAYMENT:
operation = new PathPaymentOperation.Builder(body.getPathPaymentOp()).build();
break;
case MANAGE_OFFER:
operation = new ManageOfferOperation.Builder(body.getManageOfferOp()).build();
break;
case CREATE_PASSIVE_OFFER:
operation = new CreatePassiveOfferOperation.Builder(body.getCreatePassiveOfferOp()).build();
break;
case SET_OPTIONS:
operation = new SetOptionsOperation.Builder(body.getSetOptionsOp()).build();
break;
case CHANGE_TRUST:
operation = new ChangeTrustOperation.Builder(body.getChangeTrustOp()).build();
break;
case ALLOW_TRUST:
operation = new AllowTrustOperation.Builder(body.getAllowTrustOp()).build();
break;
case ACCOUNT_MERGE:
operation = new AccountMergeOperation.Builder(body).build();
break;
case MANAGE_DATA:
operation = new ManageDataOperation.Builder(body.getManageDataOp()).build();
break;
case BUMP_SEQUENCE:
operation = new BumpSequenceOperation.Builder(body.getBumpSequenceOp()).build();
break;
default:
throw new RuntimeException("Unknown operation body " + body.getDiscriminant());
}
if (xdr.getSourceAccount() != null) {
operation.setSourceAccount(KeyPair.fromXdrPublicKey(xdr.getSourceAccount().getAccountID()));
}
return operation;
}
/**
* Returns operation source account.
*/
public KeyPair getSourceAccount() {
return mSourceAccount;
}
/**
* Sets operation source account.
* @param keypair
*/
void setSourceAccount(KeyPair keypair) {
mSourceAccount = checkNotNull(keypair, "keypair cannot be null");
}
/**
* Generates OperationBody XDR object
* @return OperationBody XDR object
*/
abstract org.stellar.sdk.xdr.Operation.OperationBody toOperationBody();
}