Search in sources :

Example 11 with ContractAddressInfoPo

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

the class ContractServiceImpl method isTokenContractAddress.

@Override
public boolean isTokenContractAddress(String contractAddress) {
    try {
        if (StringUtils.isBlank(contractAddress)) {
            return false;
        }
        if (!AddressTool.validAddress(contractAddress)) {
            return false;
        }
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        Result<ContractAddressInfoPo> contractAddressInfoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
        ContractAddressInfoPo po = contractAddressInfoResult.getData();
        if (po == null) {
            return false;
        }
        return po.isNrc20();
    } catch (Exception e) {
        Log.error("check if it is a token address error.", e);
        return false;
    }
}
Also used : ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) NulsException(io.nuls.kernel.exception.NulsException) IOException(java.io.IOException)

Example 12 with ContractAddressInfoPo

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

the class ContractBalanceManager method initAllTokensByAccount.

public void initAllTokensByAccount(String account) {
    if (!AddressTool.validAddress(account)) {
        return;
    }
    Result<List<ContractAddressInfoPo>> allContractInfoListResult = contractAddressStorageService.getAllNrc20ContractInfoList();
    if (allContractInfoListResult.isFailed()) {
        return;
    }
    List<ContractAddressInfoPo> contractAddressInfoPoList = allContractInfoListResult.getData();
    for (ContractAddressInfoPo po : contractAddressInfoPoList) {
        initialContractToken(account, AddressTool.getStringAddressByBytes(po.getContractAddress()));
    }
}
Also used : ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo)

Example 13 with ContractAddressInfoPo

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

the class ContractServiceImpl method getContractTokenViaVm.

@Override
public Result<ContractTokenInfo> getContractTokenViaVm(String address, String contractAddress) {
    try {
        if (StringUtils.isBlank(contractAddress) || StringUtils.isBlank(address)) {
            return Result.getFailed(ContractErrorCode.NULL_PARAMETER);
        }
        if (!AddressTool.validAddress(contractAddress) || !AddressTool.validAddress(address)) {
            return Result.getFailed(AccountErrorCode.ADDRESS_ERROR);
        }
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        Result<ContractAddressInfoPo> contractAddressInfoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
        ContractAddressInfoPo po = contractAddressInfoResult.getData();
        if (po == null) {
            return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST);
        }
        if (!po.isNrc20()) {
            return Result.getFailed(ContractErrorCode.CONTRACT_NOT_NRC20);
        }
        ProgramResult programResult = vmHelper.invokeViewMethod(contractAddressBytes, "balanceOf", null, address);
        Result<ContractTokenInfo> result;
        if (!programResult.isSuccess()) {
            result = Result.getFailed(ContractErrorCode.DATA_ERROR);
            result.setMsg(ContractUtil.simplifyErrorMsg(programResult.getErrorMessage()));
        } else {
            result = Result.getSuccess();
            ContractTokenInfo tokenInfo = new ContractTokenInfo(contractAddress, po.getNrc20TokenName(), po.getDecimals(), new BigInteger(programResult.getResult()), po.getNrc20TokenSymbol(), po.getBlockHeight());
            byte[] prevStateRoot = ContractUtil.getStateRoot(NulsContext.getInstance().getBestBlock().getHeader());
            ProgramExecutor track = programExecutor.begin(prevStateRoot);
            tokenInfo.setStatus(track.status(AddressTool.getAddress(tokenInfo.getContractAddress())).ordinal());
            result.setData(tokenInfo);
        }
        return result;
    } catch (Exception e) {
        Log.error("get contract token via VM error.", e);
        return Result.getFailed(ContractErrorCode.SYS_UNKOWN_EXCEPTION);
    }
}
Also used : ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) BigInteger(java.math.BigInteger) ContractTokenInfo(io.nuls.contract.dto.ContractTokenInfo) NulsException(io.nuls.kernel.exception.NulsException) IOException(java.io.IOException)

Example 14 with ContractAddressInfoPo

use of io.nuls.contract.storage.po.ContractAddressInfoPo 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 15 with ContractAddressInfoPo

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

the class ContractResource method validateContractAddress.

@GET
@Path("/{address}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "验证是否为合约地址")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success") })
public RpcClientResult validateContractAddress(@ApiParam(name = "address", value = "地址", required = true) @PathParam("address") String address) {
    if (StringUtils.isBlank(address)) {
        return Result.getFailed(LedgerErrorCode.NULL_PARAMETER).toRpcClientResult();
    }
    if (!AddressTool.validAddress(address)) {
        return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
    }
    try {
        boolean isContractAddress = false;
        boolean isPayable = false;
        boolean isNrc20 = false;
        long decimals = 0L;
        do {
            byte[] contractAddressBytes = AddressTool.getAddress(address);
            Result<ContractAddressInfoPo> contractAddressInfoPoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
            if (contractAddressInfoPoResult.isFailed()) {
                break;
            }
            ContractAddressInfoPo contractAddressInfoPo = contractAddressInfoPoResult.getData();
            if (contractAddressInfoPo == null) {
                break;
            }
            isContractAddress = true;
            isPayable = contractAddressInfoPo.isAcceptDirectTransfer();
            isNrc20 = contractAddressInfoPo.isNrc20();
            if (isNrc20) {
                decimals = contractAddressInfoPo.getDecimals();
            }
        } while (false);
        Map<String, Object> resultMap = MapUtil.createLinkedHashMap(2);
        resultMap.put("isContractAddress", isContractAddress);
        resultMap.put("isPayable", isPayable);
        resultMap.put("isNrc20", isNrc20);
        if (isNrc20) {
            resultMap.put("decimals", decimals);
        }
        return Result.getSuccess().setData(resultMap).toRpcClientResult();
    } catch (Exception e) {
        return Result.getFailed().setMsg(e.getMessage()).toRpcClientResult();
    }
}
Also used : ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) NulsException(io.nuls.kernel.exception.NulsException) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException) IOException(java.io.IOException)

Aggregations

ContractAddressInfoPo (io.nuls.contract.storage.po.ContractAddressInfoPo)24 IOException (java.io.IOException)15 NulsException (io.nuls.kernel.exception.NulsException)14 ContractResult (io.nuls.contract.dto.ContractResult)9 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)9 ContractTokenTransferInfoPo (io.nuls.contract.dto.ContractTokenTransferInfoPo)6 VarInt (io.nuls.kernel.utils.VarInt)6 Account (io.nuls.account.model.Account)5 CreateContractTransaction (io.nuls.contract.entity.tx.CreateContractTransaction)4 CreateContractData (io.nuls.contract.entity.txdata.CreateContractData)4 BigInteger (java.math.BigInteger)4 ArrayList (java.util.ArrayList)4 ContractBalance (io.nuls.contract.ledger.module.ContractBalance)3 ContractCollectionInfoPo (io.nuls.contract.storage.po.ContractCollectionInfoPo)3 Result (io.nuls.kernel.model.Result)3 ValidateResult (io.nuls.kernel.validate.ValidateResult)3 LinkedList (java.util.LinkedList)3 List (java.util.List)3 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)2 ContractTransferTransaction (io.nuls.contract.entity.tx.ContractTransferTransaction)2