@canton-network/core-wallet-store-sql 0.25.0 → 0.26.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/dist/index.cjs +37 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +37 -16
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +10 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +21 -8
- package/dist/store-sql.d.ts +1 -1
- package/dist/store-sql.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -88,22 +88,41 @@ var fromNetwork = (network, userId) => {
|
|
|
88
88
|
};
|
|
89
89
|
};
|
|
90
90
|
var fromWallet = (wallet, userId) => {
|
|
91
|
+
const { externalTxId, topologyTransactions, ...rest } = wallet;
|
|
91
92
|
return {
|
|
92
|
-
...
|
|
93
|
+
...rest,
|
|
93
94
|
primary: wallet.primary ? 1 : 0,
|
|
94
95
|
userId,
|
|
95
96
|
disabled: wallet.disabled !== void 0 && wallet.disabled ? 1 : 0,
|
|
96
|
-
...wallet.
|
|
97
|
+
...wallet.reason !== void 0 && { reason: wallet.reason },
|
|
98
|
+
...externalTxId && externalTxId !== "" && { externalTxId },
|
|
99
|
+
...topologyTransactions && topologyTransactions !== "" && { topologyTransactions }
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
var toWalletUpdateProperties = (params) => {
|
|
103
|
+
const {
|
|
104
|
+
status,
|
|
105
|
+
externalTxId,
|
|
106
|
+
topologyTransactions,
|
|
107
|
+
disabled,
|
|
108
|
+
reason,
|
|
109
|
+
primary
|
|
110
|
+
} = params;
|
|
111
|
+
return {
|
|
112
|
+
...status !== void 0 && { status },
|
|
113
|
+
...externalTxId !== void 0 && { externalTxId },
|
|
114
|
+
...topologyTransactions !== void 0 && { topologyTransactions },
|
|
115
|
+
...primary !== void 0 && { primary: primary ? 1 : 0 },
|
|
116
|
+
...disabled !== void 0 && { disabled: disabled ? 1 : 0 },
|
|
117
|
+
...reason !== void 0 && { reason }
|
|
97
118
|
};
|
|
98
119
|
};
|
|
99
120
|
var toWalletStatus = (status) => {
|
|
100
121
|
if (status === "allocated") return "allocated";
|
|
122
|
+
if (status === "removed") return "removed";
|
|
101
123
|
return "initialized";
|
|
102
124
|
};
|
|
103
125
|
var toWallet = (table) => {
|
|
104
|
-
if (table.disabled === 1 && table.reason === void 0) {
|
|
105
|
-
throw new Error(`Missing wallet disabled reason: ${table.partyId}`);
|
|
106
|
-
}
|
|
107
126
|
return {
|
|
108
127
|
primary: Boolean(table.primary),
|
|
109
128
|
status: toWalletStatus(table.status),
|
|
@@ -120,7 +139,7 @@ var toWallet = (table) => {
|
|
|
120
139
|
...table.topologyTransactions !== void 0 && {
|
|
121
140
|
topologyTransactions: table.topologyTransactions
|
|
122
141
|
},
|
|
123
|
-
...table.
|
|
142
|
+
...table.reason !== void 0 && {
|
|
124
143
|
reason: table.reason
|
|
125
144
|
}
|
|
126
145
|
};
|
|
@@ -187,10 +206,14 @@ var StoreSql = class _StoreSql {
|
|
|
187
206
|
networkId: table.networkId,
|
|
188
207
|
signingProviderId: table.signingProviderId,
|
|
189
208
|
userId: table.userId,
|
|
190
|
-
externalTxId: table.externalTxId ?? "",
|
|
191
|
-
topologyTransactions: table.topologyTransactions ?? "",
|
|
192
209
|
status: table.status ?? "",
|
|
193
210
|
disabled: table.disabled ?? 0,
|
|
211
|
+
...table.externalTxId && table.externalTxId !== "" && {
|
|
212
|
+
externalTxId: table.externalTxId
|
|
213
|
+
},
|
|
214
|
+
...table.topologyTransactions && table.topologyTransactions !== "" && {
|
|
215
|
+
topologyTransactions: table.topologyTransactions
|
|
216
|
+
},
|
|
194
217
|
...table.reason !== void 0 && {
|
|
195
218
|
reason: table.reason
|
|
196
219
|
}
|
|
@@ -248,7 +271,7 @@ var StoreSql = class _StoreSql {
|
|
|
248
271
|
`Wallet with partyId "${wallet.partyId}" networkId "${wallet.networkId}" userId "${userId}" already exists`
|
|
249
272
|
);
|
|
250
273
|
}
|
|
251
|
-
if (
|
|
274
|
+
if (!wallet.disabled && wallet.status === "allocated" && !wallets.some((wallet2) => wallet2.primary)) {
|
|
252
275
|
wallet.primary = true;
|
|
253
276
|
}
|
|
254
277
|
await this.db.transaction().execute(async (trx) => {
|
|
@@ -264,17 +287,15 @@ var StoreSql = class _StoreSql {
|
|
|
264
287
|
await trx.insertInto("wallets").values(fromWallet(wallet, userId)).execute();
|
|
265
288
|
});
|
|
266
289
|
}
|
|
267
|
-
async updateWallet({
|
|
268
|
-
|
|
269
|
-
partyId,
|
|
270
|
-
networkId,
|
|
271
|
-
externalTxId
|
|
272
|
-
}) {
|
|
290
|
+
async updateWallet(params) {
|
|
291
|
+
const { partyId, networkId } = params;
|
|
273
292
|
this.logger.info("Updating wallet");
|
|
274
293
|
const userId = this.assertConnected();
|
|
294
|
+
const updates = toWalletUpdateProperties(params);
|
|
295
|
+
if (Object.keys(updates).length === 0) return;
|
|
275
296
|
const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id;
|
|
276
297
|
await this.db.transaction().execute(async (trx) => {
|
|
277
|
-
await trx.updateTable("wallets").set(
|
|
298
|
+
await trx.updateTable("wallets").set(updates).where(
|
|
278
299
|
(eb) => eb.and([
|
|
279
300
|
eb("partyId", "=", partyId),
|
|
280
301
|
eb("networkId", "=", targetNetworkId),
|
package/dist/index.cjs.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":["authSchema","logger","assertConnected","Kysely","SqliteDialect","Database","CamelCasePlugin","PostgresDialect","pg","Umzug","pino","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { authSchema, Idp, UserId } from '@canton-network/core-wallet-auth'\nimport {\n Wallet,\n Transaction,\n Session,\n Network,\n WalletStatus,\n} from '@canton-network/core-wallet-store'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\ninterface IdpTable {\n id: string\n type: 'oauth' | 'self_signed'\n issuer: string\n configUrl: string | undefined\n}\n\ninterface NetworkTable {\n id: string\n name: string\n synchronizerId: string | null // retrieved at runtime if null\n description: string\n ledgerApiBaseUrl: string\n identityProviderId: string\n userId: UserId | undefined // global if undefined\n\n auth: string // json stringified\n adminAuth: string | undefined // json stringified\n}\n\ninterface WalletTable {\n primary: number\n partyId: string\n hint: string\n publicKey: string\n namespace: string\n networkId: string\n signingProviderId: string\n userId: UserId\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n disabled: number\n reason?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n origin: string | null\n userId: UserId\n createdAt: string | null\n signedAt: string | null\n}\n\ninterface SessionTable extends Session {\n id: string\n userId: UserId\n}\n\nexport interface DB {\n migrations: MigrationTable\n idps: IdpTable\n networks: NetworkTable\n wallets: WalletTable\n transactions: TransactionTable\n sessions: SessionTable\n}\n\nexport const toIdp = (table: IdpTable): Idp => {\n switch (table.type) {\n case 'oauth': {\n if (!table.configUrl) {\n throw new Error(`Missing configUrl for oauth IdP: ${table.id}`)\n }\n\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n }\n }\n case 'self_signed':\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n }\n }\n}\n\nexport const fromIdp = (idp: Idp): IdpTable => {\n switch (idp.type) {\n case 'oauth':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: idp.configUrl,\n }\n case 'self_signed':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: undefined,\n }\n }\n}\n\nexport const toNetwork = (table: NetworkTable): Network => {\n return {\n name: table.name,\n id: table.id,\n synchronizerId: table.synchronizerId ?? undefined,\n identityProviderId: table.identityProviderId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: authSchema.parse(\n typeof table.auth === 'string' ? JSON.parse(table.auth) : table.auth\n ),\n adminAuth: table.adminAuth\n ? authSchema.parse(\n typeof table.adminAuth === 'string'\n ? JSON.parse(table.adminAuth)\n : table.adminAuth\n )\n : undefined,\n }\n}\n\nexport const fromNetwork = (\n network: Network,\n userId?: UserId\n): NetworkTable => {\n return {\n name: network.name,\n id: network.id,\n synchronizerId: network.synchronizerId ?? null,\n description: network.description,\n ledgerApiBaseUrl: network.ledgerApi.baseUrl,\n userId: userId,\n identityProviderId: network.identityProviderId,\n auth: JSON.stringify(network.auth),\n adminAuth: network.adminAuth\n ? JSON.stringify(network.adminAuth)\n : undefined,\n }\n}\n\nexport const fromWallet = (wallet: Wallet, userId: UserId): WalletTable => {\n return {\n ...wallet,\n primary: wallet.primary ? 1 : 0,\n userId: userId,\n disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,\n ...(wallet.disabled === true &&\n wallet.reason !== undefined && { reason: wallet.reason }),\n }\n}\n\nexport const toWalletStatus = (status?: string): WalletStatus => {\n if (status === 'allocated') return 'allocated'\n return 'initialized'\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n if (table.disabled === 1 && table.reason === undefined) {\n throw new Error(`Missing wallet disabled reason: ${table.partyId}`)\n }\n return {\n primary: Boolean(table.primary),\n status: toWalletStatus(table.status),\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n disabled: table.disabled === 1,\n ...(table.externalTxId !== undefined && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions !== undefined && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.disabled === 1 &&\n table.reason !== undefined && {\n reason: table.reason,\n }),\n }\n}\n\nexport const fromTransaction = (\n transaction: Transaction,\n userId: UserId\n): TransactionTable => {\n return {\n ...transaction,\n payload: transaction.payload\n ? JSON.stringify(transaction.payload)\n : undefined,\n origin: transaction.origin || null,\n userId: userId,\n createdAt: transaction.createdAt?.toISOString() || null,\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n const result: Transaction = {\n commandId: table.commandId,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n preparedTransaction: table.preparedTransaction,\n preparedTransactionHash: table.preparedTransactionHash,\n payload: table.payload ? JSON.parse(table.payload) : undefined,\n origin: table.origin || null,\n }\n\n if (table.createdAt) {\n result.createdAt = new Date(table.createdAt)\n }\n\n if (table.signedAt) {\n result.signedAt = new Date(table.signedAt)\n }\n\n return result\n}\n","// Copyright (c) 2025-2026 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 Idp,\n} from '@canton-network/core-wallet-auth'\nimport {\n Store as BaseStore,\n Wallet,\n PartyId,\n Session,\n WalletFilter,\n Transaction,\n Network,\n StoreConfig,\n UpdateWallet,\n CurrentNetworkWalletFilter,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, PostgresDialect, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromIdp,\n fromNetwork,\n fromTransaction,\n fromWallet,\n toIdp,\n toNetwork,\n toTransaction,\n toWallet,\n} from './schema.js'\nimport pg from 'pg'\n\nexport class StoreSql implements BaseStore, 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 // Wallet methods\n\n async getAllWallets(filter: WalletFilter = {}): Promise<Array<Wallet>> {\n const userId = this.assertConnected()\n const { networkIds, signingProviderIds } = filter\n const networkIdSet = networkIds ? new Set(networkIds) : null\n const signingProviderIdSet = signingProviderIds\n ? new Set(signingProviderIds)\n : null\n\n const wallets = await this.db\n .selectFrom('wallets')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n\n return wallets\n .filter((wallet) => {\n const matchedNetworkIds = networkIdSet\n ? networkIdSet.has(wallet.networkId)\n : true\n const matchedSigningProviderIds = signingProviderIdSet\n ? signingProviderIdSet.has(wallet.signingProviderId)\n : true\n return matchedNetworkIds && matchedSigningProviderIds\n })\n .map((table) =>\n toWallet({\n primary: table.primary,\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n userId: table.userId,\n externalTxId: table.externalTxId ?? '',\n topologyTransactions: table.topologyTransactions ?? '',\n status: table.status ?? '',\n disabled: table.disabled ?? 0,\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n })\n )\n }\n\n async getWallets(\n filter: CurrentNetworkWalletFilter = {}\n ): Promise<Array<Wallet>> {\n const network = await this.getCurrentNetwork()\n return this.getAllWallets({\n ...filter,\n networkIds: [network.id],\n })\n }\n\n async getPrimaryWallet(): Promise<Wallet | undefined> {\n const wallets = await this.getWallets()\n return wallets.find((w) => w.primary === true)\n }\n\n async setPrimaryWallet(partyId: PartyId): Promise<void> {\n const network = await this.getCurrentNetwork()\n const userId = this.assertConnected()\n const wallets = await this.getWallets()\n\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(\n `Wallet with partyId \"${partyId}\" not found in network \"${network.id}\"`\n )\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n // Unset primary for current network only\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', primary.partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n // Set new primary for current network\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async addWallet(wallet: Wallet): Promise<void> {\n this.logger.info('Adding wallet')\n const userId = this.assertConnected()\n\n const wallets = await this.getWallets()\n if (\n wallets.some(\n (w) =>\n w.partyId === wallet.partyId &&\n w.networkId === wallet.networkId\n )\n ) {\n throw new Error(\n `Wallet with partyId \"${wallet.partyId}\" networkId \"${wallet.networkId}\" userId \"${userId}\" already exists`\n )\n }\n\n if (wallets.length === 0) {\n // If this is the first wallet, set it as primary automatically\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n if (wallet.primary) {\n // If the new wallet is primary, set all others in the same network and for this user to non-primary\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('primary', '=', 1),\n eb('networkId', '=', wallet.networkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n await trx\n .insertInto('wallets')\n .values(fromWallet(wallet, userId))\n .execute()\n })\n }\n\n async updateWallet({\n status,\n partyId,\n networkId,\n externalTxId,\n }: UpdateWallet): Promise<void> {\n this.logger.info('Updating wallet')\n const userId = this.assertConnected()\n\n // Use provided networkId or get current network from session\n const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .updateTable('wallets')\n .set({ status, externalTxId })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', targetNetworkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async removeWallet(partyId: PartyId): Promise<void> {\n this.logger.info('Removing wallet')\n const userId = this.assertConnected()\n\n // Remove wallet from current network only\n const network = await this.getCurrentNetwork()\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('wallets')\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n // Session methods\n async getSession(): Promise<Session | undefined> {\n const userId = this.assertConnected()\n const sessions = await this.db\n .selectFrom('sessions')\n .selectAll()\n .where('userId', '=', userId)\n .executeTakeFirst()\n return sessions\n }\n\n async setSession(session: Session): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const deleted = await trx\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n this.logger.debug(deleted, 'Deleted old session')\n const inserted = await trx\n .insertInto('sessions')\n .values({ ...session, userId })\n .execute()\n this.logger.debug(inserted, 'Inserted new session')\n })\n }\n\n async removeSession(): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n }\n\n // IDP methods\n\n async getIdp(idpId: string): Promise<Idp> {\n this.assertConnected()\n\n const idps = await this.listIdps()\n if (!idps) throw new Error('No IDPs available')\n\n const idp = idps.find((n) => n.id === idpId)\n if (!idp) throw new Error(`IDP \"${idpId}\" not found`)\n return idp\n }\n\n async listIdps(): Promise<Array<Idp>> {\n // All IDPs are global for now -- TO-DO: user-specific IDPs\n const query = this.db.selectFrom('idps').selectAll()\n\n const idps = await query.execute()\n return idps.map((table) => toIdp(table))\n }\n\n async updateIdp(idp: Idp): Promise<void> {\n // todo: check and compare userid of existing idp\n await this.db.transaction().execute(async (trx) => {\n const idpEntry = fromIdp(idp)\n this.logger.info(idpEntry, 'Updating idp table')\n await trx\n .updateTable('idps')\n .set(idpEntry)\n .where('id', '=', idp.id)\n .execute()\n })\n }\n\n async addIdp(idp: Idp): Promise<void> {\n await this.db.transaction().execute(async (trx) => {\n const idpAlreadyExists = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idp.id)\n .executeTakeFirst()\n if (idpAlreadyExists) {\n throw new Error(`IDP ${idp.id} already exists`)\n } else {\n await trx.insertInto('idps').values(fromIdp(idp)).execute()\n }\n })\n }\n\n async removeIdp(idpId: string): Promise<void> {\n const networks = await this.listNetworks()\n if (networks.some((n) => n.identityProviderId === idpId)) {\n throw new Error(\n `Cannot delete IDP ${idpId} as it is in use by existing networks`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const idp = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idpId)\n .executeTakeFirst()\n if (!idp) {\n throw new Error(`IDP ${idpId} does not exists`)\n }\n await trx.deleteFrom('idps').where('id', '=', idpId).execute()\n })\n }\n\n // Network methods\n async getNetwork(networkId: string): Promise<Network> {\n this.assertConnected()\n\n const networks = await this.listNetworks()\n if (!networks) throw new Error('No networks available')\n\n const network = networks.find((n) => n.id === networkId)\n if (!network) throw new Error(`Network \"${networkId}\" not found`)\n return network\n }\n\n async getCurrentNetwork(): Promise<Network> {\n const session = await this.getSession()\n if (!session) {\n throw new Error('No session found')\n }\n const networkId = session.network\n if (!networkId) {\n throw new Error('No current network set in session')\n }\n\n const networks = await this.listNetworks()\n const network = networks.find((n) => n.id === networkId)\n if (!network) {\n throw new Error(`Network \"${networkId}\" not found`)\n }\n return network\n }\n\n async listNetworks(): Promise<Array<Network>> {\n let query = this.db.selectFrom('networks').selectAll()\n\n if (this.authContext) {\n const userId = this.assertConnected()\n query = query.where((eb) =>\n eb.or([\n eb('userId', 'is', null), // Global networks\n eb('userId', '=', userId), // User-specific networks\n ])\n )\n } else {\n query = query.where('userId', 'is', null) // Only global networks\n }\n\n const networks = await query.execute()\n return networks.map((table) => toNetwork(table))\n }\n\n async updateNetwork(network: Network): Promise<void> {\n // todo: check and compare idpId of existing network\n this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n // we do not set a userId for now and leave all networks global when updating\n const networkEntry = fromNetwork(network, undefined)\n this.logger.info(networkEntry, 'Updating network table')\n await trx\n .updateTable('networks')\n .set(networkEntry)\n .where('id', '=', network.id)\n .execute()\n })\n }\n\n async addNetwork(network: Network): Promise<void> {\n const userId = this.authContext?.userId\n const idps = await this.listIdps()\n const networkIdp = idps.find(\n (idp) => idp.id === network.identityProviderId\n )\n\n if (!networkIdp) {\n throw new Error(\n `Identity provider \"${network.identityProviderId}\" not found`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const networkAlreadyExists = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', network.id)\n .executeTakeFirst()\n if (networkAlreadyExists) {\n throw new Error(`Network ${network.id} already exists`)\n } else {\n await trx\n .insertInto('networks')\n .values(fromNetwork(network, userId))\n .execute()\n }\n })\n }\n\n async removeNetwork(networkId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const network = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', networkId)\n .executeTakeFirst()\n if (!network) {\n throw new Error(`Network ${networkId} does not exists`)\n }\n if (network.userId !== userId) {\n throw new Error(\n `Network ${networkId} is not owned by user ${userId}`\n )\n }\n await trx\n .deleteFrom('networks')\n .where('id', '=', networkId)\n .execute()\n })\n }\n\n // Transaction methods\n async setTransaction(transaction: Transaction): Promise<void> {\n const userId = this.assertConnected()\n\n const existing = await this.getTransaction(transaction.commandId)\n if (existing) {\n await this.db\n .updateTable('transactions')\n .set(fromTransaction(transaction, userId))\n .where('commandId', '=', transaction.commandId)\n .execute()\n } else {\n await this.db\n .insertInto('transactions')\n .values(fromTransaction(transaction, userId))\n .execute()\n }\n }\n\n async getTransaction(commandId: string): Promise<Transaction | undefined> {\n const userId = this.assertConnected()\n const transaction = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\n ])\n )\n .executeTakeFirst()\n return transaction ? toTransaction(transaction) : undefined\n }\n\n async listTransactions(): Promise<Array<Transaction>> {\n const userId = this.assertConnected()\n const transactions = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n return transactions.map((table) => toTransaction(table))\n }\n\n async removeTransaction(commandId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('transactions')\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\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 'postgres':\n return new Kysely<DB>({\n dialect: new PostgresDialect({\n pool: new pg.Pool({\n database: config.connection.database,\n user: config.connection.user,\n password: config.connection.password,\n port: config.connection.port,\n host: config.connection.host,\n }),\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 }\n}\n","// Copyright (c) 2025-2026 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-2026 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 { BootstrapConfig } 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: BootstrapConfig,\n logger: Logger\n): Promise<void> {\n const store = new StoreSql(db, logger)\n\n // Load all IDPs from config into the store\n await Promise.all(config.idps.map((idp) => store.addIdp(idp)))\n\n // Load all networks from config into the store\n await Promise.all(\n config.networks.map((network) => store.addNetwork(network))\n )\n}\n","// Copyright (c) 2025-2026 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 {\n StoreConfig,\n BootstrapConfig,\n} 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(\n config: StoreConfig,\n bootstrapConfig?: BootstrapConfig\n): 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 if (!bootstrapConfig) {\n throw new Error(\n 'Bootstrap config (idps/networks) is required for the bootstrap command'\n )\n }\n const db = connection(config)\n await bootstrap(db, bootstrapConfig, 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":["authSchema","logger","assertConnected","wallet","Kysely","SqliteDialect","Database","CamelCasePlugin","PostgresDialect","pg","Umzug","pino","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { authSchema, Idp, UserId } from '@canton-network/core-wallet-auth'\nimport {\n Wallet,\n Transaction,\n Session,\n Network,\n WalletStatus,\n UpdateWallet,\n} from '@canton-network/core-wallet-store'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\ninterface IdpTable {\n id: string\n type: 'oauth' | 'self_signed'\n issuer: string\n configUrl: string | undefined\n}\n\ninterface NetworkTable {\n id: string\n name: string\n synchronizerId: string | null // retrieved at runtime if null\n description: string\n ledgerApiBaseUrl: string\n identityProviderId: string\n userId: UserId | undefined // global if undefined\n\n auth: string // json stringified\n adminAuth: string | undefined // json stringified\n}\n\ninterface WalletTable {\n primary: number\n partyId: string\n hint: string\n publicKey: string\n namespace: string\n networkId: string\n signingProviderId: string\n userId: UserId\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n disabled: number\n reason?: string\n}\ninterface UpdateWalletProperties {\n primary?: number\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n disabled?: number\n reason?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n origin: string | null\n userId: UserId\n createdAt: string | null\n signedAt: string | null\n}\n\ninterface SessionTable extends Session {\n id: string\n userId: UserId\n}\n\nexport interface DB {\n migrations: MigrationTable\n idps: IdpTable\n networks: NetworkTable\n wallets: WalletTable\n transactions: TransactionTable\n sessions: SessionTable\n}\n\nexport const toIdp = (table: IdpTable): Idp => {\n switch (table.type) {\n case 'oauth': {\n if (!table.configUrl) {\n throw new Error(`Missing configUrl for oauth IdP: ${table.id}`)\n }\n\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n }\n }\n case 'self_signed':\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n }\n }\n}\n\nexport const fromIdp = (idp: Idp): IdpTable => {\n switch (idp.type) {\n case 'oauth':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: idp.configUrl,\n }\n case 'self_signed':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: undefined,\n }\n }\n}\n\nexport const toNetwork = (table: NetworkTable): Network => {\n return {\n name: table.name,\n id: table.id,\n synchronizerId: table.synchronizerId ?? undefined,\n identityProviderId: table.identityProviderId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: authSchema.parse(\n typeof table.auth === 'string' ? JSON.parse(table.auth) : table.auth\n ),\n adminAuth: table.adminAuth\n ? authSchema.parse(\n typeof table.adminAuth === 'string'\n ? JSON.parse(table.adminAuth)\n : table.adminAuth\n )\n : undefined,\n }\n}\n\nexport const fromNetwork = (\n network: Network,\n userId?: UserId\n): NetworkTable => {\n return {\n name: network.name,\n id: network.id,\n synchronizerId: network.synchronizerId ?? null,\n description: network.description,\n ledgerApiBaseUrl: network.ledgerApi.baseUrl,\n userId: userId,\n identityProviderId: network.identityProviderId,\n auth: JSON.stringify(network.auth),\n adminAuth: network.adminAuth\n ? JSON.stringify(network.adminAuth)\n : undefined,\n }\n}\n\nexport const fromWallet = (wallet: Wallet, userId: UserId): WalletTable => {\n const { externalTxId, topologyTransactions, ...rest } = wallet\n return {\n ...rest,\n primary: wallet.primary ? 1 : 0,\n userId: userId,\n disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,\n ...(wallet.reason !== undefined && { reason: wallet.reason }),\n ...(externalTxId && externalTxId !== '' && { externalTxId }),\n ...(topologyTransactions &&\n topologyTransactions !== '' && { topologyTransactions }),\n }\n}\n\n// only update fields that are explicitly provided to prevent data loss\nexport const toWalletUpdateProperties = (\n params: UpdateWallet\n): UpdateWalletProperties => {\n const {\n status,\n externalTxId,\n topologyTransactions,\n disabled,\n reason,\n primary,\n } = params\n return {\n ...(status !== undefined && { status }),\n ...(externalTxId !== undefined && { externalTxId }),\n ...(topologyTransactions !== undefined && { topologyTransactions }),\n ...(primary !== undefined && { primary: primary ? 1 : 0 }),\n ...(disabled !== undefined && { disabled: disabled ? 1 : 0 }),\n ...(reason !== undefined && { reason }),\n }\n}\n\nexport const toWalletStatus = (status?: string): WalletStatus => {\n if (status === 'allocated') return 'allocated'\n if (status === 'removed') return 'removed'\n return 'initialized'\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n return {\n primary: Boolean(table.primary),\n status: toWalletStatus(table.status),\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n disabled: table.disabled === 1,\n ...(table.externalTxId !== undefined && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions !== undefined && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n }\n}\n\nexport const fromTransaction = (\n transaction: Transaction,\n userId: UserId\n): TransactionTable => {\n return {\n ...transaction,\n payload: transaction.payload\n ? JSON.stringify(transaction.payload)\n : undefined,\n origin: transaction.origin || null,\n userId: userId,\n createdAt: transaction.createdAt?.toISOString() || null,\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n const result: Transaction = {\n commandId: table.commandId,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n preparedTransaction: table.preparedTransaction,\n preparedTransactionHash: table.preparedTransactionHash,\n payload: table.payload ? JSON.parse(table.payload) : undefined,\n origin: table.origin || null,\n }\n\n if (table.createdAt) {\n result.createdAt = new Date(table.createdAt)\n }\n\n if (table.signedAt) {\n result.signedAt = new Date(table.signedAt)\n }\n\n return result\n}\n","// Copyright (c) 2025-2026 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 Idp,\n} from '@canton-network/core-wallet-auth'\nimport {\n Store as BaseStore,\n Wallet,\n PartyId,\n Session,\n WalletFilter,\n Transaction,\n Network,\n StoreConfig,\n UpdateWallet,\n CurrentNetworkWalletFilter,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, PostgresDialect, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromIdp,\n fromNetwork,\n fromTransaction,\n fromWallet,\n toWalletUpdateProperties,\n toIdp,\n toNetwork,\n toTransaction,\n toWallet,\n} from './schema.js'\nimport pg from 'pg'\n\nexport class StoreSql implements BaseStore, 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 // Wallet methods\n\n async getAllWallets(filter: WalletFilter = {}): Promise<Array<Wallet>> {\n const userId = this.assertConnected()\n const { networkIds, signingProviderIds } = filter\n const networkIdSet = networkIds ? new Set(networkIds) : null\n const signingProviderIdSet = signingProviderIds\n ? new Set(signingProviderIds)\n : null\n\n const wallets = await this.db\n .selectFrom('wallets')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n\n return wallets\n .filter((wallet) => {\n const matchedNetworkIds = networkIdSet\n ? networkIdSet.has(wallet.networkId)\n : true\n const matchedSigningProviderIds = signingProviderIdSet\n ? signingProviderIdSet.has(wallet.signingProviderId)\n : true\n return matchedNetworkIds && matchedSigningProviderIds\n })\n .map((table) =>\n toWallet({\n primary: table.primary,\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n userId: table.userId,\n status: table.status ?? '',\n disabled: table.disabled ?? 0,\n ...(table.externalTxId &&\n table.externalTxId !== '' && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions &&\n table.topologyTransactions !== '' && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n })\n )\n }\n\n async getWallets(\n filter: CurrentNetworkWalletFilter = {}\n ): Promise<Array<Wallet>> {\n const network = await this.getCurrentNetwork()\n return this.getAllWallets({\n ...filter,\n networkIds: [network.id],\n })\n }\n\n async getPrimaryWallet(): Promise<Wallet | undefined> {\n const wallets = await this.getWallets()\n return wallets.find((w) => w.primary === true)\n }\n\n async setPrimaryWallet(partyId: PartyId): Promise<void> {\n const network = await this.getCurrentNetwork()\n const userId = this.assertConnected()\n const wallets = await this.getWallets()\n\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(\n `Wallet with partyId \"${partyId}\" not found in network \"${network.id}\"`\n )\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n // Unset primary for current network only\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', primary.partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n // Set new primary for current network\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async addWallet(wallet: Wallet): Promise<void> {\n this.logger.info('Adding wallet')\n const userId = this.assertConnected()\n\n const wallets = await this.getWallets()\n if (\n wallets.some(\n (w) =>\n w.partyId === wallet.partyId &&\n w.networkId === wallet.networkId\n )\n ) {\n throw new Error(\n `Wallet with partyId \"${wallet.partyId}\" networkId \"${wallet.networkId}\" userId \"${userId}\" already exists`\n )\n }\n\n if (\n !wallet.disabled &&\n wallet.status === 'allocated' &&\n !wallets.some((wallet) => wallet.primary)\n ) {\n // If there is no primary wallet yet, set current one as primary (unless disabled or not allocated).\n // In regular case it would be the first added wallet.\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n if (wallet.primary) {\n // If the new wallet is primary, set all others in the same network and for this user to non-primary\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('primary', '=', 1),\n eb('networkId', '=', wallet.networkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n await trx\n .insertInto('wallets')\n .values(fromWallet(wallet, userId))\n .execute()\n })\n }\n\n async updateWallet(params: UpdateWallet): Promise<void> {\n const { partyId, networkId } = params\n this.logger.info('Updating wallet')\n const userId = this.assertConnected()\n\n const updates = toWalletUpdateProperties(params)\n if (Object.keys(updates).length === 0) return\n\n const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .updateTable('wallets')\n .set(updates)\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', targetNetworkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async removeWallet(partyId: PartyId): Promise<void> {\n this.logger.info('Removing wallet')\n const userId = this.assertConnected()\n\n // Remove wallet from current network only\n const network = await this.getCurrentNetwork()\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('wallets')\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n // Session methods\n async getSession(): Promise<Session | undefined> {\n const userId = this.assertConnected()\n const sessions = await this.db\n .selectFrom('sessions')\n .selectAll()\n .where('userId', '=', userId)\n .executeTakeFirst()\n return sessions\n }\n\n async setSession(session: Session): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const deleted = await trx\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n this.logger.debug(deleted, 'Deleted old session')\n const inserted = await trx\n .insertInto('sessions')\n .values({ ...session, userId })\n .execute()\n this.logger.debug(inserted, 'Inserted new session')\n })\n }\n\n async removeSession(): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n }\n\n // IDP methods\n\n async getIdp(idpId: string): Promise<Idp> {\n this.assertConnected()\n\n const idps = await this.listIdps()\n if (!idps) throw new Error('No IDPs available')\n\n const idp = idps.find((n) => n.id === idpId)\n if (!idp) throw new Error(`IDP \"${idpId}\" not found`)\n return idp\n }\n\n async listIdps(): Promise<Array<Idp>> {\n // All IDPs are global for now -- TO-DO: user-specific IDPs\n const query = this.db.selectFrom('idps').selectAll()\n\n const idps = await query.execute()\n return idps.map((table) => toIdp(table))\n }\n\n async updateIdp(idp: Idp): Promise<void> {\n // todo: check and compare userid of existing idp\n await this.db.transaction().execute(async (trx) => {\n const idpEntry = fromIdp(idp)\n this.logger.info(idpEntry, 'Updating idp table')\n await trx\n .updateTable('idps')\n .set(idpEntry)\n .where('id', '=', idp.id)\n .execute()\n })\n }\n\n async addIdp(idp: Idp): Promise<void> {\n await this.db.transaction().execute(async (trx) => {\n const idpAlreadyExists = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idp.id)\n .executeTakeFirst()\n if (idpAlreadyExists) {\n throw new Error(`IDP ${idp.id} already exists`)\n } else {\n await trx.insertInto('idps').values(fromIdp(idp)).execute()\n }\n })\n }\n\n async removeIdp(idpId: string): Promise<void> {\n const networks = await this.listNetworks()\n if (networks.some((n) => n.identityProviderId === idpId)) {\n throw new Error(\n `Cannot delete IDP ${idpId} as it is in use by existing networks`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const idp = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idpId)\n .executeTakeFirst()\n if (!idp) {\n throw new Error(`IDP ${idpId} does not exists`)\n }\n await trx.deleteFrom('idps').where('id', '=', idpId).execute()\n })\n }\n\n // Network methods\n async getNetwork(networkId: string): Promise<Network> {\n this.assertConnected()\n\n const networks = await this.listNetworks()\n if (!networks) throw new Error('No networks available')\n\n const network = networks.find((n) => n.id === networkId)\n if (!network) throw new Error(`Network \"${networkId}\" not found`)\n return network\n }\n\n async getCurrentNetwork(): Promise<Network> {\n const session = await this.getSession()\n if (!session) {\n throw new Error('No session found')\n }\n const networkId = session.network\n if (!networkId) {\n throw new Error('No current network set in session')\n }\n\n const networks = await this.listNetworks()\n const network = networks.find((n) => n.id === networkId)\n if (!network) {\n throw new Error(`Network \"${networkId}\" not found`)\n }\n return network\n }\n\n async listNetworks(): Promise<Array<Network>> {\n let query = this.db.selectFrom('networks').selectAll()\n\n if (this.authContext) {\n const userId = this.assertConnected()\n query = query.where((eb) =>\n eb.or([\n eb('userId', 'is', null), // Global networks\n eb('userId', '=', userId), // User-specific networks\n ])\n )\n } else {\n query = query.where('userId', 'is', null) // Only global networks\n }\n\n const networks = await query.execute()\n return networks.map((table) => toNetwork(table))\n }\n\n async updateNetwork(network: Network): Promise<void> {\n // todo: check and compare idpId of existing network\n this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n // we do not set a userId for now and leave all networks global when updating\n const networkEntry = fromNetwork(network, undefined)\n this.logger.info(networkEntry, 'Updating network table')\n await trx\n .updateTable('networks')\n .set(networkEntry)\n .where('id', '=', network.id)\n .execute()\n })\n }\n\n async addNetwork(network: Network): Promise<void> {\n const userId = this.authContext?.userId\n const idps = await this.listIdps()\n const networkIdp = idps.find(\n (idp) => idp.id === network.identityProviderId\n )\n\n if (!networkIdp) {\n throw new Error(\n `Identity provider \"${network.identityProviderId}\" not found`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const networkAlreadyExists = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', network.id)\n .executeTakeFirst()\n if (networkAlreadyExists) {\n throw new Error(`Network ${network.id} already exists`)\n } else {\n await trx\n .insertInto('networks')\n .values(fromNetwork(network, userId))\n .execute()\n }\n })\n }\n\n async removeNetwork(networkId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const network = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', networkId)\n .executeTakeFirst()\n if (!network) {\n throw new Error(`Network ${networkId} does not exists`)\n }\n if (network.userId !== userId) {\n throw new Error(\n `Network ${networkId} is not owned by user ${userId}`\n )\n }\n await trx\n .deleteFrom('networks')\n .where('id', '=', networkId)\n .execute()\n })\n }\n\n // Transaction methods\n async setTransaction(transaction: Transaction): Promise<void> {\n const userId = this.assertConnected()\n\n const existing = await this.getTransaction(transaction.commandId)\n if (existing) {\n await this.db\n .updateTable('transactions')\n .set(fromTransaction(transaction, userId))\n .where('commandId', '=', transaction.commandId)\n .execute()\n } else {\n await this.db\n .insertInto('transactions')\n .values(fromTransaction(transaction, userId))\n .execute()\n }\n }\n\n async getTransaction(commandId: string): Promise<Transaction | undefined> {\n const userId = this.assertConnected()\n const transaction = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\n ])\n )\n .executeTakeFirst()\n return transaction ? toTransaction(transaction) : undefined\n }\n\n async listTransactions(): Promise<Array<Transaction>> {\n const userId = this.assertConnected()\n const transactions = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n return transactions.map((table) => toTransaction(table))\n }\n\n async removeTransaction(commandId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('transactions')\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\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 'postgres':\n return new Kysely<DB>({\n dialect: new PostgresDialect({\n pool: new pg.Pool({\n database: config.connection.database,\n user: config.connection.user,\n password: config.connection.password,\n port: config.connection.port,\n host: config.connection.host,\n }),\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 }\n}\n","// Copyright (c) 2025-2026 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-2026 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 { BootstrapConfig } 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: BootstrapConfig,\n logger: Logger\n): Promise<void> {\n const store = new StoreSql(db, logger)\n\n // Load all IDPs from config into the store\n await Promise.all(config.idps.map((idp) => store.addIdp(idp)))\n\n // Load all networks from config into the store\n await Promise.all(\n config.networks.map((network) => store.addNetwork(network))\n )\n}\n","// Copyright (c) 2025-2026 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 {\n StoreConfig,\n BootstrapConfig,\n} 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(\n config: StoreConfig,\n bootstrapConfig?: BootstrapConfig\n): 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 if (!bootstrapConfig) {\n throw new Error(\n 'Bootstrap config (idps/networks) is required for the bootstrap command'\n )\n }\n const db = connection(config)\n await bootstrap(db, bootstrapConfig, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -80,22 +80,41 @@ var fromNetwork = (network, userId) => {
|
|
|
80
80
|
};
|
|
81
81
|
};
|
|
82
82
|
var fromWallet = (wallet, userId) => {
|
|
83
|
+
const { externalTxId, topologyTransactions, ...rest } = wallet;
|
|
83
84
|
return {
|
|
84
|
-
...
|
|
85
|
+
...rest,
|
|
85
86
|
primary: wallet.primary ? 1 : 0,
|
|
86
87
|
userId,
|
|
87
88
|
disabled: wallet.disabled !== void 0 && wallet.disabled ? 1 : 0,
|
|
88
|
-
...wallet.
|
|
89
|
+
...wallet.reason !== void 0 && { reason: wallet.reason },
|
|
90
|
+
...externalTxId && externalTxId !== "" && { externalTxId },
|
|
91
|
+
...topologyTransactions && topologyTransactions !== "" && { topologyTransactions }
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
var toWalletUpdateProperties = (params) => {
|
|
95
|
+
const {
|
|
96
|
+
status,
|
|
97
|
+
externalTxId,
|
|
98
|
+
topologyTransactions,
|
|
99
|
+
disabled,
|
|
100
|
+
reason,
|
|
101
|
+
primary
|
|
102
|
+
} = params;
|
|
103
|
+
return {
|
|
104
|
+
...status !== void 0 && { status },
|
|
105
|
+
...externalTxId !== void 0 && { externalTxId },
|
|
106
|
+
...topologyTransactions !== void 0 && { topologyTransactions },
|
|
107
|
+
...primary !== void 0 && { primary: primary ? 1 : 0 },
|
|
108
|
+
...disabled !== void 0 && { disabled: disabled ? 1 : 0 },
|
|
109
|
+
...reason !== void 0 && { reason }
|
|
89
110
|
};
|
|
90
111
|
};
|
|
91
112
|
var toWalletStatus = (status) => {
|
|
92
113
|
if (status === "allocated") return "allocated";
|
|
114
|
+
if (status === "removed") return "removed";
|
|
93
115
|
return "initialized";
|
|
94
116
|
};
|
|
95
117
|
var toWallet = (table) => {
|
|
96
|
-
if (table.disabled === 1 && table.reason === void 0) {
|
|
97
|
-
throw new Error(`Missing wallet disabled reason: ${table.partyId}`);
|
|
98
|
-
}
|
|
99
118
|
return {
|
|
100
119
|
primary: Boolean(table.primary),
|
|
101
120
|
status: toWalletStatus(table.status),
|
|
@@ -112,7 +131,7 @@ var toWallet = (table) => {
|
|
|
112
131
|
...table.topologyTransactions !== void 0 && {
|
|
113
132
|
topologyTransactions: table.topologyTransactions
|
|
114
133
|
},
|
|
115
|
-
...table.
|
|
134
|
+
...table.reason !== void 0 && {
|
|
116
135
|
reason: table.reason
|
|
117
136
|
}
|
|
118
137
|
};
|
|
@@ -179,10 +198,14 @@ var StoreSql = class _StoreSql {
|
|
|
179
198
|
networkId: table.networkId,
|
|
180
199
|
signingProviderId: table.signingProviderId,
|
|
181
200
|
userId: table.userId,
|
|
182
|
-
externalTxId: table.externalTxId ?? "",
|
|
183
|
-
topologyTransactions: table.topologyTransactions ?? "",
|
|
184
201
|
status: table.status ?? "",
|
|
185
202
|
disabled: table.disabled ?? 0,
|
|
203
|
+
...table.externalTxId && table.externalTxId !== "" && {
|
|
204
|
+
externalTxId: table.externalTxId
|
|
205
|
+
},
|
|
206
|
+
...table.topologyTransactions && table.topologyTransactions !== "" && {
|
|
207
|
+
topologyTransactions: table.topologyTransactions
|
|
208
|
+
},
|
|
186
209
|
...table.reason !== void 0 && {
|
|
187
210
|
reason: table.reason
|
|
188
211
|
}
|
|
@@ -240,7 +263,7 @@ var StoreSql = class _StoreSql {
|
|
|
240
263
|
`Wallet with partyId "${wallet.partyId}" networkId "${wallet.networkId}" userId "${userId}" already exists`
|
|
241
264
|
);
|
|
242
265
|
}
|
|
243
|
-
if (
|
|
266
|
+
if (!wallet.disabled && wallet.status === "allocated" && !wallets.some((wallet2) => wallet2.primary)) {
|
|
244
267
|
wallet.primary = true;
|
|
245
268
|
}
|
|
246
269
|
await this.db.transaction().execute(async (trx) => {
|
|
@@ -256,17 +279,15 @@ var StoreSql = class _StoreSql {
|
|
|
256
279
|
await trx.insertInto("wallets").values(fromWallet(wallet, userId)).execute();
|
|
257
280
|
});
|
|
258
281
|
}
|
|
259
|
-
async updateWallet({
|
|
260
|
-
|
|
261
|
-
partyId,
|
|
262
|
-
networkId,
|
|
263
|
-
externalTxId
|
|
264
|
-
}) {
|
|
282
|
+
async updateWallet(params) {
|
|
283
|
+
const { partyId, networkId } = params;
|
|
265
284
|
this.logger.info("Updating wallet");
|
|
266
285
|
const userId = this.assertConnected();
|
|
286
|
+
const updates = toWalletUpdateProperties(params);
|
|
287
|
+
if (Object.keys(updates).length === 0) return;
|
|
267
288
|
const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id;
|
|
268
289
|
await this.db.transaction().execute(async (trx) => {
|
|
269
|
-
await trx.updateTable("wallets").set(
|
|
290
|
+
await trx.updateTable("wallets").set(updates).where(
|
|
270
291
|
(eb) => eb.and([
|
|
271
292
|
eb("partyId", "=", partyId),
|
|
272
293
|
eb("networkId", "=", targetNetworkId),
|
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-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { authSchema, Idp, UserId } from '@canton-network/core-wallet-auth'\nimport {\n Wallet,\n Transaction,\n Session,\n Network,\n WalletStatus,\n} from '@canton-network/core-wallet-store'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\ninterface IdpTable {\n id: string\n type: 'oauth' | 'self_signed'\n issuer: string\n configUrl: string | undefined\n}\n\ninterface NetworkTable {\n id: string\n name: string\n synchronizerId: string | null // retrieved at runtime if null\n description: string\n ledgerApiBaseUrl: string\n identityProviderId: string\n userId: UserId | undefined // global if undefined\n\n auth: string // json stringified\n adminAuth: string | undefined // json stringified\n}\n\ninterface WalletTable {\n primary: number\n partyId: string\n hint: string\n publicKey: string\n namespace: string\n networkId: string\n signingProviderId: string\n userId: UserId\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n disabled: number\n reason?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n origin: string | null\n userId: UserId\n createdAt: string | null\n signedAt: string | null\n}\n\ninterface SessionTable extends Session {\n id: string\n userId: UserId\n}\n\nexport interface DB {\n migrations: MigrationTable\n idps: IdpTable\n networks: NetworkTable\n wallets: WalletTable\n transactions: TransactionTable\n sessions: SessionTable\n}\n\nexport const toIdp = (table: IdpTable): Idp => {\n switch (table.type) {\n case 'oauth': {\n if (!table.configUrl) {\n throw new Error(`Missing configUrl for oauth IdP: ${table.id}`)\n }\n\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n }\n }\n case 'self_signed':\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n }\n }\n}\n\nexport const fromIdp = (idp: Idp): IdpTable => {\n switch (idp.type) {\n case 'oauth':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: idp.configUrl,\n }\n case 'self_signed':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: undefined,\n }\n }\n}\n\nexport const toNetwork = (table: NetworkTable): Network => {\n return {\n name: table.name,\n id: table.id,\n synchronizerId: table.synchronizerId ?? undefined,\n identityProviderId: table.identityProviderId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: authSchema.parse(\n typeof table.auth === 'string' ? JSON.parse(table.auth) : table.auth\n ),\n adminAuth: table.adminAuth\n ? authSchema.parse(\n typeof table.adminAuth === 'string'\n ? JSON.parse(table.adminAuth)\n : table.adminAuth\n )\n : undefined,\n }\n}\n\nexport const fromNetwork = (\n network: Network,\n userId?: UserId\n): NetworkTable => {\n return {\n name: network.name,\n id: network.id,\n synchronizerId: network.synchronizerId ?? null,\n description: network.description,\n ledgerApiBaseUrl: network.ledgerApi.baseUrl,\n userId: userId,\n identityProviderId: network.identityProviderId,\n auth: JSON.stringify(network.auth),\n adminAuth: network.adminAuth\n ? JSON.stringify(network.adminAuth)\n : undefined,\n }\n}\n\nexport const fromWallet = (wallet: Wallet, userId: UserId): WalletTable => {\n return {\n ...wallet,\n primary: wallet.primary ? 1 : 0,\n userId: userId,\n disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,\n ...(wallet.disabled === true &&\n wallet.reason !== undefined && { reason: wallet.reason }),\n }\n}\n\nexport const toWalletStatus = (status?: string): WalletStatus => {\n if (status === 'allocated') return 'allocated'\n return 'initialized'\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n if (table.disabled === 1 && table.reason === undefined) {\n throw new Error(`Missing wallet disabled reason: ${table.partyId}`)\n }\n return {\n primary: Boolean(table.primary),\n status: toWalletStatus(table.status),\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n disabled: table.disabled === 1,\n ...(table.externalTxId !== undefined && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions !== undefined && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.disabled === 1 &&\n table.reason !== undefined && {\n reason: table.reason,\n }),\n }\n}\n\nexport const fromTransaction = (\n transaction: Transaction,\n userId: UserId\n): TransactionTable => {\n return {\n ...transaction,\n payload: transaction.payload\n ? JSON.stringify(transaction.payload)\n : undefined,\n origin: transaction.origin || null,\n userId: userId,\n createdAt: transaction.createdAt?.toISOString() || null,\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n const result: Transaction = {\n commandId: table.commandId,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n preparedTransaction: table.preparedTransaction,\n preparedTransactionHash: table.preparedTransactionHash,\n payload: table.payload ? JSON.parse(table.payload) : undefined,\n origin: table.origin || null,\n }\n\n if (table.createdAt) {\n result.createdAt = new Date(table.createdAt)\n }\n\n if (table.signedAt) {\n result.signedAt = new Date(table.signedAt)\n }\n\n return result\n}\n","// Copyright (c) 2025-2026 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 Idp,\n} from '@canton-network/core-wallet-auth'\nimport {\n Store as BaseStore,\n Wallet,\n PartyId,\n Session,\n WalletFilter,\n Transaction,\n Network,\n StoreConfig,\n UpdateWallet,\n CurrentNetworkWalletFilter,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, PostgresDialect, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromIdp,\n fromNetwork,\n fromTransaction,\n fromWallet,\n toIdp,\n toNetwork,\n toTransaction,\n toWallet,\n} from './schema.js'\nimport pg from 'pg'\n\nexport class StoreSql implements BaseStore, 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 // Wallet methods\n\n async getAllWallets(filter: WalletFilter = {}): Promise<Array<Wallet>> {\n const userId = this.assertConnected()\n const { networkIds, signingProviderIds } = filter\n const networkIdSet = networkIds ? new Set(networkIds) : null\n const signingProviderIdSet = signingProviderIds\n ? new Set(signingProviderIds)\n : null\n\n const wallets = await this.db\n .selectFrom('wallets')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n\n return wallets\n .filter((wallet) => {\n const matchedNetworkIds = networkIdSet\n ? networkIdSet.has(wallet.networkId)\n : true\n const matchedSigningProviderIds = signingProviderIdSet\n ? signingProviderIdSet.has(wallet.signingProviderId)\n : true\n return matchedNetworkIds && matchedSigningProviderIds\n })\n .map((table) =>\n toWallet({\n primary: table.primary,\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n userId: table.userId,\n externalTxId: table.externalTxId ?? '',\n topologyTransactions: table.topologyTransactions ?? '',\n status: table.status ?? '',\n disabled: table.disabled ?? 0,\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n })\n )\n }\n\n async getWallets(\n filter: CurrentNetworkWalletFilter = {}\n ): Promise<Array<Wallet>> {\n const network = await this.getCurrentNetwork()\n return this.getAllWallets({\n ...filter,\n networkIds: [network.id],\n })\n }\n\n async getPrimaryWallet(): Promise<Wallet | undefined> {\n const wallets = await this.getWallets()\n return wallets.find((w) => w.primary === true)\n }\n\n async setPrimaryWallet(partyId: PartyId): Promise<void> {\n const network = await this.getCurrentNetwork()\n const userId = this.assertConnected()\n const wallets = await this.getWallets()\n\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(\n `Wallet with partyId \"${partyId}\" not found in network \"${network.id}\"`\n )\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n // Unset primary for current network only\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', primary.partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n // Set new primary for current network\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async addWallet(wallet: Wallet): Promise<void> {\n this.logger.info('Adding wallet')\n const userId = this.assertConnected()\n\n const wallets = await this.getWallets()\n if (\n wallets.some(\n (w) =>\n w.partyId === wallet.partyId &&\n w.networkId === wallet.networkId\n )\n ) {\n throw new Error(\n `Wallet with partyId \"${wallet.partyId}\" networkId \"${wallet.networkId}\" userId \"${userId}\" already exists`\n )\n }\n\n if (wallets.length === 0) {\n // If this is the first wallet, set it as primary automatically\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n if (wallet.primary) {\n // If the new wallet is primary, set all others in the same network and for this user to non-primary\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('primary', '=', 1),\n eb('networkId', '=', wallet.networkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n await trx\n .insertInto('wallets')\n .values(fromWallet(wallet, userId))\n .execute()\n })\n }\n\n async updateWallet({\n status,\n partyId,\n networkId,\n externalTxId,\n }: UpdateWallet): Promise<void> {\n this.logger.info('Updating wallet')\n const userId = this.assertConnected()\n\n // Use provided networkId or get current network from session\n const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .updateTable('wallets')\n .set({ status, externalTxId })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', targetNetworkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async removeWallet(partyId: PartyId): Promise<void> {\n this.logger.info('Removing wallet')\n const userId = this.assertConnected()\n\n // Remove wallet from current network only\n const network = await this.getCurrentNetwork()\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('wallets')\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n // Session methods\n async getSession(): Promise<Session | undefined> {\n const userId = this.assertConnected()\n const sessions = await this.db\n .selectFrom('sessions')\n .selectAll()\n .where('userId', '=', userId)\n .executeTakeFirst()\n return sessions\n }\n\n async setSession(session: Session): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const deleted = await trx\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n this.logger.debug(deleted, 'Deleted old session')\n const inserted = await trx\n .insertInto('sessions')\n .values({ ...session, userId })\n .execute()\n this.logger.debug(inserted, 'Inserted new session')\n })\n }\n\n async removeSession(): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n }\n\n // IDP methods\n\n async getIdp(idpId: string): Promise<Idp> {\n this.assertConnected()\n\n const idps = await this.listIdps()\n if (!idps) throw new Error('No IDPs available')\n\n const idp = idps.find((n) => n.id === idpId)\n if (!idp) throw new Error(`IDP \"${idpId}\" not found`)\n return idp\n }\n\n async listIdps(): Promise<Array<Idp>> {\n // All IDPs are global for now -- TO-DO: user-specific IDPs\n const query = this.db.selectFrom('idps').selectAll()\n\n const idps = await query.execute()\n return idps.map((table) => toIdp(table))\n }\n\n async updateIdp(idp: Idp): Promise<void> {\n // todo: check and compare userid of existing idp\n await this.db.transaction().execute(async (trx) => {\n const idpEntry = fromIdp(idp)\n this.logger.info(idpEntry, 'Updating idp table')\n await trx\n .updateTable('idps')\n .set(idpEntry)\n .where('id', '=', idp.id)\n .execute()\n })\n }\n\n async addIdp(idp: Idp): Promise<void> {\n await this.db.transaction().execute(async (trx) => {\n const idpAlreadyExists = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idp.id)\n .executeTakeFirst()\n if (idpAlreadyExists) {\n throw new Error(`IDP ${idp.id} already exists`)\n } else {\n await trx.insertInto('idps').values(fromIdp(idp)).execute()\n }\n })\n }\n\n async removeIdp(idpId: string): Promise<void> {\n const networks = await this.listNetworks()\n if (networks.some((n) => n.identityProviderId === idpId)) {\n throw new Error(\n `Cannot delete IDP ${idpId} as it is in use by existing networks`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const idp = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idpId)\n .executeTakeFirst()\n if (!idp) {\n throw new Error(`IDP ${idpId} does not exists`)\n }\n await trx.deleteFrom('idps').where('id', '=', idpId).execute()\n })\n }\n\n // Network methods\n async getNetwork(networkId: string): Promise<Network> {\n this.assertConnected()\n\n const networks = await this.listNetworks()\n if (!networks) throw new Error('No networks available')\n\n const network = networks.find((n) => n.id === networkId)\n if (!network) throw new Error(`Network \"${networkId}\" not found`)\n return network\n }\n\n async getCurrentNetwork(): Promise<Network> {\n const session = await this.getSession()\n if (!session) {\n throw new Error('No session found')\n }\n const networkId = session.network\n if (!networkId) {\n throw new Error('No current network set in session')\n }\n\n const networks = await this.listNetworks()\n const network = networks.find((n) => n.id === networkId)\n if (!network) {\n throw new Error(`Network \"${networkId}\" not found`)\n }\n return network\n }\n\n async listNetworks(): Promise<Array<Network>> {\n let query = this.db.selectFrom('networks').selectAll()\n\n if (this.authContext) {\n const userId = this.assertConnected()\n query = query.where((eb) =>\n eb.or([\n eb('userId', 'is', null), // Global networks\n eb('userId', '=', userId), // User-specific networks\n ])\n )\n } else {\n query = query.where('userId', 'is', null) // Only global networks\n }\n\n const networks = await query.execute()\n return networks.map((table) => toNetwork(table))\n }\n\n async updateNetwork(network: Network): Promise<void> {\n // todo: check and compare idpId of existing network\n this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n // we do not set a userId for now and leave all networks global when updating\n const networkEntry = fromNetwork(network, undefined)\n this.logger.info(networkEntry, 'Updating network table')\n await trx\n .updateTable('networks')\n .set(networkEntry)\n .where('id', '=', network.id)\n .execute()\n })\n }\n\n async addNetwork(network: Network): Promise<void> {\n const userId = this.authContext?.userId\n const idps = await this.listIdps()\n const networkIdp = idps.find(\n (idp) => idp.id === network.identityProviderId\n )\n\n if (!networkIdp) {\n throw new Error(\n `Identity provider \"${network.identityProviderId}\" not found`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const networkAlreadyExists = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', network.id)\n .executeTakeFirst()\n if (networkAlreadyExists) {\n throw new Error(`Network ${network.id} already exists`)\n } else {\n await trx\n .insertInto('networks')\n .values(fromNetwork(network, userId))\n .execute()\n }\n })\n }\n\n async removeNetwork(networkId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const network = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', networkId)\n .executeTakeFirst()\n if (!network) {\n throw new Error(`Network ${networkId} does not exists`)\n }\n if (network.userId !== userId) {\n throw new Error(\n `Network ${networkId} is not owned by user ${userId}`\n )\n }\n await trx\n .deleteFrom('networks')\n .where('id', '=', networkId)\n .execute()\n })\n }\n\n // Transaction methods\n async setTransaction(transaction: Transaction): Promise<void> {\n const userId = this.assertConnected()\n\n const existing = await this.getTransaction(transaction.commandId)\n if (existing) {\n await this.db\n .updateTable('transactions')\n .set(fromTransaction(transaction, userId))\n .where('commandId', '=', transaction.commandId)\n .execute()\n } else {\n await this.db\n .insertInto('transactions')\n .values(fromTransaction(transaction, userId))\n .execute()\n }\n }\n\n async getTransaction(commandId: string): Promise<Transaction | undefined> {\n const userId = this.assertConnected()\n const transaction = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\n ])\n )\n .executeTakeFirst()\n return transaction ? toTransaction(transaction) : undefined\n }\n\n async listTransactions(): Promise<Array<Transaction>> {\n const userId = this.assertConnected()\n const transactions = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n return transactions.map((table) => toTransaction(table))\n }\n\n async removeTransaction(commandId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('transactions')\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\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 'postgres':\n return new Kysely<DB>({\n dialect: new PostgresDialect({\n pool: new pg.Pool({\n database: config.connection.database,\n user: config.connection.user,\n password: config.connection.password,\n port: config.connection.port,\n host: config.connection.host,\n }),\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 }\n}\n","// Copyright (c) 2025-2026 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-2026 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 { BootstrapConfig } 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: BootstrapConfig,\n logger: Logger\n): Promise<void> {\n const store = new StoreSql(db, logger)\n\n // Load all IDPs from config into the store\n await Promise.all(config.idps.map((idp) => store.addIdp(idp)))\n\n // Load all networks from config into the store\n await Promise.all(\n config.networks.map((network) => store.addNetwork(network))\n )\n}\n","// Copyright (c) 2025-2026 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 {\n StoreConfig,\n BootstrapConfig,\n} 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(\n config: StoreConfig,\n bootstrapConfig?: BootstrapConfig\n): 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 if (!bootstrapConfig) {\n throw new Error(\n 'Bootstrap config (idps/networks) is required for the bootstrap command'\n )\n }\n const db = connection(config)\n await bootstrap(db, bootstrapConfig, 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","wallet"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { authSchema, Idp, UserId } from '@canton-network/core-wallet-auth'\nimport {\n Wallet,\n Transaction,\n Session,\n Network,\n WalletStatus,\n UpdateWallet,\n} from '@canton-network/core-wallet-store'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\ninterface IdpTable {\n id: string\n type: 'oauth' | 'self_signed'\n issuer: string\n configUrl: string | undefined\n}\n\ninterface NetworkTable {\n id: string\n name: string\n synchronizerId: string | null // retrieved at runtime if null\n description: string\n ledgerApiBaseUrl: string\n identityProviderId: string\n userId: UserId | undefined // global if undefined\n\n auth: string // json stringified\n adminAuth: string | undefined // json stringified\n}\n\ninterface WalletTable {\n primary: number\n partyId: string\n hint: string\n publicKey: string\n namespace: string\n networkId: string\n signingProviderId: string\n userId: UserId\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n disabled: number\n reason?: string\n}\ninterface UpdateWalletProperties {\n primary?: number\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n disabled?: number\n reason?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n origin: string | null\n userId: UserId\n createdAt: string | null\n signedAt: string | null\n}\n\ninterface SessionTable extends Session {\n id: string\n userId: UserId\n}\n\nexport interface DB {\n migrations: MigrationTable\n idps: IdpTable\n networks: NetworkTable\n wallets: WalletTable\n transactions: TransactionTable\n sessions: SessionTable\n}\n\nexport const toIdp = (table: IdpTable): Idp => {\n switch (table.type) {\n case 'oauth': {\n if (!table.configUrl) {\n throw new Error(`Missing configUrl for oauth IdP: ${table.id}`)\n }\n\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n }\n }\n case 'self_signed':\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n }\n }\n}\n\nexport const fromIdp = (idp: Idp): IdpTable => {\n switch (idp.type) {\n case 'oauth':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: idp.configUrl,\n }\n case 'self_signed':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: undefined,\n }\n }\n}\n\nexport const toNetwork = (table: NetworkTable): Network => {\n return {\n name: table.name,\n id: table.id,\n synchronizerId: table.synchronizerId ?? undefined,\n identityProviderId: table.identityProviderId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: authSchema.parse(\n typeof table.auth === 'string' ? JSON.parse(table.auth) : table.auth\n ),\n adminAuth: table.adminAuth\n ? authSchema.parse(\n typeof table.adminAuth === 'string'\n ? JSON.parse(table.adminAuth)\n : table.adminAuth\n )\n : undefined,\n }\n}\n\nexport const fromNetwork = (\n network: Network,\n userId?: UserId\n): NetworkTable => {\n return {\n name: network.name,\n id: network.id,\n synchronizerId: network.synchronizerId ?? null,\n description: network.description,\n ledgerApiBaseUrl: network.ledgerApi.baseUrl,\n userId: userId,\n identityProviderId: network.identityProviderId,\n auth: JSON.stringify(network.auth),\n adminAuth: network.adminAuth\n ? JSON.stringify(network.adminAuth)\n : undefined,\n }\n}\n\nexport const fromWallet = (wallet: Wallet, userId: UserId): WalletTable => {\n const { externalTxId, topologyTransactions, ...rest } = wallet\n return {\n ...rest,\n primary: wallet.primary ? 1 : 0,\n userId: userId,\n disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,\n ...(wallet.reason !== undefined && { reason: wallet.reason }),\n ...(externalTxId && externalTxId !== '' && { externalTxId }),\n ...(topologyTransactions &&\n topologyTransactions !== '' && { topologyTransactions }),\n }\n}\n\n// only update fields that are explicitly provided to prevent data loss\nexport const toWalletUpdateProperties = (\n params: UpdateWallet\n): UpdateWalletProperties => {\n const {\n status,\n externalTxId,\n topologyTransactions,\n disabled,\n reason,\n primary,\n } = params\n return {\n ...(status !== undefined && { status }),\n ...(externalTxId !== undefined && { externalTxId }),\n ...(topologyTransactions !== undefined && { topologyTransactions }),\n ...(primary !== undefined && { primary: primary ? 1 : 0 }),\n ...(disabled !== undefined && { disabled: disabled ? 1 : 0 }),\n ...(reason !== undefined && { reason }),\n }\n}\n\nexport const toWalletStatus = (status?: string): WalletStatus => {\n if (status === 'allocated') return 'allocated'\n if (status === 'removed') return 'removed'\n return 'initialized'\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n return {\n primary: Boolean(table.primary),\n status: toWalletStatus(table.status),\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n disabled: table.disabled === 1,\n ...(table.externalTxId !== undefined && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions !== undefined && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n }\n}\n\nexport const fromTransaction = (\n transaction: Transaction,\n userId: UserId\n): TransactionTable => {\n return {\n ...transaction,\n payload: transaction.payload\n ? JSON.stringify(transaction.payload)\n : undefined,\n origin: transaction.origin || null,\n userId: userId,\n createdAt: transaction.createdAt?.toISOString() || null,\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n const result: Transaction = {\n commandId: table.commandId,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n preparedTransaction: table.preparedTransaction,\n preparedTransactionHash: table.preparedTransactionHash,\n payload: table.payload ? JSON.parse(table.payload) : undefined,\n origin: table.origin || null,\n }\n\n if (table.createdAt) {\n result.createdAt = new Date(table.createdAt)\n }\n\n if (table.signedAt) {\n result.signedAt = new Date(table.signedAt)\n }\n\n return result\n}\n","// Copyright (c) 2025-2026 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 Idp,\n} from '@canton-network/core-wallet-auth'\nimport {\n Store as BaseStore,\n Wallet,\n PartyId,\n Session,\n WalletFilter,\n Transaction,\n Network,\n StoreConfig,\n UpdateWallet,\n CurrentNetworkWalletFilter,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, PostgresDialect, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromIdp,\n fromNetwork,\n fromTransaction,\n fromWallet,\n toWalletUpdateProperties,\n toIdp,\n toNetwork,\n toTransaction,\n toWallet,\n} from './schema.js'\nimport pg from 'pg'\n\nexport class StoreSql implements BaseStore, 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 // Wallet methods\n\n async getAllWallets(filter: WalletFilter = {}): Promise<Array<Wallet>> {\n const userId = this.assertConnected()\n const { networkIds, signingProviderIds } = filter\n const networkIdSet = networkIds ? new Set(networkIds) : null\n const signingProviderIdSet = signingProviderIds\n ? new Set(signingProviderIds)\n : null\n\n const wallets = await this.db\n .selectFrom('wallets')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n\n return wallets\n .filter((wallet) => {\n const matchedNetworkIds = networkIdSet\n ? networkIdSet.has(wallet.networkId)\n : true\n const matchedSigningProviderIds = signingProviderIdSet\n ? signingProviderIdSet.has(wallet.signingProviderId)\n : true\n return matchedNetworkIds && matchedSigningProviderIds\n })\n .map((table) =>\n toWallet({\n primary: table.primary,\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n userId: table.userId,\n status: table.status ?? '',\n disabled: table.disabled ?? 0,\n ...(table.externalTxId &&\n table.externalTxId !== '' && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions &&\n table.topologyTransactions !== '' && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n })\n )\n }\n\n async getWallets(\n filter: CurrentNetworkWalletFilter = {}\n ): Promise<Array<Wallet>> {\n const network = await this.getCurrentNetwork()\n return this.getAllWallets({\n ...filter,\n networkIds: [network.id],\n })\n }\n\n async getPrimaryWallet(): Promise<Wallet | undefined> {\n const wallets = await this.getWallets()\n return wallets.find((w) => w.primary === true)\n }\n\n async setPrimaryWallet(partyId: PartyId): Promise<void> {\n const network = await this.getCurrentNetwork()\n const userId = this.assertConnected()\n const wallets = await this.getWallets()\n\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(\n `Wallet with partyId \"${partyId}\" not found in network \"${network.id}\"`\n )\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n // Unset primary for current network only\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', primary.partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n // Set new primary for current network\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async addWallet(wallet: Wallet): Promise<void> {\n this.logger.info('Adding wallet')\n const userId = this.assertConnected()\n\n const wallets = await this.getWallets()\n if (\n wallets.some(\n (w) =>\n w.partyId === wallet.partyId &&\n w.networkId === wallet.networkId\n )\n ) {\n throw new Error(\n `Wallet with partyId \"${wallet.partyId}\" networkId \"${wallet.networkId}\" userId \"${userId}\" already exists`\n )\n }\n\n if (\n !wallet.disabled &&\n wallet.status === 'allocated' &&\n !wallets.some((wallet) => wallet.primary)\n ) {\n // If there is no primary wallet yet, set current one as primary (unless disabled or not allocated).\n // In regular case it would be the first added wallet.\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n if (wallet.primary) {\n // If the new wallet is primary, set all others in the same network and for this user to non-primary\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('primary', '=', 1),\n eb('networkId', '=', wallet.networkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n await trx\n .insertInto('wallets')\n .values(fromWallet(wallet, userId))\n .execute()\n })\n }\n\n async updateWallet(params: UpdateWallet): Promise<void> {\n const { partyId, networkId } = params\n this.logger.info('Updating wallet')\n const userId = this.assertConnected()\n\n const updates = toWalletUpdateProperties(params)\n if (Object.keys(updates).length === 0) return\n\n const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .updateTable('wallets')\n .set(updates)\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', targetNetworkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async removeWallet(partyId: PartyId): Promise<void> {\n this.logger.info('Removing wallet')\n const userId = this.assertConnected()\n\n // Remove wallet from current network only\n const network = await this.getCurrentNetwork()\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('wallets')\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n // Session methods\n async getSession(): Promise<Session | undefined> {\n const userId = this.assertConnected()\n const sessions = await this.db\n .selectFrom('sessions')\n .selectAll()\n .where('userId', '=', userId)\n .executeTakeFirst()\n return sessions\n }\n\n async setSession(session: Session): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const deleted = await trx\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n this.logger.debug(deleted, 'Deleted old session')\n const inserted = await trx\n .insertInto('sessions')\n .values({ ...session, userId })\n .execute()\n this.logger.debug(inserted, 'Inserted new session')\n })\n }\n\n async removeSession(): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n }\n\n // IDP methods\n\n async getIdp(idpId: string): Promise<Idp> {\n this.assertConnected()\n\n const idps = await this.listIdps()\n if (!idps) throw new Error('No IDPs available')\n\n const idp = idps.find((n) => n.id === idpId)\n if (!idp) throw new Error(`IDP \"${idpId}\" not found`)\n return idp\n }\n\n async listIdps(): Promise<Array<Idp>> {\n // All IDPs are global for now -- TO-DO: user-specific IDPs\n const query = this.db.selectFrom('idps').selectAll()\n\n const idps = await query.execute()\n return idps.map((table) => toIdp(table))\n }\n\n async updateIdp(idp: Idp): Promise<void> {\n // todo: check and compare userid of existing idp\n await this.db.transaction().execute(async (trx) => {\n const idpEntry = fromIdp(idp)\n this.logger.info(idpEntry, 'Updating idp table')\n await trx\n .updateTable('idps')\n .set(idpEntry)\n .where('id', '=', idp.id)\n .execute()\n })\n }\n\n async addIdp(idp: Idp): Promise<void> {\n await this.db.transaction().execute(async (trx) => {\n const idpAlreadyExists = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idp.id)\n .executeTakeFirst()\n if (idpAlreadyExists) {\n throw new Error(`IDP ${idp.id} already exists`)\n } else {\n await trx.insertInto('idps').values(fromIdp(idp)).execute()\n }\n })\n }\n\n async removeIdp(idpId: string): Promise<void> {\n const networks = await this.listNetworks()\n if (networks.some((n) => n.identityProviderId === idpId)) {\n throw new Error(\n `Cannot delete IDP ${idpId} as it is in use by existing networks`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const idp = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idpId)\n .executeTakeFirst()\n if (!idp) {\n throw new Error(`IDP ${idpId} does not exists`)\n }\n await trx.deleteFrom('idps').where('id', '=', idpId).execute()\n })\n }\n\n // Network methods\n async getNetwork(networkId: string): Promise<Network> {\n this.assertConnected()\n\n const networks = await this.listNetworks()\n if (!networks) throw new Error('No networks available')\n\n const network = networks.find((n) => n.id === networkId)\n if (!network) throw new Error(`Network \"${networkId}\" not found`)\n return network\n }\n\n async getCurrentNetwork(): Promise<Network> {\n const session = await this.getSession()\n if (!session) {\n throw new Error('No session found')\n }\n const networkId = session.network\n if (!networkId) {\n throw new Error('No current network set in session')\n }\n\n const networks = await this.listNetworks()\n const network = networks.find((n) => n.id === networkId)\n if (!network) {\n throw new Error(`Network \"${networkId}\" not found`)\n }\n return network\n }\n\n async listNetworks(): Promise<Array<Network>> {\n let query = this.db.selectFrom('networks').selectAll()\n\n if (this.authContext) {\n const userId = this.assertConnected()\n query = query.where((eb) =>\n eb.or([\n eb('userId', 'is', null), // Global networks\n eb('userId', '=', userId), // User-specific networks\n ])\n )\n } else {\n query = query.where('userId', 'is', null) // Only global networks\n }\n\n const networks = await query.execute()\n return networks.map((table) => toNetwork(table))\n }\n\n async updateNetwork(network: Network): Promise<void> {\n // todo: check and compare idpId of existing network\n this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n // we do not set a userId for now and leave all networks global when updating\n const networkEntry = fromNetwork(network, undefined)\n this.logger.info(networkEntry, 'Updating network table')\n await trx\n .updateTable('networks')\n .set(networkEntry)\n .where('id', '=', network.id)\n .execute()\n })\n }\n\n async addNetwork(network: Network): Promise<void> {\n const userId = this.authContext?.userId\n const idps = await this.listIdps()\n const networkIdp = idps.find(\n (idp) => idp.id === network.identityProviderId\n )\n\n if (!networkIdp) {\n throw new Error(\n `Identity provider \"${network.identityProviderId}\" not found`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const networkAlreadyExists = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', network.id)\n .executeTakeFirst()\n if (networkAlreadyExists) {\n throw new Error(`Network ${network.id} already exists`)\n } else {\n await trx\n .insertInto('networks')\n .values(fromNetwork(network, userId))\n .execute()\n }\n })\n }\n\n async removeNetwork(networkId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const network = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', networkId)\n .executeTakeFirst()\n if (!network) {\n throw new Error(`Network ${networkId} does not exists`)\n }\n if (network.userId !== userId) {\n throw new Error(\n `Network ${networkId} is not owned by user ${userId}`\n )\n }\n await trx\n .deleteFrom('networks')\n .where('id', '=', networkId)\n .execute()\n })\n }\n\n // Transaction methods\n async setTransaction(transaction: Transaction): Promise<void> {\n const userId = this.assertConnected()\n\n const existing = await this.getTransaction(transaction.commandId)\n if (existing) {\n await this.db\n .updateTable('transactions')\n .set(fromTransaction(transaction, userId))\n .where('commandId', '=', transaction.commandId)\n .execute()\n } else {\n await this.db\n .insertInto('transactions')\n .values(fromTransaction(transaction, userId))\n .execute()\n }\n }\n\n async getTransaction(commandId: string): Promise<Transaction | undefined> {\n const userId = this.assertConnected()\n const transaction = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\n ])\n )\n .executeTakeFirst()\n return transaction ? toTransaction(transaction) : undefined\n }\n\n async listTransactions(): Promise<Array<Transaction>> {\n const userId = this.assertConnected()\n const transactions = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n return transactions.map((table) => toTransaction(table))\n }\n\n async removeTransaction(commandId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('transactions')\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\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 'postgres':\n return new Kysely<DB>({\n dialect: new PostgresDialect({\n pool: new pg.Pool({\n database: config.connection.database,\n user: config.connection.user,\n password: config.connection.password,\n port: config.connection.port,\n host: config.connection.host,\n }),\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 }\n}\n","// Copyright (c) 2025-2026 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-2026 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 { BootstrapConfig } 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: BootstrapConfig,\n logger: Logger\n): Promise<void> {\n const store = new StoreSql(db, logger)\n\n // Load all IDPs from config into the store\n await Promise.all(config.idps.map((idp) => store.addIdp(idp)))\n\n // Load all networks from config into the store\n await Promise.all(\n config.networks.map((network) => store.addNetwork(network))\n )\n}\n","// Copyright (c) 2025-2026 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 {\n StoreConfig,\n BootstrapConfig,\n} 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(\n config: StoreConfig,\n bootstrapConfig?: BootstrapConfig\n): 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 if (!bootstrapConfig) {\n throw new Error(\n 'Bootstrap config (idps/networks) is required for the bootstrap command'\n )\n }\n const db = connection(config)\n await bootstrap(db, bootstrapConfig, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Idp, UserId } from '@canton-network/core-wallet-auth';
|
|
2
|
-
import { Wallet, Transaction, Session, Network, WalletStatus } from '@canton-network/core-wallet-store';
|
|
2
|
+
import { Wallet, Transaction, Session, Network, WalletStatus, UpdateWallet } from '@canton-network/core-wallet-store';
|
|
3
3
|
interface MigrationTable {
|
|
4
4
|
name: string;
|
|
5
5
|
executedAt: string;
|
|
@@ -36,6 +36,14 @@ interface WalletTable {
|
|
|
36
36
|
disabled: number;
|
|
37
37
|
reason?: string;
|
|
38
38
|
}
|
|
39
|
+
interface UpdateWalletProperties {
|
|
40
|
+
primary?: number;
|
|
41
|
+
externalTxId?: string;
|
|
42
|
+
topologyTransactions?: string;
|
|
43
|
+
status?: string;
|
|
44
|
+
disabled?: number;
|
|
45
|
+
reason?: string;
|
|
46
|
+
}
|
|
39
47
|
interface TransactionTable {
|
|
40
48
|
status: string;
|
|
41
49
|
commandId: string;
|
|
@@ -64,6 +72,7 @@ export declare const fromIdp: (idp: Idp) => IdpTable;
|
|
|
64
72
|
export declare const toNetwork: (table: NetworkTable) => Network;
|
|
65
73
|
export declare const fromNetwork: (network: Network, userId?: UserId) => NetworkTable;
|
|
66
74
|
export declare const fromWallet: (wallet: Wallet, userId: UserId) => WalletTable;
|
|
75
|
+
export declare const toWalletUpdateProperties: (params: UpdateWallet) => UpdateWalletProperties;
|
|
67
76
|
export declare const toWalletStatus: (status?: string) => WalletStatus;
|
|
68
77
|
export declare const toWallet: (table: WalletTable) => Wallet;
|
|
69
78
|
export declare const fromTransaction: (transaction: Transaction, userId: UserId) => TransactionTable;
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,GAAG,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AAC1E,OAAO,EACH,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,YAAY,EACf,MAAM,mCAAmC,CAAA;AAE1C,UAAU,cAAc;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,QAAQ;IACd,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,OAAO,GAAG,aAAa,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAChC;AAED,UAAU,YAAY;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAE1B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAChC;AAED,UAAU,WAAW;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,gBAAgB;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,UAAU,YAAa,SAAQ,OAAO;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,EAAE;IACf,UAAU,EAAE,cAAc,CAAA;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,YAAY,EAAE,gBAAgB,CAAA;IAC9B,QAAQ,EAAE,YAAY,CAAA;CACzB;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,QAAQ,KAAG,GAqBvC,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,KAAK,GAAG,KAAG,QAiBlC,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,YAAY,KAAG,OAqB/C,CAAA;AAED,eAAO,MAAM,WAAW,GACpB,SAAS,OAAO,EAChB,SAAS,MAAM,KAChB,YAcF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -74,24 +74,38 @@ export const fromNetwork = (network, userId) => {
|
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
76
|
export const fromWallet = (wallet, userId) => {
|
|
77
|
+
const { externalTxId, topologyTransactions, ...rest } = wallet;
|
|
77
78
|
return {
|
|
78
|
-
...
|
|
79
|
+
...rest,
|
|
79
80
|
primary: wallet.primary ? 1 : 0,
|
|
80
81
|
userId: userId,
|
|
81
82
|
disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,
|
|
82
|
-
...(wallet.
|
|
83
|
-
|
|
83
|
+
...(wallet.reason !== undefined && { reason: wallet.reason }),
|
|
84
|
+
...(externalTxId && externalTxId !== '' && { externalTxId }),
|
|
85
|
+
...(topologyTransactions &&
|
|
86
|
+
topologyTransactions !== '' && { topologyTransactions }),
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
// only update fields that are explicitly provided to prevent data loss
|
|
90
|
+
export const toWalletUpdateProperties = (params) => {
|
|
91
|
+
const { status, externalTxId, topologyTransactions, disabled, reason, primary, } = params;
|
|
92
|
+
return {
|
|
93
|
+
...(status !== undefined && { status }),
|
|
94
|
+
...(externalTxId !== undefined && { externalTxId }),
|
|
95
|
+
...(topologyTransactions !== undefined && { topologyTransactions }),
|
|
96
|
+
...(primary !== undefined && { primary: primary ? 1 : 0 }),
|
|
97
|
+
...(disabled !== undefined && { disabled: disabled ? 1 : 0 }),
|
|
98
|
+
...(reason !== undefined && { reason }),
|
|
84
99
|
};
|
|
85
100
|
};
|
|
86
101
|
export const toWalletStatus = (status) => {
|
|
87
102
|
if (status === 'allocated')
|
|
88
103
|
return 'allocated';
|
|
104
|
+
if (status === 'removed')
|
|
105
|
+
return 'removed';
|
|
89
106
|
return 'initialized';
|
|
90
107
|
};
|
|
91
108
|
export const toWallet = (table) => {
|
|
92
|
-
if (table.disabled === 1 && table.reason === undefined) {
|
|
93
|
-
throw new Error(`Missing wallet disabled reason: ${table.partyId}`);
|
|
94
|
-
}
|
|
95
109
|
return {
|
|
96
110
|
primary: Boolean(table.primary),
|
|
97
111
|
status: toWalletStatus(table.status),
|
|
@@ -108,8 +122,7 @@ export const toWallet = (table) => {
|
|
|
108
122
|
...(table.topologyTransactions !== undefined && {
|
|
109
123
|
topologyTransactions: table.topologyTransactions,
|
|
110
124
|
}),
|
|
111
|
-
...(table.
|
|
112
|
-
table.reason !== undefined && {
|
|
125
|
+
...(table.reason !== undefined && {
|
|
113
126
|
reason: table.reason,
|
|
114
127
|
}),
|
|
115
128
|
};
|
package/dist/store-sql.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export declare class StoreSql implements BaseStore, AuthAware<StoreSql> {
|
|
|
15
15
|
getPrimaryWallet(): Promise<Wallet | undefined>;
|
|
16
16
|
setPrimaryWallet(partyId: PartyId): Promise<void>;
|
|
17
17
|
addWallet(wallet: Wallet): Promise<void>;
|
|
18
|
-
updateWallet(
|
|
18
|
+
updateWallet(params: UpdateWallet): Promise<void>;
|
|
19
19
|
removeWallet(partyId: PartyId): Promise<void>;
|
|
20
20
|
getSession(): Promise<Session | undefined>;
|
|
21
21
|
setSession(session: Session): Promise<void>;
|
package/dist/store-sql.d.ts.map
CHANGED
|
@@ -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,EAET,GAAG,EACN,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACH,KAAK,IAAI,SAAS,EAClB,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,WAAW,EACX,OAAO,EACP,WAAW,EACX,YAAY,EACZ,0BAA0B,EAC7B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAmB,MAAM,EAAkC,MAAM,QAAQ,CAAA;AAEhF,OAAO,EACH,EAAE,
|
|
1
|
+
{"version":3,"file":"store-sql.d.ts","sourceRoot":"","sources":["../src/store-sql.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canton-network/core-wallet-store-sql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "SQL implementation of the Store API",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
"test": "yarn node --experimental-vm-modules $(yarn bin jest)"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@canton-network/core-ledger-client": "^0.
|
|
29
|
-
"@canton-network/core-rpc-errors": "^0.18.
|
|
30
|
-
"@canton-network/core-wallet-auth": "^0.
|
|
31
|
-
"@canton-network/core-wallet-store": "^0.
|
|
28
|
+
"@canton-network/core-ledger-client": "^0.31.0",
|
|
29
|
+
"@canton-network/core-rpc-errors": "^0.18.1",
|
|
30
|
+
"@canton-network/core-wallet-auth": "^0.23.0",
|
|
31
|
+
"@canton-network/core-wallet-store": "^0.26.0",
|
|
32
32
|
"better-sqlite3": "^12.6.2",
|
|
33
33
|
"commander": "^14.0.3",
|
|
34
34
|
"kysely": "^0.28.11",
|