First Application
In this contract a balance is stored. A call may increase the balance.
%lang starknet
%builtins pedersen range_check
from starkware.cairo.common.cairo_builtins import HashBuiltin
@storage_var
func balance() -> (res : felt):
end
# Function to get the current balance.
@view
func get{
        syscall_ptr : felt*,
        pedersen_ptr : HashBuiltin*,
        range_check_ptr
    }() -> (
        value : felt
    ):
    let (value) = balance.read()
    return (value)
end
# Function to increase the balance by 1.
@external
func increase{
        syscall_ptr : felt*,
        pedersen_ptr : HashBuiltin*,
        range_check_ptr
    }():
    let (res) = balance.read()
    balance.write(res + 1)
    return ()
end
Things of note:
- The three implicit arguments in curly brackets are required for the storage operations.
- When assigning a return value to a reference, capture the
value in brackets: let (returned_value) = my_func()
- There is an @externalfunction that can modify contract state and a@viewfunction that can only read state. A function without either of these decorators is only accesible by the contract.
Save as contracts/first_application.cairo
Compile
Compile
nile compile
Or compile this specific contract
nile compile contracts/first_application.cairo
Test
Make a new file called test_first_application.py and populate it:
import pytest
import asyncio
from starkware.starknet.testing.starknet import Starknet
# Enables modules.
@pytest.fixture(scope='module')
def event_loop():
    return asyncio.new_event_loop()
# Reusable to save testing time.
@pytest.fixture(scope='module')
async def contract_factory():
    starknet = await Starknet.empty()
    contract = await starknet.deploy("contracts/first_application.cairo")
    return starknet, contract
@pytest.mark.asyncio
async def test_contract(contract_factory):
    starknet, contract = contract_factory
    # Modify contract.
    await contract.increase().invoke()
    await contract.increase().invoke()
    # Read from contract
    response = await contract.get().call()
    assert response.result.value == 2
Run the test
pytest tests/test_first_application.py
Local Deployment
Deploy to the local devnet.
nile deploy first_application --alias first_application
Interact
Write
nile invoke first_application increase
Read
nile call first_application get
Public deployment
Will default to the Goerli/alpha testnet until mainnet is available.
nile deploy first_application --alias first_application --network mainnet
Deploymend details
🚀 Deploying first_application
🌕 artifacts/first_application.json successfully deployed to 0x02b4cafe5ed8851a5c17ca006810b8848b0306e38f71896c52bdf4e9ef35b16f
📦 Registering deployment as first_application in mainnet.deployments.txt
Deployments can be viewed in the voyager explorer https://voyager.online