xpi-ts 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +516 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/lib/bitcore/address.d.ts +66 -0
- package/dist/lib/bitcore/address.d.ts.map +1 -0
- package/dist/lib/bitcore/address.js +407 -0
- package/dist/lib/bitcore/block/block.d.ts +57 -0
- package/dist/lib/bitcore/block/block.d.ts.map +1 -0
- package/dist/lib/bitcore/block/block.js +233 -0
- package/dist/lib/bitcore/block/blockheader.d.ts +82 -0
- package/dist/lib/bitcore/block/blockheader.d.ts.map +1 -0
- package/dist/lib/bitcore/block/blockheader.js +323 -0
- package/dist/lib/bitcore/block/index.d.ts +5 -0
- package/dist/lib/bitcore/block/index.d.ts.map +1 -0
- package/dist/lib/bitcore/block/index.js +2 -0
- package/dist/lib/bitcore/chunk.d.ts +22 -0
- package/dist/lib/bitcore/chunk.d.ts.map +1 -0
- package/dist/lib/bitcore/chunk.js +46 -0
- package/dist/lib/bitcore/crypto/bn.d.ts +53 -0
- package/dist/lib/bitcore/crypto/bn.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/bn.js +238 -0
- package/dist/lib/bitcore/crypto/ecdsa.d.ts +46 -0
- package/dist/lib/bitcore/crypto/ecdsa.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/ecdsa.js +247 -0
- package/dist/lib/bitcore/crypto/hash.d.ts +16 -0
- package/dist/lib/bitcore/crypto/hash.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/hash.js +87 -0
- package/dist/lib/bitcore/crypto/index.d.ts +9 -0
- package/dist/lib/bitcore/crypto/index.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/index.js +8 -0
- package/dist/lib/bitcore/crypto/musig2.d.ts +40 -0
- package/dist/lib/bitcore/crypto/musig2.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/musig2.js +236 -0
- package/dist/lib/bitcore/crypto/point.d.ts +20 -0
- package/dist/lib/bitcore/crypto/point.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/point.js +133 -0
- package/dist/lib/bitcore/crypto/random.d.ts +7 -0
- package/dist/lib/bitcore/crypto/random.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/random.js +30 -0
- package/dist/lib/bitcore/crypto/schnorr.d.ts +40 -0
- package/dist/lib/bitcore/crypto/schnorr.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/schnorr.js +185 -0
- package/dist/lib/bitcore/crypto/signature.d.ts +53 -0
- package/dist/lib/bitcore/crypto/signature.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/signature.js +300 -0
- package/dist/lib/bitcore/crypto/sigtype.d.ts +5 -0
- package/dist/lib/bitcore/crypto/sigtype.d.ts.map +1 -0
- package/dist/lib/bitcore/crypto/sigtype.js +18 -0
- package/dist/lib/bitcore/encoding/base58.d.ts +16 -0
- package/dist/lib/bitcore/encoding/base58.d.ts.map +1 -0
- package/dist/lib/bitcore/encoding/base58.js +55 -0
- package/dist/lib/bitcore/encoding/base58check.d.ts +9 -0
- package/dist/lib/bitcore/encoding/base58check.d.ts.map +1 -0
- package/dist/lib/bitcore/encoding/base58check.js +82 -0
- package/dist/lib/bitcore/encoding/bufferreader.d.ts +34 -0
- package/dist/lib/bitcore/encoding/bufferreader.d.ts.map +1 -0
- package/dist/lib/bitcore/encoding/bufferreader.js +198 -0
- package/dist/lib/bitcore/encoding/bufferwriter.d.ts +36 -0
- package/dist/lib/bitcore/encoding/bufferwriter.d.ts.map +1 -0
- package/dist/lib/bitcore/encoding/bufferwriter.js +189 -0
- package/dist/lib/bitcore/encoding/varint.d.ts +20 -0
- package/dist/lib/bitcore/encoding/varint.d.ts.map +1 -0
- package/dist/lib/bitcore/encoding/varint.js +61 -0
- package/dist/lib/bitcore/errors.d.ts +28 -0
- package/dist/lib/bitcore/errors.d.ts.map +1 -0
- package/dist/lib/bitcore/errors.js +325 -0
- package/dist/lib/bitcore/hdprivatekey.d.ts +78 -0
- package/dist/lib/bitcore/hdprivatekey.d.ts.map +1 -0
- package/dist/lib/bitcore/hdprivatekey.js +381 -0
- package/dist/lib/bitcore/hdpublickey.d.ts +98 -0
- package/dist/lib/bitcore/hdpublickey.d.ts.map +1 -0
- package/dist/lib/bitcore/hdpublickey.js +416 -0
- package/dist/lib/bitcore/index.d.ts +60 -0
- package/dist/lib/bitcore/index.d.ts.map +1 -0
- package/dist/lib/bitcore/index.js +44 -0
- package/dist/lib/bitcore/message.d.ts +23 -0
- package/dist/lib/bitcore/message.d.ts.map +1 -0
- package/dist/lib/bitcore/message.js +112 -0
- package/dist/lib/bitcore/mnemonic/errors.d.ts +7 -0
- package/dist/lib/bitcore/mnemonic/errors.d.ts.map +1 -0
- package/dist/lib/bitcore/mnemonic/errors.js +20 -0
- package/dist/lib/bitcore/mnemonic/index.d.ts +5 -0
- package/dist/lib/bitcore/mnemonic/index.d.ts.map +1 -0
- package/dist/lib/bitcore/mnemonic/index.js +4 -0
- package/dist/lib/bitcore/mnemonic/mnemonic.d.ts +23 -0
- package/dist/lib/bitcore/mnemonic/mnemonic.d.ts.map +1 -0
- package/dist/lib/bitcore/mnemonic/mnemonic.js +164 -0
- package/dist/lib/bitcore/mnemonic/pbkdf2.d.ts +2 -0
- package/dist/lib/bitcore/mnemonic/pbkdf2.d.ts.map +1 -0
- package/dist/lib/bitcore/mnemonic/pbkdf2.js +25 -0
- package/dist/lib/bitcore/mnemonic/words/english.d.ts +2 -0
- package/dist/lib/bitcore/mnemonic/words/english.d.ts.map +1 -0
- package/dist/lib/bitcore/mnemonic/words/english.js +2050 -0
- package/dist/lib/bitcore/mnemonic/words/index.d.ts +4 -0
- package/dist/lib/bitcore/mnemonic/words/index.d.ts.map +1 -0
- package/dist/lib/bitcore/mnemonic/words/index.js +4 -0
- package/dist/lib/bitcore/musig2/index.d.ts +3 -0
- package/dist/lib/bitcore/musig2/index.d.ts.map +1 -0
- package/dist/lib/bitcore/musig2/index.js +2 -0
- package/dist/lib/bitcore/musig2/session.d.ts +79 -0
- package/dist/lib/bitcore/musig2/session.d.ts.map +1 -0
- package/dist/lib/bitcore/musig2/session.js +346 -0
- package/dist/lib/bitcore/musig2/signer.d.ts +61 -0
- package/dist/lib/bitcore/musig2/signer.d.ts.map +1 -0
- package/dist/lib/bitcore/musig2/signer.js +146 -0
- package/dist/lib/bitcore/networks.d.ts +53 -0
- package/dist/lib/bitcore/networks.d.ts.map +1 -0
- package/dist/lib/bitcore/networks.js +150 -0
- package/dist/lib/bitcore/opcode.d.ts +250 -0
- package/dist/lib/bitcore/opcode.d.ts.map +1 -0
- package/dist/lib/bitcore/opcode.js +270 -0
- package/dist/lib/bitcore/privatekey.d.ts +56 -0
- package/dist/lib/bitcore/privatekey.d.ts.map +1 -0
- package/dist/lib/bitcore/privatekey.js +237 -0
- package/dist/lib/bitcore/publickey.d.ts +59 -0
- package/dist/lib/bitcore/publickey.d.ts.map +1 -0
- package/dist/lib/bitcore/publickey.js +263 -0
- package/dist/lib/bitcore/script/interpreter.d.ts +98 -0
- package/dist/lib/bitcore/script/interpreter.d.ts.map +1 -0
- package/dist/lib/bitcore/script/interpreter.js +1704 -0
- package/dist/lib/bitcore/script.d.ts +111 -0
- package/dist/lib/bitcore/script.d.ts.map +1 -0
- package/dist/lib/bitcore/script.js +1112 -0
- package/dist/lib/bitcore/taproot/musig2.d.ts +29 -0
- package/dist/lib/bitcore/taproot/musig2.d.ts.map +1 -0
- package/dist/lib/bitcore/taproot/musig2.js +104 -0
- package/dist/lib/bitcore/taproot/nft.d.ts +164 -0
- package/dist/lib/bitcore/taproot/nft.d.ts.map +1 -0
- package/dist/lib/bitcore/taproot/nft.js +407 -0
- package/dist/lib/bitcore/taproot.d.ts +65 -0
- package/dist/lib/bitcore/taproot.d.ts.map +1 -0
- package/dist/lib/bitcore/taproot.js +288 -0
- package/dist/lib/bitcore/transaction/index.d.ts +12 -0
- package/dist/lib/bitcore/transaction/index.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/index.js +6 -0
- package/dist/lib/bitcore/transaction/input.d.ts +202 -0
- package/dist/lib/bitcore/transaction/input.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/input.js +911 -0
- package/dist/lib/bitcore/transaction/output.d.ts +48 -0
- package/dist/lib/bitcore/transaction/output.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/output.js +231 -0
- package/dist/lib/bitcore/transaction/sighash.d.ts +32 -0
- package/dist/lib/bitcore/transaction/sighash.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/sighash.js +335 -0
- package/dist/lib/bitcore/transaction/signature.d.ts +36 -0
- package/dist/lib/bitcore/transaction/signature.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/signature.js +130 -0
- package/dist/lib/bitcore/transaction/transaction.d.ts +164 -0
- package/dist/lib/bitcore/transaction/transaction.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/transaction.js +1016 -0
- package/dist/lib/bitcore/transaction/unspentoutput.d.ts +58 -0
- package/dist/lib/bitcore/transaction/unspentoutput.d.ts.map +1 -0
- package/dist/lib/bitcore/transaction/unspentoutput.js +167 -0
- package/dist/lib/bitcore/unit.d.ts +44 -0
- package/dist/lib/bitcore/unit.d.ts.map +1 -0
- package/dist/lib/bitcore/unit.js +106 -0
- package/dist/lib/bitcore/uri.d.ts +29 -0
- package/dist/lib/bitcore/uri.d.ts.map +1 -0
- package/dist/lib/bitcore/uri.js +163 -0
- package/dist/lib/bitcore/util/base32.d.ts +5 -0
- package/dist/lib/bitcore/util/base32.d.ts.map +1 -0
- package/dist/lib/bitcore/util/base32.js +58 -0
- package/dist/lib/bitcore/util/buffer.d.ts +18 -0
- package/dist/lib/bitcore/util/buffer.d.ts.map +1 -0
- package/dist/lib/bitcore/util/buffer.js +76 -0
- package/dist/lib/bitcore/util/convertBits.d.ts +2 -0
- package/dist/lib/bitcore/util/convertBits.d.ts.map +1 -0
- package/dist/lib/bitcore/util/convertBits.js +26 -0
- package/dist/lib/bitcore/util/js.d.ts +9 -0
- package/dist/lib/bitcore/util/js.d.ts.map +1 -0
- package/dist/lib/bitcore/util/js.js +45 -0
- package/dist/lib/bitcore/util/preconditions.d.ts +6 -0
- package/dist/lib/bitcore/util/preconditions.d.ts.map +1 -0
- package/dist/lib/bitcore/util/preconditions.js +31 -0
- package/dist/lib/bitcore/util.d.ts +14 -0
- package/dist/lib/bitcore/util.d.ts.map +1 -0
- package/dist/lib/bitcore/util.js +13 -0
- package/dist/lib/bitcore/xaddress.d.ts +45 -0
- package/dist/lib/bitcore/xaddress.d.ts.map +1 -0
- package/dist/lib/bitcore/xaddress.js +279 -0
- package/dist/lib/rank/api.d.ts +75 -0
- package/dist/lib/rank/api.d.ts.map +1 -0
- package/dist/lib/rank/api.js +4 -0
- package/dist/lib/rank/index.d.ts +127 -0
- package/dist/lib/rank/index.d.ts.map +1 -0
- package/dist/lib/rank/index.js +421 -0
- package/dist/lib/rank/opcode.d.ts +23 -0
- package/dist/lib/rank/opcode.d.ts.map +1 -0
- package/dist/lib/rank/opcode.js +23 -0
- package/dist/lib/rank/script.d.ts +2 -0
- package/dist/lib/rank/script.d.ts.map +1 -0
- package/dist/lib/rank/script.js +7 -0
- package/dist/lib/rank/transaction.d.ts +3 -0
- package/dist/lib/rank/transaction.d.ts.map +1 -0
- package/dist/lib/rank/transaction.js +12 -0
- package/dist/lib/rpc.d.ts +136 -0
- package/dist/lib/rpc.d.ts.map +1 -0
- package/dist/lib/rpc.js +62 -0
- package/dist/utils/constants.d.ts +18 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +20 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +8 -0
- package/dist/utils/string.d.ts +11 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/string.js +47 -0
- package/dist/utils/types.d.ts +2 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +1 -0
- package/dist/utils/wallet.d.ts +12 -0
- package/dist/utils/wallet.d.ts.map +1 -0
- package/dist/utils/wallet.js +28 -0
- package/package.json +91 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { BN } from './crypto/bn.js';
|
|
2
|
+
import { PublicKey } from './publickey.js';
|
|
3
|
+
import { HDPrivateKey } from './hdprivatekey.js';
|
|
4
|
+
import { get as getNetwork } from './networks.js';
|
|
5
|
+
import { Hash } from './crypto/hash.js';
|
|
6
|
+
import { Base58Check } from './encoding/base58check.js';
|
|
7
|
+
import { JSUtil } from './util/js.js';
|
|
8
|
+
import { Preconditions } from './util/preconditions.js';
|
|
9
|
+
import { Point } from './crypto/point.js';
|
|
10
|
+
export class HDPublicKey {
|
|
11
|
+
xpubkey;
|
|
12
|
+
network;
|
|
13
|
+
depth;
|
|
14
|
+
publicKey;
|
|
15
|
+
fingerPrint;
|
|
16
|
+
parentFingerPrint;
|
|
17
|
+
childIndex;
|
|
18
|
+
chainCode;
|
|
19
|
+
_buffers;
|
|
20
|
+
static Hardened = 0x80000000;
|
|
21
|
+
static RootElementAlias = ['m', 'M'];
|
|
22
|
+
static VersionSize = 4;
|
|
23
|
+
static DepthSize = 1;
|
|
24
|
+
static ParentFingerPrintSize = 4;
|
|
25
|
+
static ChildIndexSize = 4;
|
|
26
|
+
static ChainCodeSize = 32;
|
|
27
|
+
static PublicKeySize = 33;
|
|
28
|
+
static CheckSumSize = 4;
|
|
29
|
+
static DataSize = 78;
|
|
30
|
+
static SerializedByteSize = 82;
|
|
31
|
+
static VersionStart = 0;
|
|
32
|
+
static VersionEnd = HDPublicKey.VersionStart + HDPublicKey.VersionSize;
|
|
33
|
+
static DepthStart = HDPublicKey.VersionEnd;
|
|
34
|
+
static DepthEnd = HDPublicKey.DepthStart + HDPublicKey.DepthSize;
|
|
35
|
+
static ParentFingerPrintStart = HDPublicKey.DepthEnd;
|
|
36
|
+
static ParentFingerPrintEnd = HDPublicKey.ParentFingerPrintStart + HDPublicKey.ParentFingerPrintSize;
|
|
37
|
+
static ChildIndexStart = HDPublicKey.ParentFingerPrintEnd;
|
|
38
|
+
static ChildIndexEnd = HDPublicKey.ChildIndexStart + HDPublicKey.ChildIndexSize;
|
|
39
|
+
static ChainCodeStart = HDPublicKey.ChildIndexEnd;
|
|
40
|
+
static ChainCodeEnd = HDPublicKey.ChainCodeStart + HDPublicKey.ChainCodeSize;
|
|
41
|
+
static PublicKeyStart = HDPublicKey.ChainCodeEnd;
|
|
42
|
+
static PublicKeyEnd = HDPublicKey.PublicKeyStart + HDPublicKey.PublicKeySize;
|
|
43
|
+
static ChecksumStart = HDPublicKey.PublicKeyEnd;
|
|
44
|
+
static ChecksumEnd = HDPublicKey.ChecksumStart + HDPublicKey.CheckSumSize;
|
|
45
|
+
constructor(arg) {
|
|
46
|
+
if (arg instanceof HDPublicKey) {
|
|
47
|
+
return arg;
|
|
48
|
+
}
|
|
49
|
+
if (!(this instanceof HDPublicKey)) {
|
|
50
|
+
return new HDPublicKey(arg);
|
|
51
|
+
}
|
|
52
|
+
if (arg) {
|
|
53
|
+
if (typeof arg === 'string' || Buffer.isBuffer(arg)) {
|
|
54
|
+
const error = HDPublicKey.getSerializedError(arg);
|
|
55
|
+
if (!error) {
|
|
56
|
+
return this._buildFromSerialized(arg);
|
|
57
|
+
}
|
|
58
|
+
else if (Buffer.isBuffer(arg) &&
|
|
59
|
+
!HDPublicKey.getSerializedError(arg.toString())) {
|
|
60
|
+
return this._buildFromSerialized(arg.toString());
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (typeof arg === 'object' && arg !== null) {
|
|
68
|
+
if (arg instanceof HDPrivateKey) {
|
|
69
|
+
return this._buildFromPrivate(arg);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return this._buildFromObject(arg);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new Error('Unrecognized argument');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
throw new Error('Must supply an argument to create a HDPublicKey');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
static isValidPath(arg) {
|
|
85
|
+
if (typeof arg === 'string') {
|
|
86
|
+
const indexes = arg.split('/').slice(1).map(Number);
|
|
87
|
+
return indexes.every(HDPublicKey.isValidPath);
|
|
88
|
+
}
|
|
89
|
+
if (typeof arg === 'number') {
|
|
90
|
+
return arg >= 0 && arg < HDPublicKey.Hardened;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
static isValidSerialized(data, network) {
|
|
95
|
+
return HDPublicKey.getSerializedError(data, network) === null;
|
|
96
|
+
}
|
|
97
|
+
static getSerializedError(data, network) {
|
|
98
|
+
if (!(typeof data === 'string' || Buffer.isBuffer(data))) {
|
|
99
|
+
return new Error('expected buffer or string');
|
|
100
|
+
}
|
|
101
|
+
if (typeof data === 'string' && !JSUtil.isHexa(data)) {
|
|
102
|
+
try {
|
|
103
|
+
Base58Check.decode(data);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
return new Error('Invalid base58 checksum');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (Buffer.isBuffer(data) && data.length !== HDPublicKey.DataSize) {
|
|
110
|
+
return new Error('Invalid length');
|
|
111
|
+
}
|
|
112
|
+
if (typeof data === 'string') {
|
|
113
|
+
const decoded = Base58Check.decode(data);
|
|
114
|
+
if (decoded.length !== HDPublicKey.DataSize) {
|
|
115
|
+
return new Error('Invalid length');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (network !== undefined) {
|
|
119
|
+
const error = HDPublicKey._validateNetwork(data, network);
|
|
120
|
+
if (error) {
|
|
121
|
+
return error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
static _validateNetwork(data, networkArg) {
|
|
127
|
+
const network = getNetwork(networkArg);
|
|
128
|
+
if (!network) {
|
|
129
|
+
return new Error('Invalid network argument');
|
|
130
|
+
}
|
|
131
|
+
const version = Buffer.isBuffer(data)
|
|
132
|
+
? data.subarray(HDPublicKey.VersionStart, HDPublicKey.VersionEnd)
|
|
133
|
+
: Buffer.from(Base58Check.decode(data).subarray(HDPublicKey.VersionStart, HDPublicKey.VersionEnd));
|
|
134
|
+
if (version.readUInt32BE(0) !== network.xpubkey) {
|
|
135
|
+
return new Error('Invalid network');
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
static fromString(arg) {
|
|
140
|
+
Preconditions.checkArgument(typeof arg === 'string', 'No valid string was provided');
|
|
141
|
+
return new HDPublicKey(arg);
|
|
142
|
+
}
|
|
143
|
+
static fromObject(arg) {
|
|
144
|
+
Preconditions.checkArgument(typeof arg === 'object', 'No valid argument was provided');
|
|
145
|
+
return new HDPublicKey(arg);
|
|
146
|
+
}
|
|
147
|
+
static fromBuffer(arg) {
|
|
148
|
+
return new HDPublicKey(arg);
|
|
149
|
+
}
|
|
150
|
+
_classifyArguments(arg) {
|
|
151
|
+
if (typeof arg === 'string') {
|
|
152
|
+
return HDPublicKey._transformString(arg);
|
|
153
|
+
}
|
|
154
|
+
else if (Buffer.isBuffer(arg)) {
|
|
155
|
+
return HDPublicKey._transformBuffer(arg);
|
|
156
|
+
}
|
|
157
|
+
else if (typeof arg === 'object' && arg !== null) {
|
|
158
|
+
if ('xpubkey' in arg) {
|
|
159
|
+
return HDPublicKey._transformObject(arg);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return arg;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
throw new Error('Invalid HDPublicKey data');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
static _transformString(str) {
|
|
170
|
+
if (!JSUtil.isHexa(str)) {
|
|
171
|
+
return HDPublicKey._transformSerialized(str);
|
|
172
|
+
}
|
|
173
|
+
return HDPublicKey._transformBuffer(Buffer.from(str, 'hex'));
|
|
174
|
+
}
|
|
175
|
+
static _transformSerialized(str) {
|
|
176
|
+
const buf = Base58Check.decode(str);
|
|
177
|
+
return HDPublicKey._transformBuffer(buf);
|
|
178
|
+
}
|
|
179
|
+
static _transformBuffer(buf) {
|
|
180
|
+
if (buf.length !== 78) {
|
|
181
|
+
throw new Error('Invalid HDPublicKey buffer length');
|
|
182
|
+
}
|
|
183
|
+
const version = buf.readUInt32BE(0);
|
|
184
|
+
const network = getNetwork(version, 'xpubkey');
|
|
185
|
+
if (!network) {
|
|
186
|
+
throw new Error('Invalid HDPublicKey network');
|
|
187
|
+
}
|
|
188
|
+
const depth = buf.readUInt8(4);
|
|
189
|
+
const parentFingerPrint = buf.subarray(5, 9);
|
|
190
|
+
const childIndex = buf.readUInt32BE(9);
|
|
191
|
+
const chainCode = buf.subarray(13, 45);
|
|
192
|
+
const publicKeyBuffer = buf.subarray(45, 78);
|
|
193
|
+
return {
|
|
194
|
+
network,
|
|
195
|
+
depth,
|
|
196
|
+
parentFingerPrint,
|
|
197
|
+
childIndex,
|
|
198
|
+
chainCode,
|
|
199
|
+
publicKey: PublicKey.fromBuffer(publicKeyBuffer),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
static _transformObject(obj) {
|
|
203
|
+
const network = getNetwork(obj.network);
|
|
204
|
+
if (!network) {
|
|
205
|
+
throw new Error('Invalid network');
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
network,
|
|
209
|
+
depth: obj.depth,
|
|
210
|
+
parentFingerPrint: Buffer.from(obj.parentFingerPrint, 'hex'),
|
|
211
|
+
childIndex: obj.childIndex,
|
|
212
|
+
chainCode: Buffer.from(obj.chainCode, 'hex'),
|
|
213
|
+
publicKey: PublicKey.fromBuffer(Buffer.from(obj.publicKey, 'hex')),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
_buildFromPrivate(arg) {
|
|
217
|
+
const args = {
|
|
218
|
+
version: arg._buffers.version,
|
|
219
|
+
depth: arg._buffers.depth,
|
|
220
|
+
parentFingerPrint: arg._buffers.parentFingerPrint,
|
|
221
|
+
childIndex: arg._buffers.childIndex,
|
|
222
|
+
chainCode: arg._buffers.chainCode,
|
|
223
|
+
publicKey: Point.pointToCompressed(Point.getG().mul(new BN(arg._buffers.privateKey))),
|
|
224
|
+
checksum: arg._buffers.checksum,
|
|
225
|
+
};
|
|
226
|
+
return this._buildFromBuffers(args);
|
|
227
|
+
}
|
|
228
|
+
_buildFromSerialized(arg) {
|
|
229
|
+
const decoded = typeof arg === 'string' ? Base58Check.decode(arg) : arg;
|
|
230
|
+
const buffers = {
|
|
231
|
+
version: decoded.subarray(HDPublicKey.VersionStart, HDPublicKey.VersionEnd),
|
|
232
|
+
depth: decoded.subarray(HDPublicKey.DepthStart, HDPublicKey.DepthEnd),
|
|
233
|
+
parentFingerPrint: decoded.subarray(HDPublicKey.ParentFingerPrintStart, HDPublicKey.ParentFingerPrintEnd),
|
|
234
|
+
childIndex: decoded.subarray(HDPublicKey.ChildIndexStart, HDPublicKey.ChildIndexEnd),
|
|
235
|
+
chainCode: decoded.subarray(HDPublicKey.ChainCodeStart, HDPublicKey.ChainCodeEnd),
|
|
236
|
+
publicKey: decoded.subarray(HDPublicKey.PublicKeyStart, HDPublicKey.PublicKeyEnd),
|
|
237
|
+
checksum: decoded.subarray(HDPublicKey.ChecksumStart, HDPublicKey.ChecksumEnd),
|
|
238
|
+
xpubkey: typeof arg === 'string' ? Buffer.from(arg) : arg,
|
|
239
|
+
};
|
|
240
|
+
return this._buildFromBuffers(buffers);
|
|
241
|
+
}
|
|
242
|
+
_buildFromBuffers(arg) {
|
|
243
|
+
HDPublicKey._validateBufferArguments(arg);
|
|
244
|
+
JSUtil.defineImmutable(this, {
|
|
245
|
+
_buffers: arg,
|
|
246
|
+
});
|
|
247
|
+
const sequence = [
|
|
248
|
+
arg.version,
|
|
249
|
+
arg.depth,
|
|
250
|
+
arg.parentFingerPrint,
|
|
251
|
+
arg.childIndex,
|
|
252
|
+
arg.chainCode,
|
|
253
|
+
arg.publicKey,
|
|
254
|
+
];
|
|
255
|
+
const concat = Buffer.concat(sequence);
|
|
256
|
+
const checksum = Base58Check.checksum(concat);
|
|
257
|
+
if (!arg.checksum || !arg.checksum.length) {
|
|
258
|
+
arg.checksum = checksum;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
if (arg.checksum.toString('hex') !== checksum.toString('hex')) {
|
|
262
|
+
throw new Error('Invalid base58 checksum');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const network = getNetwork(arg.version.readUInt32BE(0));
|
|
266
|
+
const xpubkey = Base58Check.encode(Buffer.concat(sequence));
|
|
267
|
+
arg.xpubkey = Buffer.from(xpubkey);
|
|
268
|
+
const publicKey = new PublicKey(arg.publicKey, { network });
|
|
269
|
+
const size = HDPublicKey.ParentFingerPrintSize;
|
|
270
|
+
const fingerPrint = Hash.sha256ripemd160(publicKey.toBuffer()).subarray(0, size);
|
|
271
|
+
JSUtil.defineImmutable(this, {
|
|
272
|
+
xpubkey: xpubkey,
|
|
273
|
+
network: network,
|
|
274
|
+
depth: arg.depth.readUInt8(0),
|
|
275
|
+
publicKey: publicKey,
|
|
276
|
+
fingerPrint: fingerPrint,
|
|
277
|
+
});
|
|
278
|
+
return this;
|
|
279
|
+
}
|
|
280
|
+
static _validateBufferArguments(arg) {
|
|
281
|
+
const checkBuffer = (name, size) => {
|
|
282
|
+
const buff = arg[name];
|
|
283
|
+
if (!Buffer.isBuffer(buff)) {
|
|
284
|
+
throw new Error(`${name} argument is not a buffer, it's ${typeof buff}`);
|
|
285
|
+
}
|
|
286
|
+
if (buff.length !== size) {
|
|
287
|
+
throw new Error(`${name} has not the expected size: found ${buff.length}, expected ${size}`);
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
checkBuffer('version', HDPublicKey.VersionSize);
|
|
291
|
+
checkBuffer('depth', HDPublicKey.DepthSize);
|
|
292
|
+
checkBuffer('parentFingerPrint', HDPublicKey.ParentFingerPrintSize);
|
|
293
|
+
checkBuffer('childIndex', HDPublicKey.ChildIndexSize);
|
|
294
|
+
checkBuffer('chainCode', HDPublicKey.ChainCodeSize);
|
|
295
|
+
checkBuffer('publicKey', HDPublicKey.PublicKeySize);
|
|
296
|
+
if (arg.checksum && arg.checksum.length) {
|
|
297
|
+
checkBuffer('checksum', HDPublicKey.CheckSumSize);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
_buildFromObject(arg) {
|
|
301
|
+
const buffers = {
|
|
302
|
+
version: Buffer.alloc(4),
|
|
303
|
+
depth: typeof arg.depth === 'number'
|
|
304
|
+
? Buffer.from([arg.depth])
|
|
305
|
+
: Buffer.alloc(1),
|
|
306
|
+
parentFingerPrint: typeof arg.parentFingerPrint === 'number'
|
|
307
|
+
? Buffer.from([arg.parentFingerPrint])
|
|
308
|
+
: Buffer.isBuffer(arg.parentFingerPrint)
|
|
309
|
+
? arg.parentFingerPrint
|
|
310
|
+
: Buffer.alloc(4),
|
|
311
|
+
childIndex: Buffer.alloc(4),
|
|
312
|
+
chainCode: typeof arg.chainCode === 'string'
|
|
313
|
+
? Buffer.from(arg.chainCode, 'hex')
|
|
314
|
+
: Buffer.isBuffer(arg.chainCode)
|
|
315
|
+
? arg.chainCode
|
|
316
|
+
: Buffer.alloc(32),
|
|
317
|
+
publicKey: typeof arg.publicKey === 'string'
|
|
318
|
+
? Buffer.from(arg.publicKey, 'hex')
|
|
319
|
+
: Buffer.isBuffer(arg.publicKey)
|
|
320
|
+
? arg.publicKey
|
|
321
|
+
: arg.publicKey?.toBuffer() || Buffer.alloc(33),
|
|
322
|
+
checksum: undefined,
|
|
323
|
+
};
|
|
324
|
+
if (arg.network) {
|
|
325
|
+
const network = getNetwork(arg.network);
|
|
326
|
+
if (network) {
|
|
327
|
+
buffers.version.writeUInt32BE(network.xpubkey, 0);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (typeof arg.childIndex === 'number') {
|
|
331
|
+
buffers.childIndex.writeUInt32BE(arg.childIndex, 0);
|
|
332
|
+
}
|
|
333
|
+
return this._buildFromBuffers(buffers);
|
|
334
|
+
}
|
|
335
|
+
derive(arg, hardened) {
|
|
336
|
+
return this.deriveChild(arg, hardened);
|
|
337
|
+
}
|
|
338
|
+
deriveChild(arg, hardened) {
|
|
339
|
+
if (typeof arg === 'number') {
|
|
340
|
+
return this._deriveWithNumber(arg, hardened);
|
|
341
|
+
}
|
|
342
|
+
else if (typeof arg === 'string') {
|
|
343
|
+
return this._deriveFromString(arg);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
throw new Error('Invalid derivation argument');
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
_deriveWithNumber(index, hardened) {
|
|
350
|
+
if (index >= HDPublicKey.Hardened || hardened) {
|
|
351
|
+
throw new Error('Cannot derive hardened keys from public key');
|
|
352
|
+
}
|
|
353
|
+
if (index < 0) {
|
|
354
|
+
throw new Error('Invalid path');
|
|
355
|
+
}
|
|
356
|
+
const indexBuffer = Buffer.alloc(4);
|
|
357
|
+
indexBuffer.writeUInt32BE(index, 0);
|
|
358
|
+
const data = Buffer.concat([this.publicKey.toBuffer(), indexBuffer]);
|
|
359
|
+
const hash = Hash.sha512hmac(data, this._buffers.chainCode);
|
|
360
|
+
const leftPart = new BN(hash.subarray(0, 32));
|
|
361
|
+
const chainCode = hash.subarray(32, 64);
|
|
362
|
+
let publicKey;
|
|
363
|
+
try {
|
|
364
|
+
publicKey = PublicKey.fromPoint(Point.getG().mul(leftPart).add(this.publicKey.point));
|
|
365
|
+
}
|
|
366
|
+
catch (e) {
|
|
367
|
+
return this._deriveWithNumber(index + 1);
|
|
368
|
+
}
|
|
369
|
+
const derived = new HDPublicKey({
|
|
370
|
+
network: this.network,
|
|
371
|
+
depth: this.depth + 1,
|
|
372
|
+
parentFingerPrint: this.fingerPrint,
|
|
373
|
+
childIndex: index,
|
|
374
|
+
chainCode: chainCode,
|
|
375
|
+
publicKey: publicKey,
|
|
376
|
+
});
|
|
377
|
+
return derived;
|
|
378
|
+
}
|
|
379
|
+
_deriveFromString(path) {
|
|
380
|
+
if (path.includes("'")) {
|
|
381
|
+
throw new Error('Cannot derive hardened keys from public key');
|
|
382
|
+
}
|
|
383
|
+
else if (!HDPublicKey.isValidPath(path)) {
|
|
384
|
+
throw new Error('Invalid path');
|
|
385
|
+
}
|
|
386
|
+
const indexes = path.split('/').slice(1).map(Number);
|
|
387
|
+
const derived = indexes.reduce((prev, index) => {
|
|
388
|
+
return prev._deriveWithNumber(index);
|
|
389
|
+
}, this);
|
|
390
|
+
return derived;
|
|
391
|
+
}
|
|
392
|
+
toString() {
|
|
393
|
+
return this.xpubkey.toString();
|
|
394
|
+
}
|
|
395
|
+
toBuffer() {
|
|
396
|
+
return Buffer.from(this._buffers.xpubkey || Buffer.alloc(0));
|
|
397
|
+
}
|
|
398
|
+
toObject() {
|
|
399
|
+
return {
|
|
400
|
+
network: this.network.name,
|
|
401
|
+
depth: this.depth,
|
|
402
|
+
fingerPrint: this.fingerPrint.toString('hex'),
|
|
403
|
+
parentFingerPrint: this._buffers.parentFingerPrint.toString('hex'),
|
|
404
|
+
childIndex: this._buffers.childIndex.readUInt32BE(0),
|
|
405
|
+
chainCode: this._buffers.chainCode.toString('hex'),
|
|
406
|
+
publicKey: this.publicKey.toString(),
|
|
407
|
+
xpubkey: this.xpubkey.toString(),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
toJSON() {
|
|
411
|
+
return JSON.stringify(this.toObject());
|
|
412
|
+
}
|
|
413
|
+
inspect() {
|
|
414
|
+
return '<HDPublicKey: ' + this.xpubkey + '>';
|
|
415
|
+
}
|
|
416
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export { Hash } from './crypto/hash.js';
|
|
2
|
+
export { Random } from './crypto/random.js';
|
|
3
|
+
export { Point } from './crypto/point.js';
|
|
4
|
+
export { Signature } from './crypto/signature.js';
|
|
5
|
+
export { ECDSA } from './crypto/ecdsa.js';
|
|
6
|
+
export { Schnorr } from './crypto/schnorr.js';
|
|
7
|
+
export { BN } from './crypto/bn.js';
|
|
8
|
+
export { musigKeyAgg, musigNonceGen, musigNonceAgg, musigPartialSign, musigPartialSigVerify, musigSigAgg, musigTaggedHash, type MuSigKeyAggContext, type MuSigNonce, type MuSigAggregatedNonce, } from './crypto/musig2.js';
|
|
9
|
+
export { MuSigSessionManager, MuSigSessionPhase, type MuSigSession, } from './musig2/session.js';
|
|
10
|
+
export { MuSig2Signer, createMuSig2Signer, type MuSig2SignerConfig, type MuSig2PrepareResult, type MuSig2SignResult, type MuSig2TaprootSignResult, } from './musig2/signer.js';
|
|
11
|
+
export { buildMuSigTaprootKey, buildMuSigTaprootKeyWithScripts, signTaprootKeyPathWithMuSig2, verifyTaprootKeyPathMuSigPartial, isMuSigTaprootOutput, createMuSigTaprootAddress, type MuSigTaprootKeyResult, } from './taproot/musig2.js';
|
|
12
|
+
export { PrivateKey } from './privatekey.js';
|
|
13
|
+
export { PublicKey } from './publickey.js';
|
|
14
|
+
export { HDPrivateKey } from './hdprivatekey.js';
|
|
15
|
+
export { HDPublicKey } from './hdpublickey.js';
|
|
16
|
+
export { JSUtil } from './util/js.js';
|
|
17
|
+
export { Preconditions } from './util/preconditions.js';
|
|
18
|
+
export { Base32 } from './util/base32.js';
|
|
19
|
+
export { convertBits } from './util/convertBits.js';
|
|
20
|
+
export { BufferUtil, NULL_HASH, EMPTY_BUFFER } from './util/buffer.js';
|
|
21
|
+
export { util } from './util.js';
|
|
22
|
+
export { BitcoreError } from './errors.js';
|
|
23
|
+
export { Base58 } from './encoding/base58.js';
|
|
24
|
+
export { Base58Check } from './encoding/base58check.js';
|
|
25
|
+
export { BufferReader } from './encoding/bufferreader.js';
|
|
26
|
+
export { BufferWriter, BufferWriterFactory } from './encoding/bufferwriter.js';
|
|
27
|
+
export { Varint } from './encoding/varint.js';
|
|
28
|
+
export { Network, livenet, testnet, regtest, networks, defaultNetwork, get as getNetwork, add as addNetwork, remove as removeNetwork, Networks, } from './networks.js';
|
|
29
|
+
export { Address } from './address.js';
|
|
30
|
+
export { XAddress } from './xaddress.js';
|
|
31
|
+
export { Script } from './script.js';
|
|
32
|
+
export { Opcode } from './opcode.js';
|
|
33
|
+
export { Interpreter } from './script/interpreter.js';
|
|
34
|
+
export { Chunk } from './chunk.js';
|
|
35
|
+
export { type ScriptType, ScriptTypes, toAddress, empty } from './script.js';
|
|
36
|
+
export { Unit } from './unit.js';
|
|
37
|
+
export { Message } from './message.js';
|
|
38
|
+
export { URI } from './uri.js';
|
|
39
|
+
export { Input, MultisigInput, MultisigScriptHashInput, PublicKeyInput, PublicKeyHashInput, TaprootInput, Output, UnspentOutput, sighash, sign, verify, TransactionSignature, Transaction, } from './transaction/index.js';
|
|
40
|
+
export { DEFAULT_SIGN_FLAGS, SIGHASH_SINGLE_BUG, BITS_64_ON, } from './transaction/sighash.js';
|
|
41
|
+
export { buildKeyPathTaproot, buildPayToTaproot, buildScriptPathTaproot, buildTapTree, calculateTapBranch, calculateTapLeaf, calculateTapTweak, createControlBlock, extractTaprootCommitment, extractTaprootState, isPayToTaproot, isTapLeafNode, isTapBranchNode, taggedHash, tweakPublicKey, tweakPrivateKey, verifyTaprootCommitment, verifyTaprootScriptPath, verifyTaprootSpend, TAPROOT_LEAF_MASK, TAPROOT_LEAF_TAPSCRIPT, TAPROOT_CONTROL_BASE_SIZE, TAPROOT_CONTROL_NODE_SIZE, TAPROOT_CONTROL_MAX_NODE_COUNT, TAPROOT_CONTROL_MAX_SIZE, TAPROOT_SCRIPTTYPE, TAPROOT_INTRO_SIZE, TAPROOT_SIGHASH_TYPE, TAPROOT_SIZE_WITHOUT_STATE, TAPROOT_SIZE_WITH_STATE, TAPROOT_ANNEX_TAG, type TapLeafNode, type TapBranchNode, type TapNode, type TapLeaf, type TapTreeBuildResult, } from './taproot.js';
|
|
42
|
+
export { NFT, NFTUtil } from './taproot/nft.js';
|
|
43
|
+
export type { NFTMetadata, NFTAttribute, NFTCollectionMetadata, NFTData, NFTTransfer, NFTMintConfig, NFTTransferConfig, NFTUtxo, NFTWithScriptPath, NFTWithCollection, NFTInfo, NFTObject, } from './taproot/nft.js';
|
|
44
|
+
export { Block, BlockHeader } from './block/index.js';
|
|
45
|
+
export { Mnemonic, MnemonicError, pbkdf2, Words } from './mnemonic/index.js';
|
|
46
|
+
export type { InputData, InputObject, OutputData, OutputObject, UnspentOutputData, UnspentOutputObject, TransactionSignatureData, TransactionSignatureObject, TransactionData, TransactionObject, } from './transaction/index.js';
|
|
47
|
+
export type { BlockData, BlockObject, BlockHeaderData, BlockHeaderObject, } from './block/index.js';
|
|
48
|
+
export type { NetworkConfig } from './networks.js';
|
|
49
|
+
export type { PrivateKeyData, PrivateKeyObject, PrivateKeySerialized, } from './privatekey.js';
|
|
50
|
+
export type { PublicKeyData, PublicKeyExtra, PublicKeyObject, PublicKeySerialized, } from './publickey.js';
|
|
51
|
+
export type { HDPrivateKeyData, HDPrivateKeyObject, HDPrivateKeyBuffers, } from './hdprivatekey.js';
|
|
52
|
+
export type { HDPublicKeyData, HDPublicKeyObject, HDPublicKeyBuffers, } from './hdpublickey.js';
|
|
53
|
+
export type { AddressData, AddressObject, CashAddressDecoding, } from './address.js';
|
|
54
|
+
export type { XAddressData, XAddressObject } from './xaddress.js';
|
|
55
|
+
export type { ScriptData } from './script.js';
|
|
56
|
+
export type { TaprootVerifyResult } from './taproot.js';
|
|
57
|
+
export type { URIParams } from './uri.js';
|
|
58
|
+
export type { UnitData } from './unit.js';
|
|
59
|
+
export type { TransactionLike } from './transaction/sighash.js';
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/bitcore/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export { Hash } from './crypto/hash.js';
|
|
2
|
+
export { Random } from './crypto/random.js';
|
|
3
|
+
export { Point } from './crypto/point.js';
|
|
4
|
+
export { Signature } from './crypto/signature.js';
|
|
5
|
+
export { ECDSA } from './crypto/ecdsa.js';
|
|
6
|
+
export { Schnorr } from './crypto/schnorr.js';
|
|
7
|
+
export { BN } from './crypto/bn.js';
|
|
8
|
+
export { musigKeyAgg, musigNonceGen, musigNonceAgg, musigPartialSign, musigPartialSigVerify, musigSigAgg, musigTaggedHash, } from './crypto/musig2.js';
|
|
9
|
+
export { MuSigSessionManager, MuSigSessionPhase, } from './musig2/session.js';
|
|
10
|
+
export { MuSig2Signer, createMuSig2Signer, } from './musig2/signer.js';
|
|
11
|
+
export { buildMuSigTaprootKey, buildMuSigTaprootKeyWithScripts, signTaprootKeyPathWithMuSig2, verifyTaprootKeyPathMuSigPartial, isMuSigTaprootOutput, createMuSigTaprootAddress, } from './taproot/musig2.js';
|
|
12
|
+
export { PrivateKey } from './privatekey.js';
|
|
13
|
+
export { PublicKey } from './publickey.js';
|
|
14
|
+
export { HDPrivateKey } from './hdprivatekey.js';
|
|
15
|
+
export { HDPublicKey } from './hdpublickey.js';
|
|
16
|
+
export { JSUtil } from './util/js.js';
|
|
17
|
+
export { Preconditions } from './util/preconditions.js';
|
|
18
|
+
export { Base32 } from './util/base32.js';
|
|
19
|
+
export { convertBits } from './util/convertBits.js';
|
|
20
|
+
export { BufferUtil, NULL_HASH, EMPTY_BUFFER } from './util/buffer.js';
|
|
21
|
+
export { util } from './util.js';
|
|
22
|
+
export { BitcoreError } from './errors.js';
|
|
23
|
+
export { Base58 } from './encoding/base58.js';
|
|
24
|
+
export { Base58Check } from './encoding/base58check.js';
|
|
25
|
+
export { BufferReader } from './encoding/bufferreader.js';
|
|
26
|
+
export { BufferWriter, BufferWriterFactory } from './encoding/bufferwriter.js';
|
|
27
|
+
export { Varint } from './encoding/varint.js';
|
|
28
|
+
export { Network, livenet, testnet, regtest, networks, defaultNetwork, get as getNetwork, add as addNetwork, remove as removeNetwork, Networks, } from './networks.js';
|
|
29
|
+
export { Address } from './address.js';
|
|
30
|
+
export { XAddress } from './xaddress.js';
|
|
31
|
+
export { Script } from './script.js';
|
|
32
|
+
export { Opcode } from './opcode.js';
|
|
33
|
+
export { Interpreter } from './script/interpreter.js';
|
|
34
|
+
export { Chunk } from './chunk.js';
|
|
35
|
+
export { ScriptTypes, toAddress, empty } from './script.js';
|
|
36
|
+
export { Unit } from './unit.js';
|
|
37
|
+
export { Message } from './message.js';
|
|
38
|
+
export { URI } from './uri.js';
|
|
39
|
+
export { Input, MultisigInput, MultisigScriptHashInput, PublicKeyInput, PublicKeyHashInput, TaprootInput, Output, UnspentOutput, sighash, sign, verify, TransactionSignature, Transaction, } from './transaction/index.js';
|
|
40
|
+
export { DEFAULT_SIGN_FLAGS, SIGHASH_SINGLE_BUG, BITS_64_ON, } from './transaction/sighash.js';
|
|
41
|
+
export { buildKeyPathTaproot, buildPayToTaproot, buildScriptPathTaproot, buildTapTree, calculateTapBranch, calculateTapLeaf, calculateTapTweak, createControlBlock, extractTaprootCommitment, extractTaprootState, isPayToTaproot, isTapLeafNode, isTapBranchNode, taggedHash, tweakPublicKey, tweakPrivateKey, verifyTaprootCommitment, verifyTaprootScriptPath, verifyTaprootSpend, TAPROOT_LEAF_MASK, TAPROOT_LEAF_TAPSCRIPT, TAPROOT_CONTROL_BASE_SIZE, TAPROOT_CONTROL_NODE_SIZE, TAPROOT_CONTROL_MAX_NODE_COUNT, TAPROOT_CONTROL_MAX_SIZE, TAPROOT_SCRIPTTYPE, TAPROOT_INTRO_SIZE, TAPROOT_SIGHASH_TYPE, TAPROOT_SIZE_WITHOUT_STATE, TAPROOT_SIZE_WITH_STATE, TAPROOT_ANNEX_TAG, } from './taproot.js';
|
|
42
|
+
export { NFT, NFTUtil } from './taproot/nft.js';
|
|
43
|
+
export { Block, BlockHeader } from './block/index.js';
|
|
44
|
+
export { Mnemonic, MnemonicError, pbkdf2, Words } from './mnemonic/index.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PrivateKey } from './privatekey.js';
|
|
2
|
+
import { Address } from './address.js';
|
|
3
|
+
export declare class Message {
|
|
4
|
+
private _message;
|
|
5
|
+
error?: string;
|
|
6
|
+
static readonly MAGIC_BYTES: Buffer<ArrayBuffer>;
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
magicHash(): Buffer;
|
|
9
|
+
private _sign;
|
|
10
|
+
sign(privateKey: PrivateKey): string;
|
|
11
|
+
private _verify;
|
|
12
|
+
verify(bitcoinAddress: Address | string, signatureString: string): boolean;
|
|
13
|
+
recoverPublicKey(bitcoinAddress: Address | string, signatureString: string): string;
|
|
14
|
+
static fromString(str: string): Message;
|
|
15
|
+
static fromJSON(json: string | object): Message;
|
|
16
|
+
toObject(): {
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
toJSON(): string;
|
|
20
|
+
toString(): string;
|
|
21
|
+
inspect(): string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../lib/bitcore/message.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAKtC,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAQ;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IAKrB,MAAM,CAAC,QAAQ,CAAC,WAAW,sBAA2C;gBAE1D,OAAO,EAAE,MAAM;IAW3B,SAAS,IAAI,MAAM;IAiBnB,OAAO,CAAC,KAAK;IAkBb,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAQpC,OAAO,CAAC,OAAO;IAoBf,MAAM,CAAC,cAAc,EAAE,OAAO,GAAG,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAoC1E,gBAAgB,CACd,cAAc,EAAE,OAAO,GAAG,MAAM,EAChC,eAAe,EAAE,MAAM,GACtB,MAAM;IAmCT,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAOvC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAU/C,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAO/B,MAAM,IAAI,MAAM;IAOhB,QAAQ,IAAI,MAAM;IAOlB,OAAO,IAAI,MAAM;CAGlB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Hash } from './crypto/hash.js';
|
|
2
|
+
import { ECDSA } from './crypto/ecdsa.js';
|
|
3
|
+
import { Signature } from './crypto/signature.js';
|
|
4
|
+
import { PrivateKey } from './privatekey.js';
|
|
5
|
+
import { PublicKey } from './publickey.js';
|
|
6
|
+
import { Address } from './address.js';
|
|
7
|
+
import { JSUtil } from './util/js.js';
|
|
8
|
+
import { BufferWriter } from './encoding/bufferwriter.js';
|
|
9
|
+
import { Preconditions } from './util/preconditions.js';
|
|
10
|
+
export class Message {
|
|
11
|
+
_message;
|
|
12
|
+
error;
|
|
13
|
+
static MAGIC_BYTES = Buffer.from('Bitcoin Signed Message:\n');
|
|
14
|
+
constructor(message) {
|
|
15
|
+
Preconditions.checkArgument(typeof message === 'string', 'First argument should be a string');
|
|
16
|
+
this._message = message;
|
|
17
|
+
}
|
|
18
|
+
magicHash() {
|
|
19
|
+
const prefix1 = BufferWriter.varintBufNum(Message.MAGIC_BYTES.length);
|
|
20
|
+
const messageBuffer = Buffer.from(this._message);
|
|
21
|
+
const prefix2 = BufferWriter.varintBufNum(messageBuffer.length);
|
|
22
|
+
const buf = Buffer.concat([
|
|
23
|
+
prefix1,
|
|
24
|
+
Message.MAGIC_BYTES,
|
|
25
|
+
prefix2,
|
|
26
|
+
messageBuffer,
|
|
27
|
+
]);
|
|
28
|
+
const hash = Hash.sha256sha256(buf);
|
|
29
|
+
return hash;
|
|
30
|
+
}
|
|
31
|
+
_sign(privateKey) {
|
|
32
|
+
Preconditions.checkArgument(privateKey instanceof PrivateKey, 'First argument should be an instance of PrivateKey');
|
|
33
|
+
const hash = this.magicHash();
|
|
34
|
+
const ecdsa = new ECDSA();
|
|
35
|
+
ecdsa.hashbuf = hash;
|
|
36
|
+
ecdsa.privkey = privateKey;
|
|
37
|
+
ecdsa.pubkey = privateKey.toPublicKey();
|
|
38
|
+
ecdsa.signRandomK();
|
|
39
|
+
ecdsa.calci();
|
|
40
|
+
return ecdsa.sig;
|
|
41
|
+
}
|
|
42
|
+
sign(privateKey) {
|
|
43
|
+
const signature = this._sign(privateKey);
|
|
44
|
+
return signature.toCompact().toString('base64');
|
|
45
|
+
}
|
|
46
|
+
_verify(publicKey, signature) {
|
|
47
|
+
Preconditions.checkArgument(publicKey instanceof PublicKey, 'First argument should be an instance of PublicKey');
|
|
48
|
+
Preconditions.checkArgument(signature instanceof Signature, 'Second argument should be an instance of Signature');
|
|
49
|
+
const hash = this.magicHash();
|
|
50
|
+
const verified = ECDSA.verify(hash, signature, publicKey);
|
|
51
|
+
if (!verified) {
|
|
52
|
+
this.error = 'The signature was invalid';
|
|
53
|
+
}
|
|
54
|
+
return verified;
|
|
55
|
+
}
|
|
56
|
+
verify(bitcoinAddress, signatureString) {
|
|
57
|
+
Preconditions.checkArgument(!!bitcoinAddress, 'bitcoinAddress is required');
|
|
58
|
+
Preconditions.checkArgument(!!(signatureString && typeof signatureString === 'string'), 'signatureString is required');
|
|
59
|
+
const address = typeof bitcoinAddress === 'string'
|
|
60
|
+
? Address.fromString(bitcoinAddress)
|
|
61
|
+
: bitcoinAddress;
|
|
62
|
+
const signature = Signature.fromCompact(Buffer.from(signatureString, 'base64'));
|
|
63
|
+
const ecdsa = new ECDSA();
|
|
64
|
+
ecdsa.hashbuf = this.magicHash();
|
|
65
|
+
ecdsa.sig = signature;
|
|
66
|
+
const publicKey = ecdsa.toPublicKey();
|
|
67
|
+
const signatureAddress = Address.fromPublicKey(publicKey, address.network);
|
|
68
|
+
if (address.toString() !== signatureAddress.toString()) {
|
|
69
|
+
this.error = 'The signature did not match the message digest';
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return this._verify(publicKey, signature);
|
|
73
|
+
}
|
|
74
|
+
recoverPublicKey(bitcoinAddress, signatureString) {
|
|
75
|
+
Preconditions.checkArgument(!!bitcoinAddress, 'bitcoinAddress is required');
|
|
76
|
+
Preconditions.checkArgument(!!(signatureString && typeof signatureString === 'string'), 'signatureString is required');
|
|
77
|
+
const address = typeof bitcoinAddress === 'string'
|
|
78
|
+
? Address.fromString(bitcoinAddress)
|
|
79
|
+
: bitcoinAddress;
|
|
80
|
+
const signature = Signature.fromCompact(Buffer.from(signatureString, 'base64'));
|
|
81
|
+
const ecdsa = new ECDSA();
|
|
82
|
+
ecdsa.hashbuf = this.magicHash();
|
|
83
|
+
ecdsa.sig = signature;
|
|
84
|
+
const publicKey = ecdsa.toPublicKey();
|
|
85
|
+
const signatureAddress = Address.fromPublicKey(publicKey, address.network);
|
|
86
|
+
if (address.toString() !== signatureAddress.toString()) {
|
|
87
|
+
this.error = 'The signature did not match the message digest';
|
|
88
|
+
}
|
|
89
|
+
return publicKey.toString();
|
|
90
|
+
}
|
|
91
|
+
static fromString(str) {
|
|
92
|
+
return new Message(str);
|
|
93
|
+
}
|
|
94
|
+
static fromJSON(json) {
|
|
95
|
+
if (typeof json === 'string' && JSUtil.isValidJSON(json)) {
|
|
96
|
+
json = JSON.parse(json);
|
|
97
|
+
}
|
|
98
|
+
return new Message(json.message);
|
|
99
|
+
}
|
|
100
|
+
toObject() {
|
|
101
|
+
return { message: this._message };
|
|
102
|
+
}
|
|
103
|
+
toJSON() {
|
|
104
|
+
return JSON.stringify(this.toObject());
|
|
105
|
+
}
|
|
106
|
+
toString() {
|
|
107
|
+
return this._message;
|
|
108
|
+
}
|
|
109
|
+
inspect() {
|
|
110
|
+
return '<Message: ' + this.toString() + '>';
|
|
111
|
+
}
|
|
112
|
+
}
|