@solana/keychain-dfns 0.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -0
- package/dist/__tests__/dfns-signer.integration.test.d.ts +2 -0
- package/dist/__tests__/dfns-signer.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dfns-signer.integration.test.js +17 -0
- package/dist/__tests__/dfns-signer.integration.test.js.map +1 -0
- package/dist/__tests__/dfns-signer.test.d.ts +2 -0
- package/dist/__tests__/dfns-signer.test.d.ts.map +1 -0
- package/dist/__tests__/dfns-signer.test.js +292 -0
- package/dist/__tests__/dfns-signer.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +45 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +64 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/auth.d.ts +7 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +237 -0
- package/dist/auth.js.map +1 -0
- package/dist/dfns-signer.d.ts +72 -0
- package/dist/dfns-signer.d.ts.map +1 -0
- package/dist/dfns-signer.js +392 -0
- package/dist/dfns-signer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +101 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -8
- package/src/__tests__/dfns-signer.integration.test.ts +17 -0
- package/src/__tests__/dfns-signer.test.ts +398 -0
- package/src/__tests__/setup.ts +76 -0
- package/src/auth.ts +289 -0
- package/src/dfns-signer.ts +495 -0
- package/src/index.ts +2 -0
- package/src/types.ts +113 -0
package/README.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# @solana/keychain-dfns
|
|
2
|
+
|
|
3
|
+
Dfns-based signer for Solana transactions using [Dfns](https://dfns.co) Keys API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @solana/keychain-dfns
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
1. A [Dfns](https://dfns.co) account with API access
|
|
14
|
+
2. A Solana wallet created in the Dfns dashboard
|
|
15
|
+
3. A service account with signing permissions
|
|
16
|
+
|
|
17
|
+
### Setting Up a Service Account
|
|
18
|
+
|
|
19
|
+
Follow the [Creating a Service
|
|
20
|
+
Account](https://docs.dfns.co/guides/developers/creating-a-service-account) guide:
|
|
21
|
+
|
|
22
|
+
1. **Generate a keypair** - https://docs.dfns.co/guides/developers/generate-a-key-pair#generate-a-key-pair
|
|
23
|
+
2. **Create the service account** in Settings > Developers > Service Accounts, pasting your public key
|
|
24
|
+
3. **Save the auth token** — it is only shown once. Store it securely along with your private key
|
|
25
|
+
4. **Configure permissions** — assign a role with minimal required permissions
|
|
26
|
+
|
|
27
|
+
You will need:
|
|
28
|
+
- **Auth token** (`authToken`) — the service account token
|
|
29
|
+
- **Credential ID** (`credId`) — shown in the service account details
|
|
30
|
+
- **Private key** (`privateKeyPem`) — the PEM key you generated in step 1
|
|
31
|
+
- **Wallet ID** (`walletId`) — found in the Dfns dashboard under Wallets
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
### Basic Setup
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { createDfnsSigner } from '@solana/keychain-dfns';
|
|
39
|
+
|
|
40
|
+
const signer = await createDfnsSigner({
|
|
41
|
+
authToken: 'your-service-account-token',
|
|
42
|
+
credId: 'your-credential-id',
|
|
43
|
+
privateKeyPem: `-----BEGIN PRIVATE KEY-----
|
|
44
|
+
...your private key...
|
|
45
|
+
-----END PRIVATE KEY-----`,
|
|
46
|
+
walletId: 'wa-xxxxx-xxxxx-xxxxx',
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
console.log('Signer address:', signer.address);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Signing Transactions
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import {
|
|
56
|
+
appendTransactionMessageInstructions,
|
|
57
|
+
createSolanaRpc,
|
|
58
|
+
createTransactionMessage,
|
|
59
|
+
getBase64EncodedWireTransaction,
|
|
60
|
+
pipe,
|
|
61
|
+
setTransactionMessageFeePayerSigner,
|
|
62
|
+
setTransactionMessageLifetimeUsingBlockhash,
|
|
63
|
+
signTransactionMessageWithSigners,
|
|
64
|
+
} from '@solana/kit';
|
|
65
|
+
|
|
66
|
+
const rpc = createSolanaRpc('https://api.devnet.solana.com');
|
|
67
|
+
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
|
|
68
|
+
|
|
69
|
+
const message = pipe(
|
|
70
|
+
createTransactionMessage({ version: 0 }),
|
|
71
|
+
(tx) => setTransactionMessageFeePayerSigner(signer, tx),
|
|
72
|
+
(tx) => appendTransactionMessageInstructions([/* your instructions */], tx),
|
|
73
|
+
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const signedTx = await signTransactionMessageWithSigners(message);
|
|
77
|
+
const encoded = getBase64EncodedWireTransaction(signedTx);
|
|
78
|
+
await rpc.sendTransaction(encoded).send();
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Signing Messages
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const message = new TextEncoder().encode('Hello, Solana!');
|
|
85
|
+
const [signatureDictionary] = await signer.signMessages([{ content: message }]);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Configuration
|
|
89
|
+
|
|
90
|
+
### DfnsSignerConfig
|
|
91
|
+
|
|
92
|
+
| Field | Type | Required | Default | Description |
|
|
93
|
+
|-----------------|----------|----------|-------------------------|---------------------------------------------------|
|
|
94
|
+
| `authToken` | `string` | Yes | - | Service account token or personal access token |
|
|
95
|
+
| `credId` | `string` | Yes | - | Credential ID for user action signing |
|
|
96
|
+
| `privateKeyPem` | `string` | Yes | - | Private key in PEM format |
|
|
97
|
+
| `walletId` | `string` | Yes | - | Dfns wallet ID (starts with `wa-`) |
|
|
98
|
+
| `apiBaseUrl` | `string` | No | `https://api.dfns.io` | Custom API base URL |
|
|
99
|
+
| `requestDelayMs`| `number` | No | `0` | Delay in ms between concurrent signing requests |
|
|
100
|
+
|
|
101
|
+
## How It Works
|
|
102
|
+
|
|
103
|
+
1. **Initialization**: `create()` fetches the wallet from Dfns API and validates the Ed25519 public key
|
|
104
|
+
(your Solana address)
|
|
105
|
+
2. **Signing**: Transactions and messages are sent to the Dfns Keys API (`/keys/{keyId}/signatures`)
|
|
106
|
+
which returns Ed25519 signature components (r, s)
|
|
107
|
+
3. **User Action Signing**: Mutating API requests (like signing) go through a 3-step challenge/response
|
|
108
|
+
flow — the SDK handles this automatically using your `credId` and `privateKeyPem`
|
|
109
|
+
|
|
110
|
+
## Error Handling
|
|
111
|
+
|
|
112
|
+
The signer throws errors with specific codes from `@solana/keychain-core`:
|
|
113
|
+
|
|
114
|
+
- `CONFIG_ERROR` — Invalid configuration (missing fields, inactive wallet, unsupported key type)
|
|
115
|
+
- `REMOTE_API_ERROR` — Dfns API returned an error
|
|
116
|
+
- `SIGNING_FAILED` — Signature request failed or requires policy approval
|
|
117
|
+
- `PARSING_ERROR` — Failed to parse Dfns response
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { SignerErrorCode } from '@solana/keychain-core';
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
await signer.signMessages([message]);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
if (error.code === SignerErrorCode.REMOTE_API_ERROR) {
|
|
126
|
+
console.error('Dfns API error:', error.message);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Security Considerations
|
|
132
|
+
|
|
133
|
+
1. **Token Security**: Never hardcode auth tokens. Use environment variables or a secrets manager.
|
|
134
|
+
2. **Private Key**: Store the PEM private key securely. It is used to sign every user action requests.
|
|
135
|
+
3. **Policy Engine**: Configure [Dfns Policies](https://docs.dfns.co/api-reference/policies) to enforce
|
|
136
|
+
signing rules and approval workflows.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfns-signer.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dfns-signer.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
import { runSignerIntegrationTest } from '@solana/keychain-test-utils';
|
|
3
|
+
import { getConfig } from './setup';
|
|
4
|
+
import { config } from 'dotenv';
|
|
5
|
+
config();
|
|
6
|
+
describe('DfnsSigner Integration', () => {
|
|
7
|
+
it.skipIf(!process.env.DFNS_AUTH_TOKEN)('signs transactions with real API', async () => {
|
|
8
|
+
await runSignerIntegrationTest(await getConfig(['signTransaction']));
|
|
9
|
+
});
|
|
10
|
+
it.skipIf(!process.env.DFNS_AUTH_TOKEN)('signs messages with real API', async () => {
|
|
11
|
+
await runSignerIntegrationTest(await getConfig(['signMessage']));
|
|
12
|
+
});
|
|
13
|
+
it.skipIf(!process.env.DFNS_AUTH_TOKEN)('simulates transactions with real API', async () => {
|
|
14
|
+
await runSignerIntegrationTest(await getConfig(['simulateTransaction']));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=dfns-signer.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfns-signer.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/dfns-signer.integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,MAAM,EAAE,CAAC;AAET,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,wBAAwB,CAAC,MAAM,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,wBAAwB,CAAC,MAAM,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,wBAAwB,CAAC,MAAM,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfns-signer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dfns-signer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import * as nodeCrypto from 'node:crypto';
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
+
vi.mock('@solana/keychain-core', async (importOriginal) => {
|
|
4
|
+
const mod = await importOriginal();
|
|
5
|
+
return {
|
|
6
|
+
...mod,
|
|
7
|
+
assertSignatureValid: vi.fn(),
|
|
8
|
+
sanitizeRemoteErrorResponse: mod.sanitizeRemoteErrorResponse ??
|
|
9
|
+
((text) => `${text
|
|
10
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, ' ')
|
|
11
|
+
.replace(/\s+/g, ' ')
|
|
12
|
+
.trim()
|
|
13
|
+
.slice(0, 256)} [truncated]`),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
import { DfnsSigner } from '../dfns-signer.js';
|
|
17
|
+
import { TEST_AUTH_TOKEN, TEST_CRED_ID, TEST_ED25519_PEM, TEST_WALLET_ID, createSignatureResponse, createUserActionInitResponse, createUserActionResponse, createWalletResponse, } from './setup.js';
|
|
18
|
+
global.fetch = vi.fn();
|
|
19
|
+
const mockFetch = global.fetch;
|
|
20
|
+
const defaultConfig = {
|
|
21
|
+
authToken: TEST_AUTH_TOKEN,
|
|
22
|
+
credId: TEST_CRED_ID,
|
|
23
|
+
privateKeyPem: TEST_ED25519_PEM,
|
|
24
|
+
walletId: TEST_WALLET_ID,
|
|
25
|
+
};
|
|
26
|
+
function mockWalletFetch(overrides) {
|
|
27
|
+
mockFetch.mockResolvedValueOnce({
|
|
28
|
+
json: async () => createWalletResponse(overrides),
|
|
29
|
+
ok: true,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
describe('DfnsSigner', () => {
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
vi.resetAllMocks();
|
|
35
|
+
});
|
|
36
|
+
describe('create', () => {
|
|
37
|
+
it('creates a DfnsSigner with valid config', async () => {
|
|
38
|
+
mockWalletFetch();
|
|
39
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
40
|
+
expect(signer).toBeDefined();
|
|
41
|
+
expect(signer.address).toBeDefined();
|
|
42
|
+
});
|
|
43
|
+
it('throws error for missing authToken', async () => {
|
|
44
|
+
await expect(DfnsSigner.create({ ...defaultConfig, authToken: '' })).rejects.toThrow('Missing required authToken field');
|
|
45
|
+
});
|
|
46
|
+
it('throws error for missing credId', async () => {
|
|
47
|
+
await expect(DfnsSigner.create({ ...defaultConfig, credId: '' })).rejects.toThrow('Missing required credId field');
|
|
48
|
+
});
|
|
49
|
+
it('throws error for missing privateKeyPem', async () => {
|
|
50
|
+
await expect(DfnsSigner.create({ ...defaultConfig, privateKeyPem: '' })).rejects.toThrow('Missing required privateKeyPem field');
|
|
51
|
+
});
|
|
52
|
+
it('throws error for missing walletId', async () => {
|
|
53
|
+
await expect(DfnsSigner.create({ ...defaultConfig, walletId: '' })).rejects.toThrow('Missing required walletId field');
|
|
54
|
+
});
|
|
55
|
+
it('throws CONFIG_ERROR when apiBaseUrl is not a valid URL', async () => {
|
|
56
|
+
await expect(DfnsSigner.create({ ...defaultConfig, apiBaseUrl: 'not-a-url' })).rejects.toMatchObject({
|
|
57
|
+
code: 'SIGNER_CONFIG_ERROR',
|
|
58
|
+
message: expect.stringContaining('apiBaseUrl is not a valid URL'),
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it('throws CONFIG_ERROR when apiBaseUrl does not use HTTPS', async () => {
|
|
62
|
+
await expect(DfnsSigner.create({
|
|
63
|
+
...defaultConfig,
|
|
64
|
+
apiBaseUrl: 'http://api.dfns.test',
|
|
65
|
+
})).rejects.toMatchObject({
|
|
66
|
+
code: 'SIGNER_CONFIG_ERROR',
|
|
67
|
+
message: expect.stringContaining('apiBaseUrl must use HTTPS'),
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
it('throws error for inactive wallet', async () => {
|
|
71
|
+
mockWalletFetch({ status: 'Inactive' });
|
|
72
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow('not active');
|
|
73
|
+
});
|
|
74
|
+
it('throws error for non-EdDSA scheme', async () => {
|
|
75
|
+
mockWalletFetch({ scheme: 'ECDSA' });
|
|
76
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow('Unsupported key scheme');
|
|
77
|
+
});
|
|
78
|
+
it('throws error for API failure', async () => {
|
|
79
|
+
mockFetch.mockResolvedValueOnce({
|
|
80
|
+
ok: false,
|
|
81
|
+
status: 401,
|
|
82
|
+
});
|
|
83
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow();
|
|
84
|
+
});
|
|
85
|
+
it('throws PARSING_ERROR for malformed wallet response shape', async () => {
|
|
86
|
+
mockFetch.mockResolvedValueOnce({
|
|
87
|
+
json: async () => ({}),
|
|
88
|
+
ok: true,
|
|
89
|
+
});
|
|
90
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toMatchObject({
|
|
91
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
92
|
+
message: expect.stringContaining('Unexpected Dfns wallet response shape'),
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
it('throws error for negative requestDelayMs', async () => {
|
|
96
|
+
await expect(DfnsSigner.create({ ...defaultConfig, requestDelayMs: -1 })).rejects.toThrow('requestDelayMs must not be negative');
|
|
97
|
+
});
|
|
98
|
+
it('warns for high requestDelayMs', async () => {
|
|
99
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
100
|
+
mockWalletFetch();
|
|
101
|
+
await DfnsSigner.create({ ...defaultConfig, requestDelayMs: 5000 });
|
|
102
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('requestDelayMs is greater than 3000ms'));
|
|
103
|
+
warnSpy.mockRestore();
|
|
104
|
+
});
|
|
105
|
+
it('throws HTTP_ERROR when fetch fails during create', async () => {
|
|
106
|
+
mockFetch.mockRejectedValueOnce(new Error('Network timeout'));
|
|
107
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toMatchObject({
|
|
108
|
+
code: 'SIGNER_HTTP_ERROR',
|
|
109
|
+
message: expect.stringContaining('Dfns network request failed'),
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('signMessages', () => {
|
|
114
|
+
it('throws HTTP_ERROR when fetch fails during signing', async () => {
|
|
115
|
+
mockWalletFetch();
|
|
116
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
117
|
+
// The auth flow init request fails with network error
|
|
118
|
+
mockFetch.mockRejectedValueOnce(new Error('Network timeout'));
|
|
119
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
120
|
+
code: 'SIGNER_HTTP_ERROR',
|
|
121
|
+
message: expect.stringContaining('Dfns network request failed'),
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
it('signs a message successfully', async () => {
|
|
125
|
+
const rHex = '11'.repeat(32);
|
|
126
|
+
const sHex = '22'.repeat(32);
|
|
127
|
+
mockWalletFetch();
|
|
128
|
+
mockFetch.mockResolvedValueOnce({
|
|
129
|
+
json: async () => createUserActionInitResponse(),
|
|
130
|
+
ok: true,
|
|
131
|
+
});
|
|
132
|
+
mockFetch.mockResolvedValueOnce({
|
|
133
|
+
json: async () => createUserActionResponse(),
|
|
134
|
+
ok: true,
|
|
135
|
+
});
|
|
136
|
+
mockFetch.mockResolvedValueOnce({
|
|
137
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
138
|
+
ok: true,
|
|
139
|
+
});
|
|
140
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
141
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
142
|
+
expect(result).toHaveLength(1);
|
|
143
|
+
expect(result[0]?.[signer.address]).toBeDefined();
|
|
144
|
+
const sig = result[0][signer.address];
|
|
145
|
+
expect(sig.length).toBe(64);
|
|
146
|
+
});
|
|
147
|
+
it('accepts escaped-newline PEM keys for auth challenge signing', async () => {
|
|
148
|
+
const rHex = '11'.repeat(32);
|
|
149
|
+
const sHex = '22'.repeat(32);
|
|
150
|
+
mockWalletFetch();
|
|
151
|
+
mockFetch.mockResolvedValueOnce({
|
|
152
|
+
json: async () => createUserActionInitResponse(),
|
|
153
|
+
ok: true,
|
|
154
|
+
});
|
|
155
|
+
mockFetch.mockResolvedValueOnce({
|
|
156
|
+
json: async () => createUserActionResponse(),
|
|
157
|
+
ok: true,
|
|
158
|
+
});
|
|
159
|
+
mockFetch.mockResolvedValueOnce({
|
|
160
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
161
|
+
ok: true,
|
|
162
|
+
});
|
|
163
|
+
const signer = await DfnsSigner.create({
|
|
164
|
+
...defaultConfig,
|
|
165
|
+
privateKeyPem: TEST_ED25519_PEM.replace(/\n/g, '\\n'),
|
|
166
|
+
});
|
|
167
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
168
|
+
expect(result).toHaveLength(1);
|
|
169
|
+
const sig = result[0][signer.address];
|
|
170
|
+
expect(sig.length).toBe(64);
|
|
171
|
+
});
|
|
172
|
+
it('supports SEC1 PEM keys for auth challenge signing', async () => {
|
|
173
|
+
const { privateKey } = nodeCrypto.generateKeyPairSync('ec', { namedCurve: 'prime256v1' });
|
|
174
|
+
const sec1Pem = privateKey.export({ format: 'pem', type: 'sec1' }).toString();
|
|
175
|
+
const rHex = '11'.repeat(32);
|
|
176
|
+
const sHex = '22'.repeat(32);
|
|
177
|
+
mockWalletFetch();
|
|
178
|
+
mockFetch.mockResolvedValueOnce({
|
|
179
|
+
json: async () => createUserActionInitResponse(),
|
|
180
|
+
ok: true,
|
|
181
|
+
});
|
|
182
|
+
mockFetch.mockResolvedValueOnce({
|
|
183
|
+
json: async () => createUserActionResponse(),
|
|
184
|
+
ok: true,
|
|
185
|
+
});
|
|
186
|
+
mockFetch.mockResolvedValueOnce({
|
|
187
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
188
|
+
ok: true,
|
|
189
|
+
});
|
|
190
|
+
const signer = await DfnsSigner.create({
|
|
191
|
+
...defaultConfig,
|
|
192
|
+
privateKeyPem: sec1Pem,
|
|
193
|
+
});
|
|
194
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
195
|
+
expect(result).toHaveLength(1);
|
|
196
|
+
const sig = result[0][signer.address];
|
|
197
|
+
expect(sig.length).toBe(64);
|
|
198
|
+
});
|
|
199
|
+
it('left-pads short signature components', async () => {
|
|
200
|
+
// r is 31 bytes (short by 1), s is 32 bytes
|
|
201
|
+
const rHex = 'ff'.repeat(31);
|
|
202
|
+
const sHex = 'aa'.repeat(32);
|
|
203
|
+
mockWalletFetch();
|
|
204
|
+
mockFetch.mockResolvedValueOnce({
|
|
205
|
+
json: async () => createUserActionInitResponse(),
|
|
206
|
+
ok: true,
|
|
207
|
+
});
|
|
208
|
+
mockFetch.mockResolvedValueOnce({
|
|
209
|
+
json: async () => createUserActionResponse(),
|
|
210
|
+
ok: true,
|
|
211
|
+
});
|
|
212
|
+
mockFetch.mockResolvedValueOnce({
|
|
213
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
214
|
+
ok: true,
|
|
215
|
+
});
|
|
216
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
217
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
218
|
+
const sig = result[0][signer.address];
|
|
219
|
+
expect(sig.length).toBe(64);
|
|
220
|
+
// First byte should be 0x00 (left-pad), then 31 bytes of 0xff
|
|
221
|
+
expect(sig[0]).toBe(0x00);
|
|
222
|
+
expect(sig[1]).toBe(0xff);
|
|
223
|
+
});
|
|
224
|
+
it('throws PARSING_ERROR for malformed auth challenge response shape', async () => {
|
|
225
|
+
mockWalletFetch();
|
|
226
|
+
mockFetch.mockResolvedValueOnce({
|
|
227
|
+
json: async () => ({}),
|
|
228
|
+
ok: true,
|
|
229
|
+
});
|
|
230
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
231
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
232
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
233
|
+
message: expect.stringContaining('Unexpected Dfns auth challenge response shape'),
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
it('throws PARSING_ERROR for malformed signature response shape', async () => {
|
|
237
|
+
mockWalletFetch();
|
|
238
|
+
mockFetch.mockResolvedValueOnce({
|
|
239
|
+
json: async () => createUserActionInitResponse(),
|
|
240
|
+
ok: true,
|
|
241
|
+
});
|
|
242
|
+
mockFetch.mockResolvedValueOnce({
|
|
243
|
+
json: async () => createUserActionResponse(),
|
|
244
|
+
ok: true,
|
|
245
|
+
});
|
|
246
|
+
mockFetch.mockResolvedValueOnce({
|
|
247
|
+
json: async () => ({}),
|
|
248
|
+
ok: true,
|
|
249
|
+
});
|
|
250
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
251
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
252
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
253
|
+
message: expect.stringContaining('Unexpected Dfns signature response shape'),
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
it('throws PARSING_ERROR for malformed auth action response shape', async () => {
|
|
257
|
+
mockWalletFetch();
|
|
258
|
+
mockFetch.mockResolvedValueOnce({
|
|
259
|
+
json: async () => createUserActionInitResponse(),
|
|
260
|
+
ok: true,
|
|
261
|
+
});
|
|
262
|
+
mockFetch.mockResolvedValueOnce({
|
|
263
|
+
json: async () => ({}),
|
|
264
|
+
ok: true,
|
|
265
|
+
});
|
|
266
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
267
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
268
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
269
|
+
message: expect.stringContaining('Unexpected Dfns auth action response shape'),
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
describe('isAvailable', () => {
|
|
274
|
+
it('returns true when API responds', async () => {
|
|
275
|
+
mockWalletFetch();
|
|
276
|
+
// isAvailable doesn't need create(), but we need a signer instance
|
|
277
|
+
mockWalletFetch(); // for the isAvailable call
|
|
278
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
279
|
+
expect(await signer.isAvailable()).toBe(true);
|
|
280
|
+
});
|
|
281
|
+
it('returns false when API fails', async () => {
|
|
282
|
+
mockWalletFetch(); // for create()
|
|
283
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
284
|
+
mockFetch.mockResolvedValueOnce({
|
|
285
|
+
ok: false,
|
|
286
|
+
status: 500,
|
|
287
|
+
});
|
|
288
|
+
expect(await signer.isAvailable()).toBe(false);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
//# sourceMappingURL=dfns-signer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfns-signer.test.js","sourceRoot":"","sources":["../../src/__tests__/dfns-signer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { SolanaSigner } from '@solana/keychain-core';
|
|
2
|
+
import { SignerTestConfig, TestScenario } from '@solana/keychain-test-utils';
|
|
3
|
+
export declare const TEST_AUTH_TOKEN = "test-auth-token";
|
|
4
|
+
export declare const TEST_CRED_ID = "test-cred-id";
|
|
5
|
+
export declare const TEST_WALLET_ID = "test-wallet-id";
|
|
6
|
+
export declare const TEST_KEY_ID = "test-key-id";
|
|
7
|
+
export declare const TEST_ED25519_PEM = "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIJ+DYvh6SEqVTm50DFtMDoQikUmifl1yiWd+IiYyoHBD\n-----END PRIVATE KEY-----";
|
|
8
|
+
export declare const TEST_PUBKEY_HEX = "5da30b28c87836b0ee76ae7b07e3a2e3be1a4c12e48fce3aee18de0a13040b9a";
|
|
9
|
+
export declare function createWalletResponse(overrides?: Partial<{
|
|
10
|
+
status: string;
|
|
11
|
+
scheme: string;
|
|
12
|
+
curve: string;
|
|
13
|
+
}>): {
|
|
14
|
+
id: string;
|
|
15
|
+
network: string;
|
|
16
|
+
signingKey: {
|
|
17
|
+
id: string;
|
|
18
|
+
curve: string;
|
|
19
|
+
publicKey: string;
|
|
20
|
+
scheme: string;
|
|
21
|
+
};
|
|
22
|
+
status: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function createUserActionInitResponse(): {
|
|
25
|
+
allowCredentials: {
|
|
26
|
+
key: {
|
|
27
|
+
id: string;
|
|
28
|
+
}[];
|
|
29
|
+
};
|
|
30
|
+
challenge: string;
|
|
31
|
+
challengeIdentifier: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function createUserActionResponse(): {
|
|
34
|
+
userAction: string;
|
|
35
|
+
};
|
|
36
|
+
export declare function createSignatureResponse(r: string, s: string): {
|
|
37
|
+
id: string;
|
|
38
|
+
signature: {
|
|
39
|
+
r: string;
|
|
40
|
+
s: string;
|
|
41
|
+
};
|
|
42
|
+
status: string;
|
|
43
|
+
};
|
|
44
|
+
export declare function getConfig(scenarios: TestScenario[]): Promise<SignerTestConfig<SolanaSigner>>;
|
|
45
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG7E,eAAO,MAAM,eAAe,oBAAoB,CAAC;AACjD,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAGzC,eAAO,MAAM,gBAAgB,6HAEH,CAAC;AAE3B,eAAO,MAAM,eAAe,qEAAqE,CAAC;AAElG,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;;;;;;;;;;EAY1G;AAED,wBAAgB,4BAA4B;;;;;;;;EAQ3C;AAED,wBAAgB,wBAAwB;;EAIvC;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;;;;;EAM3D;AAkBD,wBAAsB,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAKlG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createDfnsSigner } from '../dfns-signer.js';
|
|
2
|
+
export const TEST_AUTH_TOKEN = 'test-auth-token';
|
|
3
|
+
export const TEST_CRED_ID = 'test-cred-id';
|
|
4
|
+
export const TEST_WALLET_ID = 'test-wallet-id';
|
|
5
|
+
export const TEST_KEY_ID = 'test-key-id';
|
|
6
|
+
// Ed25519 test key in PKCS#8 PEM format
|
|
7
|
+
export const TEST_ED25519_PEM = `-----BEGIN PRIVATE KEY-----
|
|
8
|
+
MC4CAQAwBQYDK2VwBCIEIJ+DYvh6SEqVTm50DFtMDoQikUmifl1yiWd+IiYyoHBD
|
|
9
|
+
-----END PRIVATE KEY-----`;
|
|
10
|
+
export const TEST_PUBKEY_HEX = '5da30b28c87836b0ee76ae7b07e3a2e3be1a4c12e48fce3aee18de0a13040b9a';
|
|
11
|
+
export function createWalletResponse(overrides) {
|
|
12
|
+
return {
|
|
13
|
+
id: TEST_WALLET_ID,
|
|
14
|
+
network: 'Solana',
|
|
15
|
+
signingKey: {
|
|
16
|
+
id: TEST_KEY_ID,
|
|
17
|
+
curve: overrides?.curve ?? 'ed25519',
|
|
18
|
+
publicKey: TEST_PUBKEY_HEX,
|
|
19
|
+
scheme: overrides?.scheme ?? 'EdDSA',
|
|
20
|
+
},
|
|
21
|
+
status: overrides?.status ?? 'Active',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function createUserActionInitResponse() {
|
|
25
|
+
return {
|
|
26
|
+
allowCredentials: {
|
|
27
|
+
key: [{ id: TEST_CRED_ID }],
|
|
28
|
+
},
|
|
29
|
+
challenge: 'test-challenge',
|
|
30
|
+
challengeIdentifier: 'test-challenge-id',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function createUserActionResponse() {
|
|
34
|
+
return {
|
|
35
|
+
userAction: 'test-user-action-token',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function createSignatureResponse(r, s) {
|
|
39
|
+
return {
|
|
40
|
+
id: 'sig-123',
|
|
41
|
+
signature: { r, s },
|
|
42
|
+
status: 'Signed',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const SIGNER_TYPE = 'dfns';
|
|
46
|
+
const REQUIRED_ENV_VARS = ['DFNS_AUTH_TOKEN', 'DFNS_CRED_ID', 'DFNS_PRIVATE_KEY_PEM', 'DFNS_WALLET_ID'];
|
|
47
|
+
const CONFIG = {
|
|
48
|
+
signerType: SIGNER_TYPE,
|
|
49
|
+
requiredEnvVars: REQUIRED_ENV_VARS,
|
|
50
|
+
createSigner: () => createDfnsSigner({
|
|
51
|
+
authToken: process.env.DFNS_AUTH_TOKEN,
|
|
52
|
+
credId: process.env.DFNS_CRED_ID,
|
|
53
|
+
privateKeyPem: process.env.DFNS_PRIVATE_KEY_PEM,
|
|
54
|
+
walletId: process.env.DFNS_WALLET_ID,
|
|
55
|
+
apiBaseUrl: process.env.DFNS_API_BASE_URL,
|
|
56
|
+
}),
|
|
57
|
+
};
|
|
58
|
+
export async function getConfig(scenarios) {
|
|
59
|
+
return {
|
|
60
|
+
...CONFIG,
|
|
61
|
+
testScenarios: scenarios,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AAEzC,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG;;0BAEN,CAAC;AAE3B,MAAM,CAAC,MAAM,eAAe,GAAG,kEAAkE,CAAC;AAElG,MAAM,UAAU,oBAAoB,CAAC,SAAsE;IACvG,OAAO;QACH,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE;YACR,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,SAAS;YACpC,SAAS,EAAE,eAAe;YAC1B,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,OAAO;SACvC;QACD,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,QAAQ;KACxC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,4BAA4B;IACxC,OAAO;QACH,gBAAgB,EAAE;YACd,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC;SAC9B;QACD,SAAS,EAAE,gBAAgB;QAC3B,mBAAmB,EAAE,mBAAmB;KAC3C,CAAC;AACN,CAAC;AAED,MAAM,UAAU,wBAAwB;IACpC,OAAO;QACH,UAAU,EAAE,wBAAwB;KACvC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,CAAS,EAAE,CAAS;IACxD,OAAO;QACH,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;QACnB,MAAM,EAAE,QAAQ;KACnB,CAAC;AACN,CAAC;AAED,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;AAExG,MAAM,MAAM,GAAmC;IAC3C,UAAU,EAAE,WAAW;IACvB,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,GAAG,EAAE,CACf,gBAAgB,CAAC;QACb,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,eAAgB;QACvC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAa;QACjC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAqB;QAChD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAe;QACrC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;KAC5C,CAAC;CACT,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAyB;IACrD,OAAO;QACH,GAAG,MAAM;QACT,aAAa,EAAE,SAAS;KAC3B,CAAC;AACN,CAAC"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perform the Dfns User Action Signing flow. For more details, see https://docs.dfns.co/api-reference/auth/signing-flows#asymetric-keys-signing-flow
|
|
3
|
+
*
|
|
4
|
+
* @returns The `userAction` token to include as `x-dfns-useraction` header.
|
|
5
|
+
*/
|
|
6
|
+
export declare function signUserAction(apiBaseUrl: string, authToken: string, credId: string, privateKeyPem: string, httpMethod: string, httpPath: string, body: string): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAsB,cAAc,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAwHjB"}
|