@bsv/sdk 1.10.4 → 2.0.0

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 (156) hide show
  1. package/dist/cjs/mod.js +1 -0
  2. package/dist/cjs/mod.js.map +1 -1
  3. package/dist/cjs/package.json +2 -3
  4. package/dist/cjs/src/auth/Peer.js +18 -20
  5. package/dist/cjs/src/auth/Peer.js.map +1 -1
  6. package/dist/cjs/src/identity/IdentityClient.js +20 -124
  7. package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
  8. package/dist/cjs/src/primitives/TransactionSignature.js +115 -10
  9. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  10. package/dist/cjs/src/primitives/utils.js +13 -112
  11. package/dist/cjs/src/primitives/utils.js.map +1 -1
  12. package/dist/cjs/src/remittance/CommsLayer.js +3 -0
  13. package/dist/cjs/src/remittance/CommsLayer.js.map +1 -0
  14. package/dist/cjs/src/remittance/IdentityLayer.js +3 -0
  15. package/dist/cjs/src/remittance/IdentityLayer.js.map +1 -0
  16. package/dist/cjs/src/remittance/RemittanceManager.js +1245 -0
  17. package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -0
  18. package/dist/cjs/src/remittance/RemittanceModule.js +3 -0
  19. package/dist/cjs/src/remittance/RemittanceModule.js.map +1 -0
  20. package/dist/cjs/src/remittance/index.js +23 -0
  21. package/dist/cjs/src/remittance/index.js.map +1 -0
  22. package/dist/cjs/src/remittance/modules/BasicBRC29.js +225 -0
  23. package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -0
  24. package/dist/cjs/src/remittance/modules/index.js +18 -0
  25. package/dist/cjs/src/remittance/modules/index.js.map +1 -0
  26. package/dist/cjs/src/remittance/types.js +22 -0
  27. package/dist/cjs/src/remittance/types.js.map +1 -0
  28. package/dist/cjs/src/script/OP.js +15 -13
  29. package/dist/cjs/src/script/OP.js.map +1 -1
  30. package/dist/cjs/src/script/Script.js +4 -1
  31. package/dist/cjs/src/script/Script.js.map +1 -1
  32. package/dist/cjs/src/script/Spend.js +128 -46
  33. package/dist/cjs/src/script/Spend.js.map +1 -1
  34. package/dist/cjs/src/transaction/BeefTx.js +2 -2
  35. package/dist/cjs/src/transaction/Transaction.js +160 -0
  36. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  37. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  38. package/dist/esm/mod.js +1 -0
  39. package/dist/esm/mod.js.map +1 -1
  40. package/dist/esm/src/auth/Peer.js +18 -20
  41. package/dist/esm/src/auth/Peer.js.map +1 -1
  42. package/dist/esm/src/identity/IdentityClient.js +20 -124
  43. package/dist/esm/src/identity/IdentityClient.js.map +1 -1
  44. package/dist/esm/src/primitives/TransactionSignature.js +115 -10
  45. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
  46. package/dist/esm/src/primitives/utils.js +13 -112
  47. package/dist/esm/src/primitives/utils.js.map +1 -1
  48. package/dist/esm/src/remittance/CommsLayer.js +2 -0
  49. package/dist/esm/src/remittance/CommsLayer.js.map +1 -0
  50. package/dist/esm/src/remittance/IdentityLayer.js +2 -0
  51. package/dist/esm/src/remittance/IdentityLayer.js.map +1 -0
  52. package/dist/esm/src/remittance/RemittanceManager.js +1254 -0
  53. package/dist/esm/src/remittance/RemittanceManager.js.map +1 -0
  54. package/dist/esm/src/remittance/RemittanceModule.js +2 -0
  55. package/dist/esm/src/remittance/RemittanceModule.js.map +1 -0
  56. package/dist/esm/src/remittance/index.js +7 -0
  57. package/dist/esm/src/remittance/index.js.map +1 -0
  58. package/dist/esm/src/remittance/modules/BasicBRC29.js +227 -0
  59. package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -0
  60. package/dist/esm/src/remittance/modules/index.js +2 -0
  61. package/dist/esm/src/remittance/modules/index.js.map +1 -0
  62. package/dist/esm/src/remittance/types.js +19 -0
  63. package/dist/esm/src/remittance/types.js.map +1 -0
  64. package/dist/esm/src/script/OP.js +15 -13
  65. package/dist/esm/src/script/OP.js.map +1 -1
  66. package/dist/esm/src/script/Script.js +4 -1
  67. package/dist/esm/src/script/Script.js.map +1 -1
  68. package/dist/esm/src/script/Spend.js +129 -46
  69. package/dist/esm/src/script/Spend.js.map +1 -1
  70. package/dist/esm/src/transaction/BeefTx.js +3 -3
  71. package/dist/esm/src/transaction/BeefTx.js.map +1 -1
  72. package/dist/esm/src/transaction/Transaction.js +160 -0
  73. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  74. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  75. package/dist/types/mod.d.ts +1 -0
  76. package/dist/types/mod.d.ts.map +1 -1
  77. package/dist/types/src/auth/Peer.d.ts +3 -7
  78. package/dist/types/src/auth/Peer.d.ts.map +1 -1
  79. package/dist/types/src/identity/IdentityClient.d.ts +0 -8
  80. package/dist/types/src/identity/IdentityClient.d.ts.map +1 -1
  81. package/dist/types/src/primitives/TransactionSignature.d.ts +16 -4
  82. package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
  83. package/dist/types/src/primitives/utils.d.ts +1 -0
  84. package/dist/types/src/primitives/utils.d.ts.map +1 -1
  85. package/dist/types/src/remittance/CommsLayer.d.ts +50 -0
  86. package/dist/types/src/remittance/CommsLayer.d.ts.map +1 -0
  87. package/dist/types/src/remittance/IdentityLayer.d.ts +35 -0
  88. package/dist/types/src/remittance/IdentityLayer.d.ts.map +1 -0
  89. package/dist/types/src/remittance/RemittanceManager.d.ts +452 -0
  90. package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -0
  91. package/dist/types/src/remittance/RemittanceModule.d.ts +106 -0
  92. package/dist/types/src/remittance/RemittanceModule.d.ts.map +1 -0
  93. package/dist/types/src/remittance/index.d.ts +7 -0
  94. package/dist/types/src/remittance/index.d.ts.map +1 -0
  95. package/dist/types/src/remittance/modules/BasicBRC29.d.ts +133 -0
  96. package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -0
  97. package/dist/types/src/remittance/modules/index.d.ts +2 -0
  98. package/dist/types/src/remittance/modules/index.d.ts.map +1 -0
  99. package/dist/types/src/remittance/types.d.ts +238 -0
  100. package/dist/types/src/remittance/types.d.ts.map +1 -0
  101. package/dist/types/src/script/OP.d.ts +5 -3
  102. package/dist/types/src/script/OP.d.ts.map +1 -1
  103. package/dist/types/src/script/Script.d.ts.map +1 -1
  104. package/dist/types/src/script/Spend.d.ts +7 -0
  105. package/dist/types/src/script/Spend.d.ts.map +1 -1
  106. package/dist/types/src/transaction/BeefTx.d.ts +2 -2
  107. package/dist/types/src/transaction/Transaction.d.ts +14 -0
  108. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  109. package/dist/types/src/wallet/Wallet.interfaces.d.ts +5 -5
  110. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
  111. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  112. package/dist/umd/bundle.js +13 -13
  113. package/dist/umd/bundle.js.map +1 -1
  114. package/docs/index.md +2 -14
  115. package/docs/reference/auth.md +6 -12
  116. package/docs/reference/primitives.md +20 -78
  117. package/docs/reference/remittance.md +2166 -0
  118. package/docs/reference/script.md +11 -3
  119. package/docs/reference/transaction.md +27 -1
  120. package/docs/reference/wallet.md +6 -5
  121. package/docs/remittance-getting-started.md +138 -0
  122. package/mod.ts +1 -0
  123. package/package.json +12 -3
  124. package/src/auth/Peer.ts +18 -29
  125. package/src/auth/__tests/Peer.test.ts +253 -1
  126. package/src/identity/IdentityClient.ts +29 -153
  127. package/src/identity/__tests/IdentityClient.test.ts +1 -289
  128. package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +7 -9
  129. package/src/primitives/TransactionSignature.ts +129 -10
  130. package/src/primitives/__tests/utils.test.ts +30 -7
  131. package/src/primitives/utils.ts +13 -129
  132. package/src/remittance/CommsLayer.ts +41 -0
  133. package/src/remittance/IdentityLayer.ts +32 -0
  134. package/src/remittance/RemittanceManager.ts +1672 -0
  135. package/src/remittance/RemittanceModule.ts +92 -0
  136. package/src/remittance/__tests/BasicBRC29.test.ts +188 -0
  137. package/src/remittance/__tests/RemittanceManager.test.ts +493 -0
  138. package/src/remittance/__tests/examples.ts +130 -0
  139. package/src/remittance/index.ts +6 -0
  140. package/src/remittance/modules/BasicBRC29.ts +361 -0
  141. package/src/remittance/modules/index.ts +1 -0
  142. package/src/remittance/types.ts +284 -0
  143. package/src/script/OP.ts +15 -13
  144. package/src/script/Script.ts +3 -1
  145. package/src/script/Spend.ts +128 -52
  146. package/src/script/__tests/Chronicle.test.ts +186 -0
  147. package/src/script/__tests/Spend.test.ts +1 -1
  148. package/src/script/__tests/SpendValildVectors.test.ts +63 -0
  149. package/src/script/__tests/lrshiftnum.test.ts +185 -0
  150. package/src/script/__tests/sighashTestData.ts +1031 -0
  151. package/src/script/__tests/spend.valid.vectors.ts +9 -16
  152. package/src/transaction/BeefTx.ts +3 -3
  153. package/src/transaction/Transaction.ts +186 -0
  154. package/src/transaction/__tests/Beef.test.ts +2 -0
  155. package/src/transaction/__tests/Transaction.test.ts +641 -3
  156. package/src/wallet/Wallet.interfaces.ts +5 -5
@@ -186,53 +186,7 @@ export function base64ToArray (msg: string): number[] {
186
186
  * @returns An array of numbers, each representing a byte in the UTF-8 encoded string.
187
187
  */
188
188
  function utf8ToArray (str: string): number[] {
189
- const result: number[] = []
190
-
191
- for (let i = 0; i < str.length; i++) {
192
- const cp = str.codePointAt(i)
193
- if (cp === undefined) {
194
- // Should never be out of range.
195
- throw new Error(`Index out of range: ${i}`)
196
- }
197
- let codePoint = cp
198
-
199
- if (codePoint > 0xFFFF) {
200
- // Valid surrogate pair => skip the next code unit because codePointAt
201
- // has already combined them into a single code point.
202
- i++
203
- } else {
204
- // Check if codePoint is a lone (unpaired) high surrogate or low surrogate.
205
- if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
206
- // Replace with the replacement character (U+FFFD).
207
- codePoint = 0xFFFD
208
- }
209
- }
210
-
211
- // Encode according to the UTF-8 standard
212
- if (codePoint <= 0x7F) {
213
- result.push(codePoint)
214
- } else if (codePoint <= 0x7FF) {
215
- result.push(
216
- 0xC0 | (codePoint >> 6),
217
- 0x80 | (codePoint & 0x3F)
218
- )
219
- } else if (codePoint <= 0xFFFF) {
220
- result.push(
221
- 0xE0 | (codePoint >> 12),
222
- 0x80 | ((codePoint >> 6) & 0x3F),
223
- 0x80 | (codePoint & 0x3F)
224
- )
225
- } else {
226
- result.push(
227
- 0xF0 | (codePoint >> 18),
228
- 0x80 | ((codePoint >> 12) & 0x3F),
229
- 0x80 | ((codePoint >> 6) & 0x3F),
230
- 0x80 | (codePoint & 0x3F)
231
- )
232
- }
233
- }
234
-
235
- return result
189
+ return Array.from(new TextEncoder().encode(str))
236
190
  }
237
191
 
238
192
  /**
@@ -241,86 +195,7 @@ function utf8ToArray (str: string): number[] {
241
195
  * @returns {string} - The UTF-8 encoded string.
242
196
  */
243
197
  export const toUTF8 = (arr: number[]): string => {
244
- let result = ''
245
- const replacementChar = '\uFFFD'
246
- for (let i = 0; i < arr.length; i++) {
247
- const byte1 = arr[i]
248
- if (byte1 <= 0x7f) {
249
- result += String.fromCharCode(byte1)
250
- continue
251
- }
252
- const emitReplacement = (): void => {
253
- result += replacementChar
254
- }
255
- if (byte1 >= 0xc0 && byte1 <= 0xdf) {
256
- if (i + 1 >= arr.length) {
257
- emitReplacement()
258
- continue
259
- }
260
- const byte2 = arr[i + 1]
261
- if ((byte2 & 0xc0) !== 0x80) {
262
- emitReplacement()
263
- i += 1
264
- continue
265
- }
266
- const codePoint = ((byte1 & 0x1f) << 6) | (byte2 & 0x3f)
267
- result += String.fromCharCode(codePoint)
268
- i += 1
269
- continue
270
- }
271
- if (byte1 >= 0xe0 && byte1 <= 0xef) {
272
- if (i + 2 >= arr.length) {
273
- emitReplacement()
274
- continue
275
- }
276
- const byte2 = arr[i + 1]
277
- const byte3 = arr[i + 2]
278
- if ((byte2 & 0xc0) !== 0x80 || (byte3 & 0xc0) !== 0x80) {
279
- emitReplacement()
280
- i += 2
281
- continue
282
- }
283
- const codePoint =
284
- ((byte1 & 0x0f) << 12) |
285
- ((byte2 & 0x3f) << 6) |
286
- (byte3 & 0x3f)
287
-
288
- result += String.fromCharCode(codePoint)
289
- i += 2
290
- continue
291
- }
292
- if (byte1 >= 0xf0 && byte1 <= 0xf7) {
293
- if (i + 3 >= arr.length) {
294
- emitReplacement()
295
- continue
296
- }
297
- const byte2 = arr[i + 1]
298
- const byte3 = arr[i + 2]
299
- const byte4 = arr[i + 3]
300
- if (
301
- (byte2 & 0xc0) !== 0x80 ||
302
- (byte3 & 0xc0) !== 0x80 ||
303
- (byte4 & 0xc0) !== 0x80
304
- ) {
305
- emitReplacement()
306
- i += 3
307
- continue
308
- }
309
- const codePoint =
310
- ((byte1 & 0x07) << 18) |
311
- ((byte2 & 0x3f) << 12) |
312
- ((byte3 & 0x3f) << 6) |
313
- (byte4 & 0x3f)
314
- const offset = codePoint - 0x10000
315
- const highSurrogate = 0xd800 + (offset >> 10)
316
- const lowSurrogate = 0xdc00 + (offset & 0x3ff)
317
- result += String.fromCharCode(highSurrogate, lowSurrogate)
318
- i += 3
319
- continue
320
- }
321
- emitReplacement()
322
- }
323
- return result
198
+ return new TextDecoder().decode(new Uint8Array(arr))
324
199
  }
325
200
 
326
201
  /**
@@ -546,6 +421,10 @@ export class Writer {
546
421
  return ret
547
422
  }
548
423
 
424
+ toHex (): string {
425
+ return this.toArray().map((n) => n.toString(16).padStart(2, '0')).join('')
426
+ }
427
+
549
428
  write (buf: WriterChunk): this {
550
429
  this.bufs.push(buf)
551
430
  this.length += buf.length
@@ -639,8 +518,13 @@ export class Writer {
639
518
  }
640
519
 
641
520
  writeUInt64LE (n: number): this {
642
- const buf = new BigNumber(n).toArray('be', 8)
643
- this.writeReverse(buf)
521
+ if (n === -1) {
522
+ // This value is used as a dummy satoshis value when serializing OTDA placeholder output for SIGHASH_SINGLE
523
+ this.write(new Array(8).fill(0xff))
524
+ } else {
525
+ const buf = new BigNumber(n).toArray('be', 8)
526
+ this.writeReverse(buf)
527
+ }
644
528
  return this
645
529
  }
646
530
 
@@ -0,0 +1,41 @@
1
+ import type { PeerMessage } from './types.js'
2
+ import type { PubKeyHex } from '../wallet/Wallet.interfaces.js'
3
+
4
+ /**
5
+ * Abstract communications layer.
6
+ *
7
+ * This intentionally mirrors the essential subset of message-box-client / MessageBoxClient.
8
+ * RemittanceManager never talks directly to HTTP/WebSockets – it only uses this interface.
9
+ */
10
+ export interface CommsLayer {
11
+ /**
12
+ * Sends a message over the store-and-forward channel. Returns the transport messageId.
13
+ */
14
+ sendMessage: (args: { recipient: PubKeyHex, messageBox: string, body: string }, hostOverride?: string) => Promise<string>
15
+
16
+ /**
17
+ * Sends a message over the live channel (e.g. WebSocket). Returns the transport messageId.
18
+ * Implementers may throw if live sending is not possible.
19
+ * RemittanceManager will fall back to sendMessage where appropriate.
20
+ */
21
+ sendLiveMessage?: (args: { recipient: PubKeyHex, messageBox: string, body: string }, hostOverride?: string) => Promise<string>
22
+
23
+ /**
24
+ * Lists pending messages for a message box.
25
+ */
26
+ listMessages: (args: { messageBox: string, host?: string }) => Promise<PeerMessage[]>
27
+
28
+ /**
29
+ * Acknowledges messages (deletes them from the server / inbox).
30
+ */
31
+ acknowledgeMessage: (args: { messageIds: string[] }) => Promise<void>
32
+
33
+ /**
34
+ * Optional live listener.
35
+ */
36
+ listenForLiveMessages?: (args: {
37
+ messageBox: string
38
+ overrideHost?: string
39
+ onMessage: (msg: PeerMessage) => void
40
+ }) => Promise<void>
41
+ }
@@ -0,0 +1,32 @@
1
+ import type {
2
+ IdentityVerificationRequest,
3
+ IdentityVerificationResponse,
4
+ IdentityVerificationAcknowledgment,
5
+ ThreadId,
6
+ ModuleContext,
7
+ Termination
8
+ } from './types.js'
9
+ import { PubKeyHex } from '../wallet/Wallet.interfaces.js'
10
+
11
+ /**
12
+ * The Identity Layer handles identity certificate exchange and verification.
13
+ * It is optional and pluggable.
14
+ * Modules can use it to request/verify identity before accepting settlements.
15
+ *
16
+ * The runtime configuration can be used to determine whether and at what point identity
17
+ * exchange occurs: before invoicing, before settlement, etc.
18
+ *
19
+ * Makers and takers can both implement this layer as needed, and request/respond to
20
+ * identity verification at different points in the protocol.
21
+ */
22
+ export interface IdentityLayer {
23
+ /** Determine which certificates to request from a counterparty. */
24
+ determineCertificatesToRequest: (args: { counterparty: PubKeyHex, threadId: ThreadId }, ctx: ModuleContext) => Promise<IdentityVerificationRequest>
25
+ /** Respond to an incoming identity verification request. */
26
+ respondToRequest: (
27
+ args: { counterparty: PubKeyHex, threadId: ThreadId, request: IdentityVerificationRequest },
28
+ ctx: ModuleContext
29
+ ) => Promise<{ action: 'respond', response: IdentityVerificationResponse } | { action: 'terminate', termination: Termination }>
30
+ /** Assess whether received certificates satisfy the requirements for transaction settlement. */
31
+ assessReceivedCertificateSufficiency: (counterparty: PubKeyHex, received: IdentityVerificationResponse, threadId: ThreadId) => Promise<IdentityVerificationAcknowledgment | Termination>
32
+ }