From 9219e18a9b2fb06b95b5c881b057d3fde7270ca3 Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Thu, 25 Feb 2021 10:28:54 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/whole_new' into whole_new --- src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java | 101 ++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 77 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 b3aea54..7f8f1c6 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,12 +10,15 @@ 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; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; import java.util.concurrent.ExecutionException; @@ -27,16 +30,18 @@ @Component public class UsdtEthService { - private static final BigDecimal LIMIT = new BigDecimal("50"); + 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("10"); private static final BigDecimal LIMIT_ETH = new BigDecimal("0.2"); - private static final BigDecimal FEE = new BigDecimal("0.005"); + 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.005"; + public static String ETH_FEE = "0.0042"; - public static final String TOTAL_ADDRESS = "0x067b4bE5d7B05560AE539Fc8f10597D854ae056D"; - public static final String TOTAL_PRIVATE = "1fb7288c8c88c37d6f79e9617822bffc8d3635bf2d808c5f6afdee9bb326e49c"; - + public static final String TOTAL_ADDRESS = "0x0e9f7eEfa4Dd804dDAE2972A7195Ea1fE04d2253"; + public static final String TOTAL_PRIVATE = "2b9cb76dd75dddc8ab4c4614f4c66b53604da49672586a026b253fae873bd017"; + public static final String POOL_ADDRESS = "0x1A37e4B839E5b691a835ff5fCf7c7A760003155D"; @Resource private MemberCoinChargeDao memberCoinChargeDao; @Resource @@ -44,28 +49,35 @@ @Resource private MemberWalletCoinDao memberWalletCoinDao; + @Resource + RedisUtils redisUtils; + + public void pool() throws ExecutionException, InterruptedException { + String gasPrice = getGasString(); List<MemberCoinChargeEntity> list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20", 1); if (CollUtil.isNotEmpty(list)) { EthService ethService = new EthService(); - for (MemberCoinChargeEntity coinCharge : list) { // 首先根据每个地址查询其是否有ETH 如果没有就充值ETH并设置1 表示初始状态 status=2(待充值)3:表示已提过 String address = coinCharge.getAddress(); Long memberId = coinCharge.getMemberId(); - BigDecimal lastAmount = coinCharge.getLastAmount(); - if (lastAmount == null || lastAmount.compareTo(LIMIT) < 0) { + BigDecimal usdt = coinCharge.getAmount(); + if (usdt == null || usdt.compareTo(LIMIT) < 0) { continue; } - BigDecimal usdt = ethService.tokenGetBalance(address); - log.info("地址:{}, 金额:{}", address, usdt); - if (usdt != null && usdt.compareTo(LIMIT) > 0) { - usdt = usdt.subtract(new BigDecimal("0.01")); + BigDecimal usdt2 = ethService.tokenGetBalance(address); + /* if(usdt2==null || usdt2.compareTo(usdt)<0){ + continue; + }*/ + //log.info("地址:{}, 金额:{}", address, usdt); + if (usdt2 != null && usdt2.compareTo(LIMIT) >= 0) { + usdt = usdt2.setScale(2, RoundingMode.DOWN); // 查询eth是否足够 BigDecimal eth = EthService.getEthBlance(address); - log.info("地址:{}, ETH:{}", address, eth); + //log.info("地址:{}, ETH:{}", address, eth); if (eth != null && eth.compareTo(FEE) >= 0) { MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddressDao.selectBlockAddressWithTag(memberId, CoinTypeEnum.USDT.name(), "ERC20"); if (memberCoinAddressEntity == null) { @@ -80,16 +92,9 @@ usdtStr = usdtStr.substring(0, usdtStr.lastIndexOf(".")); } - String hash = ethService.tokenSend(privateKey, address, TOTAL_ADDRESS, usdtStr); - log.info("归集:{}", hash); - if (StrUtil.isNotBlank(hash)) { - // 归集成功更新状态 先保存本次的hash值,待交易成功后再更新 - coinCharge.setHash(hash); - memberCoinChargeDao.updateById(coinCharge); - } + String hash = ethService.tokenSend(privateKey, address, POOL_ADDRESS, usdtStr, gasPrice); } else { - String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE); - log.info("转手续费:{}", hash); + String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE, gasPrice); } } } @@ -98,6 +103,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 +127,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")); @@ -131,6 +137,49 @@ } } } + } + + + public void pollByAddress(String address, BigDecimal balance) throws ExecutionException, InterruptedException { + String gasPrice = getGasString(); + EthService ethService = new EthService(); + //BigDecimal usdt = ethService.tokenGetBalance(address); + BigDecimal usdt = balance; + 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, POOL_ADDRESS, usdtStr, gasPrice); + } else { + String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE, gasPrice); + + } + } + + 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; } /** @@ -157,4 +206,8 @@ } } + 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