From 9fcc15d1e6e640466b10afb9f18a8fcf303c3a13 Mon Sep 17 00:00:00 2001
From: zainali5120 <512061637@qq.com>
Date: Sun, 06 Sep 2020 13:39:47 +0800
Subject: [PATCH] TRC20同步
---
src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsResult.java | 12 +++
src/main/java/com/xcong/excoin/modules/blackchain/service/Trc20Service.java | 48 ++++++++++++
src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java | 146 +++++++++++++++++++++++++++--------
src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java | 2
src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsData.java | 29 +++++++
5 files changed, 202 insertions(+), 35 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsData.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsData.java
new file mode 100644
index 0000000..4eae0f4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsData.java
@@ -0,0 +1,29 @@
+package com.xcong.excoin.modules.blackchain.model;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class Trc20TransactionsData {
+ // "from":"TM1zzNDZD2DPASbKcgdVoTYhfmYgtfwx9R",
+ private String from;
+ // "to":"TPSPfAZ8UG9WiXDNX6SbYHNpX46oLV6xAs",
+ private String to;
+ // "block_timestamp":1599234837000,
+ private Long block_timestamp;
+ // "value":"10000000",
+ private String value;
+ // "type":"Transfer",
+ private String type;
+ // "transaction_id":"b1ea5fd1e1ddde4d60656bd77061b28d7dd209e5890e237a95cd49dd182405f1",
+ private String transaction_id;
+
+ private Map<String,Object> token_info;
+ // "token_info":{
+ // "name":"Tether USD",
+ // "symbol":"USDT",
+ // "decimals":6,
+ // "address":"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
+ // }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsResult.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsResult.java
new file mode 100644
index 0000000..6b7875c
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/Trc20TransactionsResult.java
@@ -0,0 +1,12 @@
+package com.xcong.excoin.modules.blackchain.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Trc20TransactionsResult {
+
+ private boolean success;
+ private List<Trc20TransactionsData> data;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/Trc20Service.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/Trc20Service.java
new file mode 100644
index 0000000..21d2215
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/Trc20Service.java
@@ -0,0 +1,48 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.modules.blackchain.model.Trc20TransactionsData;
+import com.xcong.excoin.modules.blackchain.model.Trc20TransactionsResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * TRC20 服务类
+ * https://cn.developers.tron.network/reference
+ */
+public class Trc20Service {
+
+ private final static String FULL_NODE_URL = "https://api.trongrid.io";
+
+ public static Map<String,String> createAddress(){
+ String url ="https://api.trongrid.io/wallet/generateaddress";
+ // {privateKey=ed0bae6e49fa4dd8a622fe77baa0d6e4077155b28ed6637870745c6da3cf372e, address=THeRNk25ps69fzqhN6tZ4Ecxur3RvDNDtY, hexAddress=4154336ea2a3a26be8a722053ee26c61e3f7f3e0ec}
+ String s = HttpUtil.get(url);
+ return JSONObject.parseObject(s,Map.class);
+ }
+
+ /**
+ *
+ * @param address
+ * @param time 2020-09-07T00:00
+ * @return
+ */
+ public static List<Trc20TransactionsData> getAddressTransactions(String address,String time) {
+ String url = "https://api.trongrid.io/v1/accounts/"+address+"/transactions/trc20?only_confirmed=true&only_to=true&min_timestamp="+time+"&contract_address=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
+ //String url = "https://api.trongrid.io/v1/accounts/"+address+"/transactions/trc20?limit=100&contract_address=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&only_confirmed=true";
+ String s = HttpUtil.get(url);
+ Trc20TransactionsResult trc20TransactionsResult = JSONObject.parseObject(s, Trc20TransactionsResult.class);
+ if (trc20TransactionsResult.isSuccess()) {
+ return trc20TransactionsResult.getData();
+ } else {
+ return null;
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println(createAddress());
+ }
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java b/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java
index e617f0a..0c51f47 100644
--- a/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java
+++ b/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java
@@ -14,4 +14,6 @@
public void updateXrp();
+ public void updateTrc20();
+
}
diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java
index a0ef93b..e611d45 100644
--- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java
@@ -5,10 +5,7 @@
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
-import com.xcong.excoin.modules.blackchain.model.EosResult;
-import com.xcong.excoin.modules.blackchain.model.XrpTransResult;
-import com.xcong.excoin.modules.blackchain.model.XrpTransactions;
-import com.xcong.excoin.modules.blackchain.model.XrpTx;
+import com.xcong.excoin.modules.blackchain.model.*;
import com.xcong.excoin.modules.blackchain.service.*;
import com.xcong.excoin.modules.coin.service.BlockCoinService;
import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao;
@@ -38,7 +35,9 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* @author wzy
@@ -60,9 +59,11 @@
@Resource
private RedisUtils redisUtils;
- private final static String EOS_SEQ_KEY="eos_seq_key";
+ private final static String EOS_SEQ_KEY = "eos_seq_key";
private final static String xrp_update_key = "xrp_update_key";
+
+ private final static String trc20_update_key = "trc20_update_key";
@Transactional(rollbackFor = Exception.class)
@Override
@@ -100,7 +101,7 @@
BigDecimal newBalance = balance.subtract(early);
memberWalletCoinDao.updateBlockBalance(walletCoinEntity.getId(), newBalance, balance, 0);
- String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance);
+ String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance,null);
// 插入财务记录
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.USDT.name(), 1, 1);
@@ -150,7 +151,7 @@
BigDecimal newBalance = balance.subtract(early);
memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0);
- String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.ETH.name(), null, balance);
+ String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.ETH.name(), null, balance,null);
// 插入财务记录
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.ETH.name(), 1, 1);
@@ -200,7 +201,7 @@
BigDecimal newBalance = balance.subtract(early);
memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0);
- String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "OMNI", balance);
+ String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "OMNI", balance,null);
ThreadPoolUtils.sendDingTalk(5);
MemberEntity member = memberDao.selectById(memberId);
@@ -248,7 +249,7 @@
BigDecimal newBalance = balance.subtract(early);
memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0);
- String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.BTC.name(), null, balance);
+ String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.BTC.name(), null, balance,null);
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.BTC.name(), 1, 1);
ThreadPoolUtils.sendDingTalk(5);
@@ -268,49 +269,49 @@
@Override
public void updateEos() {
// 获取上次读取的序号
- int pos= 0;
+ int pos = 0;
//每次获取的条数
int offset = 10;
String eosSeq = redisUtils.getString(EOS_SEQ_KEY);
- if(StringUtils.isNotBlank(eosSeq)){
+ if (StringUtils.isNotBlank(eosSeq)) {
pos = Integer.valueOf(eosSeq);
}
// 记录最大的seq
int seq = pos;
List<EosResult> actions = EosService.getActions(pos, offset);
- if(CollectionUtils.isNotEmpty(actions)){
- for(EosResult eosResult:actions){
+ if (CollectionUtils.isNotEmpty(actions)) {
+ for (EosResult eosResult : actions) {
String to = eosResult.getTo();
Integer accountActionSeq = eosResult.getAccountActionSeq();
- if(accountActionSeq>seq){
+ if (accountActionSeq > seq) {
seq = accountActionSeq;
}
- if(!EosService.ACCOUNT.equals(to)){
+ if (!EosService.ACCOUNT.equals(to)) {
// 判断是否是收款
continue;
}
// 处理收款
String quantity = eosResult.getQuantity();
String memo = eosResult.getMemo();
- if(StringUtils.isBlank(memo)){
+ if (StringUtils.isBlank(memo)) {
// 没有标记的跳过
continue;
}
- if(StringUtils.isNotBlank(quantity)){
+ if (StringUtils.isNotBlank(quantity)) {
// 转账额
String amountStr = quantity.split("")[0];
BigDecimal amount = new BigDecimal(amountStr);
List<MemberCoinAddressEntity> memberCoinAddress = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.EOS.name(), memo);
- if(CollectionUtils.isNotEmpty(memberCoinAddress)){
+ if (CollectionUtils.isNotEmpty(memberCoinAddress)) {
MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddress.get(0);
// 用户ID
Long memberId = memberCoinAddressEntity.getMemberId();
MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.EOS.name());
- if(memberCoinAddressEntity!=null){
- memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(),amount,BigDecimal.ZERO,0);
+ if (memberCoinAddressEntity != null) {
+ memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0);
// 添加冲币记录
- String orderNo = insertCoinCharge(EosService.ACCOUNT,memberId,amount,CoinTypeEnum.EOS.name(),memo,BigDecimal.ZERO);
+ String orderNo = insertCoinCharge(EosService.ACCOUNT, memberId, amount, CoinTypeEnum.EOS.name(), memo, BigDecimal.ZERO,null);
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.EOS.name(), 1, 1);
ThreadPoolUtils.sendDingTalk(5);
@@ -327,8 +328,8 @@
}
}
// 最后更新seq 即下次查询的起始位置 在本次最大的基础上加一
- if(seq>0 && seq>pos){
- redisUtils.set(EOS_SEQ_KEY,seq+1);
+ if (seq > 0 && seq > pos) {
+ redisUtils.set(EOS_SEQ_KEY, seq + 1);
}
}
@@ -336,15 +337,15 @@
// 首先去查redis上的上次同步时间
Object lastUpdateTime = redisUtils.get(xrp_update_key);
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd hh:mm:ss");
- Date start =null;
- if(lastUpdateTime==null) {
+ Date start = null;
+ if (lastUpdateTime == null) {
// 没有 说明是第一次同步 此时从第一天开始同步2020 0716开始
try {
start = format.parse("2020-07-16 12:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
- }else {
+ } else {
// 有上次时间
try {
start = format.parse(lastUpdateTime.toString());
@@ -360,34 +361,34 @@
redisUtils.set(xrp_update_key, updateTime);
// 判断有无
List<XrpTransactions> list = result.getTransactions();
- if(CollectionUtils.isNotEmpty(list)) {
+ if (CollectionUtils.isNotEmpty(list)) {
// 不为空 说明有转入记录
- for(XrpTransactions item:list) {
+ for (XrpTransactions item : list) {
XrpTx data = item.getTx();
Integer amountOld = data.getAmount();
// 除以1000000
BigDecimal amount = new BigDecimal(amountOld).divide(new BigDecimal(1000000));
Integer memoInt = data.getDestinationTag();
// 没有标签直接返回
- if(memoInt==null){
+ if (memoInt == null) {
continue;
}
String memo = memoInt.toString();
String destination = data.getDestination();
// 判断收款人是不是系统账号
- if(!XrpService.ACCOUNT.equals(destination)){
+ if (!XrpService.ACCOUNT.equals(destination)) {
continue;
}
List<MemberCoinAddressEntity> memberCoinAddress = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.XRP.name(), memo);
- if(CollectionUtils.isNotEmpty(memberCoinAddress)){
+ if (CollectionUtils.isNotEmpty(memberCoinAddress)) {
MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddress.get(0);
// 用户ID
Long memberId = memberCoinAddressEntity.getMemberId();
MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.XRP.name());
- if(memberCoinAddressEntity!=null){
- memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(),amount,BigDecimal.ZERO,0);
+ if (memberCoinAddressEntity != null) {
+ memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0);
// 添加冲币记录
- String orderNo = insertCoinCharge(XrpService.ACCOUNT,memberId,amount,CoinTypeEnum.XRP.name(),memo,BigDecimal.ZERO);
+ String orderNo = insertCoinCharge(XrpService.ACCOUNT, memberId, amount, CoinTypeEnum.XRP.name(), memo, BigDecimal.ZERO,null);
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.XRP.name(), 1, 1);
ThreadPoolUtils.sendDingTalk(5);
@@ -406,6 +407,80 @@
}
+ @Override
+ public void updateTrc20() {
+ // 首先去查redis上的上次同步时间
+ Object lastUpdateTime = redisUtils.get(trc20_update_key);
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
+ String start = null;
+ if (lastUpdateTime == null) {
+ // 没有 说明是第一次同步 此时从第一天开始同步2020 0905开始
+ start = "2020-09-05'T'00:00";
+ } else {
+ // 有上次时间
+ start = lastUpdateTime.toString();
+ }
+
+ // 去查询上次同步时间后的所有记录
+ //Trc20Service.getAddressTransactions()
+ // 写入本次更新时间
+ String updateTime = format.format(new Date());
+ redisUtils.set(trc20_update_key, updateTime);
+ // 判断有无
+ List<MemberCoinAddressEntity> addressList = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "TRC20");
+ if (CollectionUtils.isNotEmpty(addressList)) {
+ Map<String, Object> hashParam = new HashMap<>();
+ for (MemberCoinAddressEntity coinAddressEntity : addressList) {
+ String address = coinAddressEntity.getAddress();
+ List<Trc20TransactionsData> addressTransactions = Trc20Service.getAddressTransactions(address, start);
+ if (CollectionUtils.isNotEmpty(addressTransactions)) {
+ for (Trc20TransactionsData trc20TransactionsData : addressTransactions) {
+ String transactionId = trc20TransactionsData.getTransaction_id();
+ String value = trc20TransactionsData.getValue();
+ // 本次转账金额
+ BigDecimal amount = new BigDecimal(value).divide(new BigDecimal("1000000"));
+ // 校验token是否为trc20USD
+ if (trc20TransactionsData.getToken_info() != null && trc20TransactionsData.getToken_info().containsKey("address")) {
+ String tokenTrc = trc20TransactionsData.getToken_info().get("address").toString();
+ if (!"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t".equals(tokenTrc)) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ // 校验hash是否已同步过
+ hashParam.put("hash", transactionId);
+ List<MemberCoinChargeEntity> memberCoinChargeEntities = memberCoinChargeDao.selectByMap(hashParam);
+ if (CollectionUtils.isNotEmpty(memberCoinChargeEntities)) {
+ // 若已同步过
+ continue;
+ }
+ // 添加钱包余额
+ // 用户ID
+ Long memberId = coinAddressEntity.getMemberId();
+ MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
+
+ memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0);
+ // 添加冲币记录
+ String orderNo = insertCoinCharge(address, memberId, amount, CoinTypeEnum.USDT.name(), "TRC20", BigDecimal.ZERO,transactionId);
+ LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.USDT.name(), 1, 1);
+
+ ThreadPoolUtils.sendDingTalk(5);
+ MemberEntity member = memberDao.selectById(memberId);
+ if (StrUtil.isNotBlank(member.getPhone())) {
+ //String amountEos = amount + "XRP";
+ Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
+ } else {
+ SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
+ }
+
+ }
+ }
+ }
+ }
+
+ }
+
private String generateNo() {
// 生成订单号
Long timestamp = System.currentTimeMillis();
@@ -414,7 +489,7 @@
return String.valueOf(timestamp).substring(2) + random;
}
- public String insertCoinCharge(String address, Long memberId, BigDecimal newBalance, String symbol, String tag, BigDecimal lastAmount) {
+ public String insertCoinCharge(String address, Long memberId, BigDecimal newBalance, String symbol, String tag, BigDecimal lastAmount,String hash) {
MemberCoinChargeEntity memberCoinChargeEntity = new MemberCoinChargeEntity();
memberCoinChargeEntity.setAddress(address);
memberCoinChargeEntity.setMemberId(memberId);
@@ -423,6 +498,7 @@
memberCoinChargeEntity.setTag(tag);
memberCoinChargeEntity.setStatus(1);
memberCoinChargeEntity.setLastAmount(lastAmount);
+ memberCoinChargeEntity.setHash(hash);
String orderNo = generateNo();
memberCoinChargeEntity.setOrderCode(orderNo);
memberCoinChargeDao.insert(memberCoinChargeEntity);
--
Gitblit v1.9.1