Search in sources :

Example 1 with ContractBalance

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();
}
Also used : ContractBalance(io.nuls.contract.ledger.module.ContractBalance)

Example 2 with ContractBalance

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);
    }
}
Also used : ContractBalance(io.nuls.contract.ledger.module.ContractBalance) LedgerUtil.asString(io.nuls.ledger.util.LedgerUtil.asString)

Example 3 with ContractBalance

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);
    }
}
Also used : ContractBalance(io.nuls.contract.ledger.module.ContractBalance) LedgerUtil.asString(io.nuls.ledger.util.LedgerUtil.asString)

Example 4 with ContractBalance

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();
}
Also used : ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) Na(io.nuls.kernel.model.Na) ContractBalance(io.nuls.contract.ledger.module.ContractBalance) DeleteContractData(io.nuls.contract.entity.txdata.DeleteContractData)

Example 5 with ContractBalance

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();
}
Also used : ContractAddressInfoPo(io.nuls.contract.storage.po.ContractAddressInfoPo) ContractBalance(io.nuls.contract.ledger.module.ContractBalance)

Aggregations

ContractBalance (io.nuls.contract.ledger.module.ContractBalance)10 LedgerUtil.asString (io.nuls.ledger.util.LedgerUtil.asString)6 ContractAddressInfoPo (io.nuls.contract.storage.po.ContractAddressInfoPo)3 Coin (io.nuls.kernel.model.Coin)3 DeleteContractData (io.nuls.contract.entity.txdata.DeleteContractData)2 NulsException (io.nuls.kernel.exception.NulsException)2 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)1 Account (io.nuls.account.model.Account)1 ContractResult (io.nuls.contract.dto.ContractResult)1 DeleteContractTransaction (io.nuls.contract.entity.tx.DeleteContractTransaction)1 ECKey (io.nuls.core.tools.crypto.ECKey)1 Entry (io.nuls.db.model.Entry)1 Na (io.nuls.kernel.model.Na)1 IOException (java.io.IOException)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1