StarkNet + Cairo 1.0 Development
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>")