监控对方交易笔数改为对方能量使用数取整计算

pull/520/head
dorion 2024-04-30 21:32:04 +08:00
parent 5a6d5f0d2f
commit 0cb2018931
11 changed files with 137 additions and 29 deletions

View File

@ -147,7 +147,7 @@
</plugin> -->
</plugins>
<finalName>${project.artifactId}</finalName>
<resources>
<!-- <resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
@ -155,7 +155,7 @@
<exclude>*.xml</exclude>
</excludes>
</resource>
</resources>
</resources>-->
</build>

View File

@ -4,16 +4,19 @@ import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.domain.vo.TronInfoVO;
import com.ruoyi.system.service.IApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
@CrossOrigin
public class ApiController {
@Autowired
private IApiService apiService;
/**
*
* @return
@ -23,4 +26,6 @@ public class ApiController {
TronInfoVO tronInfoVO = apiService.getTronInfo();
return R.ok(tronInfoVO);
}
}

View File

@ -1,8 +1,11 @@
package com.ruoyi.system.api;
import com.ruoyi.system.dto.AccountResourceResponse;
import com.ruoyi.system.dto.TronGridResponse;
public interface ITronApi {
TronGridResponse getTronGridTrc20Response(String monitorAddress, boolean only_to,boolean only_from,String apiKey, Long min_timestamp);
AccountResourceResponse getAccountResource(String address, String apiKey);
}

View File

@ -3,6 +3,7 @@ package com.ruoyi.system.api.impl;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.utils.http.RestTemplateUtils;
import com.ruoyi.system.api.ITronApi;
import com.ruoyi.system.dto.AccountResourceResponse;
import com.ruoyi.system.dto.TronGridResponse;
import com.ruoyi.system.service.ISysConfigService;
import lombok.extern.slf4j.Slf4j;
@ -13,6 +14,9 @@ import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.HashMap;
import java.util.Map;
@Component
@Slf4j
public class TronApiImpl implements ITronApi {
@ -21,7 +25,7 @@ public class TronApiImpl implements ITronApi {
private ISysConfigService configService;
@Override
public TronGridResponse getTronGridTrc20Response(String monitorAddress, boolean only_to,boolean only_from, String apiKey,Long min_timestamp) {
public TronGridResponse getTronGridTrc20Response(String monitorAddress, boolean only_to, boolean only_from, String apiKey, Long min_timestamp) {
HttpHeaders headers = new HttpHeaders();
headers.add("TRON-PRO-API-KEY", apiKey);
//监听
@ -48,6 +52,36 @@ public class TronApiImpl implements ITronApi {
return tronGridResponse;
}
@Override
public AccountResourceResponse getAccountResource(String address, String apiKey) {
HttpHeaders headers = new HttpHeaders();
headers.add("TRON-PRO-API-KEY", apiKey);
Map<String, Object> uriVariables = new HashMap<>();
uriVariables.put("address", address);
uriVariables.put("visible", true);
String jsonStr = JSONUtil.toJsonStr(uriVariables);
// ResponseEntity<AccountResourceResponse> responseEntity = RestTemplateUtils.post("https://api.trongrid.io/wallet/getaccountresource", headers, jsonStr, AccountResourceResponse.class);
ResponseEntity responseEntity = RestTemplateUtils.post("https://api.trongrid.io/wallet/getaccountresource", headers, jsonStr, String.class);
// Object body = responseEntity1.getBody();
// log.info("body:{}", body);
// if (checkResponseBodyIsOk(responseEntity, address)) return null;
//
// AccountResourceResponse accountResourceResponse = responseEntity.getBody();
Object responseEntityBody = getResponseEntityBody(responseEntity,address);
if (responseEntityBody == null) return null;
AccountResourceResponse accountResourceResponse = JSONUtil.toBean((String) responseEntityBody, AccountResourceResponse.class);
if (log.isInfoEnabled()) {
log.info("{}responseEntityBody:{}", address, JSONUtil.toJsonStr(accountResourceResponse));
}
return accountResourceResponse;
}
/**
*
@ -57,15 +91,7 @@ public class TronApiImpl implements ITronApi {
* @return
*/
private static Object getResponseEntityBody(ResponseEntity responseEntity, String address) {
if (responseEntity == null) {
log.warn("{}:responseEntity is null", address);
return null;
}
HttpStatus statusCode = responseEntity.getStatusCode();
if (statusCode != HttpStatus.OK) {
log.error("获取trx交易信息失败:{}", address);
return null;
}
if (checkResponseBodyIsOk(responseEntity, address)) return null;
Object responseEntityBody = responseEntity.getBody();
if (responseEntityBody == null) {
log.warn("{}:responseEntityBody is null", address);
@ -73,4 +99,17 @@ public class TronApiImpl implements ITronApi {
}
return responseEntityBody;
}
private static boolean checkResponseBodyIsOk(ResponseEntity responseEntity, String address) {
if (responseEntity == null) {
log.warn("{}:responseEntity is null", address);
return true;
}
HttpStatus statusCode = responseEntity.getStatusCode();
if (statusCode != HttpStatus.OK) {
log.error("获取trx交易信息失败:{}", address);
return true;
}
return false;
}
}

View File

@ -4,11 +4,12 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
//@Component
@Component
@Slf4j
public class TgLongPollingBot extends TelegramLongPollingBot {

View File

@ -0,0 +1,26 @@
package com.ruoyi.system.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class AccountResourceResponse implements Serializable {
private static final Long serialVersionUID = 1L;
private Integer freeNetUsed;
private Integer freeNetLimit;
private List<AssetNetUsed> assetNetUsed;
private List<AssetNetLimit> assetNetLimit;
private Long TotalNetLimit;
private Long TotalNetWeight;
private Integer EnergyUsed;
private Long EnergyLimit;
private Long TotalEnergyLimit;
private Long TotalEnergyWeight;
}

View File

@ -0,0 +1,12 @@
package com.ruoyi.system.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class AssetNetLimit implements Serializable {
private static final long serialVersionUID = 1L;
private String key;
private Integer value;
}

View File

@ -0,0 +1,11 @@
package com.ruoyi.system.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class AssetNetUsed implements Serializable {
private static final long serialVersionUID = 1L;
private String key;
private Integer value;
}

View File

@ -44,13 +44,14 @@ public class EnergyTenantTransferHandler {
TrxExchangeInfo trxExchangeInfo = TrxExchangeInfo.builder()
.fromAddress(tenantInfo.getReceiverAddress())
.delegateStatus(delegateStatus)
.energyBusiType(DictUtils.getDictValue("sys_energy_busi_type", "天数套餐"))
.fcd(DateUtil.offsetDay(new Date(), -2))
.build();
List<TrxExchangeMonitorAccountInfo> trxExchangeMonitorAccountInfoList = trxExchangeInfoMapper.selectTrxExchangeMonitorAccountInfo(trxExchangeInfo);
for (TrxExchangeMonitorAccountInfo trxExchangeMonitorAccountInfo : trxExchangeMonitorAccountInfoList) {
undelegateEnergyHandler.doUndelegateEnergyByTrxExchangeInfo(trxExchangeMonitorAccountInfo);
undelegateEnergyHandler.unDelegateResource(trxExchangeMonitorAccountInfo);
}
//赠送每天的能量

View File

@ -1,6 +1,5 @@
package com.ruoyi.system.handler;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.constant.UserConstants;
@ -12,8 +11,7 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.encrpt.Dt;
import com.ruoyi.system.api.ITronApi;
import com.ruoyi.system.domain.TrxExchangeMonitorAccountInfo;
import com.ruoyi.system.dto.Data;
import com.ruoyi.system.dto.TronGridResponse;
import com.ruoyi.system.dto.AccountResourceResponse;
import com.ruoyi.system.mapper.ErrorLogMapper;
import com.ruoyi.system.mapper.TenantInfoMapper;
import com.ruoyi.system.mapper.TrxExchangeInfoMapper;
@ -69,27 +67,39 @@ public class UndelegateEnergyHandler {
apiKey = StringUtils.isEmpty(apiKey) ? DictUtils.getDictValue("sys_tron_api_key", "synp@outlook") : apiKey;
TronGridResponse tronGridResponse = tronApi.getTronGridTrc20Response(fromAddress,false,true, apiKey,fcd.getTime());
// TronGridResponse tronGridResponse = tronApi.getTronGridTrc20Response(fromAddress,false,true, apiKey,fcd.getTime());
List<Data> dataList = tronGridResponse.getData();
if (CollectionUtil.isEmpty(dataList)) {
// List<Data> dataList = tronGridResponse.getData();
// if (CollectionUtil.isEmpty(dataList)) {
// return;
// }
//
// int transActionCount = dataList.size();
// if (transActionCount < trxExchangeMonitorAccountInfo.getTranferCount()){
// return;
// }
AccountResourceResponse accountResource = tronApi.getAccountResource(fromAddress, apiKey);
if (accountResource == null){
return;
}
Integer energyUsed = accountResource.getEnergyUsed();
if (energyUsed == null){
return;
}
int transActionCount = dataList.size();
if (transActionCount < trxExchangeMonitorAccountInfo.getTranferCount()){
long energyUsedCount = energyUsed / 30000;
if (energyUsedCount < trxExchangeMonitorAccountInfo.getTranferCount()){
return;
}
}
unDelegateResource(trxExchangeMonitorAccountInfo);
}
private void unDelegateResource(TrxExchangeMonitorAccountInfo trxExchangeMonitorAccountInfo) {
public void unDelegateResource(TrxExchangeMonitorAccountInfo trxExchangeMonitorAccountInfo) {
String accountAddress = trxExchangeMonitorAccountInfo.getAccountAddress();
RLock lock = redissonClient.getLock("lock_undelegate_" + trxExchangeMonitorAccountInfo.getDelegateTxId());
try {

View File

@ -126,7 +126,7 @@ public class Usdt2TrxTransferHandler {
BigDecimal transferValue = getTransferValue(data);
if (transferValue == null) return;
BigDecimal trxValue = transferValue.multiply(oneUsdtToTrx);
BigDecimal trxValue = transferValue.multiply(oneUsdtToTrx).setScale(6, BigDecimal.ROUND_HALF_DOWN);
String accountAddress = monitorAddressAccount.getAccountAddress();
String encryptPrivateKey = monitorAddressAccount.getEncryptPrivateKey();
@ -204,11 +204,11 @@ public class Usdt2TrxTransferHandler {
String sysTgGroupChatId = configService.selectConfigByKey("sys.tg.group.chat.id");
if (longPollingBot != null && StringUtils.isNotEmpty(sysUsdtTranferNotice) && StringUtils.isNotEmpty(sysTgGroupChatId)) {
Map<String, Object> arguments = new HashMap<>();
arguments.put("usdtAmount", transferValue);
arguments.put("usdtAmount", transferValue.setScale(2, BigDecimal.ROUND_HALF_DOWN));
arguments.put("exchangeRate", oneUsdtToTrx);
arguments.put("trxAmount", trxValue);
arguments.put("FromAddress", from);
arguments.put("txId", txId);
arguments.put("FromAddress", from.replaceAll("(.{6})(.*)(.{8})", "$1********$3"));
arguments.put("txId", txId.replaceAll("(.{6})(.*)(.{8})", "$1*******************$3"));
arguments.put("txTime", DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
// String message = MessageFormat.format(sysUsdtTranferNotice, arguments);
StrSubstitutor substitutor = new StrSubstitutor(arguments, "{", "}");