From 2cac4da22c22cea0525981ccb553822c7124f410 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Thu, 18 May 2023 12:51:05 +0800
Subject: [PATCH] twoCoin项目修改

---
 src/main/resources/mapper/dapp/DappNodeOrderMapper.xml                    |   22 ++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |   76 +++++-
 src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java |   15 +
 src/main/java/cc/mrbird/febs/FebsShiroApplication.java                    |    2 
 src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java              |   28 +-
 src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java                |   28 ++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |    9 
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |   19 +
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |   17 
 src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java                 |   38 +++
 src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java          |    7 
 src/test/java/cc/mrbird/febs/MemberTest.java                              |   11 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java         |   15 +
 src/main/resources/application-dev.yml                                    |   14 
 src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java                    |    3 
 src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java              |    7 
 src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java        |    1 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java        |   21 +
 src/main/resources/mapper/dapp/DappFundFlowDao.xml                        |    4 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |  178 +++++++++-------
 src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java        |   39 +++
 src/main/resources/mapper/dapp/DappMemberNodeMapper.xml                   |   30 ++
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |    7 
 src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java         |   35 +++
 src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java       |    2 
 src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java             |   25 ++
 src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java                    |    5 
 27 files changed, 507 insertions(+), 151 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/FebsShiroApplication.java b/src/main/java/cc/mrbird/febs/FebsShiroApplication.java
index 2363a2d..f331bd3 100644
--- a/src/main/java/cc/mrbird/febs/FebsShiroApplication.java
+++ b/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();
diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
index 09ff51f..753ce4c 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
+++ b/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");
     }
 
     /**
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
index 8a43cf4..8105bdc 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/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",
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
index de08042..16cf5f0 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/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();
diff --git a/src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java b/src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java
index 5c71ae5..ab27e50 100644
--- a/src/main/java/cc/mrbird/febs/dapp/contract/ContractInit.java
+++ b/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);
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java b/src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java
index 8cbaae8..13b97a4 100644
--- a/src/main/java/cc/mrbird/febs/dapp/contract/ContractMain.java
+++ b/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);
     }
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
index 5c21c91..c56bdbe 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
+++ b/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) {
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
index f1c18b1..c14c60b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
+++ b/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;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
index 65a298d..63304b7 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
+++ b/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;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java
new file mode 100644
index 0000000..e68f414
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberNodeEntity.java
@@ -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;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java
index 561e2a8..451ee8d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappNodeOrderEntity.java
+++ b/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;
+
+
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
index a9822d4..c6f3a9f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
+++ b/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"),
     // 复投盈利收益
diff --git a/src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java b/src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java
new file mode 100644
index 0000000..551be89
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/enumerate/NodeCodeEnum.java
@@ -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;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java
new file mode 100644
index 0000000..dd881c8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberNodeMapper.java
@@ -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);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java
new file mode 100644
index 0000000..205732a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappNodeOrderMapper.java
@@ -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);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
index 4df012c..7a9e10f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
+++ b/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();
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
index 6d3256e..f05d634 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -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();
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
index c472309..297436d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
+++ b/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;
         }
         //金额
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
index 33d8914..d1c6e22 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
+++ b/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) {
diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java
new file mode 100644
index 0000000..d138783
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/vo/DappMemberNodeVo.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java
new file mode 100644
index 0000000..5241fc0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/vo/DappNodeOrderVo.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
index 8eb8f89..e380048 100644
--- a/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
+++ b/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;
+
 }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 439c965..1763843 100644
--- a/src/main/resources/application-dev.yml
+++ b/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
\ No newline at end of file
+  debug: false
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappFundFlowDao.xml b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
index a44ab9c..26e0f0a 100644
--- a/src/main/resources/mapper/dapp/DappFundFlowDao.xml
+++ b/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>
 
diff --git a/src/main/resources/mapper/dapp/DappMemberNodeMapper.xml b/src/main/resources/mapper/dapp/DappMemberNodeMapper.xml
new file mode 100644
index 0000000..2a5c100
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappMemberNodeMapper.xml
@@ -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>
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappNodeOrderMapper.xml b/src/main/resources/mapper/dapp/DappNodeOrderMapper.xml
new file mode 100644
index 0000000..780dfad
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappNodeOrderMapper.xml
@@ -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>
\ No newline at end of file
diff --git a/src/test/java/cc/mrbird/febs/MemberTest.java b/src/test/java/cc/mrbird/febs/MemberTest.java
index ff90f5b..2db0429 100644
--- a/src/test/java/cc/mrbird/febs/MemberTest.java
+++ b/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

--
Gitblit v1.9.1