xpi-ts 0.2.13 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lib/bitcore/address.js +75 -74
- package/dist/cjs/lib/bitcore/block/block.js +124 -126
- package/dist/cjs/lib/bitcore/block/blockheader.js +142 -208
- package/dist/cjs/lib/bitcore/block/index.js +3 -1
- package/dist/cjs/lib/bitcore/block/merkleblock.js +301 -0
- package/dist/cjs/lib/bitcore/crypto/bn.js +18 -22
- package/dist/cjs/lib/bitcore/crypto/ecdsa.js +50 -49
- package/dist/cjs/lib/bitcore/crypto/hash.js +25 -22
- package/dist/cjs/lib/bitcore/crypto/musig2.js +86 -92
- package/dist/cjs/lib/bitcore/crypto/point.js +42 -35
- package/dist/cjs/lib/bitcore/crypto/random.js +3 -2
- package/dist/cjs/lib/bitcore/crypto/schnorr.js +46 -55
- package/dist/cjs/lib/bitcore/crypto/signature.js +67 -55
- package/dist/cjs/lib/bitcore/crypto/sigtype.js +1 -1
- package/dist/cjs/lib/bitcore/encoding/base58.js +5 -4
- package/dist/cjs/lib/bitcore/encoding/base58check.js +14 -57
- package/dist/cjs/lib/bitcore/encoding/bufferreader.js +17 -17
- package/dist/cjs/lib/bitcore/encoding/bufferwriter.js +22 -26
- package/dist/cjs/lib/bitcore/encoding/varint.js +12 -11
- package/dist/cjs/lib/bitcore/errors.js +1 -0
- package/dist/cjs/lib/bitcore/hdprivatekey.js +74 -66
- package/dist/cjs/lib/bitcore/hdpublickey.js +96 -116
- package/dist/cjs/lib/bitcore/index.js +165 -172
- package/dist/cjs/lib/bitcore/message.js +36 -35
- package/dist/cjs/lib/bitcore/mnemonic/mnemonic.js +4 -3
- package/dist/cjs/lib/bitcore/mnemonic/pbkdf2.js +6 -5
- package/dist/cjs/lib/bitcore/mnemonic/words/french.js +2053 -0
- package/dist/cjs/lib/bitcore/mnemonic/words/index.js +2 -0
- package/dist/cjs/lib/bitcore/musig2/session.js +26 -25
- package/dist/cjs/lib/bitcore/musig2/signer.js +17 -16
- package/dist/cjs/lib/bitcore/networks.js +4 -3
- package/dist/cjs/lib/bitcore/opcode.js +11 -7
- package/dist/cjs/lib/bitcore/privatekey.js +42 -42
- package/dist/cjs/lib/bitcore/publickey.js +61 -57
- package/dist/cjs/lib/bitcore/script/interpreter/condition-stack.js +41 -0
- package/dist/cjs/lib/bitcore/script/interpreter/index.js +25 -0
- package/dist/cjs/lib/bitcore/script/interpreter/interpreter.js +1362 -0
- package/dist/cjs/lib/bitcore/script/interpreter/script-num.js +200 -0
- package/dist/cjs/lib/bitcore/script/interpreter/types.js +96 -0
- package/dist/cjs/lib/bitcore/{taproot.js → script/taproot.js} +107 -95
- package/dist/cjs/lib/bitcore/script.js +163 -104
- package/dist/cjs/lib/bitcore/taproot/musig2.js +51 -42
- package/dist/cjs/lib/bitcore/transaction/index.js +21 -21
- package/dist/cjs/lib/bitcore/transaction/input/multisig.js +10 -0
- package/dist/cjs/lib/bitcore/transaction/input/multisigscripthash.js +10 -0
- package/dist/cjs/lib/bitcore/transaction/input/publickey.js +10 -0
- package/dist/cjs/lib/bitcore/transaction/input/publickeyhash.js +10 -0
- package/dist/cjs/lib/bitcore/transaction/input/taproot.js +20 -0
- package/dist/cjs/lib/bitcore/transaction/input.js +145 -166
- package/dist/cjs/lib/bitcore/transaction/outpoint.js +89 -0
- package/dist/cjs/lib/bitcore/transaction/output.js +13 -8
- package/dist/cjs/lib/bitcore/transaction/sighash.js +96 -96
- package/dist/cjs/lib/bitcore/transaction/signature.js +39 -40
- package/dist/cjs/lib/bitcore/transaction/transaction.js +130 -118
- package/dist/cjs/lib/bitcore/transaction/unspentoutput.js +27 -23
- package/dist/cjs/lib/bitcore/util/bits.js +33 -0
- package/dist/cjs/lib/bitcore/util/buffer.js +29 -18
- package/dist/cjs/lib/bitcore/util/js.js +0 -3
- package/dist/cjs/lib/bitcore/util/merkle.js +53 -0
- package/dist/cjs/lib/bitcore/util/preconditions.js +8 -7
- package/dist/cjs/lib/bitcore/xaddress.js +27 -23
- package/dist/cjs/lib/{bitcore/taproot/nft.js → nft.js} +98 -29
- package/dist/cjs/lib/rank/index.js +28 -27
- package/dist/cjs/lib/rank/script.js +2 -1
- package/dist/cjs/lib/rank/transaction.js +2 -1
- package/dist/cjs/utils/string.js +6 -5
- package/dist/esm/lib/bitcore/address.js +42 -41
- package/dist/esm/lib/bitcore/block/block.js +126 -128
- package/dist/esm/lib/bitcore/block/blockheader.js +141 -207
- package/dist/esm/lib/bitcore/block/index.js +1 -0
- package/dist/esm/lib/bitcore/block/merkleblock.js +295 -0
- package/dist/esm/lib/bitcore/crypto/bn.js +18 -22
- package/dist/esm/lib/bitcore/crypto/ecdsa.js +25 -24
- package/dist/esm/lib/bitcore/crypto/hash.js +25 -22
- package/dist/esm/lib/bitcore/crypto/musig2.js +60 -66
- package/dist/esm/lib/bitcore/crypto/point.js +22 -15
- package/dist/esm/lib/bitcore/crypto/random.js +3 -2
- package/dist/esm/lib/bitcore/crypto/schnorr.js +35 -44
- package/dist/esm/lib/bitcore/crypto/signature.js +61 -49
- package/dist/esm/lib/bitcore/crypto/sigtype.js +1 -1
- package/dist/esm/lib/bitcore/encoding/base58.js +5 -4
- package/dist/esm/lib/bitcore/encoding/base58check.js +11 -57
- package/dist/esm/lib/bitcore/encoding/bufferreader.js +7 -7
- package/dist/esm/lib/bitcore/encoding/bufferwriter.js +18 -21
- package/dist/esm/lib/bitcore/encoding/varint.js +7 -6
- package/dist/esm/lib/bitcore/errors.js +1 -0
- package/dist/esm/lib/bitcore/hdprivatekey.js +47 -39
- package/dist/esm/lib/bitcore/hdpublickey.js +77 -97
- package/dist/esm/lib/bitcore/index.js +42 -45
- package/dist/esm/lib/bitcore/message.js +16 -15
- package/dist/esm/lib/bitcore/mnemonic/mnemonic.js +4 -3
- package/dist/esm/lib/bitcore/mnemonic/pbkdf2.js +5 -4
- package/dist/esm/lib/bitcore/mnemonic/words/french.js +2050 -0
- package/dist/esm/lib/bitcore/mnemonic/words/index.js +2 -0
- package/dist/esm/lib/bitcore/musig2/session.js +17 -16
- package/dist/esm/lib/bitcore/musig2/signer.js +19 -18
- package/dist/esm/lib/bitcore/networks.js +4 -3
- package/dist/esm/lib/bitcore/opcode.js +9 -5
- package/dist/esm/lib/bitcore/privatekey.js +25 -25
- package/dist/esm/lib/bitcore/publickey.js +46 -42
- package/dist/esm/lib/bitcore/script/interpreter/condition-stack.js +37 -0
- package/dist/esm/lib/bitcore/script/interpreter/index.js +4 -0
- package/dist/esm/lib/bitcore/script/interpreter/interpreter.js +1356 -0
- package/dist/esm/lib/bitcore/script/interpreter/script-num.js +195 -0
- package/dist/esm/lib/bitcore/script/interpreter/types.js +93 -0
- package/dist/esm/lib/bitcore/{taproot.js → script/taproot.js} +92 -81
- package/dist/esm/lib/bitcore/script.js +163 -102
- package/dist/esm/lib/bitcore/taproot/musig2.js +36 -27
- package/dist/esm/lib/bitcore/transaction/index.js +6 -6
- package/dist/esm/lib/bitcore/transaction/input/multisig.js +6 -0
- package/dist/esm/lib/bitcore/transaction/input/multisigscripthash.js +6 -0
- package/dist/esm/lib/bitcore/transaction/input/publickey.js +6 -0
- package/dist/esm/lib/bitcore/transaction/input/publickeyhash.js +6 -0
- package/dist/esm/lib/bitcore/transaction/input/taproot.js +16 -0
- package/dist/esm/lib/bitcore/transaction/input.js +55 -76
- package/dist/esm/lib/bitcore/transaction/outpoint.js +85 -0
- package/dist/esm/lib/bitcore/transaction/output.js +13 -8
- package/dist/esm/lib/bitcore/transaction/sighash.js +22 -22
- package/dist/esm/lib/bitcore/transaction/signature.js +16 -17
- package/dist/esm/lib/bitcore/transaction/transaction.js +58 -46
- package/dist/esm/lib/bitcore/transaction/unspentoutput.js +15 -11
- package/dist/esm/lib/bitcore/util/bits.js +27 -0
- package/dist/esm/lib/bitcore/util/buffer.js +20 -9
- package/dist/esm/lib/bitcore/util/js.js +0 -3
- package/dist/esm/lib/bitcore/util/merkle.js +47 -0
- package/dist/esm/lib/bitcore/util/preconditions.js +3 -2
- package/dist/esm/lib/bitcore/xaddress.js +16 -12
- package/dist/esm/lib/{bitcore/taproot/nft.js → nft.js} +97 -28
- package/dist/esm/lib/rank/index.js +15 -14
- package/dist/esm/lib/rank/script.js +1 -0
- package/dist/esm/lib/rank/transaction.js +1 -0
- package/dist/esm/utils/string.js +1 -0
- package/dist/types/lib/bitcore/address.d.ts +4 -3
- package/dist/types/lib/bitcore/address.d.ts.map +1 -1
- package/dist/types/lib/bitcore/block/block.d.ts +11 -19
- package/dist/types/lib/bitcore/block/block.d.ts.map +1 -1
- package/dist/types/lib/bitcore/block/blockheader.d.ts +30 -32
- package/dist/types/lib/bitcore/block/blockheader.d.ts.map +1 -1
- package/dist/types/lib/bitcore/block/index.d.ts +2 -0
- package/dist/types/lib/bitcore/block/index.d.ts.map +1 -1
- package/dist/types/lib/bitcore/block/merkleblock.d.ts +53 -0
- package/dist/types/lib/bitcore/block/merkleblock.d.ts.map +1 -0
- package/dist/types/lib/bitcore/crypto/bn.d.ts +2 -2
- package/dist/types/lib/bitcore/crypto/bn.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/ecdsa.d.ts +5 -4
- package/dist/types/lib/bitcore/crypto/ecdsa.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/hash.d.ts +3 -1
- package/dist/types/lib/bitcore/crypto/hash.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/musig2.d.ts +22 -30
- package/dist/types/lib/bitcore/crypto/musig2.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/point.d.ts +8 -3
- package/dist/types/lib/bitcore/crypto/point.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/random.d.ts +1 -0
- package/dist/types/lib/bitcore/crypto/random.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/schnorr.d.ts +5 -4
- package/dist/types/lib/bitcore/crypto/schnorr.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/signature.d.ts +4 -1
- package/dist/types/lib/bitcore/crypto/signature.d.ts.map +1 -1
- package/dist/types/lib/bitcore/crypto/sigtype.d.ts +1 -0
- package/dist/types/lib/bitcore/crypto/sigtype.d.ts.map +1 -1
- package/dist/types/lib/bitcore/encoding/base58.d.ts +1 -0
- package/dist/types/lib/bitcore/encoding/base58.d.ts.map +1 -1
- package/dist/types/lib/bitcore/encoding/base58check.d.ts +1 -2
- package/dist/types/lib/bitcore/encoding/base58check.d.ts.map +1 -1
- package/dist/types/lib/bitcore/encoding/bufferreader.d.ts +2 -1
- package/dist/types/lib/bitcore/encoding/bufferreader.d.ts.map +1 -1
- package/dist/types/lib/bitcore/encoding/bufferwriter.d.ts +2 -2
- package/dist/types/lib/bitcore/encoding/bufferwriter.d.ts.map +1 -1
- package/dist/types/lib/bitcore/encoding/varint.d.ts +3 -2
- package/dist/types/lib/bitcore/encoding/varint.d.ts.map +1 -1
- package/dist/types/lib/bitcore/errors.d.ts +3 -0
- package/dist/types/lib/bitcore/errors.d.ts.map +1 -1
- package/dist/types/lib/bitcore/hdprivatekey.d.ts +5 -4
- package/dist/types/lib/bitcore/hdprivatekey.d.ts.map +1 -1
- package/dist/types/lib/bitcore/hdpublickey.d.ts +4 -3
- package/dist/types/lib/bitcore/hdpublickey.d.ts.map +1 -1
- package/dist/types/lib/bitcore/index.d.ts +55 -60
- package/dist/types/lib/bitcore/index.d.ts.map +1 -1
- package/dist/types/lib/bitcore/message.d.ts +7 -4
- package/dist/types/lib/bitcore/message.d.ts.map +1 -1
- package/dist/types/lib/bitcore/mnemonic/mnemonic.d.ts +2 -0
- package/dist/types/lib/bitcore/mnemonic/mnemonic.d.ts.map +1 -1
- package/dist/types/lib/bitcore/mnemonic/pbkdf2.d.ts +1 -0
- package/dist/types/lib/bitcore/mnemonic/pbkdf2.d.ts.map +1 -1
- package/dist/types/lib/bitcore/mnemonic/words/french.d.ts +2 -0
- package/dist/types/lib/bitcore/mnemonic/words/french.d.ts.map +1 -0
- package/dist/types/lib/bitcore/mnemonic/words/index.d.ts +1 -0
- package/dist/types/lib/bitcore/mnemonic/words/index.d.ts.map +1 -1
- package/dist/types/lib/bitcore/musig2/session.d.ts +8 -7
- package/dist/types/lib/bitcore/musig2/session.d.ts.map +1 -1
- package/dist/types/lib/bitcore/musig2/signer.d.ts +10 -9
- package/dist/types/lib/bitcore/musig2/signer.d.ts.map +1 -1
- package/dist/types/lib/bitcore/networks.d.ts +1 -0
- package/dist/types/lib/bitcore/networks.d.ts.map +1 -1
- package/dist/types/lib/bitcore/opcode.d.ts +5 -0
- package/dist/types/lib/bitcore/opcode.d.ts.map +1 -1
- package/dist/types/lib/bitcore/privatekey.d.ts +5 -4
- package/dist/types/lib/bitcore/privatekey.d.ts.map +1 -1
- package/dist/types/lib/bitcore/publickey.d.ts +13 -6
- package/dist/types/lib/bitcore/publickey.d.ts.map +1 -1
- package/dist/types/lib/bitcore/{chunk.d.ts → script/chunk.d.ts} +1 -0
- package/dist/types/lib/bitcore/script/chunk.d.ts.map +1 -0
- package/dist/types/lib/bitcore/script/interpreter/condition-stack.d.ts +11 -0
- package/dist/types/lib/bitcore/script/interpreter/condition-stack.d.ts.map +1 -0
- package/dist/types/lib/bitcore/script/interpreter/index.d.ts +5 -0
- package/dist/types/lib/bitcore/script/interpreter/index.d.ts.map +1 -0
- package/dist/types/lib/bitcore/script/interpreter/interpreter.d.ts +21 -0
- package/dist/types/lib/bitcore/script/interpreter/interpreter.d.ts.map +1 -0
- package/dist/types/lib/bitcore/script/interpreter/script-num.d.ts +35 -0
- package/dist/types/lib/bitcore/script/interpreter/script-num.d.ts.map +1 -0
- package/dist/types/lib/bitcore/script/interpreter/types.d.ts +101 -0
- package/dist/types/lib/bitcore/script/interpreter/types.d.ts.map +1 -0
- package/dist/types/lib/bitcore/{taproot.d.ts → script/taproot.d.ts} +20 -7
- package/dist/types/lib/bitcore/script/taproot.d.ts.map +1 -0
- package/dist/types/lib/bitcore/script.d.ts +12 -11
- package/dist/types/lib/bitcore/script.d.ts.map +1 -1
- package/dist/types/lib/bitcore/taproot/musig2.d.ts +17 -16
- package/dist/types/lib/bitcore/taproot/musig2.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/index.d.ts +11 -11
- package/dist/types/lib/bitcore/transaction/index.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/input/multisig.d.ts +5 -0
- package/dist/types/lib/bitcore/transaction/input/multisig.d.ts.map +1 -0
- package/dist/types/lib/bitcore/transaction/input/multisigscripthash.d.ts +5 -0
- package/dist/types/lib/bitcore/transaction/input/multisigscripthash.d.ts.map +1 -0
- package/dist/types/lib/bitcore/transaction/input/publickey.d.ts +5 -0
- package/dist/types/lib/bitcore/transaction/input/publickey.d.ts.map +1 -0
- package/dist/types/lib/bitcore/transaction/input/publickeyhash.d.ts +6 -0
- package/dist/types/lib/bitcore/transaction/input/publickeyhash.d.ts.map +1 -0
- package/dist/types/lib/bitcore/transaction/input/taproot.d.ts +18 -0
- package/dist/types/lib/bitcore/transaction/input/taproot.d.ts.map +1 -0
- package/dist/types/lib/bitcore/transaction/input.d.ts +27 -35
- package/dist/types/lib/bitcore/transaction/input.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/outpoint.d.ts +32 -0
- package/dist/types/lib/bitcore/transaction/outpoint.d.ts.map +1 -0
- package/dist/types/lib/bitcore/transaction/output.d.ts +3 -1
- package/dist/types/lib/bitcore/transaction/output.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/sighash.d.ts +8 -7
- package/dist/types/lib/bitcore/transaction/sighash.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/signature.d.ts +3 -2
- package/dist/types/lib/bitcore/transaction/signature.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/transaction.d.ts +18 -15
- package/dist/types/lib/bitcore/transaction/transaction.d.ts.map +1 -1
- package/dist/types/lib/bitcore/transaction/unspentoutput.d.ts +9 -7
- package/dist/types/lib/bitcore/transaction/unspentoutput.d.ts.map +1 -1
- package/dist/types/lib/bitcore/unit.d.ts.map +1 -1
- package/dist/types/lib/bitcore/util/base32.d.ts.map +1 -1
- package/dist/types/lib/bitcore/util/bits.d.ts +5 -0
- package/dist/types/lib/bitcore/util/bits.d.ts.map +1 -0
- package/dist/types/lib/bitcore/util/buffer.d.ts +10 -2
- package/dist/types/lib/bitcore/util/buffer.d.ts.map +1 -1
- package/dist/types/lib/bitcore/util/js.d.ts +0 -1
- package/dist/types/lib/bitcore/util/js.d.ts.map +1 -1
- package/dist/types/lib/bitcore/util/merkle.d.ts +6 -0
- package/dist/types/lib/bitcore/util/merkle.d.ts.map +1 -0
- package/dist/types/lib/bitcore/util/preconditions.d.ts.map +1 -1
- package/dist/types/lib/bitcore/xaddress.d.ts +1 -0
- package/dist/types/lib/bitcore/xaddress.d.ts.map +1 -1
- package/dist/types/lib/{bitcore/taproot/nft.d.ts → nft.d.ts} +26 -12
- package/dist/types/lib/nft.d.ts.map +1 -0
- package/dist/types/lib/rank/index.d.ts +1 -0
- package/dist/types/lib/rank/index.d.ts.map +1 -1
- package/dist/types/lib/rank/script.d.ts +1 -0
- package/dist/types/lib/rank/script.d.ts.map +1 -1
- package/dist/types/lib/rank/transaction.d.ts +1 -0
- package/dist/types/lib/rank/transaction.d.ts.map +1 -1
- package/dist/types/utils/string.d.ts +1 -0
- package/dist/types/utils/string.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/cjs/lib/bitcore/script/interpreter.js +0 -1757
- package/dist/esm/lib/bitcore/script/interpreter.js +0 -1753
- package/dist/types/lib/bitcore/chunk.d.ts.map +0 -1
- package/dist/types/lib/bitcore/script/interpreter.d.ts +0 -101
- package/dist/types/lib/bitcore/script/interpreter.d.ts.map +0 -1
- package/dist/types/lib/bitcore/taproot/nft.d.ts.map +0 -1
- package/dist/types/lib/bitcore/taproot.d.ts.map +0 -1
- /package/dist/cjs/lib/bitcore/{chunk.js → script/chunk.js} +0 -0
- /package/dist/esm/lib/bitcore/{chunk.js → script/chunk.js} +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Signature, Random, Hash } from '../crypto/index
|
|
2
|
-
import {
|
|
3
|
-
import { verifyTaprootKeyPathMuSigPartial } from '../taproot/musig2
|
|
4
|
-
import { calculateTapTweak, tweakPublicKey } from '../taproot
|
|
1
|
+
import { Signature, Random, Hash } from '../crypto/index';
|
|
2
|
+
import { muSig2KeyAgg, muSig2NonceGen, muSig2NonceAgg, muSig2PartialSign, muSig2PartialSigVerify, muSig2SigAgg, } from '../crypto/musig2';
|
|
3
|
+
import { verifyTaprootKeyPathMuSigPartial } from '../taproot/musig2';
|
|
4
|
+
import { calculateTapTweak, tweakPublicKey } from '../script/taproot';
|
|
5
|
+
import { BufferUtil } from '../util/buffer';
|
|
5
6
|
export var MuSigSessionPhase;
|
|
6
7
|
(function (MuSigSessionPhase) {
|
|
7
8
|
MuSigSessionPhase["INIT"] = "init";
|
|
@@ -18,7 +19,7 @@ export class MuSigSessionManager {
|
|
|
18
19
|
if (!message || message.length === 0) {
|
|
19
20
|
throw new Error('Cannot create MuSig2 session with empty message');
|
|
20
21
|
}
|
|
21
|
-
const keyAggContext =
|
|
22
|
+
const keyAggContext = muSig2KeyAgg(signers);
|
|
22
23
|
const myPubKey = myPrivateKey.publicKey;
|
|
23
24
|
const myIndex = keyAggContext.pubkeys.findIndex(signer => signer.toString() === myPubKey.toString());
|
|
24
25
|
if (myIndex === -1) {
|
|
@@ -49,7 +50,7 @@ export class MuSigSessionManager {
|
|
|
49
50
|
throw new Error('Nonces already generated for this session. NEVER reuse nonces!');
|
|
50
51
|
}
|
|
51
52
|
const entropy = extraInput !== undefined ? extraInput : Random.getRandomBuffer(32);
|
|
52
|
-
const nonce =
|
|
53
|
+
const nonce = muSig2NonceGen(privateKey, session.keyAggContext.aggregatedPubKey, session.message, entropy);
|
|
53
54
|
session.mySecretNonce = nonce;
|
|
54
55
|
session.myPublicNonce = nonce.publicNonces;
|
|
55
56
|
session.phase = MuSigSessionPhase.NONCE_EXCHANGE;
|
|
@@ -97,7 +98,7 @@ export class MuSigSessionManager {
|
|
|
97
98
|
session.phase !== MuSigSessionPhase.PARTIAL_SIG_EXCHANGE) {
|
|
98
99
|
throw new Error(`Cannot create partial signature in phase ${session.phase}. Must be in NONCE_EXCHANGE or PARTIAL_SIG_EXCHANGE.`);
|
|
99
100
|
}
|
|
100
|
-
const partialSig =
|
|
101
|
+
const partialSig = muSig2PartialSign(session.mySecretNonce, privateKey, session.keyAggContext, session.myIndex, session.aggregatedNonce, session.message);
|
|
101
102
|
session.myPartialSig = partialSig;
|
|
102
103
|
session.phase = MuSigSessionPhase.PARTIAL_SIG_EXCHANGE;
|
|
103
104
|
session.updatedAt = Date.now();
|
|
@@ -123,12 +124,12 @@ export class MuSigSessionManager {
|
|
|
123
124
|
}
|
|
124
125
|
let isValid;
|
|
125
126
|
if (session.metadata?.inputScriptType === 'taproot') {
|
|
126
|
-
const merkleRoot =
|
|
127
|
+
const merkleRoot = BufferUtil.alloc(32);
|
|
127
128
|
const tweak = calculateTapTweak(session.keyAggContext.aggregatedPubKey, merkleRoot);
|
|
128
129
|
isValid = verifyTaprootKeyPathMuSigPartial(partialSig, publicNonce, session.signers[signerIndex], session.keyAggContext, signerIndex, session.aggregatedNonce, session.message, tweak);
|
|
129
130
|
}
|
|
130
131
|
else {
|
|
131
|
-
isValid =
|
|
132
|
+
isValid = muSig2PartialSigVerify(partialSig, publicNonce, session.signers[signerIndex], session.keyAggContext, signerIndex, session.aggregatedNonce, session.message);
|
|
132
133
|
}
|
|
133
134
|
if (!isValid) {
|
|
134
135
|
this._abortSession(session, `Invalid partial signature from signer ${signerIndex}`);
|
|
@@ -169,11 +170,11 @@ export class MuSigSessionManager {
|
|
|
169
170
|
};
|
|
170
171
|
}
|
|
171
172
|
_generateSessionId(signers, message, createdAt = Date.now(), entropy = Random.getRandomBuffer(16)) {
|
|
172
|
-
const signersHash = Hash.sha256(
|
|
173
|
+
const signersHash = Hash.sha256(BufferUtil.concat(signers.map(s => s.toBuffer())));
|
|
173
174
|
const messageHash = Hash.sha256(message);
|
|
174
|
-
const timestampBuffer =
|
|
175
|
-
timestampBuffer.writeBigInt64BE(
|
|
176
|
-
const combined =
|
|
175
|
+
const timestampBuffer = BufferUtil.alloc(8);
|
|
176
|
+
timestampBuffer.writeBigInt64BE(createdAt, 0);
|
|
177
|
+
const combined = BufferUtil.concat([
|
|
177
178
|
signersHash,
|
|
178
179
|
messageHash,
|
|
179
180
|
timestampBuffer,
|
|
@@ -205,7 +206,7 @@ export class MuSigSessionManager {
|
|
|
205
206
|
allNonces.push(nonce);
|
|
206
207
|
}
|
|
207
208
|
}
|
|
208
|
-
session.aggregatedNonce =
|
|
209
|
+
session.aggregatedNonce = muSig2NonceAgg(allNonces);
|
|
209
210
|
session.updatedAt = Date.now();
|
|
210
211
|
}
|
|
211
212
|
_finalizeSignature(session) {
|
|
@@ -231,7 +232,7 @@ export class MuSigSessionManager {
|
|
|
231
232
|
let pubKeyForAggregation = session.keyAggContext.aggregatedPubKey;
|
|
232
233
|
let pubKeyForNonceCoef = session.keyAggContext.aggregatedPubKey;
|
|
233
234
|
if (session.metadata?.inputScriptType === 'taproot') {
|
|
234
|
-
const merkleRoot =
|
|
235
|
+
const merkleRoot = BufferUtil.alloc(32);
|
|
235
236
|
const commitment = tweakPublicKey(session.keyAggContext.aggregatedPubKey, merkleRoot);
|
|
236
237
|
pubKeyForAggregation = commitment;
|
|
237
238
|
pubKeyForNonceCoef = commitment;
|
|
@@ -241,7 +242,7 @@ export class MuSigSessionManager {
|
|
|
241
242
|
: session.metadata?.inputScriptType === 'taproot'
|
|
242
243
|
? Signature.SIGHASH_ALL | Signature.SIGHASH_LOTUS
|
|
243
244
|
: undefined;
|
|
244
|
-
session.finalSignature =
|
|
245
|
+
session.finalSignature = muSig2SigAgg(allPartialSigs, session.aggregatedNonce, session.message, pubKeyForAggregation, sighashType, pubKeyForNonceCoef);
|
|
245
246
|
session.phase = MuSigSessionPhase.COMPLETE;
|
|
246
247
|
session.updatedAt = Date.now();
|
|
247
248
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Signature } from '../crypto/signature.js';
|
|
2
2
|
import { Hash } from '../crypto/hash.js';
|
|
3
3
|
import { Random } from '../crypto/random.js';
|
|
4
|
-
import {
|
|
4
|
+
import { muSig2KeyAgg, muSig2NonceGen, muSig2NonceAgg, muSig2PartialSign, muSig2PartialSigVerify, muSig2SigAgg, } from '../crypto/musig2.js';
|
|
5
5
|
import { MuSigSessionManager, } from './session.js';
|
|
6
|
-
import {
|
|
6
|
+
import { buildMuSig2TaprootKey, signTaprootKeyPathWithMuSig2, } from '../taproot/musig2.js';
|
|
7
7
|
import { sighash } from '../transaction/sighash.js';
|
|
8
8
|
import { BN } from '../crypto/bn.js';
|
|
9
|
+
import { BufferUtil } from '../util';
|
|
9
10
|
export class MuSig2Signer {
|
|
10
11
|
config;
|
|
11
12
|
sessionManager;
|
|
@@ -25,11 +26,11 @@ export class MuSig2Signer {
|
|
|
25
26
|
}
|
|
26
27
|
prepare(message, useSession = false) {
|
|
27
28
|
const normalizedMessage = this._normalizeMessage(message);
|
|
28
|
-
const keyAggContext =
|
|
29
|
+
const keyAggContext = muSig2KeyAgg(this.config.signers);
|
|
29
30
|
const entropy = this.config.extraInput !== undefined
|
|
30
31
|
? this.config.extraInput
|
|
31
32
|
: Random.getRandomBuffer(32);
|
|
32
|
-
const nonce =
|
|
33
|
+
const nonce = muSig2NonceGen(this.config.myPrivateKey, keyAggContext.aggregatedPubKey, normalizedMessage, entropy);
|
|
33
34
|
const myIndex = keyAggContext.pubkeys.findIndex(s => s.toString() === this.config.myPrivateKey.publicKey.toString());
|
|
34
35
|
const result = {
|
|
35
36
|
keyAggContext,
|
|
@@ -49,17 +50,17 @@ export class MuSig2Signer {
|
|
|
49
50
|
}
|
|
50
51
|
createPartialSignature(prepare, allPublicNonces, message) {
|
|
51
52
|
const normalizedMessage = this._normalizeMessage(message);
|
|
52
|
-
const aggregatedNonce =
|
|
53
|
+
const aggregatedNonce = muSig2NonceAgg(allPublicNonces);
|
|
53
54
|
const secretNonce = {
|
|
54
55
|
secretNonces: prepare.mySecretNonces,
|
|
55
56
|
publicNonces: prepare.myPublicNonces,
|
|
56
57
|
};
|
|
57
|
-
return
|
|
58
|
+
return muSig2PartialSign(secretNonce, this.config.myPrivateKey, prepare.keyAggContext, prepare.myIndex, aggregatedNonce, normalizedMessage);
|
|
58
59
|
}
|
|
59
60
|
verifyPartialSignature(partialSig, publicNonce, publicKey, signerIndex, prepare, allPublicNonces, message) {
|
|
60
61
|
const normalizedMessage = this._normalizeMessage(message);
|
|
61
|
-
const aggregatedNonce =
|
|
62
|
-
return
|
|
62
|
+
const aggregatedNonce = muSig2NonceAgg(allPublicNonces);
|
|
63
|
+
return muSig2PartialSigVerify(partialSig, publicNonce, publicKey, prepare.keyAggContext, signerIndex, aggregatedNonce, normalizedMessage);
|
|
63
64
|
}
|
|
64
65
|
sign(prepare, allPublicNonces, message, allPartialSigs) {
|
|
65
66
|
if (allPublicNonces.length !== this.config.signers.length) {
|
|
@@ -69,17 +70,17 @@ export class MuSig2Signer {
|
|
|
69
70
|
throw new Error(`Invalid number of partial signatures: expected ${this.config.signers.length}, got ${allPartialSigs.length}`);
|
|
70
71
|
}
|
|
71
72
|
const normalizedMessage = this._normalizeMessage(message);
|
|
72
|
-
const aggregatedNonce =
|
|
73
|
-
const signature =
|
|
73
|
+
const aggregatedNonce = muSig2NonceAgg(allPublicNonces);
|
|
74
|
+
const signature = muSig2SigAgg(allPartialSigs, aggregatedNonce, normalizedMessage, prepare.keyAggContext.aggregatedPubKey);
|
|
74
75
|
return {
|
|
75
76
|
signature,
|
|
76
77
|
aggregatedPubKey: prepare.keyAggContext.aggregatedPubKey,
|
|
77
78
|
isAggregator: true,
|
|
78
79
|
};
|
|
79
80
|
}
|
|
80
|
-
prepareTaproot(
|
|
81
|
-
const result =
|
|
82
|
-
const keyAggContext =
|
|
81
|
+
prepareTaproot() {
|
|
82
|
+
const result = buildMuSig2TaprootKey(this.config.signers);
|
|
83
|
+
const keyAggContext = muSig2KeyAgg(this.config.signers);
|
|
83
84
|
return {
|
|
84
85
|
...result,
|
|
85
86
|
keyAggContext,
|
|
@@ -90,11 +91,11 @@ export class MuSig2Signer {
|
|
|
90
91
|
const satoshisBN = new BN(amount);
|
|
91
92
|
const sighashBuffer = sighash(transaction, sigType, inputIndex, prepare.script, satoshisBN);
|
|
92
93
|
const normalizedSighash = this._normalizeMessage(sighashBuffer);
|
|
93
|
-
const aggregatedNonce =
|
|
94
|
+
const aggregatedNonce = muSig2NonceAgg(allPublicNonces);
|
|
94
95
|
const entropy = this.config.extraInput !== undefined
|
|
95
96
|
? this.config.extraInput
|
|
96
97
|
: Random.getRandomBuffer(32);
|
|
97
|
-
const nonce =
|
|
98
|
+
const nonce = muSig2NonceGen(this.config.myPrivateKey, prepare.keyAggContext.aggregatedPubKey, normalizedSighash, entropy);
|
|
98
99
|
const myIndex = prepare.keyAggContext.pubkeys.findIndex(s => s.toString() === this.config.myPrivateKey.publicKey.toString());
|
|
99
100
|
return signTaprootKeyPathWithMuSig2(nonce, this.config.myPrivateKey, prepare.keyAggContext, myIndex, aggregatedNonce, normalizedSighash, prepare.tweak);
|
|
100
101
|
}
|
|
@@ -103,8 +104,8 @@ export class MuSig2Signer {
|
|
|
103
104
|
const satoshisBN = new BN(amount);
|
|
104
105
|
const sighashBuffer = sighash(transaction, sigType, inputIndex, prepare.script, satoshisBN);
|
|
105
106
|
const normalizedSighash = this._normalizeMessage(sighashBuffer);
|
|
106
|
-
const aggregatedNonce =
|
|
107
|
-
return
|
|
107
|
+
const aggregatedNonce = muSig2NonceAgg(allPublicNonces);
|
|
108
|
+
return muSig2SigAgg(allPartialSigs, aggregatedNonce, normalizedSighash, prepare.commitment, undefined, prepare.commitment);
|
|
108
109
|
}
|
|
109
110
|
createSession(message, metadata) {
|
|
110
111
|
if (!this.sessionManager) {
|
|
@@ -133,7 +134,7 @@ export class MuSig2Signer {
|
|
|
133
134
|
}
|
|
134
135
|
_normalizeMessage(message) {
|
|
135
136
|
if (typeof message === 'string') {
|
|
136
|
-
return Hash.sha256(
|
|
137
|
+
return Hash.sha256(BufferUtil.from(message, 'utf8'));
|
|
137
138
|
}
|
|
138
139
|
if (message.length === 32) {
|
|
139
140
|
return message;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BufferUtil } from './util/buffer';
|
|
1
2
|
function prefixToArray(prefix) {
|
|
2
3
|
const result = [];
|
|
3
4
|
for (let i = 0; i < prefix.length; i++) {
|
|
@@ -48,7 +49,7 @@ export const livenet = new Network({
|
|
|
48
49
|
scripthash: 5,
|
|
49
50
|
xpubkey: 0x0488b21e,
|
|
50
51
|
xprivkey: 0x0488ade4,
|
|
51
|
-
networkMagic:
|
|
52
|
+
networkMagic: BufferUtil.from('ece7eff3', 'hex'),
|
|
52
53
|
port: 10605,
|
|
53
54
|
dnsSeeds: ['seed.lotusia.org'],
|
|
54
55
|
prefixArray: prefixToArray('bitcoincash'),
|
|
@@ -63,7 +64,7 @@ export const testnet = new Network({
|
|
|
63
64
|
scripthash: 0xc4,
|
|
64
65
|
xpubkey: 0x043587cf,
|
|
65
66
|
xprivkey: 0x04358394,
|
|
66
|
-
networkMagic:
|
|
67
|
+
networkMagic: BufferUtil.from('ecf4f3f4', 'hex'),
|
|
67
68
|
port: 11605,
|
|
68
69
|
dnsSeeds: ['seed.lotusia.org'],
|
|
69
70
|
prefixArray: prefixToArray('bchtest'),
|
|
@@ -78,7 +79,7 @@ export const regtest = new Network({
|
|
|
78
79
|
scripthash: 0xc4,
|
|
79
80
|
xpubkey: 0x043587cf,
|
|
80
81
|
xprivkey: 0x04358394,
|
|
81
|
-
networkMagic:
|
|
82
|
+
networkMagic: BufferUtil.from('ecf2e5e7', 'hex'),
|
|
82
83
|
port: 12605,
|
|
83
84
|
dnsSeeds: [],
|
|
84
85
|
prefixArray: prefixToArray('bchreg'),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Preconditions } from './util/preconditions
|
|
2
|
-
import { JSUtil } from './util
|
|
1
|
+
import { Preconditions as $ } from './util/preconditions';
|
|
2
|
+
import { JSUtil, BufferUtil } from './util';
|
|
3
3
|
export class Opcode {
|
|
4
4
|
num;
|
|
5
5
|
constructor(num) {
|
|
@@ -18,12 +18,12 @@ export class Opcode {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
static fromBuffer(buf) {
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
$.checkArgument(BufferUtil.isBuffer(buf), 'buf', 'Must be a Buffer');
|
|
22
|
+
$.checkArgument(buf.length > 0, 'buf', 'Buffer cannot be empty');
|
|
23
23
|
return new Opcode(buf[0]);
|
|
24
24
|
}
|
|
25
25
|
toBuffer() {
|
|
26
|
-
return
|
|
26
|
+
return BufferUtil.from([this.num]);
|
|
27
27
|
}
|
|
28
28
|
toString() {
|
|
29
29
|
return this.num.toString();
|
|
@@ -147,6 +147,8 @@ export class Opcode {
|
|
|
147
147
|
static OP_CHECKDATASIG = 186;
|
|
148
148
|
static OP_CHECKDATASIGVERIFY = 187;
|
|
149
149
|
static OP_REVERSEBYTES = 188;
|
|
150
|
+
static OP_MULPOW2 = 189;
|
|
151
|
+
static OP_RAWLEFTBITSHIFT = 190;
|
|
150
152
|
static map = {
|
|
151
153
|
OP_0: 0,
|
|
152
154
|
OP_FALSE: 0,
|
|
@@ -266,5 +268,7 @@ export class Opcode {
|
|
|
266
268
|
OP_CHECKDATASIG: 186,
|
|
267
269
|
OP_CHECKDATASIGVERIFY: 187,
|
|
268
270
|
OP_REVERSEBYTES: 188,
|
|
271
|
+
OP_MULPOW2: 189,
|
|
272
|
+
OP_RAWLEFTBITSHIFT: 190,
|
|
269
273
|
};
|
|
270
274
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { BN } from './crypto/bn
|
|
2
|
-
import { Point } from './crypto/point
|
|
3
|
-
import { Random } from './crypto/random
|
|
4
|
-
import { Base58Check } from './encoding/base58check
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { BN } from './crypto/bn';
|
|
2
|
+
import { Point } from './crypto/point';
|
|
3
|
+
import { Random } from './crypto/random';
|
|
4
|
+
import { Base58Check } from './encoding/base58check';
|
|
5
|
+
import { BufferUtil } from './util/buffer';
|
|
6
|
+
import { JSUtil } from './util/js';
|
|
7
|
+
import { get as getNetwork, defaultNetwork, } from './networks';
|
|
8
|
+
import { PublicKey } from './publickey';
|
|
9
|
+
import { Address } from './address';
|
|
9
10
|
export class PrivateKey {
|
|
10
11
|
bn;
|
|
11
12
|
compressed;
|
|
@@ -45,7 +46,7 @@ export class PrivateKey {
|
|
|
45
46
|
else if (data instanceof BN) {
|
|
46
47
|
info.bn = data;
|
|
47
48
|
}
|
|
48
|
-
else if (
|
|
49
|
+
else if (BufferUtil.isBuffer(data)) {
|
|
49
50
|
const bufferInfo = PrivateKey._transformBuffer(data, network);
|
|
50
51
|
Object.assign(info, bufferInfo);
|
|
51
52
|
}
|
|
@@ -54,7 +55,7 @@ export class PrivateKey {
|
|
|
54
55
|
'compressed' in data &&
|
|
55
56
|
'buf' in data) {
|
|
56
57
|
info.compressed = data.compressed;
|
|
57
|
-
info.bn =
|
|
58
|
+
info.bn = BN.fromBuffer(data.buf);
|
|
58
59
|
}
|
|
59
60
|
else if (typeof data === 'object' &&
|
|
60
61
|
data !== null &&
|
|
@@ -69,7 +70,7 @@ export class PrivateKey {
|
|
|
69
70
|
}
|
|
70
71
|
else if (typeof data === 'string') {
|
|
71
72
|
if (JSUtil.isHexa(data)) {
|
|
72
|
-
info.bn =
|
|
73
|
+
info.bn = BN.fromString(data, 'hex');
|
|
73
74
|
}
|
|
74
75
|
else {
|
|
75
76
|
const wifInfo = PrivateKey._transformWIF(data, network);
|
|
@@ -84,8 +85,7 @@ export class PrivateKey {
|
|
|
84
85
|
static _getRandomBN() {
|
|
85
86
|
let bn;
|
|
86
87
|
do {
|
|
87
|
-
|
|
88
|
-
bn = new BN(privbuf, 'be');
|
|
88
|
+
bn = BN.fromBuffer(Random.getRandomBuffer(32));
|
|
89
89
|
} while (!bn.lt(Point.getN()));
|
|
90
90
|
return bn;
|
|
91
91
|
}
|
|
@@ -121,14 +121,14 @@ export class PrivateKey {
|
|
|
121
121
|
else {
|
|
122
122
|
throw new Error('Length of buffer must be 33 (uncompressed) or 34 (compressed)');
|
|
123
123
|
}
|
|
124
|
-
info.bn =
|
|
124
|
+
info.bn = BN.fromBuffer(buf.slice(1, 32 + 1));
|
|
125
125
|
return info;
|
|
126
126
|
}
|
|
127
127
|
static _transformBNBuffer(buf, network) {
|
|
128
128
|
network ||= defaultNetwork;
|
|
129
129
|
return {
|
|
130
130
|
network: getNetwork(network),
|
|
131
|
-
bn:
|
|
131
|
+
bn: BN.fromBuffer(buf),
|
|
132
132
|
compressed: true,
|
|
133
133
|
};
|
|
134
134
|
}
|
|
@@ -136,7 +136,7 @@ export class PrivateKey {
|
|
|
136
136
|
return PrivateKey._transformBuffer(Base58Check.decode(str), network);
|
|
137
137
|
}
|
|
138
138
|
static _transformObject(json) {
|
|
139
|
-
const bn =
|
|
139
|
+
const bn = BN.fromString(json.bn, 'hex');
|
|
140
140
|
const network = getNetwork(json.network);
|
|
141
141
|
if (!network) {
|
|
142
142
|
throw new Error(`Invalid network: ${json.network}`);
|
|
@@ -190,16 +190,16 @@ export class PrivateKey {
|
|
|
190
190
|
toWIF(compressed = true) {
|
|
191
191
|
let buf;
|
|
192
192
|
if (compressed) {
|
|
193
|
-
buf =
|
|
194
|
-
|
|
195
|
-
this.bn.
|
|
196
|
-
|
|
193
|
+
buf = BufferUtil.concat([
|
|
194
|
+
BufferUtil.from([this.network.privatekey]),
|
|
195
|
+
this.bn.toBuffer({ size: 32 }),
|
|
196
|
+
BufferUtil.from([0x01]),
|
|
197
197
|
]);
|
|
198
198
|
}
|
|
199
199
|
else {
|
|
200
|
-
buf =
|
|
201
|
-
|
|
202
|
-
this.bn.
|
|
200
|
+
buf = BufferUtil.concat([
|
|
201
|
+
BufferUtil.from([this.network.privatekey]),
|
|
202
|
+
this.bn.toBuffer({ size: 32 }),
|
|
203
203
|
]);
|
|
204
204
|
}
|
|
205
205
|
return Base58Check.encode(buf);
|
|
@@ -208,10 +208,10 @@ export class PrivateKey {
|
|
|
208
208
|
return this.bn;
|
|
209
209
|
}
|
|
210
210
|
toBuffer() {
|
|
211
|
-
return this.bn.
|
|
211
|
+
return this.bn.toBuffer({ size: 32 });
|
|
212
212
|
}
|
|
213
213
|
toBufferNoPadding() {
|
|
214
|
-
return this.bn.
|
|
214
|
+
return this.bn.toBuffer();
|
|
215
215
|
}
|
|
216
216
|
toPublicKey() {
|
|
217
217
|
if (!this._pubkey) {
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import { BN } from './crypto/bn
|
|
2
|
-
import { Point } from './crypto/point
|
|
3
|
-
import { Hash } from './crypto/hash
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { BN } from './crypto/bn';
|
|
2
|
+
import { Point } from './crypto/point';
|
|
3
|
+
import { Hash } from './crypto/hash';
|
|
4
|
+
import { BufferUtil } from './util/buffer';
|
|
5
|
+
import { JSUtil } from './util/js';
|
|
6
|
+
import { get as getNetwork, defaultNetwork, } from './networks';
|
|
7
|
+
import { PrivateKey } from './privatekey';
|
|
8
|
+
import { Address } from './address';
|
|
9
|
+
export const PUBKEY_PREFIX_EVEN = 0x02;
|
|
10
|
+
export const PUBKEY_PREFIX_ODD = 0x03;
|
|
11
|
+
export const PUBKEY_PREFIX_UNCOMPRESSED = 0x04;
|
|
8
12
|
export class PublicKey {
|
|
9
13
|
point;
|
|
10
14
|
compressed;
|
|
11
15
|
network;
|
|
16
|
+
static PrefixOddY = BufferUtil.from([PUBKEY_PREFIX_ODD]);
|
|
17
|
+
static PrefixEvenY = BufferUtil.from([PUBKEY_PREFIX_EVEN]);
|
|
18
|
+
static PrefixUncompressed = BufferUtil.from([
|
|
19
|
+
PUBKEY_PREFIX_UNCOMPRESSED,
|
|
20
|
+
]);
|
|
12
21
|
constructor(data, extra) {
|
|
13
22
|
if (data instanceof PublicKey) {
|
|
14
23
|
return data;
|
|
@@ -40,7 +49,7 @@ export class PublicKey {
|
|
|
40
49
|
Object.assign(info, objectInfo);
|
|
41
50
|
}
|
|
42
51
|
else if (typeof data === 'string') {
|
|
43
|
-
const derInfo = PublicKey._transformDER(
|
|
52
|
+
const derInfo = PublicKey._transformDER(BufferUtil.from(data, 'hex'));
|
|
44
53
|
Object.assign(info, derInfo);
|
|
45
54
|
}
|
|
46
55
|
else if (PublicKey._isBuffer(data)) {
|
|
@@ -66,7 +75,7 @@ export class PublicKey {
|
|
|
66
75
|
return param instanceof PrivateKey;
|
|
67
76
|
}
|
|
68
77
|
static _isBuffer(param) {
|
|
69
|
-
return
|
|
78
|
+
return BufferUtil.isBuffer(param) || param instanceof Uint8Array;
|
|
70
79
|
}
|
|
71
80
|
static _transformPrivateKey(privkey) {
|
|
72
81
|
if (!PublicKey._isPrivateKey(privkey)) {
|
|
@@ -88,28 +97,23 @@ export class PublicKey {
|
|
|
88
97
|
let y;
|
|
89
98
|
let xbuf;
|
|
90
99
|
let ybuf;
|
|
91
|
-
if (buf[0] ===
|
|
92
|
-
|
|
93
|
-
|
|
100
|
+
if (buf[0] === PUBKEY_PREFIX_UNCOMPRESSED ||
|
|
101
|
+
(!strict && (buf[0] === 0x06 || buf[0] === 0x07))) {
|
|
102
|
+
xbuf = buf.slice(1, 33);
|
|
103
|
+
ybuf = buf.slice(33, 65);
|
|
94
104
|
if (xbuf.length !== 32 || ybuf.length !== 32 || buf.length !== 65) {
|
|
95
105
|
throw new TypeError('Length of x and y must be 32 bytes');
|
|
96
106
|
}
|
|
97
|
-
x =
|
|
98
|
-
y =
|
|
107
|
+
x = BN.fromBuffer(xbuf);
|
|
108
|
+
y = BN.fromBuffer(ybuf);
|
|
99
109
|
point = new Point(x, y);
|
|
100
110
|
compressed = false;
|
|
101
111
|
}
|
|
102
|
-
else if (buf[0] ===
|
|
103
|
-
xbuf = buf.
|
|
104
|
-
x =
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
compressed = true;
|
|
108
|
-
}
|
|
109
|
-
else if (buf[0] === 0x02) {
|
|
110
|
-
xbuf = buf.subarray(1);
|
|
111
|
-
x = new BN(xbuf, 'be');
|
|
112
|
-
const xInfo = PublicKey._transformX(false, x);
|
|
112
|
+
else if (buf[0] === PUBKEY_PREFIX_ODD || buf[0] === PUBKEY_PREFIX_EVEN) {
|
|
113
|
+
xbuf = buf.slice(1);
|
|
114
|
+
x = BN.fromBuffer(xbuf);
|
|
115
|
+
const isOdd = buf[0] === PUBKEY_PREFIX_ODD;
|
|
116
|
+
const xInfo = PublicKey._transformX(isOdd, x);
|
|
113
117
|
point = xInfo.point;
|
|
114
118
|
compressed = true;
|
|
115
119
|
}
|
|
@@ -131,8 +135,8 @@ export class PublicKey {
|
|
|
131
135
|
};
|
|
132
136
|
}
|
|
133
137
|
static _transformObject(json) {
|
|
134
|
-
const x =
|
|
135
|
-
const y =
|
|
138
|
+
const x = BN.fromString(json.x, 'hex');
|
|
139
|
+
const y = BN.fromString(json.y, 'hex');
|
|
136
140
|
const point = new Point(x, y);
|
|
137
141
|
return {
|
|
138
142
|
point: point,
|
|
@@ -170,7 +174,7 @@ export class PublicKey {
|
|
|
170
174
|
});
|
|
171
175
|
}
|
|
172
176
|
static fromString(str, encoding) {
|
|
173
|
-
const buf =
|
|
177
|
+
const buf = BufferUtil.from(str, encoding || 'hex');
|
|
174
178
|
const info = PublicKey._transformDER(buf);
|
|
175
179
|
return new PublicKey(info.point, {
|
|
176
180
|
compressed: info.compressed,
|
|
@@ -199,8 +203,8 @@ export class PublicKey {
|
|
|
199
203
|
}
|
|
200
204
|
toObject() {
|
|
201
205
|
return {
|
|
202
|
-
x: this.point.
|
|
203
|
-
y: this.point.
|
|
206
|
+
x: this.point.x.toString(16).padStart(64, '0'),
|
|
207
|
+
y: this.point.y.toString(16).padStart(64, '0'),
|
|
204
208
|
compressed: this.compressed,
|
|
205
209
|
};
|
|
206
210
|
}
|
|
@@ -208,30 +212,30 @@ export class PublicKey {
|
|
|
208
212
|
return this.toObject();
|
|
209
213
|
}
|
|
210
214
|
toBigNumber() {
|
|
211
|
-
return this.point.
|
|
215
|
+
return this.point.x;
|
|
212
216
|
}
|
|
213
217
|
toBuffer() {
|
|
214
218
|
return this.toDER();
|
|
215
219
|
}
|
|
216
220
|
toDER() {
|
|
217
|
-
const x = this.point.
|
|
218
|
-
const y = this.point.
|
|
219
|
-
const xbuf = x.
|
|
220
|
-
const ybuf = y.
|
|
221
|
+
const x = this.point.x;
|
|
222
|
+
const y = this.point.y;
|
|
223
|
+
const xbuf = x.toBuffer({ size: 32 });
|
|
224
|
+
const ybuf = y.toBuffer({ size: 32 });
|
|
221
225
|
let prefix;
|
|
222
226
|
if (!this.compressed) {
|
|
223
|
-
prefix =
|
|
224
|
-
return
|
|
227
|
+
prefix = BufferUtil.from([0x04]);
|
|
228
|
+
return BufferUtil.concat([prefix, xbuf, ybuf]);
|
|
225
229
|
}
|
|
226
230
|
else {
|
|
227
|
-
const odd = y.mod(new BN(2)).eq(
|
|
231
|
+
const odd = y.mod(new BN(2)).eq(BN.One);
|
|
228
232
|
if (odd) {
|
|
229
|
-
prefix =
|
|
233
|
+
prefix = PublicKey.PrefixOddY;
|
|
230
234
|
}
|
|
231
235
|
else {
|
|
232
|
-
prefix =
|
|
236
|
+
prefix = PublicKey.PrefixEvenY;
|
|
233
237
|
}
|
|
234
|
-
return
|
|
238
|
+
return BufferUtil.concat([prefix, xbuf]);
|
|
235
239
|
}
|
|
236
240
|
}
|
|
237
241
|
_getID() {
|
|
@@ -247,7 +251,7 @@ export class PublicKey {
|
|
|
247
251
|
return `<PublicKey: ${this.toString()}${this.compressed ? '' : ', uncompressed'}>`;
|
|
248
252
|
}
|
|
249
253
|
addScalar(scalar) {
|
|
250
|
-
const scalarBN =
|
|
254
|
+
const scalarBN = BufferUtil.isBuffer(scalar) ? new BN(scalar) : scalar;
|
|
251
255
|
const G = Point.getG();
|
|
252
256
|
const tweakPoint = G.mul(scalarBN);
|
|
253
257
|
const tweakedPoint = this.point.add(tweakPoint);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class ConditionStack {
|
|
2
|
+
static NO_FALSE = 0xffffffff;
|
|
3
|
+
_size = 0;
|
|
4
|
+
_firstFalsePos = ConditionStack.NO_FALSE;
|
|
5
|
+
isEmpty() {
|
|
6
|
+
return this._size === 0;
|
|
7
|
+
}
|
|
8
|
+
allTrue() {
|
|
9
|
+
return this._firstFalsePos === ConditionStack.NO_FALSE;
|
|
10
|
+
}
|
|
11
|
+
pushBack(value) {
|
|
12
|
+
if (this._firstFalsePos === ConditionStack.NO_FALSE && !value) {
|
|
13
|
+
this._firstFalsePos = this._size;
|
|
14
|
+
}
|
|
15
|
+
this._size++;
|
|
16
|
+
}
|
|
17
|
+
popBack() {
|
|
18
|
+
if (this._size === 0) {
|
|
19
|
+
throw new Error('ConditionStack: pop from empty stack');
|
|
20
|
+
}
|
|
21
|
+
this._size--;
|
|
22
|
+
if (this._firstFalsePos === this._size) {
|
|
23
|
+
this._firstFalsePos = ConditionStack.NO_FALSE;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
toggleTop() {
|
|
27
|
+
if (this._size === 0) {
|
|
28
|
+
throw new Error('ConditionStack: toggle on empty stack');
|
|
29
|
+
}
|
|
30
|
+
if (this._firstFalsePos === ConditionStack.NO_FALSE) {
|
|
31
|
+
this._firstFalsePos = this._size - 1;
|
|
32
|
+
}
|
|
33
|
+
else if (this._firstFalsePos === this._size - 1) {
|
|
34
|
+
this._firstFalsePos = ConditionStack.NO_FALSE;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { MAX_SCRIPT_ELEMENT_SIZE, MAX_OPS_PER_SCRIPT, MAX_PUBKEYS_PER_MULTISIG, MAX_SCRIPT_SIZE, MAX_STACK_SIZE, MAX_NUM2BIN_SIZE, LOCKTIME_THRESHOLD, SCRIPTNUM_MAX_ELEMENT_SIZE, STANDARD_SCRIPT_VERIFY_FLAGS, ScriptFlags, ScriptError, NULL_SIGNATURE_CHECKER, } from './types';
|
|
2
|
+
export { ScriptNum, ScriptNumError } from './script-num';
|
|
3
|
+
export { ConditionStack } from './condition-stack';
|
|
4
|
+
export { evalScript, verifyScript, Interpreter } from './interpreter';
|