Search in sources :

Example 1 with ContractCollectionInfoPo

use of io.nuls.contract.storage.po.ContractCollectionInfoPo in project nuls by nuls-io.

the class ContractResource method collectionCancel.

@POST
@Path("/collection/cancel")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "取消收藏智能合约地址")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success") })
public RpcClientResult collectionCancel(@ApiParam(name = "collectionBase", value = "取消收藏参数", required = true) ContractAddressBase collection) {
    try {
        // 钱包账户地址
        String address = collection.getAccountAddress();
        if (StringUtils.isBlank(address)) {
            return Result.getFailed(LedgerErrorCode.NULL_PARAMETER).toRpcClientResult();
        }
        Result<Account> accountResult = accountService.getAccount(address);
        if (accountResult.isFailed()) {
            return accountResult.toRpcClientResult();
        }
        // 合约地址
        String contractAddress = collection.getContractAddress();
        if (!AddressTool.validAddress(contractAddress)) {
            return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
        }
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        if (!ContractLedgerUtil.isExistContractAddress(contractAddressBytes)) {
            return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST).toRpcClientResult();
        }
        // 获取该合约的收藏数据
        Result<ContractCollectionInfoPo> collectionInfoPoResult = contractCollectionStorageService.getContractAddress(contractAddressBytes);
        ContractCollectionInfoPo po = collectionInfoPoResult.getData();
        Map<String, String> collectorMap;
        if (po != null) {
            collectorMap = po.getCollectorMap();
            collectorMap.remove(address);
        }
        Result result = contractCollectionStorageService.saveContractAddress(contractAddressBytes, po);
        return result.toRpcClientResult();
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(LedgerErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
    }
}
Also used : Account(io.nuls.account.model.Account) ContractCollectionInfoPo(io.nuls.contract.storage.po.ContractCollectionInfoPo) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) ContractResult(io.nuls.contract.dto.ContractResult)

Example 2 with ContractCollectionInfoPo

use of io.nuls.contract.storage.po.ContractCollectionInfoPo in project nuls by nuls-io.

the class ContractResource method getContractInfoWithLock.

private RpcClientResult getContractInfoWithLock(String contractAddress, String accountAddress, boolean isNeedLock) {
    try {
        boolean hasAccountAddress = false;
        if (StringUtils.isNotBlank(accountAddress)) {
            Result<Account> accountResult = accountService.getAccount(accountAddress);
            if (accountResult.isFailed()) {
                return accountResult.toRpcClientResult();
            }
            hasAccountAddress = true;
        }
        if (contractAddress == null) {
            return Result.getFailed(ContractErrorCode.PARAMETER_ERROR).toRpcClientResult();
        }
        if (!AddressTool.validAddress(contractAddress)) {
            return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
        }
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        Result<ContractAddressInfoPo> contractAddressInfoPoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
        if (contractAddressInfoPoResult.isFailed()) {
            return contractAddressInfoPoResult.toRpcClientResult();
        }
        ContractAddressInfoPo contractAddressInfoPo = contractAddressInfoPoResult.getData();
        if (contractAddressInfoPo == null) {
            return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST).toRpcClientResult();
        }
        if (isNeedLock && contractAddressInfoPo.isLock()) {
            return Result.getFailed(ContractErrorCode.CONTRACT_LOCK).toRpcClientResult();
        }
        byte[] prevStateRoot = ContractUtil.getStateRoot(NulsContext.getInstance().getBestBlock().getHeader());
        ProgramExecutor track = programExecutor.begin(prevStateRoot);
        ProgramStatus status = track.status(contractAddressBytes);
        List<ProgramMethod> methods = track.method(contractAddressBytes);
        Map<String, Object> resultMap = MapUtil.createLinkedHashMap(8);
        try {
            byte[] createTxHash = contractAddressInfoPo.getCreateTxHash();
            NulsDigestData create = new NulsDigestData();
            create.parse(createTxHash, 0);
            resultMap.put("createTxHash", create.getDigestHex());
        } catch (Exception e) {
            Log.error("createTxHash parse error.", e);
        }
        if (hasAccountAddress) {
            // 所有收藏的合约列表
            boolean isCollect = false;
            Result<ContractCollectionInfoPo> collectionInfoPoResult = contractCollectionStorageService.getContractAddress(contractAddressBytes);
            ContractCollectionInfoPo contractCollectionPo = collectionInfoPoResult.getData();
            if (contractCollectionPo != null) {
                if (contractCollectionPo.getCollectorMap().containsKey(accountAddress)) {
                    isCollect = true;
                }
            }
            resultMap.put("isCollect", isCollect);
        }
        resultMap.put("address", contractAddress);
        resultMap.put("creater", AddressTool.getStringAddressByBytes(contractAddressInfoPo.getSender()));
        resultMap.put("createTime", contractAddressInfoPo.getCreateTime());
        resultMap.put("blockHeight", contractAddressInfoPo.getBlockHeight());
        resultMap.put("isNrc20", contractAddressInfoPo.isNrc20());
        if (contractAddressInfoPo.isNrc20()) {
            resultMap.put("nrc20TokenName", contractAddressInfoPo.getNrc20TokenName());
            resultMap.put("nrc20TokenSymbol", contractAddressInfoPo.getNrc20TokenSymbol());
            resultMap.put("decimals", contractAddressInfoPo.getDecimals());
            resultMap.put("totalSupply", ContractUtil.bigInteger2String(contractAddressInfoPo.getTotalSupply()));
        }
        resultMap.put("status", status.name());
        resultMap.put("method", methods);
        return Result.getSuccess().setData(resultMap).toRpcClientResult();
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed().setMsg(e.getMessage()).toRpcClientResult();
    }
}
Also used : Account(io.nuls.account.model.Account) ContractCollectionInfoPo(io.nuls.contract.storage.po.ContractCollectionInfoPo) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo)

Example 3 with ContractCollectionInfoPo

use of io.nuls.contract.storage.po.ContractCollectionInfoPo in project nuls by nuls-io.

the class ContractResource method getContractAddressCollection.

/**
 * 排除钱包账户自己创建的合约地址
 *
 * @return
 * @param address
 */
private List<ContractCollectionInfoPo> getContractAddressCollection(byte[] address) {
    // 所有收藏的合约列表
    Result<List<ContractCollectionInfoPo>> contractAddressList = contractCollectionStorageService.getContractAddressList();
    List<ContractCollectionInfoPo> contractCollectionPos = contractAddressList.getData();
    if (contractCollectionPos == null) {
        return new ArrayList<>();
    }
    // 钱包账户
    List<ContractCollectionInfoPo> result = new ArrayList<>();
    for (ContractCollectionInfoPo po : contractCollectionPos) {
        // 排除合约创建者是钱包地址的
        if (Arrays.equals(po.getCreater(), address)) {
            continue;
        }
        if (po.getCollectorMap().containsKey(AddressTool.getStringAddressByBytes(address))) {
            result.add(po);
        }
    }
    return result;
}
Also used : ContractCollectionInfoPo(io.nuls.contract.storage.po.ContractCollectionInfoPo)

Example 4 with ContractCollectionInfoPo

use of io.nuls.contract.storage.po.ContractCollectionInfoPo in project nuls by nuls-io.

the class ContractResource method getContractCollectionList.

@GET
@Path("/wallet/list/{address}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "获取钱包账户的合约地址列表(账户创建的合约以及钱包收藏的合约)")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = ContractAddressDto.class) })
public RpcClientResult getContractCollectionList(@ApiParam(name = "address", value = "钱包账户地址", required = true) @PathParam("address") String address, @ApiParam(name = "pageNumber", value = "页码", required = true) @QueryParam("pageNumber") Integer pageNumber, @ApiParam(name = "pageSize", value = "每页条数", required = false) @QueryParam("pageSize") Integer pageSize) {
    try {
        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 (StringUtils.isBlank(address)) {
            return Result.getFailed(LedgerErrorCode.NULL_PARAMETER).toRpcClientResult();
        }
        Result<Account> accountResult = accountService.getAccount(address);
        if (accountResult.isFailed()) {
            return accountResult.toRpcClientResult();
        }
        byte[] addressBytes = AddressTool.getAddress(address);
        LinkedHashMap<String, ContractAddressDto> resultMap = new LinkedHashMap<>();
        // 该账户创建的未确认的合约
        LinkedList<Map<String, String>> list = contractTxService.getLocalUnconfirmedCreateContractTransaction(address);
        if (list != null) {
            String contractAddress;
            Long time;
            ContractAddressDto dto;
            String success;
            for (Map<String, String> map : list) {
                contractAddress = map.get("contractAddress");
                time = Long.valueOf(map.get("time"));
                dto = new ContractAddressDto();
                dto.setCreate(true);
                dto.setContractAddress(contractAddress);
                dto.setCreateTime(time);
                success = map.get("success");
                if (StringUtils.isNotBlank(success)) {
                    // 合约创建失败
                    dto.setStatus(3);
                    dto.setMsg(map.get("msg"));
                } else {
                    dto.setStatus(0);
                }
                resultMap.put(contractAddress, dto);
            }
        }
        byte[] prevStateRoot = ContractUtil.getStateRoot(NulsContext.getInstance().getBestBlock().getHeader());
        ProgramExecutor track = programExecutor.begin(prevStateRoot);
        byte[] contractAddressBytes;
        String contractAddress;
        // 获取该账户创建的合约地址
        Result<List<ContractAddressInfoPo>> contractInfoListResult = contractAddressStorageService.getContractInfoList(addressBytes);
        List<ContractAddressInfoPo> contractAddressInfoPoList = contractInfoListResult.getData();
        if (contractAddressInfoPoList != null && contractAddressInfoPoList.size() > 0) {
            contractAddressInfoPoList.sort(new Comparator<ContractAddressInfoPo>() {

                @Override
                public int compare(ContractAddressInfoPo o1, ContractAddressInfoPo o2) {
                    return o1.compareTo(o2.getCreateTime());
                }
            });
            for (ContractAddressInfoPo po : contractAddressInfoPoList) {
                contractAddressBytes = po.getContractAddress();
                contractAddress = AddressTool.getStringAddressByBytes(contractAddressBytes);
                Result<ContractCollectionInfoPo> contractCollectionInfoPoResult = contractCollectionStorageService.getContractAddress(contractAddressBytes);
                ContractCollectionInfoPo infoPo = contractCollectionInfoPoResult.getData();
                if (infoPo == null) {
                    resultMap.put(contractAddress, new ContractAddressDto(po, true, track.status(contractAddressBytes).ordinal()));
                } else {
                    resultMap.put(contractAddress, new ContractAddressDto(infoPo, address, true, track.status(contractAddressBytes).ordinal()));
                }
            }
        }
        // 获取收藏的合约地址
        List<ContractCollectionInfoPo> contractCollectionPos = getContractAddressCollection(addressBytes);
        if (contractCollectionPos.size() > 0) {
            contractCollectionPos.sort(new Comparator<ContractCollectionInfoPo>() {

                @Override
                public int compare(ContractCollectionInfoPo o1, ContractCollectionInfoPo o2) {
                    return o1.compareTo(o2.getCreateTime());
                }
            });
            for (ContractCollectionInfoPo po : contractCollectionPos) {
                contractAddress = po.getContractAddress();
                if (resultMap.containsKey(contractAddress)) {
                    continue;
                }
                contractAddressBytes = AddressTool.getAddress(contractAddress);
                resultMap.put(contractAddress, new ContractAddressDto(po, address, false, track.status(contractAddressBytes).ordinal()));
            }
        }
        List<ContractAddressDto> infoList = new ArrayList<>(resultMap.values());
        Result result = Result.getSuccess();
        List<ContractAddressDto> contractAddressDtoList = new ArrayList<>();
        Page<ContractAddressDto> page = new Page<>(pageNumber, pageSize, infoList.size());
        int start = pageNumber * pageSize - pageSize;
        if (start >= page.getTotal()) {
            result.setData(page);
            return result.toRpcClientResult();
        }
        int end = start + pageSize;
        if (end > page.getTotal()) {
            end = (int) page.getTotal();
        }
        if (infoList.size() > 0) {
            for (int i = start; i < end; i++) {
                contractAddressDtoList.add(infoList.get(i));
            }
        }
        page.setList(contractAddressDtoList);
        result.setSuccess(true);
        result.setData(page);
        return result.toRpcClientResult();
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(LedgerErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
    }
}
Also used : Account(io.nuls.account.model.Account) ContractCollectionInfoPo(io.nuls.contract.storage.po.ContractCollectionInfoPo) Page(io.nuls.core.tools.page.Page) ContractResult(io.nuls.contract.dto.ContractResult) ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException)

Example 5 with ContractCollectionInfoPo

use of io.nuls.contract.storage.po.ContractCollectionInfoPo in project nuls by nuls-io.

the class ContractResource method contractCollection.

@POST
@Path("/collection")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "收藏智能合约地址/修改备注名称")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success") })
public RpcClientResult contractCollection(@ApiParam(name = "collection", value = "收藏智能合约地址/修改备注名称", required = true) ContractCollection collection) {
    try {
        if (collection == null) {
            return Result.getFailed(ContractErrorCode.NULL_PARAMETER).toRpcClientResult();
        }
        // 钱包账户地址
        String address = collection.getAccountAddress();
        if (StringUtils.isBlank(address)) {
            return Result.getFailed(LedgerErrorCode.NULL_PARAMETER).toRpcClientResult();
        }
        Result<Account> accountResult = accountService.getAccount(address);
        if (accountResult.isFailed()) {
            return accountResult.toRpcClientResult();
        }
        // 合约地址
        String contractAddress = collection.getContractAddress();
        if (!AddressTool.validAddress(contractAddress)) {
            return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
        }
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        if (!ContractLedgerUtil.isExistContractAddress(contractAddressBytes)) {
            return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST).toRpcClientResult();
        }
        // 备注名称
        String remarkName = collection.getRemarkName();
        // 获取合约地址的基本信息, 用到两个信息 - 创建者、创建交易hash
        Result<ContractAddressInfoPo> contractAddressInfoPoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
        ContractAddressInfoPo contractAddressInfoPo = contractAddressInfoPoResult.getData();
        if (contractAddressInfoPo == null) {
            return Result.getFailed(ContractErrorCode.DATA_NOT_FOUND).toRpcClientResult();
        }
        // 获取该合约的收藏数据
        Result<ContractCollectionInfoPo> collectionInfoPoResult = contractCollectionStorageService.getContractAddress(contractAddressBytes);
        ContractCollectionInfoPo po = collectionInfoPoResult.getData();
        Map<String, String> collectorMap;
        if (po != null) {
            collectorMap = po.getCollectorMap();
            if (collectorMap.containsKey(address)) {
                String preRemarkName = collectorMap.get(address);
                if (preRemarkName.equals(remarkName)) {
                    // 收藏者的信息没有变化,直接返回
                    return Result.getSuccess().toRpcClientResult();
                }
            } else {
                collectorMap.put(address, EMPTY);
            }
        } else {
            po = new ContractCollectionInfoPo();
            po.setCreater(contractAddressInfoPo.getSender());
            po.setContractAddress(contractAddress);
            po.setBlockHeight(contractAddressInfoPo.getBlockHeight());
            Transaction tx = ledgerService.getTx(contractAddressInfoPo.getCreateTxHash());
            if (tx == null) {
                return Result.getFailed(ContractErrorCode.TX_NOT_EXIST).toRpcClientResult();
            }
            po.setCreateTime(tx.getTime());
            collectorMap = MapUtil.createHashMap(4);
            collectorMap.put(address, EMPTY);
            po.setCollectorMap(collectorMap);
        }
        // 备注名
        if (StringUtils.isNotBlank(remarkName)) {
            // if (!StringUtils.validAlias(remarkName)) {
            // return Result.getFailed(ContractErrorCode.CONTRACT_NAME_FORMAT_INCORRECT).toRpcClientResult();
            // }
            collectorMap.put(address, remarkName);
        }
        Result result = contractCollectionStorageService.saveContractAddress(contractAddressBytes, po);
        return result.toRpcClientResult();
    } catch (Exception e) {
        Log.error(e);
        return Result.getFailed(LedgerErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
    }
}
Also used : Account(io.nuls.account.model.Account) ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) CreateContractTransaction(io.nuls.contract.entity.tx.CreateContractTransaction) ContractCollectionInfoPo(io.nuls.contract.storage.po.ContractCollectionInfoPo) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException) ContractResult(io.nuls.contract.dto.ContractResult)

Aggregations

ContractCollectionInfoPo (io.nuls.contract.storage.po.ContractCollectionInfoPo)5 Account (io.nuls.account.model.Account)4 NulsException (io.nuls.kernel.exception.NulsException)4 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)4 IOException (java.io.IOException)4 ContractResult (io.nuls.contract.dto.ContractResult)3 ContractAddressInfoPo (io.nuls.contract.storage.po.ContractAddressInfoPo)3 CreateContractTransaction (io.nuls.contract.entity.tx.CreateContractTransaction)1 Page (io.nuls.core.tools.page.Page)1