From f5e6133809c553cfd9fb28ee61019927c547c374 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 08 Dec 2021 15:58:33 +0800 Subject: [PATCH] 20211208 fish --- src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java | 100 ++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 76 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java index aa6d7fb..82ddfdf 100644 --- a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java @@ -10,8 +10,10 @@ import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity; import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity; import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity; +import com.xcong.excoin.utils.RedisUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -27,9 +29,11 @@ @Component public class UsdtEthService { + private static final String ETH_GAS_PRICE="ETH_GAS_PRICE"; + private static BigDecimal ETH_GAS_LIMIT = new BigDecimal(60000); private static final BigDecimal LIMIT = new BigDecimal("50"); private static final BigDecimal LIMIT_ETH = new BigDecimal("0.2"); - private static final BigDecimal FEE = new BigDecimal("0.0042"); + private static BigDecimal FEE = new BigDecimal("0.0042"); private static final BigDecimal ETH_TR_FEE = new BigDecimal("0.0032"); public static String ETH_FEE = "0.0042"; @@ -44,7 +48,15 @@ @Resource private MemberWalletCoinDao memberWalletCoinDao; + @Resource + RedisUtils redisUtils; + + + public void pool() throws ExecutionException, InterruptedException { + String gasPrice = getGasString(); + // 查询不归集的账号 + String not_pool_address = redisUtils.getString("NOT_POOL_ADDRESS"); List<MemberCoinChargeEntity> list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20", 1); if (CollUtil.isNotEmpty(list)) { EthService ethService = new EthService(); @@ -54,6 +66,10 @@ String address = coinCharge.getAddress(); Long memberId = coinCharge.getMemberId(); BigDecimal lastAmount = coinCharge.getLastAmount(); + if(StringUtils.isNotBlank(not_pool_address) && not_pool_address.contains(address)){ + // 不归集的 + continue; + } if (lastAmount == null || lastAmount.compareTo(LIMIT) < 0) { continue; } @@ -80,7 +96,7 @@ usdtStr = usdtStr.substring(0, usdtStr.lastIndexOf(".")); } - String hash = ethService.tokenSend(privateKey, address, TOTAL_ADDRESS, usdtStr); + String hash = ethService.tokenSend(privateKey, address, TOTAL_ADDRESS, usdtStr,gasPrice); log.info("归集:{}", hash); // if (StrUtil.isNotBlank(hash)) { // // 归集成功更新状态 先保存本次的hash值,待交易成功后再更新 @@ -88,8 +104,12 @@ // memberCoinChargeDao.updateById(coinCharge); // } } else { - String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE); - //log.info("转手续费:{}", hash); + String eth_transfer_fee = redisUtils.getString("ETH_TRANSFER_FEE_JYS"); + if(StringUtils.isNotBlank(eth_transfer_fee) && "yes".equals(eth_transfer_fee)){ + String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE,gasPrice); + log.info("转手续费:{}", hash); + } + } } } @@ -98,6 +118,7 @@ public void ethPool() throws ExecutionException, InterruptedException { + String gasPrice = getGasString(); List<MemberCoinChargeEntity> list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.ETH.name(), null, 1); if (CollUtil.isNotEmpty(list)) { EthService ethService = new EthService(); @@ -121,7 +142,7 @@ String privateKey = coinAddress.getPrivateKey(); BigDecimal tr = eth.subtract(ETH_TR_FEE); - String hash = ethService.ethSend(privateKey, address, TOTAL_ADDRESS, tr.toPlainString()); + String hash = ethService.ethSend(privateKey, address, TOTAL_ADDRESS, tr.toPlainString(),gasPrice); if (StrUtil.isNotBlank(hash)) { coinCharge.setHash(hash); coinCharge.setLastAmount(new BigDecimal("0.0001")); @@ -133,28 +154,59 @@ } } - /** - * 定时查询该归集转账交易是否成功 - */ - public void usdtEthPoolCheck() { - // 首先查询需要确认的交易 - List<MemberCoinChargeEntity> list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20", null); + + + public void pollByAddress(String address) throws ExecutionException, InterruptedException { + String gasPrice = getGasString(); EthService ethService = new EthService(); - - if (CollectionUtils.isNotEmpty(list)) { - for (MemberCoinChargeEntity appeal : list) { - String hash = appeal.getHash(); - boolean b = ethService.checkTransferResult(hash); - if (b) { - appeal.setStatus(3); - appeal.setLastAmount(new BigDecimal("0.0001")); - - // 表示这笔归集转账已经成功 - // 更新状态 - memberCoinChargeDao.updateById(appeal); - } + BigDecimal usdt = ethService.tokenGetBalance(address); + if(usdt==null || usdt.compareTo(LIMIT)<0){ + return; + } + // 查询eth是否足够 + BigDecimal eth = EthService.getEthBlance(address); + //log.info("地址:{}, ETH:{}", address, eth); + if (eth != null && eth.compareTo(FEE) >= 0) { + MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, CoinTypeEnum.ETH.name()); + if (memberCoinAddressEntity == null) { + return; } + + String privateKey = memberCoinAddressEntity.getPrivateKey(); + + usdt = usdt.multiply(new BigDecimal("1000000")); + String usdtStr = usdt.toPlainString(); + if (usdtStr.contains(".")) { + usdtStr = usdtStr.substring(0, usdtStr.lastIndexOf(".")); + } + + String hash = ethService.tokenSend(privateKey, address, TOTAL_ADDRESS, usdtStr,gasPrice); + log.info("冲币归集:{}", hash); +// if (StrUtil.isNotBlank(hash)) { +// // 归集成功更新状态 先保存本次的hash值,待交易成功后再更新 +// coinCharge.setHash(hash); +// memberCoinChargeDao.updateById(coinCharge); +// } + } else { + + String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE,gasPrice); + log.info("冲币归集转手续费:{}", hash); + //log.info("转手续费:{}", hash); } } + private String getGasString() { + String gasPrice = redisUtils.getString(ETH_GAS_PRICE); + if (StringUtils.isBlank(gasPrice)) { + gasPrice = "70"; + } + FEE = new BigDecimal(gasPrice).multiply(ETH_GAS_LIMIT).divide(new BigDecimal("1000000000")); + ETH_FEE = FEE.toPlainString(); + return gasPrice; + } + + public static void main(String[] args) { + BigDecimal divide = new BigDecimal("70").multiply(ETH_GAS_LIMIT).divide(new BigDecimal("1000000000")); + System.out.println(divide); + } } -- Gitblit v1.9.1