@canton-network/core-signing-fireblocks 1.6.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fireblocks.d.ts +2 -1
- package/dist/fireblocks.d.ts.map +1 -1
- package/dist/index.cjs +8 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/fireblocks.d.ts
CHANGED
|
@@ -21,10 +21,11 @@ export interface FireblocksApiKeyInfo {
|
|
|
21
21
|
export declare class FireblocksHandler {
|
|
22
22
|
private defaultClient;
|
|
23
23
|
private clients;
|
|
24
|
+
private coinType;
|
|
24
25
|
private keyInfoByPublicKey;
|
|
25
26
|
private publicKeyByDerivationPath;
|
|
26
27
|
private getClient;
|
|
27
|
-
constructor(defaultKey: FireblocksApiKeyInfo | undefined, userKeys: Map<string, FireblocksApiKeyInfo>, apiPath?: string);
|
|
28
|
+
constructor(defaultKey: FireblocksApiKeyInfo | undefined, userKeys: Map<string, FireblocksApiKeyInfo>, apiPath?: string, coinType?: number);
|
|
28
29
|
/**
|
|
29
30
|
* Get all public keys which correspond to Fireblocks vault accounts. This will
|
|
30
31
|
* also refresh the key cache.
|
package/dist/fireblocks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fireblocks.d.ts","sourceRoot":"","sources":["../src/fireblocks.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,iCAAiC,EAGpC,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACH,aAAa,EAEb,aAAa,EAChB,MAAM,kCAAkC,CAAA;AAiBzC,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,SAAS,EAAE,iCAAiC,CAAA;CAC/C;AAED,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CACpB;AAID,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,OAAO,CAAqC;
|
|
1
|
+
{"version":3,"file":"fireblocks.d.ts","sourceRoot":"","sources":["../src/fireblocks.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,iCAAiC,EAGpC,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACH,aAAa,EAEb,aAAa,EAChB,MAAM,kCAAkC,CAAA;AAiBzC,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,SAAS,EAAE,iCAAiC,CAAA;CAC/C;AAED,MAAM,WAAW,qBAAqB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CACpB;AAID,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,kBAAkB,CAAwC;IAClE,OAAO,CAAC,yBAAyB,CAAiC;IAElE,OAAO,CAAC,SAAS,CAQhB;gBAGG,UAAU,EAAE,oBAAoB,GAAG,SAAS,EAC5C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC3C,OAAO,GAAE,MAAuC,EAChD,QAAQ,CAAC,EAAE,MAAM;IAoBrB;;;;OAIG;IACU,aAAa,CACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC;IA+C3B;;;;;OAKG;YACW,iBAAiB;IAqD/B;;;OAGG;YACW,eAAe;IAiC7B;;;OAGG;IACU,cAAc,CACvB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAa7C;;;;;OAKG;IACW,eAAe,CACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,EACI,KAAW,EACX,MAAM,GACT,GAAE;QACC,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;KACb,GACP,cAAc,CAAC,qBAAqB,CAAC;IAmCxC;;;;;;;OAOG;IACU,eAAe,CACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,CAAC;CA8DpC"}
|
package/dist/index.cjs
CHANGED
|
@@ -26,9 +26,10 @@ var RawMessageExtraParametersSchema = zod.z.object({
|
|
|
26
26
|
});
|
|
27
27
|
var logger = pino.pino({ name: "main", level: "debug" });
|
|
28
28
|
var FireblocksHandler = class {
|
|
29
|
-
constructor(defaultKey, userKeys, apiPath = "https://api.fireblocks.io/v1") {
|
|
29
|
+
constructor(defaultKey, userKeys, apiPath = "https://api.fireblocks.io/v1", coinType) {
|
|
30
30
|
__publicField(this, "defaultClient");
|
|
31
31
|
__publicField(this, "clients", /* @__PURE__ */ new Map());
|
|
32
|
+
__publicField(this, "coinType");
|
|
32
33
|
__publicField(this, "keyInfoByPublicKey", /* @__PURE__ */ new Map());
|
|
33
34
|
__publicField(this, "publicKeyByDerivationPath", /* @__PURE__ */ new Map());
|
|
34
35
|
__publicField(this, "getClient", (userId) => {
|
|
@@ -40,6 +41,7 @@ var FireblocksHandler = class {
|
|
|
40
41
|
throw new Error("No Fireblocks client available for this user.");
|
|
41
42
|
}
|
|
42
43
|
});
|
|
44
|
+
this.coinType = coinType ?? coreSigningLib.CC_COIN_TYPE;
|
|
43
45
|
if (defaultKey) {
|
|
44
46
|
this.defaultClient = new tsSdk.Fireblocks({
|
|
45
47
|
apiKey: defaultKey.apiKey,
|
|
@@ -78,7 +80,7 @@ var FireblocksHandler = class {
|
|
|
78
80
|
if (vault.id) {
|
|
79
81
|
const derivationPath = [
|
|
80
82
|
44,
|
|
81
|
-
|
|
83
|
+
this.coinType,
|
|
82
84
|
Number(vault.id) || 0,
|
|
83
85
|
0,
|
|
84
86
|
0
|
|
@@ -307,7 +309,8 @@ var FireblocksApiKeyInfoSchema = zod.z.object({
|
|
|
307
309
|
var FireblocksConfigSchema = zod.z.object({
|
|
308
310
|
defaultApiKey: FireblocksApiKeyInfoSchema.optional(),
|
|
309
311
|
userApiKeys: zod.z.map(zod.z.string(), FireblocksApiKeyInfoSchema),
|
|
310
|
-
apiPath: zod.z.string().optional()
|
|
312
|
+
apiPath: zod.z.string().optional(),
|
|
313
|
+
coinType: zod.z.number().optional()
|
|
311
314
|
});
|
|
312
315
|
var createFireblocksHandler = (config) => {
|
|
313
316
|
return new FireblocksHandler(
|
|
@@ -316,7 +319,8 @@ var createFireblocksHandler = (config) => {
|
|
|
316
319
|
apiSecret: config.defaultKeyInfo.apiSecret
|
|
317
320
|
} : void 0,
|
|
318
321
|
config.userApiKeys,
|
|
319
|
-
config.apiPath || "https://api.fireblocks.io/v1"
|
|
322
|
+
config.apiPath || "https://api.fireblocks.io/v1",
|
|
323
|
+
config.coinType
|
|
320
324
|
);
|
|
321
325
|
};
|
|
322
326
|
var FireblocksSigningDriver = class {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fireblocks.ts","../src/index.ts"],"names":["z","pino","Fireblocks","CC_COIN_TYPE","PublicKeyInformationAlgorithmEnum","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 {\n Fireblocks,\n PublicKeyInformationAlgorithmEnum,\n TransactionResponse,\n VaultAccount,\n} from '@fireblocks/ts-sdk'\nimport { pino } from 'pino'\nimport {\n SigningStatus,\n CC_COIN_TYPE,\n KeyIdentifier,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\nconst RawMessageSchema = z.object({\n content: z.string(),\n derivationPath: z.array(z.number()),\n})\n\nconst RawMessageDataSchema = z.object({\n messages: z.array(RawMessageSchema),\n algorithm: z.string(),\n})\n\nconst RawMessageExtraParametersSchema = z.object({\n rawMessageData: RawMessageDataSchema,\n})\n\ninterface FireblocksKey {\n name: string\n publicKey: string\n derivationPath: number[]\n algorithm: PublicKeyInformationAlgorithmEnum\n}\n\nexport interface FireblocksTransaction {\n txId: string\n status: SigningStatus\n createdAt?: number\n signature?: string | undefined\n publicKey?: string | undefined\n derivationPath: number[]\n}\n\nexport interface FireblocksApiKeyInfo {\n apiKey: string\n apiSecret: string\n}\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport class FireblocksHandler {\n private defaultClient: Fireblocks | undefined = undefined\n private clients: Map<string, Fireblocks> = new Map()\n\n private keyInfoByPublicKey: Map<string, FireblocksKey> = new Map()\n private publicKeyByDerivationPath: Map<string, string> = new Map()\n\n private getClient = (userId: string | undefined): Fireblocks => {\n if (userId !== undefined && this.clients.has(userId)) {\n return this.clients.get(userId)!\n } else if (this.defaultClient) {\n return this.defaultClient\n } else {\n throw new Error('No Fireblocks client available for this user.')\n }\n }\n\n constructor(\n defaultKey: FireblocksApiKeyInfo | undefined,\n userKeys: Map<string, FireblocksApiKeyInfo>,\n apiPath: string = 'https://api.fireblocks.io/v1'\n ) {\n if (defaultKey) {\n this.defaultClient = new Fireblocks({\n apiKey: defaultKey.apiKey,\n basePath: apiPath,\n secretKey: defaultKey.apiSecret,\n })\n }\n userKeys.forEach((keyInfo, userId) => {\n const client = new Fireblocks({\n apiKey: keyInfo.apiKey,\n basePath: apiPath,\n secretKey: keyInfo.apiSecret,\n })\n this.clients.set(userId, client)\n })\n }\n\n /**\n * Get all public keys which correspond to Fireblocks vault accounts. This will\n * also refresh the key cache.\n * @returns List of Fireblocks public key information\n */\n public async getPublicKeys(\n userId: string | undefined\n ): Promise<FireblocksKey[]> {\n const keys: FireblocksKey[] = []\n try {\n const client = this.getClient(userId)\n const vaultAccounts: VaultAccount[] = []\n let after: string | undefined = undefined\n\n do {\n const resp = await client.vaults.getPagedVaultAccounts(\n after ? { after } : {}\n )\n after = resp.data.paging?.after\n vaultAccounts.push(...(resp.data.accounts || []))\n } while (after !== undefined)\n\n for (const vault of vaultAccounts) {\n if (vault.id) {\n const derivationPath = [\n 44,\n CC_COIN_TYPE,\n Number(vault.id) || 0,\n 0,\n 0,\n ]\n const publicKey = await this.lookupPublicKey(\n userId,\n derivationPath\n )\n\n const storedKey = {\n derivationPath,\n publicKey,\n name: vault.name || vault.id,\n algorithm:\n PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n }\n keys.push(storedKey)\n this.keyInfoByPublicKey.set(storedKey.publicKey, storedKey)\n }\n }\n } catch (error) {\n logger.error(error, 'Error fetching vault accounts:')\n throw error\n }\n return keys\n }\n\n /**\n * Takes a Fireblocks response from a transactions call and extracts the transaction information\n * relevant to the Wallet Gateway. This will potentially fetch the public key since unsigned transactions\n * do not include it\n * @returns FireblocksTransaction\n */\n private async formatTransaction(\n userId: string | undefined,\n tx: TransactionResponse\n ): Promise<FireblocksTransaction | undefined> {\n if (tx.signedMessages && tx.signedMessages.length > 0) {\n const signedMessage = tx.signedMessages[0]\n if (\n !signedMessage.publicKey ||\n !signedMessage.content ||\n !signedMessage.signature\n ) {\n return undefined\n }\n return {\n txId: tx.id!,\n status: 'signed',\n createdAt: tx.createdAt!,\n publicKey: signedMessage.publicKey,\n signature: signedMessage.signature.fullSig,\n derivationPath: signedMessage.derivationPath!,\n }\n } else {\n const rawMessageData = RawMessageExtraParametersSchema.safeParse(\n tx.extraParameters\n )\n if (!rawMessageData.success) {\n // Skip transactions with invalid rawMessageData\n return undefined\n }\n const message = rawMessageData.data.rawMessageData.messages[0]\n const publicKey = await this.lookupPublicKey(\n userId,\n message.derivationPath\n )\n\n const status =\n tx.status === 'REJECTED' ||\n tx.status === 'BLOCKED' ||\n tx.status === 'CANCELLED'\n ? 'rejected'\n : tx.status === 'FAILED'\n ? 'failed'\n : 'pending'\n return {\n txId: tx.id!,\n status: status,\n createdAt: tx.createdAt!,\n publicKey: publicKey,\n derivationPath: message.derivationPath,\n }\n }\n }\n\n /**\n * Looks up or fetches the public key (only) for a given derivation path\n * @returns The public key as a string\n */\n private async lookupPublicKey(\n userId: string | undefined,\n derivationPath: number[]\n ): Promise<string> {\n const derivationPathString = JSON.stringify(derivationPath)\n if (this.publicKeyByDerivationPath.has(derivationPathString)) {\n return this.publicKeyByDerivationPath.get(derivationPathString)!\n } else {\n try {\n const client = this.getClient(userId)\n const key = await client.vaults.getPublicKeyInfo({\n algorithm: PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n derivationPath: derivationPathString,\n })\n if (key.data.publicKey) {\n this.publicKeyByDerivationPath.set(\n derivationPathString,\n key.data.publicKey\n )\n return key.data.publicKey\n } else {\n throw new Error(\n 'Malformed public key response from Fireblocks'\n )\n }\n } catch (error) {\n throw new Error(`Error looking up public key: ${error}`, {\n cause: error,\n })\n }\n }\n }\n\n /**\n * Fetch a single RAW transaction from Fireblocks by its transaction ID\n * @returns FireblocksTransaction or undefined if not found\n */\n public async getTransaction(\n userId: string | undefined,\n txId: string\n ): Promise<FireblocksTransaction | undefined> {\n try {\n const client = this.getClient(userId)\n const transaction = await client.transactions.getTransaction({\n txId: txId,\n })\n return await this.formatTransaction(userId, transaction.data)\n } catch {\n // if the transaction was not found for any reason, return undefined\n return undefined\n }\n }\n\n /**\n * Get all RAW transactions from Fireblocks. Returns an async generator as\n * this may return a large number of transactions and will occasionally need to\n * refresh the key cache.\n * @returns AsyncGenerator of FireblocksTransactions\n */\n public async *getTransactions(\n userId: string | undefined,\n {\n limit = 200,\n before,\n }: {\n limit?: number\n before?: number\n } = {}\n ): AsyncGenerator<FireblocksTransaction> {\n let fetchedLength: number\n let beforeQuery: number | undefined = before\n try {\n const client = this.getClient(userId)\n do {\n const transactions = await client.transactions.getTransactions({\n sourceType: 'VAULT_ACCOUNT',\n limit,\n ...(beforeQuery ? { before: beforeQuery.toString() } : {}),\n })\n fetchedLength = transactions.data.length\n for (const tx of transactions.data) {\n // set next before to createdAt - 1 as before is inclusive of any transaction exactly at that\n // timestamp\n beforeQuery = tx.createdAt! - 1\n const formatTransaction = await this.formatTransaction(\n userId,\n tx\n )\n if (formatTransaction) {\n yield formatTransaction\n } else {\n // if the transaction failed to format, continue so we do not skip remaining valid transactions\n continue\n }\n }\n // once the fetched length is 0 before our last createdAt tx,\n // there will be no transactions to fetch\n } while (fetchedLength > 0)\n } catch (error) {\n logger.error(error, 'Error fetching signatures')\n throw error\n }\n }\n /**\n * Sign a transaction using a public key\n * @param userId - id of a user to get respective client and keys\n * @param txHash - Hash of the transaction to sign\n * @param keyIdentifier - The key identifier (must include publicKey)\n * @param externalTxId - The transaction ID assigned by the Wallet Gateway\n * @return The transaction object from Fireblocks\n */\n public async signTransaction(\n userId: string | undefined,\n txHash: string,\n keyIdentifier: KeyIdentifier,\n externalTxId?: string\n ): Promise<FireblocksTransaction> {\n try {\n const client = this.getClient(userId)\n if (!keyIdentifier.publicKey) {\n throw new Error(\n 'Public key is required for Fireblocks signing provider'\n )\n }\n const publicKey = keyIdentifier.publicKey\n if (!this.keyInfoByPublicKey.has(publicKey)) {\n // refresh the keycache\n await this.getPublicKeys(userId)\n }\n const key = this.keyInfoByPublicKey.get(publicKey)\n if (!key) {\n throw new Error(`Public key ${publicKey} not found in vaults`)\n }\n\n const transaction = await client.transactions.createTransaction({\n transactionRequest: {\n operation: 'RAW',\n note: `Signing transaction with public key ${publicKey}`,\n externalTxId,\n extraParameters: {\n rawMessageData: {\n messages: [\n {\n content: txHash,\n derivationPath: key.derivationPath,\n },\n ],\n algorithm: key.algorithm,\n },\n },\n },\n })\n let status: SigningStatus = 'pending'\n switch (transaction.data.status) {\n case 'REJECTED':\n status = 'rejected'\n break\n case 'COMPLETED':\n status = 'signed'\n break\n case 'CANCELLED':\n case 'FAILED':\n case 'BLOCKED':\n status = 'failed'\n break\n }\n\n return {\n txId: transaction.data.id!,\n status,\n publicKey: key.publicKey,\n derivationPath: key.derivationPath,\n }\n } catch (error) {\n logger.error(error, 'Error signing transaction:')\n throw error\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Disabled unused vars rule to allow for future implementations\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n buildController,\n PartyMode,\n SigningDriverInterface,\n SigningProvider,\n SignMessageResult,\n} from '@canton-network/core-signing-lib'\n\nimport {\n SignTransactionParams,\n SignTransactionResult,\n GetTransactionParams,\n GetTransactionResult,\n GetTransactionsResult,\n GetTransactionsParams,\n GetKeysResult,\n CreateKeyParams,\n CreateKeyResult,\n GetConfigurationResult,\n SetConfigurationParams,\n SubscribeTransactionsParams,\n SubscribeTransactionsResult,\n SetConfigurationResult,\n Transaction,\n} from '@canton-network/core-signing-lib'\nimport { FireblocksHandler, FireblocksApiKeyInfo } from './fireblocks.js'\nimport _ from 'lodash'\nimport { z } from 'zod'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\n\nexport interface FireblocksConfig {\n defaultKeyInfo?: FireblocksApiKeyInfo\n userApiKeys: Map<string, FireblocksApiKeyInfo>\n apiPath?: string\n}\n\nconst FireblocksApiKeyInfoSchema = z.object({\n apiKey: z.string(),\n apiSecret: z.string(),\n})\n\nconst FireblocksConfigSchema = z.object({\n defaultApiKey: FireblocksApiKeyInfoSchema.optional(),\n userApiKeys: z.map(z.string(), FireblocksApiKeyInfoSchema),\n apiPath: z.string().optional(),\n})\n\nconst createFireblocksHandler = (\n config: FireblocksConfig\n): FireblocksHandler => {\n return new FireblocksHandler(\n config.defaultKeyInfo\n ? {\n apiKey: config.defaultKeyInfo.apiKey,\n apiSecret: config.defaultKeyInfo.apiSecret,\n }\n : undefined,\n config.userApiKeys,\n config.apiPath || 'https://api.fireblocks.io/v1'\n )\n}\n\nexport default class FireblocksSigningDriver implements SigningDriverInterface {\n private fireblocks: FireblocksHandler\n private config: FireblocksConfig\n\n constructor(config: FireblocksConfig) {\n this.config = config\n this.fireblocks = createFireblocksHandler(config)\n }\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.FIREBLOCKS\n public controller = (userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n // TODO: validate transaction here\n\n try {\n const tx = await this.fireblocks.signTransaction(\n userId,\n params.txHash,\n params.keyIdentifier,\n params.internalTxId\n )\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n // TODO remove comment below and write a test once / if ever implemented\n // v8 ignore next -- @preserve\n signMessage: async (): Promise<SignMessageResult> => {\n return {\n error: 'not_allowed',\n error_description:\n 'Signing messages is not yet supported with Fireblocks.',\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n const tx = await this.fireblocks.getTransaction(\n userId,\n params.txId\n )\n if (tx) {\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n } as GetTransactionResult\n } else {\n return {\n error: 'transaction_not_found',\n error_description:\n 'The requested transaction does not exist.',\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n const transactions: Transaction[] = []\n if (params.publicKeys || params.txIds) {\n const txIds = new Set(params.txIds)\n const publicKeys = new Set(params.publicKeys)\n for await (const tx of this.fireblocks.getTransactions(\n userId\n )) {\n if (\n txIds.has(tx.txId) ||\n publicKeys.has(tx.publicKey || '')\n ) {\n transactions.push({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n })\n }\n if (\n params.txIds &&\n !params.publicKeys &&\n transactions.length == txIds.size\n ) {\n // stop if we are filtering by only txIds and have found all requested transactions\n break\n }\n }\n return {\n transactions: transactions,\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.fireblocks.getPublicKeys(userId)\n return {\n keys: keys.map((k) => ({\n id: k.derivationPath.join('-'),\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 return {\n error: 'not_allowed',\n error_description:\n 'Creating a Fireblocks key through the Wallet Gateway is not allowed, please create new keys directly in Fireblocks.',\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const hideFireblocksKeySecret = (\n keyInfo: FireblocksApiKeyInfo | undefined\n ): FireblocksApiKeyInfo | undefined => {\n return keyInfo\n ? {\n apiKey: keyInfo.apiKey,\n apiSecret: '***HIDDEN***',\n }\n : undefined\n }\n\n return {\n ...this.config,\n defaultKeyInfo: hideFireblocksKeySecret(\n this.config.defaultKeyInfo\n ),\n userApiKeys: new Map(\n [...this.config.userApiKeys].map(([k, v]) => [\n k,\n hideFireblocksKeySecret(v),\n ])\n ),\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n const validated = FireblocksConfigSchema.safeParse(params)\n if (!validated.success) {\n return {\n error: 'bad_arguments',\n error_description: validated.error.message,\n }\n }\n if (!_.isEqual(validated.data, this.config)) {\n this.config = validated.data\n this.fireblocks = createFireblocksHandler(this.config)\n }\n return params\n },\n\n // TODO: implement subscribeTransactions - we will need to figure out how to handle subscriptions\n // when the controller is not running in a server context\n // v8 ignore next -- @preserve\n subscribeTransactions: async (\n params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/fireblocks.ts","../src/index.ts"],"names":["z","pino","CC_COIN_TYPE","Fireblocks","PublicKeyInformationAlgorithmEnum","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 {\n Fireblocks,\n PublicKeyInformationAlgorithmEnum,\n TransactionResponse,\n VaultAccount,\n} from '@fireblocks/ts-sdk'\nimport { pino } from 'pino'\nimport {\n SigningStatus,\n CC_COIN_TYPE,\n KeyIdentifier,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\nconst RawMessageSchema = z.object({\n content: z.string(),\n derivationPath: z.array(z.number()),\n})\n\nconst RawMessageDataSchema = z.object({\n messages: z.array(RawMessageSchema),\n algorithm: z.string(),\n})\n\nconst RawMessageExtraParametersSchema = z.object({\n rawMessageData: RawMessageDataSchema,\n})\n\ninterface FireblocksKey {\n name: string\n publicKey: string\n derivationPath: number[]\n algorithm: PublicKeyInformationAlgorithmEnum\n}\n\nexport interface FireblocksTransaction {\n txId: string\n status: SigningStatus\n createdAt?: number\n signature?: string | undefined\n publicKey?: string | undefined\n derivationPath: number[]\n}\n\nexport interface FireblocksApiKeyInfo {\n apiKey: string\n apiSecret: string\n}\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport class FireblocksHandler {\n private defaultClient: Fireblocks | undefined = undefined\n private clients: Map<string, Fireblocks> = new Map()\n private coinType: number\n\n private keyInfoByPublicKey: Map<string, FireblocksKey> = new Map()\n private publicKeyByDerivationPath: Map<string, string> = new Map()\n\n private getClient = (userId: string | undefined): Fireblocks => {\n if (userId !== undefined && this.clients.has(userId)) {\n return this.clients.get(userId)!\n } else if (this.defaultClient) {\n return this.defaultClient\n } else {\n throw new Error('No Fireblocks client available for this user.')\n }\n }\n\n constructor(\n defaultKey: FireblocksApiKeyInfo | undefined,\n userKeys: Map<string, FireblocksApiKeyInfo>,\n apiPath: string = 'https://api.fireblocks.io/v1',\n coinType?: number\n ) {\n this.coinType = coinType ?? CC_COIN_TYPE\n if (defaultKey) {\n this.defaultClient = new Fireblocks({\n apiKey: defaultKey.apiKey,\n basePath: apiPath,\n secretKey: defaultKey.apiSecret,\n })\n }\n userKeys.forEach((keyInfo, userId) => {\n const client = new Fireblocks({\n apiKey: keyInfo.apiKey,\n basePath: apiPath,\n secretKey: keyInfo.apiSecret,\n })\n this.clients.set(userId, client)\n })\n }\n\n /**\n * Get all public keys which correspond to Fireblocks vault accounts. This will\n * also refresh the key cache.\n * @returns List of Fireblocks public key information\n */\n public async getPublicKeys(\n userId: string | undefined\n ): Promise<FireblocksKey[]> {\n const keys: FireblocksKey[] = []\n try {\n const client = this.getClient(userId)\n const vaultAccounts: VaultAccount[] = []\n let after: string | undefined = undefined\n\n do {\n const resp = await client.vaults.getPagedVaultAccounts(\n after ? { after } : {}\n )\n after = resp.data.paging?.after\n vaultAccounts.push(...(resp.data.accounts || []))\n } while (after !== undefined)\n\n for (const vault of vaultAccounts) {\n if (vault.id) {\n const derivationPath = [\n 44,\n this.coinType,\n Number(vault.id) || 0,\n 0,\n 0,\n ]\n const publicKey = await this.lookupPublicKey(\n userId,\n derivationPath\n )\n\n const storedKey = {\n derivationPath,\n publicKey,\n name: vault.name || vault.id,\n algorithm:\n PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n }\n keys.push(storedKey)\n this.keyInfoByPublicKey.set(storedKey.publicKey, storedKey)\n }\n }\n } catch (error) {\n logger.error(error, 'Error fetching vault accounts:')\n throw error\n }\n return keys\n }\n\n /**\n * Takes a Fireblocks response from a transactions call and extracts the transaction information\n * relevant to the Wallet Gateway. This will potentially fetch the public key since unsigned transactions\n * do not include it\n * @returns FireblocksTransaction\n */\n private async formatTransaction(\n userId: string | undefined,\n tx: TransactionResponse\n ): Promise<FireblocksTransaction | undefined> {\n if (tx.signedMessages && tx.signedMessages.length > 0) {\n const signedMessage = tx.signedMessages[0]\n if (\n !signedMessage.publicKey ||\n !signedMessage.content ||\n !signedMessage.signature\n ) {\n return undefined\n }\n return {\n txId: tx.id!,\n status: 'signed',\n createdAt: tx.createdAt!,\n publicKey: signedMessage.publicKey,\n signature: signedMessage.signature.fullSig,\n derivationPath: signedMessage.derivationPath!,\n }\n } else {\n const rawMessageData = RawMessageExtraParametersSchema.safeParse(\n tx.extraParameters\n )\n if (!rawMessageData.success) {\n // Skip transactions with invalid rawMessageData\n return undefined\n }\n const message = rawMessageData.data.rawMessageData.messages[0]\n const publicKey = await this.lookupPublicKey(\n userId,\n message.derivationPath\n )\n\n const status =\n tx.status === 'REJECTED' ||\n tx.status === 'BLOCKED' ||\n tx.status === 'CANCELLED'\n ? 'rejected'\n : tx.status === 'FAILED'\n ? 'failed'\n : 'pending'\n return {\n txId: tx.id!,\n status: status,\n createdAt: tx.createdAt!,\n publicKey: publicKey,\n derivationPath: message.derivationPath,\n }\n }\n }\n\n /**\n * Looks up or fetches the public key (only) for a given derivation path\n * @returns The public key as a string\n */\n private async lookupPublicKey(\n userId: string | undefined,\n derivationPath: number[]\n ): Promise<string> {\n const derivationPathString = JSON.stringify(derivationPath)\n if (this.publicKeyByDerivationPath.has(derivationPathString)) {\n return this.publicKeyByDerivationPath.get(derivationPathString)!\n } else {\n try {\n const client = this.getClient(userId)\n const key = await client.vaults.getPublicKeyInfo({\n algorithm: PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n derivationPath: derivationPathString,\n })\n if (key.data.publicKey) {\n this.publicKeyByDerivationPath.set(\n derivationPathString,\n key.data.publicKey\n )\n return key.data.publicKey\n } else {\n throw new Error(\n 'Malformed public key response from Fireblocks'\n )\n }\n } catch (error) {\n throw new Error(`Error looking up public key: ${error}`, {\n cause: error,\n })\n }\n }\n }\n\n /**\n * Fetch a single RAW transaction from Fireblocks by its transaction ID\n * @returns FireblocksTransaction or undefined if not found\n */\n public async getTransaction(\n userId: string | undefined,\n txId: string\n ): Promise<FireblocksTransaction | undefined> {\n try {\n const client = this.getClient(userId)\n const transaction = await client.transactions.getTransaction({\n txId: txId,\n })\n return await this.formatTransaction(userId, transaction.data)\n } catch {\n // if the transaction was not found for any reason, return undefined\n return undefined\n }\n }\n\n /**\n * Get all RAW transactions from Fireblocks. Returns an async generator as\n * this may return a large number of transactions and will occasionally need to\n * refresh the key cache.\n * @returns AsyncGenerator of FireblocksTransactions\n */\n public async *getTransactions(\n userId: string | undefined,\n {\n limit = 200,\n before,\n }: {\n limit?: number\n before?: number\n } = {}\n ): AsyncGenerator<FireblocksTransaction> {\n let fetchedLength: number\n let beforeQuery: number | undefined = before\n try {\n const client = this.getClient(userId)\n do {\n const transactions = await client.transactions.getTransactions({\n sourceType: 'VAULT_ACCOUNT',\n limit,\n ...(beforeQuery ? { before: beforeQuery.toString() } : {}),\n })\n fetchedLength = transactions.data.length\n for (const tx of transactions.data) {\n // set next before to createdAt - 1 as before is inclusive of any transaction exactly at that\n // timestamp\n beforeQuery = tx.createdAt! - 1\n const formatTransaction = await this.formatTransaction(\n userId,\n tx\n )\n if (formatTransaction) {\n yield formatTransaction\n } else {\n // if the transaction failed to format, continue so we do not skip remaining valid transactions\n continue\n }\n }\n // once the fetched length is 0 before our last createdAt tx,\n // there will be no transactions to fetch\n } while (fetchedLength > 0)\n } catch (error) {\n logger.error(error, 'Error fetching signatures')\n throw error\n }\n }\n /**\n * Sign a transaction using a public key\n * @param userId - id of a user to get respective client and keys\n * @param txHash - Hash of the transaction to sign\n * @param keyIdentifier - The key identifier (must include publicKey)\n * @param externalTxId - The transaction ID assigned by the Wallet Gateway\n * @return The transaction object from Fireblocks\n */\n public async signTransaction(\n userId: string | undefined,\n txHash: string,\n keyIdentifier: KeyIdentifier,\n externalTxId?: string\n ): Promise<FireblocksTransaction> {\n try {\n const client = this.getClient(userId)\n if (!keyIdentifier.publicKey) {\n throw new Error(\n 'Public key is required for Fireblocks signing provider'\n )\n }\n const publicKey = keyIdentifier.publicKey\n if (!this.keyInfoByPublicKey.has(publicKey)) {\n // refresh the keycache\n await this.getPublicKeys(userId)\n }\n const key = this.keyInfoByPublicKey.get(publicKey)\n if (!key) {\n throw new Error(`Public key ${publicKey} not found in vaults`)\n }\n\n const transaction = await client.transactions.createTransaction({\n transactionRequest: {\n operation: 'RAW',\n note: `Signing transaction with public key ${publicKey}`,\n externalTxId,\n extraParameters: {\n rawMessageData: {\n messages: [\n {\n content: txHash,\n derivationPath: key.derivationPath,\n },\n ],\n algorithm: key.algorithm,\n },\n },\n },\n })\n let status: SigningStatus = 'pending'\n switch (transaction.data.status) {\n case 'REJECTED':\n status = 'rejected'\n break\n case 'COMPLETED':\n status = 'signed'\n break\n case 'CANCELLED':\n case 'FAILED':\n case 'BLOCKED':\n status = 'failed'\n break\n }\n\n return {\n txId: transaction.data.id!,\n status,\n publicKey: key.publicKey,\n derivationPath: key.derivationPath,\n }\n } catch (error) {\n logger.error(error, 'Error signing transaction:')\n throw error\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Disabled unused vars rule to allow for future implementations\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n buildController,\n PartyMode,\n SigningDriverInterface,\n SigningProvider,\n SignMessageResult,\n} from '@canton-network/core-signing-lib'\n\nimport {\n SignTransactionParams,\n SignTransactionResult,\n GetTransactionParams,\n GetTransactionResult,\n GetTransactionsResult,\n GetTransactionsParams,\n GetKeysResult,\n CreateKeyParams,\n CreateKeyResult,\n GetConfigurationResult,\n SetConfigurationParams,\n SubscribeTransactionsParams,\n SubscribeTransactionsResult,\n SetConfigurationResult,\n Transaction,\n} from '@canton-network/core-signing-lib'\nimport { FireblocksHandler, FireblocksApiKeyInfo } from './fireblocks.js'\nimport _ from 'lodash'\nimport { z } from 'zod'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\n\nexport interface FireblocksConfig {\n defaultKeyInfo?: FireblocksApiKeyInfo\n userApiKeys: Map<string, FireblocksApiKeyInfo>\n apiPath?: string\n coinType?: number\n}\n\nconst FireblocksApiKeyInfoSchema = z.object({\n apiKey: z.string(),\n apiSecret: z.string(),\n})\n\nconst FireblocksConfigSchema = z.object({\n defaultApiKey: FireblocksApiKeyInfoSchema.optional(),\n userApiKeys: z.map(z.string(), FireblocksApiKeyInfoSchema),\n apiPath: z.string().optional(),\n coinType: z.number().optional(),\n})\n\nconst createFireblocksHandler = (\n config: FireblocksConfig\n): FireblocksHandler => {\n return new FireblocksHandler(\n config.defaultKeyInfo\n ? {\n apiKey: config.defaultKeyInfo.apiKey,\n apiSecret: config.defaultKeyInfo.apiSecret,\n }\n : undefined,\n config.userApiKeys,\n config.apiPath || 'https://api.fireblocks.io/v1',\n config.coinType\n )\n}\n\nexport default class FireblocksSigningDriver implements SigningDriverInterface {\n private fireblocks: FireblocksHandler\n private config: FireblocksConfig\n\n constructor(config: FireblocksConfig) {\n this.config = config\n this.fireblocks = createFireblocksHandler(config)\n }\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.FIREBLOCKS\n public controller = (userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n // TODO: validate transaction here\n\n try {\n const tx = await this.fireblocks.signTransaction(\n userId,\n params.txHash,\n params.keyIdentifier,\n params.internalTxId\n )\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n // TODO remove comment below and write a test once / if ever implemented\n // v8 ignore next -- @preserve\n signMessage: async (): Promise<SignMessageResult> => {\n return {\n error: 'not_allowed',\n error_description:\n 'Signing messages is not yet supported with Fireblocks.',\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n const tx = await this.fireblocks.getTransaction(\n userId,\n params.txId\n )\n if (tx) {\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n } as GetTransactionResult\n } else {\n return {\n error: 'transaction_not_found',\n error_description:\n 'The requested transaction does not exist.',\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n const transactions: Transaction[] = []\n if (params.publicKeys || params.txIds) {\n const txIds = new Set(params.txIds)\n const publicKeys = new Set(params.publicKeys)\n for await (const tx of this.fireblocks.getTransactions(\n userId\n )) {\n if (\n txIds.has(tx.txId) ||\n publicKeys.has(tx.publicKey || '')\n ) {\n transactions.push({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n })\n }\n if (\n params.txIds &&\n !params.publicKeys &&\n transactions.length == txIds.size\n ) {\n // stop if we are filtering by only txIds and have found all requested transactions\n break\n }\n }\n return {\n transactions: transactions,\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.fireblocks.getPublicKeys(userId)\n return {\n keys: keys.map((k) => ({\n id: k.derivationPath.join('-'),\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 return {\n error: 'not_allowed',\n error_description:\n 'Creating a Fireblocks key through the Wallet Gateway is not allowed, please create new keys directly in Fireblocks.',\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const hideFireblocksKeySecret = (\n keyInfo: FireblocksApiKeyInfo | undefined\n ): FireblocksApiKeyInfo | undefined => {\n return keyInfo\n ? {\n apiKey: keyInfo.apiKey,\n apiSecret: '***HIDDEN***',\n }\n : undefined\n }\n\n return {\n ...this.config,\n defaultKeyInfo: hideFireblocksKeySecret(\n this.config.defaultKeyInfo\n ),\n userApiKeys: new Map(\n [...this.config.userApiKeys].map(([k, v]) => [\n k,\n hideFireblocksKeySecret(v),\n ])\n ),\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n const validated = FireblocksConfigSchema.safeParse(params)\n if (!validated.success) {\n return {\n error: 'bad_arguments',\n error_description: validated.error.message,\n }\n }\n if (!_.isEqual(validated.data, this.config)) {\n this.config = validated.data\n this.fireblocks = createFireblocksHandler(this.config)\n }\n return params\n },\n\n // TODO: implement subscribeTransactions - we will need to figure out how to handle subscriptions\n // when the controller is not running in a server context\n // v8 ignore next -- @preserve\n subscribeTransactions: async (\n params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface FireblocksConfig {
|
|
|
5
5
|
defaultKeyInfo?: FireblocksApiKeyInfo;
|
|
6
6
|
userApiKeys: Map<string, FireblocksApiKeyInfo>;
|
|
7
7
|
apiPath?: string;
|
|
8
|
+
coinType?: number;
|
|
8
9
|
}
|
|
9
10
|
export default class FireblocksSigningDriver implements SigningDriverInterface {
|
|
10
11
|
private fireblocks;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,SAAS,EACT,sBAAsB,EACtB,eAAe,EAElB,MAAM,kCAAkC,CAAA;AAmBzC,OAAO,EAAqB,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,MAAM,WAAW,gBAAgB;IAC7B,cAAc,CAAC,EAAE,oBAAoB,CAAA;IACrC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,SAAS,EACT,sBAAsB,EACtB,eAAe,EAElB,MAAM,kCAAkC,CAAA;AAmBzC,OAAO,EAAqB,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,MAAM,WAAW,gBAAgB;IAC7B,cAAc,CAAC,EAAE,oBAAoB,CAAA;IACrC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AA8BD,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,sBAAsB;IAC1E,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,gBAAgB;IAI7B,SAAS,YAAqB;IAC9B,eAAe,kBAA6B;IAC5C,UAAU,GAAI,QAAQ,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS;;;;;;;;;;MAqLxD;CACT"}
|
package/dist/index.js
CHANGED
|
@@ -20,9 +20,10 @@ var RawMessageExtraParametersSchema = z.object({
|
|
|
20
20
|
});
|
|
21
21
|
var logger = pino({ name: "main", level: "debug" });
|
|
22
22
|
var FireblocksHandler = class {
|
|
23
|
-
constructor(defaultKey, userKeys, apiPath = "https://api.fireblocks.io/v1") {
|
|
23
|
+
constructor(defaultKey, userKeys, apiPath = "https://api.fireblocks.io/v1", coinType) {
|
|
24
24
|
__publicField(this, "defaultClient");
|
|
25
25
|
__publicField(this, "clients", /* @__PURE__ */ new Map());
|
|
26
|
+
__publicField(this, "coinType");
|
|
26
27
|
__publicField(this, "keyInfoByPublicKey", /* @__PURE__ */ new Map());
|
|
27
28
|
__publicField(this, "publicKeyByDerivationPath", /* @__PURE__ */ new Map());
|
|
28
29
|
__publicField(this, "getClient", (userId) => {
|
|
@@ -34,6 +35,7 @@ var FireblocksHandler = class {
|
|
|
34
35
|
throw new Error("No Fireblocks client available for this user.");
|
|
35
36
|
}
|
|
36
37
|
});
|
|
38
|
+
this.coinType = coinType ?? CC_COIN_TYPE;
|
|
37
39
|
if (defaultKey) {
|
|
38
40
|
this.defaultClient = new Fireblocks({
|
|
39
41
|
apiKey: defaultKey.apiKey,
|
|
@@ -72,7 +74,7 @@ var FireblocksHandler = class {
|
|
|
72
74
|
if (vault.id) {
|
|
73
75
|
const derivationPath = [
|
|
74
76
|
44,
|
|
75
|
-
|
|
77
|
+
this.coinType,
|
|
76
78
|
Number(vault.id) || 0,
|
|
77
79
|
0,
|
|
78
80
|
0
|
|
@@ -301,7 +303,8 @@ var FireblocksApiKeyInfoSchema = z.object({
|
|
|
301
303
|
var FireblocksConfigSchema = z.object({
|
|
302
304
|
defaultApiKey: FireblocksApiKeyInfoSchema.optional(),
|
|
303
305
|
userApiKeys: z.map(z.string(), FireblocksApiKeyInfoSchema),
|
|
304
|
-
apiPath: z.string().optional()
|
|
306
|
+
apiPath: z.string().optional(),
|
|
307
|
+
coinType: z.number().optional()
|
|
305
308
|
});
|
|
306
309
|
var createFireblocksHandler = (config) => {
|
|
307
310
|
return new FireblocksHandler(
|
|
@@ -310,7 +313,8 @@ var createFireblocksHandler = (config) => {
|
|
|
310
313
|
apiSecret: config.defaultKeyInfo.apiSecret
|
|
311
314
|
} : void 0,
|
|
312
315
|
config.userApiKeys,
|
|
313
|
-
config.apiPath || "https://api.fireblocks.io/v1"
|
|
316
|
+
config.apiPath || "https://api.fireblocks.io/v1",
|
|
317
|
+
config.coinType
|
|
314
318
|
);
|
|
315
319
|
};
|
|
316
320
|
var FireblocksSigningDriver = class {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fireblocks.ts","../src/index.ts"],"names":["z"],"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 {\n Fireblocks,\n PublicKeyInformationAlgorithmEnum,\n TransactionResponse,\n VaultAccount,\n} from '@fireblocks/ts-sdk'\nimport { pino } from 'pino'\nimport {\n SigningStatus,\n CC_COIN_TYPE,\n KeyIdentifier,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\nconst RawMessageSchema = z.object({\n content: z.string(),\n derivationPath: z.array(z.number()),\n})\n\nconst RawMessageDataSchema = z.object({\n messages: z.array(RawMessageSchema),\n algorithm: z.string(),\n})\n\nconst RawMessageExtraParametersSchema = z.object({\n rawMessageData: RawMessageDataSchema,\n})\n\ninterface FireblocksKey {\n name: string\n publicKey: string\n derivationPath: number[]\n algorithm: PublicKeyInformationAlgorithmEnum\n}\n\nexport interface FireblocksTransaction {\n txId: string\n status: SigningStatus\n createdAt?: number\n signature?: string | undefined\n publicKey?: string | undefined\n derivationPath: number[]\n}\n\nexport interface FireblocksApiKeyInfo {\n apiKey: string\n apiSecret: string\n}\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport class FireblocksHandler {\n private defaultClient: Fireblocks | undefined = undefined\n private clients: Map<string, Fireblocks> = new Map()\n\n private keyInfoByPublicKey: Map<string, FireblocksKey> = new Map()\n private publicKeyByDerivationPath: Map<string, string> = new Map()\n\n private getClient = (userId: string | undefined): Fireblocks => {\n if (userId !== undefined && this.clients.has(userId)) {\n return this.clients.get(userId)!\n } else if (this.defaultClient) {\n return this.defaultClient\n } else {\n throw new Error('No Fireblocks client available for this user.')\n }\n }\n\n constructor(\n defaultKey: FireblocksApiKeyInfo | undefined,\n userKeys: Map<string, FireblocksApiKeyInfo>,\n apiPath: string = 'https://api.fireblocks.io/v1'\n ) {\n if (defaultKey) {\n this.defaultClient = new Fireblocks({\n apiKey: defaultKey.apiKey,\n basePath: apiPath,\n secretKey: defaultKey.apiSecret,\n })\n }\n userKeys.forEach((keyInfo, userId) => {\n const client = new Fireblocks({\n apiKey: keyInfo.apiKey,\n basePath: apiPath,\n secretKey: keyInfo.apiSecret,\n })\n this.clients.set(userId, client)\n })\n }\n\n /**\n * Get all public keys which correspond to Fireblocks vault accounts. This will\n * also refresh the key cache.\n * @returns List of Fireblocks public key information\n */\n public async getPublicKeys(\n userId: string | undefined\n ): Promise<FireblocksKey[]> {\n const keys: FireblocksKey[] = []\n try {\n const client = this.getClient(userId)\n const vaultAccounts: VaultAccount[] = []\n let after: string | undefined = undefined\n\n do {\n const resp = await client.vaults.getPagedVaultAccounts(\n after ? { after } : {}\n )\n after = resp.data.paging?.after\n vaultAccounts.push(...(resp.data.accounts || []))\n } while (after !== undefined)\n\n for (const vault of vaultAccounts) {\n if (vault.id) {\n const derivationPath = [\n 44,\n CC_COIN_TYPE,\n Number(vault.id) || 0,\n 0,\n 0,\n ]\n const publicKey = await this.lookupPublicKey(\n userId,\n derivationPath\n )\n\n const storedKey = {\n derivationPath,\n publicKey,\n name: vault.name || vault.id,\n algorithm:\n PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n }\n keys.push(storedKey)\n this.keyInfoByPublicKey.set(storedKey.publicKey, storedKey)\n }\n }\n } catch (error) {\n logger.error(error, 'Error fetching vault accounts:')\n throw error\n }\n return keys\n }\n\n /**\n * Takes a Fireblocks response from a transactions call and extracts the transaction information\n * relevant to the Wallet Gateway. This will potentially fetch the public key since unsigned transactions\n * do not include it\n * @returns FireblocksTransaction\n */\n private async formatTransaction(\n userId: string | undefined,\n tx: TransactionResponse\n ): Promise<FireblocksTransaction | undefined> {\n if (tx.signedMessages && tx.signedMessages.length > 0) {\n const signedMessage = tx.signedMessages[0]\n if (\n !signedMessage.publicKey ||\n !signedMessage.content ||\n !signedMessage.signature\n ) {\n return undefined\n }\n return {\n txId: tx.id!,\n status: 'signed',\n createdAt: tx.createdAt!,\n publicKey: signedMessage.publicKey,\n signature: signedMessage.signature.fullSig,\n derivationPath: signedMessage.derivationPath!,\n }\n } else {\n const rawMessageData = RawMessageExtraParametersSchema.safeParse(\n tx.extraParameters\n )\n if (!rawMessageData.success) {\n // Skip transactions with invalid rawMessageData\n return undefined\n }\n const message = rawMessageData.data.rawMessageData.messages[0]\n const publicKey = await this.lookupPublicKey(\n userId,\n message.derivationPath\n )\n\n const status =\n tx.status === 'REJECTED' ||\n tx.status === 'BLOCKED' ||\n tx.status === 'CANCELLED'\n ? 'rejected'\n : tx.status === 'FAILED'\n ? 'failed'\n : 'pending'\n return {\n txId: tx.id!,\n status: status,\n createdAt: tx.createdAt!,\n publicKey: publicKey,\n derivationPath: message.derivationPath,\n }\n }\n }\n\n /**\n * Looks up or fetches the public key (only) for a given derivation path\n * @returns The public key as a string\n */\n private async lookupPublicKey(\n userId: string | undefined,\n derivationPath: number[]\n ): Promise<string> {\n const derivationPathString = JSON.stringify(derivationPath)\n if (this.publicKeyByDerivationPath.has(derivationPathString)) {\n return this.publicKeyByDerivationPath.get(derivationPathString)!\n } else {\n try {\n const client = this.getClient(userId)\n const key = await client.vaults.getPublicKeyInfo({\n algorithm: PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n derivationPath: derivationPathString,\n })\n if (key.data.publicKey) {\n this.publicKeyByDerivationPath.set(\n derivationPathString,\n key.data.publicKey\n )\n return key.data.publicKey\n } else {\n throw new Error(\n 'Malformed public key response from Fireblocks'\n )\n }\n } catch (error) {\n throw new Error(`Error looking up public key: ${error}`, {\n cause: error,\n })\n }\n }\n }\n\n /**\n * Fetch a single RAW transaction from Fireblocks by its transaction ID\n * @returns FireblocksTransaction or undefined if not found\n */\n public async getTransaction(\n userId: string | undefined,\n txId: string\n ): Promise<FireblocksTransaction | undefined> {\n try {\n const client = this.getClient(userId)\n const transaction = await client.transactions.getTransaction({\n txId: txId,\n })\n return await this.formatTransaction(userId, transaction.data)\n } catch {\n // if the transaction was not found for any reason, return undefined\n return undefined\n }\n }\n\n /**\n * Get all RAW transactions from Fireblocks. Returns an async generator as\n * this may return a large number of transactions and will occasionally need to\n * refresh the key cache.\n * @returns AsyncGenerator of FireblocksTransactions\n */\n public async *getTransactions(\n userId: string | undefined,\n {\n limit = 200,\n before,\n }: {\n limit?: number\n before?: number\n } = {}\n ): AsyncGenerator<FireblocksTransaction> {\n let fetchedLength: number\n let beforeQuery: number | undefined = before\n try {\n const client = this.getClient(userId)\n do {\n const transactions = await client.transactions.getTransactions({\n sourceType: 'VAULT_ACCOUNT',\n limit,\n ...(beforeQuery ? { before: beforeQuery.toString() } : {}),\n })\n fetchedLength = transactions.data.length\n for (const tx of transactions.data) {\n // set next before to createdAt - 1 as before is inclusive of any transaction exactly at that\n // timestamp\n beforeQuery = tx.createdAt! - 1\n const formatTransaction = await this.formatTransaction(\n userId,\n tx\n )\n if (formatTransaction) {\n yield formatTransaction\n } else {\n // if the transaction failed to format, continue so we do not skip remaining valid transactions\n continue\n }\n }\n // once the fetched length is 0 before our last createdAt tx,\n // there will be no transactions to fetch\n } while (fetchedLength > 0)\n } catch (error) {\n logger.error(error, 'Error fetching signatures')\n throw error\n }\n }\n /**\n * Sign a transaction using a public key\n * @param userId - id of a user to get respective client and keys\n * @param txHash - Hash of the transaction to sign\n * @param keyIdentifier - The key identifier (must include publicKey)\n * @param externalTxId - The transaction ID assigned by the Wallet Gateway\n * @return The transaction object from Fireblocks\n */\n public async signTransaction(\n userId: string | undefined,\n txHash: string,\n keyIdentifier: KeyIdentifier,\n externalTxId?: string\n ): Promise<FireblocksTransaction> {\n try {\n const client = this.getClient(userId)\n if (!keyIdentifier.publicKey) {\n throw new Error(\n 'Public key is required for Fireblocks signing provider'\n )\n }\n const publicKey = keyIdentifier.publicKey\n if (!this.keyInfoByPublicKey.has(publicKey)) {\n // refresh the keycache\n await this.getPublicKeys(userId)\n }\n const key = this.keyInfoByPublicKey.get(publicKey)\n if (!key) {\n throw new Error(`Public key ${publicKey} not found in vaults`)\n }\n\n const transaction = await client.transactions.createTransaction({\n transactionRequest: {\n operation: 'RAW',\n note: `Signing transaction with public key ${publicKey}`,\n externalTxId,\n extraParameters: {\n rawMessageData: {\n messages: [\n {\n content: txHash,\n derivationPath: key.derivationPath,\n },\n ],\n algorithm: key.algorithm,\n },\n },\n },\n })\n let status: SigningStatus = 'pending'\n switch (transaction.data.status) {\n case 'REJECTED':\n status = 'rejected'\n break\n case 'COMPLETED':\n status = 'signed'\n break\n case 'CANCELLED':\n case 'FAILED':\n case 'BLOCKED':\n status = 'failed'\n break\n }\n\n return {\n txId: transaction.data.id!,\n status,\n publicKey: key.publicKey,\n derivationPath: key.derivationPath,\n }\n } catch (error) {\n logger.error(error, 'Error signing transaction:')\n throw error\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Disabled unused vars rule to allow for future implementations\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n buildController,\n PartyMode,\n SigningDriverInterface,\n SigningProvider,\n SignMessageResult,\n} from '@canton-network/core-signing-lib'\n\nimport {\n SignTransactionParams,\n SignTransactionResult,\n GetTransactionParams,\n GetTransactionResult,\n GetTransactionsResult,\n GetTransactionsParams,\n GetKeysResult,\n CreateKeyParams,\n CreateKeyResult,\n GetConfigurationResult,\n SetConfigurationParams,\n SubscribeTransactionsParams,\n SubscribeTransactionsResult,\n SetConfigurationResult,\n Transaction,\n} from '@canton-network/core-signing-lib'\nimport { FireblocksHandler, FireblocksApiKeyInfo } from './fireblocks.js'\nimport _ from 'lodash'\nimport { z } from 'zod'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\n\nexport interface FireblocksConfig {\n defaultKeyInfo?: FireblocksApiKeyInfo\n userApiKeys: Map<string, FireblocksApiKeyInfo>\n apiPath?: string\n}\n\nconst FireblocksApiKeyInfoSchema = z.object({\n apiKey: z.string(),\n apiSecret: z.string(),\n})\n\nconst FireblocksConfigSchema = z.object({\n defaultApiKey: FireblocksApiKeyInfoSchema.optional(),\n userApiKeys: z.map(z.string(), FireblocksApiKeyInfoSchema),\n apiPath: z.string().optional(),\n})\n\nconst createFireblocksHandler = (\n config: FireblocksConfig\n): FireblocksHandler => {\n return new FireblocksHandler(\n config.defaultKeyInfo\n ? {\n apiKey: config.defaultKeyInfo.apiKey,\n apiSecret: config.defaultKeyInfo.apiSecret,\n }\n : undefined,\n config.userApiKeys,\n config.apiPath || 'https://api.fireblocks.io/v1'\n )\n}\n\nexport default class FireblocksSigningDriver implements SigningDriverInterface {\n private fireblocks: FireblocksHandler\n private config: FireblocksConfig\n\n constructor(config: FireblocksConfig) {\n this.config = config\n this.fireblocks = createFireblocksHandler(config)\n }\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.FIREBLOCKS\n public controller = (userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n // TODO: validate transaction here\n\n try {\n const tx = await this.fireblocks.signTransaction(\n userId,\n params.txHash,\n params.keyIdentifier,\n params.internalTxId\n )\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n // TODO remove comment below and write a test once / if ever implemented\n // v8 ignore next -- @preserve\n signMessage: async (): Promise<SignMessageResult> => {\n return {\n error: 'not_allowed',\n error_description:\n 'Signing messages is not yet supported with Fireblocks.',\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n const tx = await this.fireblocks.getTransaction(\n userId,\n params.txId\n )\n if (tx) {\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n } as GetTransactionResult\n } else {\n return {\n error: 'transaction_not_found',\n error_description:\n 'The requested transaction does not exist.',\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n const transactions: Transaction[] = []\n if (params.publicKeys || params.txIds) {\n const txIds = new Set(params.txIds)\n const publicKeys = new Set(params.publicKeys)\n for await (const tx of this.fireblocks.getTransactions(\n userId\n )) {\n if (\n txIds.has(tx.txId) ||\n publicKeys.has(tx.publicKey || '')\n ) {\n transactions.push({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n })\n }\n if (\n params.txIds &&\n !params.publicKeys &&\n transactions.length == txIds.size\n ) {\n // stop if we are filtering by only txIds and have found all requested transactions\n break\n }\n }\n return {\n transactions: transactions,\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.fireblocks.getPublicKeys(userId)\n return {\n keys: keys.map((k) => ({\n id: k.derivationPath.join('-'),\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 return {\n error: 'not_allowed',\n error_description:\n 'Creating a Fireblocks key through the Wallet Gateway is not allowed, please create new keys directly in Fireblocks.',\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const hideFireblocksKeySecret = (\n keyInfo: FireblocksApiKeyInfo | undefined\n ): FireblocksApiKeyInfo | undefined => {\n return keyInfo\n ? {\n apiKey: keyInfo.apiKey,\n apiSecret: '***HIDDEN***',\n }\n : undefined\n }\n\n return {\n ...this.config,\n defaultKeyInfo: hideFireblocksKeySecret(\n this.config.defaultKeyInfo\n ),\n userApiKeys: new Map(\n [...this.config.userApiKeys].map(([k, v]) => [\n k,\n hideFireblocksKeySecret(v),\n ])\n ),\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n const validated = FireblocksConfigSchema.safeParse(params)\n if (!validated.success) {\n return {\n error: 'bad_arguments',\n error_description: validated.error.message,\n }\n }\n if (!_.isEqual(validated.data, this.config)) {\n this.config = validated.data\n this.fireblocks = createFireblocksHandler(this.config)\n }\n return params\n },\n\n // TODO: implement subscribeTransactions - we will need to figure out how to handle subscriptions\n // when the controller is not running in a server context\n // v8 ignore next -- @preserve\n subscribeTransactions: async (\n params: SubscribeTransactionsParams\n ): Promise<SubscribeTransactionsResult> =>\n Promise.resolve({} as SubscribeTransactionsResult),\n })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/fireblocks.ts","../src/index.ts"],"names":["z"],"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 {\n Fireblocks,\n PublicKeyInformationAlgorithmEnum,\n TransactionResponse,\n VaultAccount,\n} from '@fireblocks/ts-sdk'\nimport { pino } from 'pino'\nimport {\n SigningStatus,\n CC_COIN_TYPE,\n KeyIdentifier,\n} from '@canton-network/core-signing-lib'\nimport { z } from 'zod'\n\nconst RawMessageSchema = z.object({\n content: z.string(),\n derivationPath: z.array(z.number()),\n})\n\nconst RawMessageDataSchema = z.object({\n messages: z.array(RawMessageSchema),\n algorithm: z.string(),\n})\n\nconst RawMessageExtraParametersSchema = z.object({\n rawMessageData: RawMessageDataSchema,\n})\n\ninterface FireblocksKey {\n name: string\n publicKey: string\n derivationPath: number[]\n algorithm: PublicKeyInformationAlgorithmEnum\n}\n\nexport interface FireblocksTransaction {\n txId: string\n status: SigningStatus\n createdAt?: number\n signature?: string | undefined\n publicKey?: string | undefined\n derivationPath: number[]\n}\n\nexport interface FireblocksApiKeyInfo {\n apiKey: string\n apiSecret: string\n}\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport class FireblocksHandler {\n private defaultClient: Fireblocks | undefined = undefined\n private clients: Map<string, Fireblocks> = new Map()\n private coinType: number\n\n private keyInfoByPublicKey: Map<string, FireblocksKey> = new Map()\n private publicKeyByDerivationPath: Map<string, string> = new Map()\n\n private getClient = (userId: string | undefined): Fireblocks => {\n if (userId !== undefined && this.clients.has(userId)) {\n return this.clients.get(userId)!\n } else if (this.defaultClient) {\n return this.defaultClient\n } else {\n throw new Error('No Fireblocks client available for this user.')\n }\n }\n\n constructor(\n defaultKey: FireblocksApiKeyInfo | undefined,\n userKeys: Map<string, FireblocksApiKeyInfo>,\n apiPath: string = 'https://api.fireblocks.io/v1',\n coinType?: number\n ) {\n this.coinType = coinType ?? CC_COIN_TYPE\n if (defaultKey) {\n this.defaultClient = new Fireblocks({\n apiKey: defaultKey.apiKey,\n basePath: apiPath,\n secretKey: defaultKey.apiSecret,\n })\n }\n userKeys.forEach((keyInfo, userId) => {\n const client = new Fireblocks({\n apiKey: keyInfo.apiKey,\n basePath: apiPath,\n secretKey: keyInfo.apiSecret,\n })\n this.clients.set(userId, client)\n })\n }\n\n /**\n * Get all public keys which correspond to Fireblocks vault accounts. This will\n * also refresh the key cache.\n * @returns List of Fireblocks public key information\n */\n public async getPublicKeys(\n userId: string | undefined\n ): Promise<FireblocksKey[]> {\n const keys: FireblocksKey[] = []\n try {\n const client = this.getClient(userId)\n const vaultAccounts: VaultAccount[] = []\n let after: string | undefined = undefined\n\n do {\n const resp = await client.vaults.getPagedVaultAccounts(\n after ? { after } : {}\n )\n after = resp.data.paging?.after\n vaultAccounts.push(...(resp.data.accounts || []))\n } while (after !== undefined)\n\n for (const vault of vaultAccounts) {\n if (vault.id) {\n const derivationPath = [\n 44,\n this.coinType,\n Number(vault.id) || 0,\n 0,\n 0,\n ]\n const publicKey = await this.lookupPublicKey(\n userId,\n derivationPath\n )\n\n const storedKey = {\n derivationPath,\n publicKey,\n name: vault.name || vault.id,\n algorithm:\n PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n }\n keys.push(storedKey)\n this.keyInfoByPublicKey.set(storedKey.publicKey, storedKey)\n }\n }\n } catch (error) {\n logger.error(error, 'Error fetching vault accounts:')\n throw error\n }\n return keys\n }\n\n /**\n * Takes a Fireblocks response from a transactions call and extracts the transaction information\n * relevant to the Wallet Gateway. This will potentially fetch the public key since unsigned transactions\n * do not include it\n * @returns FireblocksTransaction\n */\n private async formatTransaction(\n userId: string | undefined,\n tx: TransactionResponse\n ): Promise<FireblocksTransaction | undefined> {\n if (tx.signedMessages && tx.signedMessages.length > 0) {\n const signedMessage = tx.signedMessages[0]\n if (\n !signedMessage.publicKey ||\n !signedMessage.content ||\n !signedMessage.signature\n ) {\n return undefined\n }\n return {\n txId: tx.id!,\n status: 'signed',\n createdAt: tx.createdAt!,\n publicKey: signedMessage.publicKey,\n signature: signedMessage.signature.fullSig,\n derivationPath: signedMessage.derivationPath!,\n }\n } else {\n const rawMessageData = RawMessageExtraParametersSchema.safeParse(\n tx.extraParameters\n )\n if (!rawMessageData.success) {\n // Skip transactions with invalid rawMessageData\n return undefined\n }\n const message = rawMessageData.data.rawMessageData.messages[0]\n const publicKey = await this.lookupPublicKey(\n userId,\n message.derivationPath\n )\n\n const status =\n tx.status === 'REJECTED' ||\n tx.status === 'BLOCKED' ||\n tx.status === 'CANCELLED'\n ? 'rejected'\n : tx.status === 'FAILED'\n ? 'failed'\n : 'pending'\n return {\n txId: tx.id!,\n status: status,\n createdAt: tx.createdAt!,\n publicKey: publicKey,\n derivationPath: message.derivationPath,\n }\n }\n }\n\n /**\n * Looks up or fetches the public key (only) for a given derivation path\n * @returns The public key as a string\n */\n private async lookupPublicKey(\n userId: string | undefined,\n derivationPath: number[]\n ): Promise<string> {\n const derivationPathString = JSON.stringify(derivationPath)\n if (this.publicKeyByDerivationPath.has(derivationPathString)) {\n return this.publicKeyByDerivationPath.get(derivationPathString)!\n } else {\n try {\n const client = this.getClient(userId)\n const key = await client.vaults.getPublicKeyInfo({\n algorithm: PublicKeyInformationAlgorithmEnum.EddsaEd25519,\n derivationPath: derivationPathString,\n })\n if (key.data.publicKey) {\n this.publicKeyByDerivationPath.set(\n derivationPathString,\n key.data.publicKey\n )\n return key.data.publicKey\n } else {\n throw new Error(\n 'Malformed public key response from Fireblocks'\n )\n }\n } catch (error) {\n throw new Error(`Error looking up public key: ${error}`, {\n cause: error,\n })\n }\n }\n }\n\n /**\n * Fetch a single RAW transaction from Fireblocks by its transaction ID\n * @returns FireblocksTransaction or undefined if not found\n */\n public async getTransaction(\n userId: string | undefined,\n txId: string\n ): Promise<FireblocksTransaction | undefined> {\n try {\n const client = this.getClient(userId)\n const transaction = await client.transactions.getTransaction({\n txId: txId,\n })\n return await this.formatTransaction(userId, transaction.data)\n } catch {\n // if the transaction was not found for any reason, return undefined\n return undefined\n }\n }\n\n /**\n * Get all RAW transactions from Fireblocks. Returns an async generator as\n * this may return a large number of transactions and will occasionally need to\n * refresh the key cache.\n * @returns AsyncGenerator of FireblocksTransactions\n */\n public async *getTransactions(\n userId: string | undefined,\n {\n limit = 200,\n before,\n }: {\n limit?: number\n before?: number\n } = {}\n ): AsyncGenerator<FireblocksTransaction> {\n let fetchedLength: number\n let beforeQuery: number | undefined = before\n try {\n const client = this.getClient(userId)\n do {\n const transactions = await client.transactions.getTransactions({\n sourceType: 'VAULT_ACCOUNT',\n limit,\n ...(beforeQuery ? { before: beforeQuery.toString() } : {}),\n })\n fetchedLength = transactions.data.length\n for (const tx of transactions.data) {\n // set next before to createdAt - 1 as before is inclusive of any transaction exactly at that\n // timestamp\n beforeQuery = tx.createdAt! - 1\n const formatTransaction = await this.formatTransaction(\n userId,\n tx\n )\n if (formatTransaction) {\n yield formatTransaction\n } else {\n // if the transaction failed to format, continue so we do not skip remaining valid transactions\n continue\n }\n }\n // once the fetched length is 0 before our last createdAt tx,\n // there will be no transactions to fetch\n } while (fetchedLength > 0)\n } catch (error) {\n logger.error(error, 'Error fetching signatures')\n throw error\n }\n }\n /**\n * Sign a transaction using a public key\n * @param userId - id of a user to get respective client and keys\n * @param txHash - Hash of the transaction to sign\n * @param keyIdentifier - The key identifier (must include publicKey)\n * @param externalTxId - The transaction ID assigned by the Wallet Gateway\n * @return The transaction object from Fireblocks\n */\n public async signTransaction(\n userId: string | undefined,\n txHash: string,\n keyIdentifier: KeyIdentifier,\n externalTxId?: string\n ): Promise<FireblocksTransaction> {\n try {\n const client = this.getClient(userId)\n if (!keyIdentifier.publicKey) {\n throw new Error(\n 'Public key is required for Fireblocks signing provider'\n )\n }\n const publicKey = keyIdentifier.publicKey\n if (!this.keyInfoByPublicKey.has(publicKey)) {\n // refresh the keycache\n await this.getPublicKeys(userId)\n }\n const key = this.keyInfoByPublicKey.get(publicKey)\n if (!key) {\n throw new Error(`Public key ${publicKey} not found in vaults`)\n }\n\n const transaction = await client.transactions.createTransaction({\n transactionRequest: {\n operation: 'RAW',\n note: `Signing transaction with public key ${publicKey}`,\n externalTxId,\n extraParameters: {\n rawMessageData: {\n messages: [\n {\n content: txHash,\n derivationPath: key.derivationPath,\n },\n ],\n algorithm: key.algorithm,\n },\n },\n },\n })\n let status: SigningStatus = 'pending'\n switch (transaction.data.status) {\n case 'REJECTED':\n status = 'rejected'\n break\n case 'COMPLETED':\n status = 'signed'\n break\n case 'CANCELLED':\n case 'FAILED':\n case 'BLOCKED':\n status = 'failed'\n break\n }\n\n return {\n txId: transaction.data.id!,\n status,\n publicKey: key.publicKey,\n derivationPath: key.derivationPath,\n }\n } catch (error) {\n logger.error(error, 'Error signing transaction:')\n throw error\n }\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// Disabled unused vars rule to allow for future implementations\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n buildController,\n PartyMode,\n SigningDriverInterface,\n SigningProvider,\n SignMessageResult,\n} from '@canton-network/core-signing-lib'\n\nimport {\n SignTransactionParams,\n SignTransactionResult,\n GetTransactionParams,\n GetTransactionResult,\n GetTransactionsResult,\n GetTransactionsParams,\n GetKeysResult,\n CreateKeyParams,\n CreateKeyResult,\n GetConfigurationResult,\n SetConfigurationParams,\n SubscribeTransactionsParams,\n SubscribeTransactionsResult,\n SetConfigurationResult,\n Transaction,\n} from '@canton-network/core-signing-lib'\nimport { FireblocksHandler, FireblocksApiKeyInfo } from './fireblocks.js'\nimport _ from 'lodash'\nimport { z } from 'zod'\nimport { AuthContext } from '@canton-network/core-wallet-auth'\n\nexport interface FireblocksConfig {\n defaultKeyInfo?: FireblocksApiKeyInfo\n userApiKeys: Map<string, FireblocksApiKeyInfo>\n apiPath?: string\n coinType?: number\n}\n\nconst FireblocksApiKeyInfoSchema = z.object({\n apiKey: z.string(),\n apiSecret: z.string(),\n})\n\nconst FireblocksConfigSchema = z.object({\n defaultApiKey: FireblocksApiKeyInfoSchema.optional(),\n userApiKeys: z.map(z.string(), FireblocksApiKeyInfoSchema),\n apiPath: z.string().optional(),\n coinType: z.number().optional(),\n})\n\nconst createFireblocksHandler = (\n config: FireblocksConfig\n): FireblocksHandler => {\n return new FireblocksHandler(\n config.defaultKeyInfo\n ? {\n apiKey: config.defaultKeyInfo.apiKey,\n apiSecret: config.defaultKeyInfo.apiSecret,\n }\n : undefined,\n config.userApiKeys,\n config.apiPath || 'https://api.fireblocks.io/v1',\n config.coinType\n )\n}\n\nexport default class FireblocksSigningDriver implements SigningDriverInterface {\n private fireblocks: FireblocksHandler\n private config: FireblocksConfig\n\n constructor(config: FireblocksConfig) {\n this.config = config\n this.fireblocks = createFireblocksHandler(config)\n }\n public partyMode = PartyMode.EXTERNAL\n public signingProvider = SigningProvider.FIREBLOCKS\n public controller = (userId: AuthContext['userId'] | undefined) =>\n buildController({\n signTransaction: async (\n params: SignTransactionParams\n ): Promise<SignTransactionResult> => {\n // TODO: validate transaction here\n\n try {\n const tx = await this.fireblocks.signTransaction(\n userId,\n params.txHash,\n params.keyIdentifier,\n params.internalTxId\n )\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n }\n } catch (error) {\n return {\n error: 'signing_error',\n error_description: (error as Error).message,\n }\n }\n },\n\n // TODO remove comment below and write a test once / if ever implemented\n // v8 ignore next -- @preserve\n signMessage: async (): Promise<SignMessageResult> => {\n return {\n error: 'not_allowed',\n error_description:\n 'Signing messages is not yet supported with Fireblocks.',\n }\n },\n\n getTransaction: async (\n params: GetTransactionParams\n ): Promise<GetTransactionResult> => {\n const tx = await this.fireblocks.getTransaction(\n userId,\n params.txId\n )\n if (tx) {\n return {\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n } as GetTransactionResult\n } else {\n return {\n error: 'transaction_not_found',\n error_description:\n 'The requested transaction does not exist.',\n }\n }\n },\n\n getTransactions: async (\n params: GetTransactionsParams\n ): Promise<GetTransactionsResult> => {\n const transactions: Transaction[] = []\n if (params.publicKeys || params.txIds) {\n const txIds = new Set(params.txIds)\n const publicKeys = new Set(params.publicKeys)\n for await (const tx of this.fireblocks.getTransactions(\n userId\n )) {\n if (\n txIds.has(tx.txId) ||\n publicKeys.has(tx.publicKey || '')\n ) {\n transactions.push({\n txId: tx.txId,\n status: tx.status,\n signature: tx.signature,\n publicKey: tx.publicKey,\n })\n }\n if (\n params.txIds &&\n !params.publicKeys &&\n transactions.length == txIds.size\n ) {\n // stop if we are filtering by only txIds and have found all requested transactions\n break\n }\n }\n return {\n transactions: transactions,\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.fireblocks.getPublicKeys(userId)\n return {\n keys: keys.map((k) => ({\n id: k.derivationPath.join('-'),\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 return {\n error: 'not_allowed',\n error_description:\n 'Creating a Fireblocks key through the Wallet Gateway is not allowed, please create new keys directly in Fireblocks.',\n }\n },\n\n getConfiguration: async (): Promise<GetConfigurationResult> => {\n const hideFireblocksKeySecret = (\n keyInfo: FireblocksApiKeyInfo | undefined\n ): FireblocksApiKeyInfo | undefined => {\n return keyInfo\n ? {\n apiKey: keyInfo.apiKey,\n apiSecret: '***HIDDEN***',\n }\n : undefined\n }\n\n return {\n ...this.config,\n defaultKeyInfo: hideFireblocksKeySecret(\n this.config.defaultKeyInfo\n ),\n userApiKeys: new Map(\n [...this.config.userApiKeys].map(([k, v]) => [\n k,\n hideFireblocksKeySecret(v),\n ])\n ),\n }\n },\n\n setConfiguration: async (\n params: SetConfigurationParams\n ): Promise<SetConfigurationResult> => {\n const validated = FireblocksConfigSchema.safeParse(params)\n if (!validated.success) {\n return {\n error: 'bad_arguments',\n error_description: validated.error.message,\n }\n }\n if (!_.isEqual(validated.data, this.config)) {\n this.config = validated.data\n this.fireblocks = createFireblocksHandler(this.config)\n }\n return params\n },\n\n // TODO: implement subscribeTransactions - we will need to figure out how to handle subscriptions\n // when the controller is not running in a server context\n // v8 ignore next -- @preserve\n subscribeTransactions: async (\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-fireblocks",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Wallet Gateway signing driver for Fireblocks",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"test:coverage": "vitest run --project node --coverage"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@canton-network/core-signing-lib": "^1.
|
|
28
|
-
"@canton-network/core-wallet-auth": "^1.
|
|
27
|
+
"@canton-network/core-signing-lib": "^1.8.0",
|
|
28
|
+
"@canton-network/core-wallet-auth": "^1.8.0",
|
|
29
29
|
"@fireblocks/ts-sdk": "^13.0.0",
|
|
30
30
|
"async-mutex": "^0.5.0",
|
|
31
31
|
"fs-extra": "^11.3.5",
|