@bsv/templates 1.2.3 → 1.4.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/dist/cjs/mod.js +3 -3
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/{MultiSigPubkeyHash.js → P2MSKH.js} +45 -43
- package/dist/cjs/src/P2MSKH.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/mod.js +1 -1
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/{MultiSigPubkeyHash.js → P2MSKH.js} +46 -47
- package/dist/esm/src/P2MSKH.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/mod.d.ts +1 -1
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/{MultiSigPubkeyHash.d.ts → P2MSKH.d.ts} +6 -6
- package/dist/types/src/P2MSKH.d.ts.map +1 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/mod.ts +1 -1
- package/package.json +1 -1
- package/src/MultiPushDrop.ts +1 -1
- package/src/P2MSKH.ts +218 -0
- package/dist/cjs/src/Metanet.js +0 -45
- package/dist/cjs/src/Metanet.js.map +0 -1
- package/dist/cjs/src/MultiSigPubkeyHash.js.map +0 -1
- package/dist/esm/src/Metanet.js +0 -42
- package/dist/esm/src/Metanet.js.map +0 -1
- package/dist/esm/src/MultiSigPubkeyHash.js.map +0 -1
- package/dist/types/src/Metanet.d.ts +0 -29
- package/dist/types/src/Metanet.d.ts.map +0 -1
- package/dist/types/src/MultiSigPubkeyHash.d.ts.map +0 -1
- package/src/MultiSigPubkeyHash.ts +0 -222
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { LockingScript, UnlockingScript, OP, Hash, PublicKey, TransactionSignature, Signature, Utils } from
|
|
1
|
+
import { LockingScript, UnlockingScript, OP, Hash, PublicKey, TransactionSignature, Signature, Utils } from '@bsv/sdk';
|
|
2
2
|
function concatPubkeys(pubkeys) {
|
|
3
3
|
return pubkeys.map((p) => p.toDER()).reduce((a, b) => a.concat(b), []);
|
|
4
4
|
}
|
|
5
5
|
function numberFromScriptChunk(chunk) {
|
|
6
6
|
let returnNum;
|
|
7
|
-
if (
|
|
8
|
-
returnNum = 1 + chunk.op - OP.OP_1;
|
|
7
|
+
if (chunk.data == null) {
|
|
8
|
+
returnNum = 1 + (chunk.op) - OP.OP_1;
|
|
9
9
|
}
|
|
10
10
|
else {
|
|
11
11
|
const reader = new Utils.Reader(chunk.data);
|
|
@@ -14,8 +14,12 @@ function numberFromScriptChunk(chunk) {
|
|
|
14
14
|
}
|
|
15
15
|
return returnNum;
|
|
16
16
|
}
|
|
17
|
-
export class
|
|
17
|
+
export class P2MSKH {
|
|
18
18
|
static address(pubkeys, threshold) {
|
|
19
|
+
if (threshold < 1 || threshold > pubkeys.length)
|
|
20
|
+
throw new Error('threshold must be between 1 and the number of pubkeys');
|
|
21
|
+
if (!pubkeys || pubkeys.length < 2 || pubkeys.length < threshold)
|
|
22
|
+
throw new Error(`at least ${threshold || 2} pubkeys are required`);
|
|
19
23
|
const concat = concatPubkeys(pubkeys);
|
|
20
24
|
const hash = Hash.hash160(concat);
|
|
21
25
|
const writer = new Utils.Writer();
|
|
@@ -28,7 +32,7 @@ export class MultiSigPubkeyHash {
|
|
|
28
32
|
static async addressBRC29(wallet, counterparties, keyID, threshold) {
|
|
29
33
|
const pubkeys = await Promise.all(counterparties.map(async (counterparty) => {
|
|
30
34
|
const { publicKey } = await wallet.getPublicKey({
|
|
31
|
-
protocolID: [1,
|
|
35
|
+
protocolID: [1, 'multi sig brc29'],
|
|
32
36
|
keyID,
|
|
33
37
|
counterparty
|
|
34
38
|
});
|
|
@@ -49,26 +53,26 @@ export class MultiSigPubkeyHash {
|
|
|
49
53
|
}
|
|
50
54
|
lock(address, pubkeys, threshold = 1) {
|
|
51
55
|
let hash;
|
|
52
|
-
let total;
|
|
56
|
+
let total = pubkeys?.length || 0;
|
|
53
57
|
if (address) {
|
|
54
58
|
if (typeof address !== 'string')
|
|
55
59
|
throw new Error('address must be a string');
|
|
56
|
-
const result =
|
|
60
|
+
const result = P2MSKH.thresholdAndTotalFromAddress(address);
|
|
57
61
|
hash = result.hash;
|
|
58
62
|
total = result.total;
|
|
59
63
|
threshold = result.threshold;
|
|
60
64
|
}
|
|
61
65
|
else {
|
|
62
|
-
if (
|
|
63
|
-
throw new Error(
|
|
66
|
+
if ((pubkeys == null) || total < 2)
|
|
67
|
+
throw new Error('at least 2 pubkeys are required');
|
|
64
68
|
const concat = concatPubkeys(pubkeys);
|
|
65
69
|
hash = Hash.hash160(concat);
|
|
66
|
-
total = pubkeys.length;
|
|
67
70
|
}
|
|
71
|
+
if (!threshold || threshold < 1 || threshold > total)
|
|
72
|
+
throw new Error('threshold must be between 1 and the number of pubkeys');
|
|
73
|
+
if (total > 10)
|
|
74
|
+
throw new Error('total must be less than or equal to 10');
|
|
68
75
|
const script = new LockingScript();
|
|
69
|
-
for (let i = 0; i < total - 1; i++) {
|
|
70
|
-
script.writeOpCode(OP.OP_CAT);
|
|
71
|
-
}
|
|
72
76
|
script
|
|
73
77
|
.writeOpCode(OP.OP_DUP)
|
|
74
78
|
.writeOpCode(OP.OP_HASH160)
|
|
@@ -85,24 +89,23 @@ export class MultiSigPubkeyHash {
|
|
|
85
89
|
script.writeOpCode(OP.OP_CHECKMULTISIG);
|
|
86
90
|
return script;
|
|
87
91
|
}
|
|
88
|
-
unlock(wallet, customInstructions, workingUnlockingScript, signOutputs =
|
|
92
|
+
unlock(wallet, customInstructions, workingUnlockingScript, signOutputs = 'all', anyoneCanPay = false, sourceSatoshis, lockingScript) {
|
|
89
93
|
return {
|
|
90
94
|
sign: async (tx, inputIndex) => {
|
|
91
|
-
if (
|
|
95
|
+
if (workingUnlockingScript == null) {
|
|
92
96
|
workingUnlockingScript = new UnlockingScript();
|
|
93
97
|
workingUnlockingScript.writeOpCode(OP.OP_0);
|
|
94
|
-
customInstructions.pubkeys.
|
|
95
|
-
|
|
96
|
-
});
|
|
98
|
+
const pubkeys = concatPubkeys(customInstructions.pubkeys.map(p => PublicKey.fromString(p)));
|
|
99
|
+
workingUnlockingScript.writeBin(pubkeys);
|
|
97
100
|
}
|
|
98
101
|
let signatureScope = TransactionSignature.SIGHASH_FORKID;
|
|
99
|
-
if (signOutputs ===
|
|
102
|
+
if (signOutputs === 'all') {
|
|
100
103
|
signatureScope |= TransactionSignature.SIGHASH_ALL;
|
|
101
104
|
}
|
|
102
|
-
if (signOutputs ===
|
|
105
|
+
if (signOutputs === 'none') {
|
|
103
106
|
signatureScope |= TransactionSignature.SIGHASH_NONE;
|
|
104
107
|
}
|
|
105
|
-
if (signOutputs ===
|
|
108
|
+
if (signOutputs === 'single') {
|
|
106
109
|
signatureScope |= TransactionSignature.SIGHASH_SINGLE;
|
|
107
110
|
}
|
|
108
111
|
if (anyoneCanPay) {
|
|
@@ -112,20 +115,17 @@ export class MultiSigPubkeyHash {
|
|
|
112
115
|
const otherInputs = tx.inputs.filter((_, index) => index !== inputIndex);
|
|
113
116
|
const sourceTXID = input.sourceTXID
|
|
114
117
|
? input.sourceTXID
|
|
115
|
-
: input.sourceTransaction?.id(
|
|
118
|
+
: input.sourceTransaction?.id('hex');
|
|
116
119
|
if (!sourceTXID) {
|
|
117
|
-
throw new Error(
|
|
120
|
+
throw new Error('The input sourceTXID or sourceTransaction is required for transaction signing.');
|
|
118
121
|
}
|
|
119
|
-
sourceSatoshis ||=
|
|
120
|
-
input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;
|
|
122
|
+
sourceSatoshis ||= input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;
|
|
121
123
|
if (!sourceSatoshis) {
|
|
122
|
-
throw new Error(
|
|
124
|
+
throw new Error('The sourceSatoshis or input sourceTransaction is required for transaction signing.');
|
|
123
125
|
}
|
|
124
|
-
lockingScript ||=
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (!lockingScript) {
|
|
128
|
-
throw new Error("The lockingScript or input sourceTransaction is required for transaction signing.");
|
|
126
|
+
lockingScript ||= input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript;
|
|
127
|
+
if (lockingScript == null) {
|
|
128
|
+
throw new Error('The lockingScript or input sourceTransaction is required for transaction signing.');
|
|
129
129
|
}
|
|
130
130
|
const preimage = TransactionSignature.format({
|
|
131
131
|
sourceTXID,
|
|
@@ -138,41 +138,40 @@ export class MultiSigPubkeyHash {
|
|
|
138
138
|
inputSequence: input.sequence || 0xffffffff,
|
|
139
139
|
subscript: lockingScript,
|
|
140
140
|
lockTime: tx.lockTime,
|
|
141
|
-
scope: signatureScope
|
|
141
|
+
scope: signatureScope
|
|
142
142
|
});
|
|
143
143
|
const hashToDirectlySign = Hash.hash256(preimage);
|
|
144
144
|
const { signature } = await wallet.createSignature({
|
|
145
145
|
hashToDirectlySign,
|
|
146
|
-
protocolID: [1,
|
|
146
|
+
protocolID: [1, 'multi sig brc29'],
|
|
147
147
|
counterparty: customInstructions.counterparty,
|
|
148
|
-
keyID: customInstructions.keyID
|
|
148
|
+
keyID: customInstructions.keyID
|
|
149
149
|
});
|
|
150
150
|
const s = Signature.fromDER(signature);
|
|
151
151
|
const sig = new TransactionSignature(s.r, s.s, signatureScope);
|
|
152
152
|
const sigForScript = sig.toChecksigFormat();
|
|
153
153
|
workingUnlockingScript.writeBin(sigForScript);
|
|
154
154
|
const chunkforSig = workingUnlockingScript.chunks.pop();
|
|
155
|
-
// add it to the array
|
|
156
|
-
workingUnlockingScript.chunks.splice(1, 0, chunkforSig);
|
|
155
|
+
// add it to the array before the pubkeys, pushing the other content to the right
|
|
156
|
+
workingUnlockingScript.chunks.splice(workingUnlockingScript.chunks.length - 1, 0, chunkforSig);
|
|
157
157
|
return workingUnlockingScript;
|
|
158
158
|
},
|
|
159
|
-
estimateLength: (tx, inputIndex) => {
|
|
160
|
-
let numberOfPubkeys
|
|
161
|
-
let numberOfSignatures
|
|
162
|
-
const staticLength =
|
|
159
|
+
estimateLength: async (tx, inputIndex) => {
|
|
160
|
+
let numberOfPubkeys;
|
|
161
|
+
let numberOfSignatures;
|
|
162
|
+
const staticLength = 8;
|
|
163
163
|
const input = tx.inputs[inputIndex];
|
|
164
164
|
const lockingScript = input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript;
|
|
165
|
-
if (
|
|
166
|
-
return Promise.resolve(1000); // guess
|
|
165
|
+
if (lockingScript == null) {
|
|
166
|
+
return await Promise.resolve(1000); // guess
|
|
167
167
|
}
|
|
168
|
-
const totalChunk = lockingScript
|
|
168
|
+
const totalChunk = lockingScript.chunks.at(-2);
|
|
169
169
|
numberOfPubkeys = numberFromScriptChunk(totalChunk);
|
|
170
|
-
const
|
|
171
|
-
const thresholdChunk = lockingScript?.chunks[thresholdPos];
|
|
170
|
+
const thresholdChunk = lockingScript.chunks[4];
|
|
172
171
|
numberOfSignatures = numberFromScriptChunk(thresholdChunk);
|
|
173
|
-
return Promise.resolve(staticLength + (numberOfSignatures *
|
|
172
|
+
return await Promise.resolve(staticLength + (numberOfSignatures * 74) + (numberOfPubkeys * 34));
|
|
174
173
|
}
|
|
175
174
|
};
|
|
176
175
|
}
|
|
177
176
|
}
|
|
178
|
-
//# sourceMappingURL=
|
|
177
|
+
//# sourceMappingURL=P2MSKH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"P2MSKH.js","sourceRoot":"","sources":["../../../src/P2MSKH.ts"],"names":[],"mappings":"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"}
|