@miden-sdk/miden-wallet-adapter-base 0.13.1 → 0.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/adapter.test.ts +82 -0
- package/__tests__/errors.test.ts +100 -0
- package/__tests__/helpers.test.ts +39 -0
- package/__tests__/transaction.test.ts +166 -0
- package/dist/__tests__/adapter.test.d.ts +1 -0
- package/dist/__tests__/adapter.test.js +66 -0
- package/dist/__tests__/adapter.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +1 -0
- package/dist/__tests__/errors.test.js +70 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/helpers.test.d.ts +1 -0
- package/dist/__tests__/helpers.test.js +35 -0
- package/dist/__tests__/helpers.test.js.map +1 -0
- package/dist/__tests__/transaction.test.d.ts +1 -0
- package/dist/__tests__/transaction.test.js +113 -0
- package/dist/__tests__/transaction.test.js.map +1 -0
- package/dist/signer.d.ts +3 -1
- package/dist/signer.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +8 -0
- package/dist/vitest.config.js.map +1 -0
- package/docs/README.md +3 -0
- package/docs/classes/BaseMessageSignerWalletAdapter.md +20 -0
- package/docs/interfaces/CreateAccountParams.md +25 -0
- package/docs/interfaces/MessageSignerWalletAdapterProps.md +16 -0
- package/docs/type-aliases/CreateAccountStorageMode.md +9 -0
- package/docs/type-aliases/CreateAccountType.md +9 -0
- package/package.json +7 -2
- package/signer.ts +3 -1
- package/types.ts +12 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
WalletReadyState,
|
|
4
|
+
BaseWalletAdapter,
|
|
5
|
+
scopePollingDetectionStrategy,
|
|
6
|
+
} from '../adapter';
|
|
7
|
+
|
|
8
|
+
describe('WalletReadyState enum', () => {
|
|
9
|
+
it('has correct values', () => {
|
|
10
|
+
expect(WalletReadyState.Installed).toBe('Installed');
|
|
11
|
+
expect(WalletReadyState.NotDetected).toBe('NotDetected');
|
|
12
|
+
expect(WalletReadyState.Loadable).toBe('Loadable');
|
|
13
|
+
expect(WalletReadyState.Unsupported).toBe('Unsupported');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('BaseWalletAdapter', () => {
|
|
18
|
+
// Concrete subclass for testing
|
|
19
|
+
class TestAdapter extends BaseWalletAdapter {
|
|
20
|
+
name = 'Test' as any;
|
|
21
|
+
url = 'https://test.com';
|
|
22
|
+
icon = 'icon';
|
|
23
|
+
readyState = WalletReadyState.Installed;
|
|
24
|
+
address: string | null = null;
|
|
25
|
+
publicKey: Uint8Array | null = null;
|
|
26
|
+
connecting = false;
|
|
27
|
+
supportedTransactionVersions = null;
|
|
28
|
+
|
|
29
|
+
async connect() {}
|
|
30
|
+
async disconnect() {}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
it('connected returns true when address is set', () => {
|
|
34
|
+
const adapter = new TestAdapter();
|
|
35
|
+
adapter.address = '0xabc';
|
|
36
|
+
expect(adapter.connected).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('connected returns false when address is null', () => {
|
|
40
|
+
const adapter = new TestAdapter();
|
|
41
|
+
expect(adapter.connected).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('scopePollingDetectionStrategy', () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
vi.useFakeTimers();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
vi.useRealTimers();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('calls detect immediately and cleans up on detection', () => {
|
|
55
|
+
const detect = vi.fn().mockReturnValue(true);
|
|
56
|
+
scopePollingDetectionStrategy(detect);
|
|
57
|
+
expect(detect).toHaveBeenCalled();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('sets up polling interval when not immediately detected', () => {
|
|
61
|
+
let callCount = 0;
|
|
62
|
+
const detect = vi.fn(() => {
|
|
63
|
+
callCount++;
|
|
64
|
+
return callCount >= 3;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
scopePollingDetectionStrategy(detect);
|
|
68
|
+
// First call is immediate (returns false)
|
|
69
|
+
expect(detect).toHaveBeenCalledTimes(1);
|
|
70
|
+
|
|
71
|
+
// Advance timer to trigger interval
|
|
72
|
+
vi.advanceTimersByTime(1000);
|
|
73
|
+
expect(detect).toHaveBeenCalledTimes(2);
|
|
74
|
+
|
|
75
|
+
vi.advanceTimersByTime(1000);
|
|
76
|
+
expect(detect).toHaveBeenCalledTimes(3);
|
|
77
|
+
|
|
78
|
+
// After detection (callCount >= 3), interval should be cleared
|
|
79
|
+
vi.advanceTimersByTime(1000);
|
|
80
|
+
expect(detect).toHaveBeenCalledTimes(3);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
WalletError,
|
|
4
|
+
WalletNotReadyError,
|
|
5
|
+
WalletLoadError,
|
|
6
|
+
WalletConfigError,
|
|
7
|
+
WalletConnectionError,
|
|
8
|
+
WalletNotSelectedError,
|
|
9
|
+
WalletDisconnectedError,
|
|
10
|
+
WalletDisconnectionError,
|
|
11
|
+
WalletAccountError,
|
|
12
|
+
WalletAddressError,
|
|
13
|
+
WalletKeypairError,
|
|
14
|
+
WalletNotConnectedError,
|
|
15
|
+
WalletSendTransactionError,
|
|
16
|
+
WalletSignMessageError,
|
|
17
|
+
WalletSignTransactionError,
|
|
18
|
+
WalletTimeoutError,
|
|
19
|
+
WalletWindowBlockedError,
|
|
20
|
+
WalletWindowClosedError,
|
|
21
|
+
WalletDecryptionNotAllowedError,
|
|
22
|
+
WalletPrivateDataPermissionError,
|
|
23
|
+
WalletDecryptionError,
|
|
24
|
+
WalletRecordsError,
|
|
25
|
+
WalletTransactionError,
|
|
26
|
+
} from '../errors';
|
|
27
|
+
|
|
28
|
+
const errorClasses = [
|
|
29
|
+
{ Class: WalletNotReadyError, name: 'WalletNotReadyError' },
|
|
30
|
+
{ Class: WalletLoadError, name: 'WalletLoadError' },
|
|
31
|
+
{ Class: WalletConfigError, name: 'WalletConfigError' },
|
|
32
|
+
{ Class: WalletConnectionError, name: 'WalletConnectionError' },
|
|
33
|
+
{ Class: WalletNotSelectedError, name: 'WalletNotSelectedError' },
|
|
34
|
+
{ Class: WalletDisconnectedError, name: 'WalletDisconnectedError' },
|
|
35
|
+
{ Class: WalletDisconnectionError, name: 'WalletDisconnectionError' },
|
|
36
|
+
{ Class: WalletAccountError, name: 'WalletAccountError' },
|
|
37
|
+
{ Class: WalletAddressError, name: 'WalletAddressError' },
|
|
38
|
+
{ Class: WalletKeypairError, name: 'WalletKeypairError' },
|
|
39
|
+
{ Class: WalletNotConnectedError, name: 'WalletNotConnectedError' },
|
|
40
|
+
{ Class: WalletSendTransactionError, name: 'WalletSendTransactionError' },
|
|
41
|
+
{ Class: WalletSignMessageError, name: 'WalletSignMessageError' },
|
|
42
|
+
{ Class: WalletSignTransactionError, name: 'WalletSignTransactionError' },
|
|
43
|
+
{ Class: WalletTimeoutError, name: 'WalletTimeoutError' },
|
|
44
|
+
{ Class: WalletWindowBlockedError, name: 'WalletWindowBlockedError' },
|
|
45
|
+
{ Class: WalletWindowClosedError, name: 'WalletWindowClosedError' },
|
|
46
|
+
{
|
|
47
|
+
Class: WalletDecryptionNotAllowedError,
|
|
48
|
+
name: 'WalletDecryptionNotAllowedError',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
Class: WalletPrivateDataPermissionError,
|
|
52
|
+
name: 'WalletPrivateDataPermissionError',
|
|
53
|
+
},
|
|
54
|
+
{ Class: WalletDecryptionError, name: 'WalletDecryptionError' },
|
|
55
|
+
{ Class: WalletRecordsError, name: 'WalletRecordsError' },
|
|
56
|
+
{ Class: WalletTransactionError, name: 'WalletTransactionError' },
|
|
57
|
+
] as const;
|
|
58
|
+
|
|
59
|
+
describe('WalletError', () => {
|
|
60
|
+
it('extends Error', () => {
|
|
61
|
+
const err = new WalletError('test message');
|
|
62
|
+
expect(err).toBeInstanceOf(Error);
|
|
63
|
+
expect(err).toBeInstanceOf(WalletError);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('sets message property', () => {
|
|
67
|
+
const err = new WalletError('my message');
|
|
68
|
+
expect(err.message).toBe('my message');
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('stores inner error', () => {
|
|
72
|
+
const inner = new Error('inner');
|
|
73
|
+
const err = new WalletError('outer', inner);
|
|
74
|
+
expect(err.error).toBe(inner);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('error subclasses', () => {
|
|
79
|
+
for (const { Class, name } of errorClasses) {
|
|
80
|
+
describe(name, () => {
|
|
81
|
+
it('extends WalletError and Error', () => {
|
|
82
|
+
const err = new Class();
|
|
83
|
+
expect(err).toBeInstanceOf(WalletError);
|
|
84
|
+
expect(err).toBeInstanceOf(Error);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('has correct name property', () => {
|
|
88
|
+
const err = new Class();
|
|
89
|
+
expect(err.name).toBe(name);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('stores inner error', () => {
|
|
93
|
+
const inner = new Error('cause');
|
|
94
|
+
const err = new Class('msg', inner);
|
|
95
|
+
expect(err.error).toBe(inner);
|
|
96
|
+
expect(err.message).toBe('msg');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { u8ToB64, b64ToU8 } from '../helpers';
|
|
3
|
+
|
|
4
|
+
describe('u8ToB64', () => {
|
|
5
|
+
it('encodes a known value correctly', () => {
|
|
6
|
+
const bytes = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
|
|
7
|
+
expect(u8ToB64(bytes)).toBe('SGVsbG8=');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('encodes an empty array', () => {
|
|
11
|
+
expect(u8ToB64(new Uint8Array([]))).toBe('');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('b64ToU8', () => {
|
|
16
|
+
it('decodes a known value correctly', () => {
|
|
17
|
+
const result = b64ToU8('SGVsbG8=');
|
|
18
|
+
expect(result).toEqual(new Uint8Array([72, 101, 108, 108, 111]));
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('decodes an empty string', () => {
|
|
22
|
+
expect(b64ToU8('')).toEqual(new Uint8Array([]));
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('roundtrip', () => {
|
|
27
|
+
it('encode then decode returns original bytes', () => {
|
|
28
|
+
const original = new Uint8Array([0, 1, 127, 128, 255]);
|
|
29
|
+
const decoded = b64ToU8(u8ToB64(original));
|
|
30
|
+
expect(decoded).toEqual(original);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('handles a large array (256 bytes)', () => {
|
|
34
|
+
const original = new Uint8Array(256);
|
|
35
|
+
for (let i = 0; i < 256; i++) original[i] = i;
|
|
36
|
+
const decoded = b64ToU8(u8ToB64(original));
|
|
37
|
+
expect(decoded).toEqual(original);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
SendTransaction,
|
|
4
|
+
ConsumeTransaction,
|
|
5
|
+
CustomTransaction,
|
|
6
|
+
Transaction,
|
|
7
|
+
TransactionType,
|
|
8
|
+
} from '../transaction';
|
|
9
|
+
import { u8ToB64 } from '../helpers';
|
|
10
|
+
|
|
11
|
+
describe('TransactionType enum', () => {
|
|
12
|
+
it('has correct values', () => {
|
|
13
|
+
expect(TransactionType.Send).toBe('send');
|
|
14
|
+
expect(TransactionType.Consume).toBe('consume');
|
|
15
|
+
expect(TransactionType.Custom).toBe('custom');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('SendTransaction', () => {
|
|
20
|
+
it('sets all fields correctly', () => {
|
|
21
|
+
const tx = new SendTransaction(
|
|
22
|
+
'sender-addr',
|
|
23
|
+
'recipient-addr',
|
|
24
|
+
'faucet-123',
|
|
25
|
+
'public',
|
|
26
|
+
1000
|
|
27
|
+
);
|
|
28
|
+
expect(tx.senderAddress).toBe('sender-addr');
|
|
29
|
+
expect(tx.recipientAddress).toBe('recipient-addr');
|
|
30
|
+
expect(tx.faucetId).toBe('faucet-123');
|
|
31
|
+
expect(tx.noteType).toBe('public');
|
|
32
|
+
expect(tx.amount).toBe(1000);
|
|
33
|
+
expect(tx.recallBlocks).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('sets optional recallBlocks', () => {
|
|
37
|
+
const tx = new SendTransaction(
|
|
38
|
+
'sender',
|
|
39
|
+
'recipient',
|
|
40
|
+
'faucet',
|
|
41
|
+
'private',
|
|
42
|
+
500,
|
|
43
|
+
10
|
|
44
|
+
);
|
|
45
|
+
expect(tx.recallBlocks).toBe(10);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe('ConsumeTransaction', () => {
|
|
50
|
+
it('sets fields correctly', () => {
|
|
51
|
+
const tx = new ConsumeTransaction('faucet-1', 'note-1', 'public', 100);
|
|
52
|
+
expect(tx.faucetId).toBe('faucet-1');
|
|
53
|
+
expect(tx.noteId).toBe('note-1');
|
|
54
|
+
expect(tx.noteType).toBe('public');
|
|
55
|
+
expect(tx.amount).toBe(100);
|
|
56
|
+
expect(tx.noteBytes).toBeUndefined();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('converts noteBytes Uint8Array to base64', () => {
|
|
60
|
+
const bytes = new Uint8Array([1, 2, 3]);
|
|
61
|
+
const tx = new ConsumeTransaction('faucet', 'note', 'private', 50, bytes);
|
|
62
|
+
expect(tx.noteBytes).toBe(u8ToB64(bytes));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('leaves noteBytes undefined when not provided', () => {
|
|
66
|
+
const tx = new ConsumeTransaction('faucet', 'note', 'public', 50);
|
|
67
|
+
expect(tx.noteBytes).toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('CustomTransaction', () => {
|
|
72
|
+
it('serializes transactionRequest to base64', () => {
|
|
73
|
+
const mockBytes = new Uint8Array([10, 20, 30]);
|
|
74
|
+
const mockRequest = {
|
|
75
|
+
serialize: vi.fn().mockReturnValue(mockBytes),
|
|
76
|
+
} as any;
|
|
77
|
+
|
|
78
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest);
|
|
79
|
+
expect(mockRequest.serialize).toHaveBeenCalled();
|
|
80
|
+
expect(tx.transactionRequest).toBe(u8ToB64(mockBytes));
|
|
81
|
+
expect(tx.address).toBe('addr');
|
|
82
|
+
expect(tx.recipientAddress).toBe('recipient');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('sets optional inputNoteIds', () => {
|
|
86
|
+
const mockRequest = {
|
|
87
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1])),
|
|
88
|
+
} as any;
|
|
89
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest, [
|
|
90
|
+
'id1',
|
|
91
|
+
'id2',
|
|
92
|
+
]);
|
|
93
|
+
expect(tx.inputNoteIds).toEqual(['id1', 'id2']);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('converts importNotes from Uint8Array[] to base64 strings', () => {
|
|
97
|
+
const mockRequest = {
|
|
98
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1])),
|
|
99
|
+
} as any;
|
|
100
|
+
const noteBytes = [new Uint8Array([4, 5]), new Uint8Array([6, 7])];
|
|
101
|
+
const tx = new CustomTransaction(
|
|
102
|
+
'addr',
|
|
103
|
+
'recipient',
|
|
104
|
+
mockRequest,
|
|
105
|
+
['id1'],
|
|
106
|
+
noteBytes
|
|
107
|
+
);
|
|
108
|
+
expect(tx.importNotes).toEqual([
|
|
109
|
+
u8ToB64(noteBytes[0]),
|
|
110
|
+
u8ToB64(noteBytes[1]),
|
|
111
|
+
]);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('leaves optional fields undefined when not provided', () => {
|
|
115
|
+
const mockRequest = {
|
|
116
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1])),
|
|
117
|
+
} as any;
|
|
118
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest);
|
|
119
|
+
expect(tx.inputNoteIds).toBeUndefined();
|
|
120
|
+
expect(tx.importNotes).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('Transaction factory', () => {
|
|
125
|
+
it('createSendTransaction returns correct type and payload', () => {
|
|
126
|
+
const tx = Transaction.createSendTransaction(
|
|
127
|
+
'sender',
|
|
128
|
+
'recipient',
|
|
129
|
+
'faucet',
|
|
130
|
+
'public',
|
|
131
|
+
100
|
|
132
|
+
);
|
|
133
|
+
expect(tx.type).toBe(TransactionType.Send);
|
|
134
|
+
expect(tx.payload).toBeInstanceOf(SendTransaction);
|
|
135
|
+
const payload = tx.payload as SendTransaction;
|
|
136
|
+
expect(payload.senderAddress).toBe('sender');
|
|
137
|
+
expect(payload.amount).toBe(100);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('createConsumeTransaction returns correct type and payload', () => {
|
|
141
|
+
const tx = Transaction.createConsumeTransaction(
|
|
142
|
+
'faucet',
|
|
143
|
+
'note-id',
|
|
144
|
+
'private',
|
|
145
|
+
200
|
|
146
|
+
);
|
|
147
|
+
expect(tx.type).toBe(TransactionType.Consume);
|
|
148
|
+
expect(tx.payload).toBeInstanceOf(ConsumeTransaction);
|
|
149
|
+
const payload = tx.payload as ConsumeTransaction;
|
|
150
|
+
expect(payload.faucetId).toBe('faucet');
|
|
151
|
+
expect(payload.noteId).toBe('note-id');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('createCustomTransaction returns correct type and payload', () => {
|
|
155
|
+
const mockRequest = {
|
|
156
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1, 2])),
|
|
157
|
+
} as any;
|
|
158
|
+
const tx = Transaction.createCustomTransaction(
|
|
159
|
+
'addr',
|
|
160
|
+
'recipient',
|
|
161
|
+
mockRequest
|
|
162
|
+
);
|
|
163
|
+
expect(tx.type).toBe(TransactionType.Custom);
|
|
164
|
+
expect(tx.payload).toBeInstanceOf(CustomTransaction);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { WalletReadyState, BaseWalletAdapter, scopePollingDetectionStrategy, } from '../adapter';
|
|
3
|
+
describe('WalletReadyState enum', () => {
|
|
4
|
+
it('has correct values', () => {
|
|
5
|
+
expect(WalletReadyState.Installed).toBe('Installed');
|
|
6
|
+
expect(WalletReadyState.NotDetected).toBe('NotDetected');
|
|
7
|
+
expect(WalletReadyState.Loadable).toBe('Loadable');
|
|
8
|
+
expect(WalletReadyState.Unsupported).toBe('Unsupported');
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('BaseWalletAdapter', () => {
|
|
12
|
+
// Concrete subclass for testing
|
|
13
|
+
class TestAdapter extends BaseWalletAdapter {
|
|
14
|
+
name = 'Test';
|
|
15
|
+
url = 'https://test.com';
|
|
16
|
+
icon = 'icon';
|
|
17
|
+
readyState = WalletReadyState.Installed;
|
|
18
|
+
address = null;
|
|
19
|
+
publicKey = null;
|
|
20
|
+
connecting = false;
|
|
21
|
+
supportedTransactionVersions = null;
|
|
22
|
+
async connect() { }
|
|
23
|
+
async disconnect() { }
|
|
24
|
+
}
|
|
25
|
+
it('connected returns true when address is set', () => {
|
|
26
|
+
const adapter = new TestAdapter();
|
|
27
|
+
adapter.address = '0xabc';
|
|
28
|
+
expect(adapter.connected).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it('connected returns false when address is null', () => {
|
|
31
|
+
const adapter = new TestAdapter();
|
|
32
|
+
expect(adapter.connected).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('scopePollingDetectionStrategy', () => {
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
vi.useFakeTimers();
|
|
38
|
+
});
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
vi.useRealTimers();
|
|
41
|
+
});
|
|
42
|
+
it('calls detect immediately and cleans up on detection', () => {
|
|
43
|
+
const detect = vi.fn().mockReturnValue(true);
|
|
44
|
+
scopePollingDetectionStrategy(detect);
|
|
45
|
+
expect(detect).toHaveBeenCalled();
|
|
46
|
+
});
|
|
47
|
+
it('sets up polling interval when not immediately detected', () => {
|
|
48
|
+
let callCount = 0;
|
|
49
|
+
const detect = vi.fn(() => {
|
|
50
|
+
callCount++;
|
|
51
|
+
return callCount >= 3;
|
|
52
|
+
});
|
|
53
|
+
scopePollingDetectionStrategy(detect);
|
|
54
|
+
// First call is immediate (returns false)
|
|
55
|
+
expect(detect).toHaveBeenCalledTimes(1);
|
|
56
|
+
// Advance timer to trigger interval
|
|
57
|
+
vi.advanceTimersByTime(1000);
|
|
58
|
+
expect(detect).toHaveBeenCalledTimes(2);
|
|
59
|
+
vi.advanceTimersByTime(1000);
|
|
60
|
+
expect(detect).toHaveBeenCalledTimes(3);
|
|
61
|
+
// After detection (callCount >= 3), interval should be cleared
|
|
62
|
+
vi.advanceTimersByTime(1000);
|
|
63
|
+
expect(detect).toHaveBeenCalledTimes(3);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=adapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../__tests__/adapter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { WalletError, WalletNotReadyError, WalletLoadError, WalletConfigError, WalletConnectionError, WalletNotSelectedError, WalletDisconnectedError, WalletDisconnectionError, WalletAccountError, WalletAddressError, WalletKeypairError, WalletNotConnectedError, WalletSendTransactionError, WalletSignMessageError, WalletSignTransactionError, WalletTimeoutError, WalletWindowBlockedError, WalletWindowClosedError, WalletDecryptionNotAllowedError, WalletPrivateDataPermissionError, WalletDecryptionError, WalletRecordsError, WalletTransactionError, } from '../errors';
|
|
3
|
+
const errorClasses = [
|
|
4
|
+
{ Class: WalletNotReadyError, name: 'WalletNotReadyError' },
|
|
5
|
+
{ Class: WalletLoadError, name: 'WalletLoadError' },
|
|
6
|
+
{ Class: WalletConfigError, name: 'WalletConfigError' },
|
|
7
|
+
{ Class: WalletConnectionError, name: 'WalletConnectionError' },
|
|
8
|
+
{ Class: WalletNotSelectedError, name: 'WalletNotSelectedError' },
|
|
9
|
+
{ Class: WalletDisconnectedError, name: 'WalletDisconnectedError' },
|
|
10
|
+
{ Class: WalletDisconnectionError, name: 'WalletDisconnectionError' },
|
|
11
|
+
{ Class: WalletAccountError, name: 'WalletAccountError' },
|
|
12
|
+
{ Class: WalletAddressError, name: 'WalletAddressError' },
|
|
13
|
+
{ Class: WalletKeypairError, name: 'WalletKeypairError' },
|
|
14
|
+
{ Class: WalletNotConnectedError, name: 'WalletNotConnectedError' },
|
|
15
|
+
{ Class: WalletSendTransactionError, name: 'WalletSendTransactionError' },
|
|
16
|
+
{ Class: WalletSignMessageError, name: 'WalletSignMessageError' },
|
|
17
|
+
{ Class: WalletSignTransactionError, name: 'WalletSignTransactionError' },
|
|
18
|
+
{ Class: WalletTimeoutError, name: 'WalletTimeoutError' },
|
|
19
|
+
{ Class: WalletWindowBlockedError, name: 'WalletWindowBlockedError' },
|
|
20
|
+
{ Class: WalletWindowClosedError, name: 'WalletWindowClosedError' },
|
|
21
|
+
{
|
|
22
|
+
Class: WalletDecryptionNotAllowedError,
|
|
23
|
+
name: 'WalletDecryptionNotAllowedError',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
Class: WalletPrivateDataPermissionError,
|
|
27
|
+
name: 'WalletPrivateDataPermissionError',
|
|
28
|
+
},
|
|
29
|
+
{ Class: WalletDecryptionError, name: 'WalletDecryptionError' },
|
|
30
|
+
{ Class: WalletRecordsError, name: 'WalletRecordsError' },
|
|
31
|
+
{ Class: WalletTransactionError, name: 'WalletTransactionError' },
|
|
32
|
+
];
|
|
33
|
+
describe('WalletError', () => {
|
|
34
|
+
it('extends Error', () => {
|
|
35
|
+
const err = new WalletError('test message');
|
|
36
|
+
expect(err).toBeInstanceOf(Error);
|
|
37
|
+
expect(err).toBeInstanceOf(WalletError);
|
|
38
|
+
});
|
|
39
|
+
it('sets message property', () => {
|
|
40
|
+
const err = new WalletError('my message');
|
|
41
|
+
expect(err.message).toBe('my message');
|
|
42
|
+
});
|
|
43
|
+
it('stores inner error', () => {
|
|
44
|
+
const inner = new Error('inner');
|
|
45
|
+
const err = new WalletError('outer', inner);
|
|
46
|
+
expect(err.error).toBe(inner);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('error subclasses', () => {
|
|
50
|
+
for (const { Class, name } of errorClasses) {
|
|
51
|
+
describe(name, () => {
|
|
52
|
+
it('extends WalletError and Error', () => {
|
|
53
|
+
const err = new Class();
|
|
54
|
+
expect(err).toBeInstanceOf(WalletError);
|
|
55
|
+
expect(err).toBeInstanceOf(Error);
|
|
56
|
+
});
|
|
57
|
+
it('has correct name property', () => {
|
|
58
|
+
const err = new Class();
|
|
59
|
+
expect(err.name).toBe(name);
|
|
60
|
+
});
|
|
61
|
+
it('stores inner error', () => {
|
|
62
|
+
const inner = new Error('cause');
|
|
63
|
+
const err = new Class('msg', inner);
|
|
64
|
+
expect(err.error).toBe(inner);
|
|
65
|
+
expect(err.message).toBe('msg');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { u8ToB64, b64ToU8 } from '../helpers';
|
|
3
|
+
describe('u8ToB64', () => {
|
|
4
|
+
it('encodes a known value correctly', () => {
|
|
5
|
+
const bytes = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
|
|
6
|
+
expect(u8ToB64(bytes)).toBe('SGVsbG8=');
|
|
7
|
+
});
|
|
8
|
+
it('encodes an empty array', () => {
|
|
9
|
+
expect(u8ToB64(new Uint8Array([]))).toBe('');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
describe('b64ToU8', () => {
|
|
13
|
+
it('decodes a known value correctly', () => {
|
|
14
|
+
const result = b64ToU8('SGVsbG8=');
|
|
15
|
+
expect(result).toEqual(new Uint8Array([72, 101, 108, 108, 111]));
|
|
16
|
+
});
|
|
17
|
+
it('decodes an empty string', () => {
|
|
18
|
+
expect(b64ToU8('')).toEqual(new Uint8Array([]));
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('roundtrip', () => {
|
|
22
|
+
it('encode then decode returns original bytes', () => {
|
|
23
|
+
const original = new Uint8Array([0, 1, 127, 128, 255]);
|
|
24
|
+
const decoded = b64ToU8(u8ToB64(original));
|
|
25
|
+
expect(decoded).toEqual(original);
|
|
26
|
+
});
|
|
27
|
+
it('handles a large array (256 bytes)', () => {
|
|
28
|
+
const original = new Uint8Array(256);
|
|
29
|
+
for (let i = 0; i < 256; i++)
|
|
30
|
+
original[i] = i;
|
|
31
|
+
const decoded = b64ToU8(u8ToB64(original));
|
|
32
|
+
expect(decoded).toEqual(original);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=helpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.test.js","sourceRoot":"","sources":["../../__tests__/helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE9C,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU;QAClE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { SendTransaction, ConsumeTransaction, CustomTransaction, Transaction, TransactionType, } from '../transaction';
|
|
3
|
+
import { u8ToB64 } from '../helpers';
|
|
4
|
+
describe('TransactionType enum', () => {
|
|
5
|
+
it('has correct values', () => {
|
|
6
|
+
expect(TransactionType.Send).toBe('send');
|
|
7
|
+
expect(TransactionType.Consume).toBe('consume');
|
|
8
|
+
expect(TransactionType.Custom).toBe('custom');
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('SendTransaction', () => {
|
|
12
|
+
it('sets all fields correctly', () => {
|
|
13
|
+
const tx = new SendTransaction('sender-addr', 'recipient-addr', 'faucet-123', 'public', 1000);
|
|
14
|
+
expect(tx.senderAddress).toBe('sender-addr');
|
|
15
|
+
expect(tx.recipientAddress).toBe('recipient-addr');
|
|
16
|
+
expect(tx.faucetId).toBe('faucet-123');
|
|
17
|
+
expect(tx.noteType).toBe('public');
|
|
18
|
+
expect(tx.amount).toBe(1000);
|
|
19
|
+
expect(tx.recallBlocks).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
it('sets optional recallBlocks', () => {
|
|
22
|
+
const tx = new SendTransaction('sender', 'recipient', 'faucet', 'private', 500, 10);
|
|
23
|
+
expect(tx.recallBlocks).toBe(10);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('ConsumeTransaction', () => {
|
|
27
|
+
it('sets fields correctly', () => {
|
|
28
|
+
const tx = new ConsumeTransaction('faucet-1', 'note-1', 'public', 100);
|
|
29
|
+
expect(tx.faucetId).toBe('faucet-1');
|
|
30
|
+
expect(tx.noteId).toBe('note-1');
|
|
31
|
+
expect(tx.noteType).toBe('public');
|
|
32
|
+
expect(tx.amount).toBe(100);
|
|
33
|
+
expect(tx.noteBytes).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it('converts noteBytes Uint8Array to base64', () => {
|
|
36
|
+
const bytes = new Uint8Array([1, 2, 3]);
|
|
37
|
+
const tx = new ConsumeTransaction('faucet', 'note', 'private', 50, bytes);
|
|
38
|
+
expect(tx.noteBytes).toBe(u8ToB64(bytes));
|
|
39
|
+
});
|
|
40
|
+
it('leaves noteBytes undefined when not provided', () => {
|
|
41
|
+
const tx = new ConsumeTransaction('faucet', 'note', 'public', 50);
|
|
42
|
+
expect(tx.noteBytes).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('CustomTransaction', () => {
|
|
46
|
+
it('serializes transactionRequest to base64', () => {
|
|
47
|
+
const mockBytes = new Uint8Array([10, 20, 30]);
|
|
48
|
+
const mockRequest = {
|
|
49
|
+
serialize: vi.fn().mockReturnValue(mockBytes),
|
|
50
|
+
};
|
|
51
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest);
|
|
52
|
+
expect(mockRequest.serialize).toHaveBeenCalled();
|
|
53
|
+
expect(tx.transactionRequest).toBe(u8ToB64(mockBytes));
|
|
54
|
+
expect(tx.address).toBe('addr');
|
|
55
|
+
expect(tx.recipientAddress).toBe('recipient');
|
|
56
|
+
});
|
|
57
|
+
it('sets optional inputNoteIds', () => {
|
|
58
|
+
const mockRequest = {
|
|
59
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1])),
|
|
60
|
+
};
|
|
61
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest, [
|
|
62
|
+
'id1',
|
|
63
|
+
'id2',
|
|
64
|
+
]);
|
|
65
|
+
expect(tx.inputNoteIds).toEqual(['id1', 'id2']);
|
|
66
|
+
});
|
|
67
|
+
it('converts importNotes from Uint8Array[] to base64 strings', () => {
|
|
68
|
+
const mockRequest = {
|
|
69
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1])),
|
|
70
|
+
};
|
|
71
|
+
const noteBytes = [new Uint8Array([4, 5]), new Uint8Array([6, 7])];
|
|
72
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest, ['id1'], noteBytes);
|
|
73
|
+
expect(tx.importNotes).toEqual([
|
|
74
|
+
u8ToB64(noteBytes[0]),
|
|
75
|
+
u8ToB64(noteBytes[1]),
|
|
76
|
+
]);
|
|
77
|
+
});
|
|
78
|
+
it('leaves optional fields undefined when not provided', () => {
|
|
79
|
+
const mockRequest = {
|
|
80
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1])),
|
|
81
|
+
};
|
|
82
|
+
const tx = new CustomTransaction('addr', 'recipient', mockRequest);
|
|
83
|
+
expect(tx.inputNoteIds).toBeUndefined();
|
|
84
|
+
expect(tx.importNotes).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('Transaction factory', () => {
|
|
88
|
+
it('createSendTransaction returns correct type and payload', () => {
|
|
89
|
+
const tx = Transaction.createSendTransaction('sender', 'recipient', 'faucet', 'public', 100);
|
|
90
|
+
expect(tx.type).toBe(TransactionType.Send);
|
|
91
|
+
expect(tx.payload).toBeInstanceOf(SendTransaction);
|
|
92
|
+
const payload = tx.payload;
|
|
93
|
+
expect(payload.senderAddress).toBe('sender');
|
|
94
|
+
expect(payload.amount).toBe(100);
|
|
95
|
+
});
|
|
96
|
+
it('createConsumeTransaction returns correct type and payload', () => {
|
|
97
|
+
const tx = Transaction.createConsumeTransaction('faucet', 'note-id', 'private', 200);
|
|
98
|
+
expect(tx.type).toBe(TransactionType.Consume);
|
|
99
|
+
expect(tx.payload).toBeInstanceOf(ConsumeTransaction);
|
|
100
|
+
const payload = tx.payload;
|
|
101
|
+
expect(payload.faucetId).toBe('faucet');
|
|
102
|
+
expect(payload.noteId).toBe('note-id');
|
|
103
|
+
});
|
|
104
|
+
it('createCustomTransaction returns correct type and payload', () => {
|
|
105
|
+
const mockRequest = {
|
|
106
|
+
serialize: vi.fn().mockReturnValue(new Uint8Array([1, 2])),
|
|
107
|
+
};
|
|
108
|
+
const tx = Transaction.createCustomTransaction('addr', 'recipient', mockRequest);
|
|
109
|
+
expect(tx.type).toBe(TransactionType.Custom);
|
|
110
|
+
expect(tx.payload).toBeInstanceOf(CustomTransaction);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=transaction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.test.js","sourceRoot":"","sources":["../../__tests__/transaction.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,EAAE,GAAG,IAAI,eAAe,CAC5B,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,IAAI,CACL,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,EAAE,GAAG,IAAI,eAAe,CAC5B,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,EACH,EAAE,CACH,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC;SACvC,CAAC;QAET,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,CAAC;QACT,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE;YACjE,KAAK;YACL,KAAK;SACN,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,CAAC;QACT,MAAM,SAAS,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAC9B,MAAM,EACN,WAAW,EACX,WAAW,EACX,CAAC,KAAK,CAAC,EACP,SAAS,CACV,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;YAC7B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACrB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,CAAC;QACT,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,GAAG,WAAW,CAAC,qBAAqB,CAC1C,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,GAAG,CACJ,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,EAAE,CAAC,OAA0B,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,GAAG,WAAW,CAAC,wBAAwB,CAC7C,QAAQ,EACR,SAAS,EACT,SAAS,EACT,GAAG,CACJ,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,EAAE,CAAC,OAA6B,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,WAAW,GAAG;YAClB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACpD,CAAC;QACT,MAAM,EAAE,GAAG,WAAW,CAAC,uBAAuB,CAC5C,MAAM,EACN,WAAW,EACX,WAAW,CACZ,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/signer.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { NoteFilterTypes } from '@miden-sdk/miden-sdk';
|
|
|
2
2
|
import type { WalletAdapter, WalletAdapterProps } from './adapter';
|
|
3
3
|
import { BaseWalletAdapter } from './adapter';
|
|
4
4
|
import { MidenConsumeTransaction, MidenSendTransaction, MidenTransaction } from './transaction';
|
|
5
|
-
import { Asset, InputNoteDetails, SignKind, TransactionOutput } from './types';
|
|
5
|
+
import { Asset, CreateAccountParams, InputNoteDetails, SignKind, TransactionOutput } from './types';
|
|
6
6
|
export type Adapter = WalletAdapter | SignerWalletAdapter | MessageSignerWalletAdapter;
|
|
7
7
|
export interface SignerWalletAdapterProps<Name extends string = string> extends WalletAdapterProps<Name> {
|
|
8
8
|
}
|
|
@@ -19,6 +19,7 @@ export interface MessageSignerWalletAdapterProps<Name extends string = string> e
|
|
|
19
19
|
waitForTransaction(txId: string, timeout?: number): Promise<TransactionOutput>;
|
|
20
20
|
requestSend(transaction: MidenSendTransaction): Promise<string>;
|
|
21
21
|
requestConsume(transaction: MidenConsumeTransaction): Promise<string>;
|
|
22
|
+
createAccount(params?: CreateAccountParams): Promise<string>;
|
|
22
23
|
}
|
|
23
24
|
export type MessageSignerWalletAdapter<Name extends string = string> = WalletAdapter<Name> & MessageSignerWalletAdapterProps<Name>;
|
|
24
25
|
export declare abstract class BaseMessageSignerWalletAdapter<Name extends string = string> extends BaseSignerWalletAdapter<Name> implements MessageSignerWalletAdapter<Name> {
|
|
@@ -31,4 +32,5 @@ export declare abstract class BaseMessageSignerWalletAdapter<Name extends string
|
|
|
31
32
|
abstract importPrivateNote(note: Uint8Array): Promise<string>;
|
|
32
33
|
abstract requestConsumableNotes(): Promise<InputNoteDetails[]>;
|
|
33
34
|
abstract waitForTransaction(txId: string, timeout?: number): Promise<TransactionOutput>;
|
|
35
|
+
abstract createAccount(params?: CreateAccountParams): Promise<string>;
|
|
34
36
|
}
|
package/dist/signer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAmB9C,MAAM,OAAgB,uBACpB,SAAQ,iBAAuB;CACQ;
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAmB9C,MAAM,OAAgB,uBACpB,SAAQ,iBAAuB;CACQ;AAyBzC,MAAM,OAAgB,8BAGpB,SAAQ,uBAA6B;CAqBtC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -45,3 +45,10 @@ export interface WalletTransactionSuccessOutput {
|
|
|
45
45
|
outputNotes: string[];
|
|
46
46
|
}
|
|
47
47
|
export type WalletTransactionOutput = WalletTransactionSuccessOutput | IFailedTransactionOutput;
|
|
48
|
+
export type CreateAccountType = 'RegularAccountImmutableCode' | 'RegularAccountUpdatableCode';
|
|
49
|
+
export type CreateAccountStorageMode = 'private' | 'public' | 'network';
|
|
50
|
+
export interface CreateAccountParams {
|
|
51
|
+
accountType?: CreateAccountType;
|
|
52
|
+
storageMode?: CreateAccountStorageMode;
|
|
53
|
+
customComponents?: Uint8Array[];
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE;QACJ,WAAW,EAAE,OAAO;QACpB,OAAO,EAAE,IAAI;KACd;CACF,CAAC,CAAC"}
|
package/docs/README.md
CHANGED
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
## Interfaces
|
|
54
54
|
|
|
55
55
|
- [Asset](interfaces/Asset.md)
|
|
56
|
+
- [CreateAccountParams](interfaces/CreateAccountParams.md)
|
|
56
57
|
- [IFailedTransactionOutput](interfaces/IFailedTransactionOutput.md)
|
|
57
58
|
- [MessageSignerWalletAdapterProps](interfaces/MessageSignerWalletAdapterProps.md)
|
|
58
59
|
- [MidenConsumeTransaction](interfaces/MidenConsumeTransaction.md)
|
|
@@ -68,6 +69,8 @@
|
|
|
68
69
|
## Type Aliases
|
|
69
70
|
|
|
70
71
|
- [Adapter](type-aliases/Adapter.md)
|
|
72
|
+
- [CreateAccountStorageMode](type-aliases/CreateAccountStorageMode.md)
|
|
73
|
+
- [CreateAccountType](type-aliases/CreateAccountType.md)
|
|
71
74
|
- [FungibleAssetDetails](type-aliases/FungibleAssetDetails.md)
|
|
72
75
|
- [InputNoteDetails](type-aliases/InputNoteDetails.md)
|
|
73
76
|
- [MessageSignerWalletAdapter](type-aliases/MessageSignerWalletAdapter.md)
|
|
@@ -251,6 +251,26 @@ Minimal `EventEmitter` interface that is molded against the Node.js
|
|
|
251
251
|
|
|
252
252
|
***
|
|
253
253
|
|
|
254
|
+
### createAccount()
|
|
255
|
+
|
|
256
|
+
> `abstract` **createAccount**(`params?`): `Promise`\<`string`\>
|
|
257
|
+
|
|
258
|
+
#### Parameters
|
|
259
|
+
|
|
260
|
+
##### params?
|
|
261
|
+
|
|
262
|
+
[`CreateAccountParams`](../interfaces/CreateAccountParams.md)
|
|
263
|
+
|
|
264
|
+
#### Returns
|
|
265
|
+
|
|
266
|
+
`Promise`\<`string`\>
|
|
267
|
+
|
|
268
|
+
#### Implementation of
|
|
269
|
+
|
|
270
|
+
`MessageSignerWalletAdapter.createAccount`
|
|
271
|
+
|
|
272
|
+
***
|
|
273
|
+
|
|
254
274
|
### disconnect()
|
|
255
275
|
|
|
256
276
|
> `abstract` **disconnect**(): `Promise`\<`void`\>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[**@miden-sdk/miden-wallet-adapter-base**](../README.md)
|
|
2
|
+
|
|
3
|
+
***
|
|
4
|
+
|
|
5
|
+
[@miden-sdk/miden-wallet-adapter-base](../README.md) / CreateAccountParams
|
|
6
|
+
|
|
7
|
+
# Interface: CreateAccountParams
|
|
8
|
+
|
|
9
|
+
## Properties
|
|
10
|
+
|
|
11
|
+
### accountType?
|
|
12
|
+
|
|
13
|
+
> `optional` **accountType**: [`CreateAccountType`](../type-aliases/CreateAccountType.md)
|
|
14
|
+
|
|
15
|
+
***
|
|
16
|
+
|
|
17
|
+
### customComponents?
|
|
18
|
+
|
|
19
|
+
> `optional` **customComponents**: `Uint8Array`\<`ArrayBufferLike`\>[]
|
|
20
|
+
|
|
21
|
+
***
|
|
22
|
+
|
|
23
|
+
### storageMode?
|
|
24
|
+
|
|
25
|
+
> `optional` **storageMode**: [`CreateAccountStorageMode`](../type-aliases/CreateAccountStorageMode.md)
|
|
@@ -136,6 +136,22 @@
|
|
|
136
136
|
|
|
137
137
|
***
|
|
138
138
|
|
|
139
|
+
### createAccount()
|
|
140
|
+
|
|
141
|
+
> **createAccount**(`params?`): `Promise`\<`string`\>
|
|
142
|
+
|
|
143
|
+
#### Parameters
|
|
144
|
+
|
|
145
|
+
##### params?
|
|
146
|
+
|
|
147
|
+
[`CreateAccountParams`](CreateAccountParams.md)
|
|
148
|
+
|
|
149
|
+
#### Returns
|
|
150
|
+
|
|
151
|
+
`Promise`\<`string`\>
|
|
152
|
+
|
|
153
|
+
***
|
|
154
|
+
|
|
139
155
|
### disconnect()
|
|
140
156
|
|
|
141
157
|
> **disconnect**(): `Promise`\<`void`\>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
[**@miden-sdk/miden-wallet-adapter-base**](../README.md)
|
|
2
|
+
|
|
3
|
+
***
|
|
4
|
+
|
|
5
|
+
[@miden-sdk/miden-wallet-adapter-base](../README.md) / CreateAccountStorageMode
|
|
6
|
+
|
|
7
|
+
# Type Alias: CreateAccountStorageMode
|
|
8
|
+
|
|
9
|
+
> **CreateAccountStorageMode** = `"private"` \| `"public"` \| `"network"`
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
[**@miden-sdk/miden-wallet-adapter-base**](../README.md)
|
|
2
|
+
|
|
3
|
+
***
|
|
4
|
+
|
|
5
|
+
[@miden-sdk/miden-wallet-adapter-base](../README.md) / CreateAccountType
|
|
6
|
+
|
|
7
|
+
# Type Alias: CreateAccountType
|
|
8
|
+
|
|
9
|
+
> **CreateAccountType** = `"RegularAccountImmutableCode"` \| `"RegularAccountUpdatableCode"`
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miden-sdk/miden-wallet-adapter-base",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.3",
|
|
4
4
|
"description": "Core infrastructure for connecting Miden-compatible wallets to your dApp.",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc",
|
|
9
9
|
"clean": "rimraf dist/ node_modules/",
|
|
10
|
-
"doc": "typedoc --disableSources --tsconfig ./tsconfig.json --plugin typedoc-plugin-markdown --entryPoints index.ts"
|
|
10
|
+
"doc": "typedoc --disableSources --tsconfig ./tsconfig.json --plugin typedoc-plugin-markdown --entryPoints index.ts",
|
|
11
|
+
"test": "vitest run"
|
|
11
12
|
},
|
|
12
13
|
"repository": {
|
|
13
14
|
"type": "git",
|
|
@@ -17,5 +18,9 @@
|
|
|
17
18
|
"license": "MIT",
|
|
18
19
|
"dependencies": {
|
|
19
20
|
"eventemitter3": "^5.0.1"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"jsdom": "^24.0.0",
|
|
24
|
+
"vitest": "^1.0.0"
|
|
20
25
|
}
|
|
21
26
|
}
|
package/signer.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
MidenSendTransaction,
|
|
7
7
|
MidenTransaction,
|
|
8
8
|
} from './transaction';
|
|
9
|
-
import { Asset, InputNoteDetails, SignKind, TransactionOutput } from './types';
|
|
9
|
+
import { Asset, CreateAccountParams, InputNoteDetails, SignKind, TransactionOutput } from './types';
|
|
10
10
|
|
|
11
11
|
export type Adapter =
|
|
12
12
|
| WalletAdapter
|
|
@@ -40,6 +40,7 @@ export interface MessageSignerWalletAdapterProps<Name extends string = string>
|
|
|
40
40
|
): Promise<TransactionOutput>;
|
|
41
41
|
requestSend(transaction: MidenSendTransaction): Promise<string>;
|
|
42
42
|
requestConsume(transaction: MidenConsumeTransaction): Promise<string>;
|
|
43
|
+
createAccount(params?: CreateAccountParams): Promise<string>;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
export type MessageSignerWalletAdapter<Name extends string = string> =
|
|
@@ -68,4 +69,5 @@ export abstract class BaseMessageSignerWalletAdapter<
|
|
|
68
69
|
txId: string,
|
|
69
70
|
timeout?: number
|
|
70
71
|
): Promise<TransactionOutput>;
|
|
72
|
+
abstract createAccount(params?: CreateAccountParams): Promise<string>;
|
|
71
73
|
}
|
package/types.ts
CHANGED
|
@@ -66,3 +66,15 @@ export interface WalletTransactionSuccessOutput {
|
|
|
66
66
|
export type WalletTransactionOutput =
|
|
67
67
|
| WalletTransactionSuccessOutput
|
|
68
68
|
| IFailedTransactionOutput;
|
|
69
|
+
|
|
70
|
+
export type CreateAccountType =
|
|
71
|
+
| 'RegularAccountImmutableCode'
|
|
72
|
+
| 'RegularAccountUpdatableCode';
|
|
73
|
+
|
|
74
|
+
export type CreateAccountStorageMode = 'private' | 'public' | 'network';
|
|
75
|
+
|
|
76
|
+
export interface CreateAccountParams {
|
|
77
|
+
accountType?: CreateAccountType;
|
|
78
|
+
storageMode?: CreateAccountStorageMode;
|
|
79
|
+
customComponents?: Uint8Array[];
|
|
80
|
+
}
|