Search in sources :

Example 6 with CallContractData

use of io.nuls.contract.entity.txdata.CallContractData in project nuls by nuls-io.

the class ContractTransactionDto method makeTxData.

private Map<String, Object> makeTxData(Transaction tx) {
    Map<String, Object> result = new HashMap<>();
    TransactionLogicData txData = tx.getTxData();
    if (type == ContractConstant.TX_TYPE_CREATE_CONTRACT) {
        CreateContractData create = (CreateContractData) txData;
        result.put("data", new CreateContractDataDto(create));
    } else if (type == ContractConstant.TX_TYPE_CALL_CONTRACT) {
        CallContractData call = (CallContractData) txData;
        result.put("data", new CallContractDataDto(call));
    } else if (type == ContractConstant.TX_TYPE_DELETE_CONTRACT) {
        DeleteContractData delete = (DeleteContractData) txData;
        result.put("data", new DeleteContractDataDto(delete));
    } else if (type == ContractConstant.TX_TYPE_CONTRACT_TRANSFER) {
        ContractTransferData transfer = (ContractTransferData) txData;
        result.put("data", new ContractTransferDataDto(transfer));
    } else if (type == NulsConstant.TX_TYPE_COINBASE) {
        Map<String, String> map = MapUtil.createLinkedHashMap(1);
        map.put("sender", EMPTY);
        result.put("data", map);
    }
    return result;
}
Also used : HashMap(java.util.HashMap) CallContractData(io.nuls.contract.entity.txdata.CallContractData) ContractTransferData(io.nuls.contract.entity.txdata.ContractTransferData) CreateContractData(io.nuls.contract.entity.txdata.CreateContractData) DeleteContractData(io.nuls.contract.entity.txdata.DeleteContractData) TransactionLogicData(io.nuls.kernel.model.TransactionLogicData)

Example 7 with CallContractData

use of io.nuls.contract.entity.txdata.CallContractData in project nuls by nuls-io.

the class ContractTxServiceImpl method transferFee.

@Override
public Result transferFee(String sender, Na value, Long gasLimit, Long price, String contractAddress, String methodName, String methodDesc, String[][] args, String remark) {
    try {
        AssertUtil.canNotEmpty(sender, "the sender address can not be empty");
        AssertUtil.canNotEmpty(contractAddress, "the contractAddress can not be empty");
        AssertUtil.canNotEmpty(methodName, "the methodName can not be empty");
        if (value == null) {
            value = Na.ZERO;
        }
        Result<Account> accountResult = accountService.getAccount(sender);
        if (accountResult.isFailed()) {
            return accountResult;
        }
        byte[] senderBytes = AddressTool.getAddress(sender);
        byte[] contractAddressBytes = AddressTool.getAddress(contractAddress);
        BlockHeader blockHeader = NulsContext.getInstance().getBestBlock().getHeader();
        // 当前区块状态根
        byte[] prevStateRoot = ContractUtil.getStateRoot(blockHeader);
        AssertUtil.canNotEmpty(prevStateRoot, "All features of the smart contract are locked.");
        CallContractTransaction tx = new CallContractTransaction();
        if (StringUtils.isNotBlank(remark)) {
            try {
                tx.setRemark(remark.getBytes(NulsConfig.DEFAULT_ENCODING));
            } catch (UnsupportedEncodingException e) {
                Log.error(e);
                throw new RuntimeException(e);
            }
        }
        tx.setTime(TimeService.currentTimeMillis());
        CoinData coinData = new CoinData();
        // 向智能合约账户转账
        if (!Na.ZERO.equals(value)) {
            Coin toCoin = new Coin(contractAddressBytes, value);
            coinData.getTo().add(toCoin);
        }
        long gasUsed = gasLimit.longValue();
        Na imputedGasUsedNa = Na.valueOf(LongUtils.mul(gasUsed, price));
        // 总花费
        Na totalNa = imputedGasUsedNa.add(value);
        // 组装txData
        CallContractData callContractData = new CallContractData();
        callContractData.setContractAddress(contractAddressBytes);
        callContractData.setSender(senderBytes);
        callContractData.setValue(value.getValue());
        callContractData.setPrice(price.longValue());
        callContractData.setGasLimit(gasLimit.longValue());
        callContractData.setMethodName(methodName);
        callContractData.setMethodDesc(methodDesc);
        if (args != null) {
            callContractData.setArgsCount((byte) args.length);
            callContractData.setArgs(args);
        }
        tx.setTxData(callContractData);
        Na fee = accountLedgerService.getTxFee(senderBytes, totalNa, tx.size() + coinData.size(), TransactionFeeCalculator.MIN_PRICE_PRE_1024_BYTES);
        fee = fee.add(imputedGasUsedNa);
        return Result.getSuccess().setData(new Object[] { fee, tx });
    } catch (Exception e) {
        Log.error(e);
        Result result = Result.getFailed(ContractErrorCode.SYS_UNKOWN_EXCEPTION);
        result.setMsg(e.getMessage());
        return result;
    }
}
Also used : Account(io.nuls.account.model.Account) UnsupportedEncodingException(java.io.UnsupportedEncodingException) CallContractData(io.nuls.contract.entity.txdata.CallContractData) NulsException(io.nuls.kernel.exception.NulsException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) IOException(java.io.IOException) ContractResult(io.nuls.contract.dto.ContractResult) CoinDataResult(io.nuls.account.ledger.model.CoinDataResult) CallContractTransaction(io.nuls.contract.entity.tx.CallContractTransaction)

Aggregations

CallContractData (io.nuls.contract.entity.txdata.CallContractData)7 ContractResult (io.nuls.contract.dto.ContractResult)4 CallContractTransaction (io.nuls.contract.entity.tx.CallContractTransaction)4 IOException (java.io.IOException)4 CoinDataResult (io.nuls.account.ledger.model.CoinDataResult)3 UnsupportedEncodingException (java.io.UnsupportedEncodingException)3 Account (io.nuls.account.model.Account)2 ContractTokenTransferInfoPo (io.nuls.contract.dto.ContractTokenTransferInfoPo)2 ContractTransferTransaction (io.nuls.contract.entity.tx.ContractTransferTransaction)2 ContractAddressInfoPo (io.nuls.contract.storage.po.ContractAddressInfoPo)2 NulsException (io.nuls.kernel.exception.NulsException)2 Result (io.nuls.kernel.model.Result)2 VarInt (io.nuls.kernel.utils.VarInt)2 ValidateResult (io.nuls.kernel.validate.ValidateResult)2 ContractTransferData (io.nuls.contract.entity.txdata.ContractTransferData)1 CreateContractData (io.nuls.contract.entity.txdata.CreateContractData)1 DeleteContractData (io.nuls.contract.entity.txdata.DeleteContractData)1 ProgramStatus (io.nuls.contract.vm.program.ProgramStatus)1 ECKey (io.nuls.core.tools.crypto.ECKey)1 BlockHeader (io.nuls.kernel.model.BlockHeader)1