From 8142f08d5085d350a9cef1b13dbac8c68ef3e2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Bekta=C5=9F?= Date: Wed, 12 Aug 2026 20:30:04 +0300 Subject: [PATCH] fix(account-sdk): require factoryData for undeployed smart accounts --- .../utils/createSmartAccount.test.ts | 33 +++++++++++++++++++ .../base-account/utils/createSmartAccount.ts | 7 ++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.test.ts b/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.test.ts index e84bef01d..5476ec316 100644 --- a/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.test.ts +++ b/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.test.ts @@ -7,6 +7,7 @@ import { encodeFunctionData, keccak256 } from 'viem/utils'; import { beforeEach, describe, expect, vi } from 'vitest'; import { createSmartAccount, sign, wrapSignature } from './createSmartAccount.js'; +import { factoryAddress } from './constants.js'; const privateKey = '0x8d0ec8aa1f67f8c11db3c191d3d66408e148759acd617fa22ab5d5d677a234e9'; const signer = privateKeyToAccount(privateKey); @@ -19,6 +20,38 @@ const client = createClient({ chain: baseSepolia, }); +describe('getFactoryArgs', () => { + it('returns the factory and factoryData when factoryData is provided', async () => { + const factoryData = '0x1234'; + const account = await createSmartAccount({ + client, + owner: signer, + ownerIndex: 0, + address: '0xBb0c1d5E7f530e8e648150fc7Cf30912575523E8', + factoryData, + }); + + await expect(account.getFactoryArgs()).resolves.toEqual({ + factory: factoryAddress, + factoryData, + }); + }); + + it('throws a clear error when factoryData is missing', async () => { + const account = await createSmartAccount({ + client, + owner: signer, + ownerIndex: 0, + address: '0xBb0c1d5E7f530e8e648150fc7Cf30912575523E8', + factoryData: undefined, + }); + + await expect(account.getFactoryArgs()).rejects.toThrow( + 'factoryData was not provided', + ); + }); +}); + describe('encodeCalls', () => { it('single', async () => { const account = await createSmartAccount({ diff --git a/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.ts b/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.ts index 5e24c1bb8..b36ca1975 100644 --- a/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.ts +++ b/packages/account-sdk/src/sign/base-account/utils/createSmartAccount.ts @@ -136,8 +136,11 @@ export async function createSmartAccount( }, async getFactoryArgs() { - if (factoryData) return { factory: factory.address, factoryData }; - // TODO: support creating factory data + if (!factoryData) { + throw new BaseError( + 'Cannot deploy smart account: factoryData was not provided and cannot be derived locally.', + ); + } return { factory: factory.address, factoryData }; },