package com.xcong.excoin.modules.blackchain.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao; import com.xcong.excoin.modules.member.dao.MemberCoinChargeDao; import com.xcong.excoin.modules.member.dao.MemberDao; import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao; 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; /** * @author wzy * @date 2020-07-03 **/ @Slf4j @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("10"); private static final BigDecimal LIMIT_ETH = new BigDecimal("0.2"); 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"; public static final String TOTAL_ADDRESS = "0xF36D33809A06441Cd5Fe58463E2Bc3E8316F119a"; public static final String TOTAL_PRIVATE = "7dbcf9214cd473a053618456a76b220357bc53bb12fc180970ad8d9c6466f836"; public static final String POOL_ADDRESS = "0x3F132Cea9E25c4B8065190EA7546E75070F3fc6E"; @Resource private MemberCoinChargeDao memberCoinChargeDao; @Resource private MemberCoinAddressDao memberCoinAddressDao; @Resource private MemberWalletCoinDao memberWalletCoinDao; @Resource RedisUtils redisUtils; public void pool() throws ExecutionException, InterruptedException { String gasPrice = getGasString(); List 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 usdt = coinCharge.getAmount(); if (usdt == null || usdt.compareTo(LIMIT) < 0) { continue; } 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); if (eth != null && eth.compareTo(FEE) >= 0) { MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddressDao.selectBlockAddressWithTag(memberId, CoinTypeEnum.USDT.name(), "ERC20"); if (memberCoinAddressEntity == null) { continue; } 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); } } } } } public void ethPool() throws ExecutionException, InterruptedException { String gasPrice = getGasString(); List list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.ETH.name(), null, 1); if (CollUtil.isNotEmpty(list)) { EthService ethService = new EthService(); for (MemberCoinChargeEntity coinCharge : list) { String address = coinCharge.getAddress(); Long memberId = coinCharge.getMemberId(); MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.ETH.name()); if (walletCoin == null) { continue; } BigDecimal earlyBalance = walletCoin.getEarlyBalance(); if (earlyBalance == null || earlyBalance.compareTo(LIMIT_ETH) < 0) { continue; } BigDecimal eth = EthService.getEthBlance(address); if (eth != null && eth.compareTo(LIMIT_ETH) >= 0) { MemberCoinAddressEntity coinAddress = memberCoinAddressDao.selectBlockAddressWithTag(memberId, CoinTypeEnum.ETH.name(), null); String privateKey = coinAddress.getPrivateKey(); BigDecimal tr = eth.subtract(ETH_TR_FEE); String hash = ethService.ethSend(privateKey, address, TOTAL_ADDRESS, tr.toPlainString(), gasPrice); if (StrUtil.isNotBlank(hash)) { coinCharge.setHash(hash); coinCharge.setLastAmount(new BigDecimal("0.0001")); coinCharge.setStatus(3); memberCoinChargeDao.updateById(coinCharge); } } } } } 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; } /** * 定时查询该归集转账交易是否成功 */ public void usdtEthPoolCheck() { // 首先查询需要确认的交易 List list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20", null); 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); } } } } public static void main(String[] args) { BigDecimal divide = new BigDecimal("70").multiply(ETH_GAS_LIMIT).divide(new BigDecimal("1000000000")); System.out.println(divide); } }