From 96798c173cd783bc7e641dabbb02d1e8e91318db Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 14 Jul 2022 17:24:59 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/utils/BoxUtil.java                      |  118 +++++++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |   22 ++-
 src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java         |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |    8 +
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |    2 
 src/main/resources/application-test.yml                                   |    2 
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |   15 ++
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |   56 +++++++-
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java  |    2 
 src/test/java/cc/mrbird/febs/MemberTest.java                              |   27 ++++
 src/test/java/cc/mrbird/febs/ChainTest.java                               |   50 ++++---
 src/main/resources/application-dev.yml                                    |    2 
 src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java                   |    5 
 13 files changed, 264 insertions(+), 47 deletions(-)

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 eeb6d7d..dac3462 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -14,13 +14,24 @@
      * 0x55d398326f99059fF775485246999027B3197955
      * 测试链 0x337610d27c682E347C9cD60BD4b3b107C9d34dDd
      */
-    BSC_USDT("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
-            "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
+    BSC_USDT("BSC",
+            "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
+            "",
             "https://bsc-dataseed1.ninicoin.io",
             "0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68",
             ""),
 
     /**
+     * NFT
+     */
+    BSC_NFT_SDC("BSC",
+            "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
+            "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
+            "https://bsc-dataseed1.ninicoin.io",
+            "0x03c7D3f141c5F03971604958170E253362e13BE6",
+            ""),
+
+    /**
      * 币安链 代币合约
      * 测试链 0xdd92ea2f41d807a60b29004bf7db807d8ac09212
      * 正式 0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68 https://bsc-dataseed1.ninicoin.io
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..c19d42e 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();
+
+    String safeMintNFT(String toAddress);
 }
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..73ba60b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -54,14 +54,14 @@
     }
 
     public static void main(String[] args) throws IOException {
-        HttpService service = new HttpService("https://bsc-dataseed1.ninicoin.io");
-        Web3j web3j = Web3j.build(service);
-        long start = System.currentTimeMillis();
-        Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
-        EthBlockNumber send = request.send();
-        BigInteger bigInteger = Numeric.decodeQuantity(send.getResult());
-        long end = System.currentTimeMillis();
-        System.out.println(end - start);
+//        HttpService service = new HttpService("https://bsc-dataseed1.ninicoin.io");
+//        Web3j web3j = Web3j.build(service);
+//        long start = System.currentTimeMillis();
+//        Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
+//        EthBlockNumber send = request.send();
+//        BigInteger bigInteger = Numeric.decodeQuantity(send.getResult());
+//        long end = System.currentTimeMillis();
+//        System.out.println(end - start);
 
 //        String address = "0x971c09aa9735eb98459b17ec8b48932d24cbb931";
 //        String nonce = "0x1d5f7444107bc02e980deda39d0fce21b06c9da4233a19cb11124cb5bfefc9ec";
@@ -192,8 +192,10 @@
         } else {
             String resp = HttpUtil.get("https://gbsc.blockscan.com/gasapi.ashx?apikey=key&method=gasoracle");
             JSONObject data = JSONObject.parseObject(resp);
-            gas = data.getString("FastGasPrice");
+            Map<String, String> result = data.getObject("result", Map.class);
+            gas = result.get("FastGasPrice");
         }
+
         return StrUtil.isBlank(gas) ? "35" : gas;
     }
 
@@ -360,4 +362,40 @@
         }
         return BigInteger.ZERO;
     }
+
+    @Override
+    public String 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("100000", 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..0dc154a 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 String safeMintNFT(String toAddress) {
+        return null;
+    }
 }
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 6a6b336..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-采矿 5-获取盲盒 6-开盲盒获取卡牌
+     * 类型 1-买入 2-卖出 3-采矿 4-返利 5-获取盲盒 6-开盲盒获取卡牌 7-推荐奖励
      */
     private Integer type;
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
index 5743c8b..d53c186 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -57,7 +57,7 @@
 
         redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.log.getBlockNumber());
         // 判断对方打款地址是否为源池地址
-        if (ChainEnum.BSC_TFC_SOURCE.getAddress().toLowerCase().equals(e.to)) {
+        if (ChainEnum.BSC_USDT.getAddress().toLowerCase().equals(e.to)) {
             log.info("触发USDT合约监听事件");
             redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, e.log.getBlockNumber());
 
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 50a05e5..5723b06 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
@@ -511,7 +511,17 @@
 
     @Override
     public void idoBuy(DappMemberEntity member, BigDecimal amount) {
+        DappIdoAssetsEntity idoAssets = dappIdoAssetsDao.selectByMemberId(member.getId());
+        BigDecimal count = amount.divide(new BigDecimal(50), 0, RoundingMode.HALF_UP);
+        BigDecimal coinAmount = new BigDecimal(1000).multiply(count);
+        idoAssets.setCoinAmount(idoAssets.getCoinAmount().add(coinAmount));
+        idoAssets.setUsdtAmount(idoAssets.getUsdtAmount().add(amount));
+        dappIdoAssetsDao.updateById(idoAssets);
+
         DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId());
+        if (parent == null) {
+            return;
+        }
 
         int box = 0;
         Object parentRecommend = redisUtils.hget(AppContants.IDO_MEMBER_RECOMMEND_CNT, parent.getAddress());
@@ -534,12 +544,10 @@
             dappFundFlowDao.insert(boxFundFlow);
         }
 
-        DappIdoAssetsEntity idoAssets = dappIdoAssetsDao.selectByMemberId(member.getId());
-        BigDecimal count = amount.divide(new BigDecimal(50), 0, RoundingMode.HALF_UP);
-        BigDecimal coinAmount = new BigDecimal(1000).multiply(count);
-        idoAssets.setBoxCnt(idoAssets.getBoxCnt() + box);
-        idoAssets.setCoinAmount(idoAssets.getCoinAmount().add(coinAmount));
-        idoAssets.setUsdtAmount(idoAssets.getUsdtAmount().add(amount));
-        dappIdoAssetsDao.updateById(idoAssets);
+        BigDecimal returnCoin = coinAmount.multiply(new BigDecimal(5).divide(new BigDecimal(100), 2, RoundingMode.UP));
+        DappIdoAssetsEntity parentIdoAssets = dappIdoAssetsDao.selectById(parent.getId());
+        parentIdoAssets.setBoxCnt(parentIdoAssets.getBoxCnt() + box);
+        parentIdoAssets.setCoinAmount(parentIdoAssets.getCoinAmount().add(returnCoin));
+        dappIdoAssetsDao.updateById(parentIdoAssets);
     }
 }
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 3233151..8cd297b 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;
@@ -267,8 +268,13 @@
         idoAssets.setBoxCnt(idoAssets.getBoxCnt() - 1);
         dappIdoAssetsDao.updateById(idoAssets);
 
+        BoxUtil.Box box = BoxUtil.openBox();
+
+        DappFundFlowEntity boxFundFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(box.getIndex()), 6, 2, BigDecimal.ZERO);
+        dappFundFlowDao.insert(boxFundFlow);
+
         // TODO 线上转账
 
-        return 1;
+        return box.getIndex();
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/utils/BoxUtil.java b/src/main/java/cc/mrbird/febs/dapp/utils/BoxUtil.java
new file mode 100644
index 0000000..4055d35
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/utils/BoxUtil.java
@@ -0,0 +1,118 @@
+package cc.mrbird.febs.dapp.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.RandomUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2022-07-14
+ **/
+@Slf4j
+public class BoxUtil {
+
+    public static volatile List<Box> boxList = Collections.synchronizedList(new ArrayList<>());
+
+    public synchronized static Box openBox() {
+        if (CollUtil.isEmpty(boxList)) {
+            Box box1 = new Box(1, 6);
+            Box box2 = new Box(2, 1);
+            Box box3 = new Box(3, 1);
+            Box box4 = new Box(4, 1);
+            Box box5 = new Box(5, 1);
+            boxList.add(box1);
+            boxList.add(box2);
+            boxList.add(box3);
+            boxList.add(box4);
+            boxList.add(box5);
+        }
+
+        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) {
+                minIndex += boxList.get(i - 1).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;
+            }
+        }
+
+        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;
+        }
+    }
+
+}
+
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 31be489..0fed63c 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -50,5 +50,5 @@
 
 system:
   online-transfer: false
-  chain-listener: true
+  chain-listener: false
   trade-job: false
\ No newline at end of file
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index da24a34..77e84ce 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -50,5 +50,5 @@
 
 system:
   online-transfer: false
-  chain-listener: true
+  chain-listener: false
   trade-job: false
diff --git a/src/test/java/cc/mrbird/febs/ChainTest.java b/src/test/java/cc/mrbird/febs/ChainTest.java
index 29ea566..b81c4cc 100644
--- a/src/test/java/cc/mrbird/febs/ChainTest.java
+++ b/src/test/java/cc/mrbird/febs/ChainTest.java
@@ -8,7 +8,6 @@
 import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao;
 import cc.mrbird.febs.dapp.service.DappSystemService;
-import cc.mrbird.febs.job.SystemTradeJob;
 import cc.mrbird.febs.rabbit.producer.ChainProducer;
 import com.alibaba.fastjson.JSONObject;
 import org.junit.jupiter.api.Test;
@@ -36,24 +35,24 @@
         System.out.println(instance.balanceOf("0x0000000000000000000000000000000000000001"));
     }
 
-    @Autowired
-    private SystemTradeJob systemTradeJob;
-
-    @Test
-    public void transferPoolTest() {
-        systemTradeJob.transferPoolVol();
-    }
-
-
-    @Test
-    public void sourceUsdtTest() {
-        systemTradeJob.sourcePoolUsdtOutLimit();
-    }
-
-    @Test
-    public void poolTest() {
-        systemTradeJob.transferPoolVol();
-    }
+//    @Autowired
+//    private SystemTradeJob systemTradeJob;
+//
+//    @Test
+//    public void transferPoolTest() {
+//        systemTradeJob.transferPoolVol();
+//    }
+//
+//
+//    @Test
+//    public void sourceUsdtTest() {
+//        systemTradeJob.sourcePoolUsdtOutLimit();
+//    }
+//
+//    @Test
+//    public void poolTest() {
+//        systemTradeJob.transferPoolVol();
+//    }
 
     @Autowired
     private DappOnlineTransferDao dappOnlineTransferDao;
@@ -79,10 +78,10 @@
         System.out.println(ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber());
     }
 
-    @Test
-    public void mineTest() {
-        systemTradeJob.mineJob();
-    }
+//    @Test
+//    public void mineTest() {
+//        systemTradeJob.mineJob();
+//    }
 
     @Autowired
     private DappFundFlowDao dappFundFlowDao;
@@ -114,4 +113,9 @@
     public void profitTest() {
         dappSystemService.tradeProfitDistribute(31L);
     }
+
+    @Test
+    public void safeMintTest() {
+        ChainService.getInstance(ChainEnum.BSC_NFT_SDC.name()).safeMintNFT("0x4EbDCA102623b46a47042D580dddAdE2a53D057F");
+    }
 }
diff --git a/src/test/java/cc/mrbird/febs/MemberTest.java b/src/test/java/cc/mrbird/febs/MemberTest.java
index d598044..5ca1b85 100644
--- a/src/test/java/cc/mrbird/febs/MemberTest.java
+++ b/src/test/java/cc/mrbird/febs/MemberTest.java
@@ -6,13 +6,18 @@
 import cc.mrbird.febs.dapp.entity.DataDictionaryCustom;
 import cc.mrbird.febs.dapp.mapper.DappMemberDao;
 import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper;
+import cc.mrbird.febs.dapp.utils.BoxUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.web3j.abi.datatypes.Int;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author wzy
@@ -59,7 +64,7 @@
                 break;
             }
             parentId = parentMember.getRefererId();
-            if(StringUtils.isBlank(parentId) || "0".equals(parentId)){
+            if (StringUtils.isBlank(parentId) || "0".equals(parentId)) {
                 break;
             }
             if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
@@ -77,4 +82,24 @@
     public void redisTest() {
         redisUtils.hget("1234567", "1111111");
     }
+
+    private Map<Integer, Integer> map = new HashMap<>();
+    private int BOX_OPEN_CNT = 0;
+
+    @Test
+    public void boxOpenTest() {
+        Runnable runnable = new Runnable() {
+            @Override
+            public void run() {
+                BoxUtil.openBox();
+            }
+        };
+
+        for (int i = 0; i < 12; i++) {
+            Thread thread = new Thread(runnable);
+            thread.start();
+        }
+
+    }
+
 }

--
Gitblit v1.9.1