@bsv/templates 1.3.0 → 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} +35 -40
- 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} +34 -39
- 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 -224
|
@@ -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,7 +14,7 @@ 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
19
|
if (threshold < 1 || threshold > pubkeys.length)
|
|
20
20
|
throw new Error('threshold must be between 1 and the number of pubkeys');
|
|
@@ -32,7 +32,7 @@ export class MultiSigPubkeyHash {
|
|
|
32
32
|
static async addressBRC29(wallet, counterparties, keyID, threshold) {
|
|
33
33
|
const pubkeys = await Promise.all(counterparties.map(async (counterparty) => {
|
|
34
34
|
const { publicKey } = await wallet.getPublicKey({
|
|
35
|
-
protocolID: [1,
|
|
35
|
+
protocolID: [1, 'multi sig brc29'],
|
|
36
36
|
keyID,
|
|
37
37
|
counterparty
|
|
38
38
|
});
|
|
@@ -57,14 +57,14 @@ export class MultiSigPubkeyHash {
|
|
|
57
57
|
if (address) {
|
|
58
58
|
if (typeof address !== 'string')
|
|
59
59
|
throw new Error('address must be a string');
|
|
60
|
-
const result =
|
|
60
|
+
const result = P2MSKH.thresholdAndTotalFromAddress(address);
|
|
61
61
|
hash = result.hash;
|
|
62
62
|
total = result.total;
|
|
63
63
|
threshold = result.threshold;
|
|
64
64
|
}
|
|
65
65
|
else {
|
|
66
|
-
if (
|
|
67
|
-
throw new Error(
|
|
66
|
+
if ((pubkeys == null) || total < 2)
|
|
67
|
+
throw new Error('at least 2 pubkeys are required');
|
|
68
68
|
const concat = concatPubkeys(pubkeys);
|
|
69
69
|
hash = Hash.hash160(concat);
|
|
70
70
|
}
|
|
@@ -73,9 +73,6 @@ export class MultiSigPubkeyHash {
|
|
|
73
73
|
if (total > 10)
|
|
74
74
|
throw new Error('total must be less than or equal to 10');
|
|
75
75
|
const script = new LockingScript();
|
|
76
|
-
for (let i = 0; i < total - 1; i++) {
|
|
77
|
-
script.writeOpCode(OP.OP_CAT);
|
|
78
|
-
}
|
|
79
76
|
script
|
|
80
77
|
.writeOpCode(OP.OP_DUP)
|
|
81
78
|
.writeOpCode(OP.OP_HASH160)
|
|
@@ -92,24 +89,23 @@ export class MultiSigPubkeyHash {
|
|
|
92
89
|
script.writeOpCode(OP.OP_CHECKMULTISIG);
|
|
93
90
|
return script;
|
|
94
91
|
}
|
|
95
|
-
unlock(wallet, customInstructions, workingUnlockingScript, signOutputs =
|
|
92
|
+
unlock(wallet, customInstructions, workingUnlockingScript, signOutputs = 'all', anyoneCanPay = false, sourceSatoshis, lockingScript) {
|
|
96
93
|
return {
|
|
97
94
|
sign: async (tx, inputIndex) => {
|
|
98
|
-
if (
|
|
95
|
+
if (workingUnlockingScript == null) {
|
|
99
96
|
workingUnlockingScript = new UnlockingScript();
|
|
100
97
|
workingUnlockingScript.writeOpCode(OP.OP_0);
|
|
101
|
-
customInstructions.pubkeys.
|
|
102
|
-
|
|
103
|
-
});
|
|
98
|
+
const pubkeys = concatPubkeys(customInstructions.pubkeys.map(p => PublicKey.fromString(p)));
|
|
99
|
+
workingUnlockingScript.writeBin(pubkeys);
|
|
104
100
|
}
|
|
105
101
|
let signatureScope = TransactionSignature.SIGHASH_FORKID;
|
|
106
|
-
if (signOutputs ===
|
|
102
|
+
if (signOutputs === 'all') {
|
|
107
103
|
signatureScope |= TransactionSignature.SIGHASH_ALL;
|
|
108
104
|
}
|
|
109
|
-
if (signOutputs ===
|
|
105
|
+
if (signOutputs === 'none') {
|
|
110
106
|
signatureScope |= TransactionSignature.SIGHASH_NONE;
|
|
111
107
|
}
|
|
112
|
-
if (signOutputs ===
|
|
108
|
+
if (signOutputs === 'single') {
|
|
113
109
|
signatureScope |= TransactionSignature.SIGHASH_SINGLE;
|
|
114
110
|
}
|
|
115
111
|
if (anyoneCanPay) {
|
|
@@ -119,17 +115,17 @@ export class MultiSigPubkeyHash {
|
|
|
119
115
|
const otherInputs = tx.inputs.filter((_, index) => index !== inputIndex);
|
|
120
116
|
const sourceTXID = input.sourceTXID
|
|
121
117
|
? input.sourceTXID
|
|
122
|
-
: input.sourceTransaction?.id(
|
|
118
|
+
: input.sourceTransaction?.id('hex');
|
|
123
119
|
if (!sourceTXID) {
|
|
124
|
-
throw new Error(
|
|
120
|
+
throw new Error('The input sourceTXID or sourceTransaction is required for transaction signing.');
|
|
125
121
|
}
|
|
126
122
|
sourceSatoshis ||= input.sourceTransaction?.outputs[input.sourceOutputIndex].satoshis;
|
|
127
123
|
if (!sourceSatoshis) {
|
|
128
|
-
throw new Error(
|
|
124
|
+
throw new Error('The sourceSatoshis or input sourceTransaction is required for transaction signing.');
|
|
129
125
|
}
|
|
130
126
|
lockingScript ||= input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript;
|
|
131
|
-
if (
|
|
132
|
-
throw new Error(
|
|
127
|
+
if (lockingScript == null) {
|
|
128
|
+
throw new Error('The lockingScript or input sourceTransaction is required for transaction signing.');
|
|
133
129
|
}
|
|
134
130
|
const preimage = TransactionSignature.format({
|
|
135
131
|
sourceTXID,
|
|
@@ -142,14 +138,14 @@ export class MultiSigPubkeyHash {
|
|
|
142
138
|
inputSequence: input.sequence || 0xffffffff,
|
|
143
139
|
subscript: lockingScript,
|
|
144
140
|
lockTime: tx.lockTime,
|
|
145
|
-
scope: signatureScope
|
|
141
|
+
scope: signatureScope
|
|
146
142
|
});
|
|
147
143
|
const hashToDirectlySign = Hash.hash256(preimage);
|
|
148
144
|
const { signature } = await wallet.createSignature({
|
|
149
145
|
hashToDirectlySign,
|
|
150
|
-
protocolID: [1,
|
|
146
|
+
protocolID: [1, 'multi sig brc29'],
|
|
151
147
|
counterparty: customInstructions.counterparty,
|
|
152
|
-
keyID: customInstructions.keyID
|
|
148
|
+
keyID: customInstructions.keyID
|
|
153
149
|
});
|
|
154
150
|
const s = Signature.fromDER(signature);
|
|
155
151
|
const sig = new TransactionSignature(s.r, s.s, signatureScope);
|
|
@@ -157,26 +153,25 @@ export class MultiSigPubkeyHash {
|
|
|
157
153
|
workingUnlockingScript.writeBin(sigForScript);
|
|
158
154
|
const chunkforSig = workingUnlockingScript.chunks.pop();
|
|
159
155
|
// add it to the array before the pubkeys, pushing the other content to the right
|
|
160
|
-
workingUnlockingScript.chunks.splice(workingUnlockingScript.chunks.length -
|
|
156
|
+
workingUnlockingScript.chunks.splice(workingUnlockingScript.chunks.length - 1, 0, chunkforSig);
|
|
161
157
|
return workingUnlockingScript;
|
|
162
158
|
},
|
|
163
|
-
estimateLength: (tx, inputIndex) => {
|
|
164
|
-
let numberOfPubkeys
|
|
165
|
-
let numberOfSignatures
|
|
166
|
-
const staticLength =
|
|
159
|
+
estimateLength: async (tx, inputIndex) => {
|
|
160
|
+
let numberOfPubkeys;
|
|
161
|
+
let numberOfSignatures;
|
|
162
|
+
const staticLength = 8;
|
|
167
163
|
const input = tx.inputs[inputIndex];
|
|
168
164
|
const lockingScript = input.sourceTransaction?.outputs[input.sourceOutputIndex].lockingScript;
|
|
169
|
-
if (
|
|
170
|
-
return Promise.resolve(1000); // guess
|
|
165
|
+
if (lockingScript == null) {
|
|
166
|
+
return await Promise.resolve(1000); // guess
|
|
171
167
|
}
|
|
172
|
-
const totalChunk = lockingScript
|
|
168
|
+
const totalChunk = lockingScript.chunks.at(-2);
|
|
173
169
|
numberOfPubkeys = numberFromScriptChunk(totalChunk);
|
|
174
|
-
const
|
|
175
|
-
const thresholdChunk = lockingScript?.chunks[thresholdPos];
|
|
170
|
+
const thresholdChunk = lockingScript.chunks[4];
|
|
176
171
|
numberOfSignatures = numberFromScriptChunk(thresholdChunk);
|
|
177
|
-
return Promise.resolve(staticLength + (numberOfSignatures * 74) + (numberOfPubkeys * 34));
|
|
172
|
+
return await Promise.resolve(staticLength + (numberOfSignatures * 74) + (numberOfPubkeys * 34));
|
|
178
173
|
}
|
|
179
174
|
};
|
|
180
175
|
}
|
|
181
176
|
}
|
|
182
|
-
//# 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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"}
|