Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cartridge-gg avatar

Controller Sessions

  • 69 installs
  • 4 repo stars
  • Updated August 1, 2026
  • cartridge-gg/docs

Configure Cartridge Controller session keys and policies for gasless, pre-approved Starknet transactions with spending limits.

About

Guides configuring session keys and policies for Cartridge Controller to enable gasless, pre-approved transactions. A developer uses it to define contract interaction policies, spending limits, and session error handling.

  • Defines SessionPolicies for gasless, pre-approved Starknet transactions
  • Covers spending limits, verified sessions, and error handling

Controller Sessions by the numbers

  • 69 all-time installs (skills.sh)
  • Ranked #182 of 480 Web3 & Blockchain skills by installs in the Skillselion catalog
  • Data as of Aug 1, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cartridge-gg/docs --skill controller-sessions

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs69
repo stars4
Last updatedAugust 1, 2026
Repositorycartridge-gg/docs

What it does

Configure Cartridge Controller session keys and policies for gasless, pre-approved Starknet transactions with spending limits.

Files

SKILL.mdMarkdownGitHub ↗

Controller Sessions & Policies

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.

How Sessions Work

1. Define policies (which contracts/methods your app needs) 2. User approves policies once during connection 3. Controller creates session with approved permissions 4. Transactions execute seamlessly via Paymaster

Defining Policies

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 });

Token Spending Limits

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)
        },
      ],
    },
  },
};
  • Use 0xffffffffffffffffffffffffffffffff for unlimited (max uint128)
  • Users see USD values alongside token amounts when price data is available

Signed Message Policies

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",
      },
    },
  ],
};

Error Handling

Error Display Modes

const controller = new Controller({
  policies,
  errorDisplayMode: "notification", // "modal" | "notification" | "silent"
});
  • modal (default): Full error modal, blocks interaction
  • notification: Toast notification (clickable to open modal), non-blocking
  • silent: Console only, custom handling required

Error Handling Interaction

propagateSessionErrorserrorDisplayModeBehavior
trueAnyErrors rejected immediately, no UI shown
false (default)modalOpens controller modal
falsenotificationShows clickable toast
falsesilentNo UI, logged to console

Error Propagation

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.

Disconnect Redirect

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 Sessions

Verified policies display trust badges and streamlined approval flows. Submit configs to `@cartridge/presets` for verification.

SessionOptions Type

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
};

Related skills

Web3 & Blockchainintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.