xiaoyong931011
2023-05-18 2cac4da22c22cea0525981ccb553822c7124f410
twoCoin项目修改
19 files modified
8 files added
658 ■■■■ changed files
src/main/java/cc/mrbird/febs/FebsShiroApplication.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java 17 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java 28 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java 15 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java 19 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java 39 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java 21 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java 76 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java 178 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java 38 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java 5 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 14 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappFundFlowDao.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappMemberNodeMapper.xml 30 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappNodeOrderMapper.xml 22 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/MemberTest.java 11 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/FebsShiroApplication.java
@@ -50,7 +50,7 @@
            Field field = systemConstants.getClass().getDeclaredField(key);
            field.set(systemConstants, value);
            AppContants.FEE_ADDRESS_KEY.put("feeAddressKey",systemConstants.getFeeAddressKey());
            dataDictionaryCustom.setValue("isReady");
//            dataDictionaryCustom.setValue("isReady");
            dataDictionaryCustomMapper.updateById(dataDictionaryCustom);
        } catch (Exception e) {
            e.printStackTrace();
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -27,6 +27,7 @@
        registration.addPathPatterns("/dapi/**");
        registration.excludePathPatterns("/dapi/common/**");
        registration.excludePathPatterns("/dapi/member/runListInfo");
        registration.excludePathPatterns("/dapi/member/nodeInfo");
    }
    /**
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -14,16 +14,17 @@
     * 0x55d398326f99059fF775485246999027B3197955
     * 测试链 0x337610d27c682E347C9cD60BD4b3b107C9d34dDd
     */
//    BSC_USDT("BSC", "0xa9B85Fc19f3E330Cd703050fACA2110c7A33fd06",
//            "0xb97d6046268b76a21c11c4b33357dc8e203542d7c2a7fc40fccf364099b06477",
//            "https://bsc-dataseed1.ninicoin.io",
//            "0x55d398326f99059fF775485246999027B3197955",
//            ""),
    BSC_USDT("BSC", "0xBa6206B3Be305278Ea65bA54C4E6188B252AEc4a",
            "0x1bc264d17bd2b1f3c0480764272284b8e6c8b0a39a590c26940f84f7b090cc74",
    BSC_USDT("BSC", "0xA60AaC0da34C76F3f60207ee09e9F75043319ab4",
            "221be67f85375a5af6dd0f4b77fbe877ad2e57e05db201de1b1383fb76494d18",
            "https://bsc-dataseed1.ninicoin.io",
            "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
//            "0x55d398326f99059fF775485246999027B3197955",
            "0x532B0F9554D92b8BF1bdE85DD4E8b86E4228DE27",
            ""),
//    BSC_USDT("BSC", "0xBa6206B3Be305278Ea65bA54C4E6188B252AEc4a",
//            "0x1bc264d17bd2b1f3c0480764272284b8e6c8b0a39a590c26940f84f7b090cc74",
//            "https://bsc-dataseed1.ninicoin.io",
//            "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
//            ""),
    BNB("BSC", "0xBa6206B3Be305278Ea65bA54C4E6188B252AEc4a",
            "0x1bc264d17bd2b1f3c0480764272284b8e6c8b0a39a590c26940f84f7b090cc74",
            "https://bsc-dataseed1.ninicoin.io",
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -215,7 +215,8 @@
    }
    public String tokenTransferFrom(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException {
        String gas = getGas();
//        String gas = getGas();
        String gas = "5";
        BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals()));
        amount = amountPow.toPlainString();
@@ -256,8 +257,8 @@
    }
    public String tokenTransfer(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException {
        String gas = getGas();
//        String gas = "5";
//        String gas = getGas();
        String gas = "5";
        BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals()));
        amount = amountPow.toPlainString();
src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java
@@ -28,18 +28,13 @@
    @PostConstruct
    public void init(){
        // 设置起始区块编号 TODO
        BigInteger start = new BigInteger("23886625");
        BigInteger start = new BigInteger("28282373");
        // 需要打开 获取最新区块编号
        Object bnb_block_number = redisService.get("BNB_BLOCK_NUMBER");
        if(bnb_block_number !=null){
            start = BigInteger.valueOf(Long.valueOf(bnb_block_number.toString()));
        }
//        DataDictionaryCustom feeAddressKey = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.FEE_ADDRESS_KEY.getType(), DataDictionaryEnum.FEE_ADDRESS_KEY.getCode());
//        AppContants.FEE_ADDRESS_KEY.put("feeAddressKey",feeAddressKey.getValue());
//        feeAddressKey.setValue("已初始化");
//        dataDictionaryCustomMapper.updateById(feeAddressKey);
        System.out.println("启动区块事件监听,监听起始:"+start);
//        System.out.println("启动区块事件监听,监听起始:"+AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() );
        contractMain.listenBetting(start);
    }
}
src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java
@@ -58,11 +58,8 @@
        return web3;
    }
    // gas费用单价
//    public static final BigInteger GAS_PRICE = BigInteger.valueOf(32000000000L);
    public static final BigInteger GAS_PRICE = Convert.toWei(getGas(), Convert.Unit.GWEI).toBigInteger();
//    public static final BigInteger GAS_PRICE = Convert.toWei("5", Convert.Unit.GWEI).toBigInteger();
    // gas费用最大值
//    public static final BigInteger GAS_LIMIT = BigInteger.valueOf(4300000L);
    public static final BigInteger GAS_LIMIT = Convert.toWei("100000", Convert.Unit.WEI).toBigInteger();
    private static StaticGasProvider getStaticGasProvider(){
        return new StaticGasProvider(GAS_PRICE,GAS_LIMIT);
@@ -70,13 +67,13 @@
    private static String getGas() {
        String gas = "5";
        try{
            String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle");
            JSONObject data = JSONObject.parseObject(resp);
            gas = data.getString("FastGasPrice");
        }catch (Exception exception) {
            exception.printStackTrace();
        }
//        try{
//            String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle");
//            JSONObject data = JSONObject.parseObject(resp);
//            gas = data.getString("FastGasPrice");
//        }catch (Exception exception) {
//            exception.printStackTrace();
//        }
        return StrUtil.isBlank(gas) ? "5" : gas;
    }
@@ -92,12 +89,12 @@
    // 合约地址 TODO
//    private static String contractAddr = "0xb5a1aC0fA05BFb8ad16B231e84b0bAC1d46eAfD0";//测试
    private static String contractAddr = "0xB4fAAfD3884316AaEE342fda57E84996c70F1A75";
    private static String contractAddr = "0x532B0F9554D92b8BF1bdE85DD4E8b86E4228DE27";
    // 操作账号 手续费钱包地址的私钥(合约里会把手续费转到你这个私钥地址上) 用于操作合约内方法 TODO
//    private static String privateKey = "0x5672e3b09eae475fc2ad725757874b453b9c7ed76bb3df76340a96c819de0845";//测试
    private static String privateKey = "221be67f85375a5af6dd0f4b77fbe877ad2e57e05db201de1b1383fb76494d18";//测试
    private static String privateKey = AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ;
//    private static String privateKey = AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ;
    private EthFilter getFilter(BigInteger startBlock) {
        if (startBlock != null) {
@@ -178,8 +175,9 @@
    public static void main(String[] args) {
        ContractMain contractMain = new ContractMain();
        String address = "0xd9076245473060dda1a65f5f3d89a4d0598995e6";
        BigInteger bigInteger = new BigInteger(Convert.toWei("0.00105", Convert.Unit.ETHER).setScale(0).toString());
        String address = "0xA60AaC0da34C76F3f60207ee09e9F75043319ab4";
//        String address = "0x785D5Aa2951Ac4C6f28Dc593AF0b0536Dd3E82Fe";
        BigInteger bigInteger = new BigInteger(Convert.toWei("0.001", Convert.Unit.ETHER).setScale(0).toString());
        String hash = contractMain.trans(bigInteger,address);
        System.out.println(hash);
    }
src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -8,13 +8,11 @@
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.entity.DappNodeOrderEntity;
import cc.mrbird.febs.dapp.service.DappMemberService;
import cc.mrbird.febs.dapp.service.DappSystemService;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.vo.ActiveNftListVo;
import cc.mrbird.febs.dapp.vo.ApiRunListInfoVo;
import cc.mrbird.febs.dapp.vo.TeamListVo;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import cc.mrbird.febs.dapp.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
@@ -53,6 +51,15 @@
        return new FebsResponse().success().data(walletInfoVo);
    }
    @ApiOperation(value = "获取节点信息", notes = "获取节点信息")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = DappNodeOrderVo.class)
    })
    @PostMapping(value = "/nodeInfo")
    public FebsResponse nodeInfo() {
        return dappMemberService.getNodeInfo();
    }
    @ApiOperation(value = "转账", notes = "转账")
    @PostMapping(value = "/transfer")
    public FebsResponse transfer(@RequestBody TransferDto transferDto) {
src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
@@ -40,6 +40,9 @@
    @ApiModelProperty(value = "1-余额 2-钱包")
    private Integer buyType;
    @ApiModelProperty(value = "节点编码")
    private String nodeCode;
    @ApiModelProperty(hidden = true)
    private Long memberId;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -51,6 +51,16 @@
        this.fromHash = fromHash;
    }
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee, String fromHash,String toHash) {
        this.memberId = memberId;
        this.amount = amount;
        this.type = type;
        this.status = status;
        this.fee = fee;
        this.fromHash = fromHash;
        this.toHash = toHash;
    }
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee, String fromHash,Long systemProfitId) {
        this.memberId = memberId;
        this.amount = amount;
@@ -68,6 +78,7 @@
    /**
     * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利
     * 类型 1-加入动能 2-技术方收益 3-直推收益 4-层级收益 5-剩余层级收益给系统 6-复投动能 7-动能收益 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利
     * 类型 1-认购节点 2-直推收益 3-技术方收款
     */
    private Integer type;
@@ -85,7 +96,9 @@
    private String address;
    private BigDecimal fee;
    /**
     * 用来存放用户购买节点的节点编码
     */
    private String toHash;
    private String fromHash;
@@ -93,6 +106,8 @@
    private BigDecimal newestPrice;
    private BigDecimal targetAmount;
    /**
     * 会员节点表ID-对应认购记录
     */
    private Long systemProfitId;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java
New file
@@ -0,0 +1,39 @@
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;
/**
 * 会员节点表
 */
@Data
@TableName("dapp_member_node")
public class DappMemberNodeEntity extends BaseEntity {
    /**
     * 会员id
     */
    private Long memberId;
    /**
     * 节点ID
     */
    private Long nodeId;
    /**
     * 节点编码
     */
    private String nodeCode;
    /**
     * 节点价格
     */
    private BigDecimal nodePrice;
    public DappMemberNodeEntity(Long memberId, Long nodeId, String nodeCode, BigDecimal nodePrice) {
        this.memberId = memberId;
        this.nodeId = nodeId;
        this.nodeCode = nodeCode;
        this.nodePrice = nodePrice;
    }
}
src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java
@@ -1,4 +1,37 @@
package cc.mrbird.febs.dapp.entity;
public class DappNodeOrderEntity {
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 节点表
 */
@Data
@TableName("dapp_node_order")
public class DappNodeOrderEntity  extends BaseEntity {
    /**
     * 节点编码
     */
    private String nodeCode;
    /**
     * 节点名称
     */
    private String nodeName;
    /**
     * 总数
     */
    private Integer totalCnt;
    /**
     * 剩余数量
     */
    private Integer surplusCnt;
    /**
     * 价格
     */
    private BigDecimal price;
}
src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
@@ -4,6 +4,8 @@
@Getter
public enum DataDictionaryEnum {
    // 前期节点归集地址
    TOTAL_ADDRESS("SYSTEM_SETTING","TOTAL_ADDRESS"),
    // 分发地址的私钥
    FEE_ADDRESS_KEY("SYSTEM_SETTING","FEE_ADDRESS_KEY"),
    // 复投盈利收益
src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java
New file
@@ -0,0 +1,25 @@
package cc.mrbird.febs.dapp.enumerate;
import lombok.Getter;
/**
 * 节点编码枚举
 */
@Getter
public enum NodeCodeEnum {
    NODE_1("NODE_CODE", "node_1"),
    NODE_2("NODE_CODE", "node_2"),
    NODE_3("NODE_CODE", "node_3"),
    NODE_4("NODE_CODE", "node_4"),
    NODE_5("NODE_CODE", "node_5"),
    SUPER_NODE("NODE_CODE", "super_node");
    private String type;
    private String code;
    NodeCodeEnum(String type, String code) {
        this.type = type;
        this.code = code;
    }
}
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java
New file
@@ -0,0 +1,21 @@
package cc.mrbird.febs.dapp.mapper;
import cc.mrbird.febs.dapp.entity.DappMemberNodeEntity;
import cc.mrbird.febs.dapp.vo.DappMemberNodeVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface DappMemberNodeMapper extends BaseMapper<DappMemberNodeEntity> {
    /**
     * 根据会员ID获取会员的节点买卖记录
     * @param id
     * @return
     */
    List<DappMemberNodeVo> selectListByMemberId(@Param("memberId")Long id);
    DappMemberNodeEntity selectNodeByMemberId(@Param("memberId")Long id);
    DappMemberNodeEntity selectNodeByMemberIdAndNodeCode(@Param("memberId")Long id, @Param("nodeCode")String code);
}
src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java
New file
@@ -0,0 +1,15 @@
package cc.mrbird.febs.dapp.mapper;
import cc.mrbird.febs.dapp.entity.DappNodeOrderEntity;
import cc.mrbird.febs.dapp.vo.DappNodeOrderVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface DappNodeOrderMapper extends BaseMapper<DappNodeOrderEntity> {
    List<DappNodeOrderVo> selectNodeOrderList();
    DappNodeOrderEntity selectNodeOrderByNodeCode(@Param("nodeCode")String nodeCode);
}
src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.dapp.service;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.dapp.dto.ApproveDto;
import cc.mrbird.febs.dapp.dto.ConnectDto;
@@ -54,4 +55,10 @@
    IPage<AdminSystemProfitFlowListVo> getSystemProfitFlowList(DappSystemProfit dappSystemProfit, QueryRequest request);
    IPage<AdminTeamInfoVo> getTeamInfo(DappMemberEntity dappMemberEntity, QueryRequest request);
    /**
     * 获取节点信息
     * @return
     */
    FebsResponse getNodeInfo();
}
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.FebsUtil;
@@ -59,6 +60,8 @@
    private final DappSystemProfitDao dappSystemProfitDao;
    private final ChainProducer chainProducer;
    private final DappFundFlowDao dappFundFlowDao;
    private final DappNodeOrderMapper dappNodeOrderMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -474,6 +477,12 @@
        return adminTeamInfoVoIPage;
    }
    @Override
    public FebsResponse getNodeInfo() {
        List<DappNodeOrderVo> dappNodeOrderVos = dappNodeOrderMapper.selectNodeOrderList();
        return new FebsResponse().success().data(dappNodeOrderVos);
    }
    public TeamListVo buildTeamMatrix(Long memberId) {
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        TeamListVo teamListVo = new TeamListVo();
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -58,6 +58,8 @@
    private final ChainProducer chainProducer;
    private final ContractMain contractMain;
    private final DappMemberNodeMapper dappMemberNodeMapper;
    @Override
    public SystemDto system() {
@@ -469,21 +471,57 @@
            return;
        }
        Integer count = dappFundFlowDao.updateStatusById(DappFundFlowEntity.WITHDRAW_STATUS_AGREE,dappFundFlowEntity.getId());
//        if(count > 0){
//            DappFundFlowEntity dappFundFlow = dappFundFlowDao.selectById(id);
//            //金额
//            BigDecimal amount = dappFundFlow.getAmount();
//            //目标地址
//            String address = dappFundFlow.getAddress();
//    //        String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(address, amount);
//            String hash = ChainService.getInstance(ChainEnum.BNB.name()).transferBaseToken(address, amount);
//            if(StrUtil.isEmpty(hash)){
//                return;
//            }
//            log.info("{},{}",id,hash);
//            dappFundFlow.setFromHash(hash);
//            dappFundFlowDao.updateById(dappFundFlow);
//        }
        if(count > 0){
            /**
             * 转账直推收益
             */
            DappFundFlowEntity dappFundFlow = dappFundFlowDao.selectById(id);
            //金额
            BigDecimal amount = dappFundFlow.getAmount();
            //目标地址
            String address = dappMemberEntity.getAddress();
            /**
             * 发起USDT转账
             */
            BigInteger bigInteger = new BigInteger(Convert.toWei(amount.toString(), Convert.Unit.ETHER).setScale(0).toString());
            log.info("{}",bigInteger);
            String hash = contractMain.trans(bigInteger,address);
//            String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(address, amount);
////            String hash = ChainService.getInstance(ChainEnum.BNB.name()).transferBaseToken(address, amount);
            if(StrUtil.isEmpty(hash)){
                return;
            }
            log.info("{},{}",id,hash);
            dappFundFlow.setFromHash(hash);
            dappFundFlowDao.updateById(dappFundFlow);
            /**
             * 把剩余的归集到一个地址中
             */
            Long systemProfitId = dappFundFlow.getSystemProfitId();
            DappMemberNodeEntity dappMemberNodeEntity = dappMemberNodeMapper.selectById(systemProfitId);
            BigDecimal nodePrice = dappMemberNodeEntity.getNodePrice();
            nodePrice = nodePrice.subtract(amount);
            DataDictionaryCustom totalAddressDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.TOTAL_ADDRESS.getType(),
                    DataDictionaryEnum.TOTAL_ADDRESS.getCode()
            );
            BigInteger nodePriceBigInteger = new BigInteger(Convert.toWei(nodePrice.toString(), Convert.Unit.ETHER).setScale(0).toString());
            log.info("{}",nodePriceBigInteger);
            String hashBigInteger = contractMain.trans(nodePriceBigInteger,totalAddressDic.getValue());
//            ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(totalAddressDic.getValue(), nodePrice);
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                    1L,
                    new BigDecimal(totalAddressDic.getValue()),
                    3,
                    2,
                    BigDecimal.ZERO,
                    hashBigInteger,
                    dappMemberNodeEntity.getNodeCode());
            dappFundFlowDao.insert(fundFlow);
        }
    }
    @Override
@@ -556,9 +594,11 @@
        if(DappFundFlowEntity.WITHDRAW_STATUS_ING != dappFundFlow.getIsReturn()){
            return;
        }
        //用户已经加入动能队列
        DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectById(dappFundFlow.getSystemProfitId()==null ? 0L : dappFundFlow.getSystemProfitId());
        if(ObjectUtil.isEmpty(dappSystemProfit)){
        /**
         * 用户是否已经生成节点购买记录
         */
        DappMemberNodeEntity dappMemberNodeEntity = dappMemberNodeMapper.selectById(dappFundFlow.getSystemProfitId() == null ? 0L : dappFundFlow.getSystemProfitId());
        if(ObjectUtil.isEmpty(dappMemberNodeEntity)){
            return;
        }
        //金额
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -13,10 +13,12 @@
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
import cc.mrbird.febs.dapp.enumerate.NodeCodeEnum;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.utils.BoxUtil;
import cc.mrbird.febs.dapp.vo.ActiveNftListVo;
import cc.mrbird.febs.dapp.vo.DappMemberNodeVo;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cn.hutool.core.collection.CollUtil;
@@ -63,6 +65,9 @@
    private final DappSystemDao dappSystemDao;
    private final DappSystemProfitDao dappSystemProfitDao;
    private final DappNodeOrderMapper dappNodeOrderMapper;
    private final DappMemberNodeMapper dappMemberNodeMapper;
    @Override
    public WalletInfoVo walletInfo() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
@@ -92,49 +97,15 @@
        walletInfo.setLevelProfit(levelProfit);
        BigDecimal luckyProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),7,2);
        walletInfo.setLuckyProfit(luckyProfit);
//        //获取当前是第几轮队列
//        String redisKey = "QUEUE_COUNT";
//        String memberOutCount = redisUtils.getString(redisKey);
//        DataDictionaryCustom queueCountSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.QUEUE_COUNT.getType(), DataDictionaryEnum.QUEUE_COUNT.getCode());
//        String queueCount = queueCountSet.getValue();
//        if(StrUtil.isBlank(memberOutCount)){
//            redisUtils.set(redisKey,queueCount,0L);
//            memberOutCount = queueCount;
//        }
//        //出局条件的人数
//        /**
//         * 初始大小 5+4*0
//         * 1  1,2,3,4,5  1出局 5+4*0
//         * 2  2,3,4,5,1(复投),7,8,9,10  2出局 5+4*1
//         * 3  3,4,5,1(复投),7,8,9,10,2(复投),12,13,14,15 3出局 5+4*2
//         * 4  4,5,1(复投),7,8,9,10,2(复投),12,13,14,15,3(复投),17,18,19,20  4出局 5+4*3
//         */
//        Integer memberCount = Integer.parseInt(memberOutCount) * 4 + 5;
//        //判断当前是否符合出局条件
//        QueryWrapper<DappSystemProfit> objectQueryWrapper = new QueryWrapper<>();
//        objectQueryWrapper.eq("state",DappSystemProfit.STATE_IN);
//        //实际投资人数
//        Integer selectCount = dappSystemProfitDao.selectCount(objectQueryWrapper);
//        BigDecimal memberRunPercent = BigDecimal.ZERO;
//        List<DappSystemProfit> dappSystemProfits = dappSystemProfitDao.selectDappSysstemProfitByState(DappSystemProfit.STATE_IN);
//        if(CollUtil.isEmpty(dappSystemProfits)){
//            walletInfo.setRunPercent(memberRunPercent);
//        }
//
//        for(int i=0;i<dappSystemProfits.size();i++){
//            DappSystemProfit systemProfit = dappSystemProfits.get(i);
//            if(memberInfo.getId() == systemProfit.getMemberId()){
//                BigDecimal size = new  BigDecimal(dappSystemProfits.size());
//                memberRunPercent = size.subtract(new BigDecimal(i+1));
//            }
//        }
//        BigDecimal runPercent = memberRunPercent.divide(new BigDecimal(memberCount), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100));
//        walletInfo.setRunPercent(runPercent);
        if(DataDictionaryEnum.BIG_BOSS.getCode().equals(memberInfo.getAccountType())){
            walletInfo.setRunPercent(new BigDecimal(100));
        }else{
            walletInfo.setRunPercent(new BigDecimal(90));
        }
        //获取会员节点信息
        List<DappMemberNodeVo> dappMemberNodeVos = dappMemberNodeMapper.selectListByMemberId(member.getId());
        walletInfo.setDappMemberNodeVos(dappMemberNodeVos);
        return walletInfo;
    }
@@ -186,7 +157,6 @@
    @Override
    public Long transfer(TransferDto transferDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
//        DappMemberEntity member = dappMemberDao.selectById(transferDto.getMemberId());
        String upgrade = redisUtils.getString("APP_UPGRADE");
        if ("upgrade".equals(upgrade)) {
@@ -199,7 +169,9 @@
                throw new FebsException("Do not repeat purchase");
            }
        }
        /**
         * buyType=1,余额购买
         */
        if (transferDto.getBuyType() == 1) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
            if (transferDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
@@ -211,14 +183,43 @@
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount().negate(), 1, 2, transferDto.getFee(), transferDto.getTxHash());
            dappFundFlowDao.insert(fundFlow);
            chainProducer.sendAchieveTreeMsg(member.getId());
//            chainProducer.sendAchieveTreeMsg(member.getId());
        } else {
            /**
             * buyType=2,钱包购买
             */
            int type = 1;
            // 1-认购 2-充值tfc
            if (transferDto.getType() == 2) {
                type = 6;
            }
            /**
             * 第一次请求,生成一条资金流水ID,并且返回。
             */
            if (transferDto.getId() == null) {
                /**
                 * 验证节点的价格是否和入参价格一致
                 */
                String nodeCode = transferDto.getNodeCode();
                DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCode(nodeCode);
                BigDecimal price = dappNodeOrderEntity.getPrice();
                BigDecimal amount = transferDto.getAmount();
                if(price.compareTo(amount) != 0){
                    throw new FebsException("刷新后重试");
//                    throw new FebsException("Refresh and try again");
                }
                /**
                 * 超级节点只允许购买一次
                 */
                DappMemberNodeEntity superNode = dappMemberNodeMapper.selectNodeByMemberIdAndNodeCode(
                        member.getId(), NodeCodeEnum.SUPER_NODE.getCode());
                if(ObjectUtil.isNotEmpty(superNode)){
                    throw new FebsException("超级节点只允许购买一次");
//                    throw new FebsException("Super nodes are only allowed to be purchased once");
                }
                DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type);
                if(ObjectUtil.isNotEmpty(fundFlowOld)){
                    //网络问题导致第二次提交前,未成功就关闭了页面
@@ -227,7 +228,7 @@
                    }
                    throw new FebsException("Refresh and try again");
                }
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash());
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash(),transferDto.getNodeCode());
                dappFundFlowDao.insert(fundFlow);
                return fundFlow.getId();
            }
@@ -235,51 +236,72 @@
            if ("success".equals(transferDto.getFlag())) {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){
                    throw new FebsException("Do not repeat purchase");
                    throw new FebsException("请勿重复提交");
//                    throw new FebsException("Do not repeat purchase");
                }
                //是否已经加入动能
                DappSystemProfit dappSystemProfitIng = dappSystemProfitDao.selectByMemberIdAndState(member.getId(), DappSystemProfit.STATE_IN);
                if(ObjectUtil.isNotEmpty(dappSystemProfitIng)){
                    throw new FebsException("Do not repeat purchase");
                }
                //插入一条会员入列记录,即加入动能队列
                DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), flow.getAmount());
                dappSystemProfitDao.insert(dappSystemProfit);
                /**
                 * 生成会员节点表记录
                 */
                String nodeCode = transferDto.getNodeCode();
                DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCode(nodeCode);
                DappMemberNodeEntity dappMemberNodeEntityNew = new DappMemberNodeEntity(
                        member.getId(),
                        dappNodeOrderEntity.getId(),
                        dappNodeOrderEntity.getNodeCode(),
                        transferDto.getAmount()
                );
                dappMemberNodeMapper.insert(dappMemberNodeEntityNew);
                /**
                 * 是否已经购买了节点
                 */
//                DappMemberNodeEntity dappMemberNodeEntity = dappMemberNodeMapper.selectNodeByMemberId(member.getId());
//                if(ObjectUtil.isNotEmpty(dappMemberNodeEntity)){
//                    throw new FebsException("Do not repeat purchase");
//                }
                /**
                 * 流水关联用户购买节点记录
                 */
                flow.setSystemProfitId(dappMemberNodeEntityNew.getId());
                /**
                 * 链上转账的hash值
                 */
                flow.setFromHash(transferDto.getTxHash());
                flow.setSystemProfitId(dappSystemProfit.getId());
                flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
                dappFundFlowDao.updateById(flow);
                //升级成为Agent
                dappMemberDao.updateMemberAccountType(DataDictionaryEnum.AGENT.getCode(),member.getId());
                dappMemberDao.updateMemberActiveStatus(1,member.getId());
                //直接拿走0.05个BNB放入技术方
                DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode());
                String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue();
                DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(1L, new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, null,dappSystemProfit.getId());
                dappFundFlowDao.insert(systemProfitFlow);
                //发送转币消息
//                chainProducer.sendBnbTransferMsg(systemProfitFlow.getId());
                //直接返利30%给直接上级
                /**
                 * 升级账号类型为对应的节点名称
                 */
//                dappMemberDao.updateMemberAccountType(dappNodeOrderEntity.getNodeName(),member.getId());
                /**
                 * 更新账号的状态为已激活-即已经购买节点
                 */
//                dappMemberDao.updateMemberActiveStatus(1,member.getId());
                /**
                 * 直推奖励
                 */
                DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
                String refererId = dappMemberEntity.getRefererId();
                DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId);
                DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode());
                BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue());
                BigDecimal subtract = transferDto.getAmount().subtract(new BigDecimal(systemProfitStr));
                BigDecimal directProfit = subtract.multiply(directProfitStr).setScale(6,BigDecimal.ROUND_DOWN);
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, null,dappSystemProfit.getId());
                DataDictionaryCustom directProfitDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                        DataDictionaryEnum.DIRECT_PROFIT.getType(),
                        DataDictionaryEnum.DIRECT_PROFIT.getCode());
                BigDecimal directProfitPercent = new BigDecimal(StrUtil.isEmpty(directProfitDic.getValue()) ? "0.1" : directProfitDic.getValue());
                BigDecimal amount = transferDto.getAmount();
                BigDecimal directProfit = amount.multiply(directProfitPercent).setScale(6,BigDecimal.ROUND_DOWN);
                //生成直推奖励的流水
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                        refererMember.getId(),
                        directProfit,
                        3,
                        1,
                        BigDecimal.ZERO,
                        null,
                        dappMemberNodeEntityNew.getId());
                dappFundFlowDao.insert(fundFlow);
                //发送转币消息
                /**
                 * 发送转币消息
                 */
                chainProducer.sendBnbTransferMsg(fundFlow.getId());
                //层级奖励30%
                chainProducer.sendLevelProfitMsg(dappSystemProfit.getId());
                //发送一个消息,计算当前是否有人可以出局
                chainProducer.sendMemberOutMsg(dappSystemProfit.getId());
            } else {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                if (flow.getStatus() == 1) {
src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java
New file
@@ -0,0 +1,28 @@
package cc.mrbird.febs.dapp.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "DappMemberNodeVo", description = "会员节点购买信息")
public class DappMemberNodeVo {
    /**
     * 节点编码
     */
    @ApiModelProperty(value = "节点编码")
    private String nodeCode;
    /**
     * 节点名称
     */
    @ApiModelProperty(value = "节点名称")
    private String nodeName;
    /**
     * 价格
     */
    @ApiModelProperty(value = "节点价格")
    private BigDecimal nodePrice;
}
src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java
New file
@@ -0,0 +1,38 @@
package cc.mrbird.febs.dapp.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "DappNodeOrderVo", description = "节点信息")
public class DappNodeOrderVo {
    /**
     * 节点编码
     */
    @ApiModelProperty(value = "节点编码")
    private String nodeCode;
    /**
     * 节点名称
     */
    @ApiModelProperty(value = "节点名称")
    private String nodeName;
    /**
     * 总数
     */
    @ApiModelProperty(value = "总数")
    private Integer totalCnt;
    /**
     * 剩余数量
     */
    @ApiModelProperty(value = "剩余数量")
    private Integer surplusCnt;
    /**
     * 价格
     */
    @ApiModelProperty(value = "价格")
    private BigDecimal price;
}
src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * @author 
@@ -55,4 +56,8 @@
    @ApiModelProperty(value = "保险池")
    private BigDecimal safePool;
    @ApiModelProperty(value = "会员节点购买信息")
    private List<DappMemberNodeVo> dappMemberNodeVos;
}
src/main/resources/application-dev.yml
@@ -29,11 +29,11 @@
    # Redis数据库索引(默认为 0)
    database: 11
    # Redis服务器地址
    host: 154.91.195.148
    host: 120.27.238.55
    # Redis服务器连接端口
    port: 6379
    port: 6479
    # Redis 密码
    password: dapp!@#123
    password: d3y6dsdl;f.327
    lettuce:
      pool:
        # 连接池中的最小空闲连接
@@ -47,10 +47,10 @@
    # 连接超时时间(毫秒)
    timeout: 5000
  rabbitmq:
    host: 154.91.195.148
    host: 120.27.238.55
    port: 5672
    username: xc_rabbit
    password: xuncong123
    username: ct_rabbit
    password: 123456
    publisher-confirm-type: correlated
system:
@@ -58,4 +58,4 @@
  chain-listener: false
  reset-job: false
  quartz-job: false
  debug: true
  debug: false
src/main/resources/mapper/dapp/DappFundFlowDao.xml
@@ -42,9 +42,9 @@
    <select id="selectByFromHash" resultType="cc.mrbird.febs.dapp.entity.DappFundFlowEntity">
        select * from dapp_fund_flow
        where from_hash=#{txHash}
        where from_hash = #{txHash}
          <if test="status != null">
              and status=#{status}
              and status = #{status}
          </if>
    </select>
src/main/resources/mapper/dapp/DappMemberNodeMapper.xml
New file
@@ -0,0 +1,30 @@
<?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.DappMemberNodeMapper">
    <select id="selectListByMemberId" resultType="cc.mrbird.febs.dapp.vo.DappMemberNodeVo">
        select
            a.node_code nodeCode,
            b.node_name nodeName,
            a.node_price nodePrice
        from dapp_member_node a
        inner join dapp_node_order b on a.node_id = b.id
        where a.member_id = #{memberId}
    </select>
    <select id="selectNodeByMemberId" resultType="cc.mrbird.febs.dapp.entity.DappMemberNodeEntity">
        select
            a.*
        from dapp_member_node a
        where a.member_id = #{memberId}
    </select>
    <select id="selectNodeByMemberIdAndNodeCode" resultType="cc.mrbird.febs.dapp.entity.DappMemberNodeEntity">
        select
            a.*
        from dapp_member_node a
        where a.member_id = #{memberId}
        and a.node_code = #{nodeCode}
    </select>
</mapper>
src/main/resources/mapper/dapp/DappNodeOrderMapper.xml
New file
@@ -0,0 +1,22 @@
<?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.DappNodeOrderMapper">
    <select id="selectNodeOrderList" resultType="cc.mrbird.febs.dapp.vo.DappNodeOrderVo">
        select
               a.node_code,
               a.node_name,
               a.total_cnt,
               a.surplus_cnt,
               a.price
        from dapp_node_order a
    </select>
    <select id="selectNodeOrderByNodeCode" resultType="cc.mrbird.febs.dapp.entity.DappNodeOrderEntity">
        select
               a.*
        from dapp_node_order a
        where a.node_code = #{nodeCode}
    </select>
</mapper>
src/test/java/cc/mrbird/febs/MemberTest.java
@@ -5,15 +5,12 @@
import cc.mrbird.febs.dapp.chain.ChainEnum;
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.contract.ContractMain;
import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.entity.DataDictionaryCustom;
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
import cc.mrbird.febs.dapp.mapper.DappMemberDao;
import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
@@ -21,7 +18,6 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.web3j.utils.Convert;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
@@ -80,8 +76,11 @@
    private SystemConstants systemConstants;
    @Test
    public void balance() {
        System.out.println(ObjectUtil.isEmpty(AppContants.FEE_ADDRESS_KEY));
        System.out.println(AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString());
        /**
         * 从contractAddress合约地址中转移对应发行的代币到address中
         */
        String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer("0x785D5Aa2951Ac4C6f28Dc593AF0b0536Dd3E82Fe",new BigDecimal(100));
        System.out.println(hash);
    }
    @Test