| | |
| | | package com.xcong.excoin.modules.blackchain.service; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.xcong.excoin.common.enumerates.CoinTypeEnum; |
| | | import com.xcong.excoin.modules.blackchain.model.EthUsdtChargeDto; |
| | | import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao; |
| | | import com.xcong.excoin.rabbit.producer.UsdtUpdateProducer; |
| | | import com.xcong.excoin.utils.RedisUtils; |
| | | import org.apache.commons.lang.StringUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.web3j.crypto.Credentials; |
| | | import org.web3j.protocol.Web3j; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.math.BigInteger; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Service |
| | | public class UsdtErc20UpdateService { |
| | | |
| | | @Resource |
| | | private UsdtUpdateProducer usdtUpdateProducer; |
| | | |
| | | @Resource |
| | | private MemberCoinAddressDao coinWalletDao; |
| | | |
| | | public final static List<String> ALL_ADDRESS_LIST = new ArrayList<>(); |
| | | |
| | | public final static String USDT_BLOCK_NUM = "USDT_BLOCK_NUM"; |
| | | public final static String USDT_BLOCK_NUM_GOLDEN = "USDT_BLOCK_NUM_GOLDEN"; |
| | | |
| | | private final static BigInteger DIVIDE_USDT = new BigInteger("1000000"); |
| | | private final static BigDecimal DIVIDE_USDT = new BigDecimal("1000000"); |
| | | |
| | | private static Web3j web3; |
| | | |
| | |
| | | } |
| | | |
| | | private static String blockchainNode = "http://120.55.86.146:8545"; |
| | | // private static String blockchainNode = "http://114.55.250.231:8545"; |
| | | |
| | | private static String contractAddr = "0xdac17f958d2ee523a2206206994597c13d831ec7"; |
| | | |
| | |
| | | |
| | | @Resource |
| | | private RedisUtils redisUtils; |
| | | |
| | | |
| | | public void updateUsdt(){ |
| | | // 首先查询所有的钱包地址 |
| | | List<String> tdCoinWallets = coinWalletDao.selectAllSymbolAddress(CoinTypeEnum.USDT.toString(),"ERC20"); |
| | | if(tdCoinWallets!=null){ |
| | | ALL_ADDRESS_LIST.addAll(tdCoinWallets); |
| | | } |
| | | // 获取最新区块 |
| | | String string = redisUtils.getString(USDT_BLOCK_NUM); |
| | | String string = redisUtils.getString(USDT_BLOCK_NUM_GOLDEN); |
| | | if(string==null){ |
| | | string = "11236151"; |
| | | } |
| | | BigInteger blockNum = new BigInteger(string); |
| | | Credentials credentials = Credentials.create(privateKey); |
| | | EthUsdtContract contract = EthUsdtContract.load(contractAddr, web3, credentials, getStaticGasProvider()); |
| | | EthFilter filter = getFilter(new BigInteger("10943021")); |
| | | EthUsdtContract contract = EthUsdtContract.load(contractAddr, getInstance(), credentials, getStaticGasProvider()); |
| | | EthFilter filter = getFilter(blockNum); |
| | | Map<String,BigInteger> map = new HashMap<String,BigInteger>(); |
| | | map.put("blockNum",blockNum); |
| | | contract.transferEventFlowable(filter).subscribe(e->{ |
| | | if(e!=null){ |
| | | if(e!=null && StringUtils.isNotBlank(e.to) && e.log.getBlockNumber()!=null){ |
| | | String transactionHash = e.log.getTransactionHash(); |
| | | BigInteger blockNumber1 = e.log.getBlockNumber(); |
| | | String toAddress = e.to; |
| | | BigInteger tokenBalance = e.tokens; |
| | | // 金额 |
| | | BigInteger divide = tokenBalance.divide(DIVIDE_USDT); |
| | | // 发送消息队列 TODO |
| | | |
| | | if(ALL_ADDRESS_LIST.contains(toAddress)){ |
| | | System.out.println("存在本地的地址:"+toAddress); |
| | | // 金额 |
| | | BigDecimal divide = new BigDecimal(tokenBalance.toString()).divide(DIVIDE_USDT); |
| | | // 发送消息队列 |
| | | EthUsdtChargeDto dto = new EthUsdtChargeDto(toAddress,transactionHash,divide); |
| | | usdtUpdateProducer.sendMsg(JSONObject.toJSONString(dto)); |
| | | } |
| | | if(map.get("blockNum").compareTo(blockNumber1)!=0){ |
| | | redisUtils.set(USDT_BLOCK_NUM_GOLDEN,blockNumber1.toString()); |
| | | map.put("blockNum",blockNumber1); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } |
| | | |
| | | |
| | | private static EthFilter getFilter(BigInteger startBlock) { |
| | | if (startBlock != null) { |
| | |
| | | return new EthFilter(DefaultBlockParameterName.EARLIEST, |
| | | DefaultBlockParameterName.LATEST, contractAddr); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |