Quick Start using the JavaScript VM
===================================

There are 3 type of environments Remix can be plugged to:
`Javascript VM`, `Injected provider`, or `Web3 provider`. (see
../run\_tab)

Both `Web3 provider` and `Injected provider` require the use of an
external tool.

The external tool for `Web3 provider` is an Ethereum node the tools for
`Injected provider` are Mist or Metamask.

The `JavaScript VM` mode is convenient because each execution runs in
your browser. Thus reloading the page will restart Remix with an empty
state.

So for performance purposes, it might also be better to use an external
node.

Selecting the VM mode
---------------------

Make sure the VM mode is selected. All accounts displayed in `Accounts`
should have 100 ether.

Sample contract
---------------
::

pragma solidity ^0.4.16;

contract testContract {

    uint value;
    function testContract(uint _p) {
        value = _p;
    }

    function setP(uint _n) payable {
        value = _n;
    }

    function setNP(uint _n) {
        value = _n;
    }

    function get () constant returns (uint) {
        return value;
    }
}

This contract is very basic. The goal is to quickly start to create and
to interact with a sample contract.

Deploying an instance
---------------------

The `Compile tab` displays information related to the current contract
(note that there can be more than one) (see ../compile\_tab).

Moving on, in the `Run tab` select, `JavaScript VM` to specify that you
are going to deploy an instance of the contract in the `JavaScript VM`
state.

![image](images/remix_quickstart_javascriptvm_creation.png)

The constructor of `testContract` needs a parameter (of type `uint`).
Give any value and click on `Create`.

The transaction which deploys the instance of `testContract` is created.

In a "normal" blockchain, it can take several seconds to execute. This
is the time for the transaction to be mined. However, because we are
using the `JavaScript VM`, our execution is immediate.

The terminal will inform you about the transaction. You can see details
there and start debugging.

The newly created instance is displayed in the `run tab`.

![image](images/remix_quickstart_javascriptvm_creationTransaction.png)

Interacting with an instance
----------------------------

This new instance contains 3 actions which corresponds to the 3
functions (`setP`, `setPN`, `get`). Clicking on `SetP` or `SetPN` will
create a new transaction.

Note that `SetP` is `payable` (red action) : it is possible to send
value (Ether) to the contract.

`SetPN` is not payable (light red action) : it is not possible to send
value (Ether) to the contract.

Clicking on `get` will not execute a transaction (blue action). It is
not necessary to do so because `get` does not modify the state (variable
`value`) of this instance.

As `get` is `constant` you can see the return value just below the
action.

![image](images/remix_quickstart_javascriptvm_callinginstance.png)
