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