Skip to content

Removing session keys

Removing session keys is done with the uninstallValidation method.

import { createModularAccountV2Client } from "@account-kit/smart-contracts";
import {
  installValidationActions,
  getDefaultSingleSignerValidationModuleAddress,
  SingleSignerValidationModule,
  modularAccountAbi,
} from "@account-kit/smart-contracts/experimental";
import { LocalAccountSigner } from "@aa-sdk/core";
import { sepolia, alchemy } from "@account-kit/infra";
import { generatePrivateKey } from "viem/accounts";
 
const client = (
  await createModularAccountV2Client({
    chain: sepolia,
    transport: alchemy({ apiKey: "your-api-key" }),
    signer: LocalAccountSigner.privateKeyToAccountSigner(generatePrivateKey()),
  })
).extend(installValidationActions);
 
let sessionKeyEntityId = 1;
 
// Removing a basic session key
await client.uninstallValidation({
  moduleAddress: getDefaultSingleSignerValidationModuleAddress(client.chain),
  entityId: sessionKeyEntityId,
  uninstallData: SingleSignerValidationModule.encodeOnUninstallData({
    entityId: sessionKeyEntityId,
  }),
  hookUninstallDatas: [],
});
 
// Removing a session key with hooks
await client.uninstallValidation({
  moduleAddress: getDefaultSingleSignerValidationModuleAddress(client.chain),
  entityId: sessionKeyEntityId,
  uninstallData: SingleSignerValidationModule.encodeOnUninstallData({
    entityId: sessionKeyEntityId,
  }),
  hookUninstallDatas: [],
});

If there are hooks on the validation, you have to provide the hook uninstallation data to uninstall them too. Each module provides an encodeOnUninstallData helper function to generate the uninstallation hook for that module.

import { createModularAccountV2Client } from "@account-kit/smart-contracts";
import {
  installValidationActions,
  getDefaultSingleSignerValidationModuleAddress,
  SingleSignerValidationModule,
  modularAccountAbi,
  AllowlistModule,
} from "@account-kit/smart-contracts/experimental";
import { LocalAccountSigner } from "@aa-sdk/core";
import { sepolia, alchemy } from "@account-kit/infra";
import { generatePrivateKey } from "viem/accounts";
 
const client = (
  await createModularAccountV2Client({
    chain: sepolia,
    transport: alchemy({ apiKey: "your-api-key" }),
    signer: LocalAccountSigner.privateKeyToAccountSigner(generatePrivateKey()),
  })
).extend(installValidationActions);
 
let sessionKeyEntityId = 1;
 
// Removing a basic session key
await client.uninstallValidation({
  moduleAddress: getDefaultSingleSignerValidationModuleAddress(client.chain),
  entityId: sessionKeyEntityId,
  uninstallData: SingleSignerValidationModule.encodeOnUninstallData({
    entityId: sessionKeyEntityId,
  }),
  hookUninstallDatas: [],
});
 
const hookEntityId = 1;
const target = "0xd8da6bf26964af9d7eed9e03e53415d37aa96045";
 
// Removing a session key with an allowlist hook
await client.uninstallValidation({
  moduleAddress: getDefaultSingleSignerValidationModuleAddress(client.chain),
  entityId: sessionKeyEntityId,
  uninstallData: SingleSignerValidationModule.encodeOnUninstallData({
    entityId: sessionKeyEntityId,
  }),
  hookUninstallDatas: [
    AllowlistModule.encodeOnUninstallData({
      entityId: hookEntityId,
      inputs: [
        {
          target,
          hasSelectorAllowlist: false,
          hasERC20SpendLimit: false,
          erc20SpendLimit: 0n,
          selectors: [],
        },
      ],
    }),
  ],
});