重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
controller-setup by cartridge-gg/docs
npx skills add https://github.com/cartridge-gg/docs --skill controller-setupCartridge Controller 是一款专注于游戏的 Starknet 智能合约钱包,支持会话密钥、通行密钥和支付主。
# 基础控制器使用
pnpm add @cartridge/controller starknet
# 包含框架连接器(React,原生应用)
pnpm add @cartridge/controller @cartridge/connector starknet
import Controller from "@cartridge/controller";
const controller = new Controller();
const account = await controller.connect();
// 准备执行交易
基于会话的交易执行必须使用会话策略。如果没有策略,execute() 会失败并返回错误码 130,因为控制器的会话验证需要为每次调用提供默克尔证明。
如果没有策略,控制器将回退到通过托管的密钥链模态框进行手动批准。在本地 Katana 上,策略是必需的,因为没有策略,新的控制器账户将无法正确部署。
| 使用场景 | 连接器 | 关键区别 |
|---|---|---|
| 使用 starknet-react 的 Web 应用 | ControllerConnector |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 密钥通过浏览器 Cookie 和 localStorage 管理 |
| 原生/移动应用 | SessionConnector | 应用生成本地密钥对,通过浏览器重定向进行认证 |
import { ControllerConnector } from "@cartridge/connector";
const connector = new ControllerConnector({
policies, // 会话策略(基于会话的执行所必需)
signupOptions, // 可选:要显示的身份验证方法
});
import { SessionConnector } from "@cartridge/connector";
import { constants } from "starknet";
const connector = new SessionConnector({
policies,
rpc: "https://api.cartridge.gg/x/starknet/mainnet",
chainId: constants.StarknetChainId.SN_MAIN,
redirectUrl: "myapp://auth-callback",
disconnectRedirectUrl: "myapp://logout", // 可选:登出重定向 URL
signupOptions: ["webauthn", "google"], // 可选:身份验证方法
});
会话流程:应用生成密钥对 → 用户在浏览器中认证 → 浏览器重定向回应用 → 应用本地签署交易。
提供了默认的 RPC 端点。可以使用自定义链覆盖:
import { constants } from "starknet";
const controller = new Controller({
chains: [
{ rpcUrl: "https://api.cartridge.gg/x/starknet/mainnet" },
{ rpcUrl: "https://api.cartridge.gg/x/starknet/sepolia" },
{ rpcUrl: "http://localhost:5050" }, // 本地 Katana
],
defaultChainId: constants.StarknetChainId.SN_MAIN,
});
当在本地 Katana 实例上使用 Controller 时,Katana 配置必须在创世时部署 Controller 合约。否则,交易将失败并提示“请求的合约地址 ... 未部署”。
必需的 katana.toml 配置:
[dev]
dev = true
no_fee = true
[cartridge]
paymaster = true # 启用支付主,并在创世时部署 Controller 合约
[server]
http_cors_origins = "*"
注意:paymaster = true 隐式启用了 controllers = true。
使用配置启动 Katana:
katana --config katana.toml
查看 Katana 配置指南 了解所有 TOML 选项。
延迟挂载 iframe 直到调用 connect():
const controller = new Controller({
lazyload: true,
});
type ControllerOptions = {
chains?: Chain[]; // 自定义 RPC 端点
defaultChainId?: string; // 默认链(十六进制编码)
policies?: SessionPolicies; // 会话策略
propagateSessionErrors?: boolean; // 将错误返回给调用者
errorDisplayMode?: "modal" | "notification" | "silent";
lazyload?: boolean; // 延迟挂载 iframe
preset?: string; // 主题预设名称
signupOptions?: AuthOptions; // 要显示的身份验证方法
};
{
"@cartridge/connector": "0.11.3-alpha.1",
"@cartridge/controller": "0.11.3-alpha.1",
"@starknet-react/core": "^5.0.1",
"@starknet-react/chains": "^5.0.1",
"starknet": "^8.1.2"
}
需要 Cookie:Controller 会设置初始化所需的基本 Cookie。
开发环境需要 HTTPS:使用 vite-plugin-mkcert 在本地启用 HTTPS。
在组件外创建连接器:在 React 组件外部创建 ControllerConnector,以避免在重新渲染时重新创建。
每周安装量
52
代码仓库
GitHub 星标数
4
首次出现
2026年2月4日
安全审计
安装于
opencode50
codex49
github-copilot48
kimi-cli47
gemini-cli47
amp47
Cartridge Controller is a gaming-focused smart contract wallet for Starknet with session keys, passkeys, and paymaster support.
# Basic Controller usage
pnpm add @cartridge/controller starknet
# With framework connectors (React, native apps)
pnpm add @cartridge/controller @cartridge/connector starknet
import Controller from "@cartridge/controller";
const controller = new Controller();
const account = await controller.connect();
// Ready to execute transactions
Session policies are required for session-based transaction execution. Without policies, execute() fails with error code 130 because the Controller's session validation needs a merkle proof per call.
Without policies, Controller falls back to manual approval via the hosted keychain modal. On local Katana, policies are required because new Controller accounts cannot be properly deployed without them.
| Use Case | Connector | Key Difference |
|---|---|---|
| Web apps with starknet-react | ControllerConnector | Keys managed via browser cookies & localStorage |
| Native/mobile apps | SessionConnector | App generates local keypair, authenticates via browser redirect |
import { ControllerConnector } from "@cartridge/connector";
const connector = new ControllerConnector({
policies, // Session policies (required for session-based execution)
signupOptions, // Optional auth methods to show
});
import { SessionConnector } from "@cartridge/connector";
import { constants } from "starknet";
const connector = new SessionConnector({
policies,
rpc: "https://api.cartridge.gg/x/starknet/mainnet",
chainId: constants.StarknetChainId.SN_MAIN,
redirectUrl: "myapp://auth-callback",
disconnectRedirectUrl: "myapp://logout", // Optional logout redirect
signupOptions: ["webauthn", "google"], // Optional auth methods
});
Session flow : App generates keypair → User authenticates in browser → Browser redirects back → App signs transactions locally.
Default RPC endpoints are provided. Override with custom chains:
import { constants } from "starknet";
const controller = new Controller({
chains: [
{ rpcUrl: "https://api.cartridge.gg/x/starknet/mainnet" },
{ rpcUrl: "https://api.cartridge.gg/x/starknet/sepolia" },
{ rpcUrl: "http://localhost:5050" }, // Local Katana
],
defaultChainId: constants.StarknetChainId.SN_MAIN,
});
When using Controller with a local Katana instance, the Katana config must deploy Controller contracts at genesis. Without this, transactions fail with "Requested contract address ... is not deployed".
Requiredkatana.toml config:
[dev]
dev = true
no_fee = true
[cartridge]
paymaster = true # Enables paymaster AND deploys Controller contracts at genesis
[server]
http_cors_origins = "*"
Note: paymaster = true implicitly enables controllers = true.
Start Katana with config:
katana --config katana.toml
See the Katana configuration guide for all TOML options.
Defer iframe mounting until connect() is called:
const controller = new Controller({
lazyload: true,
});
type ControllerOptions = {
chains?: Chain[]; // Custom RPC endpoints
defaultChainId?: string; // Default chain (hex encoded)
policies?: SessionPolicies; // Session policies
propagateSessionErrors?: boolean; // Return errors to caller
errorDisplayMode?: "modal" | "notification" | "silent";
lazyload?: boolean; // Defer iframe mount
preset?: string; // Theme preset name
signupOptions?: AuthOptions; // Auth methods to show
};
{
"@cartridge/connector": "0.11.3-alpha.1",
"@cartridge/controller": "0.11.3-alpha.1",
"@starknet-react/core": "^5.0.1",
"@starknet-react/chains": "^5.0.1",
"starknet": "^8.1.2"
}
Cookies required : Controller sets essential cookies for initialization.
HTTPS required in dev : Use vite-plugin-mkcert for local HTTPS.
Connector outside components : Create ControllerConnector outside React components to avoid recreation on re-render.
Weekly Installs
52
Repository
GitHub Stars
4
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode50
codex49
github-copilot48
kimi-cli47
gemini-cli47
amp47
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
123,700 周安装