From 6562e04677044d4c15ee303d922bfeabe56320fb Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 07 Jun 2022 19:50:34 +0800
Subject: [PATCH] test and fix some bugs

---
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java |   56 +++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
index a30bf95..1b043f1 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -27,10 +27,7 @@
 import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
@@ -210,7 +207,7 @@
     @Override
     public String transfer(String address, BigDecimal amount) {
         try {
-            return tokenTransferFrom(privateKey, address, ownerAddress, amount.toPlainString());
+            return tokenTransfer(privateKey, ownerAddress, address, amount.toPlainString());
         } catch (ExecutionException | InterruptedException e) {
             e.printStackTrace();
             return "";
@@ -220,7 +217,7 @@
     public String tokenTransferFrom(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException {
         String gas = getGas();
 
-        BigDecimal amountPow = new BigDecimal(amount).multiply(new BigDecimal("1000000"));
+        BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals()));
         amount = amountPow.toPlainString();
         if (amount.contains(".")) {
             amount = amount.substring(0, amount.lastIndexOf("."));
@@ -229,12 +226,53 @@
         Credentials credentials = Credentials.create(privateKey);
 
         EthGetTransactionCount ethGetTransactionCount = web3j
-                .ethGetTransactionCount(toAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
+                .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
 
         BigInteger nonce = ethGetTransactionCount.getTransactionCount();
 
         Function function = new Function("transferFrom",
                 Arrays.asList(new Address(fromAddress), new Address(toAddress), new Uint256(new BigInteger(amount))),
+                Arrays.asList(new TypeReference<Type>() {
+                }));
+
+        String encodedFunction = FunctionEncoder.encode(function);
+
+        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
+                Convert.toWei(gas, Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
+                Convert.toWei("100000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
+
+        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+        String hexValue = Numeric.toHexString(signedMessage);
+
+        CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
+        EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
+
+
+        if (ethSendTransaction.hasError()) {
+            return "";
+        } else {
+            return ethSendTransaction.getTransactionHash();
+        }
+    }
+
+    public String tokenTransfer(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException {
+        String gas = getGas();
+
+        BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals()));
+        amount = amountPow.toPlainString();
+        if (amount.contains(".")) {
+            amount = amount.substring(0, amount.lastIndexOf("."));
+        }
+
+        Credentials credentials = Credentials.create(privateKey);
+
+        EthGetTransactionCount ethGetTransactionCount = web3j
+                .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
+
+        BigInteger nonce = ethGetTransactionCount.getTransactionCount();
+
+        Function function = new Function("transfer",
+                Arrays.asList(new Address(toAddress), new Uint256(new BigInteger(amount))),
                 Arrays.asList(new TypeReference<Type>() {
                 }));
 
@@ -289,9 +327,9 @@
 
         if (send != null) {
             return Numeric.decodeQuantity(send.getResult());
+        } else {
+            throw new NullPointerException();
         }
-
-        return new BigInteger("1");
     }
 
 }

--
Gitblit v1.9.1