org.fisco.bcos.web3j.tx.Transfer Maven / Gradle / Ivy
package org.fisco.bcos.web3j.tx;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.fisco.bcos.web3j.crypto.Credentials;
import org.fisco.bcos.web3j.protocol.Web3j;
import org.fisco.bcos.web3j.protocol.core.methods.response.TransactionReceipt;
import org.fisco.bcos.web3j.protocol.exceptions.TransactionException;
import org.fisco.bcos.web3j.protocol.exceptions.TransactionTimeoutException;
import org.fisco.bcos.web3j.utils.Async;
import org.fisco.bcos.web3j.utils.Convert;
import org.fisco.bcos.web3j.utils.Numeric;
/** Class for performing Ether transactions on the Ethereum blockchain. */
public class Transfer extends ManagedTransaction {
// This is the cost to send Ether between parties
public static final BigInteger GAS_LIMIT = BigInteger.valueOf(21000);
public static final BigInteger GAS_PRICE = BigInteger.valueOf(1);
public Transfer(Web3j web3j, TransactionManager transactionManager) {
super(web3j, transactionManager);
}
/**
* Given the duration required to execute a transaction, asyncronous execution is strongly
* recommended via {@link Transfer#sendFundsAsync(String, BigDecimal, Convert.Unit)}.
*
* @param toAddress destination address
* @param value amount to send
* @param unit of specified send
* @return {@link Optional} containing our transaction receipt
* @throws ExecutionException if the computation threw an exception
* @throws InterruptedException if the current thread was interrupted while waiting
* @throws TransactionTimeoutException if the transaction was not mined while waiting
*/
private TransactionReceipt send(String toAddress, BigDecimal value, Convert.Unit unit)
throws IOException, TransactionException {
return send(toAddress, value, unit, GAS_PRICE, GAS_LIMIT);
}
private TransactionReceipt send(
String toAddress,
BigDecimal value,
Convert.Unit unit,
BigInteger gasPrice,
BigInteger gasLimit)
throws IOException, TransactionException {
BigDecimal weiValue = Convert.toWei(value, unit);
if (!Numeric.isIntegerValue(weiValue)) {
throw new UnsupportedOperationException(
"Non decimal Wei value provided: "
+ value
+ " "
+ unit.toString()
+ " = "
+ weiValue
+ " Wei");
}
String resolvedAddress = cnsService.getAddressByContractNameAndVersion(toAddress);
return send(resolvedAddress, "", weiValue.toBigIntegerExact(), gasPrice, gasLimit);
}
public static TransactionReceipt sendFunds(
Web3j web3j, Credentials credentials, String toAddress, BigDecimal value, Convert.Unit unit)
throws IOException, TransactionException {
TransactionManager transactionManager = new RawTransactionManager(web3j, credentials);
return new Transfer(web3j, transactionManager).send(toAddress, value, unit);
}
/**
* Execute the provided function as a transaction asynchronously. This is intended for one-off
* fund transfers. For multiple, create an instance.
*
* @param toAddress destination address
* @param value amount to send
* @param unit of specified send
* @return {@link Future} containing executing transaction
*/
public Future sendFundsAsync(
String toAddress, BigDecimal value, Convert.Unit unit) {
return Async.run(() -> send(toAddress, value, unit));
}
public Future sendFundsAsync(
String toAddress,
BigDecimal value,
Convert.Unit unit,
BigInteger gasPrice,
BigInteger gasLimit) {
return Async.run(() -> send(toAddress, value, unit, gasPrice, gasLimit));
}
public static Future sendFundsAsync(
Web3j web3j, Credentials credentials, String toAddress, BigDecimal value, Convert.Unit unit)
throws InterruptedException, ExecutionException, TransactionTimeoutException {
TransactionManager transactionManager = new RawTransactionManager(web3j, credentials);
return new Transfer(web3j, transactionManager).sendFundsAsync(toAddress, value, unit);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy