If-Else
Cairo supports the condition statements if and else.
%lang starknet
%builtins pedersen range_check
from starkware.cairo.common.cairo_builtins import HashBuiltin
from starkware.starknet.common.storage import Storage
@storage_var
func criterion() -> (val : felt):
end
@storage_var
func met_criteria_memory() -> (val : felt):
end
@view
func match_count{
        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*,
        range_check_ptr}() -> (count : felt):
    let (num) = met_criteria_memory.read()
    return (num)
end
@external
func is_match{
        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*,
        range_check_ptr}(number : felt) -> (result : felt):
    let (condition) = criterion.read()
    if number == condition:
        let (total) = do_thing()
        return (total)
    else:
        return (0)
    end
end
@external
func store_criterion{
        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*,
        range_check_ptr}(number : felt):
    criterion.write(number)
    return ()
end
func do_thing{
        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*,
        range_check_ptr}() -> (total : felt):
    let (mem) = met_criteria_memory.read()
    met_criteria_memory.write(mem + 1)
    return (mem + 1)
end
Save as if_else.cairo.
Compile
Then, to compile:
starknet-compile if_else.cairo \
    --output if_else_compiled.json \
    --abi if_else_contract_abi.json
Deploy
Then, to deploy:
starknet deploy --contract if_else_compiled.json \
    --network=alpha
Deploy transaction was sent.
Contract address: 0x04ac2abb486ee741ccf26af5372d3608e5e79262680e96e2f0532300de7ded02.
Transaction ID: 529498.
Note: Remove the zero after the x, 0x[0]12345. E.g., 0x0123abc becomes 0x123abc.
Monitor
Check the status of the transaction:
starknet tx_status --network=alpha --id=529498
Returns:
{
    "block_id": 25294,
    "tx_status": "PENDING"
}
Interact
Then, set the condition.
starknet invoke \
    --network=alpha \
    --address 0x4ac2abb486ee741ccf26af5372d3608e5e79262680e96e2f0532300de7ded02 \
    --abi if_else_contract_abi.json \
    --function store_criterion \
    --inputs 10
Returns:
Invoke transaction was sent.
Contract address: 0x04ac2abb486ee741ccf26af5372d3608e5e79262680e96e2f0532300de7ded02.
Transaction ID: 529530.
Then call is_match a few times:
starknet invoke \
    --network=alpha \
    --address 0x4ac2abb486ee741ccf26af5372d3608e5e79262680e96e2f0532300de7ded02 \
    --abi if_else_contract_abi.json \
    --function is_match \
    --inputs 10
Returns:
Invoke transaction was sent.
Contract address: 0x04ac2abb486ee741ccf26af5372d3608e5e79262680e96e2f0532300de7ded02.
Transaction ID: 529530.
Then test that the contract remembers the number of matches:
starknet call \
    --network=alpha \
    --address 0x4ac2abb486ee741ccf26af5372d3608e5e79262680e96e2f0532300de7ded02 \
    --abi if_else_contract_abi.json \
    --function match_count
Returns:
4
Note the following:
- An ifstatements may optionally be followed by anelse.
- Both ifandelsestatements must contain areturn()statement.
- An endstatement must follow anifstatement or anif-elsepair.
- else ifstatements are not supported.
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.
 
 
- PENDING: The transaction passed the validation and is waiting to be sent on-chain.
        
Visit the voyager explorer to see the transactions.