Search in sources :

Example 1 with ProgramInvoke

use of io.nuls.contract.vm.program.impl.ProgramInvoke in project nuls by nuls-io.

the class NativeAddress method call.

private static String call(String address, String methodName, String methodDesc, String[][] args, BigInteger value, Frame frame) {
    if (value.compareTo(BigInteger.ZERO) < 0) {
        throw new ErrorException(String.format("amount less than zero, value=%s", value), frame.vm.getGasUsed(), null);
    }
    ProgramInvoke programInvoke = frame.vm.getProgramInvoke();
    ProgramCall programCall = new ProgramCall();
    programCall.setNumber(programInvoke.getNumber());
    programCall.setSender(programInvoke.getContractAddress());
    programCall.setValue(value != null ? value : BigInteger.ZERO);
    programCall.setGasLimit(programInvoke.getGasLimit() - frame.vm.getGasUsed());
    programCall.setPrice(programInvoke.getPrice());
    programCall.setContractAddress(NativeAddress.toBytes(address));
    programCall.setMethodName(methodName);
    programCall.setMethodDesc(methodDesc);
    programCall.setArgs(args);
    programCall.setEstimateGas(programInvoke.isEstimateGas());
    programCall.setViewMethod(programInvoke.isViewMethod());
    programCall.setInternalCall(true);
    if (programCall.getValue().compareTo(BigInteger.ZERO) > 0) {
        checkBalance(programCall.getSender(), programCall.getValue(), frame);
        frame.vm.getProgramExecutor().getAccount(programCall.getSender()).addBalance(programCall.getValue().negate());
        ProgramTransfer programTransfer = new ProgramTransfer(programCall.getSender(), programCall.getContractAddress(), programCall.getValue());
        frame.vm.getTransfers().add(programTransfer);
    }
    ProgramResult programResult = frame.vm.getProgramExecutor().callProgramExecutor().call(programCall);
    frame.vm.addGasUsed(programResult.getGasUsed());
    if (programResult.isSuccess()) {
        frame.vm.getTransfers().addAll(programResult.getTransfers());
        frame.vm.getEvents().addAll(programResult.getEvents());
        return programResult.getResult();
    } else if (programResult.isError()) {
        // return null;
        throw new ErrorException(programResult.getErrorMessage(), programResult.getGasUsed(), programResult.getStackTrace());
    } else {
        throw new RuntimeException("error contract status");
    }
}
Also used : ProgramInvoke(io.nuls.contract.vm.program.impl.ProgramInvoke) ProgramResult(io.nuls.contract.vm.program.ProgramResult) ErrorException(io.nuls.contract.vm.exception.ErrorException) ProgramCall(io.nuls.contract.vm.program.ProgramCall) ProgramTransfer(io.nuls.contract.vm.program.ProgramTransfer)

Aggregations

ErrorException (io.nuls.contract.vm.exception.ErrorException)1 ProgramCall (io.nuls.contract.vm.program.ProgramCall)1 ProgramResult (io.nuls.contract.vm.program.ProgramResult)1 ProgramTransfer (io.nuls.contract.vm.program.ProgramTransfer)1 ProgramInvoke (io.nuls.contract.vm.program.impl.ProgramInvoke)1