use of io.nuls.contract.dto.ContractTokenTransferInfoPo in project nuls by nuls-io.
the class ContractResultDto method makeTokenTransfers.
private void makeTokenTransfers(List<String> tokenTransferEvents) {
List<ContractTokenTransferDto> result = new ArrayList<>();
if (tokenTransferEvents != null && tokenTransferEvents.size() > 0) {
ContractTokenTransferInfoPo po;
for (String event : tokenTransferEvents) {
po = ContractUtil.convertJsonToTokenTransferInfoPo(event);
if (po != null) {
result.add(new ContractTokenTransferDto(po));
}
}
}
this.tokenTransfers = result;
}
use of io.nuls.contract.dto.ContractTokenTransferInfoPo in project nuls by nuls-io.
the class ContractServiceImpl method getTokenTransferInfoList.
@Override
public Result<List<ContractTokenTransferInfoPo>> getTokenTransferInfoList(String address, NulsDigestData hash) {
try {
if (hash == null) {
return Result.getFailed(ContractErrorCode.NULL_PARAMETER);
}
Result accountResult = accountService.getAccount(address);
if (accountResult.isFailed()) {
return accountResult;
}
byte[] addressBytes = AddressTool.getAddress(address);
List<ContractTokenTransferInfoPo> tokenTransferInfoListByAddress = contractTokenTransferStorageService.getTokenTransferInfoListByAddress(addressBytes, hash.serialize());
return Result.getSuccess().setData(tokenTransferInfoListByAddress);
} catch (Exception e) {
Log.error(e);
return Result.getFailed();
}
}
use of io.nuls.contract.dto.ContractTokenTransferInfoPo in project nuls by nuls-io.
the class ContractUtil method convertJsonToTokenTransferInfoPo.
public static ContractTokenTransferInfoPo convertJsonToTokenTransferInfoPo(String event) {
if (StringUtils.isBlank(event)) {
return null;
}
ContractTokenTransferInfoPo po;
try {
Map<String, Object> eventMap = JSONUtils.json2map(event);
String eventName = (String) eventMap.get(CONTRACT_EVENT);
String contractAddress = (String) eventMap.get(CONTRACT_EVENT_ADDRESS);
po = new ContractTokenTransferInfoPo();
po.setContractAddress(contractAddress);
if (NRC20_EVENT_TRANSFER.equals(eventName)) {
Map<String, Object> data = (Map<String, Object>) eventMap.get(CONTRACT_EVENT_DATA);
Collection<Object> values = data.values();
int i = 0;
String transferEventdata;
byte[] addressBytes;
for (Object object : values) {
transferEventdata = (String) object;
if (i == 0 || i == 1) {
if (AddressTool.validAddress(transferEventdata)) {
addressBytes = AddressTool.getAddress(transferEventdata);
if (i == 0) {
po.setFrom(addressBytes);
} else {
po.setTo(addressBytes);
}
}
}
if (i == 2) {
po.setValue(StringUtils.isBlank(transferEventdata) ? BigInteger.ZERO : new BigInteger(transferEventdata));
break;
}
i++;
}
return po;
}
return null;
} catch (Exception e) {
Log.error(e);
return null;
}
}
use of io.nuls.contract.dto.ContractTokenTransferInfoPo 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.contract.dto.ContractTokenTransferInfoPo in project nuls by nuls-io.
the class ContractTokenTransferStorageServiceImpl method getTokenTransferInfoListByAddress.
@Override
public List<ContractTokenTransferInfoPo> getTokenTransferInfoListByAddress(byte[] address, byte[] txHash) {
List<ContractTokenTransferInfoPo> infoPoList = new ArrayList<>();
List<byte[]> keyList = dbService.keyList(this.area);
if (keyList == null || keyList.isEmpty()) {
return infoPoList;
}
ContractTokenTransferInfoPo tokenTransferInfoPo;
for (byte[] key : keyList) {
if (isAddressAndHashEquals(key, address, txHash)) {
tokenTransferInfoPo = dbService.getModel(this.area, key, ContractTokenTransferInfoPo.class);
infoPoList.add(tokenTransferInfoPo);
}
}
return infoPoList;
}
Aggregations