From 549f5b13855c9cee9b486c2759b9dddab5ce1b7f Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 26 Jul 2022 18:57:05 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |   16 +-
 src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java        |   10 ++
 src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java |    7 +
 src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java         |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |   35 +++++++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |    5 
 src/main/resources/application-prod.yml                                   |    4 
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |   11 ++
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |   36 +++++++
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java             |    3 
 src/main/java/cc/mrbird/febs/job/SystemTradeJob.java                      |    4 
 src/main/java/cc/mrbird/febs/dapp/utils/BoxUtils.java                     |  124 ++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java                   |    5 +
 15 files changed, 253 insertions(+), 13 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
index 7540a62..99bc06e 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -170,4 +170,7 @@
     public static final String RESP_PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANyCPnifddX7HYN/wexyqxt3cFCKoE1/+lCIv7i+Epo83xlwbRet6rTXyGX7JCs5qpg1UvC+LuB+Relv8bZPEwScLmu0B5awwDmY954974KD6Yn/JdHi2WT933QvmDs9PFqUfnQd0KhfAUF6eS2K0quwN9DOLX5UIcEZSE9SOwkdAgMBAAECgYAt52Mv4yo5qHQFavQoz9o09pFIAwPJ/mlSmJUo1VC0ERX0isX7FvZ0PTN3n2dxJCkSVI92lHDXxRGyvd4YsK9pdErGVL2DecbbER7069y94g/uHsYq15skzLlyUNhyu2FOUCsVFy+M/C0qk14z/xG1ze3GWNHP1oc1leAYpoWmAQJBAPXxRvYTxmZAFv3J4pcf/FXqmUXdbJI5sHWXe6Pcs+rIuil5ePqX6AQBoQ5PalYhe5/kKzr7Gy6GSzlpztuOV50CQQDlhrTNytQdDCNIOL8uw3t4D8mDGuslPcRoykmaCQhd4NvaqLZrBS8k+TuS2+v5ryng3HhcYjR0h1MHHG69En+BAkEAzt2G5mxzsIWv0QACi0LoKAwPp+g67jN/7SjhYk69Nnpnu4Lk80LacKQ+J588vf2j0jVE93NGxbdHhp8s0xfDMQJBAJFlOqVeRe28oaD/aYRLCqyse39Ujv6BWSj0c5li/WzSoxKpaxzyJMIsK2PFcn8xSbsKjigfgZELpDnN9gxJaoECQCn+tZB0g9WJMaGNCMdlStPHAO2ajS1HY6BV5Xq13hixAdp5bLzbg0GrY25MrpTCFBEqCx+7F4cYUvVazLuAK6g=";
 
     public static final LinkedList<String> ENCRYPT_METHOD = new LinkedList<>();
+
+    public static final String IDO_MEMBER_RECOMMEND_CNT = "IDO_MEMBER_RECOMMEND_CNT";
+    public static final String IDO_BOX_PRIZE = "IDO_BOX_PRIZE";
 }
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 b00028a..73d652d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -90,7 +90,16 @@
             "9378c6a5becdcade151e98b2ee30239bcb11642e362a068a5bc7667f3d17b1fc",
             "https://bsc-dataseed1.ninicoin.io",
             "0x46ac4921e58773ca22826df1640672b91b1db2b3",
-            "");
+            ""),
+
+    /**
+     * 卡牌
+     */
+    BSC_NFT_SDC("BSC", "0xf6b06a30196aa5e318232a3b61319eab0fd4a3bf",
+                           "9378c6a5becdcade151e98b2ee30239bcb11642e362a068a5bc7667f3d17b1fc",
+                           "https://bsc-dataseed1.ninicoin.io",
+                           "0x46ac4921e58773ca22826df1640672b91b1db2b3",
+                           "");
 
     private String chain;
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
index 1602c42..52e5100 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
@@ -24,4 +24,6 @@
     BigInteger blockNumber();
 
     BigInteger totalSupply();
+
+    BigInteger safeMintNFT(String address);
 }
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 66f037d..02acaf2 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -360,4 +360,40 @@
         }
         return BigInteger.ZERO;
     }
+
+    @Override
+    public BigInteger safeMintNFT(String toAddress) {
+        String gas = getGas();
+
+        try {
+            Credentials credentials = Credentials.create(privateKey);
+            EthGetTransactionCount ethGetTransactionCount = web3j
+                    .ethGetTransactionCount(ownerAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
+            BigInteger nonce = ethGetTransactionCount.getTransactionCount();
+            Function function = new Function("safeMint",
+                    Arrays.asList(new Address(toAddress)),
+                    Arrays.asList(new TypeReference<Type>() {
+                    }));
+
+            String encodedFunction = FunctionEncoder.encode(function);
+            RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
+                    Convert.toWei(gas, Convert.Unit.GWEI).toBigInteger(),
+                    Convert.toWei("1000000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);
+
+            byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+            String hexValue = Numeric.toHexString(signedMessage);
+
+            CompletableFuture<EthSendTransaction> ethSendTransactionCompletableFuture = web3j.ethSendRawTransaction(hexValue).sendAsync();
+            EthSendTransaction ethSendTransaction = ethSendTransactionCompletableFuture.get();
+
+            if (ethSendTransaction.hasError()) {
+                return "";
+            } else {
+                return ethSendTransaction.getTransactionHash();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
index d8c8e99..41cd567 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
@@ -113,4 +113,9 @@
     public BigInteger totalSupply() {
         return null;
     }
+
+    @Override
+    public BigInteger safeMintNFT(String address) {
+        return null;
+    }
 }
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 13e03e0..1501361 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -84,6 +84,13 @@
         return new FebsResponse().success().data(dappMemberService.findTeamList(teamListDto));
     }
 
+    @ApiOperation(value = "开盲盒", notes = "开盲盒")
+    @PostMapping(value = "/boxSurprise")
+    public FebsResponse boxSurprise() {
+        int cnt = dappWalletService.boxSurprise();
+        return new FebsResponse().success().data(cnt);
+    }
+
     @PostMapping(value = "/logout")
     public FebsResponse logout() {
         DappMemberEntity member = LoginUserUtil.getAppUser();
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 4db4774..627b4b9 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -47,7 +47,7 @@
     private BigDecimal amount;
 
     /**
-     * 类型 1-买入 2-卖出 3-采矿
+     * 类型 1-买入 2-卖出 3-采矿 4-返利 5-获取盲盒 6-开盲盒获取卡牌 7-推荐奖励
      */
     private Integer type;
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java
index 4acc664..41f39e2 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappWalletCoinEntity.java
@@ -25,4 +25,14 @@
 
     @TableField(exist = false)
     private String address;
+
+    /**
+     * usdt余额
+     */
+    private BigDecimal usdtAmount;
+
+    /**
+     * 盲盒数量
+     */
+    private Integer boxCnt;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
index 8603a96..e17101f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -39,4 +39,6 @@
     Long transfer(TransferDto transferDto);
 
     Map<String, BigDecimal> calPrice(PriceDto priceDto);
+
+    int boxSurprise();
 }
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 37201a8..fca3d0f 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
@@ -289,9 +289,12 @@
         } else {
             member.setNodeType(2);
         }
-
         dappMemberDao.insert(member);
 
+        DappWalletCoinEntity walletCoin = new DappWalletCoinEntity();
+        walletCoin.setMemberId(member.getId());
+        dappWalletCoinDao.insert(walletCoin);
+
         if (StrUtil.isEmpty(refererId)) {
             refererId = "0";
             // 若没有推荐人,则直接激活
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 c73c96b..3b66239 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
@@ -294,7 +294,7 @@
             }
 
             // 挖矿数量
-            BigDecimal mine = transferPoll.multiply(balance.divide(allInternet, instance.decimals(), RoundingMode.HALF_UP));
+            BigDecimal mine = transferPoll.multiply(new BigDecimal("0.2")).multiply(balance.divide(allInternet, instance.decimals(), RoundingMode.HALF_UP));
             if (mine.compareTo(BigDecimal.ZERO) < 1) {
                 continue;
             }
@@ -423,7 +423,9 @@
     }
 
     // 最低容量(百分比)
-    private final BigDecimal volProp = new BigDecimal("0.5");
+    private final BigDecimal volProp = new BigDecimal("2");
+    // 每日增/减百分比
+    private final BigDecimal changeProp = new BigDecimal("1");
 
     @Override
     public void transferPoolSetting() {
@@ -444,7 +446,7 @@
             transferPool.setTodayVol(total);
             transferPool.setTodayProp(volProp);
             transferPool.setFinishCnt(0);
-            transferPool.setFinishCnt(0);
+            transferPool.setUnFinishCnt(0);
             redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL, transferPool);
             redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, total);
 
@@ -462,8 +464,8 @@
         if (remain.compareTo(BigDecimal.ZERO) == 0) {
             int finishCnt = transferPool.getFinishCnt() + 1;
             BigDecimal targetProp = transferPool.getTodayProp();
-            if (finishCnt == 5) {
-                targetProp = transferPool.getTodayVol().add(volProp);
+            if (finishCnt == 1) {
+                targetProp = transferPool.getTodayVol().add(changeProp);
                 transferPool.setTodayProp(targetProp);
                 transferPool.setFinishCnt(0);
             } else {
@@ -478,8 +480,8 @@
         } else {
             int unFinishCnt = transferPool.getUnFinishCnt() + 1;
             BigDecimal targetProp = transferPool.getTodayProp();
-            if (unFinishCnt >= 3) {
-                targetProp = transferPool.getTodayProp().compareTo(volProp) == 0 ? volProp : transferPool.getTodayProp().subtract(volProp);
+            if (unFinishCnt >= 1) {
+                targetProp = transferPool.getTodayProp().compareTo(volProp) == 0 ? volProp : transferPool.getTodayProp().subtract(changeProp);
                 transferPool.setTodayProp(targetProp);
                 transferPool.setUnFinishCnt(0);
             } else {
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 efd0b74..845bbb5 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
@@ -17,6 +17,7 @@
 import cc.mrbird.febs.dapp.entity.*;
 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.WalletInfoVo;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -340,4 +341,38 @@
         map.put("y", y);
         return map;
     }
+
+    @Override
+    public int boxSurprise() {
+        DappMemberEntity member = LoginUserUtil.getAppUser();
+
+        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
+        if (walletCoin.getBoxCnt() < 1) {
+            throw new FebsException("盲盒数量不足");
+        }
+
+        walletCoin.setBoxCnt(walletCoin.getBoxCnt() - 1);
+        dappWalletCoinDao.updateById(walletCoin);
+
+        BoxUtil.Box box = BoxUtil.openBox();
+
+        DappFundFlowEntity boxFundFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(box.getIndex()), 6, 2, BigDecimal.ZERO);
+        dappFundFlowDao.insert(boxFundFlow);
+
+        new Thread(() -> {
+            try {
+                int count = box.getIndex();
+                while (count > 0) {
+                    ChainService.getInstance(ChainEnum.BSC_NFT_SDC.name()).safeMintNFT(member.getAddress());
+                    Thread.sleep(5000);
+                    count--;
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.error("发放卡牌错误", e);
+            }
+        }).start();
+
+        return box.getIndex();
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/utils/BoxUtils.java b/src/main/java/cc/mrbird/febs/dapp/utils/BoxUtils.java
new file mode 100644
index 0000000..be2c101
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/utils/BoxUtils.java
@@ -0,0 +1,124 @@
+package cc.mrbird.febs.dapp.utils;
+
+import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.common.utils.SpringContextUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author wzy
+ * @date 2022-07-14
+ **/
+@Slf4j
+public class BoxUtil {
+
+//    public static volatile List<Box> boxList = Collections.synchronizedList(new ArrayList<>());
+
+    private static final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class);
+    public synchronized static Box openBox() {
+        String redisStr =  redisUtils.getString(AppContants.IDO_BOX_PRIZE);
+        List<Box> boxList = JSONObject.parseArray(redisStr, Box.class);
+        if (CollUtil.isEmpty(boxList)) {
+            boxList = Collections.synchronizedList(new ArrayList<>());
+            Box box1 = new Box(1, 95);
+            Box box2 = new Box(2, 3);
+            Box box3 = new Box(3, 2);
+            boxList.add(box1);
+            boxList.add(box2);
+            boxList.add(box3);
+        }
+
+        int min = 1;
+        int minIndex = 1;
+        int max = 1;
+
+        for (int i = 0; i < boxList.size(); i++) {
+            Box box = boxList.get(i);
+            if (i != 0) {
+                Box lastBox = (Box) boxList.get(i - 1);
+                minIndex += lastBox.getCount();
+            }
+            max += box.getCount();
+            box.setMin(minIndex);
+            box.setMax(max);
+        }
+
+        int i = RandomUtil.randomInt(min, max);
+
+        Box result = new Box();
+        for (Box box : boxList) {
+            if (box.getMin() <= i && box.getMax() > i) {
+                result = box;
+                int count = box.getCount();
+                count--;
+
+                box.setCount(count);
+                if (count == 0) {
+                    boxList.remove(box);
+                }
+                break;
+            }
+        }
+        redisUtils.set(AppContants.IDO_BOX_PRIZE, JSONObject.toJSONString(boxList));
+        return result;
+    }
+
+    public static class Box {
+        private int index;
+
+        private int count;
+
+        public Box() {}
+
+        public Box(int index, int count) {
+            this.index = index;
+            this.count = count;
+        }
+
+        private int min;
+
+        private int max;
+
+        public int getIndex() {
+            return index;
+        }
+
+        public void setIndex(int index) {
+            this.index = index;
+        }
+
+        public int getCount() {
+            return count;
+        }
+
+        public void setCount(int count) {
+            this.count = count;
+        }
+
+        public int getMin() {
+            return min;
+        }
+
+        public void setMin(int min) {
+            this.min = min;
+        }
+
+        public int getMax() {
+            return max;
+        }
+
+        public void setMax(int max) {
+            this.max = max;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java b/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
index 712972e..d2ca19c 100644
--- a/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
+++ b/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
@@ -60,7 +60,9 @@
     /**
      * 挖矿
      *
-     * 以中转池成交数1:1出矿(中转池卖出多少,矿池则1:1出币),每个地址所得=出币量*(单个地址持币量/全网持币量)
+     * 以中转池成交数1:0.2出矿(中转池卖出多少,矿池则1:0.2出币),每个地址所得=出币量*(单个地址持币量/全网持币量)
+     * source限矿算法:
+     * TODO 按前一天价格,有跌幅则按实际产矿量减半。
      */
     @Scheduled(cron = "0 0 2 * * ?")
     public void mineJob() {
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 8baf176..d63a387 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -47,6 +47,6 @@
     time-zone: GMT+8
 
 system:
-  online-transfer: false
-  chain-listener: false
+  online-transfer: true
+  chain-listener: true
   trade-job: false
\ No newline at end of file

--
Gitblit v1.9.1