use of io.nuls.contract.ledger.module.ContractBalance in project nuls by nuls-io.
the class ContractResource method getContractBalance.
@GET
@Path("/balance/{address}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "获取智能合约余额")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success") })
public RpcClientResult getContractBalance(@ApiParam(name = "address", value = "合约地址", required = true) @PathParam("address") String contractAddress) {
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);
if (!ContractLedgerUtil.isExistContractAddress(contractAddressBytes)) {
return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST).toRpcClientResult();
}
Result<ContractBalance> result = contractUtxoService.getBalance(contractAddressBytes);
ContractBalance balance = (ContractBalance) result.getData();
Map<String, Object> resultMap = MapUtil.createLinkedHashMap(4);
resultMap.put("address", contractAddress);
resultMap.put("balance", balance == null ? Na.ZERO : balance.getBalance().toString());
resultMap.put("usable", balance == null ? Na.ZERO : balance.getRealUsable().toString());
resultMap.put("locked", balance == null ? Na.ZERO : balance.getLocked().toString());
return Result.getSuccess().setData(resultMap).toRpcClientResult();
}
use of io.nuls.contract.ledger.module.ContractBalance in project nuls by nuls-io.
the class ContractBalanceManager method addTempBalance.
public void addTempBalance(byte[] address, Na amount) {
Map<String, ContractBalance> tempBalanceMap = tempBalanceMapManager.get();
String addressKey = asString(address);
ContractBalance contractBalance = tempBalanceMap.get(addressKey);
if (contractBalance != null) {
contractBalance.addTempUsable(amount);
}
}
use of io.nuls.contract.ledger.module.ContractBalance in project nuls by nuls-io.
the class ContractBalanceManager method minusTempBalance.
public void minusTempBalance(byte[] address, Na amount) {
Map<String, ContractBalance> tempBalanceMap = tempBalanceMapManager.get();
String addressKey = asString(address);
ContractBalance contractBalance = tempBalanceMap.get(addressKey);
if (contractBalance != null) {
contractBalance.minusTempUsable(amount);
}
}
use of io.nuls.contract.ledger.module.ContractBalance in project nuls by nuls-io.
the class DeleteContractTxValidator method validate.
@Override
public ValidateResult validate(DeleteContractTransaction tx) throws NulsException {
DeleteContractData txData = tx.getTxData();
byte[] sender = txData.getSender();
byte[] contractAddressBytes = txData.getContractAddress();
Set<String> addressSet = SignatureUtil.getAddressFromTX(tx);
if (!addressSet.contains(AddressTool.getStringAddressByBytes(sender))) {
Log.error("contract delete error: The contract deleter is not the transaction creator.");
return ValidateResult.getFailedResult(this.getClass().getSimpleName(), TransactionErrorCode.TX_DATA_VALIDATION_ERROR);
}
Result<ContractAddressInfoPo> contractAddressInfoPoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
if (contractAddressInfoPoResult.isFailed()) {
return ValidateResult.getFailedResult(this.getClass().getSimpleName(), contractAddressInfoPoResult.getErrorCode());
}
ContractAddressInfoPo contractAddressInfoPo = contractAddressInfoPoResult.getData();
if (contractAddressInfoPo == null) {
Log.error("contract delete error: The contract does not exist.");
return ValidateResult.getFailedResult(this.getClass().getSimpleName(), ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST);
}
if (!ArraysTool.arrayEquals(sender, contractAddressInfoPo.getSender())) {
Log.error("contract delete error: The contract deleter is not the contract creator.");
return ValidateResult.getFailedResult(this.getClass().getSimpleName(), TransactionErrorCode.TX_DATA_VALIDATION_ERROR);
}
Result<ContractBalance> result = contractUtxoService.getBalance(contractAddressBytes);
ContractBalance balance = (ContractBalance) result.getData();
if (balance == null) {
Log.error("contract delete error: That balance of the contract is abnormal.");
return ValidateResult.getFailedResult(this.getClass().getSimpleName(), TransactionErrorCode.TX_DATA_VALIDATION_ERROR);
}
Na totalBalance = balance.getBalance();
if (totalBalance.compareTo(Na.ZERO) != 0) {
Log.error("contract delete error: The balance of the contract is not 0.");
return ValidateResult.getFailedResult(this.getClass().getSimpleName(), ContractErrorCode.CONTRACT_DELETE_BALANCE);
}
return ValidateResult.getSuccessResult();
}
use of io.nuls.contract.ledger.module.ContractBalance in project nuls by nuls-io.
the class ContractTxServiceImpl method validateContractDeleteTx.
/**
* 验证创建删除智能合约的交易
*
* @param sender 交易创建者
* @param contractAddress 合约地址
* @return
*/
@Override
public Result validateContractDeleteTx(String sender, String contractAddress) {
AssertUtil.canNotEmpty(sender, "the sender address can not be empty");
AssertUtil.canNotEmpty(contractAddress, "the contractAddress can not be empty");
byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
Result<ContractAddressInfoPo> contractAddressInfoPoResult = contractAddressStorageService.getContractAddressInfo(contractAddressBytes);
if (contractAddressInfoPoResult.isFailed()) {
return contractAddressInfoPoResult;
}
ContractAddressInfoPo contractAddressInfoPo = contractAddressInfoPoResult.getData();
if (contractAddressInfoPo == null) {
return Result.getFailed(ContractErrorCode.CONTRACT_ADDRESS_NOT_EXIST);
}
BlockHeader blockHeader = NulsContext.getInstance().getBestBlock().getHeader();
// 当前区块状态根
byte[] stateRoot = ContractUtil.getStateRoot(blockHeader);
// 获取合约当前状态
ProgramStatus status = vmHelper.getContractStatus(stateRoot, contractAddressBytes);
boolean isTerminatedContract = ContractUtil.isTerminatedContract(status.ordinal());
if (isTerminatedContract) {
return Result.getFailed(ContractErrorCode.CONTRACT_DELETED);
}
byte[] senderBytes = AddressTool.getAddress(sender);
if (!ArraysTool.arrayEquals(senderBytes, contractAddressInfoPo.getSender())) {
return Result.getFailed(ContractErrorCode.CONTRACT_DELETE_CREATER);
}
Result<ContractBalance> result = contractBalanceManager.getBalance(contractAddressBytes);
ContractBalance balance = (ContractBalance) result.getData();
if (balance == null) {
return result;
}
Na totalBalance = balance.getBalance();
if (totalBalance.compareTo(Na.ZERO) != 0) {
return Result.getFailed(ContractErrorCode.CONTRACT_DELETE_BALANCE);
}
return Result.getSuccess();
}
Aggregations