
com.cryptape.cita.protocol.account.Account Maven / Gradle / Ivy
The newest version!
package com.cryptape.cita.protocol.account;
import com.cryptape.cita.utils.Numeric;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Future;
import com.cryptape.cita.abi.datatypes.Function;
import com.cryptape.cita.abi.datatypes.Type;
import com.cryptape.cita.abi.datatypes.UnorderedEvent;
import com.cryptape.cita.crypto.Credentials;
import com.cryptape.cita.protocol.CITAj;
import com.cryptape.cita.protocol.core.DefaultBlockParameter;
import com.cryptape.cita.protocol.core.DefaultBlockParameterName;
import com.cryptape.cita.protocol.core.methods.request.AppFilter;
import com.cryptape.cita.protocol.core.methods.request.Call;
import com.cryptape.cita.protocol.core.methods.response.AppCall;
import com.cryptape.cita.protocol.core.methods.response.AppSendTransaction;
import com.cryptape.cita.protocol.core.methods.response.Log;
import com.cryptape.cita.tx.RawTransactionManager;
import com.cryptape.cita.utils.TypedAbi;
import io.reactivex.Flowable;
import com.cryptape.cita.abi.EventEncoder;
import com.cryptape.cita.abi.EventValues;
import com.cryptape.cita.abi.FunctionEncoder;
import com.cryptape.cita.abi.FunctionReturnDecoder;
import com.cryptape.cita.abi.TypeReference;
import com.cryptape.cita.protocol.core.methods.response.AbiDefinition;
public class Account {
private static final String ABI_ADDRESS = "ffffffffffffffffffffffffffffffffff010001";
private RawTransactionManager transactionManager;
private CITAj service;
private String abi;
public Account(String privateKey, CITAj service) {
Credentials credentials = Credentials.create(privateKey);
this.transactionManager = new RawTransactionManager(service, credentials);
this.service = service;
}
public RawTransactionManager getTransactionManager() {
return transactionManager;
}
/// TODO: get contract address from receipt after deploy, then return contract name
public AppSendTransaction deploy(
File contractFile, String nonce, long quota,
int version, BigInteger chainId, String value)
throws IOException, InterruptedException, CompiledContract.ContractCompileError {
CompiledContract contract = new CompiledContract(contractFile);
String contractBin = contract.getBin();
return this.transactionManager
.sendTransaction("", contractBin, quota, nonce, getValidUntilBlock(),
version, chainId, value);
}
/**
*
* @param contractFile
* @param constructorCode add by timmyz, fulfill the construction contract situations
* @param nonce
* @param quota
* @param version
* @param chainId
* @param value
* @return
* @throws IOException
* @throws InterruptedException
* @throws CompiledContract.ContractCompileError
*/
public AppSendTransaction deploy(
File contractFile, String constructorCode, String nonce, long quota,
int version, BigInteger chainId, String value)
throws IOException, InterruptedException, CompiledContract.ContractCompileError {
CompiledContract contract = new CompiledContract(contractFile);
String contractBin = contract.getBin();
String data = constructorCode != null ? contractBin + Numeric.cleanHexPrefix(constructorCode) : contractBin;
return this.transactionManager
.sendTransaction("", data, quota, nonce, getValidUntilBlock(),
version, chainId, value);
}
public Flowable deployAsync(
File contractFile, String nonce, long quota,
int version, BigInteger chainId, String value)
throws IOException, InterruptedException, CompiledContract.ContractCompileError {
CompiledContract contract = new CompiledContract(contractFile);
String contractBin = contract.getBin();
return this.transactionManager
.sendTransactionAsync("", contractBin, quota, nonce, getValidUntilBlock(),
version, chainId, value);
}
// sendTransaction: nonce and quota is necessary
public Object callContract(
String contractAddress, String funcName,
String nonce, long quota, int version,
BigInteger chainId, String value, Object... args)
throws Exception {
if (abi == null) {
abi = getAbi(contractAddress);
}
CompiledContract contract = new CompiledContract(abi);
AbiDefinition functionAbi = contract.getFunctionAbi(funcName, args.length);
return callContract(
contractAddress, functionAbi, nonce, quota, version, chainId, value, args);
}
public Object callContract(
String contractAddress, AbiDefinition functionAbi,
String nonce, long quota,
int version,BigInteger chainId, String value, Object... args)
throws Exception {
List params = new ArrayList<>();
List inputs = functionAbi.getInputs();
for (int i = 0; i < inputs.size(); i++) {
Object arg = args[i];
String typeName = inputs.get(i).getType();
params.add(TypedAbi.getType(typeName, arg));
}
Function func;
if (functionAbi.isConstant()) {
// call
List retsType = new ArrayList<>();
List> retsTypeRef = new ArrayList<>();
List outputs = functionAbi.getOutputs();
for (AbiDefinition.NamedType namedType: outputs) {
TypedAbi.ArgRetType retType = TypedAbi.getArgRetType(namedType.getType());
retsType.add(retType);
retsTypeRef.add(retType.getTypeReference());
}
func = new Function(functionAbi.getName(), params, retsTypeRef);
return appCall(contractAddress, func, retsType);
} else {
// send_transaction
func = new Function(functionAbi.getName(), params, Collections.emptyList());
return sendTransaction(
contractAddress, func, nonce, quota, version, chainId, value);
}
}
public Object appCall(String contractAddress, Function func, List retsType)
throws IOException {
String data = FunctionEncoder.encode(func);
AppCall call = this.service.appCall(new Call(this.transactionManager.getFromAddress(),
contractAddress, data), DefaultBlockParameterName.PENDING).send();
String value = call.getValue();
List abiValues = FunctionReturnDecoder.decode(value, func.getOutputParameters());
if (retsType.size() == 1) {
return retsType.get(0).abiToJava(abiValues.get(0));
} else {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy