Search in sources :

Example 1 with TransactionInfo

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());
    }
}
Also used : NulsException(io.nuls.kernel.exception.NulsException) ArrayList(java.util.ArrayList) TransactionInfo(io.nuls.account.ledger.model.TransactionInfo) TransactionInfoPo(io.nuls.account.ledger.storage.po.TransactionInfoPo)

Example 2 with TransactionInfo

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();
}
Also used : io.nuls.accout.ledger.rpc.form(io.nuls.accout.ledger.rpc.form) Output(io.protostuff.Output) ECKey(io.nuls.core.tools.crypto.ECKey) StringUtils(io.nuls.core.tools.str.StringUtils) CryptoException(io.nuls.core.tools.crypto.Exception.CryptoException) MediaType(javax.ws.rs.core.MediaType) UtxoDtoComparator(io.nuls.accout.ledger.rpc.util.UtxoDtoComparator) AccountTool(io.nuls.account.util.AccountTool) NulsContext(io.nuls.kernel.context.NulsContext) Page(io.nuls.core.tools.page.Page) io.swagger.annotations(io.swagger.annotations) BigInteger(java.math.BigInteger) SignatureUtil(io.nuls.kernel.script.SignatureUtil) TransferTransaction(io.nuls.protocol.model.tx.TransferTransaction) AccountLedgerErrorCode(io.nuls.account.ledger.constant.AccountLedgerErrorCode) TransactionSignature(io.nuls.kernel.script.TransactionSignature) CoinDataTool(io.nuls.account.ledger.util.CoinDataTool) TxStatusEnum(io.nuls.kernel.constant.TxStatusEnum) Collectors(java.util.stream.Collectors) ProtocolConstant(io.nuls.protocol.constant.ProtocolConstant) Arrays(org.spongycastle.util.Arrays) AccountService(io.nuls.account.service.AccountService) MultipleAddressTransferModel(io.nuls.account.ledger.model.MultipleAddressTransferModel) NulsException(io.nuls.kernel.exception.NulsException) javax.ws.rs(javax.ws.rs) AESEncrypt(io.nuls.core.tools.crypto.AESEncrypt) Autowired(io.nuls.kernel.lite.annotation.Autowired) ContractTokenTransferInfoPo(io.nuls.contract.dto.ContractTokenTransferInfoPo) TxMaxSizeValidator(io.nuls.protocol.model.validator.TxMaxSizeValidator) UnsupportedEncodingException(java.io.UnsupportedEncodingException) LedgerService(io.nuls.ledger.service.LedgerService) java.util(java.util) TimeService(io.nuls.kernel.func.TimeService) Script(io.nuls.kernel.script.Script) AccountLedgerService(io.nuls.account.ledger.service.AccountLedgerService) io.nuls.kernel.utils(io.nuls.kernel.utils) P2PHKSignature(io.nuls.kernel.script.P2PHKSignature) LedgerRpcUtil(io.nuls.accout.ledger.rpc.util.LedgerRpcUtil) Component(io.nuls.kernel.lite.annotation.Component) io.nuls.kernel.model(io.nuls.kernel.model) ValidateResult(io.nuls.kernel.validate.ValidateResult) AccountLegerUtils(io.nuls.account.ledger.base.util.AccountLegerUtils) AccountErrorCode(io.nuls.account.constant.AccountErrorCode) NulsConstant(io.nuls.kernel.constant.NulsConstant) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) MapUtil(io.nuls.core.tools.map.MapUtil) KernelErrorCode(io.nuls.kernel.constant.KernelErrorCode) TransactionErrorCode(io.nuls.kernel.constant.TransactionErrorCode) io.nuls.accout.ledger.rpc.dto(io.nuls.accout.ledger.rpc.dto) CoinComparator(io.nuls.account.ledger.base.util.CoinComparator) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) TransactionInfo(io.nuls.account.ledger.model.TransactionInfo) NulsConfig(io.nuls.kernel.cfg.NulsConfig) IOException(java.io.IOException) Log(io.nuls.core.tools.log.Log) ConvertCoinTool(io.nuls.accout.ledger.rpc.util.ConvertCoinTool) ContractService(io.nuls.contract.service.ContractService) Hex(io.nuls.core.tools.crypto.Hex) LedgerErrorCode(io.nuls.ledger.constant.LedgerErrorCode) LocalUtxoService(io.nuls.account.ledger.base.service.LocalUtxoService) Balance(io.nuls.account.model.Balance) Page(io.nuls.core.tools.page.Page) ValidateResult(io.nuls.kernel.validate.ValidateResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) NulsException(io.nuls.kernel.exception.NulsException) TransactionInfo(io.nuls.account.ledger.model.TransactionInfo) ContractTokenTransferInfoPo(io.nuls.contract.dto.ContractTokenTransferInfoPo) CryptoException(io.nuls.core.tools.crypto.Exception.CryptoException) NulsException(io.nuls.kernel.exception.NulsException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) TransferTransaction(io.nuls.protocol.model.tx.TransferTransaction)

Example 3 with TransactionInfo

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);
        }
    }
}
Also used : Coin(io.nuls.kernel.model.Coin) Na(io.nuls.kernel.model.Na) CoinBaseTransaction(io.nuls.protocol.model.tx.CoinBaseTransaction) TransactionInfo(io.nuls.account.ledger.model.TransactionInfo)

Example 4 with TransactionInfo

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);
}
Also used : Account(io.nuls.account.model.Account) Block(io.nuls.kernel.model.Block) TransactionInfo(io.nuls.account.ledger.model.TransactionInfo)

Example 5 with TransactionInfo

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;
}
Also used : TransactionInfo(io.nuls.account.ledger.model.TransactionInfo)

Aggregations

TransactionInfo (io.nuls.account.ledger.model.TransactionInfo)5 NulsException (io.nuls.kernel.exception.NulsException)2 AccountErrorCode (io.nuls.account.constant.AccountErrorCode)1 LocalUtxoService (io.nuls.account.ledger.base.service.LocalUtxoService)1 AccountLegerUtils (io.nuls.account.ledger.base.util.AccountLegerUtils)1 CoinComparator (io.nuls.account.ledger.base.util.CoinComparator)1 AccountLedgerErrorCode (io.nuls.account.ledger.constant.AccountLedgerErrorCode)1 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)1 MultipleAddressTransferModel (io.nuls.account.ledger.model.MultipleAddressTransferModel)1 AccountLedgerService (io.nuls.account.ledger.service.AccountLedgerService)1 TransactionInfoPo (io.nuls.account.ledger.storage.po.TransactionInfoPo)1 CoinDataTool (io.nuls.account.ledger.util.CoinDataTool)1 Account (io.nuls.account.model.Account)1 Balance (io.nuls.account.model.Balance)1 AccountService (io.nuls.account.service.AccountService)1 AccountTool (io.nuls.account.util.AccountTool)1 io.nuls.accout.ledger.rpc.dto (io.nuls.accout.ledger.rpc.dto)1 io.nuls.accout.ledger.rpc.form (io.nuls.accout.ledger.rpc.form)1 ConvertCoinTool (io.nuls.accout.ledger.rpc.util.ConvertCoinTool)1 LedgerRpcUtil (io.nuls.accout.ledger.rpc.util.LedgerRpcUtil)1