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