Helius
2022-05-26 2c86d804e005a62591fcc6a78c845d7a295aebcf
add dapp login
16 files modified
1 files added
2 files deleted
860 ■■■■ changed files
pom.xml 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java 162 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/contants/AppContants.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java 30 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java 235 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java 74 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java 58 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/job/ChainListenerJob.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/modules/Test.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java 133 ●●●●● patch | view | raw | blame | history
pom.xml
@@ -359,6 +359,12 @@
            <scope>system</scope>
            <systemPath>${basedir}/lib/huobi-client-1.0.8-SNAPSHOT.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
    </dependencies>
    <build>
src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java
@@ -1,81 +1,81 @@
package cc.mrbird.febs.common.aspect;
import cc.mrbird.febs.common.annotation.SubmitRepeat;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.modules.api.entity.MemberEntity;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@Aspect
@Component
public class SubmitRepeatAspect {
    @Resource
    private RedisUtils redisUtil;
    private String key;
    @Pointcut("@annotation(submitRepeat)")
    public void submitRepeatPointCut(SubmitRepeat submitRepeat) {
    }
    @Before("submitRepeatPointCut(submitRepeat)")
    public void before(SubmitRepeat submitRepeat) {
    }
    @Around("submitRepeatPointCut(submitRepeat)")
    public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String headerToken = request.getHeader("token");
        String token = resolveToken(headerToken);
        if(StrUtil.isEmpty(token)) {
            throw new FebsException("系统繁忙");
        }
        String object = (String)redisUtil.get(token);
        MemberEntity member = JSON.parseObject(object, MemberEntity.class);
        String mId = member.getId().toString();
        String uri = request.getRequestURI();
        log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId);
        key = mId + "_" + uri;
        boolean flag = redisUtil.setNotExist(key, "1", 5);
        log.info("#mid : {}, flag : {}#", mId, flag);
        if (flag) {
            return joinPoint.proceed();
        } else {
            throw new FebsException("请勿重复提交");
        }
    }
    @After("submitRepeatPointCut(submitRepeat)")
    public void after(SubmitRepeat submitRepeat) {
    }
    private static String resolveToken(String token) {
        try {
            RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
            String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_");
            return tokens[0];
        } catch (Exception e) {
            return null;
        }
    }
}
//package cc.mrbird.febs.common.aspect;
//
//import cc.mrbird.febs.common.annotation.SubmitRepeat;
//import cc.mrbird.febs.common.contants.AppContants;
//import cc.mrbird.febs.common.exception.FebsException;
//import cc.mrbird.febs.common.utils.RedisUtils;
////import cc.mrbird.febs.modules.api.entity.MemberEntity;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.crypto.asymmetric.KeyType;
//import cn.hutool.crypto.asymmetric.RSA;
//import com.alibaba.fastjson.JSON;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//
//@Slf4j
//@Aspect
//@Component
//public class SubmitRepeatAspect {
//
//    @Resource
//    private RedisUtils redisUtil;
//
//    private String key;
//
//    @Pointcut("@annotation(submitRepeat)")
//    public void submitRepeatPointCut(SubmitRepeat submitRepeat) {
//
//    }
//
//    @Before("submitRepeatPointCut(submitRepeat)")
//    public void before(SubmitRepeat submitRepeat) {
//    }
//
//    @Around("submitRepeatPointCut(submitRepeat)")
//    public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable {
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        HttpServletRequest request = attributes.getRequest();
//
//        String headerToken = request.getHeader("token");
//        String token = resolveToken(headerToken);
//        if(StrUtil.isEmpty(token)) {
//            throw new FebsException("系统繁忙");
//        }
//        String object = (String)redisUtil.get(token);
//        MemberEntity member = JSON.parseObject(object, MemberEntity.class);
//        String mId = member.getId().toString();
//
//        String uri = request.getRequestURI();
//        log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId);
//        key = mId + "_" + uri;
//        boolean flag = redisUtil.setNotExist(key, "1", 5);
//        log.info("#mid : {}, flag : {}#", mId, flag);
//        if (flag) {
//            return joinPoint.proceed();
//        } else {
//            throw new FebsException("请勿重复提交");
//        }
//    }
//
//    @After("submitRepeatPointCut(submitRepeat)")
//    public void after(SubmitRepeat submitRepeat) {
//
//    }
//
//    private static String resolveToken(String token) {
//        try {
//            RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
//            String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_");
//            return tokens[0];
//        } catch (Exception e) {
//            return null;
//        }
//    }
//}
src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -101,4 +101,5 @@
    public static final String REDIS_KEY_ETH_NEW_PRICE = "ETH_NEW_PRICE";
    public static final String REDIS_KEY_CHANGE_FEE = "DAPP_CHANGE_FEE";
    public static final String REDIS_KEY_SIGN = "LOGIN_SIGN";
}
src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.common.interceptor;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
@@ -8,12 +9,15 @@
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.web3j.crypto.Hash;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
 * @author 
@@ -23,22 +27,40 @@
public class DappInterceptor implements HandlerInterceptor {
    private final DappMemberDao dappMemberDao = SpringContextUtil.getBean(DappMemberDao.class);
    private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if ("OPTIONS".equals(request.getMethod().toUpperCase())) {
            return true;
        }
        String headAddress = request.getHeader("address");
        String key = request.getHeader("key");
        String path = request.getServletPath().replace("/dapi", "");
        log.info("进入拦截:{}, {}", headAddress, path);
        String headAddress = request.getHeader("token");
        String chain = request.getHeader("chain");
        log.info("进入拦截:{}", headAddress);
        if (StrUtil.isBlank(headAddress)) {
        if (StrUtil.isBlank(headAddress) || StrUtil.isBlank(key)) {
            responseUnAuth(response);
            return false;
        }
        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, chain);
        Map<Object, Object> signKey = redisUtils.hmget(AppContants.REDIS_KEY_SIGN);
        Object signObj = signKey.get(headAddress);
        if (signObj == null) {
            responseUnAuth(response);
            return false;
        }
        String sign = (String) signObj;
        String calKey = Hash.sha3(sign + path + headAddress).replace("0x", "");
        if (!calKey.equals(key)) {
            responseUnAuth(response);
            return false;
        }
        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, null);
        if (memberEntity == null) {
            responseUnAuth(response);
            return false;
src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
@@ -4,7 +4,7 @@
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.modules.api.entity.MemberEntity;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
@@ -31,25 +31,19 @@
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String headerToken = request.getHeader("token");
        System.out.println(request.getHeader(":path"));
        String headerToken = request.getHeader("key");
        if (StringUtils.isBlank(headerToken)) {
            responseUnAuth(response);
            return false;
        }
        String token = resolveToken(headerToken);
        if (token == null || AppContants.TIME_OUT.equals(token)) {
            responseUnAuth(response);
            return false;
        }
        String userJsonStr = redisUtils.getString(token);
        String userJsonStr = redisUtils.getString(headerToken);
        if (StringUtils.isBlank(userJsonStr)) {
            responseUnAuth(response);
            return false;
        }
        MemberEntity member = JSON.parseObject(userJsonStr, MemberEntity.class);
        DappMemberEntity member = JSON.parseObject(userJsonStr, DappMemberEntity.class);
        request.getSession().setAttribute("member", member);
        return true;
src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java
@@ -1,118 +1,117 @@
package cc.mrbird.febs.common.interceptor;
import cc.mrbird.febs.common.entity.BaseEntity;
import cc.mrbird.febs.modules.api.entity.MemberEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.defaults.DefaultSqlSession;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
 * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间
 *
 * @author xxx
 * @date 2020-05-13
 **/
@Slf4j
//@Component
//@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MybatisInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        Object parameter = invocation.getArgs()[1];
        if (parameter == null) {
            return invocation.proceed();
        }
        if (SqlCommandType.INSERT == sqlCommandType) {
            if (parameter instanceof DefaultSqlSession.StrictMap) {
                Map map = (Map) parameter;
                List list = (List) map.get("list");
                for (Object o : list) {
                    injectForInsert(o);
                }
            } else {
                injectForInsert(parameter);
            }
        }
        if (SqlCommandType.UPDATE == sqlCommandType) {
            if (parameter instanceof DefaultSqlSession.StrictMap) {
                Map map = (Map) parameter;
                List list = (List) map.get("list");
                for (Object o : list) {
                    injectForUpdate(o);
                }
            } else {
                injectForUpdate(parameter);
            }
        }
        return invocation.proceed();
    }
    @Override
    public Object plugin(Object o) {
        return Plugin.wrap(o, this);
    }
    @Override
    public void setProperties(Properties properties) {
    }
    public void injectForInsert(Object o) {
        MemberEntity member = getLoginUser();
        if (o instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) o;
            if (member != null) {
                String by = member.getPhone();
                baseEntity.setCreateBy(by);
                baseEntity.setUpdateBy(by);
            } else {
                baseEntity.setCreateBy("system");
                baseEntity.setUpdateBy("system");
            }
            baseEntity.setCreateTime(new Date());
            baseEntity.setUpdateTime(new Date());
        }
    }
    public void injectForUpdate(Object o) {
        MemberEntity member = getLoginUser();
        if (o instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) o;
            if (member != null) {
                String by = member.getPhone();
                baseEntity.setUpdateBy(by);
            } else {
                baseEntity.setUpdateBy("system");
            }
            baseEntity.setUpdateTime(new Date());
        }
    }
    private MemberEntity getLoginUser() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return null;
        }
        HttpServletRequest request = attributes.getRequest();
        return (MemberEntity) request.getSession().getAttribute("member");
    }
}
//package cc.mrbird.febs.common.interceptor;
//
//import cc.mrbird.febs.common.entity.BaseEntity;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//import org.apache.ibatis.plugin.*;
//import org.apache.ibatis.session.defaults.DefaultSqlSession;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.Properties;
//
///**
// * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间
// *
// * @author xxx
// * @date 2020-05-13
// **/
//@Slf4j
////@Component
////@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
//public class MybatisInterceptor implements Interceptor {
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
//        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
//
//        Object parameter = invocation.getArgs()[1];
//        if (parameter == null) {
//            return invocation.proceed();
//        }
//
//        if (SqlCommandType.INSERT == sqlCommandType) {
//            if (parameter instanceof DefaultSqlSession.StrictMap) {
//                Map map = (Map) parameter;
//                List list = (List) map.get("list");
//                for (Object o : list) {
//                    injectForInsert(o);
//                }
//            } else {
//                injectForInsert(parameter);
//            }
//        }
//
//        if (SqlCommandType.UPDATE == sqlCommandType) {
//            if (parameter instanceof DefaultSqlSession.StrictMap) {
//                Map map = (Map) parameter;
//                List list = (List) map.get("list");
//                for (Object o : list) {
//                    injectForUpdate(o);
//                }
//            } else {
//                injectForUpdate(parameter);
//            }
//        }
//
//        return invocation.proceed();
//    }
//
//    @Override
//    public Object plugin(Object o) {
//        return Plugin.wrap(o, this);
//    }
//
//    @Override
//    public void setProperties(Properties properties) {
//
//    }
//
//    public void injectForInsert(Object o) {
//        MemberEntity member = getLoginUser();
//        if (o instanceof BaseEntity) {
//            BaseEntity baseEntity = (BaseEntity) o;
//            if (member != null) {
//                String by = member.getPhone();
//                baseEntity.setCreateBy(by);
//                baseEntity.setUpdateBy(by);
//            } else {
//                baseEntity.setCreateBy("system");
//                baseEntity.setUpdateBy("system");
//            }
//            baseEntity.setCreateTime(new Date());
//            baseEntity.setUpdateTime(new Date());
//        }
//    }
//
//    public void injectForUpdate(Object o) {
//        MemberEntity member = getLoginUser();
//        if (o instanceof BaseEntity) {
//            BaseEntity baseEntity = (BaseEntity) o;
//            if (member != null) {
//                String by = member.getPhone();
//                baseEntity.setUpdateBy(by);
//            } else {
//                baseEntity.setUpdateBy("system");
//            }
//            baseEntity.setUpdateTime(new Date());
//        }
//    }
//
//    private MemberEntity getLoginUser() {
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        if (attributes == null) {
//            return null;
//        }
//
//        HttpServletRequest request = attributes.getRequest();
//        return (MemberEntity) request.getSession().getAttribute("member");
//    }
//}
src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.web3j.crypto.Hash;
import javax.servlet.http.HttpServletRequest;
@@ -16,4 +17,11 @@
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        return (DappMemberEntity) request.getSession().getAttribute("member");
    }
    public static String getLoginKey(String address, String nonce, String sign) {
        StringBuilder sb = new StringBuilder();
        StringBuilder append = sb.append(address).append(":").append(nonce).append(":").append(sign);
        return append.toString();
    }
}
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -65,7 +65,7 @@
        switch (chainType) {
            case "ETH" :
                return ETH;
            case "BSC" :
            case "BSC_USDT" :
                return BSC;
            case "TRX" :
                return TRX;
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -4,7 +4,7 @@
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.jcajce.provider.digest.SHA3;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.TypeReference;
@@ -12,17 +12,12 @@
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.*;
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.EthBlockNumber;
import org.web3j.protocol.core.methods.response.EthCall;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.core.methods.response.*;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;
@@ -31,6 +26,7 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -63,10 +59,22 @@
    public static void main(String[] args) throws IOException {
        HttpService service = new HttpService("https://bsc-dataseed1.ninicoin.io");
        Web3j web3j = Web3j.build(service);
        Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
        EthBlockNumber send = request.send();
        BigInteger bigInteger = Numeric.decodeQuantity(send.getResult());
        System.out.println("0x113d6d0");
//        Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
//        EthBlockNumber send = request.send();
//        BigInteger bigInteger = Numeric.decodeQuantity(send.getResult());
//        System.out.println("0x113d6d0");
        String s1 = Hash.sha3("0xf6b06a30196aa5e318232a3b61319eab0fd4a3bf_llE4");
        System.out.println(s1);
        String str = "0xc2cd497cbbbc8bd0eb00a1b7340af86eb8f40f4fd1ee8f8660831d3841cb84be306dd15ceda42acf5d1f1add31793f17d2123c8e321f855dc41e6f44318841e71b_" + s1;
//        Web3Sha3 send = web3j.web3Sha3("0x0d694bf4095e1dd854f7ba365db340308c4b4e5c990df0cd2e91465dd080935b").send();
        String s = Hash.sha3(str);
        // 0x515415edb1d3ae67a97f995b71bd09feaed27319722e55c4817f88273679a9e2
        // 0x64296f548bf487d8e1fa8548572d316ffab08f92fe7d4438e747e9948778f802
        // 0xb3b7c4bb00a80a646ecb803139a4e81eb5857dad30b299520fbd30f6eeeafd81
        System.out.println(s);
    }
    @Override
src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.dapp.dto.ApproveDto;
import cc.mrbird.febs.dapp.dto.ConnectDto;
import cc.mrbird.febs.dapp.service.DappMemberService;
import cc.mrbird.febs.dapp.service.DappSimulateDataService;
import cc.mrbird.febs.dapp.service.DappSystemService;
@@ -41,6 +42,13 @@
//        return new FebsResponse().success().message("获取成功").data(dappMemberService.isApprove(address, chain));
//    }
    @ApiOperation(value = "链接接口", notes = "链接接口")
    @PostMapping(value = "/connect")
    public FebsResponse connect(@RequestBody ConnectDto connectDto) {
        dappMemberService.connect(connectDto);
        return new FebsResponse().success();
    }
    @ApiOperation(value = "头部数据", notes = "头部数据")
    @GetMapping(value = "/totalIncome")
    public FebsResponse totalIncome() {
src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java
New file
@@ -0,0 +1,23 @@
package cc.mrbird.febs.dapp.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author wzy
 * @date 2022-05-26
 **/
@Data
@ApiModel(value = "ConnectDto", description = "连接参数接收类")
public class ConnectDto {
    @ApiModelProperty(value = "地址", example = "123")
    private String address;
    @ApiModelProperty(value ="随机字符串", example = "123")
    private String nonce;
    @ApiModelProperty(value = "签名", example = "123")
    private String sign;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -22,17 +22,16 @@
    public DappFundFlowEntity() {}
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee) {
        new DappFundFlowEntity(memberId, amount, type, status, fee, null);
    }
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee, String fromHash) {
        this.memberId = memberId;
        this.amount = amount;
        this.type = type;
        this.status = status;
        this.fee = fee;
        this.setCreateBy("system");
        this.setUpdateBy("system");
        this.setCreateTime(new Date());
        this.setUpdateTime(new Date());
        this.setVersion(1);
        this.fromHash = fromHash;
    }
    private Long memberId;
@@ -40,7 +39,7 @@
    private BigDecimal amount;
    /**
     * 类型 1-兑换 2-提现 3-采矿
     * 类型 1-买入 2-卖出 3-采矿
     */
    private Integer type;
@@ -53,4 +52,8 @@
    private String address;
    private Integer fee;
    private String toHash;
    private String fromHash;
}
src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.dapp.dto.ApproveDto;
import cc.mrbird.febs.dapp.dto.ConnectDto;
import cc.mrbird.febs.dapp.dto.PriceSettingDto;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
@@ -13,6 +14,8 @@
public interface DappMemberService extends IService<DappMemberEntity> {
    void approve(ApproveDto approveDto);
    void connect(ConnectDto connectDto);
    int isApprove(String address, String chain);
@@ -31,4 +34,6 @@
    IPage<DappTransferRecordEntity> selectTransferInPage(DappTransferRecordEntity transfer, QueryRequest request);
    void setNewestPrice(PriceSettingDto priceSettingDto);
    DappMemberEntity insertMember(String address, String refererId);
}
src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -5,24 +5,38 @@
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.chain.ContractEventService;
import cc.mrbird.febs.dapp.chain.EthUsdtContract;
import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
import cc.mrbird.febs.dapp.mapper.DappMemberDao;
import cc.mrbird.febs.dapp.service.DappMemberService;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
@Service
public class BscCoinContractEvent implements ContractEventService {
    @Autowired
    @Resource
    private DappMemberDao dappMemberDao;
    @Resource
    private DappMemberService dappMemberService;
    @Resource
    private DappFundFlowDao dappFundFlowDao;
    private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25";
    int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void compile(EthUsdtContract.TransferEventResponse e) {
        if (e.to != null) {
@@ -30,61 +44,37 @@
                return;
            }
            DappMemberEntity fromMember = dappMemberDao.selectByAddress(e.from, null);
            DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
            if (fromMember == null) {
                fromMember = insertMember(e.from, null);
                fromMember = dappMemberService.insertMember(e.from, null);
            }
            if (!e.to.equals(ADDRESS)) {
                DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null);
                if (toMember == null) {
                    toMember = insertMember(e.to, fromMember.getInviteId());
                    toMember = dappMemberService.insertMember(e.to, fromMember.getInviteId());
                }
            }
            //
            // 卖币
            if (e.to.equals(ADDRESS)) {
                BigInteger tokens = e.tokens;
                BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(4), decimals, RoundingMode.HALF_DOWN);
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(fromMember.getId(), amount, 2, null, null, e.log.getTransactionHash());
                dappFundFlowDao.insert(fundFlow);
                // TODO price
                BigDecimal newPrice = BigDecimal.valueOf(1);
                BigDecimal transferAmount = amount.multiply(newPrice);
                String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(e.from, transferAmount);
                fundFlow.setToHash(hash);
                dappFundFlowDao.updateById(fundFlow);
            }
        }
    }
    private DappMemberEntity insertMember(String address, String refererId) {
        DappMemberEntity member = new DappMemberEntity();
        member.setAddress(address);
        dappMemberDao.insert(member);
        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
        member.setRefererId(refererId);
        if (StrUtil.isNotBlank(refererId)){
            boolean flag = false;
            String parentId = refererId;
            String ids = "";
            while (!flag && StringUtils.isNotBlank(parentId)) {
                if (StrUtil.isBlank(ids)) {
                    ids += parentId;
                } else {
                    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);
        return member;
    }
}
src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -1,22 +1,62 @@
package cc.mrbird.febs.dapp.service.impl;
import cc.mrbird.febs.common.utils.ShareCodeUtil;
import cc.mrbird.febs.dapp.chain.ChainEnum;
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.chain.ContractEventService;
import cc.mrbird.febs.dapp.chain.EthUsdtContract;
import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
import cc.mrbird.febs.dapp.mapper.DappMemberDao;
import cc.mrbird.febs.dapp.service.DappMemberService;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
@Slf4j
@Service
public class BscUsdtContractEvent implements ContractEventService {
    @Resource
    private DappMemberService dappMemberService;
    @Resource
    private DappFundFlowDao dappFundFlowDao;
    private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25";
    int decimals = ChainService.getInstance(ChainEnum.BSC_USDT.name()).decimals();
    int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
    @Override
    public void compile(EthUsdtContract.TransferEventResponse e) {
        if (e.to != null && ADDRESS.equals(e.from)) {
            DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
            if (fromMember == null) {
                fromMember = dappMemberService.insertMember(e.from, null);
            }
            BigInteger tokens = e.tokens;
            BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(fromMember.getId(), amount, 2, null, null, e.log.getTransactionHash());
            dappFundFlowDao.insert(fundFlow);
            // TODO price
            BigDecimal newPrice = BigDecimal.valueOf(1);
            BigDecimal transferAmount = amount.multiply(newPrice);
            String hash = ChainService.getInstance(ChainEnum.BSC_TFC.name()).transfer(e.from, transferAmount);
            fundFlow.setToHash(hash);
            dappFundFlowDao.updateById(fundFlow);
        }
    }
}
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -4,11 +4,13 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
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.dto.ConnectDto;
import cc.mrbird.febs.dapp.dto.PriceSettingDto;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
@@ -31,6 +33,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
@@ -114,6 +117,22 @@
        walletCoin.setAvailableAmount(BigDecimal.ZERO);
        walletCoin.setFrozenAmount(BigDecimal.ZERO);
        dappWalletCoinDao.insert(walletCoin);
    }
    @Override
    public void connect(ConnectDto connectDto) {
        DappMemberEntity member = dappMemberDao.selectByAddress(connectDto.getAddress(), null);
        if (member == null) {
            member = insertMember(connectDto.getAddress(), null);
        }
        String key = LoginUserUtil.getLoginKey(connectDto.getAddress(), connectDto.getNonce(), connectDto.getSign());
        redisUtils.set(connectDto.getAddress(), member);
        HashMap<String, String> map = new HashMap<>();
        map.put(connectDto.getAddress(), key);
        redisUtils.set(AppContants.REDIS_KEY_SIGN, map);
    }
    @Override
@@ -232,4 +251,43 @@
            redisUtils.set(AppContants.REDIS_KEY_ETH_NEW_PRICE, priceSettingDto.getNewestPrice());
        }
    }
    @Override
    public DappMemberEntity insertMember(String address, String refererId) {
        DappMemberEntity member = new DappMemberEntity();
        member.setAddress(address);
        dappMemberDao.insert(member);
        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
        member.setRefererId(refererId);
        if (StrUtil.isNotBlank(refererId)){
            boolean flag = false;
            String parentId = refererId;
            String ids = "";
            while (!flag && StringUtils.isNotBlank(parentId)) {
                if (StrUtil.isBlank(ids)) {
                    ids += parentId;
                } else {
                    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);
        return member;
    }
}
src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
@@ -24,6 +24,6 @@
    public void chainListenerJob() {
        log.info("监听打开");
//        ChainService.contractEventListener(new BigInteger("18097238"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
        ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name());
//        ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name());
    }
}
src/main/java/cc/mrbird/febs/modules/Test.java
File was deleted
src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java
File was deleted