starknet/cairo

StarkNet + Cairo 1.0 Development

starknettechnical-doc🤖 Auto-generatedconfidence lowhealth 100%
v1.0.0·by AgentRel Community·Updated 3/20/2026

Overview

StarkNet is an Ethereum ZK-Rollup based on STARK proofs. Cairo 1.0 is its native smart contract language (Rust-like syntax). AI tools frequently generate outdated Cairo 0 (Python-style) code, or incorrectly use the starknet.js v4 API instead of v6.

⚠️ Gotchas (Most Common AI Mistakes)

1. Cairo 0 vs Cairo 1.0 (Completely Different Languages)

❌ Old Cairo 0 (Python-style, deprecated):

%builtins output
from starkware.cairo.common.serialize import serialize_word
func main(output_ptr: felt*) -> (output_ptr: felt*) {
    serialize_word(output_ptr, 42);
    return (output_ptr=output_ptr + 1);
}

✅ Current Cairo 1.0 (Rust-style):

#[starknet::contract]
mod Counter {
    use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};

    #[storage]
    struct Storage {
        value: u64,
    }

    #[abi(embed_v0)]
    impl CounterImpl of super::ICounter<ContractState> {
        fn increment(ref self: ContractState) {
            self.value.write(self.value.read() + 1);
        }

        fn get_value(self: @ContractState) -> u64 {
            self.value.read()
        }
    }
}

2. Use starknet.js v6, Not v4/v5

❌ Old version (v4/v5, deprecated):

import { Provider, Contract } from 'starknet';
const provider = new Provider({ sequencer: { network: 'mainnet-alpha' } });

✅ Current version (v6):

import { RpcProvider, Contract, Account, stark } from 'starknet';
const provider = new RpcProvider({
  nodeUrl: 'https://starknet-mainnet.public.blastapi.io/rpc/v0_7',
});

3. Interface Definitions Are Required

#[starknet::interface]
trait ICounter<TContractState> {
    fn increment(ref self: TContractState);
    fn get_value(self: @TContractState) -> u64;
}

4. Event Definitions (Cairo 1.0 Style)

#[event]
#[derive(Drop, starknet::Event)]
enum Event {
    ValueChanged: ValueChanged,
}

#[derive(Drop, starknet::Event)]
struct ValueChanged {
    #[key]
    caller: ContractAddress,
    new_value: u64,
}

TypeScript Interaction Example

import { RpcProvider, Account, Contract, stark, uint256 } from 'starknet';

const provider = new RpcProvider({
  nodeUrl: 'https://starknet-sepolia.public.blastapi.io/rpc/v0_7',
});

const account = new Account(
  provider,
  '0xYOUR_ACCOUNT_ADDRESS',
  '0xYOUR_PRIVATE_KEY'
);

const contract = new Contract(abi, contractAddress, account);

// Call a read-only method
const value = await contract.get_value();

// Send a transaction
const { transaction_hash } = await contract.invoke('increment', []);
await provider.waitForTransaction(transaction_hash);

Contract Declaration and Deployment

import { RpcProvider, Account, DeclareContractPayload } from 'starknet';

// Declare the contract (upload Sierra + CASM)
const declareResponse = await account.declare({
  contract: sierraJson,
  casm: casmJson,
});
await provider.waitForTransaction(declareResponse.transaction_hash);

// Deploy the contract
const deployResponse = await account.deployContract({
  classHash: declareResponse.class_hash,
  constructorCalldata: [],
});

Installation

# Scarb (Cairo package manager)
curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh
# starknet.js
npm install starknet
# Starknet Foundry (testing)
curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh

Reference

Feedback

If this skill contains incorrect or outdated information, call:

id: starknet/cairo name: StarkNet + Cairo 1.0 Development version: 1.0.0 ecosystem: starknet type: technical-doc time_sensitivity: evergreen source: community confidence: medium maintainer: AgentRel Community last_updated: 2026-03-19 feedback_endpoint: https://agentrel.vercel.app/api/feedback

Overview

StarkNet is an Ethereum ZK-Rollup based on STARK proofs. Cairo 1.0 is its native smart contract language (Rust-like syntax). AI tools frequently generate outdated Cairo 0 (Python-style) code, or incorrectly use the starknet.js v4 API instead of v6.

⚠️ Gotchas (Most Common AI Mistakes)

1. Cairo 0 vs Cairo 1.0 (Completely Different Languages)

❌ Old Cairo 0 (Python-style, deprecated):

%builtins output
from starkware.cairo.common.serialize import serialize_word
func main(output_ptr: felt*) -> (output_ptr: felt*) {
    serialize_word(output_ptr, 42);
    return (output_ptr=output_ptr + 1);
}

✅ Current Cairo 1.0 (Rust-style):

#[starknet::contract]
mod Counter {
    use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};

    #[storage]
    struct Storage {
        value: u64,
    }

    #[abi(embed_v0)]
    impl CounterImpl of super::ICounter<ContractState> {
        fn increment(ref self: ContractState) {
            self.value.write(self.value.read() + 1);
        }

        fn get_value(self: @ContractState) -> u64 {
            self.value.read()
        }
    }
}

2. Use starknet.js v6, Not v4/v5

❌ Old version (v4/v5, deprecated):

import { Provider, Contract } from 'starknet';
const provider = new Provider({ sequencer: { network: 'mainnet-alpha' } });

✅ Current version (v6):

import { RpcProvider, Contract, Account, stark } from 'starknet';
const provider = new RpcProvider({
  nodeUrl: 'https://starknet-mainnet.public.blastapi.io/rpc/v0_7',
});

3. Interface Definitions Are Required

#[starknet::interface]
trait ICounter<TContractState> {
    fn increment(ref self: TContractState);
    fn get_value(self: @TContractState) -> u64;
}

4. Event Definitions (Cairo 1.0 Style)

#[event]
#[derive(Drop, starknet::Event)]
enum Event {
    ValueChanged: ValueChanged,
}

#[derive(Drop, starknet::Event)]
struct ValueChanged {
    #[key]
    caller: ContractAddress,
    new_value: u64,
}

TypeScript Interaction Example

import { RpcProvider, Account, Contract, stark, uint256 } from 'starknet';

const provider = new RpcProvider({
  nodeUrl: 'https://starknet-sepolia.public.blastapi.io/rpc/v0_7',
});

const account = new Account(
  provider,
  '0xYOUR_ACCOUNT_ADDRESS',
  '0xYOUR_PRIVATE_KEY'
);

const contract = new Contract(abi, contractAddress, account);

// Call a read-only method
const value = await contract.get_value();

// Send a transaction
const { transaction_hash } = await contract.invoke('increment', []);
await provider.waitForTransaction(transaction_hash);

Contract Declaration and Deployment

import { RpcProvider, Account, DeclareContractPayload } from 'starknet';

// Declare the contract (upload Sierra + CASM)
const declareResponse = await account.declare({
  contract: sierraJson,
  casm: casmJson,
});
await provider.waitForTransaction(declareResponse.transaction_hash);

// Deploy the contract
const deployResponse = await account.deployContract({
  classHash: declareResponse.class_hash,
  constructorCalldata: [],
});

Installation

# Scarb (Cairo package manager)
curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh
# starknet.js
npm install starknet
# Starknet Foundry (testing)
curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh

Reference

Feedback

If this skill contains incorrect or outdated information, call: agentrel_feedback(skill="starknet/cairo", issue="<description>", code_snippet="<optional>", error_message="<optional>", fix="<optional>")