From c194fa54a13eacffde902df8e06758ddec951c4c Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Thu, 18 Jul 2024 09:42:53 +0800
Subject: [PATCH] 逻辑

---
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java |  118 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 102 insertions(+), 16 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 d6e8e84..6a2825f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -1,10 +1,10 @@
 package cc.mrbird.febs.dapp.chain;
 
-import cn.hutool.core.util.HexUtil;
+import cc.mrbird.febs.common.contants.AppContants;
+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 +12,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 +31,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;
 
@@ -184,16 +190,17 @@
     }
 
     public String getGas() {
-        String gas;
-        if (url.contains("infura.io")) {
-            String resp = HttpUtil.get("https://etherscan.io/autoUpdateGasTracker.ashx?sid=75f30b765180f29e2b7584b8501c9124");
-            JSONObject data = JSONObject.parseObject(resp);
-            gas = data.getString("avgPrice");
-        } else {
-            String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle");
-            JSONObject data = JSONObject.parseObject(resp);
-            gas = data.getString("FastGasPrice");
-        }
+
+        String gas = "1";
+//        if (url.contains("infura.io")) {
+//            String resp = HttpUtil.get("https://etherscan.io/autoUpdateGasTracker.ashx?sid=75f30b765180f29e2b7584b8501c9124");
+//            JSONObject data = JSONObject.parseObject(resp);
+//            gas = data.getString("avgPrice");
+//        } else {
+//            String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle");
+//            JSONObject data = JSONObject.parseObject(resp);
+//            gas = data.getString("FastGasPrice");
+//        }
         return StrUtil.isBlank(gas) ? "35" : gas;
     }
 
@@ -362,6 +369,35 @@
     }
 
     @Override
+    public BigInteger totalSupplyNFT() {
+        try {
+            String methodName = "totalSupply";
+            List<Type> inputParameters = new ArrayList<>();
+            List<TypeReference<?>> outputParameters = new ArrayList<>();
+            TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {
+            };
+            outputParameters.add(typeReference);
+            Function function = new Function(methodName, inputParameters, outputParameters);
+            String data = FunctionEncoder.encode(function);
+            Transaction transaction = Transaction.createEthCallTransaction(null, contractAddress, data);
+
+            EthCall ethCall;
+            BigInteger totalSupply = BigInteger.ZERO;
+            try {
+                ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
+                List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
+                totalSupply = (BigInteger) results.get(0).getValue();
+                return totalSupply;
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return BigInteger.ZERO;
+    }
+
+    @Override
     public String safeMintNFT(String toAddress) {
         String gas = getGas();
 
@@ -396,4 +432,54 @@
             return "";
         }
     }
+
+    @Override
+    public void transferList(List<BatchTransferDto> batchTransferDtos) {
+        String gas = getGas();
+        Credentials credentials = Credentials.create(AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString());
+//        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(18));
+            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);
+        }
+
+    }
 }

--
Gitblit v1.9.1