@solana/keychain-fireblocks 0.6.1 → 1.1.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/__tests__/fireblocks-signer.integration.test.js +6 -7
- package/dist/__tests__/fireblocks-signer.integration.test.js.map +1 -1
- package/dist/__tests__/fireblocks-signer.test.js +63 -11
- package/dist/__tests__/fireblocks-signer.test.js.map +1 -1
- package/dist/__tests__/jwt.test.d.ts +2 -0
- package/dist/__tests__/jwt.test.d.ts.map +1 -0
- package/dist/__tests__/jwt.test.js +31 -0
- package/dist/__tests__/jwt.test.js.map +1 -0
- package/dist/fireblocks-signer.d.ts +11 -3
- package/dist/fireblocks-signer.d.ts.map +1 -1
- package/dist/fireblocks-signer.js +45 -26
- package/dist/fireblocks-signer.js.map +1 -1
- package/dist/jwt.d.ts.map +1 -1
- package/dist/jwt.js +6 -2
- package/dist/jwt.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/fireblocks-signer.integration.test.ts +8 -8
- package/src/__tests__/fireblocks-signer.test.ts +75 -12
- package/src/__tests__/jwt.test.ts +38 -0
- package/src/fireblocks-signer.ts +48 -25
- package/src/jwt.ts +6 -2
- package/src/types.ts +6 -2
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Unlike other signers, Fireblocks PROGRAM_CALL mode signs AND broadcasts
|
|
5
5
|
* the transaction to Solana through Fireblocks' infrastructure. The signed
|
|
6
|
-
* transaction never returns to the caller
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* transaction never returns to the caller, and the broadcast transaction id
|
|
7
|
+
* is not a reusable signer-bound signature artifact. This means LiteSVM
|
|
8
|
+
* (used by runSignerIntegrationTest) can never observe a signer-specific
|
|
9
|
+
* transaction signature from PROGRAM_CALL, so we test against devnet directly.
|
|
9
10
|
*
|
|
10
11
|
* RAW mode returns a raw signature but is not available on the Fireblocks
|
|
11
12
|
* sandbox/testnet environment used in CI.
|
|
@@ -21,7 +22,7 @@ function hasRequiredEnvVars() {
|
|
|
21
22
|
return REQUIRED_ENV_VARS.every(v => process.env[v]);
|
|
22
23
|
}
|
|
23
24
|
describe('FireblocksSigner Integration', () => {
|
|
24
|
-
it.skipIf(!hasRequiredEnvVars())('
|
|
25
|
+
it.skipIf(!hasRequiredEnvVars())('fails closed for PROGRAM_CALL because Fireblocks only returns a broadcast transaction id', async () => {
|
|
25
26
|
const signer = await createFireblocksSigner({
|
|
26
27
|
apiKey: process.env.FIREBLOCKS_API_KEY,
|
|
27
28
|
assetId: process.env.FIREBLOCKS_ASSET_ID ?? 'SOL_TEST',
|
|
@@ -33,9 +34,7 @@ describe('FireblocksSigner Integration', () => {
|
|
|
33
34
|
const rpc = createSolanaRpc(rpcUrl);
|
|
34
35
|
const { value: { blockhash, lastValidBlockHeight }, } = await rpc.getLatestBlockhash().send();
|
|
35
36
|
const transaction = pipe(createTransactionMessage({ version: 0 }), tx => setTransactionMessageFeePayerSigner(signer, tx), tx => appendTransactionMessageInstructions([getAddMemoInstruction({ memo: 'Fireblocks test' })], tx), tx => setTransactionMessageLifetimeUsingBlockhash({ blockhash, lastValidBlockHeight }, tx));
|
|
36
|
-
|
|
37
|
-
expect(signed.signatures[signer.address]).toBeDefined();
|
|
38
|
-
expect(signed.signatures[signer.address]?.length).toBe(64);
|
|
37
|
+
await expect(signTransactionMessageWithSigners(transaction)).rejects.toThrow('Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature');
|
|
39
38
|
}, 120000);
|
|
40
39
|
// RAW signing not available on Fireblocks testnet/sandbox
|
|
41
40
|
it.skip('signs messages with real API', () => { });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fireblocks-signer.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/fireblocks-signer.integration.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fireblocks-signer.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/fireblocks-signer.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
import { generateKeyPairSigner } from '@solana/signers';
|
|
2
2
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
3
|
import { assertIsSolanaSigner } from '@solana/keychain-core';
|
|
4
|
+
vi.mock('@solana/transactions', async (importOriginal) => {
|
|
5
|
+
const mod = await importOriginal();
|
|
6
|
+
return {
|
|
7
|
+
...mod,
|
|
8
|
+
getBase64EncodedWireTransaction: vi.fn(() => 'base64-wire-transaction'),
|
|
9
|
+
};
|
|
10
|
+
});
|
|
4
11
|
import { FireblocksSigner } from '../fireblocks-signer.js';
|
|
5
12
|
import { TEST_API_KEY, TEST_RSA_PRIVATE_KEY, TEST_VAULT_ACCOUNT_ID } from './setup.js';
|
|
6
13
|
vi.mock('@solana/keychain-core', async (importOriginal) => {
|
|
7
14
|
const mod = await importOriginal();
|
|
8
|
-
return {
|
|
15
|
+
return {
|
|
16
|
+
...mod,
|
|
17
|
+
assertSignatureValid: vi.fn(),
|
|
18
|
+
sanitizeRemoteErrorResponse: mod.sanitizeRemoteErrorResponse ??
|
|
19
|
+
((text) => `${text
|
|
20
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, ' ')
|
|
21
|
+
.replace(/\s+/g, ' ')
|
|
22
|
+
.trim()
|
|
23
|
+
.slice(0, 256)} [truncated]`),
|
|
24
|
+
};
|
|
9
25
|
});
|
|
10
26
|
// Mock fetch globally
|
|
11
27
|
global.fetch = vi.fn();
|
|
@@ -51,6 +67,26 @@ describe('FireblocksSigner', () => {
|
|
|
51
67
|
});
|
|
52
68
|
}).toThrow('Missing required vaultAccountId field');
|
|
53
69
|
});
|
|
70
|
+
it('should throw error when apiBaseUrl is not a valid URL', () => {
|
|
71
|
+
expect(() => {
|
|
72
|
+
new FireblocksSigner({
|
|
73
|
+
apiBaseUrl: 'not-a-url',
|
|
74
|
+
apiKey: TEST_API_KEY,
|
|
75
|
+
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
76
|
+
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
77
|
+
});
|
|
78
|
+
}).toThrow('apiBaseUrl is not a valid URL');
|
|
79
|
+
});
|
|
80
|
+
it('should throw error when apiBaseUrl does not use HTTPS', () => {
|
|
81
|
+
expect(() => {
|
|
82
|
+
new FireblocksSigner({
|
|
83
|
+
apiBaseUrl: 'http://api.fireblocks.test',
|
|
84
|
+
apiKey: TEST_API_KEY,
|
|
85
|
+
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
86
|
+
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
87
|
+
});
|
|
88
|
+
}).toThrow('apiBaseUrl must use HTTPS');
|
|
89
|
+
});
|
|
54
90
|
it('should validate requestDelayMs', () => {
|
|
55
91
|
expect(() => {
|
|
56
92
|
new FireblocksSigner({
|
|
@@ -177,6 +213,21 @@ describe('FireblocksSigner', () => {
|
|
|
177
213
|
});
|
|
178
214
|
await expect(signer.init()).rejects.toThrow('Invalid address from Fireblocks');
|
|
179
215
|
});
|
|
216
|
+
it('should throw structured error on malformed address response shape', async () => {
|
|
217
|
+
mockFetch.mockResolvedValueOnce({
|
|
218
|
+
ok: true,
|
|
219
|
+
json: async () => ({}),
|
|
220
|
+
});
|
|
221
|
+
const signer = new FireblocksSigner({
|
|
222
|
+
apiKey: TEST_API_KEY,
|
|
223
|
+
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
224
|
+
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
225
|
+
});
|
|
226
|
+
await expect(signer.init()).rejects.toMatchObject({
|
|
227
|
+
code: 'SIGNER_INVALID_PUBLIC_KEY',
|
|
228
|
+
message: expect.stringContaining('No addresses found in Fireblocks vault'),
|
|
229
|
+
});
|
|
230
|
+
});
|
|
180
231
|
it('should not re-initialize if already initialized', async () => {
|
|
181
232
|
const keyPair = await generateKeyPairSigner();
|
|
182
233
|
mockFetch.mockResolvedValueOnce({
|
|
@@ -394,7 +445,7 @@ describe('FireblocksSigner', () => {
|
|
|
394
445
|
expect(result).toHaveLength(1);
|
|
395
446
|
expect(result[0]).toHaveProperty(signer.address);
|
|
396
447
|
});
|
|
397
|
-
it('should
|
|
448
|
+
it('should reject PROGRAM_CALL txHash because it is not a reusable signer-bound signature', async () => {
|
|
398
449
|
const keyPair = await generateKeyPairSigner();
|
|
399
450
|
// Mock init fetch
|
|
400
451
|
mockFetch.mockResolvedValueOnce({
|
|
@@ -406,8 +457,8 @@ describe('FireblocksSigner', () => {
|
|
|
406
457
|
ok: true,
|
|
407
458
|
json: async () => ({ id: 'tx-123', status: 'SUBMITTED' }),
|
|
408
459
|
});
|
|
409
|
-
// Mock poll for completion -
|
|
410
|
-
//
|
|
460
|
+
// Mock poll for completion - PROGRAM_CALL returns txHash after broadcast,
|
|
461
|
+
// which must not be treated as a reusable signer-bound signature.
|
|
411
462
|
mockFetch.mockResolvedValueOnce({
|
|
412
463
|
ok: true,
|
|
413
464
|
json: async () => ({
|
|
@@ -419,6 +470,7 @@ describe('FireblocksSigner', () => {
|
|
|
419
470
|
const signer = new FireblocksSigner({
|
|
420
471
|
apiKey: TEST_API_KEY,
|
|
421
472
|
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
473
|
+
useProgramCall: true,
|
|
422
474
|
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
423
475
|
});
|
|
424
476
|
await signer.init();
|
|
@@ -426,11 +478,9 @@ describe('FireblocksSigner', () => {
|
|
|
426
478
|
messageBytes: new Uint8Array([1, 2, 3, 4]),
|
|
427
479
|
signatures: {},
|
|
428
480
|
};
|
|
429
|
-
|
|
430
|
-
expect(result).toHaveLength(1);
|
|
431
|
-
expect(result[0]).toHaveProperty(signer.address);
|
|
481
|
+
await expect(signer.signTransactions([transaction])).rejects.toThrow('Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature');
|
|
432
482
|
});
|
|
433
|
-
it('should
|
|
483
|
+
it('should still reject malformed txHash in PROGRAM_CALL because it is not a reusable signer-bound signature', async () => {
|
|
434
484
|
const keyPair = await generateKeyPairSigner();
|
|
435
485
|
// Mock init fetch
|
|
436
486
|
mockFetch.mockResolvedValueOnce({
|
|
@@ -442,18 +492,20 @@ describe('FireblocksSigner', () => {
|
|
|
442
492
|
ok: true,
|
|
443
493
|
json: async () => ({ id: 'tx-123', status: 'SUBMITTED' }),
|
|
444
494
|
});
|
|
445
|
-
// Mock poll for completion -
|
|
495
|
+
// Mock poll for completion - txHash remains a broadcast transaction id,
|
|
496
|
+
// regardless of whether it would decode to a valid signature length.
|
|
446
497
|
mockFetch.mockResolvedValueOnce({
|
|
447
498
|
ok: true,
|
|
448
499
|
json: async () => ({
|
|
449
500
|
id: 'tx-123',
|
|
450
501
|
status: 'COMPLETED',
|
|
451
|
-
txHash: '2abc',
|
|
502
|
+
txHash: '2abc',
|
|
452
503
|
}),
|
|
453
504
|
});
|
|
454
505
|
const signer = new FireblocksSigner({
|
|
455
506
|
apiKey: TEST_API_KEY,
|
|
456
507
|
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
508
|
+
useProgramCall: true,
|
|
457
509
|
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
458
510
|
});
|
|
459
511
|
await signer.init();
|
|
@@ -461,7 +513,7 @@ describe('FireblocksSigner', () => {
|
|
|
461
513
|
messageBytes: new Uint8Array([1, 2, 3, 4]),
|
|
462
514
|
signatures: {},
|
|
463
515
|
};
|
|
464
|
-
await expect(signer.signTransactions([transaction])).rejects.toThrow('
|
|
516
|
+
await expect(signer.signTransactions([transaction])).rejects.toThrow('Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature');
|
|
465
517
|
});
|
|
466
518
|
});
|
|
467
519
|
describe('isAvailable', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fireblocks-signer.test.js","sourceRoot":"","sources":["../../src/__tests__/fireblocks-signer.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fireblocks-signer.test.js","sourceRoot":"","sources":["../../src/__tests__/fireblocks-signer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jwt.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { decodeJwt } from 'jose';
|
|
3
|
+
import { createJwt } from '../jwt.js';
|
|
4
|
+
import { TEST_API_KEY, TEST_RSA_PRIVATE_KEY } from './setup.js';
|
|
5
|
+
const JWT_TTL_SECS = 120;
|
|
6
|
+
const JWT_SKEW_LEEWAY_SECS = 60;
|
|
7
|
+
describe('createJwt', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.restoreAllMocks();
|
|
10
|
+
});
|
|
11
|
+
it('sets clock-skew tolerant timing claims', async () => {
|
|
12
|
+
const nowMs = 1700000000000;
|
|
13
|
+
const nowSec = Math.floor(nowMs / 1000);
|
|
14
|
+
vi.spyOn(Date, 'now').mockReturnValue(nowMs);
|
|
15
|
+
const token = await createJwt(TEST_API_KEY, TEST_RSA_PRIVATE_KEY, '/v1/test', '{"hello":"world"}');
|
|
16
|
+
const payload = decodeJwt(token);
|
|
17
|
+
expect(payload.iat).toBe(nowSec - JWT_SKEW_LEEWAY_SECS);
|
|
18
|
+
expect(payload.nbf).toBe(nowSec - JWT_SKEW_LEEWAY_SECS);
|
|
19
|
+
expect(payload.exp).toBe(nowSec + JWT_TTL_SECS);
|
|
20
|
+
});
|
|
21
|
+
it('includes expected claims for Fireblocks auth', async () => {
|
|
22
|
+
const token = await createJwt(TEST_API_KEY, TEST_RSA_PRIVATE_KEY, '/v1/transactions', '');
|
|
23
|
+
const payload = decodeJwt(token);
|
|
24
|
+
expect(payload.sub).toBe(TEST_API_KEY);
|
|
25
|
+
expect(payload.uri).toBe('/v1/transactions');
|
|
26
|
+
expect(typeof payload.nonce).toBe('string');
|
|
27
|
+
expect(typeof payload.bodyHash).toBe('string');
|
|
28
|
+
expect(payload.bodyHash.length).toBe(64);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=jwt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.test.js","sourceRoot":"","sources":["../../src/__tests__/jwt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,KAAK,GAAG,aAAiB,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;QACnG,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAEjC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAEjC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAE,OAAO,CAAC,QAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -3,6 +3,13 @@ import { SolanaSigner } from '@solana/keychain-core';
|
|
|
3
3
|
import { SignableMessage, SignatureDictionary } from '@solana/signers';
|
|
4
4
|
import { Transaction, TransactionWithinSizeLimit, TransactionWithLifetime } from '@solana/transactions';
|
|
5
5
|
import type { FireblocksSignerConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create and initialize a Fireblocks-backed signer.
|
|
8
|
+
*
|
|
9
|
+
* @throws {SignerError} `SIGNER_CONFIG_ERROR` when required config is missing or invalid.
|
|
10
|
+
* @throws {SignerError} `SIGNER_HTTP_ERROR`, `SIGNER_REMOTE_API_ERROR`, `SIGNER_PARSING_ERROR`,
|
|
11
|
+
* or `SIGNER_INVALID_PUBLIC_KEY` when signer initialization fails.
|
|
12
|
+
*/
|
|
6
13
|
export declare function createFireblocksSigner<TAddress extends string = string>(config: FireblocksSignerConfig): Promise<SolanaSigner<TAddress>>;
|
|
7
14
|
/**
|
|
8
15
|
* Fireblocks-based signer for Solana transactions
|
|
@@ -73,12 +80,13 @@ export declare class FireblocksSigner<TAddress extends string = string> implemen
|
|
|
73
80
|
*/
|
|
74
81
|
private signRawBytes;
|
|
75
82
|
/**
|
|
76
|
-
* Sign a transaction using Fireblocks PROGRAM_CALL operation
|
|
77
|
-
* This broadcasts the transaction
|
|
83
|
+
* Sign a transaction using Fireblocks PROGRAM_CALL operation.
|
|
84
|
+
* This broadcasts the transaction through Fireblocks but does not yield a
|
|
85
|
+
* reusable signer-bound signature artifact for the local signer address.
|
|
78
86
|
*/
|
|
79
87
|
private signWithProgramCall;
|
|
80
88
|
/**
|
|
81
|
-
* Poll for transaction completion and extract signature
|
|
89
|
+
* Poll for transaction completion and extract a reusable signer-bound signature.
|
|
82
90
|
*/
|
|
83
91
|
private pollForSignature;
|
|
84
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fireblocks-signer.d.ts","sourceRoot":"","sources":["../src/fireblocks-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,
|
|
1
|
+
{"version":3,"file":"fireblocks-signer.d.ts","sourceRoot":"","sources":["../src/fireblocks-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAKH,YAAY,EAEf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAEH,WAAW,EACX,0BAA0B,EAC1B,uBAAuB,EAC1B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAGR,sBAAsB,EAGzB,MAAM,YAAY,CAAC;AAGpB;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EACzE,MAAM,EAAE,sBAAsB,GAC/B,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAEjC;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAgB,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,CAAE,YAAW,YAAY,CAAC,QAAQ,CAAC;IAC7F,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,WAAW,CAAS;IAE5B;;;OAGG;WACU,MAAM,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChD,MAAM,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAMtC;;OAEG;gBACS,MAAM,EAAE,sBAAsB;IAmC1C;;;OAGG;IACH,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAO/B;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;YACW,KAAK;IAMnB;;OAEG;YACW,cAAc;IA2D5B;;OAEG;YACW,OAAO;IA2CrB;;OAEG;YACW,YAAY;IAsB1B;;;;OAIG;YACW,mBAAmB;IAsBjC;;OAEG;YACW,gBAAgB;IA0D9B;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;IAwBjG;;OAEG;IACG,gBAAgB,CAClB,YAAY,EAAE,SAAS,CAAC,WAAW,GAAG,0BAA0B,GAAG,uBAAuB,CAAC,EAAE,GAC9F,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;IAsB1C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAoBrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAO5B"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { assertIsAddress } from '@solana/addresses';
|
|
2
|
-
import { getBase16Decoder, getBase16Encoder
|
|
3
|
-
import { assertSignatureValid, createSignatureDictionary, SignerErrorCode, throwSignerError, } from '@solana/keychain-core';
|
|
2
|
+
import { getBase16Decoder, getBase16Encoder } from '@solana/codecs-strings';
|
|
3
|
+
import { assertSignatureValid, createSignatureDictionary, sanitizeRemoteErrorResponse, SignerErrorCode, throwSignerError, } from '@solana/keychain-core';
|
|
4
4
|
import { getBase64EncodedWireTransaction, } from '@solana/transactions';
|
|
5
5
|
import { createJwt } from './jwt.js';
|
|
6
6
|
import { isTerminalStatus } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create and initialize a Fireblocks-backed signer.
|
|
9
|
+
*
|
|
10
|
+
* @throws {SignerError} `SIGNER_CONFIG_ERROR` when required config is missing or invalid.
|
|
11
|
+
* @throws {SignerError} `SIGNER_HTTP_ERROR`, `SIGNER_REMOTE_API_ERROR`, `SIGNER_PARSING_ERROR`,
|
|
12
|
+
* or `SIGNER_INVALID_PUBLIC_KEY` when signer initialization fails.
|
|
13
|
+
*/
|
|
7
14
|
export async function createFireblocksSigner(config) {
|
|
8
15
|
return await FireblocksSigner.create(config);
|
|
9
16
|
}
|
|
@@ -65,7 +72,9 @@ export class FireblocksSigner {
|
|
|
65
72
|
this.privateKeyPem = config.privateKeyPem;
|
|
66
73
|
this.vaultAccountId = config.vaultAccountId;
|
|
67
74
|
this.assetId = config.assetId ?? DEFAULT_ASSET_ID;
|
|
68
|
-
|
|
75
|
+
const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
76
|
+
validateHttpsApiBaseUrl(apiBaseUrl);
|
|
77
|
+
this.apiBaseUrl = apiBaseUrl;
|
|
69
78
|
this.pollIntervalMs = config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
70
79
|
this.maxPollAttempts = config.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS;
|
|
71
80
|
this.requestDelayMs = config.requestDelayMs ?? 0;
|
|
@@ -145,7 +154,7 @@ export class FireblocksSigner {
|
|
|
145
154
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
146
155
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
147
156
|
message: `Fireblocks API error: ${response.status}`,
|
|
148
|
-
response: errorText,
|
|
157
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
149
158
|
status: response.status,
|
|
150
159
|
});
|
|
151
160
|
}
|
|
@@ -159,7 +168,7 @@ export class FireblocksSigner {
|
|
|
159
168
|
message: 'Failed to parse Fireblocks response',
|
|
160
169
|
});
|
|
161
170
|
}
|
|
162
|
-
const firstAddress = addressesResponse.addresses[0]?.address;
|
|
171
|
+
const firstAddress = addressesResponse.addresses?.[0]?.address;
|
|
163
172
|
if (!firstAddress) {
|
|
164
173
|
throwSignerError(SignerErrorCode.INVALID_PUBLIC_KEY, {
|
|
165
174
|
message: 'No addresses found in Fireblocks vault',
|
|
@@ -206,7 +215,7 @@ export class FireblocksSigner {
|
|
|
206
215
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
207
216
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
208
217
|
message: `Fireblocks API error: ${response.status}`,
|
|
209
|
-
response: errorText,
|
|
218
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
210
219
|
status: response.status,
|
|
211
220
|
});
|
|
212
221
|
}
|
|
@@ -243,8 +252,9 @@ export class FireblocksSigner {
|
|
|
243
252
|
return await this.pollForSignature(createResponse.id);
|
|
244
253
|
}
|
|
245
254
|
/**
|
|
246
|
-
* Sign a transaction using Fireblocks PROGRAM_CALL operation
|
|
247
|
-
* This broadcasts the transaction
|
|
255
|
+
* Sign a transaction using Fireblocks PROGRAM_CALL operation.
|
|
256
|
+
* This broadcasts the transaction through Fireblocks but does not yield a
|
|
257
|
+
* reusable signer-bound signature artifact for the local signer address.
|
|
248
258
|
*/
|
|
249
259
|
async signWithProgramCall(transaction) {
|
|
250
260
|
// Use the same serialization as Privy - proper wire format with all signatures
|
|
@@ -264,7 +274,7 @@ export class FireblocksSigner {
|
|
|
264
274
|
return await this.pollForSignature(createResponse.id);
|
|
265
275
|
}
|
|
266
276
|
/**
|
|
267
|
-
* Poll for transaction completion and extract signature
|
|
277
|
+
* Poll for transaction completion and extract a reusable signer-bound signature.
|
|
268
278
|
*/
|
|
269
279
|
async pollForSignature(transactionId) {
|
|
270
280
|
const uri = `/v1/transactions/${transactionId}`;
|
|
@@ -290,15 +300,12 @@ export class FireblocksSigner {
|
|
|
290
300
|
}
|
|
291
301
|
return sigBytes;
|
|
292
302
|
}
|
|
293
|
-
//
|
|
303
|
+
// PROGRAM_CALL only returns a broadcast transaction id, not a
|
|
304
|
+
// reusable signer-bound signature over the local message bytes.
|
|
294
305
|
if (txResponse.txHash) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
message: `Invalid txHash length: expected 64 bytes, got ${sigBytes.length}`,
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
return sigBytes;
|
|
306
|
+
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
307
|
+
message: 'Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature; use RAW signing for local signature artifacts',
|
|
308
|
+
});
|
|
302
309
|
}
|
|
303
310
|
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
304
311
|
message: 'No signature found in response (no signedMessages or txHash)',
|
|
@@ -349,15 +356,11 @@ export class FireblocksSigner {
|
|
|
349
356
|
const signatureBytes = this.useProgramCall
|
|
350
357
|
? await this.signWithProgramCall(transaction)
|
|
351
358
|
: await this.signRawBytes(new Uint8Array(transaction.messageBytes));
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
signature: signatureBytes,
|
|
358
|
-
signerAddress: this.address,
|
|
359
|
-
});
|
|
360
|
-
}
|
|
359
|
+
await assertSignatureValid({
|
|
360
|
+
data: transaction.messageBytes,
|
|
361
|
+
signature: signatureBytes,
|
|
362
|
+
signerAddress: this.address,
|
|
363
|
+
});
|
|
361
364
|
return createSignatureDictionary({
|
|
362
365
|
signature: signatureBytes,
|
|
363
366
|
signerAddress: this.address,
|
|
@@ -396,4 +399,20 @@ export class FireblocksSigner {
|
|
|
396
399
|
}
|
|
397
400
|
}
|
|
398
401
|
}
|
|
402
|
+
function validateHttpsApiBaseUrl(apiBaseUrl) {
|
|
403
|
+
let parsedUrl;
|
|
404
|
+
try {
|
|
405
|
+
parsedUrl = new URL(apiBaseUrl);
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
409
|
+
message: 'apiBaseUrl is not a valid URL',
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
if (parsedUrl.protocol !== 'https:') {
|
|
413
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
414
|
+
message: 'apiBaseUrl must use HTTPS',
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
399
418
|
//# sourceMappingURL=fireblocks-signer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fireblocks-signer.js","sourceRoot":"","sources":["../src/fireblocks-signer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fireblocks-signer.js","sourceRoot":"","sources":["../src/fireblocks-signer.ts"],"names":[],"mappings":"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"}
|
package/dist/jwt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCjH"}
|
package/dist/jwt.js
CHANGED
|
@@ -2,6 +2,8 @@ import { getBase16Decoder } from '@solana/codecs-strings';
|
|
|
2
2
|
import { SignerErrorCode, throwSignerError } from '@solana/keychain-core';
|
|
3
3
|
import { importPKCS8, SignJWT } from 'jose';
|
|
4
4
|
let base16Decoder;
|
|
5
|
+
const JWT_TTL_SECS = 120;
|
|
6
|
+
const JWT_SKEW_LEEWAY_SECS = 60;
|
|
5
7
|
/**
|
|
6
8
|
* Create a JWT for Fireblocks API authentication
|
|
7
9
|
*
|
|
@@ -20,6 +22,7 @@ export async function createJwt(apiKey, privateKeyPem, uri, body) {
|
|
|
20
22
|
// Generate nonce (UUID v4)
|
|
21
23
|
const nonce = crypto.randomUUID();
|
|
22
24
|
const now = Math.floor(Date.now() / 1000);
|
|
25
|
+
const issuedAt = now - JWT_SKEW_LEEWAY_SECS;
|
|
23
26
|
const jwt = await new SignJWT({
|
|
24
27
|
bodyHash,
|
|
25
28
|
nonce,
|
|
@@ -27,8 +30,9 @@ export async function createJwt(apiKey, privateKeyPem, uri, body) {
|
|
|
27
30
|
})
|
|
28
31
|
.setProtectedHeader({ alg: 'RS256' })
|
|
29
32
|
.setSubject(apiKey)
|
|
30
|
-
.setIssuedAt(
|
|
31
|
-
.
|
|
33
|
+
.setIssuedAt(issuedAt)
|
|
34
|
+
.setNotBefore(issuedAt)
|
|
35
|
+
.setExpirationTime(now + JWT_TTL_SECS)
|
|
32
36
|
.sign(privateKey);
|
|
33
37
|
return jwt;
|
|
34
38
|
}
|
package/dist/jwt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE5C,IAAI,aAA8D,CAAC;
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE5C,IAAI,aAA8D,CAAC;AACnE,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,aAAqB,EAAE,GAAW,EAAE,IAAY;IAC5F,IAAI,CAAC;QACD,6BAA6B;QAC7B,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE7D,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAEvC,2BAA2B;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAElC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,GAAG,oBAAoB,CAAC;QAE5C,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC;YAC1B,QAAQ;YACR,KAAK;YACL,GAAG;SACN,CAAC;aACG,kBAAkB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;aACpC,UAAU,CAAC,MAAM,CAAC;aAClB,WAAW,CAAC,QAAQ,CAAC;aACrB,YAAY,CAAC,QAAQ,CAAC;aACtB,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC;aACrC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtB,OAAO,GAAG,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC;QAChB,CAAC;QACD,gBAAgB,CAAC,eAAe,CAAC,cAAc,EAAE;YAC7C,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,sBAAsB;SAClC,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,IAAY;IACjC,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrE,aAAa,KAAb,aAAa,GAAK,gBAAgB,EAAE,EAAC;IACrC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -18,7 +18,8 @@ export interface FireblocksSignerConfig {
|
|
|
18
18
|
requestDelayMs?: number;
|
|
19
19
|
/**
|
|
20
20
|
* Use PROGRAM_CALL operation for signing transactions (default: false)
|
|
21
|
-
* When true, Fireblocks signs and broadcasts the transaction to Solana
|
|
21
|
+
* When true, Fireblocks signs and broadcasts the transaction to Solana,
|
|
22
|
+
* but callers must not treat the broadcast response as a reusable local signature.
|
|
22
23
|
* When false, uses RAW signing (signs message bytes only, caller broadcasts).
|
|
23
24
|
*/
|
|
24
25
|
useProgramCall?: boolean;
|
|
@@ -70,7 +71,10 @@ export interface TransactionResponse {
|
|
|
70
71
|
id: string;
|
|
71
72
|
signedMessages?: SignedMessage[];
|
|
72
73
|
status: string;
|
|
73
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Transaction id returned for PROGRAM_CALL after broadcast.
|
|
76
|
+
* This is a broadcast artifact, not a reusable signer-bound signature.
|
|
77
|
+
*/
|
|
74
78
|
txHash?: string;
|
|
75
79
|
}
|
|
76
80
|
export interface SignedMessage {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IAEtB,iGAAiG;IACjG,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IAEtB,iGAAiG;IACjG,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,kCAAkC;IAClC,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,0BAA0B,GAAG,kBAAkB,CAAC;IACjE,SAAS,EAAE,cAAc,GAAG,KAAK,CAAC;IAClC,MAAM,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,cAAc,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACvC,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,aAAa,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,SAAS,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;CAc9B,CAAC;AACX,MAAM,MAAM,2BAA2B,GACnC,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,OAAO,2BAA2B,CAAC,CAAC;AAEnF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQxD"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmHA;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACvC,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,iBAAiB,EAAE,mBAAmB;IACtC,iCAAiC,EAAE,mCAAmC;IACtE,qBAAqB,EAAE,uBAAuB;IAC9C,iBAAiB,EAAE,mBAAmB;IACtC,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;CAChB,CAAC;AAIX;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,OAAO,CACH,MAAM,KAAK,2BAA2B,CAAC,SAAS;QAChD,MAAM,KAAK,2BAA2B,CAAC,SAAS;QAChD,MAAM,KAAK,2BAA2B,CAAC,QAAQ;QAC/C,MAAM,KAAK,2BAA2B,CAAC,OAAO;QAC9C,MAAM,KAAK,2BAA2B,CAAC,MAAM,CAChD,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solana/keychain-fireblocks",
|
|
3
3
|
"author": "Solana Foundation",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"description": "Fireblocks-based signer for Solana transactions",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": "https://github.com/solana-foundation/solana-keychain",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"jose": "^6.1.3",
|
|
32
|
-
"@solana/keychain-core": "
|
|
32
|
+
"@solana/keychain-core": "1.1.0"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"@solana/addresses": ">=6.0.1",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@solana-program/memo": "^0.11.0",
|
|
48
48
|
"@solana/kit": "^6.0.1",
|
|
49
49
|
"dotenv": "^17.2.3",
|
|
50
|
-
"@solana/keychain-test-utils": "
|
|
50
|
+
"@solana/keychain-test-utils": "1.1.0"
|
|
51
51
|
},
|
|
52
52
|
"publishConfig": {
|
|
53
53
|
"access": "public"
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Unlike other signers, Fireblocks PROGRAM_CALL mode signs AND broadcasts
|
|
5
5
|
* the transaction to Solana through Fireblocks' infrastructure. The signed
|
|
6
|
-
* transaction never returns to the caller
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* transaction never returns to the caller, and the broadcast transaction id
|
|
7
|
+
* is not a reusable signer-bound signature artifact. This means LiteSVM
|
|
8
|
+
* (used by runSignerIntegrationTest) can never observe a signer-specific
|
|
9
|
+
* transaction signature from PROGRAM_CALL, so we test against devnet directly.
|
|
9
10
|
*
|
|
10
11
|
* RAW mode returns a raw signature but is not available on the Fireblocks
|
|
11
12
|
* sandbox/testnet environment used in CI.
|
|
@@ -35,7 +36,7 @@ function hasRequiredEnvVars(): boolean {
|
|
|
35
36
|
|
|
36
37
|
describe('FireblocksSigner Integration', () => {
|
|
37
38
|
it.skipIf(!hasRequiredEnvVars())(
|
|
38
|
-
'
|
|
39
|
+
'fails closed for PROGRAM_CALL because Fireblocks only returns a broadcast transaction id',
|
|
39
40
|
async () => {
|
|
40
41
|
const signer = await createFireblocksSigner({
|
|
41
42
|
apiKey: process.env.FIREBLOCKS_API_KEY!,
|
|
@@ -58,10 +59,9 @@ describe('FireblocksSigner Integration', () => {
|
|
|
58
59
|
tx => setTransactionMessageLifetimeUsingBlockhash({ blockhash, lastValidBlockHeight }, tx),
|
|
59
60
|
);
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
expect(signed.signatures[signer.address]?.length).toBe(64);
|
|
62
|
+
await expect(signTransactionMessageWithSigners(transaction)).rejects.toThrow(
|
|
63
|
+
'Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature',
|
|
64
|
+
);
|
|
65
65
|
},
|
|
66
66
|
120_000,
|
|
67
67
|
);
|
|
@@ -2,13 +2,32 @@ import { generateKeyPairSigner } from '@solana/signers';
|
|
|
2
2
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
3
|
import { assertIsSolanaSigner } from '@solana/keychain-core';
|
|
4
4
|
|
|
5
|
+
vi.mock('@solana/transactions', async importOriginal => {
|
|
6
|
+
const mod = await importOriginal<typeof import('@solana/transactions')>();
|
|
7
|
+
return {
|
|
8
|
+
...mod,
|
|
9
|
+
getBase64EncodedWireTransaction: vi.fn(() => 'base64-wire-transaction'),
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
|
|
5
13
|
import { FireblocksSigner } from '../fireblocks-signer.js';
|
|
6
14
|
import type { FireblocksSignerConfig } from '../types.js';
|
|
7
15
|
import { TEST_API_KEY, TEST_RSA_PRIVATE_KEY, TEST_VAULT_ACCOUNT_ID } from './setup.js';
|
|
8
16
|
|
|
9
17
|
vi.mock('@solana/keychain-core', async importOriginal => {
|
|
10
18
|
const mod = await importOriginal<typeof import('@solana/keychain-core')>();
|
|
11
|
-
return {
|
|
19
|
+
return {
|
|
20
|
+
...mod,
|
|
21
|
+
assertSignatureValid: vi.fn(),
|
|
22
|
+
sanitizeRemoteErrorResponse:
|
|
23
|
+
mod.sanitizeRemoteErrorResponse ??
|
|
24
|
+
((text: string) =>
|
|
25
|
+
`${text
|
|
26
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, ' ')
|
|
27
|
+
.replace(/\s+/g, ' ')
|
|
28
|
+
.trim()
|
|
29
|
+
.slice(0, 256)} [truncated]`),
|
|
30
|
+
};
|
|
12
31
|
});
|
|
13
32
|
|
|
14
33
|
// Mock fetch globally
|
|
@@ -63,6 +82,28 @@ describe('FireblocksSigner', () => {
|
|
|
63
82
|
}).toThrow('Missing required vaultAccountId field');
|
|
64
83
|
});
|
|
65
84
|
|
|
85
|
+
it('should throw error when apiBaseUrl is not a valid URL', () => {
|
|
86
|
+
expect(() => {
|
|
87
|
+
new FireblocksSigner({
|
|
88
|
+
apiBaseUrl: 'not-a-url',
|
|
89
|
+
apiKey: TEST_API_KEY,
|
|
90
|
+
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
91
|
+
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
92
|
+
});
|
|
93
|
+
}).toThrow('apiBaseUrl is not a valid URL');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should throw error when apiBaseUrl does not use HTTPS', () => {
|
|
97
|
+
expect(() => {
|
|
98
|
+
new FireblocksSigner({
|
|
99
|
+
apiBaseUrl: 'http://api.fireblocks.test',
|
|
100
|
+
apiKey: TEST_API_KEY,
|
|
101
|
+
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
102
|
+
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
103
|
+
});
|
|
104
|
+
}).toThrow('apiBaseUrl must use HTTPS');
|
|
105
|
+
});
|
|
106
|
+
|
|
66
107
|
it('should validate requestDelayMs', () => {
|
|
67
108
|
expect(() => {
|
|
68
109
|
new FireblocksSigner({
|
|
@@ -224,6 +265,24 @@ describe('FireblocksSigner', () => {
|
|
|
224
265
|
await expect(signer.init()).rejects.toThrow('Invalid address from Fireblocks');
|
|
225
266
|
});
|
|
226
267
|
|
|
268
|
+
it('should throw structured error on malformed address response shape', async () => {
|
|
269
|
+
mockFetch.mockResolvedValueOnce({
|
|
270
|
+
ok: true,
|
|
271
|
+
json: async () => ({}),
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
const signer = new FireblocksSigner({
|
|
275
|
+
apiKey: TEST_API_KEY,
|
|
276
|
+
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
277
|
+
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
await expect(signer.init()).rejects.toMatchObject({
|
|
281
|
+
code: 'SIGNER_INVALID_PUBLIC_KEY',
|
|
282
|
+
message: expect.stringContaining('No addresses found in Fireblocks vault'),
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
227
286
|
it('should not re-initialize if already initialized', async () => {
|
|
228
287
|
const keyPair = await generateKeyPairSigner();
|
|
229
288
|
|
|
@@ -489,7 +548,7 @@ describe('FireblocksSigner', () => {
|
|
|
489
548
|
expect(result[0]).toHaveProperty(signer.address);
|
|
490
549
|
});
|
|
491
550
|
|
|
492
|
-
it('should
|
|
551
|
+
it('should reject PROGRAM_CALL txHash because it is not a reusable signer-bound signature', async () => {
|
|
493
552
|
const keyPair = await generateKeyPairSigner();
|
|
494
553
|
|
|
495
554
|
// Mock init fetch
|
|
@@ -504,8 +563,8 @@ describe('FireblocksSigner', () => {
|
|
|
504
563
|
json: async () => ({ id: 'tx-123', status: 'SUBMITTED' }),
|
|
505
564
|
});
|
|
506
565
|
|
|
507
|
-
// Mock poll for completion -
|
|
508
|
-
//
|
|
566
|
+
// Mock poll for completion - PROGRAM_CALL returns txHash after broadcast,
|
|
567
|
+
// which must not be treated as a reusable signer-bound signature.
|
|
509
568
|
mockFetch.mockResolvedValueOnce({
|
|
510
569
|
ok: true,
|
|
511
570
|
json: async () => ({
|
|
@@ -518,6 +577,7 @@ describe('FireblocksSigner', () => {
|
|
|
518
577
|
const signer = new FireblocksSigner({
|
|
519
578
|
apiKey: TEST_API_KEY,
|
|
520
579
|
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
580
|
+
useProgramCall: true,
|
|
521
581
|
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
522
582
|
});
|
|
523
583
|
|
|
@@ -528,13 +588,12 @@ describe('FireblocksSigner', () => {
|
|
|
528
588
|
signatures: {},
|
|
529
589
|
} as unknown as Parameters<typeof signer.signTransactions>[0][0];
|
|
530
590
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
expect(result[0]).toHaveProperty(signer.address);
|
|
591
|
+
await expect(signer.signTransactions([transaction])).rejects.toThrow(
|
|
592
|
+
'Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature',
|
|
593
|
+
);
|
|
535
594
|
});
|
|
536
595
|
|
|
537
|
-
it('should
|
|
596
|
+
it('should still reject malformed txHash in PROGRAM_CALL because it is not a reusable signer-bound signature', async () => {
|
|
538
597
|
const keyPair = await generateKeyPairSigner();
|
|
539
598
|
|
|
540
599
|
// Mock init fetch
|
|
@@ -549,19 +608,21 @@ describe('FireblocksSigner', () => {
|
|
|
549
608
|
json: async () => ({ id: 'tx-123', status: 'SUBMITTED' }),
|
|
550
609
|
});
|
|
551
610
|
|
|
552
|
-
// Mock poll for completion -
|
|
611
|
+
// Mock poll for completion - txHash remains a broadcast transaction id,
|
|
612
|
+
// regardless of whether it would decode to a valid signature length.
|
|
553
613
|
mockFetch.mockResolvedValueOnce({
|
|
554
614
|
ok: true,
|
|
555
615
|
json: async () => ({
|
|
556
616
|
id: 'tx-123',
|
|
557
617
|
status: 'COMPLETED',
|
|
558
|
-
txHash: '2abc',
|
|
618
|
+
txHash: '2abc',
|
|
559
619
|
}),
|
|
560
620
|
});
|
|
561
621
|
|
|
562
622
|
const signer = new FireblocksSigner({
|
|
563
623
|
apiKey: TEST_API_KEY,
|
|
564
624
|
privateKeyPem: TEST_RSA_PRIVATE_KEY,
|
|
625
|
+
useProgramCall: true,
|
|
565
626
|
vaultAccountId: TEST_VAULT_ACCOUNT_ID,
|
|
566
627
|
});
|
|
567
628
|
|
|
@@ -572,7 +633,9 @@ describe('FireblocksSigner', () => {
|
|
|
572
633
|
signatures: {},
|
|
573
634
|
} as unknown as Parameters<typeof signer.signTransactions>[0][0];
|
|
574
635
|
|
|
575
|
-
await expect(signer.signTransactions([transaction])).rejects.toThrow(
|
|
636
|
+
await expect(signer.signTransactions([transaction])).rejects.toThrow(
|
|
637
|
+
'Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature',
|
|
638
|
+
);
|
|
576
639
|
});
|
|
577
640
|
});
|
|
578
641
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { decodeJwt } from 'jose';
|
|
3
|
+
|
|
4
|
+
import { createJwt } from '../jwt.js';
|
|
5
|
+
import { TEST_API_KEY, TEST_RSA_PRIVATE_KEY } from './setup.js';
|
|
6
|
+
|
|
7
|
+
const JWT_TTL_SECS = 120;
|
|
8
|
+
const JWT_SKEW_LEEWAY_SECS = 60;
|
|
9
|
+
|
|
10
|
+
describe('createJwt', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('sets clock-skew tolerant timing claims', async () => {
|
|
16
|
+
const nowMs = 1_700_000_000_000;
|
|
17
|
+
const nowSec = Math.floor(nowMs / 1000);
|
|
18
|
+
vi.spyOn(Date, 'now').mockReturnValue(nowMs);
|
|
19
|
+
|
|
20
|
+
const token = await createJwt(TEST_API_KEY, TEST_RSA_PRIVATE_KEY, '/v1/test', '{"hello":"world"}');
|
|
21
|
+
const payload = decodeJwt(token);
|
|
22
|
+
|
|
23
|
+
expect(payload.iat).toBe(nowSec - JWT_SKEW_LEEWAY_SECS);
|
|
24
|
+
expect(payload.nbf).toBe(nowSec - JWT_SKEW_LEEWAY_SECS);
|
|
25
|
+
expect(payload.exp).toBe(nowSec + JWT_TTL_SECS);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('includes expected claims for Fireblocks auth', async () => {
|
|
29
|
+
const token = await createJwt(TEST_API_KEY, TEST_RSA_PRIVATE_KEY, '/v1/transactions', '');
|
|
30
|
+
const payload = decodeJwt(token);
|
|
31
|
+
|
|
32
|
+
expect(payload.sub).toBe(TEST_API_KEY);
|
|
33
|
+
expect(payload.uri).toBe('/v1/transactions');
|
|
34
|
+
expect(typeof payload.nonce).toBe('string');
|
|
35
|
+
expect(typeof payload.bodyHash).toBe('string');
|
|
36
|
+
expect((payload.bodyHash as string).length).toBe(64);
|
|
37
|
+
});
|
|
38
|
+
});
|
package/src/fireblocks-signer.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Address, assertIsAddress } from '@solana/addresses';
|
|
2
|
-
import { getBase16Decoder, getBase16Encoder
|
|
2
|
+
import { getBase16Decoder, getBase16Encoder } from '@solana/codecs-strings';
|
|
3
3
|
import {
|
|
4
4
|
assertSignatureValid,
|
|
5
5
|
createSignatureDictionary,
|
|
6
|
+
sanitizeRemoteErrorResponse,
|
|
6
7
|
SignerErrorCode,
|
|
7
8
|
SolanaSigner,
|
|
8
9
|
throwSignerError,
|
|
@@ -26,6 +27,13 @@ import type {
|
|
|
26
27
|
} from './types.js';
|
|
27
28
|
import { FireblocksTransactionStatus, isTerminalStatus } from './types.js';
|
|
28
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Create and initialize a Fireblocks-backed signer.
|
|
32
|
+
*
|
|
33
|
+
* @throws {SignerError} `SIGNER_CONFIG_ERROR` when required config is missing or invalid.
|
|
34
|
+
* @throws {SignerError} `SIGNER_HTTP_ERROR`, `SIGNER_REMOTE_API_ERROR`, `SIGNER_PARSING_ERROR`,
|
|
35
|
+
* or `SIGNER_INVALID_PUBLIC_KEY` when signer initialization fails.
|
|
36
|
+
*/
|
|
29
37
|
export async function createFireblocksSigner<TAddress extends string = string>(
|
|
30
38
|
config: FireblocksSignerConfig,
|
|
31
39
|
): Promise<SolanaSigner<TAddress>> {
|
|
@@ -108,7 +116,10 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
108
116
|
this.privateKeyPem = config.privateKeyPem;
|
|
109
117
|
this.vaultAccountId = config.vaultAccountId;
|
|
110
118
|
this.assetId = config.assetId ?? DEFAULT_ASSET_ID;
|
|
111
|
-
|
|
119
|
+
const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
120
|
+
validateHttpsApiBaseUrl(apiBaseUrl);
|
|
121
|
+
|
|
122
|
+
this.apiBaseUrl = apiBaseUrl;
|
|
112
123
|
this.pollIntervalMs = config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
113
124
|
this.maxPollAttempts = config.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS;
|
|
114
125
|
this.requestDelayMs = config.requestDelayMs ?? 0;
|
|
@@ -198,7 +209,7 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
198
209
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
199
210
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
200
211
|
message: `Fireblocks API error: ${response.status}`,
|
|
201
|
-
response: errorText,
|
|
212
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
202
213
|
status: response.status,
|
|
203
214
|
});
|
|
204
215
|
}
|
|
@@ -213,7 +224,7 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
213
224
|
});
|
|
214
225
|
}
|
|
215
226
|
|
|
216
|
-
const firstAddress = addressesResponse.addresses[0]?.address;
|
|
227
|
+
const firstAddress = addressesResponse.addresses?.[0]?.address;
|
|
217
228
|
if (!firstAddress) {
|
|
218
229
|
throwSignerError(SignerErrorCode.INVALID_PUBLIC_KEY, {
|
|
219
230
|
message: 'No addresses found in Fireblocks vault',
|
|
@@ -262,7 +273,7 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
262
273
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
263
274
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
264
275
|
message: `Fireblocks API error: ${response.status}`,
|
|
265
|
-
response: errorText,
|
|
276
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
266
277
|
status: response.status,
|
|
267
278
|
});
|
|
268
279
|
}
|
|
@@ -303,8 +314,9 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
303
314
|
}
|
|
304
315
|
|
|
305
316
|
/**
|
|
306
|
-
* Sign a transaction using Fireblocks PROGRAM_CALL operation
|
|
307
|
-
* This broadcasts the transaction
|
|
317
|
+
* Sign a transaction using Fireblocks PROGRAM_CALL operation.
|
|
318
|
+
* This broadcasts the transaction through Fireblocks but does not yield a
|
|
319
|
+
* reusable signer-bound signature artifact for the local signer address.
|
|
308
320
|
*/
|
|
309
321
|
private async signWithProgramCall(
|
|
310
322
|
transaction: Transaction & TransactionWithinSizeLimit & TransactionWithLifetime,
|
|
@@ -329,7 +341,7 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
329
341
|
}
|
|
330
342
|
|
|
331
343
|
/**
|
|
332
|
-
* Poll for transaction completion and extract signature
|
|
344
|
+
* Poll for transaction completion and extract a reusable signer-bound signature.
|
|
333
345
|
*/
|
|
334
346
|
private async pollForSignature(transactionId: string): Promise<SignatureBytes> {
|
|
335
347
|
const uri = `/v1/transactions/${transactionId}`;
|
|
@@ -359,15 +371,13 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
359
371
|
return sigBytes as SignatureBytes;
|
|
360
372
|
}
|
|
361
373
|
|
|
362
|
-
//
|
|
374
|
+
// PROGRAM_CALL only returns a broadcast transaction id, not a
|
|
375
|
+
// reusable signer-bound signature over the local message bytes.
|
|
363
376
|
if (txResponse.txHash) {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
return sigBytes as SignatureBytes;
|
|
377
|
+
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
378
|
+
message:
|
|
379
|
+
'Fireblocks PROGRAM_CALL returned txHash without a reusable signer-bound signature; use RAW signing for local signature artifacts',
|
|
380
|
+
});
|
|
371
381
|
}
|
|
372
382
|
|
|
373
383
|
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
@@ -432,15 +442,11 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
432
442
|
const signatureBytes = this.useProgramCall
|
|
433
443
|
? await this.signWithProgramCall(transaction)
|
|
434
444
|
: await this.signRawBytes(new Uint8Array(transaction.messageBytes));
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
signature: signatureBytes,
|
|
441
|
-
signerAddress: this.address,
|
|
442
|
-
});
|
|
443
|
-
}
|
|
445
|
+
await assertSignatureValid({
|
|
446
|
+
data: transaction.messageBytes,
|
|
447
|
+
signature: signatureBytes,
|
|
448
|
+
signerAddress: this.address,
|
|
449
|
+
});
|
|
444
450
|
return createSignatureDictionary({
|
|
445
451
|
signature: signatureBytes,
|
|
446
452
|
signerAddress: this.address,
|
|
@@ -483,3 +489,20 @@ export class FireblocksSigner<TAddress extends string = string> implements Solan
|
|
|
483
489
|
}
|
|
484
490
|
}
|
|
485
491
|
}
|
|
492
|
+
|
|
493
|
+
function validateHttpsApiBaseUrl(apiBaseUrl: string): void {
|
|
494
|
+
let parsedUrl: URL;
|
|
495
|
+
try {
|
|
496
|
+
parsedUrl = new URL(apiBaseUrl);
|
|
497
|
+
} catch {
|
|
498
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
499
|
+
message: 'apiBaseUrl is not a valid URL',
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (parsedUrl.protocol !== 'https:') {
|
|
504
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
505
|
+
message: 'apiBaseUrl must use HTTPS',
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
package/src/jwt.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { SignerErrorCode, throwSignerError } from '@solana/keychain-core';
|
|
|
3
3
|
import { importPKCS8, SignJWT } from 'jose';
|
|
4
4
|
|
|
5
5
|
let base16Decoder: ReturnType<typeof getBase16Decoder> | undefined;
|
|
6
|
+
const JWT_TTL_SECS = 120;
|
|
7
|
+
const JWT_SKEW_LEEWAY_SECS = 60;
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Create a JWT for Fireblocks API authentication
|
|
@@ -25,6 +27,7 @@ export async function createJwt(apiKey: string, privateKeyPem: string, uri: stri
|
|
|
25
27
|
const nonce = crypto.randomUUID();
|
|
26
28
|
|
|
27
29
|
const now = Math.floor(Date.now() / 1000);
|
|
30
|
+
const issuedAt = now - JWT_SKEW_LEEWAY_SECS;
|
|
28
31
|
|
|
29
32
|
const jwt = await new SignJWT({
|
|
30
33
|
bodyHash,
|
|
@@ -33,8 +36,9 @@ export async function createJwt(apiKey: string, privateKeyPem: string, uri: stri
|
|
|
33
36
|
})
|
|
34
37
|
.setProtectedHeader({ alg: 'RS256' })
|
|
35
38
|
.setSubject(apiKey)
|
|
36
|
-
.setIssuedAt(
|
|
37
|
-
.
|
|
39
|
+
.setIssuedAt(issuedAt)
|
|
40
|
+
.setNotBefore(issuedAt)
|
|
41
|
+
.setExpirationTime(now + JWT_TTL_SECS)
|
|
38
42
|
.sign(privateKey);
|
|
39
43
|
|
|
40
44
|
return jwt;
|
package/src/types.ts
CHANGED
|
@@ -25,7 +25,8 @@ export interface FireblocksSignerConfig {
|
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* Use PROGRAM_CALL operation for signing transactions (default: false)
|
|
28
|
-
* When true, Fireblocks signs and broadcasts the transaction to Solana
|
|
28
|
+
* When true, Fireblocks signs and broadcasts the transaction to Solana,
|
|
29
|
+
* but callers must not treat the broadcast response as a reusable local signature.
|
|
29
30
|
* When false, uses RAW signing (signs message bytes only, caller broadcasts).
|
|
30
31
|
*/
|
|
31
32
|
useProgramCall?: boolean;
|
|
@@ -86,7 +87,10 @@ export interface TransactionResponse {
|
|
|
86
87
|
id: string;
|
|
87
88
|
signedMessages?: SignedMessage[];
|
|
88
89
|
status: string;
|
|
89
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Transaction id returned for PROGRAM_CALL after broadcast.
|
|
92
|
+
* This is a broadcast artifact, not a reusable signer-bound signature.
|
|
93
|
+
*/
|
|
90
94
|
txHash?: string;
|
|
91
95
|
}
|
|
92
96
|
|