@exodus/bitcoinjs-lib-forks 0.0.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.
- package/CHANGELOG.md +3 -0
- package/LICENSE +21 -0
- package/README.md +207 -0
- package/package.json +67 -0
- package/src/address.js +97 -0
- package/src/block.js +177 -0
- package/src/bufferutils.js +56 -0
- package/src/crypto.js +29 -0
- package/src/ecdsa.js +161 -0
- package/src/ecpair.js +131 -0
- package/src/ecsignature.js +97 -0
- package/src/hdnode.js +316 -0
- package/src/index.js +23 -0
- package/src/networks.js +47 -0
- package/src/script.js +214 -0
- package/src/script_number.js +68 -0
- package/src/templates/index.js +74 -0
- package/src/templates/multisig/index.js +4 -0
- package/src/templates/multisig/input.js +71 -0
- package/src/templates/multisig/output.js +64 -0
- package/src/templates/nulldata.js +34 -0
- package/src/templates/pubkey/index.js +4 -0
- package/src/templates/pubkey/input.js +39 -0
- package/src/templates/pubkey/output.js +33 -0
- package/src/templates/pubkeyhash/index.js +4 -0
- package/src/templates/pubkeyhash/input.js +51 -0
- package/src/templates/pubkeyhash/output.js +42 -0
- package/src/templates/scripthash/index.js +4 -0
- package/src/templates/scripthash/input.js +84 -0
- package/src/templates/scripthash/output.js +34 -0
- package/src/templates/witnesscommitment/index.js +3 -0
- package/src/templates/witnesscommitment/output.js +42 -0
- package/src/templates/witnesspubkeyhash/index.js +4 -0
- package/src/templates/witnesspubkeyhash/input.js +44 -0
- package/src/templates/witnesspubkeyhash/output.js +33 -0
- package/src/templates/witnessscripthash/index.js +4 -0
- package/src/templates/witnessscripthash/input.js +63 -0
- package/src/templates/witnessscripthash/output.js +33 -0
- package/src/transaction.js +547 -0
- package/src/transaction_builder.js +825 -0
- package/src/types.js +53 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// {signature} {pubKey}
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var typeforce = require('typeforce')
|
|
5
|
+
|
|
6
|
+
function check (script) {
|
|
7
|
+
var chunks = bscript.decompile(script)
|
|
8
|
+
|
|
9
|
+
return chunks.length === 2 &&
|
|
10
|
+
bscript.isCanonicalSignature(chunks[0]) &&
|
|
11
|
+
bscript.isCanonicalPubKey(chunks[1])
|
|
12
|
+
}
|
|
13
|
+
check.toJSON = function () { return 'pubKeyHash input' }
|
|
14
|
+
|
|
15
|
+
function encodeStack (signature, pubKey) {
|
|
16
|
+
typeforce({
|
|
17
|
+
signature: bscript.isCanonicalSignature,
|
|
18
|
+
pubKey: bscript.isCanonicalPubKey
|
|
19
|
+
}, {
|
|
20
|
+
signature: signature,
|
|
21
|
+
pubKey: pubKey
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
return [signature, pubKey]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function encode (signature, pubKey) {
|
|
28
|
+
return bscript.compile(encodeStack(signature, pubKey))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function decodeStack (stack) {
|
|
32
|
+
typeforce(check, stack)
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
signature: stack[0],
|
|
36
|
+
pubKey: stack[1]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function decode (buffer) {
|
|
41
|
+
var stack = bscript.decompile(buffer)
|
|
42
|
+
return decodeStack(stack)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = {
|
|
46
|
+
check: check,
|
|
47
|
+
decode: decode,
|
|
48
|
+
decodeStack: decodeStack,
|
|
49
|
+
encode: encode,
|
|
50
|
+
encodeStack: encodeStack
|
|
51
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// OP_DUP OP_HASH160 {pubKeyHash} OP_EQUALVERIFY OP_CHECKSIG
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var types = require('../../types')
|
|
5
|
+
var typeforce = require('typeforce')
|
|
6
|
+
var OPS = require('bitcoin-ops')
|
|
7
|
+
|
|
8
|
+
function check (script) {
|
|
9
|
+
var buffer = bscript.compile(script)
|
|
10
|
+
|
|
11
|
+
return buffer.length === 25 &&
|
|
12
|
+
buffer[0] === OPS.OP_DUP &&
|
|
13
|
+
buffer[1] === OPS.OP_HASH160 &&
|
|
14
|
+
buffer[2] === 0x14 &&
|
|
15
|
+
buffer[23] === OPS.OP_EQUALVERIFY &&
|
|
16
|
+
buffer[24] === OPS.OP_CHECKSIG
|
|
17
|
+
}
|
|
18
|
+
check.toJSON = function () { return 'pubKeyHash output' }
|
|
19
|
+
|
|
20
|
+
function encode (pubKeyHash) {
|
|
21
|
+
typeforce(types.Hash160bit, pubKeyHash)
|
|
22
|
+
|
|
23
|
+
return bscript.compile([
|
|
24
|
+
OPS.OP_DUP,
|
|
25
|
+
OPS.OP_HASH160,
|
|
26
|
+
pubKeyHash,
|
|
27
|
+
OPS.OP_EQUALVERIFY,
|
|
28
|
+
OPS.OP_CHECKSIG
|
|
29
|
+
])
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function decode (buffer) {
|
|
33
|
+
typeforce(check, buffer)
|
|
34
|
+
|
|
35
|
+
return buffer.slice(3, 23)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
check: check,
|
|
40
|
+
decode: decode,
|
|
41
|
+
encode: encode
|
|
42
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// <scriptSig> {serialized scriptPubKey script}
|
|
2
|
+
|
|
3
|
+
var Buffer = require('safe-buffer').Buffer
|
|
4
|
+
var bscript = require('../../script')
|
|
5
|
+
var typeforce = require('typeforce')
|
|
6
|
+
|
|
7
|
+
var p2ms = require('../multisig/')
|
|
8
|
+
var p2pk = require('../pubkey/')
|
|
9
|
+
var p2pkh = require('../pubkeyhash/')
|
|
10
|
+
var p2wpkho = require('../witnesspubkeyhash/output')
|
|
11
|
+
var p2wsho = require('../witnessscripthash/output')
|
|
12
|
+
|
|
13
|
+
function check (script, allowIncomplete) {
|
|
14
|
+
var chunks = bscript.decompile(script)
|
|
15
|
+
if (chunks.length < 1) return false
|
|
16
|
+
|
|
17
|
+
var lastChunk = chunks[chunks.length - 1]
|
|
18
|
+
if (!Buffer.isBuffer(lastChunk)) return false
|
|
19
|
+
|
|
20
|
+
var scriptSigChunks = bscript.decompile(bscript.compile(chunks.slice(0, -1)))
|
|
21
|
+
var redeemScriptChunks = bscript.decompile(lastChunk)
|
|
22
|
+
|
|
23
|
+
// is redeemScript a valid script?
|
|
24
|
+
if (redeemScriptChunks.length === 0) return false
|
|
25
|
+
|
|
26
|
+
// is redeemScriptSig push only?
|
|
27
|
+
if (!bscript.isPushOnly(scriptSigChunks)) return false
|
|
28
|
+
|
|
29
|
+
// is witness?
|
|
30
|
+
if (chunks.length === 1) {
|
|
31
|
+
return p2wsho.check(redeemScriptChunks) ||
|
|
32
|
+
p2wpkho.check(redeemScriptChunks)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// match types
|
|
36
|
+
if (p2pkh.input.check(scriptSigChunks) &&
|
|
37
|
+
p2pkh.output.check(redeemScriptChunks)) return true
|
|
38
|
+
|
|
39
|
+
if (p2ms.input.check(scriptSigChunks, allowIncomplete) &&
|
|
40
|
+
p2ms.output.check(redeemScriptChunks)) return true
|
|
41
|
+
|
|
42
|
+
if (p2pk.input.check(scriptSigChunks) &&
|
|
43
|
+
p2pk.output.check(redeemScriptChunks)) return true
|
|
44
|
+
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
check.toJSON = function () { return 'scriptHash input' }
|
|
48
|
+
|
|
49
|
+
function encodeStack (redeemScriptStack, redeemScript) {
|
|
50
|
+
var serializedScriptPubKey = bscript.compile(redeemScript)
|
|
51
|
+
|
|
52
|
+
return [].concat(redeemScriptStack, serializedScriptPubKey)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function encode (redeemScriptSig, redeemScript) {
|
|
56
|
+
var redeemScriptStack = bscript.decompile(redeemScriptSig)
|
|
57
|
+
|
|
58
|
+
return bscript.compile(encodeStack(redeemScriptStack, redeemScript))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function decodeStack (stack) {
|
|
62
|
+
typeforce(check, stack)
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
redeemScriptStack: stack.slice(0, -1),
|
|
66
|
+
redeemScript: stack[stack.length - 1]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function decode (buffer) {
|
|
71
|
+
var stack = bscript.decompile(buffer)
|
|
72
|
+
var result = decodeStack(stack)
|
|
73
|
+
result.redeemScriptSig = bscript.compile(result.redeemScriptStack)
|
|
74
|
+
delete result.redeemScriptStack
|
|
75
|
+
return result
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
module.exports = {
|
|
79
|
+
check: check,
|
|
80
|
+
decode: decode,
|
|
81
|
+
decodeStack: decodeStack,
|
|
82
|
+
encode: encode,
|
|
83
|
+
encodeStack: encodeStack
|
|
84
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// OP_HASH160 {scriptHash} OP_EQUAL
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var types = require('../../types')
|
|
5
|
+
var typeforce = require('typeforce')
|
|
6
|
+
var OPS = require('bitcoin-ops')
|
|
7
|
+
|
|
8
|
+
function check (script) {
|
|
9
|
+
var buffer = bscript.compile(script)
|
|
10
|
+
|
|
11
|
+
return buffer.length === 23 &&
|
|
12
|
+
buffer[0] === OPS.OP_HASH160 &&
|
|
13
|
+
buffer[1] === 0x14 &&
|
|
14
|
+
buffer[22] === OPS.OP_EQUAL
|
|
15
|
+
}
|
|
16
|
+
check.toJSON = function () { return 'scriptHash output' }
|
|
17
|
+
|
|
18
|
+
function encode (scriptHash) {
|
|
19
|
+
typeforce(types.Hash160bit, scriptHash)
|
|
20
|
+
|
|
21
|
+
return bscript.compile([OPS.OP_HASH160, scriptHash, OPS.OP_EQUAL])
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function decode (buffer) {
|
|
25
|
+
typeforce(check, buffer)
|
|
26
|
+
|
|
27
|
+
return buffer.slice(2, 22)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = {
|
|
31
|
+
check: check,
|
|
32
|
+
decode: decode,
|
|
33
|
+
encode: encode
|
|
34
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// OP_RETURN {aa21a9ed} {commitment}
|
|
2
|
+
|
|
3
|
+
var Buffer = require('safe-buffer').Buffer
|
|
4
|
+
var bscript = require('../../script')
|
|
5
|
+
var types = require('../../types')
|
|
6
|
+
var typeforce = require('typeforce')
|
|
7
|
+
var OPS = require('bitcoin-ops')
|
|
8
|
+
|
|
9
|
+
var HEADER = Buffer.from('aa21a9ed', 'hex')
|
|
10
|
+
|
|
11
|
+
function check (script) {
|
|
12
|
+
var buffer = bscript.compile(script)
|
|
13
|
+
|
|
14
|
+
return buffer.length > 37 &&
|
|
15
|
+
buffer[0] === OPS.OP_RETURN &&
|
|
16
|
+
buffer[1] === 0x24 &&
|
|
17
|
+
buffer.slice(2, 6).equals(HEADER)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
check.toJSON = function () { return 'Witness commitment output' }
|
|
21
|
+
|
|
22
|
+
function encode (commitment) {
|
|
23
|
+
typeforce(types.Hash256bit, commitment)
|
|
24
|
+
|
|
25
|
+
var buffer = Buffer.allocUnsafe(36)
|
|
26
|
+
HEADER.copy(buffer, 0)
|
|
27
|
+
commitment.copy(buffer, 4)
|
|
28
|
+
|
|
29
|
+
return bscript.compile([OPS.OP_RETURN, buffer])
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function decode (buffer) {
|
|
33
|
+
typeforce(check, buffer)
|
|
34
|
+
|
|
35
|
+
return bscript.decompile(buffer)[1].slice(4, 36)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
check: check,
|
|
40
|
+
decode: decode,
|
|
41
|
+
encode: encode
|
|
42
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// {signature} {pubKey}
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var typeforce = require('typeforce')
|
|
5
|
+
|
|
6
|
+
function isCompressedCanonicalPubKey (pubKey) {
|
|
7
|
+
return bscript.isCanonicalPubKey(pubKey) && pubKey.length === 33
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function check (script) {
|
|
11
|
+
var chunks = bscript.decompile(script)
|
|
12
|
+
|
|
13
|
+
return chunks.length === 2 &&
|
|
14
|
+
bscript.isCanonicalSignature(chunks[0]) &&
|
|
15
|
+
isCompressedCanonicalPubKey(chunks[1])
|
|
16
|
+
}
|
|
17
|
+
check.toJSON = function () { return 'witnessPubKeyHash input' }
|
|
18
|
+
|
|
19
|
+
function encodeStack (signature, pubKey) {
|
|
20
|
+
typeforce({
|
|
21
|
+
signature: bscript.isCanonicalSignature,
|
|
22
|
+
pubKey: isCompressedCanonicalPubKey
|
|
23
|
+
}, {
|
|
24
|
+
signature: signature,
|
|
25
|
+
pubKey: pubKey
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
return [signature, pubKey]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function decodeStack (stack) {
|
|
32
|
+
typeforce(check, stack)
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
signature: stack[0],
|
|
36
|
+
pubKey: stack[1]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
check: check,
|
|
42
|
+
decodeStack: decodeStack,
|
|
43
|
+
encodeStack: encodeStack
|
|
44
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// OP_0 {pubKeyHash}
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var types = require('../../types')
|
|
5
|
+
var typeforce = require('typeforce')
|
|
6
|
+
var OPS = require('bitcoin-ops')
|
|
7
|
+
|
|
8
|
+
function check (script) {
|
|
9
|
+
var buffer = bscript.compile(script)
|
|
10
|
+
|
|
11
|
+
return buffer.length === 22 &&
|
|
12
|
+
buffer[0] === OPS.OP_0 &&
|
|
13
|
+
buffer[1] === 0x14
|
|
14
|
+
}
|
|
15
|
+
check.toJSON = function () { return 'Witness pubKeyHash output' }
|
|
16
|
+
|
|
17
|
+
function encode (pubKeyHash) {
|
|
18
|
+
typeforce(types.Hash160bit, pubKeyHash)
|
|
19
|
+
|
|
20
|
+
return bscript.compile([OPS.OP_0, pubKeyHash])
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function decode (buffer) {
|
|
24
|
+
typeforce(check, buffer)
|
|
25
|
+
|
|
26
|
+
return buffer.slice(2)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = {
|
|
30
|
+
check: check,
|
|
31
|
+
decode: decode,
|
|
32
|
+
encode: encode
|
|
33
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// <scriptSig> {serialized scriptPubKey script}
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var types = require('../../types')
|
|
5
|
+
var typeforce = require('typeforce')
|
|
6
|
+
|
|
7
|
+
var p2ms = require('../multisig/')
|
|
8
|
+
var p2pk = require('../pubkey/')
|
|
9
|
+
var p2pkh = require('../pubkeyhash/')
|
|
10
|
+
|
|
11
|
+
function check (chunks, allowIncomplete) {
|
|
12
|
+
typeforce(types.Array, chunks)
|
|
13
|
+
if (chunks.length < 1) return false
|
|
14
|
+
|
|
15
|
+
var witnessScript = chunks[chunks.length - 1]
|
|
16
|
+
if (!Buffer.isBuffer(witnessScript)) return false
|
|
17
|
+
|
|
18
|
+
var witnessScriptChunks = bscript.decompile(witnessScript)
|
|
19
|
+
|
|
20
|
+
// is witnessScript a valid script?
|
|
21
|
+
if (witnessScriptChunks.length === 0) return false
|
|
22
|
+
|
|
23
|
+
var witnessRawScriptSig = bscript.compile(chunks.slice(0, -1))
|
|
24
|
+
|
|
25
|
+
// match types
|
|
26
|
+
if (p2pkh.input.check(witnessRawScriptSig) &&
|
|
27
|
+
p2pkh.output.check(witnessScriptChunks)) return true
|
|
28
|
+
|
|
29
|
+
if (p2ms.input.check(witnessRawScriptSig, allowIncomplete) &&
|
|
30
|
+
p2ms.output.check(witnessScriptChunks)) return true
|
|
31
|
+
|
|
32
|
+
if (p2pk.input.check(witnessRawScriptSig) &&
|
|
33
|
+
p2pk.output.check(witnessScriptChunks)) return true
|
|
34
|
+
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
37
|
+
check.toJSON = function () { return 'witnessScriptHash input' }
|
|
38
|
+
|
|
39
|
+
function encodeStack (witnessData, witnessScript) {
|
|
40
|
+
typeforce({
|
|
41
|
+
witnessData: [types.Buffer],
|
|
42
|
+
witnessScript: types.Buffer
|
|
43
|
+
}, {
|
|
44
|
+
witnessData: witnessData,
|
|
45
|
+
witnessScript: witnessScript
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
return [].concat(witnessData, witnessScript)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function decodeStack (chunks) {
|
|
52
|
+
typeforce(check, chunks)
|
|
53
|
+
return {
|
|
54
|
+
witnessData: chunks.slice(0, -1),
|
|
55
|
+
witnessScript: chunks[chunks.length - 1]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = {
|
|
60
|
+
check: check,
|
|
61
|
+
decodeStack: decodeStack,
|
|
62
|
+
encodeStack: encodeStack
|
|
63
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// OP_0 {scriptHash}
|
|
2
|
+
|
|
3
|
+
var bscript = require('../../script')
|
|
4
|
+
var types = require('../../types')
|
|
5
|
+
var typeforce = require('typeforce')
|
|
6
|
+
var OPS = require('bitcoin-ops')
|
|
7
|
+
|
|
8
|
+
function check (script) {
|
|
9
|
+
var buffer = bscript.compile(script)
|
|
10
|
+
|
|
11
|
+
return buffer.length === 34 &&
|
|
12
|
+
buffer[0] === OPS.OP_0 &&
|
|
13
|
+
buffer[1] === 0x20
|
|
14
|
+
}
|
|
15
|
+
check.toJSON = function () { return 'Witness scriptHash output' }
|
|
16
|
+
|
|
17
|
+
function encode (scriptHash) {
|
|
18
|
+
typeforce(types.Hash256bit, scriptHash)
|
|
19
|
+
|
|
20
|
+
return bscript.compile([OPS.OP_0, scriptHash])
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function decode (buffer) {
|
|
24
|
+
typeforce(check, buffer)
|
|
25
|
+
|
|
26
|
+
return buffer.slice(2)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = {
|
|
30
|
+
check: check,
|
|
31
|
+
decode: decode,
|
|
32
|
+
encode: encode
|
|
33
|
+
}
|