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