@canton-network/core-signing-blockdaemon 0.17.2 → 0.18.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/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # @canton-network/core-signing-blockdaemon
2
+
3
+ This package provides a signing driver for integrating the Wallet Gateway with [Blockdaemon](https://blockdaemon.com/). It implements the `SigningDriverInterface` defined in `@canton-network/core-signing-lib`, allowing the Wallet Gateway to manage keys and sign transactions using Blockdaemon's infrastructure.
4
+
5
+ ## Installation
6
+
7
+ This package is part of the Splice Wallet Kernel monorepo and is typically installed as a workspace dependency.
8
+
9
+ ```bash
10
+ yarn add @canton-network/core-signing-blockdaemon
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ The `BlockdaemonSigningDriver` is designed to be used within the Wallet Gateway's signing architecture. It requires a configuration object containing the `baseUrl` and `apiKey` for the Blockdaemon service.
16
+
17
+ ### Initialization
18
+
19
+ ```typescript
20
+ import BlockdaemonSigningDriver, {
21
+ BlockdaemonConfig,
22
+ } from '@canton-network/core-signing-blockdaemon'
23
+
24
+ const config: BlockdaemonConfig = {
25
+ baseUrl: 'https://api.blockdaemon.com/...', // Replace with actual Blockdaemon API URL
26
+ apiKey: 'your-api-key',
27
+ }
28
+
29
+ const driver = new BlockdaemonSigningDriver(config)
30
+ ```
31
+
32
+ ### Features
33
+
34
+ The driver supports the following operations:
35
+
36
+ - **Key Management**:
37
+ - `createKey`: Creates a new key pair on Blockdaemon.
38
+ - `getKeys`: Retrieves a list of available keys.
39
+ - **Signing**:
40
+ - `signTransaction`: Signs a transaction using a specified key.
41
+ - **Transaction Monitoring**:
42
+ - `getTransaction`: Retrieves the status and details of a specific transaction.
43
+ - `getTransactions`: Retrieves a list of transactions based on transaction IDs or public keys.
44
+ - **Configuration**:
45
+ - `getConfiguration`: Returns the current configuration (masking sensitive secrets).
46
+ - `setConfiguration`: Updates the driver's configuration at runtime.
47
+
48
+ ### Integration
49
+
50
+ This driver is intended to be registered with the `SigningController` in the Wallet Gateway, which manages multiple signing providers.
51
+
52
+ ```typescript
53
+ // Example integration (conceptual)
54
+ import { SigningController } from '@canton-network/core-signing-internal' // or similar
55
+
56
+ const signingController = new SigningController()
57
+ signingController.registerDriver(driver)
58
+ ```
59
+
60
+ ## Configuration
61
+
62
+ The driver accepts a `BlockdaemonConfig` object:
63
+
64
+ | Property | Type | Description |
65
+ | :-------- | :------- | :-------------------------------------------- |
66
+ | `baseUrl` | `string` | The base URL for the Blockdaemon Signing API. |
67
+ | `apiKey` | `string` | The API key for authentication. |
68
+
69
+ ### Wallet Gateway Configuration
70
+
71
+ When running the Wallet Gateway (Remote), the Blockdaemon signing driver is configured using the following environment variables:
72
+
73
+ - `BLOCKDAEMON_API_URL`: The base URL for the Blockdaemon API. Defaults to `http://localhost:5080/api/cwp/canton` if not set.
74
+ - `BLOCKDAEMON_API_KEY`: The API key for authenticating with Blockdaemon.
75
+
76
+ Example usage:
77
+
78
+ ```bash
79
+ BLOCKDAEMON_API_URL="https://api.blockdaemon.com/..." BLOCKDAEMON_API_KEY="your-api-key" yarn start
80
+ ```
81
+
82
+ ## License
83
+
84
+ Apache-2.0
package/dist/index.cjs CHANGED
@@ -134,8 +134,7 @@ var BlockdaemonSigningDriver = class {
134
134
  __publicField(this, "client");
135
135
  __publicField(this, "partyMode", coreSigningLib.PartyMode.EXTERNAL);
136
136
  __publicField(this, "signingProvider", coreSigningLib.SigningProvider.BLOCKDAEMON);
137
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
138
- __publicField(this, "controller", (_userId) => coreSigningLib.buildController({
137
+ __publicField(this, "controller", (userId) => coreSigningLib.buildController({
139
138
  signTransaction: async (params) => {
140
139
  try {
141
140
  if (!params.keyIdentifier.publicKey) {
@@ -150,7 +149,8 @@ var BlockdaemonSigningDriver = class {
150
149
  keyIdentifier: params.keyIdentifier,
151
150
  ...params.internalTxId !== void 0 && {
152
151
  internalTxId: params.internalTxId
153
- }
152
+ },
153
+ userIdentifier: userId
154
154
  });
155
155
  return {
156
156
  txId: tx.txId,
@@ -172,7 +172,8 @@ var BlockdaemonSigningDriver = class {
172
172
  getTransaction: async (params) => {
173
173
  try {
174
174
  const tx = await this.client.getTransaction({
175
- txId: params.txId
175
+ txId: params.txId,
176
+ userIdentifier: userId
176
177
  });
177
178
  return {
178
179
  txId: tx.txId,
@@ -196,7 +197,8 @@ var BlockdaemonSigningDriver = class {
196
197
  try {
197
198
  const transactions = await this.client.getTransactions({
198
199
  txIds: params.txIds,
199
- publicKeys: params.publicKeys
200
+ publicKeys: params.publicKeys,
201
+ userIdentifier: userId
200
202
  });
201
203
  return {
202
204
  transactions: transactions.map((tx) => ({
@@ -226,7 +228,8 @@ var BlockdaemonSigningDriver = class {
226
228
  keys: keys.map((k) => ({
227
229
  id: k.id,
228
230
  name: k.name,
229
- publicKey: k.publicKey
231
+ publicKey: k.publicKey,
232
+ userIdentifier: userId
230
233
  }))
231
234
  };
232
235
  } catch (error) {
@@ -239,7 +242,8 @@ var BlockdaemonSigningDriver = class {
239
242
  createKey: async (params) => {
240
243
  try {
241
244
  const key = await this.client.createKey({
242
- name: params.name
245
+ name: params.name,
246
+ userIdentifier: userId
243
247
  });
244
248
  return {
245
249
  id: key.id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signing-api-sdk.ts","../src/index.ts"],"names":["PartyMode","SigningProvider","buildController"],"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 type {\n Key,\n Transaction,\n SignTransactionParams,\n GetTransactionParams,\n GetTransactionsParams,\n CreateKeyParams,\n Tx,\n TxHash,\n KeyIdentifier,\n InternalTxId,\n PublicKey,\n} from '@canton-network/core-signing-lib'\n\n/**\n * A TypeScript SDK client for the Wallet Signing API.\n */\nexport class SigningAPIClient {\n private baseUrl: string\n private apiKey: string | undefined\n private masterKey: string\n private testNetwork: boolean\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n this.masterKey = 'Default'\n this.testNetwork = true\n }\n\n private async post<I extends Record<string, unknown>, O>(\n endpoint: string,\n params: I\n ): Promise<O> {\n const url = `${this.baseUrl}${endpoint}`\n\n // Merge context params (masterKey and testNetwork) into the request body\n const bodyToSend = {\n ...params,\n masterKey: this.masterKey,\n testNetwork: this.testNetwork,\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(bodyToSend),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API call to ${endpoint} failed (${response.status}): ${errorText}`\n )\n }\n\n // Handle 204 No Content for methods that return empty objects or null/void\n if (\n response.status === 204 ||\n response.headers.get('content-length') === '0'\n ) {\n // SetConfiguration/GetConfiguration return map[string]any which might be empty\n return {} as O\n }\n\n return response.json() as Promise<O>\n }\n\n /**\n * Uses the Wallet Provider to sign a transaction.\n * @param params - The transaction signing parameters.\n */\n public async signTransaction(\n params: SignTransactionParams\n ): Promise<Transaction> {\n return this.post<BlockDaemonSignTransactionParams, Transaction>(\n '/signTransaction',\n {\n publicKey: params.keyIdentifier.publicKey!,\n ...params,\n }\n )\n }\n\n /**\n * Get the status of a single transaction by its ID.\n * @param params - The transaction ID parameters.\n */\n public async getTransaction(\n params: GetTransactionParams\n ): Promise<Transaction> {\n return this.post<GetTransactionParams, Transaction>(\n '/getTransaction',\n params\n )\n }\n\n /**\n * Get the status of multiple transactions.\n * @param params - Filters for transactions.\n */\n public async getTransactions(\n params: GetTransactionsParams\n ): Promise<Transaction[]> {\n // Note: The Go handler returns []Transaction, the HTTP handler wraps it in JSON array.\n return this.post<GetTransactionsParams, Transaction[]>(\n '/getTransactions',\n params\n )\n }\n\n /**\n * Get a list of public keys available for signing.\n */\n public async getKeys(): Promise<Key[]> {\n // Go's addDummyArg is used for no-arg handlers, so we send an empty body.\n return this.post<Record<string, never>, Key[]>('/getKeys', {})\n }\n\n /**\n * Create a new key at the Wallet Provider.\n * @param params - The key creation parameters.\n */\n public async createKey(params: CreateKeyParams): Promise<Key> {\n return this.post<CreateKeyParams, Key>('/createKey', params)\n }\n\n /**\n * Get configuration parameters (client-side only).\n * Returns the current BaseURL, ApiKey, MasterKey, and TestNetwork settings.\n */\n public getConfiguration(): Record<string, unknown> {\n return {\n BaseURL: this.baseUrl,\n ApiKey: this.apiKey,\n MasterKey: this.masterKey,\n TestNetwork: this.testNetwork,\n }\n }\n\n /**\n * Set configuration parameters (client-side only).\n * Updates only the provided configuration fields.\n * @param params - Configuration parameters to set. All fields are optional.\n */\n public setConfiguration(params: {\n BaseURL?: string\n ApiKey?: string\n MasterKey?: string\n TestNetwork?: boolean\n }): Record<string, unknown> {\n if (params.BaseURL !== undefined) {\n this.baseUrl = params.BaseURL.endsWith('/')\n ? params.BaseURL.slice(0, -1)\n : params.BaseURL\n }\n if (params.ApiKey !== undefined) {\n this.apiKey = params.ApiKey\n }\n if (params.MasterKey !== undefined) {\n this.masterKey = params.MasterKey\n }\n if (params.TestNetwork !== undefined) {\n this.testNetwork = params.TestNetwork\n }\n return this.getConfiguration()\n }\n}\n\n//todo: remove once blockdaemon supports keyIdentifier instead of publicKey\ninterface BlockDaemonSignTransactionParams {\n tx: Tx\n txHash: TxHash\n publicKey: PublicKey\n keyIdentifier: KeyIdentifier\n internalTxId?: InternalTxId\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n [k: string]: any\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 {\n buildController,\n type CreateKeyParams,\n type CreateKeyResult,\n type GetConfigurationResult,\n type GetKeysResult,\n type GetTransactionParams,\n type GetTransactionResult,\n type GetTransactionsParams,\n type GetTransactionsResult,\n PartyMode,\n type SetConfigurationParams,\n type SetConfigurationResult,\n type SigningDriverInterface,\n SigningProvider,\n type SignTransactionParams,\n type SignTransactionResult,\n type SubscribeTransactionsParams,\n type SubscribeTransactionsResult,\n} from '@canton-network/core-signing-lib'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\nimport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport interface BlockdaemonConfig {\n baseUrl: string\n apiKey: string\n}\n\nexport default class BlockdaemonSigningDriver implements SigningDriverInterface {\n private client: SigningAPIClient\n\n constructor(config: BlockdaemonConfig) {\n this.client = new SigningAPIClient(config.baseUrl)\n this.client.setConfiguration({ ApiKey: config.apiKey })\n }\n\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.BLOCKDAEMON\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public controller = (_userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n try {\n if (!params.keyIdentifier.publicKey) {\n return {\n error: 'key_not_found',\n error_description:\n 'The provided key identifier must include a publicKey.',\n }\n }\n const tx = await this.client.signTransaction({\n tx: params.tx,\n txHash: params.txHash,\n keyIdentifier: params.keyIdentifier,\n ...(params.internalTxId !== undefined && {\n internalTxId: params.internalTxId,\n }),\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n try {\n const tx = await this.client.getTransaction({\n txId: params.txId,\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'transaction_not_found',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n if (params.publicKeys || params.txIds) {\n try {\n const transactions = await this.client.getTransactions({\n txIds: params.txIds!,\n publicKeys: params.publicKeys!,\n })\n return {\n transactions: transactions.map((tx) => ({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature!,\n publicKey: tx.publicKey!,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n } else {\n return {\n error: 'bad_arguments',\n error_description:\n 'either public key or txIds must be supplied',\n }\n }\n },\n\n getKeys: async (): Promise<GetKeysResult> => {\n try {\n const keys = await this.client.getKeys()\n return {\n keys: keys.map((k) => ({\n id: k.id,\n name: k.name,\n publicKey: k.publicKey,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n createKey: async (\n params: CreateKeyParams\n ): Promise<CreateKeyResult> => {\n try {\n const key = await this.client.createKey({\n name: params.name,\n })\n return {\n id: key.id,\n name: key.name,\n publicKey: key.publicKey,\n }\n } catch (error) {\n return {\n error: 'create_key_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const config = this.client.getConfiguration()\n return {\n ...config,\n ApiKey: config.ApiKey ? '***HIDDEN***' : undefined,\n MasterKey: config.MasterKey ? '***HIDDEN***' : undefined,\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n this.client.setConfiguration({\n BaseURL: params['BaseURL'] as string,\n ApiKey: params['ApiKey'] as string,\n MasterKey: params['MasterKey'] as string,\n TestNetwork: params['TestNetwork'] as boolean,\n })\n return params\n },\n\n subscribeTransactions: async (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/signing-api-sdk.ts","../src/index.ts"],"names":["PartyMode","SigningProvider","buildController"],"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 type {\n Key,\n Transaction,\n SignTransactionParams,\n GetTransactionParams,\n GetTransactionsParams,\n CreateKeyParams,\n Tx,\n TxHash,\n KeyIdentifier,\n InternalTxId,\n PublicKey,\n} from '@canton-network/core-signing-lib'\n\n/**\n * A TypeScript SDK client for the Wallet Signing API.\n */\nexport class SigningAPIClient {\n private baseUrl: string\n private apiKey: string | undefined\n private masterKey: string\n private testNetwork: boolean\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n this.masterKey = 'Default'\n this.testNetwork = true\n }\n\n private async post<I extends Record<string, unknown>, O>(\n endpoint: string,\n params: I\n ): Promise<O> {\n const url = `${this.baseUrl}${endpoint}`\n\n // Merge context params (masterKey and testNetwork) into the request body\n const bodyToSend = {\n ...params,\n masterKey: this.masterKey,\n testNetwork: this.testNetwork,\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(bodyToSend),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API call to ${endpoint} failed (${response.status}): ${errorText}`\n )\n }\n\n // Handle 204 No Content for methods that return empty objects or null/void\n if (\n response.status === 204 ||\n response.headers.get('content-length') === '0'\n ) {\n // SetConfiguration/GetConfiguration return map[string]any which might be empty\n return {} as O\n }\n\n return response.json() as Promise<O>\n }\n\n /**\n * Uses the Wallet Provider to sign a transaction.\n * @param params - The transaction signing parameters.\n */\n public async signTransaction(\n params: SignTransactionParams\n ): Promise<Transaction> {\n return this.post<BlockDaemonSignTransactionParams, Transaction>(\n '/signTransaction',\n {\n publicKey: params.keyIdentifier.publicKey!,\n ...params,\n }\n )\n }\n\n /**\n * Get the status of a single transaction by its ID.\n * @param params - The transaction ID parameters.\n */\n public async getTransaction(\n params: GetTransactionParams\n ): Promise<Transaction> {\n return this.post<GetTransactionParams, Transaction>(\n '/getTransaction',\n params\n )\n }\n\n /**\n * Get the status of multiple transactions.\n * @param params - Filters for transactions.\n */\n public async getTransactions(\n params: GetTransactionsParams\n ): Promise<Transaction[]> {\n // Note: The Go handler returns []Transaction, the HTTP handler wraps it in JSON array.\n return this.post<GetTransactionsParams, Transaction[]>(\n '/getTransactions',\n params\n )\n }\n\n /**\n * Get a list of public keys available for signing.\n */\n public async getKeys(): Promise<Key[]> {\n // Go's addDummyArg is used for no-arg handlers, so we send an empty body.\n return this.post<Record<string, never>, Key[]>('/getKeys', {})\n }\n\n /**\n * Create a new key at the Wallet Provider.\n * @param params - The key creation parameters.\n */\n public async createKey(params: CreateKeyParams): Promise<Key> {\n return this.post<CreateKeyParams, Key>('/createKey', params)\n }\n\n /**\n * Get configuration parameters (client-side only).\n * Returns the current BaseURL, ApiKey, MasterKey, and TestNetwork settings.\n */\n public getConfiguration(): Record<string, unknown> {\n return {\n BaseURL: this.baseUrl,\n ApiKey: this.apiKey,\n MasterKey: this.masterKey,\n TestNetwork: this.testNetwork,\n }\n }\n\n /**\n * Set configuration parameters (client-side only).\n * Updates only the provided configuration fields.\n * @param params - Configuration parameters to set. All fields are optional.\n */\n public setConfiguration(params: {\n BaseURL?: string\n ApiKey?: string\n MasterKey?: string\n TestNetwork?: boolean\n }): Record<string, unknown> {\n if (params.BaseURL !== undefined) {\n this.baseUrl = params.BaseURL.endsWith('/')\n ? params.BaseURL.slice(0, -1)\n : params.BaseURL\n }\n if (params.ApiKey !== undefined) {\n this.apiKey = params.ApiKey\n }\n if (params.MasterKey !== undefined) {\n this.masterKey = params.MasterKey\n }\n if (params.TestNetwork !== undefined) {\n this.testNetwork = params.TestNetwork\n }\n return this.getConfiguration()\n }\n}\n\n//todo: remove once blockdaemon supports keyIdentifier instead of publicKey\ninterface BlockDaemonSignTransactionParams {\n tx: Tx\n txHash: TxHash\n publicKey: PublicKey\n keyIdentifier: KeyIdentifier\n internalTxId?: InternalTxId\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n [k: string]: any\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 {\n buildController,\n type CreateKeyParams,\n type CreateKeyResult,\n type GetConfigurationResult,\n type GetKeysResult,\n type GetTransactionParams,\n type GetTransactionResult,\n type GetTransactionsParams,\n type GetTransactionsResult,\n PartyMode,\n type SetConfigurationParams,\n type SetConfigurationResult,\n type SigningDriverInterface,\n SigningProvider,\n type SignTransactionParams,\n type SignTransactionResult,\n type SubscribeTransactionsParams,\n type SubscribeTransactionsResult,\n} from '@canton-network/core-signing-lib'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\nimport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport interface BlockdaemonConfig {\n baseUrl: string\n apiKey: string\n}\n\nexport default class BlockdaemonSigningDriver implements SigningDriverInterface {\n private client: SigningAPIClient\n\n constructor(config: BlockdaemonConfig) {\n this.client = new SigningAPIClient(config.baseUrl)\n this.client.setConfiguration({ ApiKey: config.apiKey })\n }\n\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.BLOCKDAEMON\n\n public controller = (userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n try {\n if (!params.keyIdentifier.publicKey) {\n return {\n error: 'key_not_found',\n error_description:\n 'The provided key identifier must include a publicKey.',\n }\n }\n const tx = await this.client.signTransaction({\n tx: params.tx,\n txHash: params.txHash,\n keyIdentifier: params.keyIdentifier,\n ...(params.internalTxId !== undefined && {\n internalTxId: params.internalTxId,\n }),\n userIdentifier: userId,\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n try {\n const tx = await this.client.getTransaction({\n txId: params.txId,\n userIdentifier: userId,\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'transaction_not_found',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n if (params.publicKeys || params.txIds) {\n try {\n const transactions = await this.client.getTransactions({\n txIds: params.txIds!,\n publicKeys: params.publicKeys!,\n userIdentifier: userId,\n })\n return {\n transactions: transactions.map((tx) => ({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature!,\n publicKey: tx.publicKey!,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n } else {\n return {\n error: 'bad_arguments',\n error_description:\n 'either public key or txIds must be supplied',\n }\n }\n },\n\n getKeys: async (): Promise<GetKeysResult> => {\n try {\n const keys = await this.client.getKeys()\n return {\n keys: keys.map((k) => ({\n id: k.id,\n name: k.name,\n publicKey: k.publicKey,\n userIdentifier: userId,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n createKey: async (\n params: CreateKeyParams\n ): Promise<CreateKeyResult> => {\n try {\n const key = await this.client.createKey({\n name: params.name,\n userIdentifier: userId,\n })\n return {\n id: key.id,\n name: key.name,\n publicKey: key.publicKey,\n }\n } catch (error) {\n return {\n error: 'create_key_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const config = this.client.getConfiguration()\n return {\n ...config,\n ApiKey: config.ApiKey ? '***HIDDEN***' : undefined,\n MasterKey: config.MasterKey ? '***HIDDEN***' : undefined,\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n this.client.setConfiguration({\n BaseURL: params['BaseURL'] as string,\n ApiKey: params['ApiKey'] as string,\n MasterKey: params['MasterKey'] as string,\n TestNetwork: params['TestNetwork'] as boolean,\n })\n return params\n },\n\n subscribeTransactions: async (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export default class BlockdaemonSigningDriver implements SigningDriverInterface
10
10
  constructor(config: BlockdaemonConfig);
11
11
  partyMode: PartyMode;
12
12
  signingProvider: SigningProvider;
13
- controller: (_userId: AuthContext["userId"] | undefined) => {
13
+ controller: (userId: AuthContext["userId"] | undefined) => {
14
14
  signTransaction: import("@canton-network/core-signing-lib").SignTransaction;
15
15
  getTransaction: import("@canton-network/core-signing-lib").GetTransaction;
16
16
  getTransactions: import("@canton-network/core-signing-lib").GetTransactions;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAUH,SAAS,EAGT,KAAK,sBAAsB,EAC3B,eAAe,EAKlB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,wBAAyB,YAAW,sBAAsB;IAC3E,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,iBAAiB;IAK9B,SAAS,YAAqB;IAC9B,eAAe,kBAA8B;IAG7C,UAAU,GAAI,SAAS,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS;;;;;;;;;MAgKzD;CACT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAUH,SAAS,EAGT,KAAK,sBAAsB,EAC3B,eAAe,EAKlB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,wBAAyB,YAAW,sBAAsB;IAC3E,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,iBAAiB;IAK9B,SAAS,YAAqB;IAC9B,eAAe,kBAA8B;IAE7C,UAAU,GAAI,QAAQ,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS;;;;;;;;;MAqKxD;CACT"}
package/dist/index.js CHANGED
@@ -130,8 +130,7 @@ var BlockdaemonSigningDriver = class {
130
130
  __publicField(this, "client");
131
131
  __publicField(this, "partyMode", PartyMode.EXTERNAL);
132
132
  __publicField(this, "signingProvider", SigningProvider.BLOCKDAEMON);
133
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
134
- __publicField(this, "controller", (_userId) => buildController({
133
+ __publicField(this, "controller", (userId) => buildController({
135
134
  signTransaction: async (params) => {
136
135
  try {
137
136
  if (!params.keyIdentifier.publicKey) {
@@ -146,7 +145,8 @@ var BlockdaemonSigningDriver = class {
146
145
  keyIdentifier: params.keyIdentifier,
147
146
  ...params.internalTxId !== void 0 && {
148
147
  internalTxId: params.internalTxId
149
- }
148
+ },
149
+ userIdentifier: userId
150
150
  });
151
151
  return {
152
152
  txId: tx.txId,
@@ -168,7 +168,8 @@ var BlockdaemonSigningDriver = class {
168
168
  getTransaction: async (params) => {
169
169
  try {
170
170
  const tx = await this.client.getTransaction({
171
- txId: params.txId
171
+ txId: params.txId,
172
+ userIdentifier: userId
172
173
  });
173
174
  return {
174
175
  txId: tx.txId,
@@ -192,7 +193,8 @@ var BlockdaemonSigningDriver = class {
192
193
  try {
193
194
  const transactions = await this.client.getTransactions({
194
195
  txIds: params.txIds,
195
- publicKeys: params.publicKeys
196
+ publicKeys: params.publicKeys,
197
+ userIdentifier: userId
196
198
  });
197
199
  return {
198
200
  transactions: transactions.map((tx) => ({
@@ -222,7 +224,8 @@ var BlockdaemonSigningDriver = class {
222
224
  keys: keys.map((k) => ({
223
225
  id: k.id,
224
226
  name: k.name,
225
- publicKey: k.publicKey
227
+ publicKey: k.publicKey,
228
+ userIdentifier: userId
226
229
  }))
227
230
  };
228
231
  } catch (error) {
@@ -235,7 +238,8 @@ var BlockdaemonSigningDriver = class {
235
238
  createKey: async (params) => {
236
239
  try {
237
240
  const key = await this.client.createKey({
238
- name: params.name
241
+ name: params.name,
242
+ userIdentifier: userId
239
243
  });
240
244
  return {
241
245
  id: key.id,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signing-api-sdk.ts","../src/index.ts"],"names":[],"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 type {\n Key,\n Transaction,\n SignTransactionParams,\n GetTransactionParams,\n GetTransactionsParams,\n CreateKeyParams,\n Tx,\n TxHash,\n KeyIdentifier,\n InternalTxId,\n PublicKey,\n} from '@canton-network/core-signing-lib'\n\n/**\n * A TypeScript SDK client for the Wallet Signing API.\n */\nexport class SigningAPIClient {\n private baseUrl: string\n private apiKey: string | undefined\n private masterKey: string\n private testNetwork: boolean\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n this.masterKey = 'Default'\n this.testNetwork = true\n }\n\n private async post<I extends Record<string, unknown>, O>(\n endpoint: string,\n params: I\n ): Promise<O> {\n const url = `${this.baseUrl}${endpoint}`\n\n // Merge context params (masterKey and testNetwork) into the request body\n const bodyToSend = {\n ...params,\n masterKey: this.masterKey,\n testNetwork: this.testNetwork,\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(bodyToSend),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API call to ${endpoint} failed (${response.status}): ${errorText}`\n )\n }\n\n // Handle 204 No Content for methods that return empty objects or null/void\n if (\n response.status === 204 ||\n response.headers.get('content-length') === '0'\n ) {\n // SetConfiguration/GetConfiguration return map[string]any which might be empty\n return {} as O\n }\n\n return response.json() as Promise<O>\n }\n\n /**\n * Uses the Wallet Provider to sign a transaction.\n * @param params - The transaction signing parameters.\n */\n public async signTransaction(\n params: SignTransactionParams\n ): Promise<Transaction> {\n return this.post<BlockDaemonSignTransactionParams, Transaction>(\n '/signTransaction',\n {\n publicKey: params.keyIdentifier.publicKey!,\n ...params,\n }\n )\n }\n\n /**\n * Get the status of a single transaction by its ID.\n * @param params - The transaction ID parameters.\n */\n public async getTransaction(\n params: GetTransactionParams\n ): Promise<Transaction> {\n return this.post<GetTransactionParams, Transaction>(\n '/getTransaction',\n params\n )\n }\n\n /**\n * Get the status of multiple transactions.\n * @param params - Filters for transactions.\n */\n public async getTransactions(\n params: GetTransactionsParams\n ): Promise<Transaction[]> {\n // Note: The Go handler returns []Transaction, the HTTP handler wraps it in JSON array.\n return this.post<GetTransactionsParams, Transaction[]>(\n '/getTransactions',\n params\n )\n }\n\n /**\n * Get a list of public keys available for signing.\n */\n public async getKeys(): Promise<Key[]> {\n // Go's addDummyArg is used for no-arg handlers, so we send an empty body.\n return this.post<Record<string, never>, Key[]>('/getKeys', {})\n }\n\n /**\n * Create a new key at the Wallet Provider.\n * @param params - The key creation parameters.\n */\n public async createKey(params: CreateKeyParams): Promise<Key> {\n return this.post<CreateKeyParams, Key>('/createKey', params)\n }\n\n /**\n * Get configuration parameters (client-side only).\n * Returns the current BaseURL, ApiKey, MasterKey, and TestNetwork settings.\n */\n public getConfiguration(): Record<string, unknown> {\n return {\n BaseURL: this.baseUrl,\n ApiKey: this.apiKey,\n MasterKey: this.masterKey,\n TestNetwork: this.testNetwork,\n }\n }\n\n /**\n * Set configuration parameters (client-side only).\n * Updates only the provided configuration fields.\n * @param params - Configuration parameters to set. All fields are optional.\n */\n public setConfiguration(params: {\n BaseURL?: string\n ApiKey?: string\n MasterKey?: string\n TestNetwork?: boolean\n }): Record<string, unknown> {\n if (params.BaseURL !== undefined) {\n this.baseUrl = params.BaseURL.endsWith('/')\n ? params.BaseURL.slice(0, -1)\n : params.BaseURL\n }\n if (params.ApiKey !== undefined) {\n this.apiKey = params.ApiKey\n }\n if (params.MasterKey !== undefined) {\n this.masterKey = params.MasterKey\n }\n if (params.TestNetwork !== undefined) {\n this.testNetwork = params.TestNetwork\n }\n return this.getConfiguration()\n }\n}\n\n//todo: remove once blockdaemon supports keyIdentifier instead of publicKey\ninterface BlockDaemonSignTransactionParams {\n tx: Tx\n txHash: TxHash\n publicKey: PublicKey\n keyIdentifier: KeyIdentifier\n internalTxId?: InternalTxId\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n [k: string]: any\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 {\n buildController,\n type CreateKeyParams,\n type CreateKeyResult,\n type GetConfigurationResult,\n type GetKeysResult,\n type GetTransactionParams,\n type GetTransactionResult,\n type GetTransactionsParams,\n type GetTransactionsResult,\n PartyMode,\n type SetConfigurationParams,\n type SetConfigurationResult,\n type SigningDriverInterface,\n SigningProvider,\n type SignTransactionParams,\n type SignTransactionResult,\n type SubscribeTransactionsParams,\n type SubscribeTransactionsResult,\n} from '@canton-network/core-signing-lib'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\nimport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport interface BlockdaemonConfig {\n baseUrl: string\n apiKey: string\n}\n\nexport default class BlockdaemonSigningDriver implements SigningDriverInterface {\n private client: SigningAPIClient\n\n constructor(config: BlockdaemonConfig) {\n this.client = new SigningAPIClient(config.baseUrl)\n this.client.setConfiguration({ ApiKey: config.apiKey })\n }\n\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.BLOCKDAEMON\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public controller = (_userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n try {\n if (!params.keyIdentifier.publicKey) {\n return {\n error: 'key_not_found',\n error_description:\n 'The provided key identifier must include a publicKey.',\n }\n }\n const tx = await this.client.signTransaction({\n tx: params.tx,\n txHash: params.txHash,\n keyIdentifier: params.keyIdentifier,\n ...(params.internalTxId !== undefined && {\n internalTxId: params.internalTxId,\n }),\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n try {\n const tx = await this.client.getTransaction({\n txId: params.txId,\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'transaction_not_found',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n if (params.publicKeys || params.txIds) {\n try {\n const transactions = await this.client.getTransactions({\n txIds: params.txIds!,\n publicKeys: params.publicKeys!,\n })\n return {\n transactions: transactions.map((tx) => ({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature!,\n publicKey: tx.publicKey!,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n } else {\n return {\n error: 'bad_arguments',\n error_description:\n 'either public key or txIds must be supplied',\n }\n }\n },\n\n getKeys: async (): Promise<GetKeysResult> => {\n try {\n const keys = await this.client.getKeys()\n return {\n keys: keys.map((k) => ({\n id: k.id,\n name: k.name,\n publicKey: k.publicKey,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n createKey: async (\n params: CreateKeyParams\n ): Promise<CreateKeyResult> => {\n try {\n const key = await this.client.createKey({\n name: params.name,\n })\n return {\n id: key.id,\n name: key.name,\n publicKey: key.publicKey,\n }\n } catch (error) {\n return {\n error: 'create_key_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const config = this.client.getConfiguration()\n return {\n ...config,\n ApiKey: config.ApiKey ? '***HIDDEN***' : undefined,\n MasterKey: config.MasterKey ? '***HIDDEN***' : undefined,\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n this.client.setConfiguration({\n BaseURL: params['BaseURL'] as string,\n ApiKey: params['ApiKey'] as string,\n MasterKey: params['MasterKey'] as string,\n TestNetwork: params['TestNetwork'] as boolean,\n })\n return params\n },\n\n subscribeTransactions: async (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/signing-api-sdk.ts","../src/index.ts"],"names":[],"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 type {\n Key,\n Transaction,\n SignTransactionParams,\n GetTransactionParams,\n GetTransactionsParams,\n CreateKeyParams,\n Tx,\n TxHash,\n KeyIdentifier,\n InternalTxId,\n PublicKey,\n} from '@canton-network/core-signing-lib'\n\n/**\n * A TypeScript SDK client for the Wallet Signing API.\n */\nexport class SigningAPIClient {\n private baseUrl: string\n private apiKey: string | undefined\n private masterKey: string\n private testNetwork: boolean\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n this.masterKey = 'Default'\n this.testNetwork = true\n }\n\n private async post<I extends Record<string, unknown>, O>(\n endpoint: string,\n params: I\n ): Promise<O> {\n const url = `${this.baseUrl}${endpoint}`\n\n // Merge context params (masterKey and testNetwork) into the request body\n const bodyToSend = {\n ...params,\n masterKey: this.masterKey,\n testNetwork: this.testNetwork,\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(bodyToSend),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API call to ${endpoint} failed (${response.status}): ${errorText}`\n )\n }\n\n // Handle 204 No Content for methods that return empty objects or null/void\n if (\n response.status === 204 ||\n response.headers.get('content-length') === '0'\n ) {\n // SetConfiguration/GetConfiguration return map[string]any which might be empty\n return {} as O\n }\n\n return response.json() as Promise<O>\n }\n\n /**\n * Uses the Wallet Provider to sign a transaction.\n * @param params - The transaction signing parameters.\n */\n public async signTransaction(\n params: SignTransactionParams\n ): Promise<Transaction> {\n return this.post<BlockDaemonSignTransactionParams, Transaction>(\n '/signTransaction',\n {\n publicKey: params.keyIdentifier.publicKey!,\n ...params,\n }\n )\n }\n\n /**\n * Get the status of a single transaction by its ID.\n * @param params - The transaction ID parameters.\n */\n public async getTransaction(\n params: GetTransactionParams\n ): Promise<Transaction> {\n return this.post<GetTransactionParams, Transaction>(\n '/getTransaction',\n params\n )\n }\n\n /**\n * Get the status of multiple transactions.\n * @param params - Filters for transactions.\n */\n public async getTransactions(\n params: GetTransactionsParams\n ): Promise<Transaction[]> {\n // Note: The Go handler returns []Transaction, the HTTP handler wraps it in JSON array.\n return this.post<GetTransactionsParams, Transaction[]>(\n '/getTransactions',\n params\n )\n }\n\n /**\n * Get a list of public keys available for signing.\n */\n public async getKeys(): Promise<Key[]> {\n // Go's addDummyArg is used for no-arg handlers, so we send an empty body.\n return this.post<Record<string, never>, Key[]>('/getKeys', {})\n }\n\n /**\n * Create a new key at the Wallet Provider.\n * @param params - The key creation parameters.\n */\n public async createKey(params: CreateKeyParams): Promise<Key> {\n return this.post<CreateKeyParams, Key>('/createKey', params)\n }\n\n /**\n * Get configuration parameters (client-side only).\n * Returns the current BaseURL, ApiKey, MasterKey, and TestNetwork settings.\n */\n public getConfiguration(): Record<string, unknown> {\n return {\n BaseURL: this.baseUrl,\n ApiKey: this.apiKey,\n MasterKey: this.masterKey,\n TestNetwork: this.testNetwork,\n }\n }\n\n /**\n * Set configuration parameters (client-side only).\n * Updates only the provided configuration fields.\n * @param params - Configuration parameters to set. All fields are optional.\n */\n public setConfiguration(params: {\n BaseURL?: string\n ApiKey?: string\n MasterKey?: string\n TestNetwork?: boolean\n }): Record<string, unknown> {\n if (params.BaseURL !== undefined) {\n this.baseUrl = params.BaseURL.endsWith('/')\n ? params.BaseURL.slice(0, -1)\n : params.BaseURL\n }\n if (params.ApiKey !== undefined) {\n this.apiKey = params.ApiKey\n }\n if (params.MasterKey !== undefined) {\n this.masterKey = params.MasterKey\n }\n if (params.TestNetwork !== undefined) {\n this.testNetwork = params.TestNetwork\n }\n return this.getConfiguration()\n }\n}\n\n//todo: remove once blockdaemon supports keyIdentifier instead of publicKey\ninterface BlockDaemonSignTransactionParams {\n tx: Tx\n txHash: TxHash\n publicKey: PublicKey\n keyIdentifier: KeyIdentifier\n internalTxId?: InternalTxId\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n [k: string]: any\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 {\n buildController,\n type CreateKeyParams,\n type CreateKeyResult,\n type GetConfigurationResult,\n type GetKeysResult,\n type GetTransactionParams,\n type GetTransactionResult,\n type GetTransactionsParams,\n type GetTransactionsResult,\n PartyMode,\n type SetConfigurationParams,\n type SetConfigurationResult,\n type SigningDriverInterface,\n SigningProvider,\n type SignTransactionParams,\n type SignTransactionResult,\n type SubscribeTransactionsParams,\n type SubscribeTransactionsResult,\n} from '@canton-network/core-signing-lib'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\nimport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport { SigningAPIClient } from './signing-api-sdk.js'\n\nexport interface BlockdaemonConfig {\n baseUrl: string\n apiKey: string\n}\n\nexport default class BlockdaemonSigningDriver implements SigningDriverInterface {\n private client: SigningAPIClient\n\n constructor(config: BlockdaemonConfig) {\n this.client = new SigningAPIClient(config.baseUrl)\n this.client.setConfiguration({ ApiKey: config.apiKey })\n }\n\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.BLOCKDAEMON\n\n public controller = (userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n try {\n if (!params.keyIdentifier.publicKey) {\n return {\n error: 'key_not_found',\n error_description:\n 'The provided key identifier must include a publicKey.',\n }\n }\n const tx = await this.client.signTransaction({\n tx: params.tx,\n txHash: params.txHash,\n keyIdentifier: params.keyIdentifier,\n ...(params.internalTxId !== undefined && {\n internalTxId: params.internalTxId,\n }),\n userIdentifier: userId,\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n try {\n const tx = await this.client.getTransaction({\n txId: params.txId,\n userIdentifier: userId,\n })\n return {\n txId: tx.txId,\n status: tx.status,\n ...(tx.signature !== undefined && {\n signature: tx.signature,\n }),\n ...(tx.publicKey !== undefined && {\n publicKey: tx.publicKey,\n }),\n }\n } catch (error) {\n return {\n error: 'transaction_not_found',\n error_description: (error as Error).message,\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n if (params.publicKeys || params.txIds) {\n try {\n const transactions = await this.client.getTransactions({\n txIds: params.txIds!,\n publicKeys: params.publicKeys!,\n userIdentifier: userId,\n })\n return {\n transactions: transactions.map((tx) => ({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature!,\n publicKey: tx.publicKey!,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n } else {\n return {\n error: 'bad_arguments',\n error_description:\n 'either public key or txIds must be supplied',\n }\n }\n },\n\n getKeys: async (): Promise<GetKeysResult> => {\n try {\n const keys = await this.client.getKeys()\n return {\n keys: keys.map((k) => ({\n id: k.id,\n name: k.name,\n publicKey: k.publicKey,\n userIdentifier: userId,\n })),\n }\n } catch (error) {\n return {\n error: 'fetch_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n createKey: async (\n params: CreateKeyParams\n ): Promise<CreateKeyResult> => {\n try {\n const key = await this.client.createKey({\n name: params.name,\n userIdentifier: userId,\n })\n return {\n id: key.id,\n name: key.name,\n publicKey: key.publicKey,\n }\n } catch (error) {\n return {\n error: 'create_key_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const config = this.client.getConfiguration()\n return {\n ...config,\n ApiKey: config.ApiKey ? '***HIDDEN***' : undefined,\n MasterKey: config.MasterKey ? '***HIDDEN***' : undefined,\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n this.client.setConfiguration({\n BaseURL: params['BaseURL'] as string,\n ApiKey: params['ApiKey'] as string,\n MasterKey: params['MasterKey'] as string,\n TestNetwork: params['TestNetwork'] as boolean,\n })\n return params\n },\n\n subscribeTransactions: async (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canton-network/core-signing-blockdaemon",
3
- "version": "0.17.2",
3
+ "version": "0.18.0",
4
4
  "type": "module",
5
5
  "description": "Wallet Gateway signing driver for Blockdaemon",
6
6
  "license": "Apache-2.0",
@@ -18,14 +18,21 @@
18
18
  },
19
19
  "scripts": {
20
20
  "build": "tsup && tsc -p tsconfig.types.json",
21
- "clean": "rm -rf ./dist"
21
+ "clean": "rm -rf ./dist",
22
+ "test": "jest"
22
23
  },
23
24
  "dependencies": {
24
- "@canton-network/core-signing-lib": "^0.20.2",
25
- "@canton-network/core-wallet-auth": "^0.17.2"
25
+ "@canton-network/core-signing-lib": "^0.20.3",
26
+ "@canton-network/core-wallet-auth": "^0.17.3"
26
27
  },
27
28
  "devDependencies": {
28
- "@types/node": "^25.0.8",
29
+ "@jest/globals": "^30.2.0",
30
+ "@swc/core": "^1.15.10",
31
+ "@swc/jest": "^0.2.39",
32
+ "@types/jest": "^30.0.0",
33
+ "@types/node": "^25.0.10",
34
+ "jest": "^30.2.0",
35
+ "ts-jest-resolver": "^2.0.1",
29
36
  "tsup": "^8.5.1",
30
37
  "typescript": "^5.9.3"
31
38
  },