@opcat-labs/opcat 1.0.1 → 1.0.3
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/.cjs2esm.json +18 -0
- package/.mocharc.yaml +1 -1
- package/CHANGELOG.md +12 -0
- package/README.md +6 -0
- package/{lib/address.js → cjs/address.cjs} +77 -72
- package/cjs/block/block.cjs +332 -0
- package/{lib/block/blockheader.js → cjs/block/blockheader.cjs} +8 -7
- package/cjs/block/index.cjs +2 -0
- package/{lib/block/merkleblock.js → cjs/block/merkleblock.cjs} +23 -15
- package/cjs/bn.cjs +3411 -0
- package/{lib/crypto/bn.js → cjs/crypto/bn.cjs} +3 -3
- package/{lib/crypto/ecdsa.js → cjs/crypto/ecdsa.cjs} +150 -14
- package/{lib/crypto/hash.node.js → cjs/crypto/hash.cjs} +13 -2
- package/cjs/crypto/index.cjs +16 -0
- package/{lib/crypto/point.js → cjs/crypto/point.cjs} +11 -4
- package/cjs/crypto/random.cjs +18 -0
- package/{lib/crypto/signature.js → cjs/crypto/signature.cjs} +158 -8
- package/{lib/encoding/base58.js → cjs/encoding/base58.cjs} +58 -2
- package/cjs/encoding/base58check.cjs +192 -0
- package/cjs/encoding/bufferreader.cjs +333 -0
- package/cjs/encoding/bufferwriter.cjs +244 -0
- package/{lib/encoding/decode-asm.js → cjs/encoding/decode-asm.cjs} +4 -4
- package/{lib/encoding/decode-hex.js → cjs/encoding/decode-hex.cjs} +1 -1
- package/cjs/encoding/index.cjs +14 -0
- package/cjs/encoding/varint.cjs +116 -0
- package/{lib/errors/index.js → cjs/errors/index.cjs} +9 -9
- package/{lib/errors/spec.js → cjs/errors/spec.cjs} +2 -2
- package/cjs/hash-cache.cjs +98 -0
- package/{lib/hdprivatekey.js → cjs/hdprivatekey.cjs} +232 -140
- package/{lib/hdpublickey.js → cjs/hdpublickey.cjs} +120 -93
- package/cjs/index.cjs +94 -0
- package/cjs/interpreter/index.cjs +2 -0
- package/cjs/interpreter/interpreter.cjs +1988 -0
- package/{lib/script/stack.js → cjs/interpreter/stack.cjs} +9 -2
- package/{lib/message/message.js → cjs/message/message.cjs} +62 -25
- package/cjs/mnemonic/index.cjs +3 -0
- package/{lib/mnemonic/mnemonic.js → cjs/mnemonic/mnemonic.cjs} +44 -13
- package/{lib/mnemonic/pbkdf2.node.js → cjs/mnemonic/pbkdf2.cjs} +9 -2
- package/cjs/mnemonic/words/index.cjs +66 -0
- package/cjs/network.cjs +13 -0
- package/cjs/networks.cjs +321 -0
- package/{lib/opcode.js → cjs/opcode.cjs} +69 -5
- package/cjs/privatekey.cjs +422 -0
- package/{lib/publickey.js → cjs/publickey.cjs} +14 -16
- package/cjs/script/index.cjs +2 -0
- package/{lib/script/script.js → cjs/script/script.cjs} +322 -67
- package/cjs/transaction/index.cjs +5 -0
- package/cjs/transaction/input/index.cjs +34 -0
- package/cjs/transaction/input/input.cjs +396 -0
- package/{lib/transaction/input/multisig.js → cjs/transaction/input/multisig.cjs} +112 -18
- package/{lib/transaction/input/publickey.js → cjs/transaction/input/publickey.cjs} +29 -19
- package/{lib/transaction/input/publickeyhash.js → cjs/transaction/input/publickeyhash.cjs} +25 -17
- package/{lib/transaction/output.js → cjs/transaction/output.cjs} +100 -15
- package/cjs/transaction/sighash.cjs +187 -0
- package/{lib/transaction/signature.js → cjs/transaction/signature.cjs} +30 -6
- package/cjs/transaction/transaction.cjs +2000 -0
- package/{lib/transaction/unspentoutput.js → cjs/transaction/unspentoutput.cjs} +5 -5
- package/cjs/util/derivation.cjs +53 -0
- package/cjs/util/index.cjs +11 -0
- package/cjs/util/js.cjs +95 -0
- package/{lib/util/preconditions.js → cjs/util/preconditions.cjs} +2 -2
- package/esm/address.js +483 -0
- package/{lib → esm}/block/block.js +82 -27
- package/esm/block/blockheader.js +296 -0
- package/esm/block/index.js +2 -0
- package/esm/block/merkleblock.js +331 -0
- package/esm/bn.js +3411 -0
- package/esm/crypto/bn.js +278 -0
- package/esm/crypto/ecdsa.js +475 -0
- package/{lib/crypto/hash.browser.js → esm/crypto/hash.js} +18 -7
- package/esm/crypto/index.js +16 -0
- package/esm/crypto/point.js +228 -0
- package/esm/crypto/random.js +18 -0
- package/esm/crypto/signature.js +475 -0
- package/esm/encoding/base58.js +167 -0
- package/esm/encoding/base58check.js +192 -0
- package/esm/encoding/bufferreader.js +333 -0
- package/esm/encoding/bufferwriter.js +243 -0
- package/esm/encoding/decode-asm.js +24 -0
- package/esm/encoding/decode-hex.js +32 -0
- package/esm/encoding/decode-script-chunks.js +43 -0
- package/esm/encoding/encode-hex.js +284 -0
- package/esm/encoding/index.js +14 -0
- package/esm/encoding/is-hex.js +7 -0
- package/esm/encoding/varint.js +116 -0
- package/esm/errors/index.js +54 -0
- package/esm/errors/spec.js +314 -0
- package/esm/hash-cache.js +98 -0
- package/esm/hdprivatekey.js +768 -0
- package/esm/hdpublickey.js +549 -0
- package/esm/index.js +66 -0
- package/esm/interpreter/index.js +2 -0
- package/{lib/script → esm/interpreter}/interpreter.js +219 -66
- package/esm/interpreter/stack.js +116 -0
- package/esm/message/message.js +228 -0
- package/esm/mnemonic/index.js +3 -0
- package/esm/mnemonic/mnemonic.js +332 -0
- package/{lib/mnemonic/pbkdf2.browser.js → esm/mnemonic/pbkdf2.js} +13 -6
- package/esm/mnemonic/words/chinese.js +2054 -0
- package/esm/mnemonic/words/english.js +2054 -0
- package/esm/mnemonic/words/french.js +2054 -0
- package/esm/mnemonic/words/index.js +66 -0
- package/esm/mnemonic/words/italian.js +2054 -0
- package/esm/mnemonic/words/japanese.js +2054 -0
- package/esm/mnemonic/words/spanish.js +2054 -0
- package/esm/network.js +13 -0
- package/{lib → esm}/networks.js +61 -120
- package/esm/opcode.js +319 -0
- package/{lib → esm}/privatekey.js +76 -28
- package/esm/publickey.js +384 -0
- package/esm/script/index.js +2 -0
- package/esm/script/script.js +1329 -0
- package/esm/script/write-i32-le.js +17 -0
- package/esm/script/write-push-data.js +35 -0
- package/esm/script/write-u16-le.js +12 -0
- package/esm/script/write-u32-le.js +16 -0
- package/esm/script/write-u64-le.js +24 -0
- package/esm/script/write-u8-le.js +8 -0
- package/esm/script/write-varint.js +46 -0
- package/esm/transaction/index.js +5 -0
- package/esm/transaction/input/index.js +33 -0
- package/{lib → esm}/transaction/input/input.js +132 -90
- package/esm/transaction/input/multisig.js +335 -0
- package/esm/transaction/input/publickey.js +108 -0
- package/esm/transaction/input/publickeyhash.js +124 -0
- package/esm/transaction/output.js +316 -0
- package/{lib → esm}/transaction/sighash.js +42 -22
- package/esm/transaction/signature.js +120 -0
- package/{lib → esm}/transaction/transaction.js +522 -163
- package/esm/transaction/unspentoutput.js +112 -0
- package/esm/util/_.js +47 -0
- package/esm/util/derivation.js +53 -0
- package/esm/util/index.js +12 -0
- package/esm/util/js.js +95 -0
- package/esm/util/preconditions.js +33 -0
- package/fixup.cjs +17 -0
- package/package.json +18 -4
- package/test/{address.js → address.cjs} +14 -43
- package/test/block/{block.js → block.cjs} +3 -5
- package/test/block/{blockheader.js → blockheader.cjs} +2 -2
- package/test/block/{merklebloack.js → merklebloack.cjs} +2 -2
- package/test/crypto/{ecdsa.js → ecdsa.cjs} +9 -9
- package/test/crypto/{hash.browser.js → hash.browser.cjs} +2 -1
- package/test/crypto/{signature.js → signature.cjs} +2 -2
- package/test/data/bitcoind/script_tests.json +5 -5
- package/test/{hashCache.js → hashCache.cjs} +2 -1
- package/test/{hdkeys.js → hdkeys.cjs} +4 -2
- package/test/{hdprivatekey.js → hdprivatekey.cjs} +7 -6
- package/test/{hdpublickey.js → hdpublickey.cjs} +2 -7
- package/test/mnemonic/{pbkdf2.test.js → pbkdf2.test.cjs} +2 -2
- package/test/{networks.js → networks.cjs} +12 -31
- package/test/{publickey.js → publickey.cjs} +2 -2
- package/test/script/{interpreter.js → interpreter.cjs} +5 -5
- package/test/script/{script.js → script.cjs} +8 -2
- package/test/transaction/{deserialize.js → deserialize.cjs} +2 -2
- package/test/transaction/input/{input.js → input.cjs} +1 -1
- package/test/transaction/input/{multisig.js → multisig.cjs} +2 -1
- package/test/transaction/input/{publickeyhash.js → publickeyhash.cjs} +1 -1
- package/test/transaction/{sighash.js → sighash.cjs} +1 -1
- package/test/transaction/{transaction.js → transaction.cjs} +2 -2
- package/tsconfig.json +13 -0
- package/types/address.d.cts +252 -0
- package/types/block/block.d.cts +139 -0
- package/types/block/blockheader.d.cts +125 -0
- package/types/block/index.d.cts +2 -0
- package/types/block/merkleblock.d.cts +95 -0
- package/types/bn.d.cts +202 -0
- package/types/crypto/bn.d.cts +2 -0
- package/types/crypto/ecdsa.d.cts +187 -0
- package/types/crypto/hash.d.cts +118 -0
- package/types/crypto/index.d.cts +7 -0
- package/types/crypto/point.d.cts +134 -0
- package/types/crypto/random.d.cts +13 -0
- package/types/crypto/signature.d.cts +160 -0
- package/types/encoding/base58.d.cts +106 -0
- package/types/encoding/base58check.d.cts +107 -0
- package/types/encoding/bufferreader.d.cts +164 -0
- package/types/encoding/bufferwriter.d.cts +126 -0
- package/types/encoding/decode-asm.d.cts +2 -0
- package/types/encoding/decode-hex.d.cts +2 -0
- package/types/encoding/decode-script-chunks.d.cts +14 -0
- package/types/encoding/encode-hex.d.cts +2 -0
- package/types/encoding/index.d.cts +6 -0
- package/types/encoding/is-hex.d.cts +2 -0
- package/types/encoding/varint.d.cts +66 -0
- package/types/errors/index.d.cts +4 -0
- package/types/errors/spec.d.cts +22 -0
- package/types/hash-cache.d.cts +65 -0
- package/types/hdprivatekey.d.cts +281 -0
- package/types/hdpublickey.d.cts +240 -0
- package/types/index.d.cts +26 -0
- package/types/interpreter/index.d.cts +2 -0
- package/types/interpreter/interpreter.d.cts +228 -0
- package/types/interpreter/stack.d.cts +35 -0
- package/types/message/message.d.cts +110 -0
- package/types/mnemonic/index.d.cts +2 -0
- package/types/mnemonic/mnemonic.d.cts +171 -0
- package/types/mnemonic/pbkdf2.d.cts +14 -0
- package/types/mnemonic/words/chinese.d.cts +2 -0
- package/types/mnemonic/words/english.d.cts +2 -0
- package/types/mnemonic/words/french.d.cts +2 -0
- package/types/mnemonic/words/index.d.cts +22 -0
- package/types/mnemonic/words/italian.d.cts +2 -0
- package/types/mnemonic/words/japanese.d.cts +2 -0
- package/types/mnemonic/words/spanish.d.cts +2 -0
- package/types/network.d.cts +11 -0
- package/types/networks.d.cts +76 -0
- package/types/opcode.d.cts +93 -0
- package/types/privatekey.d.cts +169 -0
- package/types/publickey.d.cts +202 -0
- package/types/script/index.d.cts +2 -0
- package/types/script/script.d.cts +449 -0
- package/types/script/write-i32-le.d.cts +2 -0
- package/types/script/write-push-data.d.cts +2 -0
- package/types/script/write-u16-le.d.cts +2 -0
- package/types/script/write-u32-le.d.cts +2 -0
- package/types/script/write-u64-le.d.cts +2 -0
- package/types/script/write-u8-le.d.cts +2 -0
- package/types/script/write-varint.d.cts +2 -0
- package/types/transaction/index.d.cts +2 -0
- package/types/transaction/input/index.d.cts +2 -0
- package/types/transaction/input/input.d.cts +178 -0
- package/types/transaction/input/multisig.d.cts +127 -0
- package/types/transaction/input/publickey.d.cts +44 -0
- package/types/transaction/input/publickeyhash.d.cts +45 -0
- package/types/transaction/output.d.cts +118 -0
- package/types/transaction/sighash.d.cts +61 -0
- package/types/transaction/signature.d.cts +43 -0
- package/types/transaction/transaction.d.cts +716 -0
- package/types/transaction/unspentoutput.d.cts +83 -0
- package/types/util/_.d.cts +26 -0
- package/types/util/derivation.d.cts +21 -0
- package/types/util/index.d.cts +5 -0
- package/types/util/js.d.cts +50 -0
- package/types/util/preconditions.d.cts +3 -0
- package/index.d.ts +0 -1541
- package/index.js +0 -74
- package/lib/block/index.js +0 -4
- package/lib/bn.js +0 -3423
- package/lib/crypto/hash.js +0 -2
- package/lib/crypto/random.browser.js +0 -28
- package/lib/crypto/random.js +0 -2
- package/lib/crypto/random.node.js +0 -11
- package/lib/encoding/base58check.js +0 -121
- package/lib/encoding/bufferreader.js +0 -212
- package/lib/encoding/bufferwriter.js +0 -140
- package/lib/encoding/varint.js +0 -75
- package/lib/hash-cache.js +0 -50
- package/lib/mnemonic/pbkdf2.js +0 -2
- package/lib/mnemonic/words/index.js +0 -8
- package/lib/script/index.js +0 -5
- package/lib/transaction/index.js +0 -7
- package/lib/transaction/input/index.js +0 -5
- package/lib/util/js.js +0 -90
- /package/{lib/encoding/decode-script-chunks.js → cjs/encoding/decode-script-chunks.cjs} +0 -0
- /package/{lib/encoding/encode-hex.js → cjs/encoding/encode-hex.cjs} +0 -0
- /package/{lib/encoding/is-hex.js → cjs/encoding/is-hex.cjs} +0 -0
- /package/{lib/mnemonic/words/chinese.js → cjs/mnemonic/words/chinese.cjs} +0 -0
- /package/{lib/mnemonic/words/english.js → cjs/mnemonic/words/english.cjs} +0 -0
- /package/{lib/mnemonic/words/french.js → cjs/mnemonic/words/french.cjs} +0 -0
- /package/{lib/mnemonic/words/italian.js → cjs/mnemonic/words/italian.cjs} +0 -0
- /package/{lib/mnemonic/words/japanese.js → cjs/mnemonic/words/japanese.cjs} +0 -0
- /package/{lib/mnemonic/words/spanish.js → cjs/mnemonic/words/spanish.cjs} +0 -0
- /package/{lib/script/write-i32-le.js → cjs/script/write-i32-le.cjs} +0 -0
- /package/{lib/script/write-push-data.js → cjs/script/write-push-data.cjs} +0 -0
- /package/{lib/script/write-u16-le.js → cjs/script/write-u16-le.cjs} +0 -0
- /package/{lib/script/write-u32-le.js → cjs/script/write-u32-le.cjs} +0 -0
- /package/{lib/script/write-u64-le.js → cjs/script/write-u64-le.cjs} +0 -0
- /package/{lib/script/write-u8-le.js → cjs/script/write-u8-le.cjs} +0 -0
- /package/{lib/script/write-varint.js → cjs/script/write-varint.cjs} +0 -0
- /package/{lib/util/_.js → cjs/util/_.cjs} +0 -0
- /package/test/crypto/{bn.js → bn.cjs} +0 -0
- /package/test/crypto/{hash.js → hash.cjs} +0 -0
- /package/test/crypto/{point.js → point.cjs} +0 -0
- /package/test/crypto/{random.js → random.cjs} +0 -0
- /package/test/data/{blk86756-testnet.js → blk86756-testnet.cjs} +0 -0
- /package/test/data/{merkleblocks.js → merkleblocks.cjs} +0 -0
- /package/test/encoding/{base58.js → base58.cjs} +0 -0
- /package/test/encoding/{base58check.js → base58check.cjs} +0 -0
- /package/test/encoding/{bufferreader.js → bufferreader.cjs} +0 -0
- /package/test/encoding/{bufferwriter.js → bufferwriter.cjs} +0 -0
- /package/test/encoding/{varint.js → varint.cjs} +0 -0
- /package/test/{index.js → index.cjs} +0 -0
- /package/test/message/{message.js → message.cjs} +0 -0
- /package/test/mnemonic/{mnemonic.js → mnemonic.cjs} +0 -0
- /package/test/{opcode.js → opcode.cjs} +0 -0
- /package/test/{privatekey.js → privatekey.cjs} +0 -0
- /package/test/transaction/input/{publickey.js → publickey.cjs} +0 -0
- /package/test/transaction/{output.js → output.cjs} +0 -0
- /package/test/transaction/{signature.js → signature.cjs} +0 -0
- /package/test/transaction/{unspentoutput.js → unspentoutput.cjs} +0 -0
- /package/test/util/{js.js → js.cjs} +0 -0
- /package/test/util/{preconditions.js → preconditions.cjs} +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function writeI32LE(writer, n) {
|
|
2
|
+
if (n < -2147483648 || n > 2147483647)
|
|
3
|
+
throw new Error('Out of range. It must be >= -2147483648 and <= 2147483647.');
|
|
4
|
+
|
|
5
|
+
const buffer = new Uint8Array(4);
|
|
6
|
+
buffer[0] = n % 256;
|
|
7
|
+
n = Math.floor(n / 256);
|
|
8
|
+
buffer[1] = n % 256;
|
|
9
|
+
n = n >> 8;
|
|
10
|
+
buffer[2] = n % 256;
|
|
11
|
+
n = n >> 8;
|
|
12
|
+
buffer[3] = n;
|
|
13
|
+
|
|
14
|
+
return writer.write(buffer);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default writeI32LE;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function writePushData(writer, buffer) {
|
|
2
|
+
// It is possible to optimize buffers that only store numbers 1-16, or -1, by using the OP_N opcodes.
|
|
3
|
+
// But we say "push data" is always stored using OP_0 or OP_PUSH(N) so that it's easy to identify and
|
|
4
|
+
// extract, and also because there is some ambiguity around OP_0 if we don't do this.
|
|
5
|
+
if (buffer.length === 0) {
|
|
6
|
+
writer.write([0]);
|
|
7
|
+
} else if (buffer.length <= 75) {
|
|
8
|
+
writer.write([buffer.length]); // OP_PUSH(buffer.length)
|
|
9
|
+
writer.write(buffer);
|
|
10
|
+
} else if (buffer.length <= 0xff) {
|
|
11
|
+
writer.write([76, buffer.length]); // OP_PUSHDATA1
|
|
12
|
+
writer.write(buffer);
|
|
13
|
+
} else if (buffer.length <= 0xffff) {
|
|
14
|
+
writer.write([77, buffer.length % 256, buffer.length >> 8]); // OP_PUSHDATA2
|
|
15
|
+
writer.write(buffer);
|
|
16
|
+
} else if (buffer.length <= 0xffffffff) {
|
|
17
|
+
const prefix = new Uint8Array(5);
|
|
18
|
+
prefix[0] = 78; // OP_PUSHDATA4
|
|
19
|
+
let n = buffer.length;
|
|
20
|
+
prefix[1] = n % 256;
|
|
21
|
+
n = Math.floor(n / 256);
|
|
22
|
+
prefix[2] = n % 256;
|
|
23
|
+
n = Math.floor(n / 256);
|
|
24
|
+
prefix[3] = n % 256;
|
|
25
|
+
n = Math.floor(n / 256);
|
|
26
|
+
prefix[4] = n;
|
|
27
|
+
writer.write(prefix);
|
|
28
|
+
writer.write(buffer);
|
|
29
|
+
} else {
|
|
30
|
+
throw new Error('data too large');
|
|
31
|
+
}
|
|
32
|
+
return writer;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default writePushData;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function writeU32LE(writer, n) {
|
|
2
|
+
if (n > 0xffffffff) throw new Error('number too large');
|
|
3
|
+
|
|
4
|
+
const buffer = new Uint8Array(4);
|
|
5
|
+
buffer[0] = n % 256;
|
|
6
|
+
n = Math.floor(n / 256);
|
|
7
|
+
buffer[1] = n % 256;
|
|
8
|
+
n = n >> 8;
|
|
9
|
+
buffer[2] = n % 256;
|
|
10
|
+
n = n >> 8;
|
|
11
|
+
buffer[3] = n;
|
|
12
|
+
|
|
13
|
+
return writer.write(buffer);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default writeU32LE;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function writeU64LE(writer, n) {
|
|
2
|
+
if (n > Number.MAX_SAFE_INTEGER) throw new Error('number too large');
|
|
3
|
+
|
|
4
|
+
const buffer = new Uint8Array(8);
|
|
5
|
+
buffer[0] = n % 256;
|
|
6
|
+
n = Math.floor(n / 256);
|
|
7
|
+
buffer[1] = n % 256;
|
|
8
|
+
n = Math.floor(n / 256);
|
|
9
|
+
buffer[2] = n % 256;
|
|
10
|
+
n = Math.floor(n / 256);
|
|
11
|
+
buffer[3] = n % 256;
|
|
12
|
+
n = Math.floor(n / 256);
|
|
13
|
+
buffer[4] = n % 256;
|
|
14
|
+
n = Math.floor(n / 256);
|
|
15
|
+
buffer[5] = n % 256;
|
|
16
|
+
n = n >> 8;
|
|
17
|
+
buffer[6] = n % 256;
|
|
18
|
+
n = n >> 8;
|
|
19
|
+
buffer[7] = n;
|
|
20
|
+
|
|
21
|
+
return writer.write(buffer);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default writeU64LE;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
function writeVarint(writer, n) {
|
|
2
|
+
if (n > Number.MAX_SAFE_INTEGER) throw new Error('varint too large');
|
|
3
|
+
|
|
4
|
+
if (n <= 0xfc) {
|
|
5
|
+
return writer.write([n]);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
if (n <= 0xffff) {
|
|
9
|
+
return writer.write([0xfd, n % 256, Math.floor(n / 256)]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (n <= 0xffffffff) {
|
|
13
|
+
const buffer = new Uint8Array(5);
|
|
14
|
+
buffer[0] = 0xfe;
|
|
15
|
+
buffer[1] = n % 256;
|
|
16
|
+
n = Math.floor(n / 256);
|
|
17
|
+
buffer[2] = n % 256;
|
|
18
|
+
n = Math.floor(n / 256);
|
|
19
|
+
buffer[3] = n % 256;
|
|
20
|
+
n = Math.floor(n / 256);
|
|
21
|
+
buffer[4] = n;
|
|
22
|
+
return writer.write(buffer);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// n <= 0xffffffffffffffff
|
|
26
|
+
const buffer = new Uint8Array(9);
|
|
27
|
+
buffer[0] = 0xff;
|
|
28
|
+
buffer[1] = n % 256;
|
|
29
|
+
n = Math.floor(n / 256);
|
|
30
|
+
buffer[2] = n % 256;
|
|
31
|
+
n = Math.floor(n / 256);
|
|
32
|
+
buffer[3] = n % 256;
|
|
33
|
+
n = Math.floor(n / 256);
|
|
34
|
+
buffer[4] = n % 256;
|
|
35
|
+
n = Math.floor(n / 256);
|
|
36
|
+
buffer[5] = n % 256;
|
|
37
|
+
n = Math.floor(n / 256);
|
|
38
|
+
buffer[6] = n % 256;
|
|
39
|
+
n = Math.floor(n / 256);
|
|
40
|
+
buffer[7] = n % 256;
|
|
41
|
+
n = Math.floor(n / 256);
|
|
42
|
+
buffer[8] = n;
|
|
43
|
+
return writer.write(buffer);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default writeVarint;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
import Input from './input.js';
|
|
3
|
+
import PublicKeyInput from './publickey.js';
|
|
4
|
+
import PublicKeyHashInput from './publickeyhash.js';
|
|
5
|
+
import MultiSigInput from './multisig.js';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Attaches the PublicKeyInput class to the Input namespace.
|
|
10
|
+
* @memberof Input
|
|
11
|
+
* @name PublicKey
|
|
12
|
+
* @alias PublicKeyInput
|
|
13
|
+
*/
|
|
14
|
+
Input.PublicKey = PublicKeyInput;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Attaches the PublicKeyHashInput class to the Input namespace.
|
|
19
|
+
* @memberof Input
|
|
20
|
+
* @name PublicKeyHash
|
|
21
|
+
* @alias PublicKeyHashInput
|
|
22
|
+
*/
|
|
23
|
+
Input.PublicKeyHash = PublicKeyHashInput;
|
|
24
|
+
/**
|
|
25
|
+
* Attaches the PublicKeyHashInput class to the Input namespace.
|
|
26
|
+
* @memberof Input
|
|
27
|
+
* @name MultiSig
|
|
28
|
+
* @alias MultiSigInput
|
|
29
|
+
*/
|
|
30
|
+
Input.MultiSig = MultiSigInput;
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
export default Input;
|
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var Opcode = require('../../opcode');
|
|
16
|
-
const PrivateKey = require('../../privatekey');
|
|
3
|
+
import _ from '../../util/_.js';
|
|
4
|
+
import $ from '../../util/preconditions.js';
|
|
5
|
+
import errors from '../../errors/index.js';
|
|
6
|
+
import BufferWriter from '../../encoding/bufferwriter.js';
|
|
7
|
+
import JSUtil from '../../util/js.js';
|
|
8
|
+
import Script from '../../script/index.js';
|
|
9
|
+
import Sighash from '../sighash.js';
|
|
10
|
+
import Output from '../output.js';
|
|
11
|
+
import Signature from '../../crypto/signature.js';
|
|
12
|
+
import TransactionSignature from '../signature.js';
|
|
13
|
+
import Hash from '../../crypto/hash.js';
|
|
14
|
+
import PrivateKey from '../../privatekey.js';
|
|
17
15
|
|
|
18
16
|
var MAXINT = 0xffffffff; // Math.pow(2, 32) - 1;
|
|
19
17
|
var DEFAULT_RBF_SEQNUMBER = MAXINT - 2;
|
|
20
18
|
var DEFAULT_SEQNUMBER = MAXINT;
|
|
21
19
|
var DEFAULT_LOCKTIME_SEQNUMBER = MAXINT - 1;
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
tx.nLockTime++;
|
|
35
|
-
} while (i < Number.MAX_SAFE_INTEGER);
|
|
36
|
-
}
|
|
37
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Creates an Input instance from parameters.
|
|
23
|
+
* @constructor
|
|
24
|
+
* @param {Object} params - Input parameters object
|
|
25
|
+
* @param {string|Buffer} params.prevTxId - Previous transaction ID (hex string or Buffer)
|
|
26
|
+
* @param {number} params.outputIndex - Output index in previous transaction
|
|
27
|
+
* @param {Output} [params.output] - Output instance or output parameters
|
|
28
|
+
* @param {number} [params.sequenceNumber] - Sequence number (defaults to DEFAULT_SEQNUMBER)
|
|
29
|
+
* @param {Script|Buffer|string} [params.script] - Script instance, buffer or hex string
|
|
30
|
+
* @returns {Input} New Input instance or initialized instance if params provided.
|
|
31
|
+
*/
|
|
38
32
|
function Input(params) {
|
|
39
33
|
if (!(this instanceof Input)) {
|
|
40
34
|
return new Input(params);
|
|
@@ -51,6 +45,12 @@ Input.DEFAULT_RBF_SEQNUMBER = DEFAULT_RBF_SEQNUMBER;
|
|
|
51
45
|
// txid + output index + sequence number
|
|
52
46
|
Input.BASE_SIZE = 32 + 4 + 4;
|
|
53
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Gets or sets the script associated with this input.
|
|
50
|
+
* @memberof Input.prototype
|
|
51
|
+
* @name script
|
|
52
|
+
* @return {Script}
|
|
53
|
+
*/
|
|
54
54
|
Object.defineProperty(Input.prototype, 'script', {
|
|
55
55
|
configurable: false,
|
|
56
56
|
enumerable: true,
|
|
@@ -66,15 +66,40 @@ Object.defineProperty(Input.prototype, 'script', {
|
|
|
66
66
|
},
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Creates an Input instance from a plain JavaScript object.
|
|
71
|
+
* @param {Object} params - Input parameters object
|
|
72
|
+
* @param {string|Buffer} params.prevTxId - Previous transaction ID (hex string or Buffer)
|
|
73
|
+
* @param {number} params.outputIndex - Output index in previous transaction
|
|
74
|
+
* @param {Output} [params.output] - Output instance or output parameters
|
|
75
|
+
* @param {number} [params.sequenceNumber] - Sequence number (defaults to DEFAULT_SEQNUMBER)
|
|
76
|
+
* @param {Script|Buffer|string} [params.script] - Script instance, buffer or hex string
|
|
77
|
+
* @returns {Input} The created Input instance.
|
|
78
|
+
* @throws {Error} Will throw if the argument is not an object.
|
|
79
|
+
*/
|
|
80
|
+
Input.fromObject = function (params) {
|
|
81
|
+
$.checkArgument(_.isObject(params));
|
|
71
82
|
var input = new Input();
|
|
72
|
-
return input._fromObject(
|
|
83
|
+
return input._fromObject(params);
|
|
73
84
|
};
|
|
74
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Creates an Input instance from an object containing transaction input parameters.
|
|
88
|
+
* Validates required fields (prevTxId, outputIndex) and converts hex strings to Buffers.
|
|
89
|
+
* Handles optional parameters with defaults (sequenceNumber, script).
|
|
90
|
+
* @param {Object} params - Input parameters object
|
|
91
|
+
* @param {string|Buffer} params.prevTxId - Previous transaction ID (hex string or Buffer)
|
|
92
|
+
* @param {number} params.outputIndex - Output index in previous transaction
|
|
93
|
+
* @param {Output} [params.output] - Output instance or output parameters
|
|
94
|
+
* @param {number} [params.sequenceNumber] - Sequence number (defaults to DEFAULT_SEQNUMBER)
|
|
95
|
+
* @param {Script|Buffer|string} [params.script] - Script instance, buffer or hex string
|
|
96
|
+
* @throws {errors.Transaction.Input.InvalidParams} If required params are missing
|
|
97
|
+
* @returns {Input} Returns the Input instance for chaining
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
75
100
|
Input.prototype._fromObject = function (params) {
|
|
76
101
|
|
|
77
|
-
if(_.isUndefined(params.prevTxId)
|
|
102
|
+
if(_.isUndefined(params.prevTxId)
|
|
78
103
|
|| _.isUndefined(params.outputIndex)) {
|
|
79
104
|
throw new errors.Transaction.Input.InvalidParams('require prevTxId and outputIndex');
|
|
80
105
|
}
|
|
@@ -100,6 +125,14 @@ Input.prototype._fromObject = function (params) {
|
|
|
100
125
|
return this;
|
|
101
126
|
};
|
|
102
127
|
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Converts the Input instance to a plain object for JSON serialization.
|
|
131
|
+
* Includes prevTxId, outputIndex, sequenceNumber, and script as hex strings.
|
|
132
|
+
* Optionally adds human-readable scriptString if script is valid,
|
|
133
|
+
* and includes the output object if present.
|
|
134
|
+
* @returns {Object} A plain object representation of the Input.
|
|
135
|
+
*/
|
|
103
136
|
Input.prototype.toObject = Input.prototype.toJSON = function toObject() {
|
|
104
137
|
var obj = {
|
|
105
138
|
prevTxId: this.prevTxId.toString('hex'),
|
|
@@ -117,6 +150,17 @@ Input.prototype.toObject = Input.prototype.toJSON = function toObject() {
|
|
|
117
150
|
return obj;
|
|
118
151
|
};
|
|
119
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Creates an Input instance from a BufferReader.
|
|
155
|
+
* @param {BufferReader} br - The buffer reader containing input data.
|
|
156
|
+
* @returns {Input} The parsed Input object with properties:
|
|
157
|
+
* - prevTxId: Reversed 32-byte previous transaction ID.
|
|
158
|
+
* - outputIndex: LE uint32 output index.
|
|
159
|
+
* - _scriptBuffer: Var-length script buffer.
|
|
160
|
+
* - sequenceNumber: LE uint32 sequence number.
|
|
161
|
+
* @note TODO: Return specialized input types (CoinbaseInput, PublicKeyHashInput, etc.).
|
|
162
|
+
* @static
|
|
163
|
+
*/
|
|
120
164
|
Input.fromBufferReader = function (br) {
|
|
121
165
|
var input = new Input();
|
|
122
166
|
input.prevTxId = br.readReverse(32);
|
|
@@ -128,6 +172,12 @@ Input.fromBufferReader = function (br) {
|
|
|
128
172
|
return input;
|
|
129
173
|
};
|
|
130
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Serializes the input to a BufferWriter.
|
|
177
|
+
* @param {boolean} hashScriptSig - Whether to hash the script (true) or include it directly (false).
|
|
178
|
+
* @param {BufferWriter} [writer] - Optional BufferWriter instance to write to.
|
|
179
|
+
* @returns {BufferWriter} The BufferWriter containing the serialized input.
|
|
180
|
+
*/
|
|
131
181
|
Input.prototype.toBufferWriter = function (hashScriptSig, writer) {
|
|
132
182
|
$.checkArgument(typeof hashScriptSig === 'boolean', 'hashScriptSig should be boolean')
|
|
133
183
|
if (!writer) {
|
|
@@ -147,6 +197,10 @@ Input.prototype.toBufferWriter = function (hashScriptSig, writer) {
|
|
|
147
197
|
}
|
|
148
198
|
|
|
149
199
|
|
|
200
|
+
/**
|
|
201
|
+
* Converts the input to a prevout format (txid + output index) as a buffer.
|
|
202
|
+
* @returns {Buffer} The serialized prevout data.
|
|
203
|
+
*/
|
|
150
204
|
Input.prototype.toPrevout = function () {
|
|
151
205
|
let writer = new BufferWriter()
|
|
152
206
|
writer.writeReverse(this.prevTxId)
|
|
@@ -155,6 +209,12 @@ Input.prototype.toPrevout = function () {
|
|
|
155
209
|
}
|
|
156
210
|
|
|
157
211
|
|
|
212
|
+
/**
|
|
213
|
+
* Sets the script for this input.
|
|
214
|
+
* @param {Script|string|Buffer|null} script - Can be a Script object, hex string, human-readable string, Buffer, or null (for empty script)
|
|
215
|
+
* @returns {Input} Returns the Input instance for chaining
|
|
216
|
+
* @throws {TypeError} If script is of invalid type
|
|
217
|
+
*/
|
|
158
218
|
Input.prototype.setScript = function (script) {
|
|
159
219
|
this._script = null;
|
|
160
220
|
if (script instanceof Script) {
|
|
@@ -189,7 +249,6 @@ Input.prototype.setScript = function (script) {
|
|
|
189
249
|
* @param {PrivateKey | Array} privateKeys - the private key to use when signing
|
|
190
250
|
* @param {number} inputIndex - the index of this input in the provided transaction
|
|
191
251
|
* @param {number} sigType - defaults to Signature.SIGHASH_ALL
|
|
192
|
-
* @abstract
|
|
193
252
|
*/
|
|
194
253
|
Input.prototype.getSignatures = function (transaction, privateKeys, inputIndex, sigtype) {
|
|
195
254
|
$.checkState(this.output instanceof Output);
|
|
@@ -246,37 +305,62 @@ Input.prototype.getSignatures = function (transaction, privateKeys, inputIndex,
|
|
|
246
305
|
* @param {number} inputIndex - the index of this input in the provided transaction
|
|
247
306
|
* @param {number} sigType - defaults to Signature.SIGHASH_ALL
|
|
248
307
|
* @param {boolean} isLowS - true if the sig hash is safe for low s.
|
|
249
|
-
* @abstract
|
|
250
308
|
*/
|
|
251
309
|
Input.prototype.getPreimage = function (transaction, inputIndex, sigtype, isLowS) {
|
|
252
310
|
$.checkState(this.output instanceof Output);
|
|
253
311
|
sigtype = sigtype || Signature.SIGHASH_ALL;
|
|
254
312
|
isLowS = isLowS || false;
|
|
255
313
|
return isLowS
|
|
256
|
-
?
|
|
314
|
+
? Sighash.getLowSSighashPreimage(transaction, sigtype, inputIndex)
|
|
257
315
|
: Sighash.sighashPreimage(transaction, sigtype, inputIndex);
|
|
258
316
|
};
|
|
259
317
|
|
|
318
|
+
/**
|
|
319
|
+
* Abstract method that throws an error when invoked. Must be implemented by subclasses
|
|
320
|
+
* to determine if all required signatures are present on this input.
|
|
321
|
+
* @throws {AbstractMethodInvoked} Always throws to indicate abstract method usage
|
|
322
|
+
* @abstract
|
|
323
|
+
*/
|
|
260
324
|
Input.prototype.isFullySigned = function () {
|
|
261
325
|
throw new errors.AbstractMethodInvoked('Input#isFullySigned');
|
|
262
326
|
};
|
|
263
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Checks if the input is final (has maximum sequence number).
|
|
330
|
+
* @returns {boolean} True if the input is final, false otherwise.
|
|
331
|
+
*/
|
|
264
332
|
Input.prototype.isFinal = function () {
|
|
265
333
|
return this.sequenceNumber === Input.MAXINT;
|
|
266
334
|
};
|
|
267
335
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
336
|
+
/**
|
|
337
|
+
* Abstract method to add a signature to the transaction input.
|
|
338
|
+
* Must be implemented by concrete input types.
|
|
339
|
+
* @param {Object} transaction - The transaction to sign
|
|
340
|
+
* @param {Object} signature - The signature to add
|
|
341
|
+
* @abstract
|
|
342
|
+
*/
|
|
343
|
+
Input.prototype.addSignature = function (_transaction, _signature) {
|
|
272
344
|
};
|
|
273
345
|
|
|
346
|
+
/**
|
|
347
|
+
* Clears all signatures from the input.
|
|
348
|
+
* @abstract
|
|
349
|
+
*/
|
|
274
350
|
Input.prototype.clearSignatures = function () {
|
|
275
|
-
|
|
351
|
+
|
|
276
352
|
};
|
|
277
353
|
|
|
354
|
+
/**
|
|
355
|
+
* Verifies if a signature is valid for this input in the given transaction.
|
|
356
|
+
* Note: Temporarily modifies the signature object by setting nhashtype from sigtype.
|
|
357
|
+
*
|
|
358
|
+
* @param {Object} transaction - The transaction to verify against
|
|
359
|
+
* @param {TransactionSignature} signature - Signature object containing signature, publicKey, etc.
|
|
360
|
+
* @returns {boolean} True if the signature is valid, false otherwise
|
|
361
|
+
*/
|
|
278
362
|
Input.prototype.isValidSignature = function (transaction, signature) {
|
|
279
|
-
|
|
363
|
+
// FIXME: Refactor signature so this is not necessary
|
|
280
364
|
signature.signature.nhashtype = signature.sigtype;
|
|
281
365
|
return Sighash.verify(
|
|
282
366
|
transaction,
|
|
@@ -299,56 +383,14 @@ Input.prototype.isNull = function () {
|
|
|
299
383
|
);
|
|
300
384
|
};
|
|
301
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Estimates the size of the input in bytes by converting it to a buffer.
|
|
388
|
+
* @returns {number} The length of the serialized buffer in bytes.
|
|
389
|
+
* @private
|
|
390
|
+
*/
|
|
302
391
|
Input.prototype._estimateSize = function () {
|
|
303
392
|
return this.toBufferWriter(false).toBuffer().length;
|
|
304
393
|
};
|
|
305
394
|
|
|
306
|
-
Input.prototype.verify = function (transaction, inputIndex) {
|
|
307
|
-
$.checkState(this.output instanceof Output);
|
|
308
|
-
$.checkState(this.script instanceof Script);
|
|
309
|
-
$.checkState(this.output.script instanceof Script);
|
|
310
|
-
|
|
311
|
-
var us = this.script;
|
|
312
|
-
var ls = this.output.script;
|
|
313
|
-
var inputSatoshis = this.output.satoshisBN;
|
|
314
|
-
|
|
315
|
-
Interpreter.MAX_SCRIPT_ELEMENT_SIZE = Number.MAX_SAFE_INTEGER;
|
|
316
|
-
Interpreter.MAXIMUM_ELEMENT_SIZE = Number.MAX_SAFE_INTEGER;
|
|
317
|
-
|
|
318
|
-
const bsi = new Interpreter();
|
|
319
|
-
|
|
320
|
-
let failedAt = {};
|
|
321
|
-
|
|
322
|
-
bsi.stepListener = function (step) {
|
|
323
|
-
if (
|
|
324
|
-
step.fExec ||
|
|
325
|
-
(Opcode.OP_IF <= step.opcode.toNumber() && step.opcode.toNumber() <= Opcode.OP_ENDIF)
|
|
326
|
-
) {
|
|
327
|
-
if (
|
|
328
|
-
(Opcode.OP_IF <= step.opcode.toNumber() && step.opcode.toNumber() <= Opcode.OP_ENDIF) ||
|
|
329
|
-
step.opcode.toNumber() === Opcode.OP_RETURN
|
|
330
|
-
) {
|
|
331
|
-
/** Opreturn */ failedAt.opcode = step.opcode;
|
|
332
|
-
} else {
|
|
333
|
-
failedAt = step;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
var success = bsi.verify(
|
|
339
|
-
us,
|
|
340
|
-
ls,
|
|
341
|
-
transaction,
|
|
342
|
-
inputIndex,
|
|
343
|
-
Interpreter.DEFAULT_FLAGS,
|
|
344
|
-
inputSatoshis,
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
if (failedAt.opcode) {
|
|
348
|
-
failedAt.opcode = failedAt.opcode.toNumber();
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
return { success, error: bsi.errstr, failedAt: success ? {} : failedAt };
|
|
352
|
-
};
|
|
353
395
|
|
|
354
|
-
|
|
396
|
+
export default Input;
|