@opcat-labs/opcat 1.0.0 → 1.0.2
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 +13 -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 +40 -26
- 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
package/esm/crypto/bn.js
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import BN from '../bn.js';
|
|
4
|
+
import $ from '../util/preconditions.js';
|
|
5
|
+
import _ from '../util/_.js';
|
|
6
|
+
|
|
7
|
+
var reversebuf = function (buf) {
|
|
8
|
+
var buf2 = Buffer.alloc(buf.length);
|
|
9
|
+
for (var i = 0; i < buf.length; i++) {
|
|
10
|
+
buf2[i] = buf[buf.length - 1 - i];
|
|
11
|
+
}
|
|
12
|
+
return buf2;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
BN.Zero = new BN(0);
|
|
16
|
+
BN.One = new BN(1);
|
|
17
|
+
BN.Minus1 = new BN(-1);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Convert a number into a big number.
|
|
21
|
+
*
|
|
22
|
+
* @param {number} n Any positive or negative integer.
|
|
23
|
+
*/
|
|
24
|
+
BN.fromNumber = function (n) {
|
|
25
|
+
$.checkArgument(_.isNumber(n));
|
|
26
|
+
return BN.fromString(n.toString(16), 16)
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Convert a string number into a big number.
|
|
31
|
+
*
|
|
32
|
+
* @param {string} str Any positive or negative integer formatted as a string.
|
|
33
|
+
* @param {number} base The base of the number, defaults to 10.
|
|
34
|
+
*/
|
|
35
|
+
BN.fromString = function (str, base) {
|
|
36
|
+
$.checkArgument(_.isString(str));
|
|
37
|
+
return new BN(str, base);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Convert a buffer (such as a 256 bit binary private key) into a big number.
|
|
42
|
+
* Sometimes these numbers can be formatted either as 'big endian' or 'little
|
|
43
|
+
* endian', and so there is an opts parameter that lets you specify which
|
|
44
|
+
* endianness is specified.
|
|
45
|
+
*
|
|
46
|
+
* @param {Buffer} buf A buffer number, such as a 256 bit hash or key.
|
|
47
|
+
* @param {Object} opts With a property 'endian' that can be either 'big' or 'little'. Defaults big endian (most significant digit first).
|
|
48
|
+
*/
|
|
49
|
+
BN.fromBuffer = function (buf, opts) {
|
|
50
|
+
if (typeof opts !== 'undefined' && opts.endian === 'little') {
|
|
51
|
+
buf = reversebuf(buf);
|
|
52
|
+
}
|
|
53
|
+
var hex = buf.toString('hex');
|
|
54
|
+
var bn = new BN(hex, 16);
|
|
55
|
+
return bn;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Instantiate a BigNumber from a "signed magnitude buffer". (a buffer where the
|
|
60
|
+
* most significant bit represents the sign (0 = positive, 1 = negative)
|
|
61
|
+
*
|
|
62
|
+
* @param {Buffer} buf A buffer number, such as a 256 bit hash or key.
|
|
63
|
+
* @param {Object} opts With a property 'endian' that can be either 'big' or 'little'. Defaults big endian (most significant digit first).
|
|
64
|
+
*/
|
|
65
|
+
BN.fromSM = function (buf, opts) {
|
|
66
|
+
var ret;
|
|
67
|
+
if (buf.length === 0) {
|
|
68
|
+
return BN.fromBuffer(Buffer.from([0]));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
var endian = 'big';
|
|
72
|
+
if (opts) {
|
|
73
|
+
endian = opts.endian;
|
|
74
|
+
}
|
|
75
|
+
if (endian === 'little') {
|
|
76
|
+
buf = reversebuf(buf);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (buf[0] & 0x80) {
|
|
80
|
+
buf[0] = buf[0] & 0x7f;
|
|
81
|
+
ret = BN.fromBuffer(buf);
|
|
82
|
+
ret.neg().copy(ret);
|
|
83
|
+
} else {
|
|
84
|
+
ret = BN.fromBuffer(buf);
|
|
85
|
+
}
|
|
86
|
+
return ret;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Convert a big number into a number.
|
|
91
|
+
*/
|
|
92
|
+
BN.prototype.toNumber = function () {
|
|
93
|
+
return parseInt(this.toString(10), 10);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Convert a big number into a buffer. This is somewhat ambiguous, so there is
|
|
98
|
+
* an opts parameter that let's you specify the endianness or the size.
|
|
99
|
+
* opts.endian can be either 'big' or 'little' and opts.size can be any
|
|
100
|
+
* sufficiently large number of bytes. If you always want to create a 32 byte
|
|
101
|
+
* big endian number, then specify opts = { endian: 'big', size: 32 }
|
|
102
|
+
*
|
|
103
|
+
* @param {Object} opts Defaults to { endian: 'big', size: 32 }
|
|
104
|
+
*/
|
|
105
|
+
BN.prototype.toBuffer = function (opts) {
|
|
106
|
+
var buf, hex;
|
|
107
|
+
if (opts && opts.size) {
|
|
108
|
+
hex = this.toString(16, 2);
|
|
109
|
+
var natlen = hex.length / 2;
|
|
110
|
+
buf = Buffer.from(hex, 'hex');
|
|
111
|
+
|
|
112
|
+
if (natlen === opts.size) {
|
|
113
|
+
// buf = buf
|
|
114
|
+
} else if (natlen > opts.size) {
|
|
115
|
+
buf = BN.trim(buf, natlen);
|
|
116
|
+
} else if (natlen < opts.size) {
|
|
117
|
+
buf = BN.pad(buf, natlen, opts.size);
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
hex = this.toString(16, 2);
|
|
121
|
+
buf = Buffer.from(hex, 'hex');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (typeof opts !== 'undefined' && opts.endian === 'little') {
|
|
125
|
+
buf = reversebuf(buf);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return buf;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* For big numbers that are either positive or negative, you can convert to
|
|
133
|
+
* "sign magnitude" format whereby the first bit specifies whether the number is
|
|
134
|
+
* positive or negative.
|
|
135
|
+
*/
|
|
136
|
+
BN.prototype.toSMBigEndian = function () {
|
|
137
|
+
var buf;
|
|
138
|
+
if (this.cmp(BN.Zero) === -1) {
|
|
139
|
+
buf = this.neg().toBuffer();
|
|
140
|
+
if (buf[0] & 0x80) {
|
|
141
|
+
buf = Buffer.concat([Buffer.from([0x80]), buf]);
|
|
142
|
+
} else {
|
|
143
|
+
buf[0] = buf[0] | 0x80;
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
buf = this.toBuffer();
|
|
147
|
+
if (buf[0] & 0x80) {
|
|
148
|
+
buf = Buffer.concat([Buffer.from([0x00]), buf]);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if ((buf.length === 1) & (buf[0] === 0)) {
|
|
153
|
+
buf = Buffer.from([]);
|
|
154
|
+
}
|
|
155
|
+
return buf;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* For big numbers that are either positive or negative, you can convert to
|
|
160
|
+
* "sign magnitude" format whereby the first bit specifies whether the number is
|
|
161
|
+
* positive or negative.
|
|
162
|
+
*
|
|
163
|
+
* @param {Object} opts Defaults to { endian: 'big' }
|
|
164
|
+
*/
|
|
165
|
+
BN.prototype.toSM = function (opts) {
|
|
166
|
+
var endian = opts ? opts.endian : 'big';
|
|
167
|
+
var buf = this.toSMBigEndian();
|
|
168
|
+
|
|
169
|
+
if (endian === 'little') {
|
|
170
|
+
buf = reversebuf(buf);
|
|
171
|
+
}
|
|
172
|
+
return buf;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Create a BN from a "ScriptNum": This is analogous to the constructor for
|
|
177
|
+
* CScriptNum in bitcoind. Many ops in bitcoind's script interpreter use
|
|
178
|
+
* CScriptNum, which is not really a proper bignum. Instead, an error is thrown
|
|
179
|
+
* if trying to input a number bigger than 4 bytes. We copy that behavior here.
|
|
180
|
+
* A third argument, `size`, is provided to extend the hard limit of 4 bytes, as
|
|
181
|
+
* some usages require more than 4 bytes.
|
|
182
|
+
*
|
|
183
|
+
* @param {Buffer} buf A buffer of a number.
|
|
184
|
+
* @param {boolean} fRequireMinimal Whether to require minimal size encoding.
|
|
185
|
+
* @param {number} size The maximum size.
|
|
186
|
+
*/
|
|
187
|
+
BN.fromScriptNumBuffer = function (buf, fRequireMinimal, size) {
|
|
188
|
+
var nMaxNumSize = size || Number.MAX_SAFE_INTEGER;
|
|
189
|
+
$.checkArgument(buf.length <= nMaxNumSize, new Error('script number overflow'));
|
|
190
|
+
if (fRequireMinimal && buf.length > 0) {
|
|
191
|
+
// Check that the number is encoded with the minimum possible
|
|
192
|
+
// number of bytes.
|
|
193
|
+
//
|
|
194
|
+
// If the most-significant-byte - excluding the sign bit - is zero
|
|
195
|
+
// then we're not minimal. Note how this test also rejects the
|
|
196
|
+
// negative-zero encoding, 0x80.
|
|
197
|
+
if ((buf[buf.length - 1] & 0x7f) === 0) {
|
|
198
|
+
// One exception: if there's more than one byte and the most
|
|
199
|
+
// significant bit of the second-most-significant-byte is set
|
|
200
|
+
// it would conflict with the sign bit. An example of this case
|
|
201
|
+
// is +-255, which encode to 0xff00 and 0xff80 respectively.
|
|
202
|
+
// (big-endian).
|
|
203
|
+
if (buf.length <= 1 || (buf[buf.length - 2] & 0x80) === 0) {
|
|
204
|
+
throw new Error('non-minimally encoded script number');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return BN.fromSM(buf, {
|
|
209
|
+
endian: 'little',
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* The corollary to the above, with the notable exception that we do not throw
|
|
215
|
+
* an error if the output is larger than four bytes. (Which can happen if
|
|
216
|
+
* performing a numerical operation that results in an overflow to more than 4
|
|
217
|
+
* bytes).
|
|
218
|
+
*/
|
|
219
|
+
BN.prototype.toScriptNumBuffer = function () {
|
|
220
|
+
return this.toSM({
|
|
221
|
+
endian: 'little',
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Trims a buffer if it starts with zeros.
|
|
227
|
+
*
|
|
228
|
+
* @param {Buffer} buf A buffer formatted number.
|
|
229
|
+
* @param {number} natlen The natural length of the number.
|
|
230
|
+
*/
|
|
231
|
+
BN.trim = function (buf, natlen) {
|
|
232
|
+
return buf.slice(natlen - buf.length, buf.length);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Adds extra zeros to the start of a number.
|
|
237
|
+
*
|
|
238
|
+
* @param {Buffer} buf A buffer formatted number.
|
|
239
|
+
* @param {number} natlen The natural length of the number.
|
|
240
|
+
* @param {number} size How big to pad the number in bytes.
|
|
241
|
+
*/
|
|
242
|
+
BN.pad = function (buf, natlen, size) {
|
|
243
|
+
var rbuf = Buffer.alloc(size);
|
|
244
|
+
for (var i = 0; i < buf.length; i++) {
|
|
245
|
+
rbuf[rbuf.length - 1 - i] = buf[buf.length - 1 - i];
|
|
246
|
+
}
|
|
247
|
+
for (i = 0; i < size - natlen; i++) {
|
|
248
|
+
rbuf[i] = 0;
|
|
249
|
+
}
|
|
250
|
+
return rbuf;
|
|
251
|
+
};
|
|
252
|
+
/**
|
|
253
|
+
* Convert a big number into a hex string. This is somewhat ambiguous, so there
|
|
254
|
+
* is an opts parameter that let's you specify the endianness or the size.
|
|
255
|
+
* opts.endian can be either 'big' or 'little' and opts.size can be any
|
|
256
|
+
* sufficiently large number of bytes. If you always want to create a 32 byte
|
|
257
|
+
* big endian number, then specify opts = { endian: 'big', size: 32 }
|
|
258
|
+
*
|
|
259
|
+
* @param {Object} opts Defaults to { endian: 'big', size: 32 }
|
|
260
|
+
*/
|
|
261
|
+
BN.prototype.toHex = function (...args) {
|
|
262
|
+
return this.toBuffer(...args).toString('hex');
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Convert a hex string (such as a 256 bit binary private key) into a big
|
|
267
|
+
* number. Sometimes these numbers can be formatted either as 'big endian' or
|
|
268
|
+
* 'little endian', and so there is an opts parameter that lets you specify
|
|
269
|
+
* which endianness is specified.
|
|
270
|
+
*
|
|
271
|
+
* @param {Buffer} buf A buffer number, such as a 256 bit hash or key.
|
|
272
|
+
* @param {Object} opts With a property 'endian' that can be either 'big' or 'little'. Defaults big endian (most significant digit first).
|
|
273
|
+
*/
|
|
274
|
+
BN.fromHex = function (hex, ...args) {
|
|
275
|
+
return BN.fromBuffer(Buffer.from(hex, 'hex'), ...args);
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
export default BN;
|