This Smart Sessions setup is EVM-only.
createSession, its validator and
policies, and session signer selection do not apply to managed Solana
accounts. Swig’s allButManageAuthority permits spending and instructions;
it is not a restricted session with token budgets, call allowlists, or expiry.
See Solana support.Installing the validation
You can install the validator during account deployment: Examples on this page use@rhinestone/sdk, where rhinestone is the RhinestoneSDK instance from the custom signer quickstart.
source: { chain: base, token: feeTokenAddress }.
Creating sessions
To create a session, useRhinestoneSDK.createSession:
restrictToActions:
restrictToActions, the session retains the wildcard intent-execution fallback for calls approved by the Orchestrator’s intent target allowlist. See Restrict a session for the behavior and tradeoffs.
Keep saltMode: "strict" when creating a new restricted session. The SDK default, "none", uses a zero salt, so sessions with the same signer reuse a permission ID even when their actions differ. Enabling another definition under that ID adds its policies to the on-chain sets instead of replacing earlier grants. Strict mode gives different restricted definitions distinct permission IDs, but it does not invalidate any permission ID that the signer already controls. Revoke the previous broader session before relying on the signer to have narrower authority.
Permissions govern account calls, while cross-chain permits scope the session to the settlement routes of cross-chain intents. A session holding a permit is already scoped, and you can combine it with restrictToActions, permissions, and actions.
Finally, you can constrain function parameters. The SDK derives the selector and parameter offsets from the ABI, so you reference parameters by name:
Session access
Every created session reports whether its key is held to its own actions insession.access.kind:
Branch on
kind. session.access.reason is for people to read, and its wording may change.
Validate a definition
rhinestone.validateSession runs the same checks as createSession without creating, enabling, or signing anything. It lists every refusal instead of throwing the first one:
refusalsis empty exactly whencreateSessionsucceeds. The first refusal is the errorcreateSessionthrows.warningslists what the session accepts but does not enforce the way the definition may suggest.accessandsettlementCoveragedescribe the sessioncreateSessionwould return.
code, listed in SESSION_REFUSAL_CODES and SESSION_WARNING_CODES from @rhinestone/sdk/smart-sessions. Branch on codes, not messages. Refusals can also carry permitIndex, layer, chainId, and leg.
validateSession makes the same network reads as createSession, and network failures still throw. @rhinestone/sdk/smart-sessions also exports an offline validateSession and toSession. They make no network reads, so routes that depend on the served settlement catalog need it passed as settlement. Prefer the online methods.
Store the created session
createSession resolves the definition into a Session: its permissionId, salt, actions, erc7739Policies, compiled claimPolicies, and metadata. Persist that object with serialization that preserves bigint values, and pass the restored Session to getSessionDetails, signEnableSession, enableSession, disableSession, and session signers.
Never send a stored Session back through createSession, toSession, or validateSession. Rebuilding a session from its definition under a newer served catalog, clock, or SDK default can produce a different permissionId and enable digest. A new identity does not upgrade an installed grant: the old grant keeps its installed policies until you revoke it, so revoke or authorize a replacement deliberately.
Session.claimPolicies is compiled signing metadata; keep it. access and settlementCoverage can be absent on sessions stored by older SDK versions.
Next steps
Use a session
Enable the session on-chain and transact with it.
Session signing
Decide what the session key may sign off-chain.