@0xsequence/wallet-wdk 0.0.0-20250520201059
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/.env.test +3 -0
- package/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +11 -0
- package/LICENSE +202 -0
- package/dist/dbs/auth-commitments.d.ts +17 -0
- package/dist/dbs/auth-commitments.d.ts.map +1 -0
- package/dist/dbs/auth-commitments.js +13 -0
- package/dist/dbs/auth-keys.d.ts +19 -0
- package/dist/dbs/auth-keys.d.ts.map +1 -0
- package/dist/dbs/auth-keys.js +67 -0
- package/dist/dbs/generic.d.ts +33 -0
- package/dist/dbs/generic.d.ts.map +1 -0
- package/dist/dbs/generic.js +170 -0
- package/dist/dbs/index.d.ts +12 -0
- package/dist/dbs/index.d.ts.map +1 -0
- package/dist/dbs/index.js +8 -0
- package/dist/dbs/messages.d.ts +6 -0
- package/dist/dbs/messages.d.ts.map +1 -0
- package/dist/dbs/messages.js +13 -0
- package/dist/dbs/recovery.d.ts +6 -0
- package/dist/dbs/recovery.d.ts.map +1 -0
- package/dist/dbs/recovery.js +13 -0
- package/dist/dbs/signatures.d.ts +6 -0
- package/dist/dbs/signatures.d.ts.map +1 -0
- package/dist/dbs/signatures.js +13 -0
- package/dist/dbs/transactions.d.ts +6 -0
- package/dist/dbs/transactions.d.ts.map +1 -0
- package/dist/dbs/transactions.js +13 -0
- package/dist/dbs/wallets.d.ts +6 -0
- package/dist/dbs/wallets.d.ts.map +1 -0
- package/dist/dbs/wallets.js +13 -0
- package/dist/identity/signer.d.ts +17 -0
- package/dist/identity/signer.d.ts.map +1 -0
- package/dist/identity/signer.js +58 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/sequence/cron.d.ts +19 -0
- package/dist/sequence/cron.d.ts.map +1 -0
- package/dist/sequence/cron.js +118 -0
- package/dist/sequence/devices.d.ts +14 -0
- package/dist/sequence/devices.d.ts.map +1 -0
- package/dist/sequence/devices.js +43 -0
- package/dist/sequence/handlers/authcode-pkce.d.ts +14 -0
- package/dist/sequence/handlers/authcode-pkce.d.ts.map +1 -0
- package/dist/sequence/handlers/authcode-pkce.js +48 -0
- package/dist/sequence/handlers/authcode.d.ts +25 -0
- package/dist/sequence/handlers/authcode.d.ts.map +1 -0
- package/dist/sequence/handlers/authcode.js +91 -0
- package/dist/sequence/handlers/devices.d.ts +14 -0
- package/dist/sequence/handlers/devices.d.ts.map +1 -0
- package/dist/sequence/handlers/devices.js +39 -0
- package/dist/sequence/handlers/handler.d.ts +8 -0
- package/dist/sequence/handlers/handler.d.ts.map +1 -0
- package/dist/sequence/handlers/handler.js +1 -0
- package/dist/sequence/handlers/identity.d.ts +21 -0
- package/dist/sequence/handlers/identity.d.ts.map +1 -0
- package/dist/sequence/handlers/identity.js +86 -0
- package/dist/sequence/handlers/index.d.ts +7 -0
- package/dist/sequence/handlers/index.d.ts.map +1 -0
- package/dist/sequence/handlers/index.js +5 -0
- package/dist/sequence/handlers/mnemonic.d.ts +19 -0
- package/dist/sequence/handlers/mnemonic.d.ts.map +1 -0
- package/dist/sequence/handlers/mnemonic.js +67 -0
- package/dist/sequence/handlers/otp.d.ts +20 -0
- package/dist/sequence/handlers/otp.d.ts.map +1 -0
- package/dist/sequence/handlers/otp.js +83 -0
- package/dist/sequence/handlers/passkeys.d.ts +17 -0
- package/dist/sequence/handlers/passkeys.d.ts.map +1 -0
- package/dist/sequence/handlers/passkeys.js +63 -0
- package/dist/sequence/handlers/recovery.d.ts +15 -0
- package/dist/sequence/handlers/recovery.d.ts.map +1 -0
- package/dist/sequence/handlers/recovery.js +72 -0
- package/dist/sequence/index.d.ts +12 -0
- package/dist/sequence/index.d.ts.map +1 -0
- package/dist/sequence/index.js +9 -0
- package/dist/sequence/logger.d.ts +7 -0
- package/dist/sequence/logger.d.ts.map +1 -0
- package/dist/sequence/logger.js +11 -0
- package/dist/sequence/manager.d.ts +287 -0
- package/dist/sequence/manager.d.ts.map +1 -0
- package/dist/sequence/manager.js +356 -0
- package/dist/sequence/messages.d.ts +18 -0
- package/dist/sequence/messages.d.ts.map +1 -0
- package/dist/sequence/messages.js +115 -0
- package/dist/sequence/recovery.d.ts +30 -0
- package/dist/sequence/recovery.d.ts.map +1 -0
- package/dist/sequence/recovery.js +314 -0
- package/dist/sequence/sessions.d.ts +26 -0
- package/dist/sequence/sessions.d.ts.map +1 -0
- package/dist/sequence/sessions.js +169 -0
- package/dist/sequence/signatures.d.ts +21 -0
- package/dist/sequence/signatures.d.ts.map +1 -0
- package/dist/sequence/signatures.js +192 -0
- package/dist/sequence/signers.d.ts +14 -0
- package/dist/sequence/signers.d.ts.map +1 -0
- package/dist/sequence/signers.js +74 -0
- package/dist/sequence/transactions.d.ts +26 -0
- package/dist/sequence/transactions.d.ts.map +1 -0
- package/dist/sequence/transactions.js +201 -0
- package/dist/sequence/types/index.d.ts +9 -0
- package/dist/sequence/types/index.d.ts.map +1 -0
- package/dist/sequence/types/index.js +2 -0
- package/dist/sequence/types/message-request.d.ts +23 -0
- package/dist/sequence/types/message-request.d.ts.map +1 -0
- package/dist/sequence/types/message-request.js +1 -0
- package/dist/sequence/types/recovery.d.ts +15 -0
- package/dist/sequence/types/recovery.d.ts.map +1 -0
- package/dist/sequence/types/recovery.js +1 -0
- package/dist/sequence/types/signature-request.d.ts +76 -0
- package/dist/sequence/types/signature-request.d.ts.map +1 -0
- package/dist/sequence/types/signature-request.js +11 -0
- package/dist/sequence/types/signer.d.ts +28 -0
- package/dist/sequence/types/signer.d.ts.map +1 -0
- package/dist/sequence/types/signer.js +10 -0
- package/dist/sequence/types/transaction-request.d.ts +41 -0
- package/dist/sequence/types/transaction-request.d.ts.map +1 -0
- package/dist/sequence/types/transaction-request.js +1 -0
- package/dist/sequence/types/wallet.d.ts +21 -0
- package/dist/sequence/types/wallet.d.ts.map +1 -0
- package/dist/sequence/types/wallet.js +1 -0
- package/dist/sequence/wallets.d.ts +121 -0
- package/dist/sequence/wallets.d.ts.map +1 -0
- package/dist/sequence/wallets.js +632 -0
- package/package.json +40 -0
- package/src/dbs/auth-commitments.ts +26 -0
- package/src/dbs/auth-keys.ts +85 -0
- package/src/dbs/generic.ts +194 -0
- package/src/dbs/index.ts +13 -0
- package/src/dbs/messages.ts +16 -0
- package/src/dbs/recovery.ts +15 -0
- package/src/dbs/signatures.ts +15 -0
- package/src/dbs/transactions.ts +16 -0
- package/src/dbs/wallets.ts +16 -0
- package/src/identity/signer.ts +78 -0
- package/src/index.ts +2 -0
- package/src/sequence/cron.ts +134 -0
- package/src/sequence/devices.ts +53 -0
- package/src/sequence/handlers/authcode-pkce.ts +70 -0
- package/src/sequence/handlers/authcode.ts +116 -0
- package/src/sequence/handlers/devices.ts +53 -0
- package/src/sequence/handlers/handler.ts +14 -0
- package/src/sequence/handlers/identity.ts +101 -0
- package/src/sequence/handlers/index.ts +6 -0
- package/src/sequence/handlers/mnemonic.ts +88 -0
- package/src/sequence/handlers/otp.ts +107 -0
- package/src/sequence/handlers/passkeys.ts +84 -0
- package/src/sequence/handlers/recovery.ts +88 -0
- package/src/sequence/index.ts +25 -0
- package/src/sequence/logger.ts +11 -0
- package/src/sequence/manager.ts +634 -0
- package/src/sequence/messages.ts +146 -0
- package/src/sequence/recovery.ts +429 -0
- package/src/sequence/sessions.ts +238 -0
- package/src/sequence/signatures.ts +263 -0
- package/src/sequence/signers.ts +88 -0
- package/src/sequence/transactions.ts +281 -0
- package/src/sequence/types/index.ts +27 -0
- package/src/sequence/types/message-request.ts +26 -0
- package/src/sequence/types/recovery.ts +15 -0
- package/src/sequence/types/signature-request.ts +89 -0
- package/src/sequence/types/signer.ts +32 -0
- package/src/sequence/types/transaction-request.ts +47 -0
- package/src/sequence/types/wallet.ts +24 -0
- package/src/sequence/wallets.ts +853 -0
- package/test/constants.ts +62 -0
- package/test/recovery.test.ts +211 -0
- package/test/sessions.test.ts +324 -0
- package/test/setup.ts +63 -0
- package/test/transactions.test.ts +464 -0
- package/test/wallets.test.ts +381 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +11 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from 'vitest'
|
|
2
|
+
import { Manager, SignerActionable, SignerReady } from '../src/sequence'
|
|
3
|
+
import { Mnemonic } from 'ox'
|
|
4
|
+
import { newManager } from './constants'
|
|
5
|
+
|
|
6
|
+
describe('Wallets', () => {
|
|
7
|
+
let manager: Manager | undefined
|
|
8
|
+
|
|
9
|
+
afterEach(async () => {
|
|
10
|
+
await manager?.stop()
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('Should create a new wallet using a mnemonic', async () => {
|
|
14
|
+
manager = newManager()
|
|
15
|
+
const wallet = await manager.signUp({ mnemonic: Mnemonic.random(Mnemonic.english), kind: 'mnemonic' })
|
|
16
|
+
expect(wallet).toBeDefined()
|
|
17
|
+
await expect(manager.hasWallet(wallet!)).resolves.toBeTruthy()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('Should logout from a wallet using the login key', async () => {
|
|
21
|
+
const manager = newManager()
|
|
22
|
+
const loginMnemonic = Mnemonic.random(Mnemonic.english)
|
|
23
|
+
const wallet = await manager.signUp({ mnemonic: loginMnemonic, kind: 'mnemonic', noGuard: true })
|
|
24
|
+
expect(wallet).toBeDefined()
|
|
25
|
+
|
|
26
|
+
const wallets = await manager.listWallets()
|
|
27
|
+
expect(wallets.length).toBe(1)
|
|
28
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
29
|
+
|
|
30
|
+
const requestId = await manager.logout(wallet!)
|
|
31
|
+
expect(requestId).toBeDefined()
|
|
32
|
+
|
|
33
|
+
let signRequests = 0
|
|
34
|
+
const unregistedUI = manager.registerMnemonicUI(async (respond) => {
|
|
35
|
+
signRequests++
|
|
36
|
+
await respond(loginMnemonic)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const request = await manager.getSignatureRequest(requestId)
|
|
40
|
+
expect(request).toBeDefined()
|
|
41
|
+
expect(request.action).toBe('logout')
|
|
42
|
+
|
|
43
|
+
const loginSigner = request.signers.find((signer) => signer.handler?.kind === 'login-mnemonic')
|
|
44
|
+
expect(loginSigner).toBeDefined()
|
|
45
|
+
expect(loginSigner?.status).toBe('actionable')
|
|
46
|
+
|
|
47
|
+
const result = await (loginSigner as SignerActionable).handle()
|
|
48
|
+
expect(result).toBe(true)
|
|
49
|
+
|
|
50
|
+
expect(signRequests).toBe(1)
|
|
51
|
+
unregistedUI()
|
|
52
|
+
|
|
53
|
+
await manager.completeLogout(requestId)
|
|
54
|
+
expect((await manager.getSignatureRequest(requestId))?.status).toBe('completed')
|
|
55
|
+
const wallets2 = await manager.listWallets()
|
|
56
|
+
expect(wallets2.length).toBe(0)
|
|
57
|
+
await expect(manager.hasWallet(wallet!)).resolves.toBeFalsy()
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('Should logout from a wallet using the device key', async () => {
|
|
61
|
+
const manager = newManager()
|
|
62
|
+
const loginMnemonic = Mnemonic.random(Mnemonic.english)
|
|
63
|
+
const wallet = await manager.signUp({ mnemonic: loginMnemonic, kind: 'mnemonic', noGuard: true })
|
|
64
|
+
expect(wallet).toBeDefined()
|
|
65
|
+
|
|
66
|
+
const wallets = await manager.listWallets()
|
|
67
|
+
expect(wallets.length).toBe(1)
|
|
68
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
69
|
+
expect(wallets[0].status).toBe('ready')
|
|
70
|
+
|
|
71
|
+
const requestId = await manager.logout(wallet!)
|
|
72
|
+
expect(requestId).toBeDefined()
|
|
73
|
+
|
|
74
|
+
const wallets2 = await manager.listWallets()
|
|
75
|
+
expect(wallets2.length).toBe(1)
|
|
76
|
+
expect(wallets2[0].address).toBe(wallet!)
|
|
77
|
+
expect(wallets2[0].status).toBe('logging-out')
|
|
78
|
+
|
|
79
|
+
const request = await manager.getSignatureRequest(requestId)
|
|
80
|
+
expect(request).toBeDefined()
|
|
81
|
+
expect(request.action).toBe('logout')
|
|
82
|
+
|
|
83
|
+
const deviceSigner = request.signers.find((signer) => signer.handler?.kind === 'local-device')
|
|
84
|
+
expect(deviceSigner).toBeDefined()
|
|
85
|
+
expect(deviceSigner?.status).toBe('ready')
|
|
86
|
+
|
|
87
|
+
const result = await (deviceSigner as SignerReady).handle()
|
|
88
|
+
expect(result).toBe(true)
|
|
89
|
+
|
|
90
|
+
await manager.completeLogout(requestId)
|
|
91
|
+
expect((await manager.getSignatureRequest(requestId))?.status).toBe('completed')
|
|
92
|
+
const wallets3 = await manager.listWallets()
|
|
93
|
+
expect(wallets3.length).toBe(0)
|
|
94
|
+
await expect(manager.hasWallet(wallet!)).resolves.toBeFalsy()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('Should login to an existing wallet using the mnemonic signer', async () => {
|
|
98
|
+
manager = newManager()
|
|
99
|
+
const mnemonic = Mnemonic.random(Mnemonic.english)
|
|
100
|
+
const wallet = await manager.signUp({ mnemonic, kind: 'mnemonic', noGuard: true })
|
|
101
|
+
expect(wallet).toBeDefined()
|
|
102
|
+
|
|
103
|
+
// Clear the storage without logging out
|
|
104
|
+
await manager.stop()
|
|
105
|
+
|
|
106
|
+
manager = newManager(undefined, undefined, 'device-2')
|
|
107
|
+
await expect(manager.listWallets()).resolves.toEqual([])
|
|
108
|
+
const requestId1 = await manager.login({ wallet: wallet! })
|
|
109
|
+
expect(requestId1).toBeDefined()
|
|
110
|
+
|
|
111
|
+
const wallets = await manager.listWallets()
|
|
112
|
+
expect(wallets.length).toBe(1)
|
|
113
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
114
|
+
expect(wallets[0].status).toBe('logging-in')
|
|
115
|
+
|
|
116
|
+
let signRequests = 0
|
|
117
|
+
const unregistedUI = manager.registerMnemonicUI(async (respond) => {
|
|
118
|
+
signRequests++
|
|
119
|
+
await respond(mnemonic)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
const request = await manager.getSignatureRequest(requestId1!)
|
|
123
|
+
expect(request).toBeDefined()
|
|
124
|
+
expect(request.action).toBe('login')
|
|
125
|
+
|
|
126
|
+
const mnemonicSigner = request.signers.find((signer) => signer.handler?.kind === 'login-mnemonic')
|
|
127
|
+
expect(mnemonicSigner).toBeDefined()
|
|
128
|
+
expect(mnemonicSigner?.status).toBe('actionable')
|
|
129
|
+
|
|
130
|
+
const result = await (mnemonicSigner as SignerActionable).handle()
|
|
131
|
+
expect(result).toBe(true)
|
|
132
|
+
|
|
133
|
+
expect(signRequests).toBe(1)
|
|
134
|
+
unregistedUI()
|
|
135
|
+
|
|
136
|
+
// Complete the login process
|
|
137
|
+
await manager.completeLogin(requestId1!)
|
|
138
|
+
expect((await manager.getSignatureRequest(requestId1!))?.status).toBe('completed')
|
|
139
|
+
const wallets2 = await manager.listWallets()
|
|
140
|
+
expect(wallets2.length).toBe(1)
|
|
141
|
+
expect(wallets2[0].address).toBe(wallet!)
|
|
142
|
+
expect(wallets2[0].status).toBe('ready')
|
|
143
|
+
|
|
144
|
+
// The wallet should have 2 device keys and 2 recovery keys
|
|
145
|
+
const config = await manager.getConfiguration(wallet!)
|
|
146
|
+
expect(config.devices.length).toBe(2)
|
|
147
|
+
const recovery = await manager.getRecoverySigners(wallet!)
|
|
148
|
+
expect(recovery?.length).toBe(2)
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it('Should logout and then login to an existing wallet using the mnemonic signer', async () => {
|
|
152
|
+
manager = newManager()
|
|
153
|
+
|
|
154
|
+
await expect(manager.listWallets()).resolves.toEqual([])
|
|
155
|
+
|
|
156
|
+
const mnemonic = Mnemonic.random(Mnemonic.english)
|
|
157
|
+
const wallet = await manager.signUp({ mnemonic, kind: 'mnemonic', noGuard: true })
|
|
158
|
+
expect(wallet).toBeDefined()
|
|
159
|
+
|
|
160
|
+
const wallets = await manager.listWallets()
|
|
161
|
+
expect(wallets.length).toBe(1)
|
|
162
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
163
|
+
|
|
164
|
+
const requestId = await manager.logout(wallet!)
|
|
165
|
+
expect(requestId).toBeDefined()
|
|
166
|
+
|
|
167
|
+
const request = await manager.getSignatureRequest(requestId)
|
|
168
|
+
expect(request).toBeDefined()
|
|
169
|
+
expect(request.action).toBe('logout')
|
|
170
|
+
|
|
171
|
+
const deviceSigner = request.signers.find((signer) => signer.handler?.kind === 'local-device')
|
|
172
|
+
expect(deviceSigner).toBeDefined()
|
|
173
|
+
expect(deviceSigner?.status).toBe('ready')
|
|
174
|
+
|
|
175
|
+
const result = await (deviceSigner as SignerReady).handle()
|
|
176
|
+
expect(result).toBe(true)
|
|
177
|
+
|
|
178
|
+
await manager.completeLogout(requestId)
|
|
179
|
+
expect((await manager.getSignatureRequest(requestId))?.status).toBe('completed')
|
|
180
|
+
|
|
181
|
+
await expect(manager.listWallets()).resolves.toEqual([])
|
|
182
|
+
|
|
183
|
+
// Login again to the same wallet
|
|
184
|
+
const requestId2 = await manager.login({ wallet: wallet! })
|
|
185
|
+
expect(requestId2).toBeDefined()
|
|
186
|
+
|
|
187
|
+
let signRequests2 = 0
|
|
188
|
+
const unregistedUI2 = manager.registerMnemonicUI(async (respond) => {
|
|
189
|
+
signRequests2++
|
|
190
|
+
await respond(mnemonic)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
const request2 = await manager.getSignatureRequest(requestId2!)
|
|
194
|
+
expect(request2).toBeDefined()
|
|
195
|
+
expect(request2.action).toBe('login')
|
|
196
|
+
|
|
197
|
+
const mnemonicSigner2 = request2.signers.find((signer) => signer.handler?.kind === 'login-mnemonic')
|
|
198
|
+
expect(mnemonicSigner2).toBeDefined()
|
|
199
|
+
expect(mnemonicSigner2?.status).toBe('actionable')
|
|
200
|
+
|
|
201
|
+
const result2 = await (mnemonicSigner2 as SignerActionable).handle()
|
|
202
|
+
expect(result2).toBe(true)
|
|
203
|
+
|
|
204
|
+
expect(signRequests2).toBe(1)
|
|
205
|
+
unregistedUI2()
|
|
206
|
+
|
|
207
|
+
await manager.completeLogin(requestId2!)
|
|
208
|
+
expect((await manager.getSignatureRequest(requestId2!))?.status).toBe('completed')
|
|
209
|
+
const wallets3 = await manager.listWallets()
|
|
210
|
+
expect(wallets3.length).toBe(1)
|
|
211
|
+
expect(wallets3[0].address).toBe(wallet!)
|
|
212
|
+
|
|
213
|
+
// The wallet should have a single device key and a single recovery key
|
|
214
|
+
const config = await manager.getConfiguration(wallet!)
|
|
215
|
+
expect(config.devices.length).toBe(1)
|
|
216
|
+
const recovery = await manager.getRecoverySigners(wallet!)
|
|
217
|
+
expect(recovery?.length).toBe(1)
|
|
218
|
+
|
|
219
|
+
// The kind of the device key should be 'local-device'
|
|
220
|
+
expect(config.devices[0].kind).toBe('local-device')
|
|
221
|
+
|
|
222
|
+
// The kind of the recovery key should be 'local-recovery'
|
|
223
|
+
expect(recovery?.[0].kind).toBe('local-device')
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
it('Should fail to logout from a non-existent wallet', async () => {
|
|
227
|
+
const manager = newManager()
|
|
228
|
+
const requestId = manager.logout('0x1234567890123456789012345678901234567890')
|
|
229
|
+
await expect(requestId).rejects.toThrow('wallet-not-found')
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('Should fail to login to an already logged in wallet', async () => {
|
|
233
|
+
const manager = newManager()
|
|
234
|
+
const wallet = await manager.signUp({
|
|
235
|
+
mnemonic: Mnemonic.random(Mnemonic.english),
|
|
236
|
+
kind: 'mnemonic',
|
|
237
|
+
noGuard: true,
|
|
238
|
+
})
|
|
239
|
+
expect(wallet).toBeDefined()
|
|
240
|
+
|
|
241
|
+
const requestId = manager.login({ wallet: wallet! })
|
|
242
|
+
await expect(requestId).rejects.toThrow('wallet-already-logged-in')
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
it('Should make you select among a single option if login with mnemonic', async () => {
|
|
246
|
+
const manager = newManager()
|
|
247
|
+
const mnemonic = Mnemonic.random(Mnemonic.english)
|
|
248
|
+
const wallet = await manager.signUp({ mnemonic, kind: 'mnemonic', noGuard: true })
|
|
249
|
+
expect(wallet).toBeDefined()
|
|
250
|
+
|
|
251
|
+
await manager.logout(wallet!, { skipRemoveDevice: true })
|
|
252
|
+
|
|
253
|
+
let signRequests = 0
|
|
254
|
+
const unregistedUI = manager.registerMnemonicUI(async (respond) => {
|
|
255
|
+
signRequests++
|
|
256
|
+
await respond(mnemonic)
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
let selectWalletCalls = 0
|
|
260
|
+
const requestId = await manager.login({
|
|
261
|
+
mnemonic: mnemonic,
|
|
262
|
+
kind: 'mnemonic',
|
|
263
|
+
selectWallet: async () => {
|
|
264
|
+
selectWalletCalls++
|
|
265
|
+
return wallet!
|
|
266
|
+
},
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
expect(selectWalletCalls).toBe(1)
|
|
270
|
+
expect(requestId).toBeDefined()
|
|
271
|
+
|
|
272
|
+
const wallets = await manager.listWallets()
|
|
273
|
+
expect(wallets.length).toBe(1)
|
|
274
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
275
|
+
expect(wallets[0].status).toBe('logging-in')
|
|
276
|
+
|
|
277
|
+
const request = await manager.getSignatureRequest(requestId!)
|
|
278
|
+
expect(request).toBeDefined()
|
|
279
|
+
expect(request.action).toBe('login')
|
|
280
|
+
|
|
281
|
+
const mnemonicSigner = request.signers.find((signer) => signer.handler?.kind === 'login-mnemonic')
|
|
282
|
+
expect(mnemonicSigner).toBeDefined()
|
|
283
|
+
expect(mnemonicSigner?.status).toBe('actionable')
|
|
284
|
+
|
|
285
|
+
const result = await (mnemonicSigner as SignerActionable).handle()
|
|
286
|
+
expect(result).toBe(true)
|
|
287
|
+
|
|
288
|
+
expect(signRequests).toBe(1)
|
|
289
|
+
unregistedUI()
|
|
290
|
+
|
|
291
|
+
await manager.completeLogin(requestId!)
|
|
292
|
+
expect((await manager.getSignatureRequest(requestId!))?.status).toBe('completed')
|
|
293
|
+
const wallets2 = await manager.listWallets()
|
|
294
|
+
expect(wallets2.length).toBe(1)
|
|
295
|
+
expect(wallets2[0].address).toBe(wallet!)
|
|
296
|
+
expect(wallets2[0].status).toBe('ready')
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
it('Should trigger an update when a wallet is logged in', async () => {
|
|
300
|
+
const manager = newManager()
|
|
301
|
+
|
|
302
|
+
let wallet: any | undefined
|
|
303
|
+
|
|
304
|
+
let callbackCalls = 0
|
|
305
|
+
let unregisterCallback: (() => void) | undefined
|
|
306
|
+
|
|
307
|
+
const callbackFiredPromise = new Promise<void>((resolve) => {
|
|
308
|
+
unregisterCallback = manager.onWalletsUpdate((wallets) => {
|
|
309
|
+
callbackCalls++
|
|
310
|
+
expect(wallets.length).toBe(1)
|
|
311
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
312
|
+
expect(wallets[0].status).toBe('ready')
|
|
313
|
+
resolve()
|
|
314
|
+
})
|
|
315
|
+
})
|
|
316
|
+
|
|
317
|
+
wallet = await manager.signUp({ mnemonic: Mnemonic.random(Mnemonic.english), kind: 'mnemonic', noGuard: true })
|
|
318
|
+
expect(wallet).toBeDefined()
|
|
319
|
+
|
|
320
|
+
await callbackFiredPromise
|
|
321
|
+
|
|
322
|
+
expect(callbackCalls).toBe(1)
|
|
323
|
+
unregisterCallback!()
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
it('Should trigger an update when a wallet is logged out', async () => {
|
|
327
|
+
const manager = newManager()
|
|
328
|
+
|
|
329
|
+
const wallet = await manager.signUp({
|
|
330
|
+
mnemonic: Mnemonic.random(Mnemonic.english),
|
|
331
|
+
kind: 'mnemonic',
|
|
332
|
+
noGuard: true,
|
|
333
|
+
})
|
|
334
|
+
expect(wallet).toBeDefined()
|
|
335
|
+
|
|
336
|
+
let callbackCalls = 0
|
|
337
|
+
let unregisterCallback: (() => void) | undefined
|
|
338
|
+
const callbackFiredPromise = new Promise<void>((resolve) => {
|
|
339
|
+
unregisterCallback = manager.onWalletsUpdate((wallets) => {
|
|
340
|
+
callbackCalls++
|
|
341
|
+
expect(wallets.length).toBe(0)
|
|
342
|
+
resolve()
|
|
343
|
+
})
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
await manager.logout(wallet!, { skipRemoveDevice: true })
|
|
347
|
+
await callbackFiredPromise
|
|
348
|
+
|
|
349
|
+
expect(callbackCalls).toBe(1)
|
|
350
|
+
unregisterCallback!()
|
|
351
|
+
})
|
|
352
|
+
|
|
353
|
+
it('Should trigger an update when a wallet is logging out', async () => {
|
|
354
|
+
const manager = newManager()
|
|
355
|
+
|
|
356
|
+
const wallet = await manager.signUp({
|
|
357
|
+
mnemonic: Mnemonic.random(Mnemonic.english),
|
|
358
|
+
kind: 'mnemonic',
|
|
359
|
+
noGuard: true,
|
|
360
|
+
})
|
|
361
|
+
expect(wallet).toBeDefined()
|
|
362
|
+
|
|
363
|
+
let callbackCalls = 0
|
|
364
|
+
let unregisterCallback: (() => void) | undefined
|
|
365
|
+
const callbackFiredPromise = new Promise<void>((resolve) => {
|
|
366
|
+
unregisterCallback = manager.onWalletsUpdate((wallets) => {
|
|
367
|
+
callbackCalls++
|
|
368
|
+
expect(wallets.length).toBe(1)
|
|
369
|
+
expect(wallets[0].address).toBe(wallet!)
|
|
370
|
+
expect(wallets[0].status).toBe('logging-out')
|
|
371
|
+
resolve()
|
|
372
|
+
})
|
|
373
|
+
})
|
|
374
|
+
|
|
375
|
+
await manager.logout(wallet!)
|
|
376
|
+
await callbackFiredPromise
|
|
377
|
+
|
|
378
|
+
expect(callbackCalls).toBe(1)
|
|
379
|
+
unregisterCallback!()
|
|
380
|
+
})
|
|
381
|
+
})
|
package/tsconfig.json
ADDED