@canton-network/core-signing-store-sql 0.14.0 → 0.15.1

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/dist/index.cjs CHANGED
@@ -51,7 +51,8 @@ var fromSigningTransaction = (transaction, userId) => {
51
51
  status: transaction.status,
52
52
  metadata: transaction.metadata ? JSON.stringify(transaction.metadata) : null,
53
53
  createdAt: transaction.createdAt.toISOString(),
54
- updatedAt: transaction.updatedAt.toISOString()
54
+ updatedAt: transaction.updatedAt.toISOString(),
55
+ signedAt: transaction.signedAt?.toISOString() || null
55
56
  };
56
57
  };
57
58
  var toSigningTransaction = (table) => {
@@ -63,7 +64,8 @@ var toSigningTransaction = (table) => {
63
64
  status: table.status,
64
65
  ...table.metadata ? { metadata: JSON.parse(table.metadata) } : {},
65
66
  createdAt: new Date(table.createdAt),
66
- updatedAt: new Date(table.updatedAt)
67
+ updatedAt: new Date(table.updatedAt),
68
+ ...table.signedAt ? { signedAt: new Date(table.signedAt) } : {}
67
69
  };
68
70
  };
69
71
  var fromSigningDriverConfig = (config, userId) => {
@@ -169,12 +171,21 @@ var StoreSql = class _StoreSql {
169
171
  publicKey: serialized.publicKey,
170
172
  status: serialized.status,
171
173
  metadata: serialized.metadata,
174
+ signedAt: serialized.signedAt,
172
175
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
173
176
  })
174
177
  ).execute();
175
178
  }
176
179
  async updateSigningTransactionStatus(userId, txId, status) {
177
- await this.db.updateTable("signingTransactions").set({ status, updatedAt: (/* @__PURE__ */ new Date()).toISOString() }).where("userId", "=", userId).where("id", "=", txId).execute();
180
+ const current = await this.getSigningTransaction(userId, txId);
181
+ const updateData = {
182
+ status,
183
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
184
+ };
185
+ if (status === "signed" && !current?.signedAt) {
186
+ updateData.signedAt = (/* @__PURE__ */ new Date()).toISOString();
187
+ }
188
+ await this.db.updateTable("signingTransactions").set(updateData).where("userId", "=", userId).where("id", "=", txId).execute();
178
189
  }
179
190
  async listSigningTransactions(userId, limit = 100, before) {
180
191
  let query = this.db.selectFrom("signingTransactions").selectAll().where("userId", "=", userId).orderBy("createdAt", "desc").limit(limit);
@@ -216,13 +227,16 @@ var StoreSql = class _StoreSql {
216
227
  if (keys.length === 0) return;
217
228
  const serialized = keys.map((key) => fromSigningKey(key, userId));
218
229
  await this.db.insertInto("signingKeys").values(serialized).onConflict(
219
- (oc) => oc.columns(["userId", "id"]).doUpdateSet({
220
- name: serialized[0].name,
221
- publicKey: serialized[0].publicKey,
222
- privateKey: serialized[0].privateKey,
223
- metadata: serialized[0].metadata,
224
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
225
- })
230
+ (oc) => (
231
+ // on conflict preserve keys passed to that method
232
+ oc.columns(["userId", "id"]).doUpdateSet({
233
+ name: kysely.sql`excluded.name`,
234
+ publicKey: kysely.sql`excluded.public_key`,
235
+ privateKey: kysely.sql`excluded.private_key`,
236
+ metadata: kysely.sql`excluded.metadata`,
237
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
238
+ })
239
+ )
226
240
  ).execute();
227
241
  }
228
242
  async setSigningTransactions(userId, transactions) {
@@ -231,14 +245,18 @@ var StoreSql = class _StoreSql {
231
245
  (tx) => fromSigningTransaction(tx, userId)
232
246
  );
233
247
  await this.db.insertInto("signingTransactions").values(serialized).onConflict(
234
- (oc) => oc.columns(["userId", "id"]).doUpdateSet({
235
- hash: serialized[0].hash,
236
- signature: serialized[0].signature,
237
- publicKey: serialized[0].publicKey,
238
- status: serialized[0].status,
239
- metadata: serialized[0].metadata,
240
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
241
- })
248
+ (oc) => (
249
+ // on conflict preserve transactions passed to that method
250
+ oc.columns(["userId", "id"]).doUpdateSet({
251
+ hash: kysely.sql`excluded.hash`,
252
+ signature: kysely.sql`excluded.signature`,
253
+ publicKey: kysely.sql`excluded.public_key`,
254
+ status: kysely.sql`excluded.status`,
255
+ metadata: kysely.sql`excluded.metadata`,
256
+ signedAt: kysely.sql`excluded.signed_at`,
257
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
258
+ })
259
+ )
242
260
  ).execute();
243
261
  }
244
262
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts","../src/store-sql.ts","../src/migrator.ts","../src/bootstrap.ts","../src/cli.ts"],"names":["z","logger","assertConnected","Kysely","SqliteDialect","Database","CamelCasePlugin","Umzug","pino","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { UserId } from '@canton-network/core-wallet-auth'\nimport {\n SigningKey,\n SigningTransaction,\n SigningDriverConfig,\n SigningDriverStatus,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\nexport interface SigningKeyTable {\n id: string\n userId: UserId\n name: string\n publicKey: string\n privateKey: string | null\n metadata: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface SigningTransactionTable {\n id: string\n userId: UserId\n hash: string\n signature: string | null\n publicKey: string\n status: string\n metadata: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface SigningDriverConfigTable {\n userId: UserId\n driverId: string\n config: string\n}\n\nexport interface DB {\n migrations: MigrationTable\n signingKeys: SigningKeyTable\n signingTransactions: SigningTransactionTable\n signingDriverConfigs: SigningDriverConfigTable\n}\n\n// Signing driver conversion functions\n\nexport const fromSigningKey = (\n key: SigningKey,\n userId: UserId,\n encrypt?: (data: string) => string\n): SigningKeyTable => {\n return {\n id: key.id,\n userId: userId,\n name: key.name,\n publicKey: key.publicKey,\n privateKey: key.privateKey\n ? encrypt\n ? encrypt(key.privateKey)\n : key.privateKey\n : null,\n metadata: key.metadata ? JSON.stringify(key.metadata) : null,\n createdAt: key.createdAt.toISOString(),\n updatedAt: key.updatedAt.toISOString(),\n }\n}\n\nexport const toSigningKey = (\n table: SigningKeyTable,\n decrypt?: (data: string) => string\n): SigningKey => {\n return {\n id: table.id,\n name: table.name,\n publicKey: table.publicKey,\n ...(table.privateKey\n ? {\n privateKey: decrypt\n ? decrypt(table.privateKey)\n : table.privateKey,\n }\n : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n }\n}\n\nexport const fromSigningTransaction = (\n transaction: SigningTransaction,\n userId: UserId\n): SigningTransactionTable => {\n return {\n id: transaction.id,\n userId: userId,\n hash: transaction.hash,\n signature: transaction.signature || null,\n publicKey: transaction.publicKey,\n status: transaction.status,\n metadata: transaction.metadata\n ? JSON.stringify(transaction.metadata)\n : null,\n createdAt: transaction.createdAt.toISOString(),\n updatedAt: transaction.updatedAt.toISOString(),\n }\n}\n\nexport const toSigningTransaction = (\n table: SigningTransactionTable\n): SigningTransaction => {\n return {\n id: table.id,\n hash: table.hash,\n ...(table.signature ? { signature: table.signature } : {}),\n publicKey: table.publicKey,\n status: table.status as SigningDriverStatus,\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n }\n}\n\nexport const fromSigningDriverConfig = (\n config: SigningDriverConfig,\n userId: UserId\n): SigningDriverConfigTable => {\n return {\n userId: userId,\n driverId: config.driverId,\n config: JSON.stringify(config.config),\n }\n}\n\nexport const toSigningDriverConfig = (\n table: SigningDriverConfigTable\n): SigningDriverConfig => {\n return {\n driverId: table.driverId,\n config: JSON.parse(table.config),\n }\n}\n\nexport const storeConfigSchema = z.object({\n connection: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('memory'),\n }),\n z.object({\n type: z.literal('sqlite'),\n database: z.string(),\n }),\n z.object({\n type: z.literal('postgres'),\n host: z.string(),\n port: z.number(),\n user: z.string(),\n password: z.string(),\n database: z.string(),\n }),\n ]),\n})\n\nexport type StoreConfig = z.infer<typeof storeConfigSchema>\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Logger } from 'pino'\nimport {\n AuthContext,\n UserId,\n AuthAware,\n assertConnected,\n} from '@canton-network/core-wallet-auth'\nimport {\n SigningDriverStore,\n SigningKey,\n SigningTransaction,\n SigningDriverStatus,\n SigningDriverConfig,\n} from '@canton-network/core-signing-lib'\nimport { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromSigningKey,\n toSigningKey,\n fromSigningTransaction,\n toSigningTransaction,\n fromSigningDriverConfig,\n toSigningDriverConfig,\n SigningKeyTable,\n StoreConfig,\n} from './schema.js'\n\nexport class StoreSql implements SigningDriverStore, AuthAware<StoreSql> {\n authContext: AuthContext | undefined\n\n constructor(\n private db: Kysely<DB>,\n private logger: Logger,\n authContext?: AuthContext\n ) {\n this.logger = logger.child({ component: 'StoreSql' })\n this.authContext = authContext\n }\n\n withAuthContext(context?: AuthContext): StoreSql {\n return new StoreSql(this.db, this.logger, context)\n }\n\n private assertConnected(): UserId {\n return assertConnected(this.authContext).userId\n }\n\n // SigningDriverStore methods\n async getSigningKey(\n userId: string,\n keyId: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .executeTakeFirst()\n\n return result ? toSigningKey(result) : undefined\n }\n\n async getSigningKeyByPublicKey(\n publicKey: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('publicKey', '=', publicKey)\n .executeTakeFirst()\n return result ? toSigningKey(result) : undefined\n }\n\n async setSigningKey(userId: string, key: SigningKey): Promise<void> {\n const serialized = fromSigningKey(key, userId)\n\n console.log(\n 'setSigningKey - serialized data:',\n JSON.stringify(serialized, null, 2)\n )\n console.log('setSigningKey - serialized types:', {\n id: typeof serialized.id,\n userId: typeof serialized.userId,\n name: typeof serialized.name,\n publicKey: typeof serialized.publicKey,\n privateKey: typeof serialized.privateKey,\n metadata: typeof serialized.metadata,\n createdAt: typeof serialized.createdAt,\n updatedAt: typeof serialized.updatedAt,\n })\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n name: serialized.name,\n publicKey: serialized.publicKey,\n privateKey: serialized.privateKey,\n metadata: serialized.metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async deleteSigningKey(userId: string, keyId: string): Promise<void> {\n await this.db\n .deleteFrom('signingKeys')\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .execute()\n }\n\n async listSigningKeys(userId: string): Promise<SigningKey[]> {\n const results = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .execute()\n\n return results.map((result: SigningKeyTable) => toSigningKey(result))\n }\n\n async getSigningTransaction(\n userId: string,\n txId: string\n ): Promise<SigningTransaction | undefined> {\n const result = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .executeTakeFirst()\n\n return result ? toSigningTransaction(result) : undefined\n }\n\n async setSigningTransaction(\n userId: string,\n transaction: SigningTransaction\n ): Promise<void> {\n const serialized = fromSigningTransaction(transaction, userId)\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: serialized.hash,\n signature: serialized.signature,\n publicKey: serialized.publicKey,\n status: serialized.status,\n metadata: serialized.metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async updateSigningTransactionStatus(\n userId: string,\n txId: string,\n status: SigningDriverStatus\n ): Promise<void> {\n await this.db\n .updateTable('signingTransactions')\n .set({ status, updatedAt: new Date().toISOString() })\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .execute()\n }\n\n async listSigningTransactions(\n userId: string,\n limit: number = 100,\n before?: string\n ): Promise<SigningTransaction[]> {\n let query = this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n\n if (before) {\n const beforeTx = await this.getSigningTransaction(userId, before)\n if (beforeTx) {\n query = query.where(\n 'createdAt',\n '<',\n beforeTx.createdAt.toISOString()\n )\n }\n }\n\n const results = await query.execute()\n return results.map(toSigningTransaction)\n }\n\n async listSigningTransactionsByTxIdsAndPublicKeys(\n txIds: string[],\n publicKeys: string[]\n ): Promise<SigningTransaction[]> {\n const results = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where((eb) =>\n eb.or([\n eb('publicKey', 'in', publicKeys),\n eb('id', 'in', txIds),\n ])\n )\n .execute()\n\n return results.map(toSigningTransaction)\n }\n\n async getSigningDriverConfiguration(\n userId: string,\n driverId: string\n ): Promise<SigningDriverConfig | undefined> {\n const result = await this.db\n .selectFrom('signingDriverConfigs')\n .selectAll()\n .where('userId', '=', userId)\n .where('driverId', '=', driverId)\n .executeTakeFirst()\n\n return result ? toSigningDriverConfig(result) : undefined\n }\n\n async setSigningDriverConfiguration(\n userId: string,\n config: SigningDriverConfig\n ): Promise<void> {\n const serialized = fromSigningDriverConfig(config, userId)\n\n await this.db\n .insertInto('signingDriverConfigs')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'driverId']).doUpdateSet({\n config: serialized.config,\n })\n )\n .execute()\n }\n\n async setSigningKeys(userId: string, keys: SigningKey[]): Promise<void> {\n if (keys.length === 0) return\n\n const serialized = keys.map((key) => fromSigningKey(key, userId))\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n name: serialized[0].name,\n publicKey: serialized[0].publicKey,\n privateKey: serialized[0].privateKey,\n metadata: serialized[0].metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async setSigningTransactions(\n userId: string,\n transactions: SigningTransaction[]\n ): Promise<void> {\n if (transactions.length === 0) return\n\n const serialized = transactions.map((tx) =>\n fromSigningTransaction(tx, userId)\n )\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: serialized[0].hash,\n signature: serialized[0].signature,\n publicKey: serialized[0].publicKey,\n status: serialized[0].status,\n metadata: serialized[0].metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n}\n\nexport const connection = (config: StoreConfig) => {\n switch (config.connection.type) {\n case 'sqlite':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(config.connection.database),\n }),\n plugins: [new CamelCasePlugin()],\n })\n case 'memory':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(':memory:'),\n }),\n plugins: [new CamelCasePlugin()],\n })\n default:\n throw new Error(\n `Unsupported database type: ${config.connection.type}`\n )\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Umzug, MigrationMeta, UmzugStorage } from 'umzug'\nimport { Kysely } from 'kysely'\nimport { DB } from './schema'\n\nclass KyselyStorage implements UmzugStorage {\n constructor(private db: Kysely<DB>) {}\n\n private async ensureTable() {\n await this.db.schema\n .createTable('migrations')\n .ifNotExists()\n .addColumn('name', 'text', (col) => col.primaryKey())\n .addColumn('executedAt', 'text', (col) => col.notNull())\n .execute()\n }\n\n async executed(): Promise<string[]> {\n await this.ensureTable()\n const rows = await this.db\n .selectFrom('migrations')\n .select('name')\n .execute()\n return rows.map((r) => r.name)\n }\n\n async logMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .insertInto('migrations')\n .values({ name, executedAt: new Date().toISOString() })\n .execute()\n }\n\n async unlogMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .deleteFrom('migrations')\n .where('name', '=', name)\n .execute()\n }\n}\n\nexport const migrator = (db: Kysely<DB>) => {\n const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js'\n const glob = new URL(`./migrations/*.${ext}`, import.meta.url).pathname\n return new Umzug({\n migrations: {\n glob: glob,\n resolve: ({ name, path, context }) => {\n // Dynamic import for ESM\n return {\n name,\n up: async () => {\n console.log(path)\n const { up } = await import(path!)\n return up(context)\n },\n down: async () => {\n const { down } = await import(path!)\n return down(context)\n },\n }\n },\n },\n context: db,\n storage: new KyselyStorage(db),\n logger: console,\n })\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Kysely } from 'kysely'\nimport { StoreSql } from './store-sql.js'\nimport { StoreConfig } from '@canton-network/core-wallet-store'\nimport { Logger } from 'pino'\nimport { DB } from './schema'\n\nexport async function bootstrap(\n db: Kysely<DB>,\n config: StoreConfig,\n logger: Logger\n): Promise<void> {\n new StoreSql(db, logger)\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Command } from 'commander'\nimport { connection } from './store-sql.js'\nimport { migrator } from './migrator.js'\nimport type { StoreConfig } from '@canton-network/core-wallet-store'\nimport { pino } from 'pino'\nimport { bootstrap } from './bootstrap.js'\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport function createCLI(config: StoreConfig): Command {\n const program = new Command()\n\n program\n .command('up')\n .description('Run all pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('down')\n .description('Rollback last migration')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.down()\n await db.destroy()\n })\n\n program\n .command('status')\n .description('Show executed and pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n const pending = await umzug.pending()\n\n console.log('Executed migrations:', executed)\n console.log('Pending migrations:', pending)\n\n await db.destroy()\n })\n\n program\n .command('reset')\n .description('Rollback all migrations and reapply them')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n\n // Rollback all executed migrations in reverse order\n for (const migration of executed.reverse()) {\n await umzug.down({ to: migration.name })\n }\n\n // Reapply all migrations\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('bootstrap')\n .description('Bootstrap DB from config')\n .action(async () => {\n const db = connection(config)\n await bootstrap(db, config, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
1
+ {"version":3,"sources":["../src/schema.ts","../src/store-sql.ts","../src/migrator.ts","../src/bootstrap.ts","../src/cli.ts"],"names":["z","logger","assertConnected","sql","Kysely","SqliteDialect","Database","CamelCasePlugin","Umzug","pino","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { UserId } from '@canton-network/core-wallet-auth'\nimport {\n SigningKey,\n SigningTransaction,\n SigningDriverConfig,\n SigningDriverStatus,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\nexport interface SigningKeyTable {\n id: string\n userId: UserId\n name: string\n publicKey: string\n privateKey: string | null\n metadata: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface SigningTransactionTable {\n id: string\n userId: UserId\n hash: string\n signature: string | null\n publicKey: string\n status: string\n metadata: string | null\n createdAt: string\n updatedAt: string\n signedAt: string | null\n}\n\nexport interface SigningDriverConfigTable {\n userId: UserId\n driverId: string\n config: string\n}\n\nexport interface DB {\n migrations: MigrationTable\n signingKeys: SigningKeyTable\n signingTransactions: SigningTransactionTable\n signingDriverConfigs: SigningDriverConfigTable\n}\n\n// Signing driver conversion functions\n\nexport const fromSigningKey = (\n key: SigningKey,\n userId: UserId,\n encrypt?: (data: string) => string\n): SigningKeyTable => {\n return {\n id: key.id,\n userId: userId,\n name: key.name,\n publicKey: key.publicKey,\n privateKey: key.privateKey\n ? encrypt\n ? encrypt(key.privateKey)\n : key.privateKey\n : null,\n metadata: key.metadata ? JSON.stringify(key.metadata) : null,\n createdAt: key.createdAt.toISOString(),\n updatedAt: key.updatedAt.toISOString(),\n }\n}\n\nexport const toSigningKey = (\n table: SigningKeyTable,\n decrypt?: (data: string) => string\n): SigningKey => {\n return {\n id: table.id,\n name: table.name,\n publicKey: table.publicKey,\n ...(table.privateKey\n ? {\n privateKey: decrypt\n ? decrypt(table.privateKey)\n : table.privateKey,\n }\n : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n }\n}\n\nexport const fromSigningTransaction = (\n transaction: SigningTransaction,\n userId: UserId\n): SigningTransactionTable => {\n return {\n id: transaction.id,\n userId: userId,\n hash: transaction.hash,\n signature: transaction.signature || null,\n publicKey: transaction.publicKey,\n status: transaction.status,\n metadata: transaction.metadata\n ? JSON.stringify(transaction.metadata)\n : null,\n createdAt: transaction.createdAt.toISOString(),\n updatedAt: transaction.updatedAt.toISOString(),\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toSigningTransaction = (\n table: SigningTransactionTable\n): SigningTransaction => {\n return {\n id: table.id,\n hash: table.hash,\n ...(table.signature ? { signature: table.signature } : {}),\n publicKey: table.publicKey,\n status: table.status as SigningDriverStatus,\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n ...(table.signedAt ? { signedAt: new Date(table.signedAt) } : {}),\n }\n}\n\nexport const fromSigningDriverConfig = (\n config: SigningDriverConfig,\n userId: UserId\n): SigningDriverConfigTable => {\n return {\n userId: userId,\n driverId: config.driverId,\n config: JSON.stringify(config.config),\n }\n}\n\nexport const toSigningDriverConfig = (\n table: SigningDriverConfigTable\n): SigningDriverConfig => {\n return {\n driverId: table.driverId,\n config: JSON.parse(table.config),\n }\n}\n\nexport const storeConfigSchema = z.object({\n connection: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('memory'),\n }),\n z.object({\n type: z.literal('sqlite'),\n database: z.string(),\n }),\n z.object({\n type: z.literal('postgres'),\n host: z.string(),\n port: z.number(),\n user: z.string(),\n password: z.string(),\n database: z.string(),\n }),\n ]),\n})\n\nexport type StoreConfig = z.infer<typeof storeConfigSchema>\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Logger } from 'pino'\nimport {\n AuthContext,\n UserId,\n AuthAware,\n assertConnected,\n} from '@canton-network/core-wallet-auth'\nimport {\n SigningDriverStore,\n SigningKey,\n SigningTransaction,\n SigningDriverStatus,\n SigningDriverConfig,\n} from '@canton-network/core-signing-lib'\nimport { CamelCasePlugin, Kysely, SqliteDialect, sql } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromSigningKey,\n toSigningKey,\n fromSigningTransaction,\n toSigningTransaction,\n fromSigningDriverConfig,\n toSigningDriverConfig,\n SigningKeyTable,\n StoreConfig,\n} from './schema.js'\n\nexport class StoreSql implements SigningDriverStore, AuthAware<StoreSql> {\n authContext: AuthContext | undefined\n\n constructor(\n private db: Kysely<DB>,\n private logger: Logger,\n authContext?: AuthContext\n ) {\n this.logger = logger.child({ component: 'StoreSql' })\n this.authContext = authContext\n }\n\n withAuthContext(context?: AuthContext): StoreSql {\n return new StoreSql(this.db, this.logger, context)\n }\n\n private assertConnected(): UserId {\n return assertConnected(this.authContext).userId\n }\n\n // SigningDriverStore methods\n async getSigningKey(\n userId: string,\n keyId: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .executeTakeFirst()\n\n return result ? toSigningKey(result) : undefined\n }\n\n async getSigningKeyByPublicKey(\n publicKey: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('publicKey', '=', publicKey)\n .executeTakeFirst()\n return result ? toSigningKey(result) : undefined\n }\n\n async setSigningKey(userId: string, key: SigningKey): Promise<void> {\n const serialized = fromSigningKey(key, userId)\n\n console.log(\n 'setSigningKey - serialized data:',\n JSON.stringify(serialized, null, 2)\n )\n console.log('setSigningKey - serialized types:', {\n id: typeof serialized.id,\n userId: typeof serialized.userId,\n name: typeof serialized.name,\n publicKey: typeof serialized.publicKey,\n privateKey: typeof serialized.privateKey,\n metadata: typeof serialized.metadata,\n createdAt: typeof serialized.createdAt,\n updatedAt: typeof serialized.updatedAt,\n })\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n name: serialized.name,\n publicKey: serialized.publicKey,\n privateKey: serialized.privateKey,\n metadata: serialized.metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async deleteSigningKey(userId: string, keyId: string): Promise<void> {\n await this.db\n .deleteFrom('signingKeys')\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .execute()\n }\n\n async listSigningKeys(userId: string): Promise<SigningKey[]> {\n const results = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .execute()\n\n return results.map((result: SigningKeyTable) => toSigningKey(result))\n }\n\n async getSigningTransaction(\n userId: string,\n txId: string\n ): Promise<SigningTransaction | undefined> {\n const result = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .executeTakeFirst()\n\n return result ? toSigningTransaction(result) : undefined\n }\n\n async setSigningTransaction(\n userId: string,\n transaction: SigningTransaction\n ): Promise<void> {\n const serialized = fromSigningTransaction(transaction, userId)\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: serialized.hash,\n signature: serialized.signature,\n publicKey: serialized.publicKey,\n status: serialized.status,\n metadata: serialized.metadata,\n signedAt: serialized.signedAt,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async updateSigningTransactionStatus(\n userId: string,\n txId: string,\n status: SigningDriverStatus\n ): Promise<void> {\n // Get current transaction to check if it's already signed\n const current = await this.getSigningTransaction(userId, txId)\n\n const updateData: {\n status: string\n updatedAt: string\n signedAt?: string\n } = {\n status,\n updatedAt: new Date().toISOString(),\n }\n\n // Only set signedAt when transitioning to 'signed' if not already set\n // This preserves the audit trail of when it was originally signed\n if (status === 'signed' && !current?.signedAt) {\n updateData.signedAt = new Date().toISOString()\n }\n\n await this.db\n .updateTable('signingTransactions')\n .set(updateData)\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .execute()\n }\n\n async listSigningTransactions(\n userId: string,\n limit: number = 100,\n before?: string\n ): Promise<SigningTransaction[]> {\n let query = this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n\n if (before) {\n const beforeTx = await this.getSigningTransaction(userId, before)\n if (beforeTx) {\n query = query.where(\n 'createdAt',\n '<',\n beforeTx.createdAt.toISOString()\n )\n }\n }\n\n const results = await query.execute()\n return results.map(toSigningTransaction)\n }\n\n async listSigningTransactionsByTxIdsAndPublicKeys(\n txIds: string[],\n publicKeys: string[]\n ): Promise<SigningTransaction[]> {\n const results = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where((eb) =>\n eb.or([\n eb('publicKey', 'in', publicKeys),\n eb('id', 'in', txIds),\n ])\n )\n .execute()\n\n return results.map(toSigningTransaction)\n }\n\n async getSigningDriverConfiguration(\n userId: string,\n driverId: string\n ): Promise<SigningDriverConfig | undefined> {\n const result = await this.db\n .selectFrom('signingDriverConfigs')\n .selectAll()\n .where('userId', '=', userId)\n .where('driverId', '=', driverId)\n .executeTakeFirst()\n\n return result ? toSigningDriverConfig(result) : undefined\n }\n\n async setSigningDriverConfiguration(\n userId: string,\n config: SigningDriverConfig\n ): Promise<void> {\n const serialized = fromSigningDriverConfig(config, userId)\n\n await this.db\n .insertInto('signingDriverConfigs')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'driverId']).doUpdateSet({\n config: serialized.config,\n })\n )\n .execute()\n }\n\n async setSigningKeys(userId: string, keys: SigningKey[]): Promise<void> {\n if (keys.length === 0) return\n\n const serialized = keys.map((key) => fromSigningKey(key, userId))\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n // on conflict preserve keys passed to that method\n oc.columns(['userId', 'id']).doUpdateSet({\n name: sql`excluded.name`,\n publicKey: sql`excluded.public_key`,\n privateKey: sql`excluded.private_key`,\n metadata: sql`excluded.metadata`,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async setSigningTransactions(\n userId: string,\n transactions: SigningTransaction[]\n ): Promise<void> {\n if (transactions.length === 0) return\n\n const serialized = transactions.map((tx) =>\n fromSigningTransaction(tx, userId)\n )\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n // on conflict preserve transactions passed to that method\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: sql`excluded.hash`,\n signature: sql`excluded.signature`,\n publicKey: sql`excluded.public_key`,\n status: sql`excluded.status`,\n metadata: sql`excluded.metadata`,\n signedAt: sql`excluded.signed_at`,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n}\n\nexport const connection = (config: StoreConfig) => {\n switch (config.connection.type) {\n case 'sqlite':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(config.connection.database),\n }),\n plugins: [new CamelCasePlugin()],\n })\n case 'memory':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(':memory:'),\n }),\n plugins: [new CamelCasePlugin()],\n })\n default:\n throw new Error(\n `Unsupported database type: ${config.connection.type}`\n )\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Umzug, MigrationMeta, UmzugStorage } from 'umzug'\nimport { Kysely } from 'kysely'\nimport { DB } from './schema'\n\nclass KyselyStorage implements UmzugStorage {\n constructor(private db: Kysely<DB>) {}\n\n private async ensureTable() {\n await this.db.schema\n .createTable('migrations')\n .ifNotExists()\n .addColumn('name', 'text', (col) => col.primaryKey())\n .addColumn('executedAt', 'text', (col) => col.notNull())\n .execute()\n }\n\n async executed(): Promise<string[]> {\n await this.ensureTable()\n const rows = await this.db\n .selectFrom('migrations')\n .select('name')\n .execute()\n return rows.map((r) => r.name)\n }\n\n async logMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .insertInto('migrations')\n .values({ name, executedAt: new Date().toISOString() })\n .execute()\n }\n\n async unlogMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .deleteFrom('migrations')\n .where('name', '=', name)\n .execute()\n }\n}\n\nexport const migrator = (db: Kysely<DB>) => {\n const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js'\n const glob = new URL(`./migrations/*.${ext}`, import.meta.url).pathname\n return new Umzug({\n migrations: {\n glob: glob,\n resolve: ({ name, path, context }) => {\n // Dynamic import for ESM\n return {\n name,\n up: async () => {\n console.log(path)\n const { up } = await import(path!)\n return up(context)\n },\n down: async () => {\n const { down } = await import(path!)\n return down(context)\n },\n }\n },\n },\n context: db,\n storage: new KyselyStorage(db),\n logger: console,\n })\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Kysely } from 'kysely'\nimport { StoreSql } from './store-sql.js'\nimport { StoreConfig } from '@canton-network/core-wallet-store'\nimport { Logger } from 'pino'\nimport { DB } from './schema'\n\nexport async function bootstrap(\n db: Kysely<DB>,\n config: StoreConfig,\n logger: Logger\n): Promise<void> {\n new StoreSql(db, logger)\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Command } from 'commander'\nimport { connection } from './store-sql.js'\nimport { migrator } from './migrator.js'\nimport type { StoreConfig } from '@canton-network/core-wallet-store'\nimport { pino } from 'pino'\nimport { bootstrap } from './bootstrap.js'\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport function createCLI(config: StoreConfig): Command {\n const program = new Command()\n\n program\n .command('up')\n .description('Run all pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('down')\n .description('Rollback last migration')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.down()\n await db.destroy()\n })\n\n program\n .command('status')\n .description('Show executed and pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n const pending = await umzug.pending()\n\n console.log('Executed migrations:', executed)\n console.log('Pending migrations:', pending)\n\n await db.destroy()\n })\n\n program\n .command('reset')\n .description('Rollback all migrations and reapply them')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n\n // Rollback all executed migrations in reverse order\n for (const migration of executed.reverse()) {\n await umzug.down({ to: migration.name })\n }\n\n // Reapply all migrations\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('bootstrap')\n .description('Bootstrap DB from config')\n .action(async () => {\n const db = connection(config)\n await bootstrap(db, config, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { assertConnected } from '@canton-network/core-wallet-auth';
2
- import { Kysely, CamelCasePlugin, SqliteDialect } from 'kysely';
2
+ import { sql, Kysely, CamelCasePlugin, SqliteDialect } from 'kysely';
3
3
  import Database from 'better-sqlite3';
4
4
  import { z } from 'zod';
5
5
  import { Umzug } from 'umzug';
@@ -44,7 +44,8 @@ var fromSigningTransaction = (transaction, userId) => {
44
44
  status: transaction.status,
45
45
  metadata: transaction.metadata ? JSON.stringify(transaction.metadata) : null,
46
46
  createdAt: transaction.createdAt.toISOString(),
47
- updatedAt: transaction.updatedAt.toISOString()
47
+ updatedAt: transaction.updatedAt.toISOString(),
48
+ signedAt: transaction.signedAt?.toISOString() || null
48
49
  };
49
50
  };
50
51
  var toSigningTransaction = (table) => {
@@ -56,7 +57,8 @@ var toSigningTransaction = (table) => {
56
57
  status: table.status,
57
58
  ...table.metadata ? { metadata: JSON.parse(table.metadata) } : {},
58
59
  createdAt: new Date(table.createdAt),
59
- updatedAt: new Date(table.updatedAt)
60
+ updatedAt: new Date(table.updatedAt),
61
+ ...table.signedAt ? { signedAt: new Date(table.signedAt) } : {}
60
62
  };
61
63
  };
62
64
  var fromSigningDriverConfig = (config, userId) => {
@@ -162,12 +164,21 @@ var StoreSql = class _StoreSql {
162
164
  publicKey: serialized.publicKey,
163
165
  status: serialized.status,
164
166
  metadata: serialized.metadata,
167
+ signedAt: serialized.signedAt,
165
168
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
166
169
  })
167
170
  ).execute();
168
171
  }
169
172
  async updateSigningTransactionStatus(userId, txId, status) {
170
- await this.db.updateTable("signingTransactions").set({ status, updatedAt: (/* @__PURE__ */ new Date()).toISOString() }).where("userId", "=", userId).where("id", "=", txId).execute();
173
+ const current = await this.getSigningTransaction(userId, txId);
174
+ const updateData = {
175
+ status,
176
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
177
+ };
178
+ if (status === "signed" && !current?.signedAt) {
179
+ updateData.signedAt = (/* @__PURE__ */ new Date()).toISOString();
180
+ }
181
+ await this.db.updateTable("signingTransactions").set(updateData).where("userId", "=", userId).where("id", "=", txId).execute();
171
182
  }
172
183
  async listSigningTransactions(userId, limit = 100, before) {
173
184
  let query = this.db.selectFrom("signingTransactions").selectAll().where("userId", "=", userId).orderBy("createdAt", "desc").limit(limit);
@@ -209,13 +220,16 @@ var StoreSql = class _StoreSql {
209
220
  if (keys.length === 0) return;
210
221
  const serialized = keys.map((key) => fromSigningKey(key, userId));
211
222
  await this.db.insertInto("signingKeys").values(serialized).onConflict(
212
- (oc) => oc.columns(["userId", "id"]).doUpdateSet({
213
- name: serialized[0].name,
214
- publicKey: serialized[0].publicKey,
215
- privateKey: serialized[0].privateKey,
216
- metadata: serialized[0].metadata,
217
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
218
- })
223
+ (oc) => (
224
+ // on conflict preserve keys passed to that method
225
+ oc.columns(["userId", "id"]).doUpdateSet({
226
+ name: sql`excluded.name`,
227
+ publicKey: sql`excluded.public_key`,
228
+ privateKey: sql`excluded.private_key`,
229
+ metadata: sql`excluded.metadata`,
230
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
231
+ })
232
+ )
219
233
  ).execute();
220
234
  }
221
235
  async setSigningTransactions(userId, transactions) {
@@ -224,14 +238,18 @@ var StoreSql = class _StoreSql {
224
238
  (tx) => fromSigningTransaction(tx, userId)
225
239
  );
226
240
  await this.db.insertInto("signingTransactions").values(serialized).onConflict(
227
- (oc) => oc.columns(["userId", "id"]).doUpdateSet({
228
- hash: serialized[0].hash,
229
- signature: serialized[0].signature,
230
- publicKey: serialized[0].publicKey,
231
- status: serialized[0].status,
232
- metadata: serialized[0].metadata,
233
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
234
- })
241
+ (oc) => (
242
+ // on conflict preserve transactions passed to that method
243
+ oc.columns(["userId", "id"]).doUpdateSet({
244
+ hash: sql`excluded.hash`,
245
+ signature: sql`excluded.signature`,
246
+ publicKey: sql`excluded.public_key`,
247
+ status: sql`excluded.status`,
248
+ metadata: sql`excluded.metadata`,
249
+ signedAt: sql`excluded.signed_at`,
250
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
251
+ })
252
+ )
235
253
  ).execute();
236
254
  }
237
255
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts","../src/store-sql.ts","../src/migrator.ts","../src/bootstrap.ts","../src/cli.ts"],"names":["logger"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { UserId } from '@canton-network/core-wallet-auth'\nimport {\n SigningKey,\n SigningTransaction,\n SigningDriverConfig,\n SigningDriverStatus,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\nexport interface SigningKeyTable {\n id: string\n userId: UserId\n name: string\n publicKey: string\n privateKey: string | null\n metadata: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface SigningTransactionTable {\n id: string\n userId: UserId\n hash: string\n signature: string | null\n publicKey: string\n status: string\n metadata: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface SigningDriverConfigTable {\n userId: UserId\n driverId: string\n config: string\n}\n\nexport interface DB {\n migrations: MigrationTable\n signingKeys: SigningKeyTable\n signingTransactions: SigningTransactionTable\n signingDriverConfigs: SigningDriverConfigTable\n}\n\n// Signing driver conversion functions\n\nexport const fromSigningKey = (\n key: SigningKey,\n userId: UserId,\n encrypt?: (data: string) => string\n): SigningKeyTable => {\n return {\n id: key.id,\n userId: userId,\n name: key.name,\n publicKey: key.publicKey,\n privateKey: key.privateKey\n ? encrypt\n ? encrypt(key.privateKey)\n : key.privateKey\n : null,\n metadata: key.metadata ? JSON.stringify(key.metadata) : null,\n createdAt: key.createdAt.toISOString(),\n updatedAt: key.updatedAt.toISOString(),\n }\n}\n\nexport const toSigningKey = (\n table: SigningKeyTable,\n decrypt?: (data: string) => string\n): SigningKey => {\n return {\n id: table.id,\n name: table.name,\n publicKey: table.publicKey,\n ...(table.privateKey\n ? {\n privateKey: decrypt\n ? decrypt(table.privateKey)\n : table.privateKey,\n }\n : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n }\n}\n\nexport const fromSigningTransaction = (\n transaction: SigningTransaction,\n userId: UserId\n): SigningTransactionTable => {\n return {\n id: transaction.id,\n userId: userId,\n hash: transaction.hash,\n signature: transaction.signature || null,\n publicKey: transaction.publicKey,\n status: transaction.status,\n metadata: transaction.metadata\n ? JSON.stringify(transaction.metadata)\n : null,\n createdAt: transaction.createdAt.toISOString(),\n updatedAt: transaction.updatedAt.toISOString(),\n }\n}\n\nexport const toSigningTransaction = (\n table: SigningTransactionTable\n): SigningTransaction => {\n return {\n id: table.id,\n hash: table.hash,\n ...(table.signature ? { signature: table.signature } : {}),\n publicKey: table.publicKey,\n status: table.status as SigningDriverStatus,\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n }\n}\n\nexport const fromSigningDriverConfig = (\n config: SigningDriverConfig,\n userId: UserId\n): SigningDriverConfigTable => {\n return {\n userId: userId,\n driverId: config.driverId,\n config: JSON.stringify(config.config),\n }\n}\n\nexport const toSigningDriverConfig = (\n table: SigningDriverConfigTable\n): SigningDriverConfig => {\n return {\n driverId: table.driverId,\n config: JSON.parse(table.config),\n }\n}\n\nexport const storeConfigSchema = z.object({\n connection: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('memory'),\n }),\n z.object({\n type: z.literal('sqlite'),\n database: z.string(),\n }),\n z.object({\n type: z.literal('postgres'),\n host: z.string(),\n port: z.number(),\n user: z.string(),\n password: z.string(),\n database: z.string(),\n }),\n ]),\n})\n\nexport type StoreConfig = z.infer<typeof storeConfigSchema>\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Logger } from 'pino'\nimport {\n AuthContext,\n UserId,\n AuthAware,\n assertConnected,\n} from '@canton-network/core-wallet-auth'\nimport {\n SigningDriverStore,\n SigningKey,\n SigningTransaction,\n SigningDriverStatus,\n SigningDriverConfig,\n} from '@canton-network/core-signing-lib'\nimport { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromSigningKey,\n toSigningKey,\n fromSigningTransaction,\n toSigningTransaction,\n fromSigningDriverConfig,\n toSigningDriverConfig,\n SigningKeyTable,\n StoreConfig,\n} from './schema.js'\n\nexport class StoreSql implements SigningDriverStore, AuthAware<StoreSql> {\n authContext: AuthContext | undefined\n\n constructor(\n private db: Kysely<DB>,\n private logger: Logger,\n authContext?: AuthContext\n ) {\n this.logger = logger.child({ component: 'StoreSql' })\n this.authContext = authContext\n }\n\n withAuthContext(context?: AuthContext): StoreSql {\n return new StoreSql(this.db, this.logger, context)\n }\n\n private assertConnected(): UserId {\n return assertConnected(this.authContext).userId\n }\n\n // SigningDriverStore methods\n async getSigningKey(\n userId: string,\n keyId: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .executeTakeFirst()\n\n return result ? toSigningKey(result) : undefined\n }\n\n async getSigningKeyByPublicKey(\n publicKey: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('publicKey', '=', publicKey)\n .executeTakeFirst()\n return result ? toSigningKey(result) : undefined\n }\n\n async setSigningKey(userId: string, key: SigningKey): Promise<void> {\n const serialized = fromSigningKey(key, userId)\n\n console.log(\n 'setSigningKey - serialized data:',\n JSON.stringify(serialized, null, 2)\n )\n console.log('setSigningKey - serialized types:', {\n id: typeof serialized.id,\n userId: typeof serialized.userId,\n name: typeof serialized.name,\n publicKey: typeof serialized.publicKey,\n privateKey: typeof serialized.privateKey,\n metadata: typeof serialized.metadata,\n createdAt: typeof serialized.createdAt,\n updatedAt: typeof serialized.updatedAt,\n })\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n name: serialized.name,\n publicKey: serialized.publicKey,\n privateKey: serialized.privateKey,\n metadata: serialized.metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async deleteSigningKey(userId: string, keyId: string): Promise<void> {\n await this.db\n .deleteFrom('signingKeys')\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .execute()\n }\n\n async listSigningKeys(userId: string): Promise<SigningKey[]> {\n const results = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .execute()\n\n return results.map((result: SigningKeyTable) => toSigningKey(result))\n }\n\n async getSigningTransaction(\n userId: string,\n txId: string\n ): Promise<SigningTransaction | undefined> {\n const result = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .executeTakeFirst()\n\n return result ? toSigningTransaction(result) : undefined\n }\n\n async setSigningTransaction(\n userId: string,\n transaction: SigningTransaction\n ): Promise<void> {\n const serialized = fromSigningTransaction(transaction, userId)\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: serialized.hash,\n signature: serialized.signature,\n publicKey: serialized.publicKey,\n status: serialized.status,\n metadata: serialized.metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async updateSigningTransactionStatus(\n userId: string,\n txId: string,\n status: SigningDriverStatus\n ): Promise<void> {\n await this.db\n .updateTable('signingTransactions')\n .set({ status, updatedAt: new Date().toISOString() })\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .execute()\n }\n\n async listSigningTransactions(\n userId: string,\n limit: number = 100,\n before?: string\n ): Promise<SigningTransaction[]> {\n let query = this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n\n if (before) {\n const beforeTx = await this.getSigningTransaction(userId, before)\n if (beforeTx) {\n query = query.where(\n 'createdAt',\n '<',\n beforeTx.createdAt.toISOString()\n )\n }\n }\n\n const results = await query.execute()\n return results.map(toSigningTransaction)\n }\n\n async listSigningTransactionsByTxIdsAndPublicKeys(\n txIds: string[],\n publicKeys: string[]\n ): Promise<SigningTransaction[]> {\n const results = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where((eb) =>\n eb.or([\n eb('publicKey', 'in', publicKeys),\n eb('id', 'in', txIds),\n ])\n )\n .execute()\n\n return results.map(toSigningTransaction)\n }\n\n async getSigningDriverConfiguration(\n userId: string,\n driverId: string\n ): Promise<SigningDriverConfig | undefined> {\n const result = await this.db\n .selectFrom('signingDriverConfigs')\n .selectAll()\n .where('userId', '=', userId)\n .where('driverId', '=', driverId)\n .executeTakeFirst()\n\n return result ? toSigningDriverConfig(result) : undefined\n }\n\n async setSigningDriverConfiguration(\n userId: string,\n config: SigningDriverConfig\n ): Promise<void> {\n const serialized = fromSigningDriverConfig(config, userId)\n\n await this.db\n .insertInto('signingDriverConfigs')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'driverId']).doUpdateSet({\n config: serialized.config,\n })\n )\n .execute()\n }\n\n async setSigningKeys(userId: string, keys: SigningKey[]): Promise<void> {\n if (keys.length === 0) return\n\n const serialized = keys.map((key) => fromSigningKey(key, userId))\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n name: serialized[0].name,\n publicKey: serialized[0].publicKey,\n privateKey: serialized[0].privateKey,\n metadata: serialized[0].metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async setSigningTransactions(\n userId: string,\n transactions: SigningTransaction[]\n ): Promise<void> {\n if (transactions.length === 0) return\n\n const serialized = transactions.map((tx) =>\n fromSigningTransaction(tx, userId)\n )\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: serialized[0].hash,\n signature: serialized[0].signature,\n publicKey: serialized[0].publicKey,\n status: serialized[0].status,\n metadata: serialized[0].metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n}\n\nexport const connection = (config: StoreConfig) => {\n switch (config.connection.type) {\n case 'sqlite':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(config.connection.database),\n }),\n plugins: [new CamelCasePlugin()],\n })\n case 'memory':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(':memory:'),\n }),\n plugins: [new CamelCasePlugin()],\n })\n default:\n throw new Error(\n `Unsupported database type: ${config.connection.type}`\n )\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Umzug, MigrationMeta, UmzugStorage } from 'umzug'\nimport { Kysely } from 'kysely'\nimport { DB } from './schema'\n\nclass KyselyStorage implements UmzugStorage {\n constructor(private db: Kysely<DB>) {}\n\n private async ensureTable() {\n await this.db.schema\n .createTable('migrations')\n .ifNotExists()\n .addColumn('name', 'text', (col) => col.primaryKey())\n .addColumn('executedAt', 'text', (col) => col.notNull())\n .execute()\n }\n\n async executed(): Promise<string[]> {\n await this.ensureTable()\n const rows = await this.db\n .selectFrom('migrations')\n .select('name')\n .execute()\n return rows.map((r) => r.name)\n }\n\n async logMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .insertInto('migrations')\n .values({ name, executedAt: new Date().toISOString() })\n .execute()\n }\n\n async unlogMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .deleteFrom('migrations')\n .where('name', '=', name)\n .execute()\n }\n}\n\nexport const migrator = (db: Kysely<DB>) => {\n const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js'\n const glob = new URL(`./migrations/*.${ext}`, import.meta.url).pathname\n return new Umzug({\n migrations: {\n glob: glob,\n resolve: ({ name, path, context }) => {\n // Dynamic import for ESM\n return {\n name,\n up: async () => {\n console.log(path)\n const { up } = await import(path!)\n return up(context)\n },\n down: async () => {\n const { down } = await import(path!)\n return down(context)\n },\n }\n },\n },\n context: db,\n storage: new KyselyStorage(db),\n logger: console,\n })\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Kysely } from 'kysely'\nimport { StoreSql } from './store-sql.js'\nimport { StoreConfig } from '@canton-network/core-wallet-store'\nimport { Logger } from 'pino'\nimport { DB } from './schema'\n\nexport async function bootstrap(\n db: Kysely<DB>,\n config: StoreConfig,\n logger: Logger\n): Promise<void> {\n new StoreSql(db, logger)\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Command } from 'commander'\nimport { connection } from './store-sql.js'\nimport { migrator } from './migrator.js'\nimport type { StoreConfig } from '@canton-network/core-wallet-store'\nimport { pino } from 'pino'\nimport { bootstrap } from './bootstrap.js'\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport function createCLI(config: StoreConfig): Command {\n const program = new Command()\n\n program\n .command('up')\n .description('Run all pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('down')\n .description('Rollback last migration')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.down()\n await db.destroy()\n })\n\n program\n .command('status')\n .description('Show executed and pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n const pending = await umzug.pending()\n\n console.log('Executed migrations:', executed)\n console.log('Pending migrations:', pending)\n\n await db.destroy()\n })\n\n program\n .command('reset')\n .description('Rollback all migrations and reapply them')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n\n // Rollback all executed migrations in reverse order\n for (const migration of executed.reverse()) {\n await umzug.down({ to: migration.name })\n }\n\n // Reapply all migrations\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('bootstrap')\n .description('Bootstrap DB from config')\n .action(async () => {\n const db = connection(config)\n await bootstrap(db, config, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
1
+ {"version":3,"sources":["../src/schema.ts","../src/store-sql.ts","../src/migrator.ts","../src/bootstrap.ts","../src/cli.ts"],"names":["logger"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { UserId } from '@canton-network/core-wallet-auth'\nimport {\n SigningKey,\n SigningTransaction,\n SigningDriverConfig,\n SigningDriverStatus,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\nexport interface SigningKeyTable {\n id: string\n userId: UserId\n name: string\n publicKey: string\n privateKey: string | null\n metadata: string | null\n createdAt: string\n updatedAt: string\n}\n\nexport interface SigningTransactionTable {\n id: string\n userId: UserId\n hash: string\n signature: string | null\n publicKey: string\n status: string\n metadata: string | null\n createdAt: string\n updatedAt: string\n signedAt: string | null\n}\n\nexport interface SigningDriverConfigTable {\n userId: UserId\n driverId: string\n config: string\n}\n\nexport interface DB {\n migrations: MigrationTable\n signingKeys: SigningKeyTable\n signingTransactions: SigningTransactionTable\n signingDriverConfigs: SigningDriverConfigTable\n}\n\n// Signing driver conversion functions\n\nexport const fromSigningKey = (\n key: SigningKey,\n userId: UserId,\n encrypt?: (data: string) => string\n): SigningKeyTable => {\n return {\n id: key.id,\n userId: userId,\n name: key.name,\n publicKey: key.publicKey,\n privateKey: key.privateKey\n ? encrypt\n ? encrypt(key.privateKey)\n : key.privateKey\n : null,\n metadata: key.metadata ? JSON.stringify(key.metadata) : null,\n createdAt: key.createdAt.toISOString(),\n updatedAt: key.updatedAt.toISOString(),\n }\n}\n\nexport const toSigningKey = (\n table: SigningKeyTable,\n decrypt?: (data: string) => string\n): SigningKey => {\n return {\n id: table.id,\n name: table.name,\n publicKey: table.publicKey,\n ...(table.privateKey\n ? {\n privateKey: decrypt\n ? decrypt(table.privateKey)\n : table.privateKey,\n }\n : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n }\n}\n\nexport const fromSigningTransaction = (\n transaction: SigningTransaction,\n userId: UserId\n): SigningTransactionTable => {\n return {\n id: transaction.id,\n userId: userId,\n hash: transaction.hash,\n signature: transaction.signature || null,\n publicKey: transaction.publicKey,\n status: transaction.status,\n metadata: transaction.metadata\n ? JSON.stringify(transaction.metadata)\n : null,\n createdAt: transaction.createdAt.toISOString(),\n updatedAt: transaction.updatedAt.toISOString(),\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toSigningTransaction = (\n table: SigningTransactionTable\n): SigningTransaction => {\n return {\n id: table.id,\n hash: table.hash,\n ...(table.signature ? { signature: table.signature } : {}),\n publicKey: table.publicKey,\n status: table.status as SigningDriverStatus,\n ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),\n createdAt: new Date(table.createdAt),\n updatedAt: new Date(table.updatedAt),\n ...(table.signedAt ? { signedAt: new Date(table.signedAt) } : {}),\n }\n}\n\nexport const fromSigningDriverConfig = (\n config: SigningDriverConfig,\n userId: UserId\n): SigningDriverConfigTable => {\n return {\n userId: userId,\n driverId: config.driverId,\n config: JSON.stringify(config.config),\n }\n}\n\nexport const toSigningDriverConfig = (\n table: SigningDriverConfigTable\n): SigningDriverConfig => {\n return {\n driverId: table.driverId,\n config: JSON.parse(table.config),\n }\n}\n\nexport const storeConfigSchema = z.object({\n connection: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('memory'),\n }),\n z.object({\n type: z.literal('sqlite'),\n database: z.string(),\n }),\n z.object({\n type: z.literal('postgres'),\n host: z.string(),\n port: z.number(),\n user: z.string(),\n password: z.string(),\n database: z.string(),\n }),\n ]),\n})\n\nexport type StoreConfig = z.infer<typeof storeConfigSchema>\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Logger } from 'pino'\nimport {\n AuthContext,\n UserId,\n AuthAware,\n assertConnected,\n} from '@canton-network/core-wallet-auth'\nimport {\n SigningDriverStore,\n SigningKey,\n SigningTransaction,\n SigningDriverStatus,\n SigningDriverConfig,\n} from '@canton-network/core-signing-lib'\nimport { CamelCasePlugin, Kysely, SqliteDialect, sql } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromSigningKey,\n toSigningKey,\n fromSigningTransaction,\n toSigningTransaction,\n fromSigningDriverConfig,\n toSigningDriverConfig,\n SigningKeyTable,\n StoreConfig,\n} from './schema.js'\n\nexport class StoreSql implements SigningDriverStore, AuthAware<StoreSql> {\n authContext: AuthContext | undefined\n\n constructor(\n private db: Kysely<DB>,\n private logger: Logger,\n authContext?: AuthContext\n ) {\n this.logger = logger.child({ component: 'StoreSql' })\n this.authContext = authContext\n }\n\n withAuthContext(context?: AuthContext): StoreSql {\n return new StoreSql(this.db, this.logger, context)\n }\n\n private assertConnected(): UserId {\n return assertConnected(this.authContext).userId\n }\n\n // SigningDriverStore methods\n async getSigningKey(\n userId: string,\n keyId: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .executeTakeFirst()\n\n return result ? toSigningKey(result) : undefined\n }\n\n async getSigningKeyByPublicKey(\n publicKey: string\n ): Promise<SigningKey | undefined> {\n const result = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('publicKey', '=', publicKey)\n .executeTakeFirst()\n return result ? toSigningKey(result) : undefined\n }\n\n async setSigningKey(userId: string, key: SigningKey): Promise<void> {\n const serialized = fromSigningKey(key, userId)\n\n console.log(\n 'setSigningKey - serialized data:',\n JSON.stringify(serialized, null, 2)\n )\n console.log('setSigningKey - serialized types:', {\n id: typeof serialized.id,\n userId: typeof serialized.userId,\n name: typeof serialized.name,\n publicKey: typeof serialized.publicKey,\n privateKey: typeof serialized.privateKey,\n metadata: typeof serialized.metadata,\n createdAt: typeof serialized.createdAt,\n updatedAt: typeof serialized.updatedAt,\n })\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n name: serialized.name,\n publicKey: serialized.publicKey,\n privateKey: serialized.privateKey,\n metadata: serialized.metadata,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async deleteSigningKey(userId: string, keyId: string): Promise<void> {\n await this.db\n .deleteFrom('signingKeys')\n .where('userId', '=', userId)\n .where('id', '=', keyId)\n .execute()\n }\n\n async listSigningKeys(userId: string): Promise<SigningKey[]> {\n const results = await this.db\n .selectFrom('signingKeys')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .execute()\n\n return results.map((result: SigningKeyTable) => toSigningKey(result))\n }\n\n async getSigningTransaction(\n userId: string,\n txId: string\n ): Promise<SigningTransaction | undefined> {\n const result = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .executeTakeFirst()\n\n return result ? toSigningTransaction(result) : undefined\n }\n\n async setSigningTransaction(\n userId: string,\n transaction: SigningTransaction\n ): Promise<void> {\n const serialized = fromSigningTransaction(transaction, userId)\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: serialized.hash,\n signature: serialized.signature,\n publicKey: serialized.publicKey,\n status: serialized.status,\n metadata: serialized.metadata,\n signedAt: serialized.signedAt,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async updateSigningTransactionStatus(\n userId: string,\n txId: string,\n status: SigningDriverStatus\n ): Promise<void> {\n // Get current transaction to check if it's already signed\n const current = await this.getSigningTransaction(userId, txId)\n\n const updateData: {\n status: string\n updatedAt: string\n signedAt?: string\n } = {\n status,\n updatedAt: new Date().toISOString(),\n }\n\n // Only set signedAt when transitioning to 'signed' if not already set\n // This preserves the audit trail of when it was originally signed\n if (status === 'signed' && !current?.signedAt) {\n updateData.signedAt = new Date().toISOString()\n }\n\n await this.db\n .updateTable('signingTransactions')\n .set(updateData)\n .where('userId', '=', userId)\n .where('id', '=', txId)\n .execute()\n }\n\n async listSigningTransactions(\n userId: string,\n limit: number = 100,\n before?: string\n ): Promise<SigningTransaction[]> {\n let query = this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where('userId', '=', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n\n if (before) {\n const beforeTx = await this.getSigningTransaction(userId, before)\n if (beforeTx) {\n query = query.where(\n 'createdAt',\n '<',\n beforeTx.createdAt.toISOString()\n )\n }\n }\n\n const results = await query.execute()\n return results.map(toSigningTransaction)\n }\n\n async listSigningTransactionsByTxIdsAndPublicKeys(\n txIds: string[],\n publicKeys: string[]\n ): Promise<SigningTransaction[]> {\n const results = await this.db\n .selectFrom('signingTransactions')\n .selectAll()\n .where((eb) =>\n eb.or([\n eb('publicKey', 'in', publicKeys),\n eb('id', 'in', txIds),\n ])\n )\n .execute()\n\n return results.map(toSigningTransaction)\n }\n\n async getSigningDriverConfiguration(\n userId: string,\n driverId: string\n ): Promise<SigningDriverConfig | undefined> {\n const result = await this.db\n .selectFrom('signingDriverConfigs')\n .selectAll()\n .where('userId', '=', userId)\n .where('driverId', '=', driverId)\n .executeTakeFirst()\n\n return result ? toSigningDriverConfig(result) : undefined\n }\n\n async setSigningDriverConfiguration(\n userId: string,\n config: SigningDriverConfig\n ): Promise<void> {\n const serialized = fromSigningDriverConfig(config, userId)\n\n await this.db\n .insertInto('signingDriverConfigs')\n .values(serialized)\n .onConflict((oc) =>\n oc.columns(['userId', 'driverId']).doUpdateSet({\n config: serialized.config,\n })\n )\n .execute()\n }\n\n async setSigningKeys(userId: string, keys: SigningKey[]): Promise<void> {\n if (keys.length === 0) return\n\n const serialized = keys.map((key) => fromSigningKey(key, userId))\n\n await this.db\n .insertInto('signingKeys')\n .values(serialized)\n .onConflict((oc) =>\n // on conflict preserve keys passed to that method\n oc.columns(['userId', 'id']).doUpdateSet({\n name: sql`excluded.name`,\n publicKey: sql`excluded.public_key`,\n privateKey: sql`excluded.private_key`,\n metadata: sql`excluded.metadata`,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n\n async setSigningTransactions(\n userId: string,\n transactions: SigningTransaction[]\n ): Promise<void> {\n if (transactions.length === 0) return\n\n const serialized = transactions.map((tx) =>\n fromSigningTransaction(tx, userId)\n )\n\n await this.db\n .insertInto('signingTransactions')\n .values(serialized)\n .onConflict((oc) =>\n // on conflict preserve transactions passed to that method\n oc.columns(['userId', 'id']).doUpdateSet({\n hash: sql`excluded.hash`,\n signature: sql`excluded.signature`,\n publicKey: sql`excluded.public_key`,\n status: sql`excluded.status`,\n metadata: sql`excluded.metadata`,\n signedAt: sql`excluded.signed_at`,\n updatedAt: new Date().toISOString(),\n })\n )\n .execute()\n }\n}\n\nexport const connection = (config: StoreConfig) => {\n switch (config.connection.type) {\n case 'sqlite':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(config.connection.database),\n }),\n plugins: [new CamelCasePlugin()],\n })\n case 'memory':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(':memory:'),\n }),\n plugins: [new CamelCasePlugin()],\n })\n default:\n throw new Error(\n `Unsupported database type: ${config.connection.type}`\n )\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Umzug, MigrationMeta, UmzugStorage } from 'umzug'\nimport { Kysely } from 'kysely'\nimport { DB } from './schema'\n\nclass KyselyStorage implements UmzugStorage {\n constructor(private db: Kysely<DB>) {}\n\n private async ensureTable() {\n await this.db.schema\n .createTable('migrations')\n .ifNotExists()\n .addColumn('name', 'text', (col) => col.primaryKey())\n .addColumn('executedAt', 'text', (col) => col.notNull())\n .execute()\n }\n\n async executed(): Promise<string[]> {\n await this.ensureTable()\n const rows = await this.db\n .selectFrom('migrations')\n .select('name')\n .execute()\n return rows.map((r) => r.name)\n }\n\n async logMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .insertInto('migrations')\n .values({ name, executedAt: new Date().toISOString() })\n .execute()\n }\n\n async unlogMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .deleteFrom('migrations')\n .where('name', '=', name)\n .execute()\n }\n}\n\nexport const migrator = (db: Kysely<DB>) => {\n const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js'\n const glob = new URL(`./migrations/*.${ext}`, import.meta.url).pathname\n return new Umzug({\n migrations: {\n glob: glob,\n resolve: ({ name, path, context }) => {\n // Dynamic import for ESM\n return {\n name,\n up: async () => {\n console.log(path)\n const { up } = await import(path!)\n return up(context)\n },\n down: async () => {\n const { down } = await import(path!)\n return down(context)\n },\n }\n },\n },\n context: db,\n storage: new KyselyStorage(db),\n logger: console,\n })\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Kysely } from 'kysely'\nimport { StoreSql } from './store-sql.js'\nimport { StoreConfig } from '@canton-network/core-wallet-store'\nimport { Logger } from 'pino'\nimport { DB } from './schema'\n\nexport async function bootstrap(\n db: Kysely<DB>,\n config: StoreConfig,\n logger: Logger\n): Promise<void> {\n new StoreSql(db, logger)\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Command } from 'commander'\nimport { connection } from './store-sql.js'\nimport { migrator } from './migrator.js'\nimport type { StoreConfig } from '@canton-network/core-wallet-store'\nimport { pino } from 'pino'\nimport { bootstrap } from './bootstrap.js'\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport function createCLI(config: StoreConfig): Command {\n const program = new Command()\n\n program\n .command('up')\n .description('Run all pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('down')\n .description('Rollback last migration')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.down()\n await db.destroy()\n })\n\n program\n .command('status')\n .description('Show executed and pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n const pending = await umzug.pending()\n\n console.log('Executed migrations:', executed)\n console.log('Pending migrations:', pending)\n\n await db.destroy()\n })\n\n program\n .command('reset')\n .description('Rollback all migrations and reapply them')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n\n // Rollback all executed migrations in reverse order\n for (const migration of executed.reverse()) {\n await umzug.down({ to: migration.name })\n }\n\n // Reapply all migrations\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('bootstrap')\n .description('Bootstrap DB from config')\n .action(async () => {\n const db = connection(config)\n await bootstrap(db, config, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { Kysely } from 'kysely';
2
+ import { DB } from '../schema.js';
3
+ export declare function up(db: Kysely<DB>): Promise<void>;
4
+ export declare function down(db: Kysely<DB>): Promise<void>;
5
+ //# sourceMappingURL=002-add-signed-at.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002-add-signed-at.d.ts","sourceRoot":"","sources":["../../src/migrations/002-add-signed-at.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxD"}
@@ -0,0 +1,15 @@
1
+ // Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export async function up(db) {
4
+ console.log('Adding signedAt column to signing_transactions table');
5
+ await db.schema
6
+ .alterTable('signing_transactions')
7
+ .addColumn('signed_at', 'text')
8
+ .execute();
9
+ }
10
+ export async function down(db) {
11
+ await db.schema
12
+ .alterTable('signing_transactions')
13
+ .dropColumn('signed_at')
14
+ .execute();
15
+ }
package/dist/schema.d.ts CHANGED
@@ -25,6 +25,7 @@ export interface SigningTransactionTable {
25
25
  metadata: string | null;
26
26
  createdAt: string;
27
27
  updatedAt: string;
28
+ signedAt: string | null;
28
29
  }
29
30
  export interface SigningDriverConfigTable {
30
31
  userId: UserId;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EACH,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EAEtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,UAAU,cAAc;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,uBAAuB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,EAAE;IACf,UAAU,EAAE,cAAc,CAAA;IAC1B,WAAW,EAAE,eAAe,CAAA;IAC5B,mBAAmB,EAAE,uBAAuB,CAAA;IAC5C,oBAAoB,EAAE,wBAAwB,CAAA;CACjD;AAID,eAAO,MAAM,cAAc,GACvB,KAAK,UAAU,EACf,QAAQ,MAAM,EACd,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KACnC,eAeF,CAAA;AAED,eAAO,MAAM,YAAY,GACrB,OAAO,eAAe,EACtB,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KACnC,UAgBF,CAAA;AAED,eAAO,MAAM,sBAAsB,GAC/B,aAAa,kBAAkB,EAC/B,QAAQ,MAAM,KACf,uBAcF,CAAA;AAED,eAAO,MAAM,oBAAoB,GAC7B,OAAO,uBAAuB,KAC/B,kBAWF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAChC,QAAQ,mBAAmB,EAC3B,QAAQ,MAAM,KACf,wBAMF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAC9B,OAAO,wBAAwB,KAChC,mBAKF,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAkB5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EACH,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EAEtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,UAAU,cAAc;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,uBAAuB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,EAAE;IACf,UAAU,EAAE,cAAc,CAAA;IAC1B,WAAW,EAAE,eAAe,CAAA;IAC5B,mBAAmB,EAAE,uBAAuB,CAAA;IAC5C,oBAAoB,EAAE,wBAAwB,CAAA;CACjD;AAID,eAAO,MAAM,cAAc,GACvB,KAAK,UAAU,EACf,QAAQ,MAAM,EACd,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KACnC,eAeF,CAAA;AAED,eAAO,MAAM,YAAY,GACrB,OAAO,eAAe,EACtB,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,KACnC,UAgBF,CAAA;AAED,eAAO,MAAM,sBAAsB,GAC/B,aAAa,kBAAkB,EAC/B,QAAQ,MAAM,KACf,uBAeF,CAAA;AAED,eAAO,MAAM,oBAAoB,GAC7B,OAAO,uBAAuB,KAC/B,kBAYF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAChC,QAAQ,mBAAmB,EAC3B,QAAQ,MAAM,KACf,wBAMF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAC9B,OAAO,wBAAwB,KAChC,mBAKF,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAkB5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA"}
package/dist/schema.js CHANGED
@@ -48,6 +48,7 @@ export const fromSigningTransaction = (transaction, userId) => {
48
48
  : null,
49
49
  createdAt: transaction.createdAt.toISOString(),
50
50
  updatedAt: transaction.updatedAt.toISOString(),
51
+ signedAt: transaction.signedAt?.toISOString() || null,
51
52
  };
52
53
  };
53
54
  export const toSigningTransaction = (table) => {
@@ -60,6 +61,7 @@ export const toSigningTransaction = (table) => {
60
61
  ...(table.metadata ? { metadata: JSON.parse(table.metadata) } : {}),
61
62
  createdAt: new Date(table.createdAt),
62
63
  updatedAt: new Date(table.updatedAt),
64
+ ...(table.signedAt ? { signedAt: new Date(table.signedAt) } : {}),
63
65
  };
64
66
  };
65
67
  export const fromSigningDriverConfig = (config, userId) => {
@@ -1 +1 @@
1
- {"version":3,"file":"store-sql.d.ts","sourceRoot":"","sources":["../src/store-sql.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EACH,WAAW,EAEX,SAAS,EAEZ,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACH,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAmB,MAAM,EAAiB,MAAM,QAAQ,CAAA;AAE/D,OAAO,EACH,EAAE,EAQF,WAAW,EACd,MAAM,aAAa,CAAA;AAEpB,qBAAa,QAAS,YAAW,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC;IAIhE,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;IAJlB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;gBAGxB,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,MAAM,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,WAAW;IAM7B,eAAe,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ;IAIhD,OAAO,CAAC,eAAe;IAKjB,aAAa,CACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAW5B,wBAAwB,CAC1B,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAS5B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAWtD,qBAAqB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAWpC,qBAAqB,CACvB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,GAChC,OAAO,CAAC,IAAI,CAAC;IAmBV,8BAA8B,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IASV,uBAAuB,CACzB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAY,EACnB,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuB1B,2CAA2C,CAC7C,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe1B,6BAA6B,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAWrC,6BAA6B,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAcV,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjE,sBAAsB,CACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,kBAAkB,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC;CAsBnB;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,eAqB7C,CAAA"}
1
+ {"version":3,"file":"store-sql.d.ts","sourceRoot":"","sources":["../src/store-sql.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EACH,WAAW,EAEX,SAAS,EAEZ,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACH,kBAAkB,EAClB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAmB,MAAM,EAAsB,MAAM,QAAQ,CAAA;AAEpE,OAAO,EACH,EAAE,EAQF,WAAW,EACd,MAAM,aAAa,CAAA;AAEpB,qBAAa,QAAS,YAAW,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC;IAIhE,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;IAJlB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;gBAGxB,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,MAAM,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,WAAW;IAM7B,eAAe,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ;IAIhD,OAAO,CAAC,eAAe;IAKjB,aAAa,CACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAW5B,wBAAwB,CAC1B,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAS5B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAWtD,qBAAqB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAWpC,qBAAqB,CACvB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,GAChC,OAAO,CAAC,IAAI,CAAC;IAoBV,8BAA8B,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IA2BV,uBAAuB,CACzB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAY,EACnB,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuB1B,2CAA2C,CAC7C,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe1B,6BAA6B,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAWrC,6BAA6B,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAcV,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjE,sBAAsB,CACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,kBAAkB,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC;CAwBnB;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,eAqB7C,CAAA"}
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "@canton-network/core-signing-store-sql",
3
- "version": "0.14.0",
3
+ "version": "0.15.1",
4
4
  "type": "module",
5
- "repository": "github:hyperledger-labs/splice-wallet-kernel",
6
5
  "description": "SQL implementation of the Store API",
7
6
  "license": "Apache-2.0",
8
7
  "author": "Marc Juchli <marc.juchli@digitalasset.com>",
@@ -25,29 +24,34 @@
25
24
  "clean": "tsc -b --clean; rm -rf dist"
26
25
  },
27
26
  "dependencies": {
28
- "@canton-network/core-ledger-client": "^0.20.0",
29
- "@canton-network/core-rpc-errors": "^0.10.0",
30
- "@canton-network/core-signing-lib": "^0.15.0",
31
- "@canton-network/core-wallet-auth": "^0.14.0",
32
- "@canton-network/core-wallet-store": "^0.13.0",
33
- "better-sqlite3": "^12.2.0",
34
- "commander": "^14.0.0",
35
- "kysely": "^0.28.5",
36
- "pino": "^10.0.0",
27
+ "@canton-network/core-ledger-client": "^0.20.2",
28
+ "@canton-network/core-rpc-errors": "^0.10.2",
29
+ "@canton-network/core-signing-lib": "^0.16.0",
30
+ "@canton-network/core-wallet-auth": "^0.14.2",
31
+ "@canton-network/core-wallet-store": "^0.15.0",
32
+ "better-sqlite3": "^12.4.6",
33
+ "commander": "^14.0.2",
34
+ "kysely": "^0.28.8",
35
+ "pino": "^10.1.0",
37
36
  "umzug": "^3.8.2",
38
- "zod": "^4.1.12"
37
+ "zod": "^4.1.13"
39
38
  },
40
39
  "devDependencies": {
41
- "@swc/core": "^1.11.31",
40
+ "@swc/core": "^1.15.3",
42
41
  "@types/better-sqlite3": "^7.6.13",
43
- "tsup": "^8.5.0",
44
- "tsx": "^4.20.4",
45
- "typescript": "^5.8.3"
42
+ "tsup": "^8.5.1",
43
+ "tsx": "^4.20.6",
44
+ "typescript": "^5.9.3"
46
45
  },
47
46
  "files": [
48
47
  "dist/**"
49
48
  ],
50
49
  "publishConfig": {
51
50
  "access": "public"
51
+ },
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/hyperledger-labs/splice-wallet-kernel.git",
55
+ "directory": "core/signing-store-sql"
52
56
  }
53
57
  }