CyberAccount Plugins
CyberAccount Plugins is a collection of plugins that can be used to extend the functionality of CyberAccount.
Installation
npm install @cyberlab/cyber-account-plugins permissionlessSession Key Plugin
Session Key plugin is used to generate a session key account for CyberAccount. With specific permission controls, session key accounts can be used to send transactions without the need of the signer confirmation.
Setup
Before creating a session key account, you need to prepare the following:
signer: The signer of CyberAccountcyberAccount: a CyberAccount instancesessionKeySigner: The signer of the session key accountvalidatorData: The permission data of the session key account
Signer
@cyberlab/cyber-account-plugins relies on permissionless.js to get the smart account signer, it provides two utility functions:
walletClientToSmartAccountSignerproviderToSmartAccountSigner
You can find more information about permissionless.js here
Here we'll use providerToSmartAccountSigner to get a signer from a provider.
import { providerToSmartAccountSigner } from "permissionless"
 
const smartAccountSigner = await providerToSmartAccountSigner(window.ethereum)CyberAccount
Create a CyberAccount instance following the CyberAccount documentation.
const cyberAccount = new CyberAccount(...)Session Key Signer
Use a local private key from viem to create a session key signer.
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
 
const sessionPrivateKey = generatePrivateKey();
const sessionKeySigner = privateKeyToAccount(sessionPrivateKey);Validator Data
The validatorData is used to define the permissions of the session key account. It contains the following fields:
validUntilvalidAfterpaymaster(supported soon)permissions
Here we'll use set a permission to allow the session key account to mint an NFT to the CyberAccount address.
Contract Infoconst contractAddress = "0x34bE7f35132E97915633BC1fc020364EA5134863";
 
const contractABI = parseAbi([
  "function mint(address _to) public",
  "function balanceOf(address owner) external view returns (uint256 balance)",
]);Set Permissions
Operator has the following values:
EQUALGREATER_THANLESS_THANGREATER_THAN_OR_EQUALLESS_THAN_OR_EQUALNOT_EQUAL
import { Operator } from "@cyberlab/cyber-account-plugins"
 
const validatorData = {
  permissions: [
    {
      target: contractAddress,
      valueLimit: BigInt(0),
      abi: contractABI,
      functionName: "mint",
      args: [
        {
          operator: Operator.EQUAL,
          value: cyberAccount.address,
        },
      ],
    },
  ],
}Create Session Key Account
import { createSessionKeyAccount } from "@cyberlab/cyber-account-plugins";
 
const sessionKeyAccount = await createSessionKeyAccount({
  signer: smartAccountSigner,
  cyberAccount,
  sessionKeySigner,
  validatorData,
});Create Session Key Account Client
Before sending transactions with the session key account, you need to create a session key account client.
import { createSessionKeyAccountClient } from "@cyberlab/cyber-account-plugins";
 
const sessionKeyAccountClient = await createSessionKeyAccountClient(
  sessionKeyAccount,
  cyberAccount,
);Send Transaction
const txHash = await sessionKeyAccountClient.sendTransaction({
  to: contractAddress,
  value: BigInt(0),
  data: encodeFunctionData({
    abi: contractABI,
    functionName: "mint",
    args: [cyberAccount.address],
  }),
});Serialize Session Key Account
You can use serializeSessionKeyAccount to serialize the session key account. This will produce a JWT-like string that can be used to recreate the session key account by using deserializeSessionKeyAccount.
 
import { serializeSessionKeyAccount } from "@cyberlab/cyber-account-plugins";
 
 const serializedAccount = await serializeSessionKeyAccount(
   sessionKeyAccount,
   sessionPrivateKey, // the private key that was created at the Session Key Signer step
 );Deserialize Session Key Account
You can use deserializeSessionKeyAccount to deserialize the session key account. This will produce a session key account object that can be used to create the session key account client.
import { deserializeSessionKeyAccount } from "@cyberlab/cyber-account-plugins";
 
const sessionKeyAccount = await deserializeSessionKeyAccount(
    cyberAccount.publicClient,
    serializedAccount
);Full Example
You can find the full example here.