From 6562e04677044d4c15ee303d922bfeabe56320fb Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Tue, 07 Jun 2022 19:50:34 +0800 Subject: [PATCH] test and fix some bugs --- src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java | 54 +++++++- src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | 7 + src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java | 4 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java | 39 +++--- src/main/java/cc/mrbird/febs/dapp/chain/EthService.java | 56 +++++++- src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java | 45 +++++- src/main/java/cc/mrbird/febs/job/ChainListenerJob.java | 3 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java | 4 src/main/java/cc/mrbird/febs/common/contants/AppContants.java | 5 src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java | 34 ++-- src/main/java/cc/mrbird/febs/job/RedisLinkHoldJob.java | 23 +++ src/test/java/cc/mrbird/febs/ChainTest.java | 19 +++ src/main/resources/application-dev.yml | 8 src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java | 31 +++++ src/main/resources/mapper/dapp/DappOnlineTransferDao.xml | 2 15 files changed, 259 insertions(+), 75 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 1a2ccce..dd411ce 100644 --- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java +++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java @@ -142,6 +142,8 @@ public static final String REDIS_KEY_BLOCK_ETH_NEWEST_NUM = "BLOCK_ETH_NEWEST_NUM"; public static final String REDIS_KEY_BLOCK_ETH_INCREMENT_NUM = "BLOCK_ETH_INCREMENT_NUM"; + public static final String REDIS_KEY_MAKE_POOL_CNT = "MAKE_POOL_CNT"; + public static final String DIC_TYPE_DISTRIBUTE_PROP = "DISTRIBUTE_PROP"; public static final String DIC_TYPE_SYSTEM_SETTING = "SYSTEM_SETTING"; @@ -153,4 +155,7 @@ public static final String DIC_VALUE_SYSTEM_NODE_CNT_LIMIT = "SYSTEM_NODE_CNT_LIMIT"; public static final String DESTROY_ADDRESS = "0x0000000000000000000000000000000000000000"; + + public static final String SYMBOL_USDT = "USDT"; + public static final String SYMBOL_COIN = "TFC"; } 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 120be8a..89084ca 100644 --- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java +++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java @@ -29,30 +29,31 @@ * 0x55d398326f99059fF775485246999027B3197955 * 测试链 0x337610d27c682E347C9cD60BD4b3b107C9d34dDd */ - BSC_USDT("BSC", "0x971c09aA9735EB98459B17EC8b48932D24CbB931", - "0x5f38d0e63157f535fc21f89ea13ec3cd245691c20795c1d2cb60233b3ba7bb47", - "https://bsc-dataseed1.ninicoin.io", - "0x55d398326f99059fF775485246999027B3197955", + BSC_USDT("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25", + "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd", ""), /** * 币安链 代币合约 * 测试链 0xdd92ea2f41d807a60b29004bf7db807d8ac09212 - * + * 正式 0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68 https://bsc-dataseed1.ninicoin.io + * */ BSC_TFC("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25", "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf", - "https://bsc-dataseed1.ninicoin.io", - "0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0xdd92ea2f41d807a60b29004bf7db807d8ac09212", ""), /** * 源池币 */ - BSC_TFC_SOURCE("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25", - "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf", - "https://bsc-dataseed1.ninicoin.io", - "0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68", + BSC_TFC_SOURCE("BSC", "0x4EbDCA102623b46a47042D580dddAdE2a53D057F", + "0x81c2c02d0c106c1e32ab060a37f6eb279c0649c30ea5cc1c4951e6a8dd4e963c", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0xdd92ea2f41d807a60b29004bf7db807d8ac09212", ""), /** @@ -60,8 +61,8 @@ */ BSC_USDT_SOURCE("BSC", "0x4EbDCA102623b46a47042D580dddAdE2a53D057F", "0x81c2c02d0c106c1e32ab060a37f6eb279c0649c30ea5cc1c4951e6a8dd4e963c", - "https://bsc-dataseed1.ninicoin.io", - "0x55d398326f99059fF775485246999027B3197955", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd", ""), /** @@ -69,8 +70,8 @@ */ BSC_TFC_MAKE("BSC", "0xBae24dAa3aB94cfF8114a16A4267D769b3a651F8", "0xc0cabaf5f1fce227e5f1b8a7f83a5dc28972389ffc59559d7852ce8d27c3bec4", - "https://bsc-dataseed1.ninicoin.io", - "0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0xdd92ea2f41d807a60b29004bf7db807d8ac09212", ""), /** @@ -78,8 +79,8 @@ */ BSC_TFC_TECH("BSC", "0xD998DA7362360eFC6daDFEd6E9a32E70640d7600", "", - "https://bsc-dataseed1.ninicoin.io", - "0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0xdd92ea2f41d807a60b29004bf7db807d8ac09212", ""), /** @@ -87,8 +88,8 @@ */ BSC_TFC_REWARD("BSC", "0xBae24dAa3aB94cfF8114a16A4267D769b3a651F8", "0xc0cabaf5f1fce227e5f1b8a7f83a5dc28972389ffc59559d7852ce8d27c3bec4", - "https://bsc-dataseed1.ninicoin.io", - "0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68", + "https://data-seed-prebsc-1-s3.binance.org:8545", + "0xdd92ea2f41d807a60b29004bf7db807d8ac09212", ""); private String chain; 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 a30bf95..1b043f1 100644 --- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java +++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java @@ -27,10 +27,7 @@ import java.math.BigInteger; import java.math.RoundingMode; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -210,7 +207,7 @@ @Override public String transfer(String address, BigDecimal amount) { try { - return tokenTransferFrom(privateKey, address, ownerAddress, amount.toPlainString()); + return tokenTransfer(privateKey, ownerAddress, address, amount.toPlainString()); } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); return ""; @@ -220,7 +217,7 @@ public String tokenTransferFrom(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException { String gas = getGas(); - BigDecimal amountPow = new BigDecimal(amount).multiply(new BigDecimal("1000000")); + BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals())); amount = amountPow.toPlainString(); if (amount.contains(".")) { amount = amount.substring(0, amount.lastIndexOf(".")); @@ -229,12 +226,53 @@ Credentials credentials = Credentials.create(privateKey); EthGetTransactionCount ethGetTransactionCount = web3j - .ethGetTransactionCount(toAddress, DefaultBlockParameterName.LATEST).sendAsync().get(); + .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get(); BigInteger nonce = ethGetTransactionCount.getTransactionCount(); Function function = new Function("transferFrom", Arrays.asList(new Address(fromAddress), new Address(toAddress), new Uint256(new BigInteger(amount))), + 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(); + } + } + + public String tokenTransfer(String privateKey, String fromAddress, String toAddress, String amount) throws ExecutionException, InterruptedException { + String gas = getGas(); + + BigDecimal amountPow = new BigDecimal(amount).multiply(BigDecimal.TEN.pow(decimals())); + amount = amountPow.toPlainString(); + if (amount.contains(".")) { + amount = amount.substring(0, amount.lastIndexOf(".")); + } + + Credentials credentials = Credentials.create(privateKey); + + EthGetTransactionCount ethGetTransactionCount = web3j + .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get(); + + BigInteger nonce = ethGetTransactionCount.getTransactionCount(); + + Function function = new Function("transfer", + Arrays.asList(new Address(toAddress), new Uint256(new BigInteger(amount))), Arrays.asList(new TypeReference<Type>() { })); @@ -289,9 +327,9 @@ if (send != null) { return Numeric.decodeQuantity(send.getResult()); + } else { + throw new NullPointerException(); } - - return new BigInteger("1"); } } 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 a1198ff..b57d48b 100644 --- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java +++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java @@ -19,6 +19,10 @@ public static final int WITHDRAW_STATUS_AGREE = 2; public static final int WITHDRAW_STATUS_DISAGREE = 3; + + public static final int TYPE_BUY = 1; + public static final int TYPE_SALE = 2; + public DappFundFlowEntity() {} public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee) { diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java index 73da44e..025ebc4 100644 --- a/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java +++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java @@ -10,23 +10,23 @@ @TableName("dapp_online_transfer") public class DappOnlineTransferEntity extends BaseEntity { - public DappOnlineTransferEntity() {} - - public DappOnlineTransferEntity(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String batchNo) { - new DappOnlineTransferEntity(address, amount, type, targetType, symbol, fromType, "BSC", batchNo); - } - - public DappOnlineTransferEntity(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String chain, String batchNo) { - this.address = address; - this.amount = amount; - this.type = type; - this.targetType = targetType; - this.symbol = symbol; - this.chain = chain; - this.batchNo = batchNo; - this.fromType = fromType; - this.hasFinish = 2; - } +// public DappOnlineTransferEntity() {} +// +// public DappOnlineTransferEntity(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String batchNo) { +// new DappOnlineTransferEntity(address, amount, type, targetType, symbol, fromType, "BSC", batchNo); +// } +// +// public DappOnlineTransferEntity(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String chain, String batchNo) { +// this.address = address; +// this.amount = amount; +// this.type = type; +// this.targetType = targetType; +// this.symbol = symbol; +// this.chain = chain; +// this.batchNo = batchNo; +// this.fromType = fromType; +// this.hasFinish = 2; +// } private String address; diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java index e3e573d..8ee15b5 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java @@ -15,6 +15,7 @@ import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao; import cc.mrbird.febs.dapp.service.DappMemberService; import cc.mrbird.febs.dapp.service.DappSystemService; +import cc.mrbird.febs.dapp.utils.OnlineTransferUtil; import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; @@ -113,8 +114,7 @@ // 划点分配 dappSystemService.tradeProfitDistribute(fundFlow.getId()); - DappOnlineTransferEntity record = new DappOnlineTransferEntity(e.from, transferAmount, fundFlow.getType(), 1, ChainEnum.BSC_TFC_SOURCE.name(), "USDT", fundFlow.getId().toString()); - dappOnlineTransferDao.insert(record); + OnlineTransferUtil.addTransfer(e.from, transferAmount, fundFlow.getType(), 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, fundFlow.getId().toString()); Map<String, String> map = new HashMap<>(); map.put("batchNo", fundFlow.getId().toString()); 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 ad0ad6d..e4a5c7d 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 @@ -13,6 +13,7 @@ import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao; import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.dapp.service.DappMemberService; +import cc.mrbird.febs.dapp.utils.OnlineTransferUtil; import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; @@ -58,7 +59,16 @@ redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.log.getBlockNumber()); // 判断对方打款地址是否为源池地址 - if (ChainEnum.BSC_TFC_SOURCE.getAddress().equals(e.to)) { + if (ChainEnum.BSC_TFC_SOURCE.getAddress().toLowerCase().equals(e.to)) { + log.info("触发USDT合约监听事件"); + + // 如果得到触发,则休眠10秒。 因为此处监听器触发可能优先于前端调用transfer接口 + try { + Thread.sleep(10000); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name()); int decimals = sourceUsdtInstance.decimals(); int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(); @@ -77,8 +87,13 @@ String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); BigInteger tokens = e.tokens; - BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); + BigDecimal amount = new BigDecimal(tokens.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); DappFundFlowEntity fundFlow = dappFundFlowDao.selectByFromHash(e.log.getTransactionHash(), 1); + + if (fundFlow == null) { + log.info("本地无交易:{}", e.log.getTransactionHash()); + return; + } BigDecimal newPrice = fundFlow.getNewestPrice(); BigDecimal transferAmount = amount.divide(newPrice, tfcDecimals, RoundingMode.HALF_DOWN); @@ -91,8 +106,7 @@ // 如果系统会开启,则使用自动打款 if (!"start".equals(hasStart)) { - DappOnlineTransferEntity bsc = new DappOnlineTransferEntity(e.from, transferAmount, 1, 1, ChainEnum.BSC_TFC_MAKE.name(), "BSC", fundFlow.getId().toString()); - dappOnlineTransferDao.insert(bsc); + OnlineTransferUtil.addTransfer(e.from, transferAmount, 1, 1, ChainEnum.BSC_TFC_MAKE.name(), "BSC", fundFlow.getId().toString()); Map<String, String> map = new HashMap<>(); map.put("batchNo", fundFlow.getId().toString()); @@ -100,15 +114,24 @@ // 发送转账消息 chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map)); - } - DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_START_TARGET); - BigDecimal target = new BigDecimal(dic.getValue()); + 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 = sourceUsdtInstance.balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress()); - if (target.compareTo(balance) < 1) { - redisUtils.set(AppContants.SYSTEM_START_FLAG, "start"); + // 若源池中的USDT达到或超过8万U,则启动整个系统 + BigDecimal balance = sourceUsdtInstance.balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress()); + if (target.compareTo(balance) < 1) { + redisUtils.set(AppContants.SYSTEM_START_FLAG, "start"); + } + } else { + OnlineTransferUtil.addTransfer(e.from, transferAmount, 1, 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, fundFlow.getId().toString()); + + Map<String, String> map = new HashMap<>(); + map.put("batchNo", fundFlow.getId().toString()); + map.put("type", "flow"); + + // 发送转账消息 + chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map)); } } } 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 e19fcc2..f4fc826 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 @@ -10,6 +10,7 @@ import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappSystemService; +import cc.mrbird.febs.dapp.utils.OnlineTransferUtil; import cc.mrbird.febs.dapp.vo.RedisTransferPoolVo; import cc.mrbird.febs.dapp.vo.SlipSettingVo; import cc.mrbird.febs.rabbit.producer.ChainProducer; @@ -75,6 +76,27 @@ DappMemberEntity member = LoginUserUtil.getAppUser(); SystemDto system = new SystemDto(); + String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); + // 启动未启动 + if (!"start".equals(hasStart)) { + system.setFeeRatio(BigDecimal.TEN); + system.setUsdtRemain(BigDecimal.ZERO); + system.setUsdtTotal(BigDecimal.ZERO); + system.setSaleRemain(BigDecimal.ZERO); + system.setSaleTotal(BigDecimal.ZERO); + 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()); + redisUtils.set(AppContants.REDIS_KEY_MAKE_POOL_CNT, balance); + } else { + balance = (BigDecimal) makePoolObj; + } + system.setBuyRemain(balance); + system.setBuyTotal(balance); + + return system; + } RedisTransferPoolVo transferPool = (RedisTransferPoolVo) redisUtils.get(AppContants.REDIS_KEY_TRANSFER_POOL_VOL); BigDecimal poolRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN); @@ -134,8 +156,7 @@ // 销毁 // instance.transfer(AppContants.DESTROY_ADDRESS, destroy); - DappOnlineTransferEntity destroyRecord = new DappOnlineTransferEntity(AppContants.DESTROY_ADDRESS, destroy, fundflow.getType(), 3, ChainEnum.BSC_TFC_SOURCE.name(), "TFC", fundflow.getId().toString()); - dappOnlineTransferDao.insert(destroyRecord); + OnlineTransferUtil.addTransfer(AppContants.DESTROY_ADDRESS, destroy, fundflow.getType(), 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, fundflow.getId().toString()); // 总分发金额 BigDecimal distrbAmount = fee.subtract(destroy); @@ -158,8 +179,7 @@ DataDictionaryCustom distribDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_DISTRIBUTE_PROP, String.valueOf(i)); BigDecimal total = distrbAmount.multiply(new BigDecimal(distribDic.getValue()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); - DappOnlineTransferEntity distribRecord = new DappOnlineTransferEntity(parent.getAddress(), total, fundflow.getType(), 1, ChainEnum.BSC_TFC_SOURCE.name(), "TFC", fundflow.getId().toString()); - dappOnlineTransferDao.insert(distribRecord); + OnlineTransferUtil.addTransfer(parent.getAddress(), total, fundflow.getType(), 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, fundflow.getId().toString()); nodeAmount = nodeAmount.subtract(total); } @@ -168,8 +188,7 @@ techAmount = techAmount.add(nodeAmount); // instance.transfer(ChainEnum.BSC_TFC_TECH.getAddress(), techAmount); - DappOnlineTransferEntity techRecord = new DappOnlineTransferEntity(ChainEnum.BSC_TFC_TECH.getAddress(), techAmount, fundflow.getType(), 2, ChainEnum.BSC_TFC_SOURCE.name(), "TFC", fundflow.getId().toString()); - dappOnlineTransferDao.insert(techRecord); + OnlineTransferUtil.addTransfer(ChainEnum.BSC_TFC_TECH.getAddress(), techAmount, fundflow.getType(), 2, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, fundflow.getId().toString()); Map<String, String> map = new HashMap<>(); map.put("batchNo", fundflow.getId().toString()); @@ -217,8 +236,7 @@ continue; } - DappOnlineTransferEntity tfc = new DappOnlineTransferEntity(member.getAddress(), mine, 3, 1, "TFC", ChainEnum.BSC_TFC.name(), batchNo); - dappOnlineTransferDao.insert(tfc); + OnlineTransferUtil.addTransfer(member.getAddress(), mine, 3, 1, ChainEnum.BSC_TFC.name(), AppContants.SYMBOL_COIN, batchNo); } Map<String, String> map = new HashMap<>(); @@ -245,8 +263,8 @@ } // TODO 线上转账,已注释 -// String txHash = ChainService.getInstance(transfer.getFromType()).transfer(transfer.getAddress(), transfer.getAmount()); -// transfer.setTxHash(txHash); + String txHash = ChainService.getInstance(transfer.getFromType()).transfer(transfer.getAddress(), transfer.getAmount()); + transfer.setTxHash(txHash); transfer.setHasFinish(1); transfer.setUpdateTime(new Date()); dappOnlineTransferDao.updateById(transfer); @@ -255,11 +273,25 @@ DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(Long.parseLong(batchNo)); fundFlow.setStatus(3); -// fundFlow.setToHash(txHash); + fundFlow.setToHash(txHash); dappFundFlowDao.updateById(fundFlow); } + // 修改剩余量 + if (AppContants.SYMBOL_COIN.equals(transfer.getSymbol())) { + + BigDecimal poolRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN); + redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, poolRemain.subtract(transfer.getAmount())); + } else { + + BigDecimal usdtRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_USDT_OUT_LIMIT_REMAIN); + usdtRemain = usdtRemain.subtract(transfer.getAmount()); + if (usdtRemain.compareTo(BigDecimal.ZERO) < 0) { + usdtRemain = BigDecimal.ZERO; + } + redisUtils.set(AppContants.REDIS_KEY_USDT_OUT_LIMIT_REMAIN, usdtRemain); + } } } } 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 92ae21b..8279bf7 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 @@ -204,6 +204,13 @@ // ChainService.getInstance(ChainEnum.BSC_USDT_SOURCE.name()).balanceOf(member.getAddress()); // ChainService.getInstance(ChainEnum.BSC_TFC_SOURCE.name()).balanceOf(member.getAddress()); + if (DappFundFlowEntity.TYPE_SALE == transferDto.getType()) { + String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); + if (!"start".equals(hasStart)) { + throw new FebsException("系统还未启动"); + } + } + DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), transferDto.getType(), 1, transferDto.getFee(), transferDto.getTxHash()); fundFlow.setNewestPrice(transferDto.getPrice()); dappFundFlowDao.insert(fundFlow); diff --git a/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java b/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java new file mode 100644 index 0000000..fec9376 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java @@ -0,0 +1,31 @@ +package cc.mrbird.febs.dapp.utils; + +import cc.mrbird.febs.common.utils.SpringContextUtil; +import cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity; +import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao; + +import java.math.BigDecimal; + +public class OnlineTransferUtil { + + private static final DappOnlineTransferDao dappOnlineTransferDao = SpringContextUtil.getBean(DappOnlineTransferDao.class); + + public static void addTransfer(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String batchNo) { + addTransfer(address, amount, type, targetType, fromType, symbol, "BSC", batchNo); + } + + public static void addTransfer(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String chain, String batchNo) { + DappOnlineTransferEntity transfer = new DappOnlineTransferEntity(); + transfer.setAddress(address); + transfer.setAmount(amount); + transfer.setType(type); + transfer.setTargetType(targetType); + transfer.setFromType(fromType); + transfer.setSymbol(symbol); + transfer.setChain(chain); + transfer.setBatchNo(batchNo); + transfer.setHasFinish(2); + + dappOnlineTransferDao.insert(transfer); + } +} diff --git a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java index 4a25c8a..a461f94 100644 --- a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java +++ b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java @@ -63,6 +63,7 @@ @Scheduled(cron = "0 0/5 * * * ? ") public void chainBlockUpdate() { + log.info("最新区块更新"); BigInteger blockNumber = ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber(); redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM, blockNumber); @@ -86,7 +87,7 @@ BigInteger incrementBlock = (BigInteger) incrementObj; // 最新区块小于增加区块 - if (newestBlock.compareTo(incrementBlock) < 0) { + if (newestBlock.compareTo(incrementBlock) <= 0) { return; } toIncrement = incrementBlock.add(BigInteger.ONE); diff --git a/src/main/java/cc/mrbird/febs/job/RedisLinkHoldJob.java b/src/main/java/cc/mrbird/febs/job/RedisLinkHoldJob.java new file mode 100644 index 0000000..f6be096 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/job/RedisLinkHoldJob.java @@ -0,0 +1,23 @@ +package cc.mrbird.febs.job; + +import cc.mrbird.febs.common.utils.RedisUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author wzy + * @date 2022-06-07 + **/ +@Component +public class RedisLinkHoldJob { + + @Autowired + private RedisUtils redisUtils; + + + @Scheduled(cron = "0/1 * * * * ?") + public void redisLinkHold() { + redisUtils.set("redis_link_hold", 1); + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1b0fee8..9ee5db1 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -2,7 +2,7 @@ datasource: dynamic: # 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗 - p6spy: false + p6spy: true hikari: connection-timeout: 30000 max-lifetime: 1800000 @@ -22,7 +22,7 @@ redis: # Redis数据库索引(默认为 0) - database: 0 + database: 6 # Redis服务器地址 host: 120.27.238.55 # Redis服务器连接端口 @@ -49,5 +49,5 @@ publisher-confirm-type: correlated system: - online-transfer: false - chain-listener: false \ No newline at end of file + online-transfer: true + chain-listener: true \ No newline at end of file diff --git a/src/main/resources/mapper/dapp/DappOnlineTransferDao.xml b/src/main/resources/mapper/dapp/DappOnlineTransferDao.xml index 9ab6c75..c68ceaf 100644 --- a/src/main/resources/mapper/dapp/DappOnlineTransferDao.xml +++ b/src/main/resources/mapper/dapp/DappOnlineTransferDao.xml @@ -2,7 +2,7 @@ <!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.DappOnlineTransferDao"> - <select id="selectByBatchNo" resultType="cc.mrbird.febs.dapp.entity.DappTransferRecordEntity"> + <select id="selectByBatchNo" resultType="cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity"> select * from dapp_online_transfer where batch_no=#{batchNo} </select> diff --git a/src/test/java/cc/mrbird/febs/ChainTest.java b/src/test/java/cc/mrbird/febs/ChainTest.java index 17001cb..ead7f11 100644 --- a/src/test/java/cc/mrbird/febs/ChainTest.java +++ b/src/test/java/cc/mrbird/febs/ChainTest.java @@ -3,10 +3,15 @@ import cc.mrbird.febs.dapp.chain.ChainEnum; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.chain.ContractChainService; +import cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity; +import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao; import cc.mrbird.febs.job.SystemTradeJob; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.util.List; /** * @author wzy @@ -35,4 +40,18 @@ public void sourceUsdtTest() { systemTradeJob.sourcePoolUsdtOutLimit(); } + + @Test + public void poolTest() { + systemTradeJob.transferPoolVol(); + } + + @Autowired + private DappOnlineTransferDao dappOnlineTransferDao; + + @Test + public void transferTest() { + System.out.println(ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(ChainEnum.BSC_USDT_SOURCE.getAddress(), BigDecimal.valueOf(6L))); + } + } -- Gitblit v1.9.1