| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.jsoup.Jsoup; |
| | | import org.jsoup.nodes.Document; |
| | | import org.jsoup.nodes.Element; |
| | | import org.jsoup.select.Elements; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.math.BigInteger; |
| | | import java.math.RoundingMode; |
| | | import java.net.MalformedURLException; |
| | | import java.net.URL; |
| | | import java.util.*; |
| | | |
| | | /** |
| | |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | private final DappOnlineTransferDao dappOnlineTransferDao; |
| | | private final ChainProducer chainProducer; |
| | | private final DappSymbolDailyPriceMapper dappSymbolDailyPriceMapper; |
| | | private final DappMemberBoxRecordMapper dappMemberBoxRecordMapper; |
| | | private final DappWalletCoinDao dappWalletCoinDao; |
| | | |
| | | |
| | | @Override |
| | |
| | | Object makePoolObj = redisUtils.get(AppContants.REDIS_KEY_MAKE_POOL_CNT); |
| | | BigDecimal balance; |
| | | if (makePoolObj == null) { |
| | | balance = ChainService.getInstance(ChainEnum.BSC_TFC_MAKE.name()).balanceOf(ChainEnum.BSC_TFC_MAKE.getAddress()); |
| | | balance = ChainService.getInstance(ChainEnum.BSC_TFC.name()).balanceOf(ChainEnum.BSC_TFC.getAddress()); |
| | | redisUtils.set(AppContants.REDIS_KEY_MAKE_POOL_CNT, balance); |
| | | } else { |
| | | balance = (BigDecimal) makePoolObj; |
| | |
| | | system.setUsdtTotal(usdtTotal); |
| | | system.setUsdtRemain(usdtRemain); |
| | | |
| | | system.setFeeRatio(BigDecimal.TEN); |
| | | system.setFeeRatio(new BigDecimal("7")); |
| | | system.setBuyFeeRatio(new BigDecimal("3")); |
| | | return system; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void tradeNftProfitDistribute(Long id) { |
| | | DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id); |
| | | |
| | | BigInteger totalNFT = ChainService.getInstance(ChainEnum.BSC_TFC.name()).totalSupply(); |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | // public static void main(String[] args) throws IOException { |
| | | // Document parse = Jsoup.parse(new URL("https://bscscan.com/token/generic-tokenholders2?a=0x03c7d3f141c5f03971604958170e253362e13be6"), 10000000); |
| | | // |
| | | // Elements tbodys = parse.getElementsByTag("tbody"); |
| | | // |
| | | // Element tbody = tbodys.get(0); |
| | | // |
| | | // Elements elements = tbody.getElementsMatchingOwnText("^0x.*$"); |
| | | // |
| | | // String text = elements.get(0).text(); |
| | | // System.out.println(1111); |
| | | // } |
| | | |
| | | @Override |
| | | public void mining() { |
| | | ContractChainService contract = ChainService.getInstance(ChainEnum.BSC_TFC.name()); |
| | | // 发行量 |
| | |
| | | BigDecimal allInternet = new BigDecimal(totalSupply).subtract(totalUnHold); |
| | | // 中转池交易量 |
| | | BigDecimal transferPoll = (BigDecimal) transferPoolObj; |
| | | |
| | | // 判断今日价格比前一日价格是否跌了,若是,则今天挖矿减半 |
| | | BigDecimal downReduce = BigDecimal.ONE; |
| | | if (symbolPriceUpOrDown()) { |
| | | downReduce = new BigDecimal("0.5"); |
| | | } |
| | | |
| | | BigDecimal totalMineCnt = transferPoll.multiply(new BigDecimal("0.2")).multiply(downReduce); |
| | | |
| | | List<DappMemberEntity> allMembers = dappMemberDao.selectList(null); |
| | | if (CollUtil.isEmpty(allMembers)) { |
| | |
| | | } |
| | | |
| | | // 挖矿数量 |
| | | BigDecimal mine = transferPoll.multiply(new BigDecimal("0.2")).multiply(balance.divide(allInternet, instance.decimals(), RoundingMode.HALF_UP)); |
| | | BigDecimal mine = totalMineCnt.multiply(balance.divide(allInternet, instance.decimals(), RoundingMode.HALF_UP)); |
| | | if (mine.compareTo(BigDecimal.ZERO) < 1) { |
| | | continue; |
| | | } |
| | |
| | | } |
| | | |
| | | // 判断系统是否启动,如满足条件则启动系统 |
| | | String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); |
| | | if (!"start".equals(hasStart)) { |
| | | DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_START_TARGET); |
| | | BigDecimal target = new BigDecimal(dic.getValue()); |
| | | |
| | | // 若源池中的USDT达到或超过8万U,则启动整个系统 |
| | | BigDecimal balance = ChainService.getInstance(ChainEnum.BSC_USDT_SOURCE.name()).balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress()); |
| | | if (target.compareTo(balance) < 1) { |
| | | redisUtils.set(AppContants.SYSTEM_START_FLAG, "start"); |
| | | |
| | | // 启动系统 |
| | | startSystem(); |
| | | } |
| | | } |
| | | // String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); |
| | | // if (!"start".equals(hasStart)) { |
| | | // DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_START_TARGET); |
| | | // BigDecimal target = new BigDecimal(dic.getValue()); |
| | | // |
| | | // // 若源池中的USDT达到或超过8万U,则启动整个系统 |
| | | // BigDecimal balance = ChainService.getInstance(ChainEnum.BSC_USDT_SOURCE.name()).balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress()); |
| | | // if (target.compareTo(balance) < 1) { |
| | | // redisUtils.set(AppContants.SYSTEM_START_FLAG, "start"); |
| | | // |
| | | // // 启动系统 |
| | | // startSystem(); |
| | | // } |
| | | // } |
| | | } |
| | | |
| | | @Override |
| | | public void userBuyReward(Long id) { |
| | | // 系统未启动不参与 |
| | | String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); |
| | | if (!"start".equals(hasStart)) { |
| | | if (!systemHasStart()) { |
| | | return; |
| | | } |
| | | |
| | |
| | | DappMemberEntity member = dappMemberDao.selectById(fundFlow.getMemberId()); |
| | | DappMemberEntity referer = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); |
| | | if (referer == null || "admin".equals(referer.getAccountType())) { |
| | | return; |
| | | } |
| | | |
| | | if (!hasProfit(referer.getAddress())) { |
| | | return; |
| | | } |
| | | |
| | |
| | | redisUtils.set(AppContants.REDIS_KEY_USDT_OUT_LIMIT, total); |
| | | redisUtils.set(AppContants.REDIS_KEY_USDT_OUT_LIMIT_REMAIN, total); |
| | | } |
| | | |
| | | private boolean symbolPriceUpOrDown() { |
| | | String dailyPrice = redisUtils.getString(AppContants.REDIS_KEY_SYMBOL_DAILY_PRICE); |
| | | BigDecimal lastDayPrice = BigDecimal.ZERO; |
| | | if (StrUtil.isNotBlank(dailyPrice)) { |
| | | lastDayPrice = new BigDecimal(dailyPrice); |
| | | } |
| | | |
| | | ContractChainService tfcInstance = ChainService.getInstance(ChainEnum.BSC_TFC.name()); |
| | | // 源池币种数量 |
| | | BigDecimal tfcBalance = tfcInstance.balanceOf(ChainEnum.BSC_TFC.getAddress()); |
| | | |
| | | // 源池USDT数量 |
| | | BigDecimal usdtBalance = ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOf(ChainEnum.BSC_USDT.getAddress()); |
| | | |
| | | BigDecimal todayPrice = tfcBalance.divide(usdtBalance, tfcInstance.decimals(), RoundingMode.HALF_UP); |
| | | |
| | | DappSymbolDailyPriceEntity dailyPriceEntity = new DappSymbolDailyPriceEntity(); |
| | | dailyPriceEntity.setPrice(todayPrice); |
| | | this.dappSymbolDailyPriceMapper.insert(dailyPriceEntity); |
| | | |
| | | redisUtils.set(AppContants.REDIS_KEY_SYMBOL_DAILY_PRICE, todayPrice.toString()); |
| | | |
| | | // 如果价格有跌幅,则挖矿减半 |
| | | return todayPrice.compareTo(lastDayPrice) < 0; |
| | | } |
| | | |
| | | @Override |
| | | public void boxCnt(Long id) { |
| | | DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id); |
| | | |
| | | DappMemberEntity member = dappMemberDao.selectById(fundFlow.getMemberId()); |
| | | DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); |
| | | if (parent == null) { |
| | | return; |
| | | } |
| | | |
| | | DappMemberBoxRecordEntity memberBox = dappMemberBoxRecordMapper.selectByFromMemberId(fundFlow.getMemberId()); |
| | | if (memberBox != null) { |
| | | return; |
| | | } |
| | | |
| | | if (!hasProfit(parent.getAddress())) { |
| | | return; |
| | | } |
| | | |
| | | DataDictionaryCustom boxRecommendCnt = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_BOX_RECOMMEND_CNT); |
| | | int box = 0; |
| | | // 需要第一次购买,才在推荐中加1 |
| | | Object parentRecommend = redisUtils.hget(AppContants.IDO_MEMBER_RECOMMEND_CNT, parent.getAddress()); |
| | | if (parentRecommend == null) { |
| | | redisUtils.hset(AppContants.IDO_MEMBER_RECOMMEND_CNT, parent.getAddress(), 1); |
| | | } else { |
| | | int i = (int) parentRecommend; |
| | | |
| | | // 如果超过10个,则新增一个盲盒,并重置推荐人数 |
| | | if (++i == new Integer(boxRecommendCnt.getValue())) { |
| | | box = 1; |
| | | redisUtils.hset(AppContants.IDO_MEMBER_RECOMMEND_CNT, parent.getAddress(), 0); |
| | | } else { |
| | | redisUtils.hset(AppContants.IDO_MEMBER_RECOMMEND_CNT, parent.getAddress(), i); |
| | | } |
| | | } |
| | | |
| | | if (box > 0) { |
| | | DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(parent.getId()); |
| | | walletCoin.setBoxCnt(walletCoin.getBoxCnt() + box); |
| | | dappWalletCoinDao.updateById(walletCoin); |
| | | |
| | | DappMemberBoxRecordEntity memberBoxRecordEntity = new DappMemberBoxRecordEntity(); |
| | | memberBoxRecordEntity.setMemberId(parent.getId()); |
| | | memberBoxRecordEntity.setAddress(parent.getAddress()); |
| | | memberBoxRecordEntity.setFromMemberId(member.getId()); |
| | | memberBoxRecordEntity.setFromAddress(member.getAddress()); |
| | | this.dappMemberBoxRecordMapper.insert(memberBoxRecordEntity); |
| | | |
| | | DappFundFlowEntity boxFundFlow = new DappFundFlowEntity(parent.getId(), new BigDecimal(box), 5, 2, BigDecimal.ZERO); |
| | | dappFundFlowDao.insert(boxFundFlow); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public boolean systemHasStart() { |
| | | String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); |
| | | if (!"start".equals(hasStart)) { |
| | | log.info("系统未启动"); |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal newestPrice() { |
| | | if (systemHasStart()) { |
| | | String dailyPrice = redisUtils.getString(AppContants.REDIS_KEY_SYMBOL_DAILY_PRICE); |
| | | return StrUtil.isNotBlank(dailyPrice) ? new BigDecimal(dailyPrice) : BigDecimal.ZERO; |
| | | } else { |
| | | return new BigDecimal("0.05"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean hasProfit(String address) { |
| | | BigDecimal balance = ChainService.getInstance(ChainEnum.BSC_TFC.name()).balanceOf(address); |
| | | BigDecimal usdtBalance = balance.multiply(newestPrice()); |
| | | |
| | | DataDictionaryCustom data = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_MINI_HOLD_COIN_LIMIT); |
| | | BigDecimal miniLimit = new BigDecimal(data.getValue()); |
| | | if (usdtBalance.compareTo(miniLimit) < 0) { |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | } |