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