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;
}
}
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()));
}
}
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);
}
}
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();
}
}
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();
}
}
Aggregations