@bsv/sdk 2.0.14 → 2.0.15
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/package.json +14 -14
- package/dist/cjs/src/primitives/Hash.js +1 -1
- package/dist/cjs/src/primitives/Hash.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +10 -3
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/script/Script.js +60 -13
- package/dist/cjs/src/script/Script.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +434 -59
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js +6 -2
- package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js +8 -4
- package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/primitives/Hash.js +1 -1
- package/dist/esm/src/primitives/Hash.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +10 -3
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/script/Script.js +60 -13
- package/dist/esm/src/script/Script.js.map +1 -1
- package/dist/esm/src/script/Spend.js +438 -59
- package/dist/esm/src/script/Spend.js.map +1 -1
- package/dist/esm/src/transaction/http/BinaryFetchClient.js +6 -2
- package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
- package/dist/esm/src/transaction/http/DefaultHttpClient.js +8 -4
- package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/primitives/TransactionSignature.d.ts +1 -0
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
- package/dist/types/src/script/Script.d.ts +1 -0
- package/dist/types/src/script/Script.d.ts.map +1 -1
- package/dist/types/src/script/ScriptChunk.d.ts +1 -0
- package/dist/types/src/script/ScriptChunk.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts +29 -0
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- package/dist/types/src/transaction/http/BinaryFetchClient.d.ts.map +1 -1
- package/dist/types/src/transaction/http/DefaultHttpClient.d.ts +2 -2
- package/dist/types/src/transaction/http/DefaultHttpClient.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +3 -4
- package/docs/reference/primitives.md +1 -0
- package/docs/reference/script.md +7 -0
- package/docs/reference/transaction.md +2 -2
- package/package.json +14 -14
- package/src/primitives/Hash.ts +1 -1
- package/src/primitives/TransactionSignature.ts +11 -3
- package/src/script/Script.ts +59 -13
- package/src/script/ScriptChunk.ts +1 -0
- package/src/script/Spend.ts +483 -61
- package/src/script/__tests/NormativeVectors.test.ts +465 -0
- package/src/script/__tests/fixtures/SOURCES.md +25 -0
- package/src/script/__tests/fixtures/bitcoin-sv/script_tests.json +2591 -0
- package/src/script/__tests/fixtures/bitcoin-sv/sighash.json +1003 -0
- package/src/script/__tests/fixtures/bitcoin-sv/tx_invalid.json +285 -0
- package/src/script/__tests/fixtures/bitcoin-sv/tx_valid.json +367 -0
- package/src/script/__tests/fixtures/teranode/script_tests.json +2432 -0
- package/src/script/__tests/fixtures/teranode/sighash.json +1003 -0
- package/src/script/__tests/fixtures/teranode/tx_invalid.json +285 -0
- package/src/script/__tests/fixtures/teranode/tx_valid.json +367 -0
- package/src/transaction/broadcasters/__tests/ARC.test.ts +26 -4
- package/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.ts +26 -4
- package/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.ts +32 -10
- package/src/transaction/http/BinaryFetchClient.ts +5 -2
- package/src/transaction/http/DefaultHttpClient.ts +7 -4
- package/src/transaction/http/__tests/DefaultHttpClient.additional.test.ts +19 -1
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js +0 -827
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +0 -1
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.test.js +0 -266
- package/dist/cjs/src/auth/clients/__tests__/AuthFetch.test.js.map +0 -1
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +0 -654
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +0 -1
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js +0 -144
- package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +0 -1
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js +0 -825
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.additional.test.js.map +0 -1
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.test.js +0 -264
- package/dist/esm/src/auth/clients/__tests__/AuthFetch.test.js.map +0 -1
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js +0 -619
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.js.map +0 -1
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js +0 -109
- package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +0 -1
- package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts +0 -21
- package/dist/types/src/auth/clients/__tests__/AuthFetch.additional.test.d.ts.map +0 -1
- package/dist/types/src/auth/clients/__tests__/AuthFetch.test.d.ts +0 -2
- package/dist/types/src/auth/clients/__tests__/AuthFetch.test.d.ts.map +0 -1
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts +0 -2
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.additional.test.d.ts.map +0 -1
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.test.d.ts +0 -2
- package/dist/types/src/auth/transports/__tests__/SimplifiedFetchTransport.test.d.ts.map +0 -1
- package/dist/umd/bundle.js.map +0 -1
|
@@ -4948,6 +4948,7 @@ export default class TransactionSignature extends Signature {
|
|
|
4948
4948
|
static formatBip143(params: TransactionSignatureFormatParams): Uint8Array
|
|
4949
4949
|
static format(params: TransactionSignatureFormatParams): number[]
|
|
4950
4950
|
static formatBytes(params: TransactionSignatureFormatParams): Uint8Array
|
|
4951
|
+
static usesOtdaSingleBug(params: TransactionSignatureFormatParams): boolean
|
|
4951
4952
|
static fromChecksigFormat(buf: number[]): TransactionSignature
|
|
4952
4953
|
constructor(r: BigNumber, s: BigNumber, scope: number)
|
|
4953
4954
|
public hasLowS(): boolean
|
package/docs/reference/script.md
CHANGED
|
@@ -45,6 +45,7 @@ A representation of a chunk of a script, which includes an opcode. For push oper
|
|
|
45
45
|
export default interface ScriptChunk {
|
|
46
46
|
op: number;
|
|
47
47
|
data?: number[];
|
|
48
|
+
invalidLength?: boolean;
|
|
48
49
|
}
|
|
49
50
|
```
|
|
50
51
|
|
|
@@ -804,10 +805,14 @@ export default class Spend {
|
|
|
804
805
|
stack: number[][];
|
|
805
806
|
altStack: number[][];
|
|
806
807
|
ifStack: boolean[];
|
|
808
|
+
elseStack: boolean[];
|
|
807
809
|
memoryLimit: number;
|
|
808
810
|
stackMem: number;
|
|
809
811
|
altStackMem: number;
|
|
810
812
|
isRelaxedOverride: boolean;
|
|
813
|
+
verifyFlags?: Set<string>;
|
|
814
|
+
executedOpCount: number;
|
|
815
|
+
returningFromConditional: boolean;
|
|
811
816
|
constructor(params: {
|
|
812
817
|
sourceTXID: string;
|
|
813
818
|
sourceOutputIndex: number;
|
|
@@ -822,6 +827,7 @@ export default class Spend {
|
|
|
822
827
|
lockTime: number;
|
|
823
828
|
memoryLimit?: number;
|
|
824
829
|
isRelaxed?: boolean;
|
|
830
|
+
verifyFlags?: string | string[];
|
|
825
831
|
})
|
|
826
832
|
reset(): void
|
|
827
833
|
step(): boolean
|
|
@@ -848,6 +854,7 @@ constructor(params: {
|
|
|
848
854
|
lockTime: number;
|
|
849
855
|
memoryLimit?: number;
|
|
850
856
|
isRelaxed?: boolean;
|
|
857
|
+
verifyFlags?: string | string[];
|
|
851
858
|
})
|
|
852
859
|
```
|
|
853
860
|
See also: [LockingScript](./script.md#class-lockingscript), [TransactionInput](./transaction.md#interface-transactioninput), [TransactionOutput](./transaction.md#interface-transactionoutput), [UnlockingScript](./script.md#class-unlockingscript)
|
|
@@ -2455,8 +2455,8 @@ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](
|
|
|
2455
2455
|
### Function: defaultHttpClient
|
|
2456
2456
|
|
|
2457
2457
|
Returns a default HttpClient implementation based on the environment that it is run on.
|
|
2458
|
-
This method will attempt to use `window.fetch` if available (in browser environments)
|
|
2459
|
-
|
|
2458
|
+
This method will attempt to use `window.fetch` if available (in browser environments),
|
|
2459
|
+
then `globalThis.fetch` (service workers, Deno, Node 18+), then the Node `https` module.
|
|
2460
2460
|
|
|
2461
2461
|
```ts
|
|
2462
2462
|
export function defaultHttpClient(): HttpClient
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsv/sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.15",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "BSV Blockchain Software Development Kit",
|
|
6
6
|
"main": "dist/cjs/mod.js",
|
|
@@ -251,23 +251,23 @@
|
|
|
251
251
|
},
|
|
252
252
|
"homepage": "https://github.com/bsv-blockchain/ts-sdk#readme",
|
|
253
253
|
"devDependencies": {
|
|
254
|
-
"@eslint/js": "^
|
|
255
|
-
"@jest/globals": "^30.
|
|
256
|
-
"@rspack/cli": "^
|
|
257
|
-
"@rspack/core": "^
|
|
254
|
+
"@eslint/js": "^10.0.1",
|
|
255
|
+
"@jest/globals": "^30.3.0",
|
|
256
|
+
"@rspack/cli": "^2.0.0",
|
|
257
|
+
"@rspack/core": "^2.0.0",
|
|
258
258
|
"@types/jest": "^30.0.0",
|
|
259
|
-
"@types/node": "^
|
|
260
|
-
"eslint": "^
|
|
261
|
-
"globals": "^
|
|
262
|
-
"jest": "^30.
|
|
263
|
-
"jest-environment-jsdom": "^30.
|
|
264
|
-
"ts-jest": "^29.4.
|
|
265
|
-
"ts-loader": "^9.5.
|
|
259
|
+
"@types/node": "^25.6.0",
|
|
260
|
+
"eslint": "^10.2.1",
|
|
261
|
+
"globals": "^17.5.0",
|
|
262
|
+
"jest": "^30.3.0",
|
|
263
|
+
"jest-environment-jsdom": "^30.3.0",
|
|
264
|
+
"ts-jest": "^29.4.9",
|
|
265
|
+
"ts-loader": "^9.5.7",
|
|
266
266
|
"ts-standard": "^12.0.2",
|
|
267
267
|
"ts2md": "^0.2.8",
|
|
268
268
|
"tsconfig-to-dual-package": "^1.2.0",
|
|
269
|
-
"typescript": "^
|
|
270
|
-
"typescript-eslint": "^8.
|
|
269
|
+
"typescript": "^6.0.3",
|
|
270
|
+
"typescript-eslint": "^8.59.0"
|
|
271
271
|
},
|
|
272
272
|
"ts-standard": {
|
|
273
273
|
"project": "tsconfig.eslint.json",
|
package/src/primitives/Hash.ts
CHANGED
|
@@ -327,7 +327,7 @@ function zero8 (word: string): string {
|
|
|
327
327
|
|
|
328
328
|
function bytesToHex (data: Uint8Array): string {
|
|
329
329
|
let res = ''
|
|
330
|
-
for (const b of data) res += (b.toString(16).padStart(2, '0')
|
|
330
|
+
for (const b of data) res += (b.toString(16).padStart(2, '0'))
|
|
331
331
|
return res
|
|
332
332
|
}
|
|
333
333
|
|
|
@@ -3,7 +3,6 @@ import BigNumber from './BigNumber.js'
|
|
|
3
3
|
import * as Hash from './Hash.js'
|
|
4
4
|
import { toArray, Writer } from './utils.js'
|
|
5
5
|
import Script from '../script/Script.js'
|
|
6
|
-
import OP from '../script/OP.js'
|
|
7
6
|
import TransactionInput from '../transaction/TransactionInput.js'
|
|
8
7
|
import TransactionOutput from '../transaction/TransactionOutput.js'
|
|
9
8
|
|
|
@@ -56,8 +55,8 @@ export default class TransactionSignature extends Signature {
|
|
|
56
55
|
const isNone = (params.scope & 31) === TransactionSignature.SIGHASH_NONE
|
|
57
56
|
const isAll = (params.scope & 31) === TransactionSignature.SIGHASH_ALL || (!isSingle && !isNone)
|
|
58
57
|
|
|
59
|
-
const subscript =
|
|
60
|
-
subscript.
|
|
58
|
+
const subscript = Script.fromBinary(params.subscript.toBinary())
|
|
59
|
+
subscript.removeCodeseparators()
|
|
61
60
|
|
|
62
61
|
const currentInput = {
|
|
63
62
|
sourceTXID: params.sourceTXID,
|
|
@@ -332,6 +331,15 @@ export default class TransactionSignature extends Signature {
|
|
|
332
331
|
return new Uint8Array(0)
|
|
333
332
|
}
|
|
334
333
|
|
|
334
|
+
static usesOtdaSingleBug (params: TransactionSignatureFormatParams): boolean {
|
|
335
|
+
const hasForkId = (params.scope & TransactionSignature.SIGHASH_FORKID) !== 0
|
|
336
|
+
const hasChronicle = params.ignoreChronicle !== true && (params.scope & TransactionSignature.SIGHASH_CHRONICLE) !== 0
|
|
337
|
+
const usesOtda = !hasForkId || (hasForkId && hasChronicle)
|
|
338
|
+
return usesOtda &&
|
|
339
|
+
(params.scope & 31) === TransactionSignature.SIGHASH_SINGLE &&
|
|
340
|
+
params.inputIndex >= params.outputs.length
|
|
341
|
+
}
|
|
342
|
+
|
|
335
343
|
// The format used in a tx
|
|
336
344
|
static fromChecksigFormat (buf: number[]): TransactionSignature {
|
|
337
345
|
if (buf.length === 0) {
|
package/src/script/Script.ts
CHANGED
|
@@ -335,14 +335,11 @@ export default class Script {
|
|
|
335
335
|
* @returns This script instance for chaining.
|
|
336
336
|
*/
|
|
337
337
|
removeCodeseparators (): Script {
|
|
338
|
-
this.
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
this.chunks = chunks
|
|
338
|
+
const bytes = this.toUint8Array()
|
|
339
|
+
this.rawBytesCache = Uint8Array.from(Script.removeOpcodeBytes(bytes, OP.OP_CODESEPARATOR))
|
|
340
|
+
this.hexCache = undefined
|
|
341
|
+
this._chunks = []
|
|
342
|
+
this.parsed = false
|
|
346
343
|
return this
|
|
347
344
|
}
|
|
348
345
|
|
|
@@ -585,18 +582,22 @@ export default class Script {
|
|
|
585
582
|
const end = Math.min(pos + len, length)
|
|
586
583
|
chunks.push({
|
|
587
584
|
data: Script.copyRange(bytes, pos, end),
|
|
588
|
-
op
|
|
585
|
+
op,
|
|
586
|
+
invalidLength: end - pos !== len
|
|
589
587
|
})
|
|
590
588
|
pos = end
|
|
591
589
|
} else if (op === OP.OP_PUSHDATA1) {
|
|
592
|
-
const
|
|
590
|
+
const hasLength = pos < length
|
|
591
|
+
const len = hasLength ? bytes[pos++] ?? 0 : 0
|
|
593
592
|
const end = Math.min(pos + len, length)
|
|
594
593
|
chunks.push({
|
|
595
594
|
data: Script.copyRange(bytes, pos, end),
|
|
596
|
-
op
|
|
595
|
+
op,
|
|
596
|
+
invalidLength: !hasLength || end - pos !== len
|
|
597
597
|
})
|
|
598
598
|
pos = end
|
|
599
599
|
} else if (op === OP.OP_PUSHDATA2) {
|
|
600
|
+
const hasLength = pos + 1 < length
|
|
600
601
|
const b0 = bytes[pos] ?? 0
|
|
601
602
|
const b1 = bytes[pos + 1] ?? 0
|
|
602
603
|
const len = b0 | (b1 << 8)
|
|
@@ -604,10 +605,12 @@ export default class Script {
|
|
|
604
605
|
const end = Math.min(pos + len, length)
|
|
605
606
|
chunks.push({
|
|
606
607
|
data: Script.copyRange(bytes, pos, end),
|
|
607
|
-
op
|
|
608
|
+
op,
|
|
609
|
+
invalidLength: !hasLength || end - pos !== len
|
|
608
610
|
})
|
|
609
611
|
pos = end
|
|
610
612
|
} else if (op === OP.OP_PUSHDATA4) {
|
|
613
|
+
const hasLength = pos + 3 < length
|
|
611
614
|
const len =
|
|
612
615
|
((bytes[pos] ?? 0) |
|
|
613
616
|
((bytes[pos + 1] ?? 0) << 8) |
|
|
@@ -618,7 +621,8 @@ export default class Script {
|
|
|
618
621
|
const end = Math.min(pos + len, length)
|
|
619
622
|
chunks.push({
|
|
620
623
|
data: Script.copyRange(bytes, pos, end),
|
|
621
|
-
op
|
|
624
|
+
op,
|
|
625
|
+
invalidLength: !hasLength || end - pos !== len
|
|
622
626
|
})
|
|
623
627
|
pos = end
|
|
624
628
|
} else {
|
|
@@ -629,6 +633,48 @@ export default class Script {
|
|
|
629
633
|
return chunks
|
|
630
634
|
}
|
|
631
635
|
|
|
636
|
+
private static removeOpcodeBytes (bytes: ArrayLike<number>, opcode: number): number[] {
|
|
637
|
+
const out: number[] = []
|
|
638
|
+
const length = bytes.length
|
|
639
|
+
let pos = 0
|
|
640
|
+
|
|
641
|
+
while (pos < length) {
|
|
642
|
+
const start = pos
|
|
643
|
+
const op = bytes[pos++] ?? 0
|
|
644
|
+
let dataStart = pos
|
|
645
|
+
let dataLength = 0
|
|
646
|
+
|
|
647
|
+
if (op > 0 && op < OP.OP_PUSHDATA1) {
|
|
648
|
+
dataLength = op
|
|
649
|
+
} else if (op === OP.OP_PUSHDATA1) {
|
|
650
|
+
if (pos < length) dataLength = bytes[pos++] ?? 0
|
|
651
|
+
dataStart = pos
|
|
652
|
+
} else if (op === OP.OP_PUSHDATA2) {
|
|
653
|
+
if (pos + 1 < length) dataLength = (bytes[pos] ?? 0) | ((bytes[pos + 1] ?? 0) << 8)
|
|
654
|
+
pos = Math.min(pos + 2, length)
|
|
655
|
+
dataStart = pos
|
|
656
|
+
} else if (op === OP.OP_PUSHDATA4) {
|
|
657
|
+
if (pos + 3 < length) {
|
|
658
|
+
dataLength =
|
|
659
|
+
((bytes[pos] ?? 0) |
|
|
660
|
+
((bytes[pos + 1] ?? 0) << 8) |
|
|
661
|
+
((bytes[pos + 2] ?? 0) << 16) |
|
|
662
|
+
((bytes[pos + 3] ?? 0) << 24)) >>> 0
|
|
663
|
+
}
|
|
664
|
+
pos = Math.min(pos + 4, length)
|
|
665
|
+
dataStart = pos
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
const end = Math.min(dataStart + dataLength, length)
|
|
669
|
+
if (op !== opcode) {
|
|
670
|
+
for (let i = start; i < end; i++) out.push(bytes[i] ?? 0)
|
|
671
|
+
}
|
|
672
|
+
pos = end
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
return out
|
|
676
|
+
}
|
|
677
|
+
|
|
632
678
|
private static copyRange (
|
|
633
679
|
bytes: ArrayLike<number>,
|
|
634
680
|
start: number,
|