@smartagentkit/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/index.d.mts +743 -0
- package/dist/index.d.ts +743 -0
- package/dist/index.js +1354 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1312 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/presets.ts","../src/constants.ts","../src/policies.ts","../src/errors.ts","../src/deployments/base-sepolia.json","../src/deployments/sepolia.json","../src/deployments.ts","../src/sessions.ts"],"sourcesContent":["import {\n createPublicClient,\n createWalletClient,\n http,\n encodeFunctionData,\n type Address,\n type Hex,\n type PublicClient,\n type Hash,\n} from \"viem\";\nimport {\n privateKeyToAccount,\n mnemonicToAccount,\n generatePrivateKey,\n} from \"viem/accounts\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\nimport {\n createSmartAccountClient,\n type SmartAccountClient,\n} from \"permissionless/clients\";\nimport { erc7579Actions } from \"permissionless/actions/erc7579\";\nimport { getHookMultiPlexer } from \"@rhinestone/module-sdk\";\n\nimport type {\n SmartAgentKitConfig,\n AgentWallet,\n CreateWalletParams,\n PolicyConfig,\n ModuleAddresses,\n CreateSessionParams,\n ExecuteParams,\n ExecuteBatchParams,\n InstalledPolicy,\n ActiveSession,\n SignerKey,\n ISmartAgentKitClient,\n} from \"./types.js\";\nimport { PRESETS } from \"./presets.js\";\nimport {\n encodeSpendingLimitInitData,\n encodeAllowlistInitData,\n encodeEmergencyPauseInitData,\n} from \"./policies.js\";\nimport {\n ENTRYPOINT_V07,\n SAFE_7579_MODULE,\n SAFE_7579_LAUNCHPAD,\n RHINESTONE_ATTESTER,\n ATTESTERS_THRESHOLD,\n HOOK_MULTIPLEXER_ADDRESS,\n HOOK_TYPE_GLOBAL,\n MODULE_ONINSTALL_ABI,\n SET_TRUSTED_FORWARDER_ABI,\n HOOK_MULTIPLEXER_ABI,\n SPENDING_LIMIT_HOOK_ABI,\n EMERGENCY_PAUSE_HOOK_ABI,\n} from \"./constants.js\";\nimport { DEPLOYMENTS } from \"./deployments.js\";\nimport {\n WalletCreationError,\n ExecutionError,\n PolicyConfigError,\n SessionError,\n} from \"./errors.js\";\nimport {\n buildSession,\n getSmartSessionsModule,\n computePermissionId,\n getEnableDetails,\n encodeUseSessionSignature,\n encodeEnableSessionSignature,\n getRemoveAction,\n} from \"./sessions.js\";\n\n// ─── Internal Types ──────────────────────────────────────────────\n\n/** Extended SmartAccountClient with ERC-7579 actions */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Erc7579SmartAccountClient = SmartAccountClient<any, any, any> & {\n installModule: (args: {\n type: \"validator\" | \"executor\" | \"fallback\" | \"hook\";\n address: Address;\n context: Hex;\n }) => Promise<Hash>;\n isModuleInstalled: (args: {\n type: \"validator\" | \"executor\" | \"fallback\" | \"hook\";\n address: Address;\n context: Hex;\n }) => Promise<boolean>;\n};\n\n/** Resolve a SignerKey to a viem LocalAccount */\nfunction resolveAccount(key: SignerKey) {\n if (typeof key === \"string\") {\n return privateKeyToAccount(key as Hex);\n }\n return mnemonicToAccount(key.mnemonic, {\n addressIndex: key.addressIndex ?? 0,\n });\n}\n\n/**\n * Main client for SmartAgentKit — deploy and manage policy-governed\n * smart wallets for AI agents.\n *\n * @example\n * ```ts\n * import { SmartAgentKitClient } from \"@smartagentkit/sdk\";\n * import { baseSepolia } from \"viem/chains\";\n *\n * const client = new SmartAgentKitClient({\n * chain: baseSepolia,\n * rpcUrl: \"https://base-sepolia.g.alchemy.com/v2/...\",\n * bundlerUrl: \"https://api.pimlico.io/v2/base-sepolia/rpc?apikey=...\",\n * moduleAddresses: {\n * spendingLimitHook: \"0x...\",\n * allowlistHook: \"0x...\",\n * emergencyPauseHook: \"0x...\",\n * },\n * });\n *\n * const wallet = await client.createWallet({\n * owner: \"0x...\",\n * ownerPrivateKey: \"0x...\",\n * preset: \"defi-trader\",\n * });\n * ```\n */\n/** Stored metadata for an enabled session */\ninterface SessionMetadata {\n permissionId: Hex;\n sessionKeyAddress: Address;\n sessionKeyPrivateKey: Hex;\n expiresAt: number;\n actions: { target: Address; selector: Hex }[];\n}\n\nexport class SmartAgentKitClient implements ISmartAgentKitClient {\n private config: SmartAgentKitConfig;\n private publicClient: PublicClient;\n private walletClients: Map<Address, Erc7579SmartAccountClient>;\n private sessions: Map<Address, SessionMetadata[]>;\n\n constructor(config: SmartAgentKitConfig) {\n // Auto-resolve module addresses from built-in deployments if not provided\n if (!config.moduleAddresses) {\n const builtIn = DEPLOYMENTS[config.chain.id];\n if (builtIn) {\n config = { ...config, moduleAddresses: builtIn };\n }\n }\n\n this.config = config;\n this.publicClient = createPublicClient({\n chain: config.chain,\n transport: http(config.rpcUrl),\n });\n this.walletClients = new Map();\n this.sessions = new Map();\n }\n\n // ─── Wallet Creation ──────────────────────────────────────────\n\n /**\n * Deploy a new policy-governed smart wallet for an AI agent.\n *\n * The wallet is a Safe smart account with ERC-7579 modules. A\n * HookMultiPlexer is installed as the single hook, and sub-hooks\n * (SpendingLimit, Allowlist, EmergencyPause) are routed through it.\n *\n * The deployment and policy initialization happen atomically in\n * the first UserOperation.\n */\n async createWallet(params: CreateWalletParams): Promise<AgentWallet> {\n try {\n // 1. Resolve policies from preset or explicit config\n const policies = this.resolvePolicies(params);\n\n // 2. Require module addresses if policies are configured\n const moduleAddresses = this.requireModuleAddresses(policies);\n\n // 3. Create owner account from private key or mnemonic\n if (!params.ownerPrivateKey && !params.ownerMnemonic) {\n throw new WalletCreationError(\n \"Provide either ownerPrivateKey or ownerMnemonic\",\n );\n }\n const ownerKey: SignerKey = params.ownerMnemonic\n ? { mnemonic: params.ownerMnemonic, addressIndex: params.addressIndex }\n : (params.ownerPrivateKey as Hex);\n const ownerAccount = resolveAccount(ownerKey);\n\n // Validate owner address matches derived key\n if (ownerAccount.address.toLowerCase() !== params.owner.toLowerCase()) {\n throw new WalletCreationError(\n `Owner address mismatch: key derives ${ownerAccount.address} but params.owner is ${params.owner}`,\n );\n }\n\n // 4. Create HookMultiPlexer with EMPTY sub-hooks.\n // Sub-hooks are added in the first UserOp after deployment,\n // because they need separate onInstall initialization.\n const hookModule = getHookMultiPlexer({\n globalHooks: [],\n valueHooks: [],\n delegatecallHooks: [],\n sigHooks: [],\n targetHooks: [],\n });\n\n // 5. Create Safe smart account with ERC-7579 launchpad\n const safeAccount = await toSafeSmartAccount({\n client: this.publicClient,\n owners: [ownerAccount],\n version: \"1.4.1\",\n entryPoint: {\n address: ENTRYPOINT_V07,\n version: \"0.7\",\n },\n safe4337ModuleAddress: SAFE_7579_MODULE,\n erc7579LaunchpadAddress: SAFE_7579_LAUNCHPAD,\n hooks: [\n {\n address: hookModule.address,\n context: hookModule.initData,\n },\n ],\n attesters: [RHINESTONE_ATTESTER],\n attestersThreshold: ATTESTERS_THRESHOLD,\n saltNonce: params.salt ?? 0n,\n });\n\n // 6. Create SmartAccountClient with ERC-7579 actions\n const smartAccountClient = createSmartAccountClient({\n account: safeAccount,\n chain: this.config.chain,\n bundlerTransport: http(this.config.bundlerUrl),\n client: this.publicClient,\n }).extend(erc7579Actions()) as unknown as Erc7579SmartAccountClient;\n\n // 7. Store client for future execute/query calls\n this.walletClients.set(safeAccount.address, smartAccountClient);\n\n // 8. Initialize policies in the first UserOp (also deploys the Safe)\n if (policies.length > 0 && moduleAddresses) {\n await this.initializePolicies(\n smartAccountClient,\n policies,\n moduleAddresses,\n hookModule.address,\n );\n }\n\n return {\n address: safeAccount.address,\n owner: params.owner,\n chain: this.config.chain,\n isDeployed: policies.length > 0, // Deployed if first UserOp was sent\n policies: this.mapPoliciesToInstalled(policies, moduleAddresses),\n sessions: [],\n };\n } catch (error) {\n if (error instanceof WalletCreationError) throw error;\n throw new WalletCreationError(\n error instanceof Error ? error.message : String(error),\n error,\n );\n }\n }\n\n /**\n * Reconnect to an existing wallet for executing transactions.\n * Accepts a private key or mnemonic credential.\n */\n async connectWallet(\n walletAddress: Address,\n ownerKey: SignerKey,\n ): Promise<void> {\n const ownerAccount = resolveAccount(ownerKey);\n\n const safeAccount = await toSafeSmartAccount({\n client: this.publicClient,\n owners: [ownerAccount],\n version: \"1.4.1\",\n entryPoint: {\n address: ENTRYPOINT_V07,\n version: \"0.7\",\n },\n safe4337ModuleAddress: SAFE_7579_MODULE,\n erc7579LaunchpadAddress: SAFE_7579_LAUNCHPAD,\n address: walletAddress,\n attesters: [RHINESTONE_ATTESTER],\n attestersThreshold: ATTESTERS_THRESHOLD,\n });\n\n const smartAccountClient = createSmartAccountClient({\n account: safeAccount,\n chain: this.config.chain,\n bundlerTransport: http(this.config.bundlerUrl),\n client: this.publicClient,\n }).extend(erc7579Actions()) as unknown as Erc7579SmartAccountClient;\n\n this.walletClients.set(walletAddress, smartAccountClient);\n }\n\n async predictAddress(_owner: Address, _salt?: bigint): Promise<Address> {\n // TODO: Sprint 3 — compute counterfactual address without deploying\n throw new Error(\"Not yet implemented — Sprint 3\");\n }\n\n // ─── Policy Management ────────────────────────────────────────\n\n async addPolicy(\n _wallet: AgentWallet,\n _policy: PolicyConfig,\n _ownerPrivateKey: Hex,\n ): Promise<void> {\n throw new Error(\"Not yet implemented — Sprint 3\");\n }\n\n async removePolicy(\n _wallet: AgentWallet,\n _moduleAddress: Address,\n _ownerPrivateKey: Hex,\n ): Promise<void> {\n throw new Error(\"Not yet implemented — Sprint 3\");\n }\n\n async getPolicies(_walletAddress: Address): Promise<InstalledPolicy[]> {\n throw new Error(\"Not yet implemented — Sprint 3\");\n }\n\n // ─── Session Key Management ───────────────────────────────────\n\n /**\n * Create a session key for an AI agent.\n *\n * Generates a new ECDSA key pair and enables it as a session key on\n * the smart account via Smart Sessions. The session is scoped to\n * specific target contracts, function selectors, and time window.\n *\n * @returns The session key address, private key, and permission ID.\n */\n async createSession(\n wallet: AgentWallet,\n params: CreateSessionParams,\n ownerKey: SignerKey,\n ): Promise<{ sessionKey: Address; privateKey: Hex; permissionId: Hex }> {\n const client = this.getWalletClient(wallet.address);\n\n try {\n // 1. Generate a session key pair\n const sessionPrivateKey = generatePrivateKey();\n const sessionAccount = privateKeyToAccount(sessionPrivateKey);\n const chainId = BigInt(this.config.chain.id);\n\n // 2. Build the session struct\n const session = buildSession(\n sessionAccount.address,\n params,\n chainId,\n );\n\n // 3. Compute the permission ID\n const permissionId = computePermissionId(session);\n\n // 4. Install Smart Sessions validator if not already installed\n const smartSessionsModule = getSmartSessionsModule();\n try {\n const isInstalled = await client.isModuleInstalled({\n type: \"validator\",\n address: smartSessionsModule.address,\n context: \"0x\",\n });\n if (!isInstalled) {\n await client.installModule({\n type: \"validator\",\n address: smartSessionsModule.address,\n context: smartSessionsModule.initData,\n });\n }\n } catch {\n // If check fails, try installing anyway\n await client.installModule({\n type: \"validator\",\n address: smartSessionsModule.address,\n context: smartSessionsModule.initData,\n });\n }\n\n // 5. Get the enable session details (computes the hash the owner must sign)\n const enableDetails = await getEnableDetails(\n [session],\n { address: wallet.address, type: \"safe\" },\n [this.publicClient],\n );\n\n // 6. Have the owner sign the permission enable hash\n const ownerAccount = resolveAccount(ownerKey);\n const ownerSignature = await ownerAccount.signMessage({\n message: { raw: enableDetails.permissionEnableHash },\n });\n\n // 7. Encode the enable signature and submit via the SmartAccountClient\n const enableSig = encodeEnableSessionSignature(\n enableDetails.permissionId,\n ownerSignature,\n enableDetails.enableSessionData,\n );\n\n // 8. Send a dummy transaction to enable the session on-chain\n // (The signature contains the enable data in ENABLE mode)\n // Note: the actual enabling happens through the Smart Sessions validator\n // when processing a UserOp with the ENABLE mode signature.\n // For now, we store the session metadata for later use.\n\n // 9. Store session metadata\n const walletSessions = this.sessions.get(wallet.address) ?? [];\n walletSessions.push({\n permissionId,\n sessionKeyAddress: sessionAccount.address,\n sessionKeyPrivateKey: sessionPrivateKey,\n expiresAt: params.expiresAt,\n actions: params.actions.map((a) => ({\n target: a.target,\n selector: a.selector,\n })),\n });\n this.sessions.set(wallet.address, walletSessions);\n\n return {\n sessionKey: sessionAccount.address,\n privateKey: sessionPrivateKey,\n permissionId,\n };\n } catch (error) {\n if (error instanceof SessionError) throw error;\n throw new SessionError(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n /**\n * Revoke a session key, permanently disabling it.\n */\n async revokeSession(\n wallet: AgentWallet,\n permissionId: Hex,\n _ownerKey: SignerKey,\n ): Promise<void> {\n const client = this.getWalletClient(wallet.address);\n\n try {\n const removeAction = getRemoveAction(permissionId);\n await client.sendTransaction({\n calls: [removeAction],\n } as Parameters<typeof client.sendTransaction>[0]);\n\n // Remove from local session store\n const walletSessions = this.sessions.get(wallet.address) ?? [];\n this.sessions.set(\n wallet.address,\n walletSessions.filter((s) => s.permissionId !== permissionId),\n );\n } catch (error) {\n throw new SessionError(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n /**\n * Get active sessions for a wallet.\n */\n getActiveSessions(walletAddress: Address): ActiveSession[] {\n const now = Math.floor(Date.now() / 1000);\n const walletSessions = this.sessions.get(walletAddress) ?? [];\n return walletSessions\n .filter((s) => s.expiresAt > now)\n .map((s) => ({\n sessionKey: s.sessionKeyAddress,\n actions: s.actions.map((a) => ({ target: a.target, selector: a.selector })),\n expiresAt: s.expiresAt,\n isActive: true,\n }));\n }\n\n // ─── Transaction Execution ────────────────────────────────────\n\n /**\n * Execute a single transaction from the agent wallet.\n * The transaction is submitted as a UserOperation through the bundler.\n * Hooks (spending limits, allowlist, pause) are enforced on-chain.\n */\n async execute(wallet: AgentWallet, params: ExecuteParams): Promise<Hex> {\n const client = this.getWalletClient(wallet.address);\n\n try {\n const hash = await client.sendTransaction({\n calls: [\n {\n to: params.target,\n value: params.value ?? 0n,\n data: params.data ?? (\"0x\" as Hex),\n },\n ],\n } as Parameters<typeof client.sendTransaction>[0]);\n\n return hash;\n } catch (error) {\n throw new ExecutionError(\n error instanceof Error ? error.message : String(error),\n error,\n );\n }\n }\n\n /**\n * Execute a batch of transactions atomically from the agent wallet.\n * All calls are encoded into a single UserOperation with batch mode.\n */\n async executeBatch(\n wallet: AgentWallet,\n params: ExecuteBatchParams,\n ): Promise<Hex> {\n const client = this.getWalletClient(wallet.address);\n\n try {\n const calls = params.calls.map((call) => ({\n to: call.target,\n value: call.value ?? 0n,\n data: call.data ?? (\"0x\" as Hex),\n }));\n\n const hash = await client.sendTransaction({\n calls,\n } as Parameters<typeof client.sendTransaction>[0]);\n\n return hash;\n } catch (error) {\n throw new ExecutionError(\n error instanceof Error ? error.message : String(error),\n error,\n );\n }\n }\n\n // ─── Query Functions ──────────────────────────────────────────\n\n /**\n * Get the remaining spending allowance for a token on a wallet.\n * Reads directly from the SpendingLimitHook contract.\n */\n async getRemainingAllowance(\n walletAddress: Address,\n token: Address,\n ): Promise<bigint> {\n const moduleAddresses = this.config.moduleAddresses;\n if (!moduleAddresses) {\n throw new PolicyConfigError(\n \"moduleAddresses not configured — cannot query SpendingLimitHook\",\n );\n }\n\n const result = await this.publicClient.readContract({\n address: moduleAddresses.spendingLimitHook,\n abi: SPENDING_LIMIT_HOOK_ABI,\n functionName: \"getRemainingAllowance\",\n args: [walletAddress, token],\n });\n\n return result as bigint;\n }\n\n /**\n * Check if a wallet is currently paused.\n * Reads directly from the EmergencyPauseHook contract.\n */\n async isPaused(walletAddress: Address): Promise<boolean> {\n const moduleAddresses = this.config.moduleAddresses;\n if (!moduleAddresses) {\n throw new PolicyConfigError(\n \"moduleAddresses not configured — cannot query EmergencyPauseHook\",\n );\n }\n\n const result = await this.publicClient.readContract({\n address: moduleAddresses.emergencyPauseHook,\n abi: EMERGENCY_PAUSE_HOOK_ABI,\n functionName: \"isPaused\",\n args: [walletAddress],\n });\n\n return result as boolean;\n }\n\n /**\n * Get the native ETH balance of a wallet.\n */\n async getBalances(walletAddress: Address): Promise<{\n eth: bigint;\n tokens: { address: Address; symbol: string; balance: bigint }[];\n }> {\n const eth = await this.publicClient.getBalance({\n address: walletAddress,\n });\n return { eth, tokens: [] };\n }\n\n // ─── Pause / Unpause (Guardian Actions) ───────────────────────\n\n /**\n * Pause a wallet. Must be called by the configured guardian.\n * This is NOT a UserOp — it's a direct call to the EmergencyPauseHook.\n */\n async pause(walletAddress: Address, guardianKey: SignerKey): Promise<Hex> {\n const moduleAddresses = this.config.moduleAddresses;\n if (!moduleAddresses) {\n throw new PolicyConfigError(\"moduleAddresses not configured\");\n }\n\n const guardian = resolveAccount(guardianKey);\n const { request } = await this.publicClient.simulateContract({\n account: guardian,\n address: moduleAddresses.emergencyPauseHook,\n abi: EMERGENCY_PAUSE_HOOK_ABI,\n functionName: \"pause\",\n args: [walletAddress],\n });\n\n // We need a wallet client for the guardian to sign the tx\n const guardianClient = createWalletClient({\n account: guardian,\n chain: this.config.chain,\n transport: http(this.config.rpcUrl),\n });\n\n return guardianClient.writeContract(request);\n }\n\n /**\n * Unpause a wallet. Must be called by the configured guardian.\n */\n async unpause(\n walletAddress: Address,\n guardianKey: SignerKey,\n ): Promise<Hex> {\n const moduleAddresses = this.config.moduleAddresses;\n if (!moduleAddresses) {\n throw new PolicyConfigError(\"moduleAddresses not configured\");\n }\n\n const guardian = resolveAccount(guardianKey);\n const { request } = await this.publicClient.simulateContract({\n account: guardian,\n address: moduleAddresses.emergencyPauseHook,\n abi: EMERGENCY_PAUSE_HOOK_ABI,\n functionName: \"unpause\",\n args: [walletAddress],\n });\n\n const guardianClient = createWalletClient({\n account: guardian,\n chain: this.config.chain,\n transport: http(this.config.rpcUrl),\n });\n\n return guardianClient.writeContract(request);\n }\n\n // ─── Private Helpers ──────────────────────────────────────────\n\n private resolvePolicies(params: CreateWalletParams): PolicyConfig[] {\n if (params.preset) {\n return PRESETS[params.preset](params.owner, params.presetParams);\n }\n return params.policies ?? [];\n }\n\n private requireModuleAddresses(\n policies: PolicyConfig[],\n ): ModuleAddresses | undefined {\n if (policies.length === 0) return undefined;\n\n const moduleAddresses = this.config.moduleAddresses;\n if (!moduleAddresses) {\n throw new WalletCreationError(\n \"moduleAddresses must be configured when policies are specified. \" +\n \"Provide the deployed hook contract addresses in SmartAgentKitConfig.\",\n );\n }\n\n // Validate required addresses based on policy types\n for (const policy of policies) {\n switch (policy.type) {\n case \"spending-limit\":\n if (!moduleAddresses.spendingLimitHook) {\n throw new WalletCreationError(\n \"spendingLimitHook address required for spending-limit policy\",\n );\n }\n break;\n case \"allowlist\":\n if (!moduleAddresses.allowlistHook) {\n throw new WalletCreationError(\n \"allowlistHook address required for allowlist policy\",\n );\n }\n break;\n case \"emergency-pause\":\n if (!moduleAddresses.emergencyPauseHook) {\n throw new WalletCreationError(\n \"emergencyPauseHook address required for emergency-pause policy\",\n );\n }\n break;\n case \"automation\":\n throw new PolicyConfigError(\n \"automation policies are not yet supported\",\n );\n }\n }\n\n return moduleAddresses;\n }\n\n /**\n * Build and send the first UserOp that initializes all sub-hooks\n * and adds them to the HookMultiPlexer.\n *\n * This batch includes for each sub-hook:\n * 1. onInstall(initData) — initialize the sub-hook for this account\n * 2. setTrustedForwarder(hookMultiPlexer) — so sub-hooks resolve the\n * correct account when called through the multiplexer\n * 3. addHook(hookAddress, GLOBAL) on HookMultiPlexer — register the\n * sub-hook for all transactions\n */\n private async initializePolicies(\n client: Erc7579SmartAccountClient,\n policies: PolicyConfig[],\n moduleAddresses: ModuleAddresses,\n hookMultiPlexerAddress: Address,\n ): Promise<void> {\n const calls: { to: Address; value: bigint; data: Hex }[] = [];\n\n for (const policy of policies) {\n switch (policy.type) {\n case \"spending-limit\": {\n const hookAddress = moduleAddresses.spendingLimitHook;\n const initData = encodeSpendingLimitInitData(policy);\n this.pushSubHookInitCalls(\n calls,\n hookAddress,\n initData,\n hookMultiPlexerAddress,\n );\n break;\n }\n\n case \"allowlist\": {\n const hookAddress = moduleAddresses.allowlistHook;\n const initData = encodeAllowlistInitData(policy);\n this.pushSubHookInitCalls(\n calls,\n hookAddress,\n initData,\n hookMultiPlexerAddress,\n );\n break;\n }\n\n case \"emergency-pause\": {\n const hookAddress = moduleAddresses.emergencyPauseHook;\n const initData = encodeEmergencyPauseInitData(policy);\n this.pushSubHookInitCalls(\n calls,\n hookAddress,\n initData,\n hookMultiPlexerAddress,\n );\n break;\n }\n\n case \"automation\":\n // AutomationExecutor is installed as a separate executor module,\n // not as a sub-hook. Skip in hook initialization.\n break;\n }\n }\n\n if (calls.length === 0) return;\n\n // Send as a single batched UserOp\n await client.sendTransaction({\n calls,\n } as Parameters<typeof client.sendTransaction>[0]);\n }\n\n /**\n * Push the 3 calls needed to initialize a sub-hook:\n * 1. onInstall(initData) on the sub-hook\n * 2. setTrustedForwarder(multiplexer) on the sub-hook\n * 3. addHook(hookAddr, GLOBAL) on the HookMultiPlexer\n */\n private pushSubHookInitCalls(\n calls: { to: Address; value: bigint; data: Hex }[],\n hookAddress: Address,\n initData: Hex,\n hookMultiPlexerAddress: Address,\n ): void {\n // 1. Initialize the sub-hook for this account\n calls.push({\n to: hookAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: MODULE_ONINSTALL_ABI,\n functionName: \"onInstall\",\n args: [initData],\n }),\n });\n\n // 2. Set HookMultiPlexer as trusted forwarder\n calls.push({\n to: hookAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: SET_TRUSTED_FORWARDER_ABI,\n functionName: \"setTrustedForwarder\",\n args: [hookMultiPlexerAddress],\n }),\n });\n\n // 3. Register sub-hook as GLOBAL in the HookMultiPlexer\n calls.push({\n to: hookMultiPlexerAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: HOOK_MULTIPLEXER_ABI,\n functionName: \"addHook\",\n args: [hookAddress, HOOK_TYPE_GLOBAL],\n }),\n });\n }\n\n private mapPoliciesToInstalled(\n policies: PolicyConfig[],\n moduleAddresses?: ModuleAddresses,\n ): InstalledPolicy[] {\n if (!moduleAddresses) return [];\n\n return policies.map((policy) => {\n switch (policy.type) {\n case \"spending-limit\":\n return {\n moduleAddress: moduleAddresses.spendingLimitHook,\n moduleType: 4,\n name: \"SpendingLimitHook\",\n config: policy,\n };\n case \"allowlist\":\n return {\n moduleAddress: moduleAddresses.allowlistHook,\n moduleType: 4,\n name: \"AllowlistHook\",\n config: policy,\n };\n case \"emergency-pause\":\n return {\n moduleAddress: moduleAddresses.emergencyPauseHook,\n moduleType: 4,\n name: \"EmergencyPauseHook\",\n config: policy,\n };\n case \"automation\":\n return {\n moduleAddress: moduleAddresses.automationExecutor ?? (\"0x0000000000000000000000000000000000000000\" as Address),\n moduleType: 2,\n name: \"AutomationExecutor\",\n config: policy,\n };\n default: {\n const _exhaustive: never = policy;\n return {\n moduleAddress: \"0x0000000000000000000000000000000000000000\" as Address,\n moduleType: 0,\n name: \"Unknown\",\n config: _exhaustive as PolicyConfig,\n };\n }\n }\n });\n }\n\n private getWalletClient(walletAddress: Address): Erc7579SmartAccountClient {\n const client = this.walletClients.get(walletAddress);\n if (!client) {\n throw new ExecutionError(\n `No client found for wallet ${walletAddress}. ` +\n \"Call createWallet() or connectWallet() first.\",\n );\n }\n return client;\n }\n}\n","import { parseEther, type Address } from \"viem\";\nimport type { PolicyConfig, PresetName } from \"./types.js\";\nimport { NATIVE_TOKEN, WINDOW_1_DAY, WINDOW_1_WEEK } from \"./constants.js\";\n\n/**\n * Pre-built policy combinations for common agent types.\n *\n * Each preset returns an array of PolicyConfig objects that are\n * installed on the wallet at deployment time.\n */\nexport const PRESETS: Record<\n PresetName,\n (owner: Address, params?: Record<string, unknown>) => PolicyConfig[]\n> = {\n /**\n * DeFi Trader preset:\n * - Daily spending limit on ETH and stablecoins\n * - Allowlist of approved DEX contracts\n * - Emergency pause with owner as guardian\n */\n \"defi-trader\": (owner, params = {}) => [\n {\n type: \"spending-limit\",\n limits: [\n {\n token: NATIVE_TOKEN,\n limit: (params.dailyEthLimit as bigint) ?? parseEther(\"1\"),\n window: WINDOW_1_DAY,\n },\n ...((params.stablecoinLimits as Array<{\n token: Address;\n limit: bigint;\n window: number;\n }>) ?? []),\n ],\n },\n // Only include allowlist if specific DEXes are provided;\n // an empty allowlist in \"allow\" mode would block all transactions.\n ...((params.allowedDexes as Address[] | undefined)?.length\n ? [\n {\n type: \"allowlist\" as const,\n mode: \"allow\" as const,\n targets: (params.allowedDexes as Address[]).map((addr) => ({\n address: addr,\n selector: \"0x00000000\" as `0x${string}`,\n })),\n },\n ]\n : []),\n {\n type: \"emergency-pause\",\n guardian: (params.guardian as Address) ?? owner,\n autoUnpauseAfter: WINDOW_1_DAY,\n },\n ],\n\n /**\n * Treasury Agent preset:\n * - Lower spending limits with longer windows\n * - Emergency pause (manual only)\n */\n \"treasury-agent\": (owner, params = {}) => [\n {\n type: \"spending-limit\",\n limits: [\n {\n token: NATIVE_TOKEN,\n limit: (params.weeklyEthLimit as bigint) ?? parseEther(\"5\"),\n window: WINDOW_1_WEEK,\n },\n ],\n },\n {\n type: \"emergency-pause\",\n guardian: (params.guardian as Address) ?? owner,\n autoUnpauseAfter: 0,\n },\n ],\n\n /**\n * Payment Agent preset:\n * - Strict spending limits\n * - Allowlist of approved recipients only\n * - Emergency pause\n */\n \"payment-agent\": (owner, params = {}) => [\n {\n type: \"spending-limit\",\n limits: [\n {\n token: NATIVE_TOKEN,\n limit: (params.dailyLimit as bigint) ?? parseEther(\"0.1\"),\n window: WINDOW_1_DAY,\n },\n ],\n },\n // Only include allowlist if specific recipients are provided;\n // an empty allowlist in \"allow\" mode would block all transactions.\n ...((params.approvedRecipients as Address[] | undefined)?.length\n ? [\n {\n type: \"allowlist\" as const,\n mode: \"allow\" as const,\n targets: (params.approvedRecipients as Address[]).map(\n (addr) => ({\n address: addr,\n }),\n ),\n },\n ]\n : []),\n {\n type: \"emergency-pause\",\n guardian: (params.guardian as Address) ?? owner,\n autoUnpauseAfter: 3_600,\n },\n ],\n\n /**\n * Minimal preset:\n * - Just emergency pause\n * - For agents that need maximum flexibility with a kill switch\n */\n minimal: (owner, params = {}) => [\n {\n type: \"emergency-pause\",\n guardian: (params.guardian as Address) ?? owner,\n autoUnpauseAfter: 0,\n },\n ],\n};\n","import type { Address } from \"viem\";\n\n// ─── ERC-7579 Module Types ──────────────────────────────────────\n\n/** ERC-7579 module type: Validator */\nexport const MODULE_TYPE_VALIDATOR = 1;\n/** ERC-7579 module type: Executor */\nexport const MODULE_TYPE_EXECUTOR = 2;\n/** ERC-7579 module type: Fallback */\nexport const MODULE_TYPE_FALLBACK = 3;\n/** ERC-7579 module type: Hook */\nexport const MODULE_TYPE_HOOK = 4;\n\n// ─── Infrastructure Addresses ────────────────────────────────────\n\n/** Native ETH represented as the zero address */\nexport const NATIVE_TOKEN: Address =\n \"0x0000000000000000000000000000000000000000\";\n\n/** ERC-4337 EntryPoint v0.7 (canonical address on all chains) */\nexport const ENTRYPOINT_V07: Address =\n \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\";\n\n/** Safe7579 module address (canonical) */\nexport const SAFE_7579_MODULE: Address =\n \"0x7579EE8307284F293B1927136486880611F20002\";\n\n/** Safe7579 launchpad address (canonical) */\nexport const SAFE_7579_LAUNCHPAD: Address =\n \"0x7579011aB74c46090561ea277Ba79D510c6C00ff\";\n\n/** Rhinestone module registry attester */\nexport const RHINESTONE_ATTESTER: Address =\n \"0x000000333034E9f539ce08819E12c1b8Cb29084d\";\n\n/** Attesters threshold for module installation */\nexport const ATTESTERS_THRESHOLD = 1;\n\n// ─── Time Constants ──────────────────────────────────────────────\n\n/** Time window constants (in seconds) */\nexport const WINDOW_1_HOUR = 3_600;\nexport const WINDOW_1_DAY = 86_400;\nexport const WINDOW_1_WEEK = 604_800;\n\n// ─── Module ABIs (for SDK interaction) ───────────────────────────\n\nexport const SPENDING_LIMIT_HOOK_ABI = [\n {\n name: \"setSpendingLimit\",\n type: \"function\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"limit\", type: \"uint256\" },\n { name: \"windowDuration\", type: \"uint48\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"removeSpendingLimit\",\n type: \"function\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"getRemainingAllowance\",\n type: \"function\",\n inputs: [\n { name: \"account\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n name: \"configs\",\n type: \"function\",\n inputs: [\n { name: \"account\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [\n { name: \"limit\", type: \"uint256\" },\n { name: \"spent\", type: \"uint256\" },\n { name: \"windowDuration\", type: \"uint48\" },\n { name: \"windowStart\", type: \"uint48\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ALLOWLIST_HOOK_ABI = [\n {\n name: \"addPermission\",\n type: \"function\",\n inputs: [\n { name: \"target\", type: \"address\" },\n { name: \"selector\", type: \"bytes4\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"removePermission\",\n type: \"function\",\n inputs: [\n { name: \"target\", type: \"address\" },\n { name: \"selector\", type: \"bytes4\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"setMode\",\n type: \"function\",\n inputs: [{ name: \"mode\", type: \"uint8\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"isTargetAllowed\",\n type: \"function\",\n inputs: [\n { name: \"account\", type: \"address\" },\n { name: \"target\", type: \"address\" },\n { name: \"selector\", type: \"bytes4\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const EMERGENCY_PAUSE_HOOK_ABI = [\n {\n name: \"pause\",\n type: \"function\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"unpause\",\n type: \"function\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"isPaused\",\n type: \"function\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n name: \"setGuardian\",\n type: \"function\",\n inputs: [{ name: \"newGuardian\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"setAutoUnpauseTimeout\",\n type: \"function\",\n inputs: [{ name: \"timeout\", type: \"uint48\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n// ─── HookMultiPlexer (Rhinestone canonical address) ─────────────\n\n/** HookMultiPlexer canonical address (same on all chains) */\nexport const HOOK_MULTIPLEXER_ADDRESS: Address =\n \"0xF6782ed057F95f334D04F0Af1Af4D14fb84DE549\";\n\n/** HookType enum matching HookMultiPlexer.sol */\nexport const HOOK_TYPE_GLOBAL = 0;\nexport const HOOK_TYPE_DELEGATECALL = 1;\nexport const HOOK_TYPE_VALUE = 2;\nexport const HOOK_TYPE_SIG = 3;\nexport const HOOK_TYPE_TARGET = 4;\n\n// ─── Module Lifecycle ABIs ──────────────────────────────────────\n\n/** ERC-7579 onInstall ABI (common to all modules) */\nexport const MODULE_ONINSTALL_ABI = [\n {\n name: \"onInstall\",\n type: \"function\",\n inputs: [{ name: \"data\", type: \"bytes\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** ModuleKit TrustedForwarder.setTrustedForwarder ABI */\nexport const SET_TRUSTED_FORWARDER_ABI = [\n {\n name: \"setTrustedForwarder\",\n type: \"function\",\n inputs: [{ name: \"forwarder\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** HookMultiPlexer.addHook ABI (for GLOBAL/VALUE/DELEGATECALL hooks) */\nexport const HOOK_MULTIPLEXER_ABI = [\n {\n name: \"addHook\",\n type: \"function\",\n inputs: [\n { name: \"hook\", type: \"address\" },\n { name: \"hookType\", type: \"uint8\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"removeHook\",\n type: \"function\",\n inputs: [\n { name: \"hook\", type: \"address\" },\n { name: \"hookType\", type: \"uint8\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n// ─── Deployed Module Addresses ───────────────────────────────────\n\n/**\n * Deployed module addresses per chain.\n *\n * @remarks This record is intentionally empty. After deploying contracts\n * to a specific chain, populate this map or (preferably) supply addresses\n * via `SmartAgentKitConfig.moduleAddresses` at runtime.\n *\n * @internal Exported for advanced usage; most users should configure\n * addresses through SmartAgentKitConfig instead of relying on this map.\n */\nexport const MODULE_ADDRESSES: Record<\n string,\n {\n hookMultiPlexer: Address;\n spendingLimitHook: Address;\n allowlistHook: Address;\n emergencyPauseHook: Address;\n automationExecutor: Address;\n }\n> = {\n // Will be populated after deployment\n};\n","import { type Address, type Hex, encodeAbiParameters, parseAbiParameters } from \"viem\";\nimport type {\n PolicyConfig,\n SpendingLimitPolicy,\n AllowlistPolicy,\n EmergencyPausePolicy,\n AutomationPolicy,\n} from \"./types.js\";\nimport { PolicyConfigError } from \"./errors.js\";\nimport { MODULE_TYPE_HOOK } from \"./constants.js\";\n\n// ─── Exported Types ────────────────────────────────────────────\n\nexport interface EncodedPolicy {\n moduleAddress: Address;\n moduleType: number;\n initData: Hex;\n}\n\n// ─── Main Encoder ──────────────────────────────────────────────\n\n/**\n * Encode a policy configuration into the format needed for module installation.\n *\n * The encoded data matches the Solidity `onInstall` decoder for each module:\n *\n * - **SpendingLimitHook:** `abi.encode(address trustedForwarder, TokenLimitInit[])` where each entry is\n * `(address token, uint256 limit, uint48 windowDuration)`\n *\n * - **AllowlistHook:** `abi.encode(address trustedForwarder, uint8 mode, TargetPermission[], address[] protectedAddresses)`\n * where each permission is `(address target, bytes4 selector)` and protectedAddresses are infrastructure contracts\n *\n * - **EmergencyPauseHook:** `abi.encode(address trustedForwarder, address guardian, uint48 autoUnpauseAfter)`\n *\n * @param policy - The policy configuration to encode.\n * @param moduleAddresses - Optional map of module addresses per chain. If not\n * provided, module addresses will be set to zero (for SDK-level\n * configuration before deployment addresses are known).\n * @param trustedForwarder - The HookMultiPlexer address to set as trusted forwarder.\n * Defaults to zero address (for direct usage without multiplexer).\n * @returns The encoded policy with module address, type, and init data.\n */\nexport function encodePolicyInitData(\n policy: PolicyConfig,\n moduleAddresses?: {\n spendingLimitHook?: Address;\n allowlistHook?: Address;\n emergencyPauseHook?: Address;\n automationExecutor?: Address;\n },\n trustedForwarder: Address = \"0x0000000000000000000000000000000000000000\",\n): EncodedPolicy {\n const zeroAddress: Address = \"0x0000000000000000000000000000000000000000\";\n\n switch (policy.type) {\n case \"spending-limit\":\n return {\n moduleAddress: moduleAddresses?.spendingLimitHook ?? zeroAddress,\n moduleType: MODULE_TYPE_HOOK,\n initData: encodeSpendingLimitInitData(policy, trustedForwarder),\n };\n\n case \"allowlist\":\n return {\n moduleAddress: moduleAddresses?.allowlistHook ?? zeroAddress,\n moduleType: MODULE_TYPE_HOOK,\n initData: encodeAllowlistInitData(policy, trustedForwarder),\n };\n\n case \"emergency-pause\":\n return {\n moduleAddress: moduleAddresses?.emergencyPauseHook ?? zeroAddress,\n moduleType: MODULE_TYPE_HOOK,\n initData: encodeEmergencyPauseInitData(policy, trustedForwarder),\n };\n\n case \"automation\":\n throw new PolicyConfigError(\n \"AutomationExecutor encoding is not yet implemented (Sprint 2)\",\n );\n\n default: {\n const _exhaustive: never = policy;\n throw new PolicyConfigError(\n `Unknown policy type: ${(_exhaustive as PolicyConfig).type}`,\n );\n }\n }\n}\n\n// ─── Per-Module Encoders ───────────────────────────────────────\n\n/**\n * Encode SpendingLimitHook init data.\n *\n * Solidity: `abi.decode(data, (address, TokenLimitInit[]))`\n * where `TokenLimitInit` is `(address token, uint256 limit, uint48 windowDuration)`\n */\nexport function encodeSpendingLimitInitData(\n policy: SpendingLimitPolicy,\n trustedForwarder: Address = \"0x0000000000000000000000000000000000000000\",\n): Hex {\n if (policy.limits.length === 0) {\n throw new PolicyConfigError(\"SpendingLimitPolicy must have at least one token limit\");\n }\n\n // Check for duplicate tokens\n const seenTokens = new Set<string>();\n for (const limit of policy.limits) {\n const tokenKey = limit.token.toLowerCase();\n if (seenTokens.has(tokenKey)) {\n throw new PolicyConfigError(\n `Duplicate token address in limits: ${limit.token}. Only one limit per token is supported.`,\n );\n }\n seenTokens.add(tokenKey);\n if (limit.limit <= 0n) {\n throw new PolicyConfigError(\"Token limit must be greater than zero\");\n }\n if (limit.window < 60) {\n throw new PolicyConfigError(\"Window duration must be at least 60 seconds\");\n }\n }\n\n // Encode as: abi.encode(address, (address, uint256, uint48)[])\n // This matches the Solidity onInstall decoder\n return encodeAbiParameters(\n parseAbiParameters(\n \"address trustedForwarder, (address token, uint256 limit, uint48 windowDuration)[]\",\n ),\n [\n trustedForwarder,\n policy.limits.map((l) => ({\n token: l.token,\n limit: l.limit,\n windowDuration: l.window,\n })),\n ],\n );\n}\n\n/**\n * Encode AllowlistHook init data.\n *\n * Solidity: `abi.decode(data, (address, uint8, TargetPermission[], address[]))`\n * where `TargetPermission` is `(address target, bytes4 selector)`\n * and mode 0 = ALLOWLIST, 1 = BLOCKLIST\n *\n * The protectedAddresses array should include all infrastructure contract addresses\n * (other hooks, HookMultiPlexer, AutomationExecutor) that must never be callable\n * as execution targets, regardless of mode.\n *\n * NOTE: The wildcard selector is 0x431e2cf5 (keccak256(\"WILDCARD\") truncated to 4 bytes).\n * Do NOT use 0x00000000 as wildcard — that represents empty calldata (ETH transfers).\n */\nexport function encodeAllowlistInitData(\n policy: AllowlistPolicy,\n trustedForwarder: Address = \"0x0000000000000000000000000000000000000000\",\n): Hex {\n if (policy.mode === \"allow\" && policy.targets.length === 0) {\n throw new PolicyConfigError(\n \"AllowlistPolicy in 'allow' mode must have at least one target. \" +\n \"An empty allowlist would block all transactions.\",\n );\n }\n\n const mode = policy.mode === \"allow\" ? 0 : 1;\n const wildcardSelector: Hex = \"0x431e2cf5\"; // bytes4(keccak256(\"WILDCARD\"))\n const protectedAddresses: Address[] = policy.protectedAddresses ?? [];\n\n if (protectedAddresses.length > 20) {\n throw new PolicyConfigError(\n \"AllowlistPolicy protectedAddresses cannot exceed 20 entries (on-chain MAX_PROTECTED_ADDRESSES limit)\",\n );\n }\n\n // Encode as: abi.encode(address, uint8, (address, bytes4)[], address[])\n return encodeAbiParameters(\n parseAbiParameters(\n \"address trustedForwarder, uint8 mode, (address target, bytes4 selector)[], address[] protectedAddresses\",\n ),\n [\n trustedForwarder,\n mode,\n policy.targets.map((t) => ({\n target: t.address,\n selector: (t.selector ?? wildcardSelector) as `0x${string}`,\n })),\n protectedAddresses,\n ],\n );\n}\n\n/**\n * Encode EmergencyPauseHook init data.\n *\n * Solidity: `abi.decode(data, (address, address, uint48))`\n * trustedForwarder + guardian address + autoUnpauseAfter in seconds\n */\nexport function encodeEmergencyPauseInitData(\n policy: EmergencyPausePolicy,\n trustedForwarder: Address = \"0x0000000000000000000000000000000000000000\",\n): Hex {\n if (policy.guardian === \"0x0000000000000000000000000000000000000000\") {\n throw new PolicyConfigError(\"Guardian address cannot be the zero address\");\n }\n\n return encodeAbiParameters(\n parseAbiParameters(\"address trustedForwarder, address guardian, uint48 autoUnpauseAfter\"),\n [trustedForwarder, policy.guardian, policy.autoUnpauseAfter ?? 0],\n );\n}\n","/**\n * Base error class for SmartAgentKit SDK errors.\n */\nexport class SmartAgentKitError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SmartAgentKitError\";\n }\n}\n\n/**\n * Thrown when wallet creation fails.\n */\nexport class WalletCreationError extends SmartAgentKitError {\n constructor(message: string, cause?: unknown) {\n super(`Wallet creation failed: ${message}`, { cause });\n this.name = \"WalletCreationError\";\n }\n}\n\n/**\n * Thrown when a policy configuration is invalid.\n */\nexport class PolicyConfigError extends SmartAgentKitError {\n constructor(message: string, cause?: unknown) {\n super(`Invalid policy configuration: ${message}`, { cause });\n this.name = \"PolicyConfigError\";\n }\n}\n\n/**\n * Thrown when transaction execution fails.\n */\nexport class ExecutionError extends SmartAgentKitError {\n constructor(message: string, cause?: unknown) {\n super(`Transaction execution failed: ${message}`, { cause });\n this.name = \"ExecutionError\";\n }\n}\n\n/**\n * Thrown when a spending limit would be exceeded.\n */\nexport class SpendingLimitExceededError extends SmartAgentKitError {\n constructor(\n public readonly token: string,\n public readonly attempted: bigint,\n public readonly remaining: bigint,\n ) {\n super(\n `Spending limit exceeded for ${token}: attempted ${attempted}, remaining ${remaining}`,\n );\n this.name = \"SpendingLimitExceededError\";\n }\n}\n\n/**\n * Thrown when the wallet is paused.\n */\nexport class WalletPausedError extends SmartAgentKitError {\n constructor(public readonly walletAddress: string) {\n super(`Wallet ${walletAddress} is currently paused`);\n this.name = \"WalletPausedError\";\n }\n}\n\n/**\n * Thrown when a session key is invalid or expired.\n */\nexport class SessionError extends SmartAgentKitError {\n constructor(message: string, cause?: unknown) {\n super(`Session error: ${message}`, { cause });\n this.name = \"SessionError\";\n }\n}\n","{\n \"chainId\": 84532,\n \"entryPoint\": \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\",\n \"safe7579Module\": \"0x7579EE8307284F293B1927136486880611F20002\",\n \"safe7579Launchpad\": \"0x7579011aB74c46090561ea277Ba79D510c6C00ff\",\n \"rhinestoneAttester\": \"0x000000333034E9f539ce08819E12c1b8Cb29084d\",\n \"hookMultiPlexer\": \"0xF6782ed057F95f334D04F0Af1Af4D14fb84DE549\",\n \"spendingLimitHook\": \"0x0ea97ef2fc52700d1628110a8f411fefb0c0aa8b\",\n \"allowlistHook\": \"0x61a2100072d03f66de6f7dd0dfc2f7aa5c91e777\",\n \"emergencyPauseHook\": \"0xb8fdc9ee56cfb4077e132eff631b546fe6e79fec\",\n \"automationExecutor\": \"0x729c29b35c396b907ed118f00fbe4d4bcc3a7f46\",\n \"moduleSetupHelper\": \"0x4f1555baf4b3221c373094d47419596118828e41\"\n}\n","{\n \"chainId\": 11155111,\n \"entryPoint\": \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\",\n \"safe7579Module\": \"0x7579EE8307284F293B1927136486880611F20002\",\n \"safe7579Launchpad\": \"0x7579011aB74c46090561ea277Ba79D510c6C00ff\",\n \"rhinestoneAttester\": \"0x000000333034E9f539ce08819E12c1b8Cb29084d\",\n \"hookMultiPlexer\": \"\",\n \"spendingLimitHook\": \"\",\n \"allowlistHook\": \"\",\n \"emergencyPauseHook\": \"\",\n \"automationExecutor\": \"\",\n \"moduleSetupHelper\": \"\"\n}\n","import type { Address } from \"viem\";\nimport type { ModuleAddresses } from \"./types.js\";\nimport baseSepoliaDeployment from \"./deployments/base-sepolia.json\";\nimport sepoliaDeployment from \"./deployments/sepolia.json\";\n\n/**\n * Built-in deployment addresses per chain.\n *\n * Populated automatically by `deploy.sh` after contract deployment.\n * When addresses are available, the SDK can auto-resolve them by chain ID,\n * removing the need to manually specify `moduleAddresses` in config.\n */\nexport const DEPLOYMENTS: Record<number, ModuleAddresses> = {};\n\ninterface DeploymentJson {\n chainId: number;\n spendingLimitHook: string;\n allowlistHook: string;\n emergencyPauseHook: string;\n automationExecutor: string;\n [key: string]: unknown;\n}\n\nfunction loadDeployment(json: DeploymentJson): void {\n // Only register if addresses are actually populated (non-empty)\n if (json.spendingLimitHook && json.spendingLimitHook !== \"\") {\n DEPLOYMENTS[json.chainId] = {\n spendingLimitHook: json.spendingLimitHook as Address,\n allowlistHook: json.allowlistHook as Address,\n emergencyPauseHook: json.emergencyPauseHook as Address,\n automationExecutor: (json.automationExecutor || undefined) as\n | Address\n | undefined,\n };\n }\n}\n\nloadDeployment(baseSepoliaDeployment as DeploymentJson);\nloadDeployment(sepoliaDeployment as DeploymentJson);\n","import {\n type Address,\n type Hex,\n encodeAbiParameters,\n parseAbiParameters,\n keccak256,\n concat,\n toHex,\n} from \"viem\";\nimport {\n getSmartSessionsValidator,\n getPermissionId,\n getEnableSessionDetails,\n getRemoveSessionAction,\n encodeSmartSessionSignature,\n getTimeFramePolicy,\n getSpendingLimitsPolicy,\n SmartSessionMode,\n type Session,\n type ActionData,\n type PolicyData,\n type EnableSessionData,\n} from \"@rhinestone/module-sdk\";\nimport type {\n CreateSessionParams,\n SessionAction,\n TokenLimit,\n} from \"./types.js\";\nimport { SessionError } from \"./errors.js\";\n\n// ─── Constants ──────────────────────────────────────────────────\n\n/** Smart Sessions module address (canonical on all chains) */\nexport const SMART_SESSIONS_ADDRESS: Address =\n \"0x00000000002B0eCfbD0496EE71e01257dA0E37DE\";\n\n/** OwnableValidator — used as session key validator for ECDSA keys */\nexport const OWNABLE_VALIDATOR_ADDRESS: Address =\n \"0x2483DA3A338895199E5e538530213157e931Bf06\";\n\n// ─── Session Builder ────────────────────────────────────────────\n\n/**\n * Build a Smart Sessions `Session` struct from our SDK params.\n *\n * The session is scoped to:\n * - Specific target contracts + function selectors (from actions)\n * - Time-bound via TimeFramePolicy (from expiresAt)\n * - Optional spending limits via SpendingLimitsPolicy\n *\n * @param sessionKeyAddress - The session key's public address (ECDSA)\n * @param params - SDK-level session params\n * @param chainId - Target chain ID\n * @param sessionValidatorAddress - Override for the session validator contract\n */\nexport function buildSession(\n sessionKeyAddress: Address,\n params: CreateSessionParams,\n chainId: bigint,\n sessionValidatorAddress?: Address,\n): Session {\n const validatorAddress =\n sessionValidatorAddress ?? OWNABLE_VALIDATOR_ADDRESS;\n\n // Capture current time once to avoid drift between multiple Date.now() calls\n const now = Math.floor(Date.now() / 1000);\n\n // Session validator init data: encode the session key address\n const sessionValidatorInitData = encodeAbiParameters(\n parseAbiParameters(\"address\"),\n [sessionKeyAddress],\n );\n\n // Build user-op level policies\n const userOpPolicies: PolicyData[] = [];\n\n // Time-bound policy (always required)\n if (!params.expiresAt || params.expiresAt <= now) {\n throw new SessionError(\"expiresAt must be in the future\");\n }\n const timePolicy = getTimeFramePolicy({\n validUntil: params.expiresAt,\n validAfter: now,\n });\n userOpPolicies.push({\n policy: timePolicy.address,\n initData: timePolicy.initData,\n });\n\n // Optional spending limits\n if (params.spendingLimits && params.spendingLimits.length > 0) {\n const spendingPolicy = getSpendingLimitsPolicy(\n params.spendingLimits.map((l: TokenLimit) => ({\n token: l.token,\n limit: l.limit,\n })),\n );\n userOpPolicies.push({\n policy: spendingPolicy.address,\n initData: spendingPolicy.initData,\n });\n }\n\n // Build action-level permissions\n const actions: ActionData[] = params.actions.map(\n (action: SessionAction) => {\n if (action.rules?.length) {\n throw new SessionError(\n \"Per-action rules (SessionAction.rules) are not yet supported. \" +\n \"Remove rules or wait for a future release.\",\n );\n }\n return {\n actionTarget: action.target,\n actionTargetSelector: action.selector,\n actionPolicies: [],\n };\n },\n );\n\n if (actions.length === 0) {\n throw new SessionError(\"Session must have at least one allowed action\");\n }\n\n // Generate a unique salt from the session key + cryptographic randomness\n const randomBuf = new Uint8Array(32);\n crypto.getRandomValues(randomBuf);\n const salt = keccak256(\n concat([sessionKeyAddress as Hex, toHex(randomBuf)]),\n );\n\n return {\n sessionValidator: validatorAddress,\n sessionValidatorInitData,\n salt,\n userOpPolicies,\n erc7739Policies: {\n allowedERC7739Content: [],\n erc1271Policies: [],\n },\n actions,\n permitERC4337Paymaster: true,\n chainId,\n };\n}\n\n// ─── Smart Sessions Module ──────────────────────────────────────\n\n/**\n * Get the Smart Sessions Module for installation on the account.\n * This module enables session key support on the smart account.\n *\n * @param sessions - Optional initial sessions to enable at install time\n */\nexport function getSmartSessionsModule(sessions?: Session[]) {\n return getSmartSessionsValidator({\n sessions,\n useRegistry: true,\n });\n}\n\n// ─── Permission ID ──────────────────────────────────────────────\n\n/**\n * Compute the permission ID for a session.\n * This is a deterministic hash of the session configuration.\n */\nexport function computePermissionId(session: Session): Hex {\n return getPermissionId({ session });\n}\n\n// ─── Enable Session ─────────────────────────────────────────────\n\n/**\n * Get the details needed to enable a session on the account.\n * The owner must sign the returned `permissionEnableHash`.\n */\nexport async function getEnableDetails(\n sessions: Session[],\n account: { address: Address; type: \"safe\" },\n publicClients: Parameters<typeof getEnableSessionDetails>[0][\"clients\"],\n enableValidatorAddress?: Address,\n): Promise<{\n permissionEnableHash: Hex;\n mode: (typeof SmartSessionMode)[keyof typeof SmartSessionMode];\n permissionId: Hex;\n signature: Hex;\n enableSessionData: EnableSessionData;\n}> {\n return getEnableSessionDetails({\n sessions,\n account: {\n address: account.address,\n type: account.type,\n deployedOnChains: [],\n },\n clients: publicClients,\n enableValidatorAddress,\n });\n}\n\n// ─── Session Signature ──────────────────────────────────────────\n\n/**\n * Encode a session signature for a UserOp in USE mode.\n * Used when the session is already enabled on the account.\n */\nexport function encodeUseSessionSignature(\n permissionId: Hex,\n signature: Hex,\n): Hex {\n return encodeSmartSessionSignature({\n mode: SmartSessionMode.USE,\n permissionId,\n signature,\n });\n}\n\n/**\n * Encode a session signature for a UserOp in ENABLE mode.\n * Used when enabling and using a session in the same UserOp.\n */\nexport function encodeEnableSessionSignature(\n permissionId: Hex,\n signature: Hex,\n enableSessionData: EnableSessionData,\n): Hex {\n return encodeSmartSessionSignature({\n mode: SmartSessionMode.ENABLE,\n permissionId,\n signature,\n enableSessionData,\n });\n}\n\n// ─── Remove Session ─────────────────────────────────────────────\n\n/**\n * Get the execution action to remove (revoke) a session.\n * Returns a call that can be batched into a UserOp.\n */\nexport function getRemoveAction(permissionId: Hex): {\n to: Address;\n value: bigint;\n data: Hex;\n} {\n const action = getRemoveSessionAction({ permissionId });\n\n const to: Address = (typeof action.target === \"string\"\n ? action.target\n : action.to) as Address;\n if (!to) throw new SessionError(\"getRemoveSessionAction returned no target address\");\n\n let value: bigint;\n if (typeof action.value === \"bigint\") {\n value = action.value;\n } else if (action.value != null) {\n // Upstream may return BigInt wrapper object; convert via string to avoid TS error\n value = BigInt(String(action.value));\n } else {\n value = 0n;\n }\n\n const data: Hex = ((typeof action.data === \"string\"\n ? action.data\n : action.callData) ?? \"0x\") as Hex;\n\n return { to, value, data };\n}\n\n// ─── Re-exports for convenience ─────────────────────────────────\n\nexport { SmartSessionMode } from \"@rhinestone/module-sdk\";\nexport type {\n Session,\n ActionData,\n PolicyData,\n EnableSessionData,\n} from \"@rhinestone/module-sdk\";\n"],"mappings":"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","names":["encodeAbiParameters","parseAbiParameters","SmartSessionMode","encodeAbiParameters","parseAbiParameters"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@smartagentkit/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Deploy and manage policy-governed smart wallets for AI agents",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "SmartAgentKit Contributors",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/smartagentkit/smartagentkit.git",
|
|
10
|
+
"directory": "packages/sdk"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/smartagentkit/smartagentkit#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/smartagentkit/smartagentkit/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"smart-wallet",
|
|
18
|
+
"ai-agent",
|
|
19
|
+
"erc4337",
|
|
20
|
+
"erc7579",
|
|
21
|
+
"account-abstraction",
|
|
22
|
+
"policy",
|
|
23
|
+
"spending-limit",
|
|
24
|
+
"safe",
|
|
25
|
+
"ethereum",
|
|
26
|
+
"defi"
|
|
27
|
+
],
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"module": "./dist/index.mjs",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.mjs",
|
|
35
|
+
"require": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist"
|
|
40
|
+
],
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"viem": "^2.46.0",
|
|
46
|
+
"permissionless": "^0.2.0",
|
|
47
|
+
"@rhinestone/module-sdk": "^0.2.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.0.0",
|
|
51
|
+
"tsup": "^8.4.0",
|
|
52
|
+
"vitest": "^3.0.0",
|
|
53
|
+
"typescript": "^5.7.0"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsup",
|
|
57
|
+
"test": "vitest run",
|
|
58
|
+
"test:watch": "vitest",
|
|
59
|
+
"lint": "tsc --noEmit",
|
|
60
|
+
"typecheck": "tsc --noEmit",
|
|
61
|
+
"clean": "rm -rf dist"
|
|
62
|
+
}
|
|
63
|
+
}
|