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