use of io.nuls.account.ledger.model.TransactionInfo in project nuls by nuls-io.
the class TransactionInfoServiceImpl method getTxInfoList.
@Override
public Result<List<TransactionInfo>> getTxInfoList(byte[] address) {
try {
List<TransactionInfoPo> infoPoList = transactionInfoStorageService.getTransactionInfoListByAddress(address);
List<TransactionInfo> infoList = new ArrayList<>();
for (TransactionInfoPo po : infoPoList) {
if (po.getTxType() == ConsensusConstant.TX_TYPE_RED_PUNISH || po.getTxType() == ConsensusConstant.TX_TYPE_YELLOW_PUNISH) {
continue;
}
infoList.add(po.toTransactionInfo());
}
Collections.sort(infoList, TxInfoComparator.getInstance());
return Result.getSuccess().setData(infoList);
} catch (NulsException e) {
Log.error(e);
return Result.getFailed(e.getErrorCode());
}
}
use of io.nuls.account.ledger.model.TransactionInfo in project nuls by nuls-io.
the class AccountLedgerResource method getTxInfoList.
@GET
@Path("/tx/list/{address}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "账户地址查询交易列表", notes = "result.data: balanceJson 返回账户相关的交易列表")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = Page.class) })
public RpcClientResult getTxInfoList(@ApiParam(name = "address", value = "账户地址", required = true) @PathParam("address") String address, @ApiParam(name = "assetType", value = "资产类型") @QueryParam("assetType") String assetType, @ApiParam(name = "type", value = "类型") @QueryParam("type") Integer type, @ApiParam(name = "pageNumber", value = "页码") @QueryParam("pageNumber") Integer pageNumber, @ApiParam(name = "pageSize", value = "每页条数") @QueryParam("pageSize") Integer pageSize) {
if (null == pageNumber || pageNumber == 0) {
pageNumber = 1;
}
if (null == pageSize || pageSize == 0) {
pageSize = 10;
}
if (pageNumber < 0 || pageSize < 0 || pageSize > 100) {
return Result.getFailed(KernelErrorCode.PARAMETER_ERROR).toRpcClientResult();
}
if (type == null || type <= 0) {
type = -1;
}
byte[] addressBytes = null;
Result dtoResult = Result.getSuccess();
try {
addressBytes = AddressTool.getAddress(address.trim());
} catch (Exception e) {
return Result.getFailed(AccountLedgerErrorCode.PARAMETER_ERROR).toRpcClientResult();
}
List<TransactionInfo> result = new ArrayList<TransactionInfo>();
boolean isEmptyAssetType = StringUtils.isBlank(assetType);
boolean isNeedQueryToken = StringUtils.isBlank(assetType) || AddressTool.validAddress(assetType);
boolean isNeedQueryNuls = StringUtils.isBlank(assetType) || "NULS".equals(assetType);
Set<String> hashCheckSet = MapUtil.createHashSet(8);
// 合约token代币转账交易记录
if (isNeedQueryToken) {
Result<List<ContractTokenTransferInfoPo>> listResult = contractService.getTokenTransferInfoList(address);
List<ContractTokenTransferInfoPo> list = listResult.getData();
if (list != null && list.size() > 0) {
List<ContractTokenTransferInfoPo> tokenInfoList = null;
if (!isEmptyAssetType) {
String contractAddress = assetType;
if (AddressTool.validAddress(contractAddress)) {
tokenInfoList = list.stream().filter(po -> contractAddress.equals(po.getContractAddress())).collect(Collectors.toList());
}
} else {
tokenInfoList = list;
}
TransactionInfo info = null;
if (null != tokenInfoList) {
for (ContractTokenTransferInfoPo po : tokenInfoList) {
info = new TransactionInfo();
// 临时type,用于区分资产类型 - 基础币和代币
info.setTxType(1000);
NulsDigestData hashData = new NulsDigestData();
try {
hashData.parse(po.getTxHash(), 0);
} catch (NulsException e) {
Log.error(e);
// skip it
}
info.setTxHash(hashData);
info.setContractAddress(AddressTool.getAddress(po.getContractAddress()));
info.setTime(po.getTime());
info.setBlockHeight(po.getBlockHeight());
info.setStatus(po.getStatus());
info.setInfo(po.getInfo(addressBytes));
info.setSymbol(po.getSymbol());
result.add(info);
hashCheckSet.add(hashData.getDigestHex());
}
}
}
}
// 基础币交易记录
if (isNeedQueryNuls) {
Result<List<TransactionInfo>> rawResult = accountLedgerService.getTxInfoList(addressBytes);
if (rawResult.isFailed()) {
dtoResult.setSuccess(false);
dtoResult.setErrorCode(rawResult.getErrorCode());
return dtoResult.toRpcClientResult();
}
List<TransactionInfo> infoList = rawResult.getData();
if (infoList != null && infoList.size() > 0) {
// 过滤掉既是调用合约的交易类型,又是代币转账类型的交易
List<TransactionInfo> baseList = infoList.stream().filter(info -> hashCheckSet.add(info.getTxHash().getDigestHex())).collect(Collectors.toList());
if (type == -1) {
result.addAll(baseList);
} else {
for (TransactionInfo txInfo : baseList) {
if (txInfo.getTxType() == type) {
result.add(txInfo);
}
}
}
}
}
result.sort(new Comparator<TransactionInfo>() {
@Override
public int compare(TransactionInfo o1, TransactionInfo o2) {
return o1.compareTo(o2.getTime());
}
});
Page<TransactionInfoDto> page = new Page<>(pageNumber, pageSize, result.size());
int start = pageNumber * pageSize - pageSize;
if (start >= page.getTotal()) {
dtoResult.setData(page);
return dtoResult.toRpcClientResult();
}
int end = start + pageSize;
if (end > page.getTotal()) {
end = (int) page.getTotal();
}
List<TransactionInfoDto> infoDtoList = new ArrayList<>();
for (int i = start; i < end; i++) {
TransactionInfo info = result.get(i);
Transaction tx = ledgerService.getTx(info.getTxHash());
if (tx == null) {
tx = accountLedgerService.getUnconfirmedTransaction(info.getTxHash()).getData();
}
if (tx == null) {
continue;
}
info.setBlockHeight(tx.getBlockHeight());
// 非合约Token转账
if (info.getTxType() != 1000) {
info.setInfo(tx.getInfo(addressBytes));
}
infoDtoList.add(new TransactionInfoDto(info));
}
page.setList(infoDtoList);
dtoResult.setSuccess(true);
dtoResult.setData(page);
return dtoResult.toRpcClientResult();
}
use of io.nuls.account.ledger.model.TransactionInfo in project nuls by nuls-io.
the class PocRewardCacheService method calcRewardHistory.
private void calcRewardHistory(String address, List<TransactionInfo> list, long startHeight) {
byte[] addressByte = AddressTool.getAddress(address);
for (TransactionInfo info : list) {
if (info.getTxType() != ProtocolConstant.TX_TYPE_COINBASE) {
continue;
}
CoinBaseTransaction tx = (CoinBaseTransaction) ledgerService.getTx(info.getTxHash());
if (null == tx) {
continue;
}
if (info.getBlockHeight() >= startHeight) {
continue;
}
if (null == tx.getCoinData().getTo() || tx.getCoinData().getTo().isEmpty()) {
continue;
}
for (Coin coin : tx.getCoinData().getTo()) {
// if (!Arrays.equals(addressByte, coin.()))
if (!Arrays.equals(addressByte, coin.getAddress())) {
continue;
}
Na na = totalMap.get(address);
if (na == null) {
na = Na.ZERO;
}
na = na.add(coin.getNa());
totalMap.put(address, na);
}
}
}
use of io.nuls.account.ledger.model.TransactionInfo in project nuls by nuls-io.
the class PocRewardCacheService method initCache.
public void initCache() {
Collection<Account> accountList = accountService.getAccountList().getData();
if (null == accountList || accountList.isEmpty()) {
return;
}
long startTime = TimeService.currentTimeMillis() - 24 * 3600000L;
long startHeight = NulsContext.getInstance().getBestHeight() - (24 * 3600 / ProtocolConstant.BLOCK_TIME_INTERVAL_SECOND);
if (startHeight <= 0) {
startHeight = 1;
}
long index = startHeight;
while (true) {
Block block = blockService.getBlock(index++).getData();
if (null == block) {
break;
}
if (block.getHeader().getHeight() < 1) {
break;
}
if (block.getHeader().getTime() < startTime) {
continue;
}
this.addBlock(block);
}
// 本地账户的历史收益累计
for (Account account : accountList) {
List<TransactionInfo> list = accountLedgerService.getTxInfoList(account.getAddress().getAddressBytes()).getData();
if (list == null || list.isEmpty()) {
continue;
}
calcRewardHistory(account.getAddress().getBase58(), list, startHeight);
}
long totalValue = ledgerService.getWholeUTXO();
this.totalRewardHeight = NulsContext.getInstance().getBestHeight();
this.totalReward = Na.valueOf(totalValue - Na.MAX_NA_VALUE);
}
use of io.nuls.account.ledger.model.TransactionInfo in project nuls by nuls-io.
the class TransactionInfoPo method toTransactionInfo.
public TransactionInfo toTransactionInfo() {
// todo check weather need to clone the object
TransactionInfo txInfo = new TransactionInfo();
txInfo.setTxHash(this.txHash);
txInfo.setBlockHeight(this.blockHeight);
txInfo.setTime(this.time);
txInfo.setAddresses(this.addresses);
txInfo.setTxType(this.txType);
txInfo.setStatus(this.status);
return txInfo;
}
Aggregations