Skip to content

Commit

Permalink
<feat>(command): add transfer impl. (#805)
Browse files Browse the repository at this point in the history
  • Loading branch information
kyonRay authored Dec 1, 2023
1 parent 54a282a commit 5cc07a1
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/integration-test/java/console/ConsoleClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,10 @@ public void clientWithParamsTest() throws Exception {
String[] txHashParams = {"", transactionHash};
// tx
consoleClientFace.getTransactionByHash(txHashParams);
Assert.assertTrue(log.getLog().contains("hash='" + transactionHash + "'"));
Assert.assertTrue(log.getLog().contains(transactionHash));
log.clearLog();
consoleClientFace.getTransactionByHashWithProof(txHashParams);
Assert.assertTrue(log.getLog().contains("hash='" + transactionHash + "'"));
Assert.assertTrue(log.getLog().contains(transactionHash));
log.clearLog();

// receipt
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/console/command/category/ContractOpCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,19 @@ public static void setIsWasm(boolean wasm) {
2,
true);

public static final CommandInfo TRANSFER =
new CommandInfo(
"transfer",
"Transfer token to a specified address",
HelpInfo::transferHelp,
(consoleInitializer, params, pwd) ->
consoleInitializer
.getConsoleContractFace()
.transfer(consoleInitializer, params),
2,
3,
true);

static {
Field[] fields = ContractOpCommand.class.getDeclaredFields();
for (Field field : fields) {
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/console/command/model/HelpInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,17 @@ public static void listDeployContractAddressHelp() {
"recordNumber -- (optional) The number of deployed contract records, (default 20).");
}

public static void transferHelp() {
System.out.println("Transfer token to a specified address");
System.out.println("Usage: \ntransfer toAddress amount [unit]");
System.out.println("* toAddress -- The address of the receiver.");
System.out.println("* amount -- The amount of token to transfer.");
System.out.println(
"* unit -- (optional) The unit of amount, default is wei, support \"wei\", \"kwei\", \"mwei\", \"gwei\", \"szabo\", \"finney\", \"ether\", \"kether\", \"mether\", \"gether\".");
System.out.println(
"[Note]: 1 ether = 10^18 wei = 10^15 kwei = 10^12 mwei = 10^9 gwei = 10^6 szabo = 10^3 finney");
}

public static void startHelp() {
System.out.println("Please provide one of the following ways to start the console.");
System.out.println("Usage: ");
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/console/common/ConsoleUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@ public static boolean isInvalidHash(String hash) {
}
}

public static boolean isValidNumber(String number) {
return number.matches("^-?\\d+$") || number.matches("^0[xX][0-9a-fA-F]+$");
}

public static String[] fixedBfsParams(String[] params, String pwd) throws Exception {
String[] fixedParams = new String[params.length];
fixedParams[0] = params[0];
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/console/contract/ConsoleContractFace.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ void listAbi(ConsoleInitializer consoleInitializer, String[] params, String pwd)

void listDeployContractAddress(ConsoleInitializer consoleInitializer, String[] params)
throws Exception;

void transfer(ConsoleInitializer consoleInitializer, String[] params) throws Exception;
}
52 changes: 52 additions & 0 deletions src/main/java/console/contract/ConsoleContractImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
Expand Down Expand Up @@ -52,12 +53,16 @@
import org.fisco.bcos.sdk.v3.model.EnumNodeVersion;
import org.fisco.bcos.sdk.v3.model.PrecompiledRetCode;
import org.fisco.bcos.sdk.v3.model.RetCode;
import org.fisco.bcos.sdk.v3.model.TransactionReceipt;
import org.fisco.bcos.sdk.v3.transaction.manager.AssembleTransactionProcessorInterface;
import org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessorFactory;
import org.fisco.bcos.sdk.v3.transaction.manager.Transactionv2.ProxySignTransactionManager;
import org.fisco.bcos.sdk.v3.transaction.manager.Transactionv2.TransferTransactionService;
import org.fisco.bcos.sdk.v3.transaction.model.dto.CallResponse;
import org.fisco.bcos.sdk.v3.transaction.model.dto.TransactionResponse;
import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException;
import org.fisco.bcos.sdk.v3.transaction.model.exception.TransactionBaseException;
import org.fisco.bcos.sdk.v3.transaction.tools.Convert;
import org.fisco.bcos.sdk.v3.utils.AddressUtils;
import org.fisco.bcos.sdk.v3.utils.Hex;
import org.fisco.bcos.sdk.v3.utils.Numeric;
Expand All @@ -73,6 +78,7 @@ public class ConsoleContractImpl implements ConsoleContractFace {

private final Client client;
private final AssembleTransactionProcessorInterface assembleTransactionProcessor;
private final TransferTransactionService transferTransactionService;
private final BFSService bfsService;

public ConsoleContractImpl(Client client) {
Expand All @@ -82,6 +88,9 @@ public ConsoleContractImpl(Client client) {
TransactionProcessorFactory.createAssembleTransactionProcessor(
client, cryptoKeyPair);
this.bfsService = new BFSService(client, cryptoKeyPair);
ProxySignTransactionManager proxySignTransactionManager =
new ProxySignTransactionManager(client);
transferTransactionService = new TransferTransactionService(proxySignTransactionManager);
}

@Override
Expand Down Expand Up @@ -888,6 +897,49 @@ public void listDeployContractAddress(ConsoleInitializer consoleInitializer, Str
}
}

@Override
public void transfer(ConsoleInitializer consoleInitializer, String[] params) throws Exception {
String address = params[1];
String amount = params[2];

Convert.Unit unit = Convert.Unit.WEI;
if (params.length == 4) {
String unitStr = params[3];
unit = Convert.Unit.fromString(unitStr);
}
if (!AddressUtils.isValidAddress(address)) {
System.out.println("Invalid contract address: " + address);
return;
}
if (!ConsoleUtils.isValidNumber(amount)) {
System.out.println("Invalid amount: " + amount);
return;
}
BigDecimal value = new BigDecimal(amount);
if (value.compareTo(BigDecimal.ZERO) < 0) {
System.out.println("Invalid amount: " + amount);
return;
}
if (value.compareTo(BigDecimal.ZERO) == 0) {
System.out.println("Amount is zero, no need to transfer.");
return;
}
TransactionReceipt transactionReceipt =
transferTransactionService.sendFunds(address, value, unit);
System.out.println("transaction hash: " + transactionReceipt.getTransactionHash());
ConsoleUtils.singleLine();
System.out.println("transaction status: " + transactionReceipt.getStatus());

ConsoleUtils.singleLine();
if (transactionReceipt.getStatus() == 0) {
System.out.println("description: transaction executed successfully");
System.out.println(
transactionReceipt.getFrom() + " => " + address + ", " + amount + " " + unit);
} else {
System.out.println("description: transfer transaction failed");
}
}

private String getSolidityAbi(String contractFileName) throws Exception {
String contractFilePath = contractFileName;
if (!contractFilePath.endsWith(ConsoleUtils.SOL_SUFFIX)) {
Expand Down

0 comments on commit 5cc07a1

Please sign in to comment.