@canton-network/core-signing-blockdaemon 0.17.1 → 0.17.3

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,
@@ -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 })\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"]}
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;;;;;;;;;MAiKxD;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,
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 })\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canton-network/core-signing-blockdaemon",
3
- "version": "0.17.1",
3
+ "version": "0.17.3",
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.1",
25
- "@canton-network/core-wallet-auth": "^0.17.1"
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
  },