@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.
- package/dist/cjs/mod.js +1 -0
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +2 -3
- package/dist/cjs/src/auth/Peer.js +18 -20
- package/dist/cjs/src/auth/Peer.js.map +1 -1
- package/dist/cjs/src/identity/IdentityClient.js +20 -124
- package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +115 -10
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/primitives/utils.js +13 -112
- package/dist/cjs/src/primitives/utils.js.map +1 -1
- package/dist/cjs/src/remittance/CommsLayer.js +3 -0
- package/dist/cjs/src/remittance/CommsLayer.js.map +1 -0
- package/dist/cjs/src/remittance/IdentityLayer.js +3 -0
- package/dist/cjs/src/remittance/IdentityLayer.js.map +1 -0
- package/dist/cjs/src/remittance/RemittanceManager.js +1245 -0
- package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -0
- package/dist/cjs/src/remittance/RemittanceModule.js +3 -0
- package/dist/cjs/src/remittance/RemittanceModule.js.map +1 -0
- package/dist/cjs/src/remittance/index.js +23 -0
- package/dist/cjs/src/remittance/index.js.map +1 -0
- package/dist/cjs/src/remittance/modules/BasicBRC29.js +225 -0
- package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -0
- package/dist/cjs/src/remittance/modules/index.js +18 -0
- package/dist/cjs/src/remittance/modules/index.js.map +1 -0
- package/dist/cjs/src/remittance/types.js +22 -0
- package/dist/cjs/src/remittance/types.js.map +1 -0
- package/dist/cjs/src/script/OP.js +15 -13
- package/dist/cjs/src/script/OP.js.map +1 -1
- package/dist/cjs/src/script/Script.js +4 -1
- package/dist/cjs/src/script/Script.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +128 -46
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/transaction/BeefTx.js +2 -2
- package/dist/cjs/src/transaction/Transaction.js +160 -0
- package/dist/cjs/src/transaction/Transaction.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/mod.js +1 -0
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/auth/Peer.js +18 -20
- package/dist/esm/src/auth/Peer.js.map +1 -1
- package/dist/esm/src/identity/IdentityClient.js +20 -124
- package/dist/esm/src/identity/IdentityClient.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +115 -10
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/primitives/utils.js +13 -112
- package/dist/esm/src/primitives/utils.js.map +1 -1
- package/dist/esm/src/remittance/CommsLayer.js +2 -0
- package/dist/esm/src/remittance/CommsLayer.js.map +1 -0
- package/dist/esm/src/remittance/IdentityLayer.js +2 -0
- package/dist/esm/src/remittance/IdentityLayer.js.map +1 -0
- package/dist/esm/src/remittance/RemittanceManager.js +1254 -0
- package/dist/esm/src/remittance/RemittanceManager.js.map +1 -0
- package/dist/esm/src/remittance/RemittanceModule.js +2 -0
- package/dist/esm/src/remittance/RemittanceModule.js.map +1 -0
- package/dist/esm/src/remittance/index.js +7 -0
- package/dist/esm/src/remittance/index.js.map +1 -0
- package/dist/esm/src/remittance/modules/BasicBRC29.js +227 -0
- package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -0
- package/dist/esm/src/remittance/modules/index.js +2 -0
- package/dist/esm/src/remittance/modules/index.js.map +1 -0
- package/dist/esm/src/remittance/types.js +19 -0
- package/dist/esm/src/remittance/types.js.map +1 -0
- package/dist/esm/src/script/OP.js +15 -13
- package/dist/esm/src/script/OP.js.map +1 -1
- package/dist/esm/src/script/Script.js +4 -1
- package/dist/esm/src/script/Script.js.map +1 -1
- package/dist/esm/src/script/Spend.js +129 -46
- package/dist/esm/src/script/Spend.js.map +1 -1
- package/dist/esm/src/transaction/BeefTx.js +3 -3
- package/dist/esm/src/transaction/BeefTx.js.map +1 -1
- package/dist/esm/src/transaction/Transaction.js +160 -0
- package/dist/esm/src/transaction/Transaction.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/mod.d.ts +1 -0
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/auth/Peer.d.ts +3 -7
- package/dist/types/src/auth/Peer.d.ts.map +1 -1
- package/dist/types/src/identity/IdentityClient.d.ts +0 -8
- package/dist/types/src/identity/IdentityClient.d.ts.map +1 -1
- package/dist/types/src/primitives/TransactionSignature.d.ts +16 -4
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
- package/dist/types/src/primitives/utils.d.ts +1 -0
- package/dist/types/src/primitives/utils.d.ts.map +1 -1
- package/dist/types/src/remittance/CommsLayer.d.ts +50 -0
- package/dist/types/src/remittance/CommsLayer.d.ts.map +1 -0
- package/dist/types/src/remittance/IdentityLayer.d.ts +35 -0
- package/dist/types/src/remittance/IdentityLayer.d.ts.map +1 -0
- package/dist/types/src/remittance/RemittanceManager.d.ts +452 -0
- package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -0
- package/dist/types/src/remittance/RemittanceModule.d.ts +106 -0
- package/dist/types/src/remittance/RemittanceModule.d.ts.map +1 -0
- package/dist/types/src/remittance/index.d.ts +7 -0
- package/dist/types/src/remittance/index.d.ts.map +1 -0
- package/dist/types/src/remittance/modules/BasicBRC29.d.ts +133 -0
- package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -0
- package/dist/types/src/remittance/modules/index.d.ts +2 -0
- package/dist/types/src/remittance/modules/index.d.ts.map +1 -0
- package/dist/types/src/remittance/types.d.ts +238 -0
- package/dist/types/src/remittance/types.d.ts.map +1 -0
- package/dist/types/src/script/OP.d.ts +5 -3
- package/dist/types/src/script/OP.d.ts.map +1 -1
- package/dist/types/src/script/Script.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts +7 -0
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- package/dist/types/src/transaction/BeefTx.d.ts +2 -2
- package/dist/types/src/transaction/Transaction.d.ts +14 -0
- package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
- package/dist/types/src/wallet/Wallet.interfaces.d.ts +5 -5
- package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +13 -13
- package/dist/umd/bundle.js.map +1 -1
- package/docs/index.md +2 -14
- package/docs/reference/auth.md +6 -12
- package/docs/reference/primitives.md +20 -78
- package/docs/reference/remittance.md +2166 -0
- package/docs/reference/script.md +11 -3
- package/docs/reference/transaction.md +27 -1
- package/docs/reference/wallet.md +6 -5
- package/docs/remittance-getting-started.md +138 -0
- package/mod.ts +1 -0
- package/package.json +12 -3
- package/src/auth/Peer.ts +18 -29
- package/src/auth/__tests/Peer.test.ts +253 -1
- package/src/identity/IdentityClient.ts +29 -153
- package/src/identity/__tests/IdentityClient.test.ts +1 -289
- package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +7 -9
- package/src/primitives/TransactionSignature.ts +129 -10
- package/src/primitives/__tests/utils.test.ts +30 -7
- package/src/primitives/utils.ts +13 -129
- package/src/remittance/CommsLayer.ts +41 -0
- package/src/remittance/IdentityLayer.ts +32 -0
- package/src/remittance/RemittanceManager.ts +1672 -0
- package/src/remittance/RemittanceModule.ts +92 -0
- package/src/remittance/__tests/BasicBRC29.test.ts +188 -0
- package/src/remittance/__tests/RemittanceManager.test.ts +493 -0
- package/src/remittance/__tests/examples.ts +130 -0
- package/src/remittance/index.ts +6 -0
- package/src/remittance/modules/BasicBRC29.ts +361 -0
- package/src/remittance/modules/index.ts +1 -0
- package/src/remittance/types.ts +284 -0
- package/src/script/OP.ts +15 -13
- package/src/script/Script.ts +3 -1
- package/src/script/Spend.ts +128 -52
- package/src/script/__tests/Chronicle.test.ts +186 -0
- package/src/script/__tests/Spend.test.ts +1 -1
- package/src/script/__tests/SpendValildVectors.test.ts +63 -0
- package/src/script/__tests/lrshiftnum.test.ts +185 -0
- package/src/script/__tests/sighashTestData.ts +1031 -0
- package/src/script/__tests/spend.valid.vectors.ts +9 -16
- package/src/transaction/BeefTx.ts +3 -3
- package/src/transaction/Transaction.ts +186 -0
- package/src/transaction/__tests/Beef.test.ts +2 -0
- package/src/transaction/__tests/Transaction.test.ts +641 -3
- package/src/wallet/Wallet.interfaces.ts +5 -5
package/src/primitives/utils.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
643
|
-
|
|
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
|
+
}
|