重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
controller-sessions by cartridge-gg/docs
npx skills add https://github.com/cartridge-gg/docs --skill controller-sessions会话策略定义了你的应用可以调用哪些合约和方法。对于基于会话的交易执行来说,它们是必需的——如果没有策略,execute() 将会失败并返回错误码 130("数组长度不匹配"),因为 Controller 的链上会话验证要求为每次调用提供默克尔证明。
如果没有策略,Controller 会回退到通过密钥链模态窗口进行手动批准。在本地 Katana 上,策略是必需的,因为没有策略就无法正确部署新的 Controller 账户。
import { SessionPolicies } from "@cartridge/controller";
const policies: SessionPolicies = {
contracts: {
"0x1234...": {
name: "我的游戏",
description: "游戏合约交互",
methods: [
{
name: "移动玩家",
entrypoint: "move_player",
description: "在地图上移动玩家",
},
{
name: "攻击",
entrypoint: "attack",
},
],
},
},
};
const controller = new Controller({ policies });
对于 approve 方法,以十六进制格式指定支出限额:
const policies: SessionPolicies = {
contracts: {
// ETH 合约
"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7": {
name: "以太坊",
methods: [
{
name: "批准",
entrypoint: "approve",
spender: "0x1234567890abcdef1234567890abcdef12345678",
amount: "0x3", // 限额:3 ETH(十六进制,已考虑小数位)
},
],
},
},
};
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
0xffffffffffffffffffffffffffffffff 表示无限制(最大 uint128)预批准类型化消息签名:
const policies: SessionPolicies = {
messages: [
{
name: "游戏消息",
types: {
StarknetDomain: [
{ name: "name", type: "shortstring" },
{ name: "version", type: "shortstring" },
{ name: "chainId", type: "shortstring" },
{ name: "revision", type: "shortstring" },
],
GameMessage: [
{ name: "content", type: "string" },
{ name: "timestamp", type: "felt" },
],
},
primaryType: "GameMessage",
domain: {
name: "MyGame",
version: "1",
chainId: "SN_MAIN",
revision: "1",
},
},
],
};
const controller = new Controller({
policies,
errorDisplayMode: "notification", // "modal" | "notification" | "silent"
});
propagateSessionErrors | errorDisplayMode | 行为 |
|---|---|---|
true | 任意 | 错误立即被拒绝,不显示 UI |
false(默认) | modal | 打开 controller 模态窗口 |
false | notification | 显示可点击的 toast 通知 |
false | silent | 不显示 UI,记录到控制台 |
将错误返回给你的应用,而不是显示密钥链 UI:
import { Controller, ResponseCodes } from "@cartridge/controller";
const controller = new Controller({
policies,
propagateSessionErrors: true,
});
const result = await account.execute(calls);
if (result.code === ResponseCodes.SUCCESS) {
console.log("交易哈希:", result.transaction_hash);
} else if (result.code === ResponseCodes.ERROR) {
console.error(result.message, result.error);
}
注意:无论设置如何,SessionRefreshRequired 和 ManualExecutionRequired 总是会显示模态窗口。
适用于移动应用和跨平台登出流程:
const connector = new SessionConnector({
policies,
rpc: "https://api.cartridge.gg/x/starknet/mainnet",
chainId: "SN_MAIN",
redirectUrl: "myapp://callback",
disconnectRedirectUrl: "myapp://logout", // 登出后跳转的地址
});
已验证的策略会显示信任徽章和简化的批准流程。请将配置提交到 @cartridge/presets 进行验证。
type SessionOptions = {
rpc: string; // RPC 端点 URL
chainId: string; // 链 ID
policies: SessionPolicies; // 已批准的交易策略
redirectUrl: string; // 认证后重定向的 URL
disconnectRedirectUrl?: string; // 登出后重定向的 URL
signupOptions?: AuthOptions; // 要显示的认证方法
};
每周安装量
63
代码仓库
GitHub 星标
4
首次出现
2026年2月4日
安全审计
安装于
codex60
opencode60
github-copilot58
kimi-cli57
gemini-cli57
amp57
Session policies define which contracts and methods your app can call. They are required for session-based transaction execution — without policies, execute() will fail with error code 130 ("Array length mismatch") because the Controller's on-chain session validation requires a merkle proof for each call.
Without policies, Controller falls back to manual approval via the keychain modal. On local Katana, policies are required because new Controller accounts cannot be properly deployed without them.
import { SessionPolicies } from "@cartridge/controller";
const policies: SessionPolicies = {
contracts: {
"0x1234...": {
name: "My Game",
description: "Game contract interactions",
methods: [
{
name: "Move Player",
entrypoint: "move_player",
description: "Move player on the map",
},
{
name: "Attack",
entrypoint: "attack",
},
],
},
},
};
const controller = new Controller({ policies });
For approve methods, specify spending limits in hex format:
const policies: SessionPolicies = {
contracts: {
// ETH contract
"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7": {
name: "Ethereum",
methods: [
{
name: "approve",
entrypoint: "approve",
spender: "0x1234567890abcdef1234567890abcdef12345678",
amount: "0x3", // Limit: 3 ETH (hex, accounts for decimals)
},
],
},
},
};
0xffffffffffffffffffffffffffffffff for unlimited (max uint128)Pre-approve typed message signing:
const policies: SessionPolicies = {
messages: [
{
name: "Game Message",
types: {
StarknetDomain: [
{ name: "name", type: "shortstring" },
{ name: "version", type: "shortstring" },
{ name: "chainId", type: "shortstring" },
{ name: "revision", type: "shortstring" },
],
GameMessage: [
{ name: "content", type: "string" },
{ name: "timestamp", type: "felt" },
],
},
primaryType: "GameMessage",
domain: {
name: "MyGame",
version: "1",
chainId: "SN_MAIN",
revision: "1",
},
},
],
};
const controller = new Controller({
policies,
errorDisplayMode: "notification", // "modal" | "notification" | "silent"
});
propagateSessionErrors | errorDisplayMode | Behavior |
|---|---|---|
true | Any | Errors rejected immediately, no UI shown |
false (default) | modal | Opens controller modal |
false | notification | Shows clickable toast |
Return errors to your app instead of showing keychain UI:
import { Controller, ResponseCodes } from "@cartridge/controller";
const controller = new Controller({
policies,
propagateSessionErrors: true,
});
const result = await account.execute(calls);
if (result.code === ResponseCodes.SUCCESS) {
console.log("Tx hash:", result.transaction_hash);
} else if (result.code === ResponseCodes.ERROR) {
console.error(result.message, result.error);
}
Note : SessionRefreshRequired and ManualExecutionRequired always show modal regardless of settings.
For mobile apps and cross-platform logout flows:
const connector = new SessionConnector({
policies,
rpc: "https://api.cartridge.gg/x/starknet/mainnet",
chainId: "SN_MAIN",
redirectUrl: "myapp://callback",
disconnectRedirectUrl: "myapp://logout", // Where to go after logout
});
Verified policies display trust badges and streamlined approval flows. Submit configs to @cartridge/presets for verification.
type SessionOptions = {
rpc: string; // RPC endpoint URL
chainId: string; // Chain ID
policies: SessionPolicies; // Approved transaction policies
redirectUrl: string; // URL to redirect after auth
disconnectRedirectUrl?: string; // URL to redirect after logout
signupOptions?: AuthOptions; // Auth methods to show
};
Weekly Installs
63
Repository
GitHub Stars
4
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
codex60
opencode60
github-copilot58
kimi-cli57
gemini-cli57
amp57
Azure RBAC 权限管理工具:查找最小角色、创建自定义角色与自动化分配
154,300 周安装
Spring Boot开发指南:快速构建Java应用,自动配置与REST API实战
92 周安装
shadcn/ui 设置工具:一键配置 Tailwind CSS v4 与 shadcn/ui 集成
89 周安装
Cursor子代理创建器:AI代理开发与多步骤工作流自动化专家指南
90 周安装
YouTube Data API v3 使用指南:搜索视频、获取详情、频道信息和评论
89 周安装
.NET跨平台UI开发指南:Blazor、MAUI、Uno、WPF、WinUI、WinForms全栈教程
90 周安装
销售负责人技能指南:B2B销售战略、团队建设与管道管理全解析
91 周安装
false | silent | No UI, logged to console |