Cairo supports looping through recursion.

  1. The loop length is specified.
  2. A looping function is called with a list of elements.
  3. It checks if the element is the final one. If not, it increments and calls itself.
  4. Step 3 repeats until the last element is reached.
  5. The function proceeds to execute the desired operation.
  6. The second last element is then reached.
  7. Then the third last element, and so forth, until the first element.
  8. The end of the function is reached.
  9. The result is returned to the calling function.
%lang starknet

from starkware.cairo.common.alloc import alloc

func read_sum() -> (sum : felt):
    let (array : felt*) = alloc()
    assert [array] = 2
    assert [array + 1] = 23
    assert [array + 2] = 1
    let (sum) = get_sum(array, 3)
    return (sum)

# This function has no decorator - no direct user interaction
func get_sum(array : felt*, length : felt) -> (sum : felt):
    if length == 0:
        # Start with sum=0.
        return (sum=0)

    let (current_sum) = get_sum(array=array + 1, length=length - 1)
    # This part of the function is first reached when length=0.
    # The sum begins. This is the sequence: 1, 1+23 then 24+2
    let sum = [array] + current_sum
    # The return function targets the body of this function
    # 3 times before returning to the body of read_sum().
    return (sum)

Save as loop.cairo.


Then, to compile:

starknet-compile loop.cairo \
    --output loop_compiled.json \
    --abi loop_contract_abi.json


Then, to deploy:

starknet deploy --contract loop_compiled.json \

Deploy transaction was sent.
Contract address: 0x073aca6f06d6116180cbff0a5980d46fff9e0b1410ff0900a0bab762c1b5d050.
Transaction ID: 523279.

Note: Remove the zero after the x, 0x[0]12345. E.g., 0x0123abc becomes 0x123abc.


Check the status of the transaction:

starknet tx_status --network=alpha --id=523279

    "block_id": 25022,
    "tx_status": "PENDING"

The block and the contract


Then, to have the contract loop over the array and compute the sum:

starknet call \
    --network=alpha \
    --address 0x73aca6f06d6116180cbff0a5980d46fff9e0b1410ff0900a0bab762c1b5d050 \
    --abi loop_contract_abi.json \
    --function read_sum


Status options:

  • NOT_RECEIVED: The transaction has not been received yet (i.e., not written to storage).
  • RECEIVED: The transaction was received by the operator.
    • PENDING: The transaction passed the validation and is waiting to be sent on-chain.
      • REJECTED: The transaction failed validation and thus was skipped.
      • ACCEPTED_ONCHAIN: The transaction was accepted on-chain.

Visit the voyager explorer to see the transactions.