mcpField
C
cairo-deploy

cairo-deploy

github.com/keep-starknet-strangeクラウド・DevOps8135 回インストール3 週間前に更新
リポジトリ

cairo-deploy について

Cairo Deploy は、Starknet Foundry の sncast を使って Starknet 上で Cairo スマートコントラクトをデプロイ、操作するためのリファレンススキルです。アカウントとネットワークの設定から、クラス宣言、デプロイ、検証、コントラクト呼び出しまでを扱います。

主な機能

  1. 01Scarbでコントラクトをビルド
  2. 02デプロイ用アカウントとネットワークを設定
  3. 03クラスを宣言してインスタンスをデプロイ
  4. 04書き込みの実行と読み取り関数の呼び出し
  5. 05マルチコールとデプロイスクリプトの実行
  6. 06デプロイ済みコントラクトを検証

活用シーン

  1. 01CairoコントラクトをSepoliaまたはメインネットにデプロイ
  2. 02アカウントとRPCエンドポイントを設定
  3. 03デプロイ済みコントラクトの関数を呼び出す
  4. 04コントラクトのソースコードを検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/keep-starknet-strange/starknet-agentic --skill cairo-deploy

インストール後、Claude Code で/cairo-deployを入力して読み込まれたか確認します。

同梱ファイルagents/openai.yaml

詳細

Cairo Deploy

sncast(Starknet Foundry)を使用して、Starknet に Cairo スマートコントラクトをデプロイするためのリファレンスです。

使用する場面

  • Starknet devnet、Sepolia、または mainnet にコントラクトをデプロイする
  • コントラクトクラスを宣言する
  • デプロイヤーアカウントをセットアップする
  • ネットワークエンドポイントを設定する
  • デプロイ済みコントラクトを検証する
  • デプロイ済みコントラクトを呼び出す/読み取る

使用しない場面

  • コントラクトロジックを記述またはリファクタリングする(cairo-contract-authoring)。
  • 単体テスト、統合テスト、またはファジングテストを行う(cairo-testing)。
  • ガスやパフォーマンスを最適化する(cairo-optimization)。
  • 既存コードのセキュリティレビューを行う(cairo-auditor)。

クイックスタート

  1. scarb build でビルドし、sncast で宣言してデプロイします。
  2. 作業がコントラクトの作成、テスト、または監査に戻る場合は、スキルカタログを使用してください。

セットアップ

Starknet Foundry をインストールする
# Install via asdf (recommended for version pinning)
asdf plugin add starknet-foundry
asdf install starknet-foundry 0.56.0
asdf global starknet-foundry 0.56.0

# Or install directly
curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh
snfoundryup
.tool-versions

再現可能なビルドのため、バージョンを固定します。

scarb 2.15.1
starknet-foundry 0.56.0

注: snforge 0.56.0 には Scarb >= 2.12.0 が必要です。最新バージョンについては、github.com/foundry-rs/starknet-foundry/releasesを確認してください。

ビルド

# Build contracts (generates Sierra + CASM)
scarb build

出力先は target/dev/ です。

  • myproject_MyContract.contract_class.json(Sierra)
  • myproject_MyContract.compiled_contract_class.json(CASM)

アカウントのセットアップ

新しいアカウントを作成する
# Generate account on Sepolia
sncast account create \
    --url https://starknet-sepolia.g.alchemy.com/v2/YOUR_KEY \
    --name my-deployer

# This outputs the account address — fund it with ETH/STRK before deploying

# Deploy the account contract
sncast account deploy \
    --url https://starknet-sepolia.g.alchemy.com/v2/YOUR_KEY \
    --name my-deployer
既存のアカウントをインポートする
sncast account import \
    --url https://starknet-sepolia.g.alchemy.com/v2/YOUR_KEY \
    --name my-deployer \
    --address 0x123... \
    --private-key 0xabc... \
    --type oz

アカウントの種類:oz(OpenZeppelin)、argent、braavos

sncast.toml

フラグの繰り返しを避けるため、デフォルト値を設定します。

[default]
url = "https://starknet-sepolia.g.alchemy.com/v2/YOUR_KEY"
account = "my-deployer"
accounts-file = "~/.starknet_accounts/starknet_open_zeppelin_accounts.json"
wait = true

[mainnet]
url = "https://starknet-mainnet.g.alchemy.com/v2/YOUR_KEY"
account = "mainnet-deployer"

プロファイルを使用します:sncast --profile mainnet declare ...

宣言(クラスを登録)

デプロイする前に、コントラクトクラスをオンチェーンで宣言します。

# Declare contract
sncast declare \
    --contract-name MyContract

# Output:
# class_hash: 0x1234...
# transaction_hash: 0xabcd...

クラスがすでに宣言されている場合は、sncast が通知します。その場合は、既存のクラスハッシュを使用してください。

デプロイ(インスタンスを作成)

# Deploy with constructor args
sncast deploy \
    --class-hash 0x1234... \
    --constructor-calldata 0xOWNER_ADDRESS

# Multiple constructor args (space-separated)
sncast deploy \
    --class-hash 0x1234... \
    --constructor-calldata 0xOWNER 0xTOKEN_ADDRESS 1000
コンストラクターの calldata エンコード

引数は felt252 値として渡します。

  • ContractAddress — hex 0x123... として渡します
  • u256 — 2 つの felt として渡します:low high(例:1000 の場合は 1000 0)
  • felt252 — そのまま渡します
  • bool — true の場合は 1、false の場合は 0
  • ByteArray(文字列)— sncast の文字列エンコードを使用するか、生の値を渡します

Invoke(書き込み)

# Call a write function
sncast invoke \
    --contract-address 0xCONTRACT \
    --function "transfer" \
    --calldata 0xRECIPIENT 1000 0

Call(読み取り)

# Call a view function (free, no tx)
sncast call \
    --contract-address 0xCONTRACT \
    --function "get_balance" \
    --calldata 0xACCOUNT

プログラムによるデプロイ(starknet.js)

import { Account, CallData, Contract, RpcProvider } from "starknet";

const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC! });
const account = new Account(provider, process.env.ACCOUNT_ADDRESS!, process.env.PRIVATE_KEY!);

const declareTx = await account.declare({ contract: compiledSierra, casm: compiledCasm });
await provider.waitForTransaction(declareTx.transaction_hash);

const deployTx = await account.deploy({
  classHash: declareTx.class_hash,
  constructorCalldata: CallData.compile({ owner: process.env.OWNER! }),
});
await provider.waitForTransaction(deployTx.transaction_hash);

const contract = new Contract(abi, deployTx.contract_address[0], provider).connect(account);
await contract.invoke("set_fee", [10]);
const fee = await contract.call("get_fee", []);
console.log({ fee });

マルチコール

複数の呼び出しを 1 つのトランザクションで実行します。

# Create a multicall file
cat > multicall.toml << 'EOF'
[[call]]
call_type = "deploy"
class_hash = "0x1234..."
inputs = ["0xOWNER"]

[[call]]
call_type = "invoke"
contract_address = "0xTOKEN"
function = "approve"
inputs = ["0xSPENDER", "1000", "0"]
EOF

sncast multicall run --path multicall.toml

デプロイスクリプトのパターン

複雑なデプロイには、スクリプトを使用します。

#!/bin/bash
set -euo pipefail

RPC_URL="https://starknet-sepolia.g.alchemy.com/v2/YOUR_KEY"
ACCOUNT="my-deployer"

echo "Building..."
scarb build

echo "Declaring MyToken..."
TOKEN_CLASS=$(sncast --json declare --contract-name MyToken --url $RPC_URL --account $ACCOUNT | jq -r '.class_hash')
echo "Token class: $TOKEN_CLASS"

echo "Deploying MyToken..."
TOKEN_ADDR=$(sncast --json deploy --class-hash $TOKEN_CLASS --constructor-calldata 0xOWNER --url $RPC_URL --account $ACCOUNT | jq -r '.contract_address')
echo "Token deployed at: $TOKEN_ADDR"

echo "Declaring AMM..."
AMM_CLASS=$(sncast --json declare --contract-name AMM --url $RPC_URL --account $ACCOUNT | jq -r '.class_hash')

echo "Deploying AMM..."
AMM_ADDR=$(sncast --json deploy --class-hash $AMM_CLASS --constructor-calldata $TOKEN_ADDR --url $RPC_URL --account $ACCOUNT | jq -r '.contract_address')
echo "AMM deployed at: $AMM_ADDR"

echo "Done. Addresses:"
echo "  Token: $TOKEN_ADDR"
echo "  AMM:   $AMM_ADDR"

ネットワークエンドポイント

ネットワークRPC URL
Devnet(ローカル)http://localhost:5050
Sepolia(テストネット)https://starknet-sepolia.g.alchemy.com/v2/KEY
Mainnethttps://starknet-mainnet.g.alchemy.com/v2/KEY

その他のプロバイダー:Infura、Blast、Nethermind(無料プランを利用可能)。

ローカル Devnet
# Install and run starknet-devnet-rs
cargo install starknet-devnet
starknet-devnet --seed 42

# Devnet provides pre-funded accounts — use them for testing

コントラクトの検証

Voyager または Starkscan でソースコードを検証します。

# Verify on Voyager (manual: upload Sierra JSON via web UI)
# https://sepolia.voyager.online/contract/0xADDRESS#code

# Or use Walnut for programmatic verification
# https://app.walnut.dev

注: sncast verify は Walnut と Voyager の両バックエンドに対応しています。--verifier walnut または --verifier voyager を明示的に指定してください。

アップグレード可能なコントラクト

OZ UpgradeableComponent を使用するコントラクトの場合:

# 1. Declare new class
sncast declare --contract-name MyContractV2

# 2. Call upgrade on existing contract
sncast invoke \
    --contract-address 0xEXISTING_CONTRACT \
    --function "upgrade" \
    --calldata 0xNEW_CLASS_HASH

よくあるエラー

エラー原因解決方法
Contract not foundアカウントがデプロイされていないsncast account deploy を実行します
Insufficient max feeガス代に必要な ETH/STRK が不足しているデプロイヤーアカウントに資金を入れます
Class already declared同じクラスハッシュが存在するデプロイには既存のクラスハッシュを使用します
Entry point not found関数名が間違っているコントラクト ABI を確認します
Invalid calldata引数の数または型が間違っているコンストラクターのシグネチャを確認します。u256 は 2 つの felt であることに注意してください

コメント