|
@@ -48,22 +48,26 @@ public class TronService {
|
|
|
/**
|
|
/**
|
|
|
* 能量租赁等待时间上限
|
|
* 能量租赁等待时间上限
|
|
|
*/
|
|
*/
|
|
|
- private static final long ENERGY_WAIT_TIMEOUT_MS = 120_000L;
|
|
|
|
|
|
|
+ private static final long ENERGY_WAIT_TIMEOUT_MS = 50_000L;
|
|
|
/**
|
|
/**
|
|
|
* 地址+合约,余额(健康检查的时候顺便加载)
|
|
* 地址+合约,余额(健康检查的时候顺便加载)
|
|
|
*/
|
|
*/
|
|
|
private final Cache<String, BigDecimal> addressBalance = CacheBuilder.newBuilder()
|
|
private final Cache<String, BigDecimal> addressBalance = CacheBuilder.newBuilder()
|
|
|
.expireAfterAccess(1, TimeUnit.HOURS)
|
|
.expireAfterAccess(1, TimeUnit.HOURS)
|
|
|
.build();
|
|
.build();
|
|
|
-
|
|
|
|
|
|
|
+ //防止能量回收延迟
|
|
|
|
|
+ private static final Cache<String, Integer> energyRecycling = CacheBuilder.newBuilder()
|
|
|
|
|
+ .expireAfterAccess(12, TimeUnit.SECONDS)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ private static final Integer energyRecyclingTime=10000;
|
|
|
/**
|
|
/**
|
|
|
* trx 精度
|
|
* trx 精度
|
|
|
*/
|
|
*/
|
|
|
private static final BigDecimal SUN_TO_TRX = BigDecimal.valueOf(1_000_000);
|
|
private static final BigDecimal SUN_TO_TRX = BigDecimal.valueOf(1_000_000);
|
|
|
/**
|
|
/**
|
|
|
- * 单词转账的能量阈值
|
|
|
|
|
|
|
+ * 单次转账的能量阈值,但是租赁时有时候会略低于这个值,此时多付点trx,能正常接受
|
|
|
*/
|
|
*/
|
|
|
- private static final long ENERGY_PER_TRANSFER = 65_000L;
|
|
|
|
|
|
|
+ private static final long ENERGY_PER_TRANSFER = 55_000L;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 频率限制器
|
|
* 频率限制器
|
|
@@ -237,6 +241,11 @@ public class TronService {
|
|
|
long requiredEnergy = ENERGY_PER_TRANSFER * energyCount;
|
|
long requiredEnergy = ENERGY_PER_TRANSFER * energyCount;
|
|
|
log.info("代币转账需要 {} 笔能量,总计 {} 能量", energyCount, requiredEnergy);
|
|
log.info("代币转账需要 {} 笔能量,总计 {} 能量", energyCount, requiredEnergy);
|
|
|
|
|
|
|
|
|
|
+ Integer ifPresent = energyRecycling.getIfPresent(fromAddress);
|
|
|
|
|
+ if(ifPresent!=null){
|
|
|
|
|
+ //存在说明近期租过能量了,等待一段时间,等能量回收完成再租赁,防止能量被超收
|
|
|
|
|
+ Thread.sleep(energyRecyclingTime);
|
|
|
|
|
+ }
|
|
|
// 3. 检查当前能量是否足够
|
|
// 3. 检查当前能量是否足够
|
|
|
long currentEnergy = getAvailableEnergy(apiWrapper, fromAddress);
|
|
long currentEnergy = getAvailableEnergy(apiWrapper, fromAddress);
|
|
|
if (currentEnergy < requiredEnergy) {
|
|
if (currentEnergy < requiredEnergy) {
|
|
@@ -264,7 +273,8 @@ public class TronService {
|
|
|
Contract contract = limitApiWrapper(apiWrapper).getContract(contractAddress);
|
|
Contract contract = limitApiWrapper(apiWrapper).getContract(contractAddress);
|
|
|
Trc20Contract token = new Trc20Contract(contract, fromAddress, limitApiWrapper(apiWrapper));
|
|
Trc20Contract token = new Trc20Contract(contract, fromAddress, limitApiWrapper(apiWrapper));
|
|
|
txHash = token.transfer(toAddress, amountInSmallestUnit.longValue(), 0, "", 1000000000L);
|
|
txHash = token.transfer(toAddress, amountInSmallestUnit.longValue(), 0, "", 1000000000L);
|
|
|
-
|
|
|
|
|
|
|
+ //转账完成后记录这个地址10秒内转过账了
|
|
|
|
|
+ energyRecycling.put(fromAddress,1);
|
|
|
log.info("代币转账广播成功: txId={}", txHash);
|
|
log.info("代币转账广播成功: txId={}", txHash);
|
|
|
|
|
|
|
|
return txHash;
|
|
return txHash;
|
|
@@ -302,7 +312,9 @@ public class TronService {
|
|
|
Thread.sleep(3000);
|
|
Thread.sleep(3000);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- throw new RuntimeException("能量租赁未到账,超时");
|
|
|
|
|
|
|
+ log.info("能量租赁失败,消耗trx转账");
|
|
|
|
|
+// 能量没租到直接转,多点手续费,记录下日志就行
|
|
|
|
|
+// throw new RuntimeException("能量租赁未到账,超时");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|