From 143d77c6b6de760304e8fdcf094452097c98842c Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Fri, 18 Mar 2022 18:24:44 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletCoinDao.java           |   10 
 src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java          |    9 
 src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java        |   24 +
 src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java |   50 ++
 src/main/java/cc/mrbird/febs/dapp/entity/DappWalletMineEntity.java        |   24 +
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |   82 ++++
 src/main/java/cc/mrbird/febs/common/authentication/ShiroConfig.java       |    1 
 pom.xml                                                                   |   41 ++
 src/main/java/cc/mrbird/febs/dapp/controller/DappController.java          |  108 +++++
 src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java            |   41 ++
 src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java          |   12 
 src/main/resources/mapper/dapp/DappMemberDao.xml                          |   12 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java               |   16 
 src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java        |   14 
 src/main/java/cc/mrbird/febs/common/utils/ShareCodeUtil.java              |  118 ++++++
 src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java      |   49 ++
 src/main/resources/mapper/dapp/DappWalletMineDao.xml                      |    8 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |   42 ++
 src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java           |   10 
 src/main/java/cc/mrbird/febs/dapp/dto/WalletOperateDto.java               |   20 +
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |  282 ++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java                     |   24 +
 src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java     |   42 ++
 lib/tron-sdk.jar                                                          |    0 
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java             |    4 
 src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java                    |   25 +
 src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java              |   19 +
 src/main/resources/mapper/dapp/DappWalletCoinDao.xml                      |    8 
 28 files changed, 1,091 insertions(+), 4 deletions(-)

diff --git a/lib/tron-sdk.jar b/lib/tron-sdk.jar
new file mode 100644
index 0000000..88e4298
--- /dev/null
+++ b/lib/tron-sdk.jar
Binary files differ
diff --git a/pom.xml b/pom.xml
index b165544..d542ad4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -304,6 +304,47 @@
             <scope>system</scope>
             <systemPath>${basedir}/lib/core-0.3.0.jar</systemPath>
         </dependency>
+
+        <dependency>
+            <groupId>ztron-sdk</groupId>
+            <artifactId>ztron-sdk</artifactId>
+            <version>0.0.1</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/lib/tron-sdk.jar</systemPath>
+        </dependency>
+
+        <dependency>
+            <groupId>org.web3j</groupId>
+            <artifactId>core</artifactId>
+            <version>4.5.5</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.6.0</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/logging-interceptor -->
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>logging-interceptor</artifactId>
+            <version>3.6.0</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.web3j/parity -->
+        <dependency>
+            <groupId>org.web3j</groupId>
+            <artifactId>parity</artifactId>
+            <version>4.5.10</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>core</artifactId>
+                    <groupId>org.web3j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/cc/mrbird/febs/common/authentication/ShiroConfig.java b/src/main/java/cc/mrbird/febs/common/authentication/ShiroConfig.java
index a2d416d..1a87fb6 100644
--- a/src/main/java/cc/mrbird/febs/common/authentication/ShiroConfig.java
+++ b/src/main/java/cc/mrbird/febs/common/authentication/ShiroConfig.java
@@ -95,6 +95,7 @@
 
         // 排除手机api请求链接
         filterChainDefinitionMap.put("/api/**", "anon");
+        filterChainDefinitionMap.put("/dapp/**", "anon");
 
         filterChainDefinitionMap.put("/swagger-ui.html/**", "anon");
         filterChainDefinitionMap.put("/swagger-resources/**", "anon");
diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
index 42e6503..7f7876e 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
+++ b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.common.configure;
 
+import cc.mrbird.febs.common.interceptor.DappInterceptor;
 import cc.mrbird.febs.common.interceptor.LoginInterceptor;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
@@ -15,9 +16,14 @@
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        InterceptorRegistration registration = registry.addInterceptor(new LoginInterceptor());
-        registration.addPathPatterns("/api/**");
-        registration.excludePathPatterns("/api/common/**");
-        registration.excludePathPatterns("/trx/**");
+//        InterceptorRegistration registration = registry.addInterceptor(new LoginInterceptor());
+//        registration.addPathPatterns("/api/**");
+//        registration.addPathPatterns("/dapp/**");
+//        registration.excludePathPatterns("/api/common/**");
+
+
+        InterceptorRegistration registration = registry.addInterceptor(new DappInterceptor());
+        registration.addPathPatterns("/dapp/**");
+        registration.excludePathPatterns("/dapp/common/**");
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
index c63927d..1477082 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -79,4 +79,8 @@
 
     public static final String TRX_PRIVATE_KEY = "7a1cdc7aa2976b16cfc79ed8310b1fb53a85780dd27574fa6c5eb7c2aceaa6ae";
 
+
+    public static final int INT_FLAG_Y = 1;
+
+    public static final int INT_FLAG_N = 2;
 }
diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
new file mode 100644
index 0000000..e0ff513
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
@@ -0,0 +1,49 @@
+package cc.mrbird.febs.common.interceptor;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.common.utils.SpringContextUtil;
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+public class DappInterceptor implements HandlerInterceptor {
+
+    private final DappMemberDao dappMemberDao = SpringContextUtil.getBean(DappMemberDao.class);
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        String headAddress = request.getHeader("address");
+
+        if (StrUtil.isBlank(headAddress)) {
+            responseUnAuth(response);
+            return false;
+        }
+
+        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress);
+        if (memberEntity == null) {
+            responseUnAuth(response);
+            return false;
+        }
+
+        request.getSession().setAttribute("member", memberEntity);
+        return true;
+    }
+
+    private void responseUnAuth(HttpServletResponse response) throws IOException {
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        response.getWriter().write(new ObjectMapper().writeValueAsString(new FebsResponse().code(HttpStatus.UNAUTHORIZED)));
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
new file mode 100644
index 0000000..7ffee3b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.common.utils;
+
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author wzy
+ * @date 2022-03-18
+ **/
+public class LoginUserUtil {
+
+    public static DappMemberEntity getAppUser() {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
+        return (DappMemberEntity) request.getSession().getAttribute("member");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/utils/ShareCodeUtil.java b/src/main/java/cc/mrbird/febs/common/utils/ShareCodeUtil.java
new file mode 100644
index 0000000..ba2f144
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/utils/ShareCodeUtil.java
@@ -0,0 +1,118 @@
+package cc.mrbird.febs.common.utils;
+
+import java.util.Random;
+
+/**
+ * 邀请码生成器,算法原理:<br/>
+ * 1) 获取id: 1127738 <br/>
+ * 2) 使用自定义进制转为:gpm6 <br/>
+ * 3) 转为字符串,并在后面加'o'字符:gpm6o <br/>
+ * 4)在后面随机产生若干个随机数字字符:gpm6o7 <br/>
+ * 转为自定义进制后就不会出现o这个字符,然后在后面加个'o',这样就能确定唯一性。最后在后面产生一些随机字符进行补全。<br/>
+ */
+public class ShareCodeUtil {
+
+    /**
+     * 自定义进制(0,1没有加入,容易与o,l混淆)
+     */
+//    private static final char[] r=new char[]{'q', 'w', 'e', '8', 'a', 's', '2', 'd', 'z', 'x', '9', 'c', '7', 'p', '5', 'i', 'k', '3', 'm', 'j', 'u', 'f', 'r', '4', 'v', 'y', 'l', 't', 'n', '6', 'b', 'g', 'h'};
+    private static final char[] r = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9'};
+
+    /**
+     * (不能与自定义进制有重复)
+     */
+    private static final char b = '0';
+
+    /**
+     * 进制长度
+     */
+    private static final int binLen = r.length;
+
+    /**
+     * 序列最小长度
+     */
+    private static final int s = 8;
+
+    /**
+     * 根据ID生成六位随机码
+     *
+     * @param id ID
+     * @return 随机码
+     */
+    public static String toSerialCode(long id) {
+        char[] buf = new char[32];
+        int charPos = 32;
+
+        while ((id / binLen) > 0) {
+            int ind = (int) (id % binLen);
+            buf[--charPos] = r[ind];
+            id /= binLen;
+        }
+        buf[--charPos] = r[(int) (id % binLen)];
+        String str = new String(buf, charPos, (32 - charPos));
+        // 不够长度的自动随机补全
+        if (str.length() < s) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(b);
+            Random rnd = new Random();
+            for (int i = 1; i < s - str.length(); i++) {
+                sb.append(r[rnd.nextInt(binLen)]);
+            }
+            str += sb.toString();
+        }
+        return str;
+    }
+
+    /**
+     * 根据ID生成六位随机码
+     *
+     * @param id ID
+     * @return 随机码
+     */
+    public static String toSerialNumberCode(long id) {
+        char[] buf = new char[32];
+        int charPos = 32;
+
+        while ((id / binLen) > 0) {
+            int ind = (int) (id % binLen);
+            buf[--charPos] = r[ind];
+            id /= binLen;
+        }
+        buf[--charPos] = r[(int) (id % binLen)];
+        String str = new String(buf, charPos, (32 - charPos));
+        // 不够长度的自动随机补全
+        if (str.length() < s) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(b);
+            Random rnd = new Random();
+            for (int i = 1; i < s - str.length(); i++) {
+                sb.append(r[rnd.nextInt(binLen)]);
+            }
+            str += sb.toString();
+        }
+        return str;
+    }
+
+    public static long codeToId(String code) {
+        char chs[] = code.toCharArray();
+        long res = 0L;
+        for (int i = 0; i < chs.length; i++) {
+            int ind = 0;
+            for (int j = 0; j < binLen; j++) {
+                if (chs[i] == r[j]) {
+                    ind = j;
+                    break;
+                }
+            }
+            if (chs[i] == b) {
+                break;
+            }
+            if (i > 0) {
+                res = res * binLen + ind;
+            } else {
+                res = ind;
+            }
+        }
+        return res;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
new file mode 100644
index 0000000..c729b1d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -0,0 +1,282 @@
+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 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 final String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
+
+	public EthService() {
+		try {
+			HttpService service = new HttpService(ETH_UTL);
+			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);
+	}
+
+	/**
+	 * 
+	 * 方法描述:获取代币余额
+	 * 
+	 * @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="70";
+		}
+		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("60000", Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
+		        // 10*80000/1000000000=0.0008 手续费
+
+		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+		String hexValue = Numeric.toHexString(signedMessage);
+
+		// log.debug("transfer hexValue:" + hexValue);
+
+		CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
+		EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
+		//return "hash";
+
+		if (ethSendTransaction.hasError()) {
+			// log.info("transfer error:", ethSendTransaction.getError().getMessage());
+			return "";
+		} else {
+			String transactionHash = ethSendTransaction.getTransactionHash();
+			// log.info("Transfer transactionHash:" + transactionHash);
+			return transactionHash;
+		}
+	}
+
+	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;
+		}
+	}
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
new file mode 100644
index 0000000..d40629e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
@@ -0,0 +1,42 @@
+package cc.mrbird.febs.dapp.controller;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.dapp.dto.ApproveDto;
+import cc.mrbird.febs.dapp.service.DappMemberService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+@Slf4j
+@RequiredArgsConstructor
+@CrossOrigin(origins = "*")
+@RestController
+@Api(value = "dapp公共接口", tags = "dapp公共接口")
+@RequestMapping(value = "/dapp/common")
+public class ApiCommonController {
+
+    private final DappMemberService dappMemberService;
+
+    @ApiOperation(value = "授权接口", notes = "授权接口")
+    @PostMapping(value = "/approve")
+    public FebsResponse approve(@RequestBody ApproveDto approveDto) {
+        dappMemberService.approve(approveDto);
+        return new FebsResponse().success().message("授权成功");
+    }
+
+    @ApiOperation(value = "是否授权接口", notes = "是否授权接口")
+    @GetMapping(value = "/isApprove/{address}")
+    public FebsResponse isApprove(@PathVariable("address") String address) {
+        boolean isApprove = dappMemberService.isApprove(address);
+        if (isApprove) {
+            return new FebsResponse().success().message("已授权");
+        }
+        return new FebsResponse().fail().message("未授权");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
new file mode 100644
index 0000000..44d9079
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -0,0 +1,50 @@
+package cc.mrbird.febs.dapp.controller;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.dapp.dto.WalletOperateDto;
+import cc.mrbird.febs.dapp.service.DappWalletService;
+import cc.mrbird.febs.dapp.vo.WalletInfoVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+@Slf4j
+@RequiredArgsConstructor
+@CrossOrigin(origins = "*")
+@RestController
+@Api(value = "dapp接口", tags = "dapp接口")
+@RequestMapping(value = "/dapp/member")
+public class ApiDappMemberController {
+
+    private final DappWalletService dappWalletService;
+
+    @ApiOperation(value = "获取账户信息接口", notes = "获取账号信息接口")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = WalletInfoVo.class)
+    })
+    @PostMapping(value = "/walletInfo")
+    public FebsResponse walletInfo() {
+        WalletInfoVo walletInfoVo = dappWalletService.walletInfo();
+        return new FebsResponse().success().data(walletInfoVo);
+    }
+
+    @ApiOperation(value = "兑换接口", notes = "兑换")
+    @PostMapping(value = "/change")
+    public FebsResponse change(@RequestBody WalletOperateDto walletOperateDto) {
+        return null;
+    }
+
+    @ApiOperation(value = "提现接口", notes = "提现接口")
+    @PostMapping(value = "/withdraw")
+    public FebsResponse withdraw(@RequestBody WalletOperateDto walletOperateDto) {
+        return null;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/DappController.java b/src/main/java/cc/mrbird/febs/dapp/controller/DappController.java
index ac747eb..8ea62d9 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/DappController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/DappController.java
@@ -9,16 +9,42 @@
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.tron.trident.core.ApiWrapper;
 import org.tron.trident.core.contract.Contract;
 import org.tron.trident.core.contract.Trc20Contract;
+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 javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 
 /**
  * @author wzy
@@ -66,4 +92,86 @@
         token.transferFrom(trxPostDto.getAddress(), "TFGbYzGv4Zt2nzFM3uU3uCJZY67WKSveG9", amount.intValue(), 0, "memo", 100000000L);
         return new FebsResponse().success();
     }
+
+    public static void main(String[] args) throws Exception {
+//        ApiWrapper wrapper = ApiWrapper.ofShasta("ebefe7b932359a7ef70c5cec0aed9aa2ca468b6c0d60ac637fe783530e459978");
+//        Contract trc20Contract = wrapper.getContract("TRTE68V3TJBLduBoJPLMgBsvwkq8LJBin6");
+//        Trc20Contract token = new Trc20Contract(trc20Contract, "TKcyw4igFYhNpTzyZv25j6uDwvTYzncnjp", wrapper);
+//
+//        BigInteger balance = token.balanceOf("TKcyw4igFYhNpTzyZv25j6uDwvTYzncnjp");
+//        token.transfer("TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD", balance.longValue(), 0, "memo", 100000000L);
+
+
+//        ApiWrapper wrapper = ApiWrapper.ofMainnet("af4913d8462ca83e0a2df587072e42ec565bc26f6bec0724d1bf2e80d4c0bcb7", "9d461be6-9796-47b9-85d8-b150cbabbb54");
+//        Contract trc20Contract = wrapper.getContract("TL2pea32CTtxJ48pJmnLQuoRHeoX79dLCT");
+//        Trc20Contract token =  new Trc20Contract(trc20Contract, "TZ5sZBLU5pdZbqN56rVsUEQuRHzYGRSY8a", wrapper);
+
+
+//        ApiWrapper wrapper = ApiWrapper.ofMainnet(AppContants.TRX_PRIVATE_KEY, "9d461be6-9796-47b9-85d8-b150cbabbb54");
+//
+//        Contract trc20Contract = wrapper.getContract("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t");
+//        Trc20Contract token = new Trc20Contract(trc20Contract, "TFGbYzGv4Zt2nzFM3uU3uCJZY67WKSveG9", wrapper);
+//
+//        System.out.println(token.balanceOf("TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD"));;
+
+        HttpService service = new HttpService("https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0");
+        Web3j web3j = Web3j.build(service);
+
+//        String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+//        String fromAddress = "0x391040eE5F241711E763D0AC55E775B9b4bD0024";
+//        String toAddress = "0xD998DA7362360eFC6daDFEd6E9a32E70640d7600";
+//        int decimal = 6;
+//        String methodName = "allowance";
+//        List<Type> inputParameters = new ArrayList<>();
+//        List<TypeReference<?>> outputParameters = new ArrayList<>();
+//        Address address = new Address(toAddress);
+//        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;
+//        ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
+//        List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
+//        System.out.println(results);
+
+//        String gas = "";
+//        if(StringUtils.isBlank(gas)){
+//            gas="70";
+//        }
+//        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, Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
+//                Convert.toWei("60000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
+//        // 10*80000/1000000000=0.0008 手续费
+//
+//        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+//        String hexValue = Numeric.toHexString(signedMessage);
+//
+//        // log.debug("transfer hexValue:" + hexValue);
+//
+//        CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
+//        EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
+
+    }
+
+
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
new file mode 100644
index 0000000..acce817
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.dapp.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2022-03-18
+ **/
+@Data
+@ApiModel(value = "ApproveDto", description = "授权接口参数接收类")
+public class ApproveDto {
+
+    @NotNull(message = "地址不能为空")
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @ApiModelProperty(value = "推荐人")
+    private String refererId;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/WalletOperateDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/WalletOperateDto.java
new file mode 100644
index 0000000..d977d8c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/WalletOperateDto.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.dapp.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-18
+ **/
+@Data
+@ApiModel(value = "WalletOperateDto", description = "钱包操作参数接收类")
+public class WalletOperateDto {
+
+    @ApiModelProperty(value = "金额", example = "1")
+    private BigDecimal amount;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
new file mode 100644
index 0000000..1f9a95f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
@@ -0,0 +1,41 @@
+package cc.mrbird.febs.dapp.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+@Data
+@TableName("dapp_member")
+public class DappMemberEntity extends BaseEntity {
+
+    private String address;
+
+    private BigDecimal balance;
+
+    /**
+     * 用户状态 1-正常 2-禁用
+     */
+    private Integer accountStatus;
+
+    /**
+     * 是否可兑换 1-是 2-否
+     */
+    private Integer changeAble;
+
+    /**
+     * 是否可提现 1-是 2-否
+     */
+    private Integer withdrawAble;
+
+    private String inviteId;
+
+    private String refererId;
+
+    private String refererIds;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java
new file mode 100644
index 0000000..94c14b5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.dapp.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+@Data
+@TableName("dapp_wallet_coin")
+public class DappWalletCoinEntity extends BaseEntity {
+
+    private Long memberId;
+
+    private BigDecimal totalAmount;
+
+    private BigDecimal frozenAmount;
+
+    private BigDecimal availableAmount;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletMineEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletMineEntity.java
new file mode 100644
index 0000000..2bd72f5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletMineEntity.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.dapp.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+@Data
+@TableName("dapp_wallet_mine")
+public class DappWalletMineEntity extends BaseEntity {
+
+    private Long memberId;
+
+    private BigDecimal totalAmount;
+
+    private BigDecimal frozenAmount;
+
+    private BigDecimal availableAmount;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
new file mode 100644
index 0000000..4415bcd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.dapp.mapper;
+
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+public interface DappMemberDao extends BaseMapper<DappMemberEntity> {
+
+    DappMemberEntity selectByAddress(@Param("address") String address);
+
+    DappMemberEntity selectMemberInfoByInviteId(@Param("inviteId") String inviteId);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletCoinDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletCoinDao.java
new file mode 100644
index 0000000..9d54f92
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletCoinDao.java
@@ -0,0 +1,10 @@
+package cc.mrbird.febs.dapp.mapper;
+
+import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+public interface DappWalletCoinDao extends BaseMapper<DappWalletCoinEntity> {
+
+    DappWalletCoinEntity selectByMemberId(@Param("memberId") Long memberId);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java
new file mode 100644
index 0000000..7e098e2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java
@@ -0,0 +1,10 @@
+package cc.mrbird.febs.dapp.mapper;
+
+import cc.mrbird.febs.dapp.entity.DappWalletMineEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+public interface DappWalletMineDao extends BaseMapper<DappWalletMineEntity> {
+
+    DappWalletMineEntity selectByMemberId(@Param("memberId") Long memberId);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
new file mode 100644
index 0000000..4cc48fd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -0,0 +1,12 @@
+package cc.mrbird.febs.dapp.service;
+
+import cc.mrbird.febs.dapp.dto.ApproveDto;
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface DappMemberService extends IService<DappMemberEntity> {
+
+    void approve(ApproveDto approveDto);
+
+    boolean isApprove(String address);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
new file mode 100644
index 0000000..b572bca
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -0,0 +1,9 @@
+package cc.mrbird.febs.dapp.service;
+
+import cc.mrbird.febs.dapp.vo.WalletInfoVo;
+
+public interface DappWalletService {
+
+    WalletInfoVo walletInfo();
+
+}
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
new file mode 100644
index 0000000..ac2a494
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -0,0 +1,82 @@
+package cc.mrbird.febs.dapp.service.impl;
+
+import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.dapp.dto.ApproveDto;
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity;
+import cc.mrbird.febs.dapp.entity.DappWalletMineEntity;
+import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao;
+import cc.mrbird.febs.dapp.mapper.DappWalletMineDao;
+import cc.mrbird.febs.dapp.service.DappMemberService;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-17
+ **/
+@Service
+@RequiredArgsConstructor
+public class DappMemberServiceImpl extends ServiceImpl<DappMemberDao, DappMemberEntity> implements DappMemberService {
+
+    private final DappMemberDao dappMemberDao;
+    private final DappWalletCoinDao dappWalletCoinDao;
+    private final DappWalletMineDao dappWalletMineDao;
+
+    @Override
+    public void approve(ApproveDto approveDto) {
+        DappMemberEntity member = new DappMemberEntity();
+        member.setAddress(approveDto.getAddress());
+
+        // TODO 判断地址是否被授权,并获取地址余额
+        member.setBalance(BigDecimal.ZERO);
+        dappMemberDao.insert(member);
+
+        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
+
+        if (StrUtil.isNotBlank(approveDto.getRefererId())){
+            boolean flag = false;
+            String parentId = approveDto.getRefererId();
+            String ids = "";
+            while (!flag && StringUtils.isNotBlank(parentId)) {
+                ids += ("," + parentId);
+                DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId);
+                if (parentMember == null) {
+                    break;
+                }
+                parentId = parentMember.getRefererId();
+                if(StringUtils.isBlank(parentId)){
+                    break;
+                }
+                if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
+                    flag = true;
+                }
+            }
+            member.setRefererIds(ids);
+            dappMemberDao.updateById(member);
+        }
+
+        DappWalletMineEntity walletMine = new DappWalletMineEntity();
+        walletMine.setMemberId(member.getId());
+        dappWalletMineDao.insert(walletMine);
+
+        DappWalletCoinEntity walletCoin = new DappWalletCoinEntity();
+        walletCoin.setMemberId(member.getId());
+        dappWalletCoinDao.insert(walletCoin);
+    }
+
+    @Override
+    public boolean isApprove(String address) {
+        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address);
+        if (memberEntity != null) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
new file mode 100644
index 0000000..125da6c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -0,0 +1,42 @@
+package cc.mrbird.febs.dapp.service.impl;
+
+import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity;
+import cc.mrbird.febs.dapp.entity.DappWalletMineEntity;
+import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao;
+import cc.mrbird.febs.dapp.mapper.DappWalletMineDao;
+import cc.mrbird.febs.dapp.service.DappWalletService;
+import cc.mrbird.febs.dapp.vo.WalletInfoVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author wzy
+ * @date 2022-03-18
+ **/
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class DappWalletServiceImpl implements DappWalletService {
+
+    private final DappMemberDao dappMemberDao;
+    private final DappWalletMineDao dappWalletMineDao;
+    private final DappWalletCoinDao dappWalletCoinDao;
+
+    @Override
+    public WalletInfoVo walletInfo() {
+        DappMemberEntity member = LoginUserUtil.getAppUser();
+
+        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
+        DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
+
+        WalletInfoVo walletInfo = new WalletInfoVo();
+        walletInfo.setTotalMine(walletMine.getTotalAmount());
+        walletInfo.setAvailableMine(walletMine.getAvailableAmount());
+        walletInfo.setAvailableWallet(walletCoin.getAvailableAmount());
+        return walletInfo;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
new file mode 100644
index 0000000..540381f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.dapp.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-18
+ **/
+@Data
+@ApiModel(value = "WalletInfoVo", description = "钱包信息返回参数类")
+public class WalletInfoVo {
+
+    @ApiModelProperty(value = "总产量")
+    private BigDecimal totalMine;
+
+    @ApiModelProperty(value = "可兑换")
+    private BigDecimal availableMine;
+
+    @ApiModelProperty(value = "收入余额")
+    private BigDecimal availableWallet;
+}
diff --git a/src/main/resources/mapper/dapp/DappMemberDao.xml b/src/main/resources/mapper/dapp/DappMemberDao.xml
new file mode 100644
index 0000000..6981d13
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<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>
+
+    <select id="selectMemberInfoByInviteId" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
+        select * from dapp_member where invite_id=#{inviteId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappWalletCoinDao.xml b/src/main/resources/mapper/dapp/DappWalletCoinDao.xml
new file mode 100644
index 0000000..dd1ed66
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappWalletCoinDao.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cc.mrbird.febs.dapp.mapper.DappWalletCoinDao">
+
+    <select id="selectByMemberId" resultType="cc.mrbird.febs.dapp.entity.DappWalletCoinEntity">
+        select * from dapp_member_coin where member_id=#{memberId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappWalletMineDao.xml b/src/main/resources/mapper/dapp/DappWalletMineDao.xml
new file mode 100644
index 0000000..7e11c47
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappWalletMineDao.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cc.mrbird.febs.dapp.mapper.DappWalletMineDao">
+
+    <select id="selectByMemberId" resultType="cc.mrbird.febs.dapp.entity.DappWalletMineEntity">
+        select * from dapp_member_mine where member_id=#{memberId}
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1