@bsv/wallet-toolbox 1.1.24 → 1.1.25

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.
Files changed (194) hide show
  1. package/docs/client.md +2319 -84
  2. package/docs/wallet.md +2319 -84
  3. package/out/src/CWIStyleWalletManager.d.ts +411 -0
  4. package/out/src/CWIStyleWalletManager.d.ts.map +1 -0
  5. package/out/src/CWIStyleWalletManager.js +1131 -0
  6. package/out/src/CWIStyleWalletManager.js.map +1 -0
  7. package/out/src/SetupClient.d.ts +249 -0
  8. package/out/src/SetupClient.d.ts.map +1 -0
  9. package/out/src/SetupClient.js +252 -0
  10. package/out/src/SetupClient.js.map +1 -0
  11. package/out/src/SimpleWalletManager.d.ts +169 -0
  12. package/out/src/SimpleWalletManager.d.ts.map +1 -0
  13. package/out/src/SimpleWalletManager.js +315 -0
  14. package/out/src/SimpleWalletManager.js.map +1 -0
  15. package/out/src/Wallet.d.ts +6 -1
  16. package/out/src/Wallet.d.ts.map +1 -1
  17. package/out/src/Wallet.js +29 -2
  18. package/out/src/Wallet.js.map +1 -1
  19. package/out/src/WalletAuthenticationManager.d.ts +33 -0
  20. package/out/src/WalletAuthenticationManager.d.ts.map +1 -0
  21. package/out/src/WalletAuthenticationManager.js +107 -0
  22. package/out/src/WalletAuthenticationManager.js.map +1 -0
  23. package/out/src/WalletPermissionsManager.d.ts +575 -0
  24. package/out/src/WalletPermissionsManager.d.ts.map +1 -0
  25. package/out/src/WalletPermissionsManager.js +1807 -0
  26. package/out/src/WalletPermissionsManager.js.map +1 -0
  27. package/out/src/WalletSettingsManager.d.ts +59 -0
  28. package/out/src/WalletSettingsManager.d.ts.map +1 -0
  29. package/out/src/WalletSettingsManager.js +168 -0
  30. package/out/src/WalletSettingsManager.js.map +1 -0
  31. package/out/src/__tests/CWIStyleWalletManager.test.d.ts +2 -0
  32. package/out/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  33. package/out/src/__tests/CWIStyleWalletManager.test.js +472 -0
  34. package/out/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  35. package/out/src/__tests/WalletPermissionsManager.callbacks.test.d.ts +2 -0
  36. package/out/src/__tests/WalletPermissionsManager.callbacks.test.d.ts.map +1 -0
  37. package/out/src/__tests/WalletPermissionsManager.callbacks.test.js +239 -0
  38. package/out/src/__tests/WalletPermissionsManager.callbacks.test.js.map +1 -0
  39. package/out/src/__tests/WalletPermissionsManager.checks.test.d.ts +2 -0
  40. package/out/src/__tests/WalletPermissionsManager.checks.test.d.ts.map +1 -0
  41. package/out/src/__tests/WalletPermissionsManager.checks.test.js +644 -0
  42. package/out/src/__tests/WalletPermissionsManager.checks.test.js.map +1 -0
  43. package/out/src/__tests/WalletPermissionsManager.encryption.test.d.ts +2 -0
  44. package/out/src/__tests/WalletPermissionsManager.encryption.test.d.ts.map +1 -0
  45. package/out/src/__tests/WalletPermissionsManager.encryption.test.js +295 -0
  46. package/out/src/__tests/WalletPermissionsManager.encryption.test.js.map +1 -0
  47. package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts +82 -0
  48. package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts.map +1 -0
  49. package/out/src/__tests/WalletPermissionsManager.fixtures.js +260 -0
  50. package/out/src/__tests/WalletPermissionsManager.fixtures.js.map +1 -0
  51. package/out/src/__tests/WalletPermissionsManager.flows.test.d.ts +2 -0
  52. package/out/src/__tests/WalletPermissionsManager.flows.test.d.ts.map +1 -0
  53. package/out/src/__tests/WalletPermissionsManager.flows.test.js +389 -0
  54. package/out/src/__tests/WalletPermissionsManager.flows.test.js.map +1 -0
  55. package/out/src/__tests/WalletPermissionsManager.initialization.test.d.ts +2 -0
  56. package/out/src/__tests/WalletPermissionsManager.initialization.test.d.ts.map +1 -0
  57. package/out/src/__tests/WalletPermissionsManager.initialization.test.js +227 -0
  58. package/out/src/__tests/WalletPermissionsManager.initialization.test.js.map +1 -0
  59. package/out/src/__tests/WalletPermissionsManager.proxying.test.d.ts +2 -0
  60. package/out/src/__tests/WalletPermissionsManager.proxying.test.d.ts.map +1 -0
  61. package/out/src/__tests/WalletPermissionsManager.proxying.test.js +566 -0
  62. package/out/src/__tests/WalletPermissionsManager.proxying.test.js.map +1 -0
  63. package/out/src/__tests/WalletPermissionsManager.tokens.test.d.ts +2 -0
  64. package/out/src/__tests/WalletPermissionsManager.tokens.test.d.ts.map +1 -0
  65. package/out/src/__tests/WalletPermissionsManager.tokens.test.js +460 -0
  66. package/out/src/__tests/WalletPermissionsManager.tokens.test.js.map +1 -0
  67. package/out/src/index.all.d.ts +9 -0
  68. package/out/src/index.all.d.ts.map +1 -1
  69. package/out/src/index.all.js +9 -0
  70. package/out/src/index.all.js.map +1 -1
  71. package/out/src/index.client.d.ts +9 -0
  72. package/out/src/index.client.d.ts.map +1 -1
  73. package/out/src/index.client.js +9 -0
  74. package/out/src/index.client.js.map +1 -1
  75. package/out/src/utility/identityUtils.d.ts +31 -0
  76. package/out/src/utility/identityUtils.d.ts.map +1 -0
  77. package/out/src/utility/identityUtils.js +114 -0
  78. package/out/src/utility/identityUtils.js.map +1 -0
  79. package/out/src/wab-client/WABClient.d.ts +38 -0
  80. package/out/src/wab-client/WABClient.d.ts.map +1 -0
  81. package/out/src/wab-client/WABClient.js +95 -0
  82. package/out/src/wab-client/WABClient.js.map +1 -0
  83. package/out/src/wab-client/__tests/WABClient.test.d.ts +2 -0
  84. package/out/src/wab-client/__tests/WABClient.test.d.ts.map +1 -0
  85. package/out/src/wab-client/__tests/WABClient.test.js +47 -0
  86. package/out/src/wab-client/__tests/WABClient.test.js.map +1 -0
  87. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts +34 -0
  88. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -0
  89. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js +16 -0
  90. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -0
  91. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.d.ts +7 -0
  92. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.d.ts.map +1 -0
  93. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js +40 -0
  94. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js.map +1 -0
  95. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts +28 -0
  96. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts.map +1 -0
  97. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js +73 -0
  98. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js.map +1 -0
  99. package/out/test/Wallet/action/abortAction.test.d.ts.map +1 -0
  100. package/out/test/{wallet → Wallet}/action/abortAction.test.js.map +1 -1
  101. package/out/test/Wallet/action/createAction.test.d.ts.map +1 -0
  102. package/out/test/{wallet → Wallet}/action/createAction.test.js.map +1 -1
  103. package/out/test/{wallet → Wallet}/action/createAction2.test.d.ts.map +1 -1
  104. package/out/test/{wallet → Wallet}/action/createAction2.test.js.map +1 -1
  105. package/out/test/Wallet/action/createActionToGenerateBeefs.man.test.d.ts.map +1 -0
  106. package/out/test/{wallet → Wallet}/action/createActionToGenerateBeefs.man.test.js.map +1 -1
  107. package/out/test/Wallet/action/internalizeAction.test.d.ts.map +1 -0
  108. package/out/test/{wallet → Wallet}/action/internalizeAction.test.js.map +1 -1
  109. package/out/test/Wallet/action/relinquishOutput.test.d.ts.map +1 -0
  110. package/out/test/{wallet → Wallet}/action/relinquishOutput.test.js.map +1 -1
  111. package/out/test/Wallet/construct/Wallet.constructor.test.d.ts.map +1 -0
  112. package/out/test/{wallet → Wallet}/construct/Wallet.constructor.test.js.map +1 -1
  113. package/out/test/Wallet/list/listActions.test.d.ts.map +1 -0
  114. package/out/test/{wallet → Wallet}/list/listActions.test.js.map +1 -1
  115. package/out/test/Wallet/list/listActions2.test.d.ts.map +1 -0
  116. package/out/test/{wallet → Wallet}/list/listActions2.test.js.map +1 -1
  117. package/out/test/Wallet/list/listCertificates.test.d.ts.map +1 -0
  118. package/out/test/{wallet → Wallet}/list/listCertificates.test.js.map +1 -1
  119. package/out/test/Wallet/list/listOutputs.test.d.ts.map +1 -0
  120. package/out/test/{wallet → Wallet}/list/listOutputs.test.js.map +1 -1
  121. package/out/test/Wallet/sync/Wallet.sync.test.d.ts.map +1 -0
  122. package/out/test/{wallet → Wallet}/sync/Wallet.sync.test.js.map +1 -1
  123. package/out/tsconfig.all.tsbuildinfo +1 -1
  124. package/package.json +3 -3
  125. package/src/CWIStyleWalletManager.ts +1891 -0
  126. package/src/SimpleWalletManager.ts +553 -0
  127. package/src/Wallet.ts +47 -3
  128. package/src/WalletAuthenticationManager.ts +183 -0
  129. package/src/WalletPermissionsManager.ts +2639 -0
  130. package/src/WalletSettingsManager.ts +241 -0
  131. package/src/__tests/CWIStyleWalletManager.test.ts +709 -0
  132. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +328 -0
  133. package/src/__tests/WalletPermissionsManager.checks.test.ts +857 -0
  134. package/src/__tests/WalletPermissionsManager.encryption.test.ts +407 -0
  135. package/src/__tests/WalletPermissionsManager.fixtures.ts +283 -0
  136. package/src/__tests/WalletPermissionsManager.flows.test.ts +490 -0
  137. package/src/__tests/WalletPermissionsManager.initialization.test.ts +333 -0
  138. package/src/__tests/WalletPermissionsManager.proxying.test.ts +753 -0
  139. package/src/__tests/WalletPermissionsManager.tokens.test.ts +584 -0
  140. package/src/index.all.ts +9 -0
  141. package/src/index.client.ts +9 -0
  142. package/src/utility/identityUtils.ts +170 -0
  143. package/src/wab-client/WABClient.ts +103 -0
  144. package/src/wab-client/__tests/WABClient.test.ts +58 -0
  145. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  146. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +45 -0
  147. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +82 -0
  148. package/out/test/wallet/action/abortAction.test.d.ts.map +0 -1
  149. package/out/test/wallet/action/createAction.test.d.ts.map +0 -1
  150. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.d.ts.map +0 -1
  151. package/out/test/wallet/action/internalizeAction.test.d.ts.map +0 -1
  152. package/out/test/wallet/action/relinquishOutput.test.d.ts.map +0 -1
  153. package/out/test/wallet/construct/Wallet.constructor.test.d.ts.map +0 -1
  154. package/out/test/wallet/list/listActions.test.d.ts.map +0 -1
  155. package/out/test/wallet/list/listActions2.test.d.ts.map +0 -1
  156. package/out/test/wallet/list/listCertificates.test.d.ts.map +0 -1
  157. package/out/test/wallet/list/listOutputs.test.d.ts.map +0 -1
  158. package/out/test/wallet/sync/Wallet.sync.test.d.ts.map +0 -1
  159. /package/out/test/{wallet → Wallet}/action/abortAction.test.d.ts +0 -0
  160. /package/out/test/{wallet → Wallet}/action/abortAction.test.js +0 -0
  161. /package/out/test/{wallet → Wallet}/action/createAction.test.d.ts +0 -0
  162. /package/out/test/{wallet → Wallet}/action/createAction.test.js +0 -0
  163. /package/out/test/{wallet → Wallet}/action/createAction2.test.d.ts +0 -0
  164. /package/out/test/{wallet → Wallet}/action/createAction2.test.js +0 -0
  165. /package/out/test/{wallet → Wallet}/action/createActionToGenerateBeefs.man.test.d.ts +0 -0
  166. /package/out/test/{wallet → Wallet}/action/createActionToGenerateBeefs.man.test.js +0 -0
  167. /package/out/test/{wallet → Wallet}/action/internalizeAction.test.d.ts +0 -0
  168. /package/out/test/{wallet → Wallet}/action/internalizeAction.test.js +0 -0
  169. /package/out/test/{wallet → Wallet}/action/relinquishOutput.test.d.ts +0 -0
  170. /package/out/test/{wallet → Wallet}/action/relinquishOutput.test.js +0 -0
  171. /package/out/test/{wallet → Wallet}/construct/Wallet.constructor.test.d.ts +0 -0
  172. /package/out/test/{wallet → Wallet}/construct/Wallet.constructor.test.js +0 -0
  173. /package/out/test/{wallet → Wallet}/list/listActions.test.d.ts +0 -0
  174. /package/out/test/{wallet → Wallet}/list/listActions.test.js +0 -0
  175. /package/out/test/{wallet → Wallet}/list/listActions2.test.d.ts +0 -0
  176. /package/out/test/{wallet → Wallet}/list/listActions2.test.js +0 -0
  177. /package/out/test/{wallet → Wallet}/list/listCertificates.test.d.ts +0 -0
  178. /package/out/test/{wallet → Wallet}/list/listCertificates.test.js +0 -0
  179. /package/out/test/{wallet → Wallet}/list/listOutputs.test.d.ts +0 -0
  180. /package/out/test/{wallet → Wallet}/list/listOutputs.test.js +0 -0
  181. /package/out/test/{wallet → Wallet}/sync/Wallet.sync.test.d.ts +0 -0
  182. /package/out/test/{wallet → Wallet}/sync/Wallet.sync.test.js +0 -0
  183. /package/test/{wallet → Wallet}/action/abortAction.test.ts +0 -0
  184. /package/test/{wallet → Wallet}/action/createAction.test.ts +0 -0
  185. /package/test/{wallet → Wallet}/action/createAction2.test.ts +0 -0
  186. /package/test/{wallet → Wallet}/action/createActionToGenerateBeefs.man.test.ts +0 -0
  187. /package/test/{wallet → Wallet}/action/internalizeAction.test.ts +0 -0
  188. /package/test/{wallet → Wallet}/action/relinquishOutput.test.ts +0 -0
  189. /package/test/{wallet → Wallet}/construct/Wallet.constructor.test.ts +0 -0
  190. /package/test/{wallet → Wallet}/list/listActions.test.ts +0 -0
  191. /package/test/{wallet → Wallet}/list/listActions2.test.ts +0 -0
  192. /package/test/{wallet → Wallet}/list/listCertificates.test.ts +0 -0
  193. /package/test/{wallet → Wallet}/list/listOutputs.test.ts +0 -0
  194. /package/test/{wallet → Wallet}/sync/Wallet.sync.test.ts +0 -0
@@ -0,0 +1,333 @@
1
+ import {
2
+ mockUnderlyingWallet,
3
+ MockedBSV_SDK
4
+ } from './WalletPermissionsManager.fixtures'
5
+ import {
6
+ WalletPermissionsManager,
7
+ PermissionsManagerConfig
8
+ } from '../WalletPermissionsManager'
9
+
10
+ jest.mock('@bsv/sdk', () => MockedBSV_SDK)
11
+
12
+ describe('WalletPermissionsManager - Initialization & Configuration', () => {
13
+ let underlying: jest.Mocked<any>
14
+
15
+ beforeEach(() => {
16
+ // Create a fresh underlying mock wallet before each test
17
+ underlying = mockUnderlyingWallet()
18
+ })
19
+
20
+ afterEach(() => {
21
+ jest.clearAllMocks()
22
+ })
23
+
24
+ it('should initialize with default config if none is provided', () => {
25
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com')
26
+
27
+ // The manager internally defaults all config flags to true.
28
+ const internalConfig = (manager as any).config as PermissionsManagerConfig
29
+
30
+ expect(internalConfig.seekProtocolPermissionsForSigning).toBe(true)
31
+ expect(internalConfig.seekProtocolPermissionsForEncrypting).toBe(true)
32
+ expect(internalConfig.seekPermissionsForIdentityKeyRevelation).toBe(true)
33
+ expect(internalConfig.encryptWalletMetadata).toBe(true)
34
+
35
+ // The manager should store the admin originator
36
+ const admin = (manager as any).adminOriginator
37
+ expect(admin).toBe('admin.domain.com')
38
+ })
39
+
40
+ it('should initialize with partial config overrides, merging with defaults', () => {
41
+ const partialConfig: PermissionsManagerConfig = {
42
+ seekProtocolPermissionsForSigning: false,
43
+ encryptWalletMetadata: false
44
+ // The rest remain default = true
45
+ }
46
+
47
+ const manager = new WalletPermissionsManager(
48
+ underlying,
49
+ 'admin.domain.com',
50
+ partialConfig
51
+ )
52
+ const internalConfig = (manager as any).config
53
+
54
+ // Overridden to false
55
+ expect(internalConfig.seekProtocolPermissionsForSigning).toBe(false)
56
+ expect(internalConfig.encryptWalletMetadata).toBe(false)
57
+
58
+ // Remaining defaults still true
59
+ expect(internalConfig.seekBasketInsertionPermissions).toBe(true)
60
+ expect(internalConfig.seekSpendingPermissions).toBe(true)
61
+ })
62
+
63
+ it('should initialize with all config flags set to false', () => {
64
+ const allFalse: PermissionsManagerConfig = {
65
+ seekProtocolPermissionsForSigning: false,
66
+ seekProtocolPermissionsForEncrypting: false,
67
+ seekProtocolPermissionsForHMAC: false,
68
+ seekPermissionsForKeyLinkageRevelation: false,
69
+ seekPermissionsForPublicKeyRevelation: false,
70
+ seekPermissionsForIdentityKeyRevelation: false,
71
+ seekPermissionsForIdentityResolution: false,
72
+ seekBasketInsertionPermissions: false,
73
+ seekBasketRemovalPermissions: false,
74
+ seekBasketListingPermissions: false,
75
+ seekPermissionWhenApplyingActionLabels: false,
76
+ seekPermissionWhenListingActionsByLabel: false,
77
+ seekCertificateDisclosurePermissions: false,
78
+ seekCertificateAcquisitionPermissions: false,
79
+ seekCertificateRelinquishmentPermissions: false,
80
+ seekCertificateListingPermissions: false,
81
+ encryptWalletMetadata: false,
82
+ seekSpendingPermissions: false,
83
+ differentiatePrivilegedOperations: false
84
+ }
85
+
86
+ const manager = new WalletPermissionsManager(
87
+ underlying,
88
+ 'admin.domain.com',
89
+ allFalse
90
+ )
91
+ const internalConfig = (manager as any).config
92
+
93
+ for (const [k, v] of Object.entries(allFalse)) {
94
+ expect(internalConfig[k]).toBe(v)
95
+ }
96
+ })
97
+
98
+ it('should consider calls from the adminOriginator as admin, bypassing checks', async () => {
99
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com')
100
+
101
+ // If we call a method that normally triggers permission checks (like createAction with a basket),
102
+ // but pass in originator="admin.domain.com", we expect NO permission prompt or error.
103
+ // We'll do a minimal createAction call.
104
+ const result = await manager.createAction(
105
+ {
106
+ description: 'Insertion to user basket',
107
+ outputs: [
108
+ {
109
+ lockingScript: 'abcd',
110
+ satoshis: 1000,
111
+ outputDescription: 'some out desc',
112
+ basket: 'some-user-basket'
113
+ }
114
+ ]
115
+ },
116
+ 'admin.domain.com'
117
+ )
118
+
119
+ // If the manager truly bypassed checks for the admin, it won't queue a request
120
+ // nor throw an error. The call should just succeed.
121
+ expect(result).toBeDefined()
122
+
123
+ // Confirm the underlying createAction was actually called
124
+ expect(underlying.createAction).toHaveBeenCalledTimes(1)
125
+
126
+ // activeRequests map should be empty
127
+ const activeRequests = (manager as any).activeRequests as Map<string, any[]>
128
+ expect(activeRequests.size).toBe(0)
129
+ })
130
+
131
+ it('should skip protocol permission checks for signing if seekProtocolPermissionsForSigning=false', async () => {
132
+ const manager = new WalletPermissionsManager(
133
+ underlying,
134
+ 'admin.domain.com',
135
+ {
136
+ seekProtocolPermissionsForSigning: false
137
+ }
138
+ )
139
+
140
+ // Non-admin origin attempts "createSignature" with a protocolID
141
+ // Normally, if config was true, we'd expect a request for permission.
142
+ // But here we expect it to skip and proceed.
143
+ await expect(
144
+ manager.createSignature(
145
+ {
146
+ protocolID: [1, 'some-protocol'],
147
+ privileged: false,
148
+ data: [0x01, 0x02],
149
+ keyID: '1'
150
+ },
151
+ 'app.nonadmin.com'
152
+ )
153
+ ).resolves.not.toThrow()
154
+
155
+ // underlying createSignature is invoked
156
+ expect(underlying.createSignature).toHaveBeenCalledTimes(1)
157
+
158
+ // The manager’s internal request queue should remain empty
159
+ const activeRequests = (manager as any).activeRequests as Map<string, any[]>
160
+ expect(activeRequests.size).toBe(0)
161
+ })
162
+
163
+ it('should enforce protocol permission checks for signing if seekProtocolPermissionsForSigning=true', async () => {
164
+ // By default, or explicitly set to true, the manager enforces permission checks
165
+ const manager = new WalletPermissionsManager(
166
+ underlying,
167
+ 'admin.domain.com',
168
+ {
169
+ seekProtocolPermissionsForSigning: true
170
+ }
171
+ )
172
+
173
+ // Non-admin origin tries createSignature -> must prompt for protocol permission
174
+ const createSigPromise = manager.createSignature(
175
+ {
176
+ protocolID: [1, 'test-protocol'],
177
+ keyID: '1',
178
+ data: [0x10, 0x20],
179
+ privileged: false
180
+ },
181
+ 'nonadmin.com'
182
+ )
183
+
184
+ // The manager triggers a request. Let's see if the request queue has an entry:
185
+ const activeRequests = (manager as any).activeRequests as Map<string, any>
186
+ // We may not see an entry synchronously because `ensureProtocolPermission()` is async,
187
+ // but once the promise gets to that stage, it populates the queue.
188
+
189
+ // Wait a short tick to let the async code run
190
+ await new Promise(res => setTimeout(res, 10))
191
+ expect(activeRequests.size).toBeGreaterThan(0)
192
+
193
+ // We'll forcibly deny the request so the test can conclude:
194
+ const firstRequestKey = Array.from(activeRequests.keys())[0]
195
+ const firstRequestQueue = activeRequests.get(firstRequestKey)
196
+ if (firstRequestQueue && firstRequestQueue.pending.length > 0) {
197
+ manager.denyPermission(firstRequestKey)
198
+ }
199
+
200
+ // The promise eventually rejects with "Permission denied."
201
+ await expect(createSigPromise).rejects.toThrow(/Permission denied/)
202
+ })
203
+
204
+ it('should skip basket insertion permission checks if seekBasketInsertionPermissions=false', async () => {
205
+ const manager = new WalletPermissionsManager(
206
+ underlying,
207
+ 'admin.domain.com',
208
+ {
209
+ seekBasketInsertionPermissions: false
210
+ }
211
+ )
212
+ // Spending authorization is still required, grant it.
213
+ manager.bindCallback(
214
+ 'onSpendingAuthorizationRequested',
215
+ jest.fn(x => {
216
+ manager.grantPermission({ requestID: x.requestID, ephemeral: true })
217
+ })
218
+ )
219
+
220
+ // Non-admin origin tries to createAction specifying a basket
221
+ await expect(
222
+ manager.createAction(
223
+ {
224
+ description: 'Insert to user basket',
225
+ outputs: [
226
+ {
227
+ lockingScript: '0x1234',
228
+ satoshis: 888,
229
+ basket: 'somebasket',
230
+ outputDescription: 'some out desc'
231
+ }
232
+ ]
233
+ },
234
+ 'some-user.com'
235
+ )
236
+ ).resolves.not.toThrow()
237
+
238
+ // Because insertion checks are disabled, no permission request should be queued
239
+ const activeRequests = (manager as any).activeRequests as Map<string, any>
240
+ expect(activeRequests.size).toBe(0)
241
+ })
242
+
243
+ it('should skip all permission checks if all relevant config flags are false (except admin-only baskets, etc.)', async () => {
244
+ const manager = new WalletPermissionsManager(
245
+ underlying,
246
+ 'admin.domain.com',
247
+ {
248
+ // Only turning off relevant categories, i.e. we might set all false except we keep
249
+ // differentiatePrivilegedOperations at default just to verify. Or set it to false as well.
250
+ seekProtocolPermissionsForSigning: false,
251
+ seekProtocolPermissionsForEncrypting: false,
252
+ seekProtocolPermissionsForHMAC: false,
253
+ seekPermissionsForKeyLinkageRevelation: false,
254
+ seekPermissionsForPublicKeyRevelation: false,
255
+ seekPermissionsForIdentityKeyRevelation: false,
256
+ seekPermissionsForIdentityResolution: false,
257
+ seekBasketInsertionPermissions: false,
258
+ seekBasketRemovalPermissions: false,
259
+ seekBasketListingPermissions: false,
260
+ seekPermissionWhenApplyingActionLabels: false,
261
+ seekPermissionWhenListingActionsByLabel: false,
262
+ seekCertificateDisclosurePermissions: false,
263
+ seekCertificateAcquisitionPermissions: false,
264
+ seekCertificateRelinquishmentPermissions: false,
265
+ seekCertificateListingPermissions: false,
266
+ encryptWalletMetadata: false,
267
+ seekSpendingPermissions: false,
268
+ differentiatePrivilegedOperations: false
269
+ }
270
+ )
271
+
272
+ // We'll do a few calls that would normally require checks:
273
+
274
+ // 1) createSignature from non-admin
275
+ await expect(
276
+ manager.createSignature(
277
+ { protocolID: [1, 'some-protocol'], data: [0x01], keyID: '1' },
278
+ 'nonadmin.com'
279
+ )
280
+ ).resolves.not.toThrow()
281
+
282
+ // 2) createAction to insert in a basket
283
+ await expect(
284
+ manager.createAction(
285
+ {
286
+ description: 'Inserting stuff',
287
+ outputs: [
288
+ {
289
+ lockingScript: 'op_return ...',
290
+ satoshis: 1,
291
+ basket: 'user-basket',
292
+ outputDescription: 'some out desc'
293
+ }
294
+ ]
295
+ },
296
+ 'nonadmin.com'
297
+ )
298
+ ).resolves.not.toThrow()
299
+
300
+ // 3) Acquire certificate
301
+ await expect(
302
+ manager.acquireCertificate(
303
+ {
304
+ type: 'base64-cert-type',
305
+ certifier: '02abc...',
306
+ acquisitionProtocol: 'direct',
307
+ fields: { name: 'Bob' }
308
+ },
309
+ 'nonadmin.com'
310
+ )
311
+ ).resolves.not.toThrow()
312
+
313
+ // Confirm no queued requests
314
+ const activeRequests = (manager as any).activeRequests as Map<string, any[]>
315
+ expect(activeRequests.size).toBe(0)
316
+ })
317
+
318
+ it('should block usage of an admin-only protocol name if not called by admin', async () => {
319
+ const manager = new WalletPermissionsManager(underlying, 'admin.domain.com')
320
+ // A protocol name that starts with "admin"
321
+ await expect(
322
+ manager.createSignature(
323
+ {
324
+ protocolID: [1, 'admin super-secret-protocol'],
325
+ data: [1, 2, 3],
326
+ keyID: '1',
327
+ privileged: false
328
+ },
329
+ 'nonadmin.com'
330
+ )
331
+ ).rejects.toThrow(/admin-only/i)
332
+ })
333
+ })