From b95cd12536ad4577adcc08dc8a2168c4fbb2413a Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 23 Nov 2021 15:06:40 +0800
Subject: [PATCH] add coin pool and tranfer

---
 src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java       |    1 
 src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java |   78 +++++++++++++++++++++----
 src/main/java/com/xcong/excoin/configurations/WebSocketConfig.java                  |    2 
 lib/abi-0.3.0.jar                                                                   |    0 
 src/test/java/com/xcong/excoin/GuijiTest.java                                       |   12 ++++
 src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java              |    2 
 src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java                  |    2 
 src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java |   30 ++++++++-
 src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java  |   21 ++++++-
 lib/core-0.3.0.jar                                                                  |    0 
 lib/utils-0.3.0.jar                                                                 |    0 
 pom.xml                                                                             |   23 +++++++
 12 files changed, 147 insertions(+), 24 deletions(-)

diff --git a/lib/abi-0.3.0.jar b/lib/abi-0.3.0.jar
new file mode 100644
index 0000000..cc34ed3
--- /dev/null
+++ b/lib/abi-0.3.0.jar
Binary files differ
diff --git a/lib/core-0.3.0.jar b/lib/core-0.3.0.jar
new file mode 100644
index 0000000..50f0684
--- /dev/null
+++ b/lib/core-0.3.0.jar
Binary files differ
diff --git a/lib/utils-0.3.0.jar b/lib/utils-0.3.0.jar
new file mode 100644
index 0000000..fb2216d
--- /dev/null
+++ b/lib/utils-0.3.0.jar
Binary files differ
diff --git a/pom.xml b/pom.xml
index df19e47..c31494b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -376,6 +376,29 @@
             <scope>system</scope>
             <systemPath>${basedir}/lib/utils-0.4.0.jar</systemPath>
         </dependency>
+
+
+        <dependency>
+            <groupId>org.tron.trident</groupId>
+            <artifactId>abi</artifactId>
+            <version>0.3.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/lib/abi-0.3.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>org.tron.trident</groupId>
+            <artifactId>utils</artifactId>
+            <version>0.3.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/lib/utils-0.3.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>org.tron.trident</groupId>
+            <artifactId>core</artifactId>
+            <version>0.3.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/lib/core-0.3.0.jar</systemPath>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java b/src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java
index c0f2424..1ebf9bd 100644
--- a/src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java
+++ b/src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java
@@ -6,5 +6,5 @@
  * @author wzy
  */
 public enum CoinTypeEnum {
-    USDT, BTC, ETH, LTC, EOS, XRP, BCH, ETC,BEA
+    USDT, BTC, ETH, LTC, EOS, XRP, BCH, ETC,BEA, XCT
 }
diff --git a/src/main/java/com/xcong/excoin/configurations/WebSocketConfig.java b/src/main/java/com/xcong/excoin/configurations/WebSocketConfig.java
index 31b5eeb..51711c3 100644
--- a/src/main/java/com/xcong/excoin/configurations/WebSocketConfig.java
+++ b/src/main/java/com/xcong/excoin/configurations/WebSocketConfig.java
@@ -4,7 +4,7 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
-@Configuration
+//@Configuration
 public class WebSocketConfig {
     /**
      * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java
index 2def102..e670392 100644
--- a/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/EthUsdtChargeDto.java
@@ -18,6 +18,7 @@
     public interface Symbol{
         String USDT_ERC20 = "USDT_ERC20";
         String USDT_TRC20 = "USDT_TRC20";
+        String COIN_TRC20 = "XCT_TRC20";
     }
 
     public EthUsdtChargeDto() {
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
index 48073ca..20aa50a 100644
--- a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
@@ -1,10 +1,12 @@
 package com.xcong.excoin.modules.blackchain.service.Impl;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.annotation.Resource;
 
+import com.xcong.excoin.common.enumerates.CoinTypeEnum;
 import com.xcong.excoin.modules.blackchain.service.*;
 import com.xcong.excoin.rabbit.producer.UsdtUpdateProducer;
 import lombok.extern.slf4j.Slf4j;
@@ -189,6 +191,30 @@
                             // 发送新增的地址到监听集合
                             usdtUpdateProducer.sendAddressMsg(address+","+"ERC20");
                         } else if ("TRC20".equals(lable)) {
+                            MemberCoinAddressEntity coinAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), CoinTypeEnum.XCT.name());
+                            if (coinAddress != null) {
+                                address = coinAddress.getAddress();
+                                key = coinAddress.getPrivateKey();
+                            } else {
+                                Map<String, String> usdtMap = Trc20Service.createAddress();
+                                address = usdtMap.get("address");
+                                key = usdtMap.get("privateKey");
+                                map.put("address", address);
+                                // 发送新增的地址到监听集合
+                                usdtUpdateProducer.sendAddressMsg(address+","+"TRC20");
+                            }
+                        }
+                        break;
+                    case "ROC":
+                        address = RocService.createWallet();
+                        map.put("address", address);
+                        break;
+                    case "XCT" :
+                        MemberCoinAddressEntity trc20Usdt = memberMapper.selectBlockAddressWithTag(Long.parseLong(mId), CoinTypeEnum.USDT.name(), "TRC20");
+                        if (trc20Usdt != null) {
+                            address = trc20Usdt.getAddress();
+                            key = trc20Usdt.getPrivateKey();
+                        } else {
                             Map<String, String> usdtMap = Trc20Service.createAddress();
                             address = usdtMap.get("address");
                             key = usdtMap.get("privateKey");
@@ -196,10 +222,6 @@
                             // 发送新增的地址到监听集合
                             usdtUpdateProducer.sendAddressMsg(address+","+"TRC20");
                         }
-                        break;
-                    case "ROC":
-                        address = RocService.createWallet();
-                        map.put("address", address);
                         break;
                     default:
                         break;
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java
index fbe30a5..eeb07a3 100644
--- a/src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java
@@ -20,6 +20,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 import org.tron.common.utils.ByteArray;
+import org.tron.trident.core.ApiWrapper;
+import org.tron.trident.core.contract.Contract;
+import org.tron.trident.core.contract.Trc20Contract;
 import org.tron.walletserver.WalletApi;
 
 import javax.annotation.Resource;
@@ -35,10 +38,14 @@
 public class TrxUsdtUpdateService {
 
     public static List<String> addressList = new ArrayList<>();
-    private static String http = "https://api.trongrid.io";
+    private static String http = "https://api.shasta.trongrid.io";
 
     private static String TRC20_CONTRACT_ADDRESS = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
 
+    /**
+     * 代币合约地址
+     */
+    public static String COIN_CONTRACT_ADDRESS = "TRTE68V3TJBLduBoJPLMgBsvwkq8LJBin6";
     /**
      * 手续费
      */
@@ -81,7 +88,7 @@
      * @param addressList
      * @param num
      */
-    private void httpTransactionInfo(List<String> addressList, Long num) {
+    public void httpTransactionInfo(List<String> addressList, Long num) {
         // 查询详情,包含了所有交易信息
         String transactionInfoByBlockNum = getblockbynum(BigInteger.valueOf(num));
         if (StringUtils.isBlank(transactionInfoByBlockNum)) {
@@ -259,8 +266,8 @@
         }
 
         BigDecimal amount = BigDecimal.ZERO;
-        //相匹配的合约地址
-        if (!TRC20_CONTRACT_ADDRESS.equals(contract_address)) {
+        // 相匹配的合约地址 USDT合约地址和代币合约地址
+        if (!TRC20_CONTRACT_ADDRESS.equals(contract_address) && !COIN_CONTRACT_ADDRESS.equals(contract_address)) {
             return;
         }
 
@@ -274,7 +281,11 @@
                 // 金额
                 // 发送消息队列
                 EthUsdtChargeDto dto = new EthUsdtChargeDto(address, txId, amount);
-                dto.setSymbol(EthUsdtChargeDto.Symbol.USDT_TRC20);
+                if (TRC20_CONTRACT_ADDRESS.equals(contract_address)) {
+                    dto.setSymbol(EthUsdtChargeDto.Symbol.USDT_TRC20);
+                } else {
+                    dto.setSymbol(EthUsdtChargeDto.Symbol.COIN_TRC20);
+                }
                 usdtUpdateProducer.sendMsg(JSONObject.toJSONString(dto));
                 log.info("===to_address:" + to_address + "===amount:" + amount);
             }
@@ -295,16 +306,13 @@
             return false;
         }
         if (trxBalance.compareTo(TRX_FEE) >= 0) {
-            // 转
-            BigDecimal trc20Balance = Trc20Service.getTrc20Balance(address);
-            if (trc20Balance == null) {
+
+            boolean usdtResult = poolUsdt(address);
+            boolean coinResult = poolCoin(address);
+            if (usdtResult && coinResult) {
                 return false;
             }
-            MemberCoinAddressEntity coinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbolTag(address, "USDT", "TRC20");
-            if (coinAddressEntity == null) {
-                return false;
-            }
-            Trc20Service.sendTrc20(coinAddressEntity.getPrivateKey(), Trc20Service.POOL_ADDRESS, trc20Balance);
+
             // 需要将存在redis的待归集地址删除
             Object trc20_pool = redisUtils.get("TRC20_POOL");
             if (trc20_pool != null) {
@@ -337,10 +345,39 @@
         }
     }
 
-    // https://api.trongrid.io/wallet/getnowblock
+    public boolean poolUsdt(String address) {
+        // 转
+        BigDecimal trc20Balance = Trc20Service.getTrc20Balance(address);
+        if (trc20Balance == null) {
+            return false;
+        }
+        MemberCoinAddressEntity coinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbolTag(address, "USDT", "TRC20");
+        if (coinAddressEntity == null) {
+            return false;
+        }
+        Trc20Service.sendTrc20(coinAddressEntity.getPrivateKey(), Trc20Service.POOL_ADDRESS, trc20Balance);
+        return true;
+    }
+
+    public boolean poolCoin(String address) {
+        MemberCoinAddressEntity coinAddress = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, CoinTypeEnum.XCT.name());
+        if (coinAddress == null) {
+            return false;
+        }
+
+        Trc20Contract token = contractToken(coinAddress.getAddress(), coinAddress.getPrivateKey());
+        BigInteger balance = token.balanceOf(address);
+        if (balance == null || balance.compareTo(BigInteger.ZERO) == 0) {
+            return false;
+        }
+
+        token.transfer(Trc20Service.POOL_ADDRESS, balance.longValue(), 0, "memo", 100000000L);
+        return true;
+    }
 
     /**
      * 获取最新区块
+     * https://api.trongrid.io/wallet/getnowblock
      *
      * @return
      */
@@ -375,4 +412,17 @@
         String wholeBlockCount = JSON.parseObject(forObject).getString("whole_block_count");
         return Long.valueOf(wholeBlockCount);
     }
+
+    /**
+     * 获取对应代币合约token
+     *
+     * @param address 地址
+     * @param privateKey 密钥
+     * @return
+     */
+    public Trc20Contract contractToken(String address, String privateKey) {
+        ApiWrapper wrapper = ApiWrapper.ofShasta(privateKey);
+        Contract trc20Contract = wrapper.getContract(COIN_CONTRACT_ADDRESS);
+        return new Trc20Contract(trc20Contract, address, wrapper);
+    }
 }
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 0f00c1c..643644d 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
@@ -415,11 +415,26 @@
         String address = dto.getAddress();
         BigDecimal amount = dto.getBalance();
         String hash = dto.getHash();
+        String symbol;
+
+        if (StrUtil.isBlank(dto.getSymbol())) {
+            log.error("更新trc20失败:{}, {}, {}, {}", hash, dto.getSymbol(), amount, address);
+            return;
+        }
+
+        List<String> symbolArr = StrUtil.split(dto.getSymbol(), ',');
+        if (CollUtil.isEmpty(symbolArr) || symbolArr.size() != 2) {
+            log.error("更新trc20失败:{}, {}, {}, {}", hash, dto.getSymbol(), amount, address);
+            return;
+        }
+        symbol = symbolArr.get(0);
+
         // 判断有无
         //List<MemberCoinAddressEntity> addressList = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "TRC20");
         Map<String, Object> hashParam = new HashMap<>();
         // 校验hash是否已同步过
         hashParam.put("hash", hash);
+        hashParam.put("symbol", symbol);
         List<MemberCoinChargeEntity> memberCoinChargeEntities = memberCoinChargeDao.selectByMap(hashParam);
         if (CollectionUtils.isNotEmpty(memberCoinChargeEntities)) {
             // 若已同步过
@@ -427,16 +442,16 @@
         }
         // 添加钱包余额
         // 用户ID
-        MemberCoinAddressEntity memberCoinAddress = memberCoinAddressDao.selectCoinAddressByAddressAndSymbolTag(address, CoinTypeEnum.USDT.name(),"TRC20");
+        MemberCoinAddressEntity memberCoinAddress = memberCoinAddressDao.selectCoinAddressByAddressAndSymbolTag(address, symbol,"TRC20");
         if (memberCoinAddress == null) {
             return;
         }
         Long memberId = memberCoinAddress.getMemberId();
         // 查询钱包 并更新
-        MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
+        MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol);
         memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(), amount, BigDecimal.ZERO, 0);
         // 添加冲币记录
-        String orderNo = insertCoinCharge(address, memberId, amount, CoinTypeEnum.USDT.name(), "TRC20", BigDecimal.ZERO, hash);
+        String orderNo = insertCoinCharge(address, memberId, amount, symbol, "TRC20", BigDecimal.ZERO, hash);
 //        LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.USDT.name(), 1, 1);
 
         ThreadPoolUtils.sendDingTalk(5);
diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java
index 6fab80b..2454711 100644
--- a/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java
+++ b/src/main/java/com/xcong/excoin/rabbit/consumer/UsdtUpdateConsumer.java
@@ -45,7 +45,7 @@
         if(EthUsdtChargeDto.Symbol.USDT_ERC20.equals(ethUsdtChargeDto.getSymbol())){
             blockCoinService.updateEthUsdtNew(ethUsdtChargeDto);
         }
-        if(EthUsdtChargeDto.Symbol.USDT_TRC20.equals(ethUsdtChargeDto.getSymbol())){
+        if(EthUsdtChargeDto.Symbol.USDT_TRC20.equals(ethUsdtChargeDto.getSymbol()) || EthUsdtChargeDto.Symbol.COIN_TRC20.equals(ethUsdtChargeDto.getSymbol())){
             blockCoinService.updateTrc20(ethUsdtChargeDto);
             // 同步完直接归集
             trxUsdtUpdateService.poolByAddress(ethUsdtChargeDto.getAddress());
diff --git a/src/test/java/com/xcong/excoin/GuijiTest.java b/src/test/java/com/xcong/excoin/GuijiTest.java
index 295adcf..baa9d9c 100644
--- a/src/test/java/com/xcong/excoin/GuijiTest.java
+++ b/src/test/java/com/xcong/excoin/GuijiTest.java
@@ -7,7 +7,9 @@
 
 import javax.annotation.Resource;
 
+import com.xcong.excoin.modules.blackchain.service.TrxUsdtUpdateService;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import com.xcong.excoin.common.enumerates.CoinTypeEnum;
@@ -117,6 +119,16 @@
 		}
     }
 
+    @Autowired
+    private TrxUsdtUpdateService trxUsdtUpdateService;
+
+    @Test
+    public void coinTest() {
+        List<String> address = new ArrayList<>();
+        address.add("TKcyw4igFYhNpTzyZv25j6uDwvTYzncnjp");
+        trxUsdtUpdateService.httpTransactionInfo(address, 20137024L);
+    }
+
 
     
 }

--
Gitblit v1.9.1