KKSU
2024-06-03 8f720d592d6ea2229cac4c051828af39f8425325
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -1,10 +1,9 @@
package cc.mrbird.febs.dapp.chain;
import cn.hutool.core.util.HexUtil;
import cc.mrbird.febs.dapp.dto.BatchTransferDto;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.bouncycastle.jcajce.provider.digest.SHA3;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.TypeReference;
@@ -12,12 +11,17 @@
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.*;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.RawTransaction;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.Request;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.*;
import org.web3j.protocol.core.methods.response.EthBlockNumber;
import org.web3j.protocol.core.methods.response.EthCall;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;
@@ -26,8 +30,9 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -177,8 +182,11 @@
        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * todo 修改了
         */
        int decimal = decimals();
//        int decimal = 8;
        double res = new BigDecimal(decimals).divide(BigDecimal.valueOf(Math.pow(10, decimal)), 8, RoundingMode.HALF_DOWN).doubleValue();
        if (res > 0) {
            return new BigDecimal(res);
@@ -246,6 +254,54 @@
        } catch (ExecutionException | InterruptedException e) {
            e.printStackTrace();
            return "";
        }
    }
    @Override
    public void transferList(List<BatchTransferDto> batchTransferDtos){
        String gas = getGas();
        Credentials credentials = Credentials.create(privateKey);
        BigInteger nonce = null;
        try {
            nonce = web3j.ethGetTransactionCount(credentials.getAddress(), DefaultBlockParameterName.LATEST).send().getTransactionCount();
        } catch (IOException e) {
            e.printStackTrace();
        }
        for(BatchTransferDto batchTransferDto : batchTransferDtos){
            String amount = batchTransferDto.getAmount().toPlainString();
            String toAddress = batchTransferDto.getToAddress();
            BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals()));
            amount = amountPow.toPlainString();
            if (amount.contains(".")) {
                amount = amount.substring(0, amount.lastIndexOf("."));
            }
            Function function = new Function("transfer",
                    Arrays.asList(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();
            try {
                EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            nonce = nonce.add(BigInteger.ONE);
        }
    }
@@ -331,6 +387,43 @@
        }
    }
    public void batchTransfer(List<BatchTransferDto> batchTransferDtos) throws Exception {
        String gas = getGas();
        Credentials credentials = Credentials.create(privateKey);
        BigInteger nonce = web3j.ethGetTransactionCount(credentials.getAddress(), DefaultBlockParameterName.LATEST).send().getTransactionCount();
        for(BatchTransferDto batchTransferDto : batchTransferDtos){
            String amount = batchTransferDto.getAmount().toPlainString();
            String toAddress = batchTransferDto.getToAddress();
            BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals()));
            amount = amountPow.toPlainString();
            if (amount.contains(".")) {
                amount = amount.substring(0, amount.lastIndexOf("."));
            }
            Function function = new Function("transfer",
                    Arrays.asList(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();
            nonce = nonce.add(BigInteger.ONE);
        }
    }
    @Override
    public int allowanceCnt(String address) {
        String allowanceUrl;