| | |
| | | private final DappSymbolDailyPriceMapper dappSymbolDailyPriceMapper; |
| | | private final DappMemberBoxRecordMapper dappMemberBoxRecordMapper; |
| | | private final DappWalletCoinDao dappWalletCoinDao; |
| | | private final DappSdeWithdrawFeeDao dappSdeWithdrawFeeDao; |
| | | |
| | | |
| | | @Override |
| | |
| | | DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id); |
| | | String batchNo = RandomUtil.randomString(16) + id.toString(); |
| | | |
| | | Map<String, Integer> cardCntMap = nfcCardMap(); |
| | | |
| | | ContractChainService instance = ChainService.getInstance(ChainEnum.BSC_TFC.name()); |
| | | BigDecimal preNFTAmount; |
| | | BigDecimal distribAmount = fundFlow.getFee(); |
| | | if (fundFlow.getType() == 1) { |
| | | preNFTAmount = distribAmount.divide(new BigDecimal("5000"), 2, RoundingMode.HALF_UP); |
| | | BigDecimal totalBalance = BigDecimal.ZERO; |
| | | |
| | | Map<String, BigDecimal> balanceMap = new HashMap<>(); |
| | | for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) { |
| | | BigDecimal balance = instance.balanceOf(entry.getKey()); |
| | | |
| | | balanceMap.put(entry.getKey(), balance); |
| | | totalBalance = totalBalance.add(balance); |
| | | } |
| | | |
| | | BigDecimal finalTotalBalance = totalBalance; |
| | | balanceMap.forEach((key, value) -> { |
| | | DappMemberEntity member = dappMemberDao.selectByAddress(key, "BSC"); |
| | | |
| | | BigDecimal rate = value.divide(finalTotalBalance, 2, RoundingMode.HALF_UP); |
| | | BigDecimal memberProfit = fundFlow.getFee().multiply(rate); |
| | | DappFundFlowEntity distribFlow = new DappFundFlowEntity(member.getId(), memberProfit, 4, 2, BigDecimal.ZERO); |
| | | dappFundFlowDao.insert(distribFlow); |
| | | |
| | | OnlineTransferUtil.addTransfer(key, memberProfit, 4, 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | }); |
| | | |
| | | } else if (fundFlow.getType() == 2) { |
| | | BigDecimal destroyAmount = fundFlow.getFee().multiply(new BigDecimal("2").divide(new BigDecimal("7"), instance.decimals(), RoundingMode.HALF_UP)); |
| | | // 销毁 |
| | | OnlineTransferUtil.addTransfer(AppContants.DESTROY_ADDRESS, destroyAmount, fundFlow.getType(), 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | distribAmount = fundFlow.getFee().subtract(destroyAmount); |
| | | |
| | | preNFTAmount = distribAmount.divide(new BigDecimal("5000"), 2, RoundingMode.HALF_UP); |
| | | BigDecimal remain = fundFlow.getFee().subtract(destroyAmount); |
| | | BigDecimal preNftAmount = remain.divide(new BigDecimal(5000), 2, RoundingMode.HALF_UP); |
| | | |
| | | BigDecimal total = BigDecimal.ZERO; |
| | | for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) { |
| | | DappMemberEntity member = dappMemberDao.selectByAddress(entry.getKey(), "BSC"); |
| | | BigDecimal profit = new BigDecimal(entry.getValue()).multiply(preNftAmount); |
| | | |
| | | DappFundFlowEntity distribFlow = new DappFundFlowEntity(member.getId(), profit, 4, 2, BigDecimal.ZERO); |
| | | dappFundFlowDao.insert(distribFlow); |
| | | OnlineTransferUtil.addTransfer(entry.getKey(), profit, 4, 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | |
| | | total = total.add(profit); |
| | | } |
| | | ; |
| | | |
| | | if (remain.subtract(total).compareTo(BigDecimal.ZERO) > 0) { |
| | | OnlineTransferUtil.addTransfer(ChainEnum.BSC_TFC_FEE.getAddress(), remain.subtract(total), 4, 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | } |
| | | |
| | | } else { |
| | | return; |
| | | } |
| | | |
| | | List<DappMemberEntity> allMembers = dappMemberDao.selectList(null); |
| | | if (CollUtil.isEmpty(allMembers)) { |
| | | return; |
| | | } |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("batchNo", batchNo); |
| | | |
| | | BigDecimal total = BigDecimal.ZERO; |
| | | for (DappMemberEntity member : allMembers) { |
| | | BigDecimal balance = instance.balanceOf(member.getAddress()); |
| | | BigDecimal memberProfit = balance.multiply(preNFTAmount); |
| | | |
| | | // 返利 |
| | | OnlineTransferUtil.addTransfer(member.getAddress(), memberProfit, fundFlow.getType(), 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | |
| | | DappFundFlowEntity distribFlow = new DappFundFlowEntity(member.getId(), memberProfit, 4, 2, BigDecimal.ZERO); |
| | | dappFundFlowDao.insert(distribFlow); |
| | | |
| | | total = total.add(memberProfit); |
| | | } |
| | | |
| | | BigDecimal remain = distribAmount.subtract(total); |
| | | // 剩余的 |
| | | OnlineTransferUtil.addTransfer(ChainEnum.BSC_TFC_TECH.getAddress(), remain, fundFlow.getType(), 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | // 发送转账消息 |
| | | chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map)); |
| | | } |
| | | |
| | | // public static void main(String[] args) throws IOException { |
| | |
| | | } |
| | | |
| | | // 最低容量(百分比) |
| | | private final BigDecimal volProp = new BigDecimal("2"); |
| | | private final BigDecimal volProp = new BigDecimal("5"); |
| | | // 每日增/减百分比 |
| | | private final BigDecimal changeProp = new BigDecimal("1"); |
| | | |
| | |
| | | public boolean systemHasStart() { |
| | | String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); |
| | | if (!"start".equals(hasStart)) { |
| | | log.info("系统未启动"); |
| | | return false; |
| | | } |
| | | |
| | |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 影子生态提现 扣除 10% 等值的tfc,作为手续费。 5%分配卡牌,5%销毁tfc |
| | | * |
| | | * @param data |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void sdmWithdrawFee(String data) { |
| | | JSONObject jsonObject = JSONObject.parseObject(data); |
| | | |
| | | String address = jsonObject.getString("address"); |
| | | if (!ChainEnum.BSC_TFC_FEE.getAddress().equals(address)) { |
| | | return; |
| | | } |
| | | |
| | | String flowId = jsonObject.getString("flow"); |
| | | BigDecimal totalFee = new BigDecimal(jsonObject.getString("fee")); |
| | | |
| | | BigDecimal cardProfit = totalFee.multiply(new BigDecimal("0.4")); |
| | | BigDecimal destroy = totalFee.subtract(cardProfit); |
| | | |
| | | BigDecimal preFee = cardProfit.divide(BigDecimal.valueOf(5000), ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(), RoundingMode.HALF_UP); |
| | | Map<String, Integer> cardCntMap = nfcCardMap(); |
| | | if (!cardCntMap.isEmpty()) { |
| | | for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) { |
| | | BigDecimal amount = preFee.multiply(new BigDecimal(entry.getValue())); |
| | | |
| | | DappMemberEntity member = dappMemberDao.selectByAddress(entry.getKey(), "BSC"); |
| | | if (member == null) { |
| | | continue; |
| | | } |
| | | |
| | | DappSdeWithdrawFeeEntity sdeWithdrawFee = new DappSdeWithdrawFeeEntity(member.getId(), member.getAddress(), amount, Long.parseLong(flowId)); |
| | | dappSdeWithdrawFeeDao.insert(sdeWithdrawFee); |
| | | } |
| | | } |
| | | |
| | | DappSdeWithdrawFeeEntity destroyFee = new DappSdeWithdrawFeeEntity(null, AppContants.DESTROY_ADDRESS, destroy, Long.parseLong(flowId)); |
| | | dappSdeWithdrawFeeDao.insert(destroyFee); |
| | | } |
| | | // @Override |
| | | // public void sdmWithdrawFee(String data) { |
| | | // JSONObject jsonObject = JSONObject.parseObject(data); |
| | | // |
| | | // String address = jsonObject.getString("address"); |
| | | // if (!ChainEnum.BSC_TFC_FEE.getAddress().equals(address)) { |
| | | // return; |
| | | // } |
| | | // |
| | | // BigDecimal totalFee = new BigDecimal(jsonObject.getString("fee")); |
| | | // String batchNo = RandomUtil.randomString(16); |
| | | // |
| | | // BigDecimal cardProfit = totalFee.multiply(new BigDecimal("0.4")); |
| | | // BigDecimal destroy = totalFee.subtract(cardProfit); |
| | | // |
| | | // BigDecimal preFee = cardProfit.divide(BigDecimal.valueOf(5000), ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(), RoundingMode.HALF_UP); |
| | | // |
| | | // Map<String, Integer> cardCntMap = nfcCardMap(); |
| | | // if (!cardCntMap.isEmpty()) { |
| | | // for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) { |
| | | // BigDecimal amount = preFee.multiply(new BigDecimal(entry.getValue())); |
| | | // |
| | | // DappMemberEntity member = dappMemberDao.selectByAddress(entry.getKey(), "BSC"); |
| | | // if (member == null) { |
| | | // continue; |
| | | // } |
| | | // DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), amount, 4, 2, null, null); |
| | | // dappFundFlowDao.insert(fundFlow); |
| | | // |
| | | // OnlineTransferUtil.addTransfer(entry.getKey(), amount, 5, 1, ChainEnum.BSC_TFC_FEE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | // } |
| | | // } |
| | | // |
| | | // OnlineTransferUtil.addTransfer(AppContants.DESTROY_ADDRESS, destroy, 5, 2, ChainEnum.BSC_TFC_FEE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | // |
| | | // Map<String, Object> map = new HashMap<>(); |
| | | // map.put("batchNo", batchNo); |
| | | // chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map)); |
| | | // } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void sdmWithdrawFeeDistrib() { |
| | | List<DappSdeWithdrawFeeEntity> list = dappSdeWithdrawFeeDao.selectShouldReturnList(); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return; |
| | | } |
| | | |
| | | String batchNo = RandomUtil.randomString(16); |
| | | list.forEach(item -> { |
| | | if (!AppContants.DESTROY_ADDRESS.equals(item.getAddress())) { |
| | | DappMemberEntity member = dappMemberDao.selectByAddress(item.getAddress(), "BSC"); |
| | | if (member == null) { |
| | | return; |
| | | } |
| | | |
| | | DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), item.getAmount(), 4, 2, null, null); |
| | | dappFundFlowDao.insert(fundFlow); |
| | | } |
| | | |
| | | OnlineTransferUtil.addTransfer(item.getAddress(), item.getAmount(), 5, 1, ChainEnum.BSC_TFC_FEE.name(), AppContants.SYMBOL_COIN, batchNo); |
| | | }); |
| | | dappSdeWithdrawFeeDao.updateHasReturnToFinish(); |
| | | |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("batchNo", batchNo); |
| | | chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map)); |
| | | } |
| | | |
| | | private Map<String, Integer> nfcCardMap() { |
| | | ContractChainService nftInstance = ChainService.getInstance(ChainEnum.BSC_NFT_SDC.name()); |
| | | BigInteger totalNFT = nftInstance.totalSupplyNFT(); |
| | | |
| | | Map<String, Integer> cardCntMap = new HashMap<>(); |
| | | for (int i = 0; i < totalNFT.intValue(); i++) { |
| | | String address = nftInstance.ownerOfNft(i + 1); |
| | | |
| | | Integer count = cardCntMap.get(address); |
| | | if (count == null) { |
| | | cardCntMap.put(address, 1); |
| | | } else { |
| | | cardCntMap.put(address, count + 1); |
| | | } |
| | | } |
| | | |
| | | return cardCntMap; |
| | | } |
| | | |
| | | @Override |