@bsv/wallet-toolbox 1.1.62 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/docs/client.md +2339 -182
  2. package/docs/wallet.md +2339 -182
  3. package/out/src/CWIStyleWalletManager.d.ts +417 -0
  4. package/out/src/CWIStyleWalletManager.d.ts.map +1 -0
  5. package/out/src/CWIStyleWalletManager.js +1153 -0
  6. package/out/src/CWIStyleWalletManager.js.map +1 -0
  7. package/out/src/SimpleWalletManager.d.ts +169 -0
  8. package/out/src/SimpleWalletManager.d.ts.map +1 -0
  9. package/out/src/SimpleWalletManager.js +315 -0
  10. package/out/src/SimpleWalletManager.js.map +1 -0
  11. package/out/src/Wallet.d.ts +6 -1
  12. package/out/src/Wallet.d.ts.map +1 -1
  13. package/out/src/Wallet.js +39 -7
  14. package/out/src/Wallet.js.map +1 -1
  15. package/out/src/WalletAuthenticationManager.d.ts +33 -0
  16. package/out/src/WalletAuthenticationManager.d.ts.map +1 -0
  17. package/out/src/WalletAuthenticationManager.js +110 -0
  18. package/out/src/WalletAuthenticationManager.js.map +1 -0
  19. package/out/src/WalletPermissionsManager.d.ts +575 -0
  20. package/out/src/WalletPermissionsManager.d.ts.map +1 -0
  21. package/out/src/WalletPermissionsManager.js +1789 -0
  22. package/out/src/WalletPermissionsManager.js.map +1 -0
  23. package/out/src/WalletSettingsManager.d.ts +59 -0
  24. package/out/src/WalletSettingsManager.d.ts.map +1 -0
  25. package/out/src/WalletSettingsManager.js +189 -0
  26. package/out/src/WalletSettingsManager.js.map +1 -0
  27. package/out/src/__tests/CWIStyleWalletManager.test.d.ts +2 -0
  28. package/out/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  29. package/out/src/__tests/CWIStyleWalletManager.test.js +471 -0
  30. package/out/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  31. package/out/src/__tests/WalletPermissionsManager.callbacks.test.d.ts +2 -0
  32. package/out/src/__tests/WalletPermissionsManager.callbacks.test.d.ts.map +1 -0
  33. package/out/src/__tests/WalletPermissionsManager.callbacks.test.js +239 -0
  34. package/out/src/__tests/WalletPermissionsManager.callbacks.test.js.map +1 -0
  35. package/out/src/__tests/WalletPermissionsManager.checks.test.d.ts +2 -0
  36. package/out/src/__tests/WalletPermissionsManager.checks.test.d.ts.map +1 -0
  37. package/out/src/__tests/WalletPermissionsManager.checks.test.js +637 -0
  38. package/out/src/__tests/WalletPermissionsManager.checks.test.js.map +1 -0
  39. package/out/src/__tests/WalletPermissionsManager.encryption.test.d.ts +2 -0
  40. package/out/src/__tests/WalletPermissionsManager.encryption.test.d.ts.map +1 -0
  41. package/out/src/__tests/WalletPermissionsManager.encryption.test.js +295 -0
  42. package/out/src/__tests/WalletPermissionsManager.encryption.test.js.map +1 -0
  43. package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts +83 -0
  44. package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts.map +1 -0
  45. package/out/src/__tests/WalletPermissionsManager.fixtures.js +261 -0
  46. package/out/src/__tests/WalletPermissionsManager.fixtures.js.map +1 -0
  47. package/out/src/__tests/WalletPermissionsManager.flows.test.d.ts +2 -0
  48. package/out/src/__tests/WalletPermissionsManager.flows.test.d.ts.map +1 -0
  49. package/out/src/__tests/WalletPermissionsManager.flows.test.js +377 -0
  50. package/out/src/__tests/WalletPermissionsManager.flows.test.js.map +1 -0
  51. package/out/src/__tests/WalletPermissionsManager.initialization.test.d.ts +2 -0
  52. package/out/src/__tests/WalletPermissionsManager.initialization.test.d.ts.map +1 -0
  53. package/out/src/__tests/WalletPermissionsManager.initialization.test.js +227 -0
  54. package/out/src/__tests/WalletPermissionsManager.initialization.test.js.map +1 -0
  55. package/out/src/__tests/WalletPermissionsManager.proxying.test.d.ts +2 -0
  56. package/out/src/__tests/WalletPermissionsManager.proxying.test.d.ts.map +1 -0
  57. package/out/src/__tests/WalletPermissionsManager.proxying.test.js +566 -0
  58. package/out/src/__tests/WalletPermissionsManager.proxying.test.js.map +1 -0
  59. package/out/src/__tests/WalletPermissionsManager.tokens.test.d.ts +2 -0
  60. package/out/src/__tests/WalletPermissionsManager.tokens.test.d.ts.map +1 -0
  61. package/out/src/__tests/WalletPermissionsManager.tokens.test.js +454 -0
  62. package/out/src/__tests/WalletPermissionsManager.tokens.test.js.map +1 -0
  63. package/out/src/index.all.d.ts +9 -0
  64. package/out/src/index.all.d.ts.map +1 -1
  65. package/out/src/index.all.js +9 -0
  66. package/out/src/index.all.js.map +1 -1
  67. package/out/src/index.client.d.ts +9 -0
  68. package/out/src/index.client.d.ts.map +1 -1
  69. package/out/src/index.client.js +9 -0
  70. package/out/src/index.client.js.map +1 -1
  71. package/out/src/sdk/CertOpsWallet.d.ts +7 -0
  72. package/out/src/sdk/CertOpsWallet.d.ts.map +1 -0
  73. package/out/src/sdk/CertOpsWallet.js +3 -0
  74. package/out/src/sdk/CertOpsWallet.js.map +1 -0
  75. package/out/src/sdk/__test/CertificateLifeCycle.test.js +19 -82
  76. package/out/src/sdk/__test/CertificateLifeCycle.test.js.map +1 -1
  77. package/out/src/sdk/index.d.ts +1 -1
  78. package/out/src/sdk/index.d.ts.map +1 -1
  79. package/out/src/sdk/index.js +1 -1
  80. package/out/src/sdk/index.js.map +1 -1
  81. package/out/src/sdk/validationHelpers.d.ts.map +1 -1
  82. package/out/src/sdk/validationHelpers.js +13 -12
  83. package/out/src/sdk/validationHelpers.js.map +1 -1
  84. package/out/src/services/__tests/bitrails.test.js +7 -2
  85. package/out/src/services/__tests/bitrails.test.js.map +1 -1
  86. package/out/src/services/providers/__tests/WhatsOnChain.test.js +3 -3
  87. package/out/src/services/providers/__tests/WhatsOnChain.test.js.map +1 -1
  88. package/out/src/signer/methods/proveCertificate.d.ts.map +1 -1
  89. package/out/src/signer/methods/proveCertificate.js +3 -19
  90. package/out/src/signer/methods/proveCertificate.js.map +1 -1
  91. package/out/src/storage/__test/WalletStorageManager.test.js +1 -1
  92. package/out/src/storage/__test/WalletStorageManager.test.js.map +1 -1
  93. package/out/src/storage/remoting/StorageClient.d.ts +2 -2
  94. package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
  95. package/out/src/storage/remoting/StorageClient.js +1 -1
  96. package/out/src/storage/remoting/StorageClient.js.map +1 -1
  97. package/out/src/utility/identityUtils.d.ts +31 -0
  98. package/out/src/utility/identityUtils.d.ts.map +1 -0
  99. package/out/src/utility/identityUtils.js +116 -0
  100. package/out/src/utility/identityUtils.js.map +1 -0
  101. package/out/src/wab-client/WABClient.d.ts +49 -0
  102. package/out/src/wab-client/WABClient.d.ts.map +1 -0
  103. package/out/src/wab-client/WABClient.js +83 -0
  104. package/out/src/wab-client/WABClient.js.map +1 -0
  105. package/out/src/wab-client/__tests/WABClient.man.test.d.ts +2 -0
  106. package/out/src/wab-client/__tests/WABClient.man.test.d.ts.map +1 -0
  107. package/out/src/wab-client/__tests/WABClient.man.test.js +52 -0
  108. package/out/src/wab-client/__tests/WABClient.man.test.js.map +1 -0
  109. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts +34 -0
  110. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -0
  111. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js +16 -0
  112. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -0
  113. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.d.ts +7 -0
  114. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.d.ts.map +1 -0
  115. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js +36 -0
  116. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js.map +1 -0
  117. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts +28 -0
  118. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts.map +1 -0
  119. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js +69 -0
  120. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js.map +1 -0
  121. package/out/test/Wallet/action/internalizeAction.a.test.js +1 -1
  122. package/out/test/Wallet/action/internalizeAction.a.test.js.map +1 -1
  123. package/out/test/Wallet/certificate/acquireCertificate.test.js +26 -29
  124. package/out/test/Wallet/certificate/acquireCertificate.test.js.map +1 -1
  125. package/out/test/storage/KnexMigrations.test.js +1 -1
  126. package/out/test/storage/KnexMigrations.test.js.map +1 -1
  127. package/out/test/storage/update.test.js +1 -1
  128. package/out/test/storage/update.test.js.map +1 -1
  129. package/out/test/utils/TestUtilsWalletStorage.d.ts +9 -5
  130. package/out/test/utils/TestUtilsWalletStorage.d.ts.map +1 -1
  131. package/out/test/utils/TestUtilsWalletStorage.js +15 -9
  132. package/out/test/utils/TestUtilsWalletStorage.js.map +1 -1
  133. package/out/test/wallet/action/internalizeAction.test.js +1 -1
  134. package/out/test/wallet/action/internalizeAction.test.js.map +1 -1
  135. package/out/test/wallet/list/listActions2.test.js +1 -1
  136. package/out/test/wallet/list/listActions2.test.js.map +1 -1
  137. package/out/test/wallet/sync/Wallet.sync.test.js +1 -1
  138. package/out/test/wallet/sync/Wallet.sync.test.js.map +1 -1
  139. package/out/tsconfig.all.tsbuildinfo +1 -1
  140. package/package.json +3 -4
  141. package/src/CWIStyleWalletManager.ts +1738 -0
  142. package/src/SimpleWalletManager.ts +526 -0
  143. package/src/Wallet.ts +70 -7
  144. package/src/WalletAuthenticationManager.ts +150 -0
  145. package/src/WalletPermissionsManager.ts +2424 -0
  146. package/src/WalletSettingsManager.ts +243 -0
  147. package/src/__tests/CWIStyleWalletManager.test.ts +604 -0
  148. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  149. package/src/__tests/WalletPermissionsManager.checks.test.ts +839 -0
  150. package/src/__tests/WalletPermissionsManager.encryption.test.ts +370 -0
  151. package/src/__tests/WalletPermissionsManager.fixtures.ts +284 -0
  152. package/src/__tests/WalletPermissionsManager.flows.test.ts +457 -0
  153. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  154. package/src/__tests/WalletPermissionsManager.proxying.test.ts +706 -0
  155. package/src/__tests/WalletPermissionsManager.tokens.test.ts +546 -0
  156. package/src/index.all.ts +9 -0
  157. package/src/index.client.ts +9 -0
  158. package/src/sdk/CertOpsWallet.ts +18 -0
  159. package/src/sdk/__test/CertificateLifeCycle.test.ts +66 -113
  160. package/src/sdk/index.ts +1 -1
  161. package/src/sdk/validationHelpers.ts +12 -11
  162. package/src/services/__tests/bitrails.test.ts +7 -2
  163. package/src/services/providers/__tests/WhatsOnChain.test.ts +3 -3
  164. package/src/signer/methods/proveCertificate.ts +14 -21
  165. package/src/storage/__test/WalletStorageManager.test.ts +1 -1
  166. package/src/storage/remoting/StorageClient.ts +4 -4
  167. package/src/utility/identityUtils.ts +159 -0
  168. package/src/wab-client/WABClient.ts +94 -0
  169. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  170. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  171. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  172. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  173. package/test/Wallet/action/internalizeAction.a.test.ts +1 -1
  174. package/test/Wallet/certificate/acquireCertificate.test.ts +89 -30
  175. package/test/storage/KnexMigrations.test.ts +1 -1
  176. package/test/storage/update.test.ts +1 -1
  177. package/test/utils/TestUtilsWalletStorage.ts +24 -13
  178. package/test/wallet/action/internalizeAction.test.ts +1 -1
  179. package/test/wallet/list/listActions2.test.ts +1 -1
  180. package/test/wallet/sync/Wallet.sync.test.ts +1 -1
  181. package/out/src/sdk/CertOps.d.ts +0 -66
  182. package/out/src/sdk/CertOps.d.ts.map +0 -1
  183. package/out/src/sdk/CertOps.js +0 -190
  184. package/out/src/sdk/CertOps.js.map +0 -1
  185. package/src/sdk/CertOps.ts +0 -274
@@ -0,0 +1,243 @@
1
+ import {
2
+ CreateActionInput,
3
+ LockingScript,
4
+ PubKeyHex,
5
+ PushDrop,
6
+ Transaction,
7
+ Utils,
8
+ WalletInterface,
9
+ WalletProtocol
10
+ } from '@bsv/sdk'
11
+
12
+ export interface Certifier {
13
+ name: string
14
+ description: string
15
+ identityKey: PubKeyHex
16
+ trust: number
17
+ iconUrl?: string
18
+ baseURL?: string // ?
19
+ }
20
+ export interface TrustSettings {
21
+ trustLevel: number
22
+ trustedCertifiers: Certifier[]
23
+ }
24
+ export interface WalletTheme {
25
+ mode: string
26
+ }
27
+ export interface WalletSettings {
28
+ trustSettings: TrustSettings
29
+ theme?: WalletTheme
30
+ currency?: string
31
+ }
32
+ export interface WalletSettingsManagerConfig {
33
+ defaultSettings: WalletSettings
34
+ }
35
+
36
+ const PROTOCOL_ID: WalletProtocol = [2, 'wallet settings']
37
+ const KEY_ID = '1'
38
+ const SETTINGS_BASKET = 'wallet settings'
39
+ const TOKEN_AMOUNT = 1
40
+
41
+ // Defaults can be overridden as needed
42
+ export const DEFAULT_SETTINGS = {
43
+ trustSettings: {
44
+ trustLevel: 2,
45
+ trustedCertifiers: [
46
+ {
47
+ name: 'Babbage Trust Services',
48
+ description: 'Resolves identity information for Babbage-run APIs and Bitcoin infrastructure.',
49
+ iconUrl: 'https://projectbabbage.com/favicon.ico',
50
+ identityKey: '028703956178067ea7ca405111f1ca698290a0112a3d7cf3d843e195bf58a7cfa6',
51
+ trust: 4
52
+ },
53
+ {
54
+ name: 'IdentiCert',
55
+ description: 'Certifies legal first and last name, and photos',
56
+ iconUrl: 'https://identicert.me/favicon.ico',
57
+ trust: 5,
58
+ identityKey: '0295bf1c7842d14babf60daf2c733956c331f9dcb2c79e41f85fd1dda6a3fa4549'
59
+ },
60
+ {
61
+ name: 'SocialCert',
62
+ description: 'Certifies social media handles, phone numbers and emails',
63
+ iconUrl: 'https://socialcert.net/favicon.ico',
64
+ trust: 3,
65
+ identityKey: '03285263f06139b66fb27f51cf8a92e9dd007c4c4b83876ad6c3e7028db450a4c2'
66
+ }
67
+ ]
68
+ },
69
+ theme: { mode: 'dark' }
70
+ } as WalletSettings
71
+
72
+ // Mapping of certifier names to their testnet identity keys
73
+ const TESTNET_IDENTITY_KEYS: Record<string, string> = {
74
+ 'Babbage Trust Services': '03d0b36b5c98b000ec9ffed9a2cf005e279244edf6a19cf90545cdebe873162761',
75
+ IdentiCert: '036dc48522aba1705afbb43df3c04dbd1da373b6154341a875bceaa2a3e7f21528',
76
+ SocialCert: '02cf6cdf466951d8dfc9e7c9367511d0007ed6fba35ed42d425cc412fd6cfd4a17'
77
+ }
78
+
79
+ // Define defaults that can be imported for a testnet environment
80
+ export const TESTNET_DEFAULT_SETTINGS: WalletSettings = {
81
+ ...DEFAULT_SETTINGS,
82
+ trustSettings: {
83
+ ...DEFAULT_SETTINGS.trustSettings,
84
+ trustedCertifiers: DEFAULT_SETTINGS.trustSettings.trustedCertifiers.map(certifier => ({
85
+ ...certifier,
86
+ // Use the testnet key if provided, otherwise fallback to the default
87
+ identityKey: TESTNET_IDENTITY_KEYS[certifier.name] || certifier.identityKey
88
+ }))
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Manages wallet settings
94
+ */
95
+ export class WalletSettingsManager {
96
+ constructor(
97
+ private wallet: WalletInterface,
98
+ private config: WalletSettingsManagerConfig = {
99
+ defaultSettings: DEFAULT_SETTINGS
100
+ }
101
+ ) {}
102
+
103
+ /**
104
+ * Returns a user's wallet settings
105
+ *
106
+ * @returns - Wallet settings object
107
+ */
108
+ async get(): Promise<WalletSettings> {
109
+ // List outputs in the 'wallet-settings' basket
110
+ const results = await this.wallet.listOutputs({
111
+ basket: SETTINGS_BASKET,
112
+ include: 'locking scripts',
113
+ limit: 1 // There should only be one settings token
114
+ })
115
+
116
+ // Return defaults if no settings token is found
117
+ if (!results.outputs.length) {
118
+ return this.config.defaultSettings
119
+ }
120
+
121
+ const { fields } = PushDrop.decode(LockingScript.fromHex(results.outputs[0].lockingScript!))
122
+ // Parse and return settings token
123
+ return JSON.parse(Utils.toUTF8(fields[0]))
124
+ }
125
+
126
+ /**
127
+ * Creates (or updates) the user's settings token.
128
+ *
129
+ * @param settings - The wallet settings to be stored.
130
+ */
131
+ async set(settings: WalletSettings): Promise<void> {
132
+ const pushdrop = new PushDrop(this.wallet)
133
+
134
+ // Build the new locking script with the updated settings JSON.
135
+ const lockingScript = await pushdrop.lock(
136
+ [Utils.toArray(JSON.stringify(settings), 'utf8')],
137
+ PROTOCOL_ID,
138
+ KEY_ID,
139
+ 'self'
140
+ )
141
+
142
+ // Consume any existing token and create a new one with the new locking script.
143
+ await this.updateToken(lockingScript)
144
+ }
145
+
146
+ /**
147
+ * Deletes the user's settings token.
148
+ */
149
+ async delete(): Promise<void> {
150
+ // Consume the token; if none exists, consumeToken simply returns.
151
+ await this.updateToken()
152
+ }
153
+
154
+ /**
155
+ * Updates a settings token. Any previous token is consumed, and if a new locking script
156
+ * is provided, it replaces what (if anything) was there before.
157
+ *
158
+ * @param newLockingScript - Optional locking script for replacing the settings token.
159
+ * @returns {Promise<boolean>} - True if operation succeeded, throws an error otherwise.
160
+ */
161
+ private async updateToken(newLockingScript?: LockingScript): Promise<boolean> {
162
+ const pushdrop = new PushDrop(this.wallet)
163
+
164
+ // 1. List the existing token UTXO(s) for the settings basket.
165
+ const existingUtxos = await this.wallet.listOutputs({
166
+ basket: SETTINGS_BASKET,
167
+ include: 'entire transactions',
168
+ limit: 1
169
+ })
170
+
171
+ // This is the "create a new token" path — no signAction, just a new locking script.
172
+ if (!existingUtxos.outputs.length) {
173
+ if (!newLockingScript) {
174
+ // The intention was to clear the token, but no tokn was found to clear.
175
+ // Thus, we are done.
176
+ return true
177
+ }
178
+ await this.wallet.createAction({
179
+ description: 'Create a user settings token',
180
+ outputs: [
181
+ {
182
+ satoshis: TOKEN_AMOUNT,
183
+ lockingScript: newLockingScript.toHex(),
184
+ outputDescription: 'Wallet settings token',
185
+ basket: SETTINGS_BASKET
186
+ }
187
+ ],
188
+ options: {
189
+ randomizeOutputs: false
190
+ }
191
+ })
192
+ return true
193
+ }
194
+
195
+ // 2. Prepare the token UTXO for consumption.
196
+ const tokenOutput = existingUtxos.outputs[0]
197
+ const inputToConsume: CreateActionInput = {
198
+ outpoint: tokenOutput.outpoint,
199
+ unlockingScriptLength: 73,
200
+ inputDescription: 'Consume old wallet settings token'
201
+ }
202
+
203
+ // 3. Build the outputs array: if a new locking script is provided, add an output.
204
+ const outputs = newLockingScript
205
+ ? [
206
+ {
207
+ satoshis: TOKEN_AMOUNT,
208
+ lockingScript: newLockingScript.toHex(),
209
+ outputDescription: 'Wallet settings token',
210
+ basket: SETTINGS_BASKET
211
+ }
212
+ ]
213
+ : []
214
+
215
+ // 4. Create a signable transaction action using the inputs and (optionally) outputs.
216
+ const { signableTransaction } = await this.wallet.createAction({
217
+ description: `${newLockingScript ? 'Update' : 'Delete'} a user settings token`,
218
+ inputBEEF: existingUtxos.BEEF!,
219
+ inputs: [inputToConsume], // input index 0
220
+ outputs,
221
+ options: {
222
+ randomizeOutputs: false
223
+ }
224
+ })
225
+ const tx = Transaction.fromBEEF(signableTransaction!.tx)
226
+
227
+ // 5. Build and sign the unlocking script for the token being consumed.
228
+ const unlocker = pushdrop.unlock(PROTOCOL_ID, KEY_ID, 'self')
229
+ const unlockingScript = await unlocker.sign(tx, 0)
230
+
231
+ // 6. Sign the transaction using our unlocking script.
232
+ await this.wallet.signAction({
233
+ reference: signableTransaction!.reference,
234
+ spends: {
235
+ 0: {
236
+ unlockingScript: unlockingScript.toHex()
237
+ }
238
+ }
239
+ })
240
+
241
+ return true
242
+ }
243
+ }