Arrays are defined using a pointer. Their values are addressed by their location in memory, relative to the pointer.

%lang starknet
%builtins range_check

from starkware.cairo.common.alloc import alloc

func read_array{
        index : felt
    ) -> (
        value : felt
    # A pointer to the start of an array.
    let (felt_array : felt*) = alloc()

    # [felt_array] is 'the value at the pointer'.
    # 'assert' sets the value at index
    assert [felt_array] = 9
    assert [felt_array + 1] = 8
    assert [felt_array + 2] = 7  # Set index 2 to value 7.
    assert [felt_array + 9] = 18
    # Access the list at the selected index.
    let val = felt_array[index]
    return (val)

Save as array.cairo.


Compile all contracts

nile compile

Or compile this specific contract

nile compile contracts/array.cairo


Make a new file called and populate it:

import pytest
import asyncio
from starkware.starknet.testing.starknet import Starknet

# Enables modules.
def event_loop():
    return asyncio.new_event_loop()

# Reusable to save testing time.
async def contract_factory():
    starknet = await Starknet.empty()
    contract = await starknet.deploy("contracts/array.cairo")
    return starknet, contract

async def test_contract(contract_factory):
    starknet, contract = contract_factory

    # Modify contract.
    await contract.read_array(9).invoke()

    # Read from contract
    response = await contract.read_array(9).call()
    assert response.result.value == 18

Run the test.


Local Deployment

Deploy to the local devnet.

nile deploy array --alias array



nile call array read_array 0

# Returns the value 9.

Public deployment

nile deploy array --alias array --network mainnet
🚀 Deploying array
🌕 artifacts/array.json successfully deployed to 0x059ecf357ff349d028d84f53f0a85981bb8ba53fa18e4fea82871d8c1fcf67ad
📦 Registering deployment as array in mainnet.deployments.txt

Deployments can be viewed in the voyager explorer