Skip to content

Commit 408e073

Browse files
committed
fix: tap tree branch sorting; improve unit test
1 parent de06357 commit 408e073

File tree

4 files changed

+29
-30
lines changed

4 files changed

+29
-30
lines changed

src/payments/taprootutils.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,11 @@ function toHashTree(scriptTree) {
4444
hash: tapLeafHash(script.output, script.version),
4545
};
4646
}
47-
const left = toHashTree([scriptTree[0]]);
48-
const right = toHashTree([scriptTree[1]]);
49-
let leftHash = left.hash;
50-
let rightHash = right.hash;
51-
if (leftHash.compare(rightHash) === 1)
52-
[leftHash, rightHash] = [rightHash, leftHash];
47+
let left = toHashTree([scriptTree[0]]);
48+
let right = toHashTree([scriptTree[1]]);
49+
if (left.hash.compare(right.hash) === 1) [left, right] = [right, left];
5350
return {
54-
hash: tapBranchHash(leftHash, rightHash),
51+
hash: tapBranchHash(left.hash, right.hash),
5552
left,
5653
right,
5754
};

test/fixtures/p2tr.json

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -318,49 +318,55 @@
318318
"description": "address, pubkey, output and hash from internalPubkey and a script tree with seven leafs (2)",
319319
"arguments": {
320320
"internalPubkey": "aba457d16a8d59151c387f24d1eb887efbe24644c1ee64b261282e7baebdb247",
321+
"redeem": {
322+
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac4 OP_CHECKSIG"
323+
},
321324
"scriptTree": [
322325
{
323326
"output": "00a9da96087a72258f83b338ef7f0ea8cbbe05da5f18f091eb397d1ecbf7c3d3 OP_CHECKSIG"
324327
},
325328
[
326329
[
327330
{
328-
"output": "00a9da96087a72258f83b338ef7f0ea8cbbe05da5f18f091eb397d1ecbf7c3d3 OP_CHECKSIG"
331+
"output": "00a9da96087a72258f83b338ef7f0ea8cbbe05da5f18f091eb397d1ecbf7c3d4 OP_CHECKSIG"
329332
},
330333
[
331334
{
332-
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0 OP_CHECKSIG"
335+
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac1 OP_CHECKSIG"
333336
},
334337
{
335-
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0 OP_CHECKSIG"
338+
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac2 OP_CHECKSIG"
336339
}
337340
]
338341
],
339342
[
340343
[
341344
{
342-
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0 OP_CHECKSIG"
345+
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac3 OP_CHECKSIG"
343346
},
344347
{
345-
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0 OP_CHECKSIG"
348+
"output": "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac4 OP_CHECKSIG"
346349
}
347350
],
348351
{
349-
"output": "00a9da96087a72258f83b338ef7f0ea8cbbe05da5f18f091eb397d1ecbf7c3d3 OP_CHECKSIG"
352+
"output": "00a9da96087a72258f83b338ef7f0ea8cbbe05da5f18f091eb397d1ecbf7c3d5 OP_CHECKSIG"
350353
}
351354
]
352355
]
353356
]
354357
},
355358
"expected": {
356359
"name": "p2tr",
357-
"address": "bc1pmu8qwr9zljs9anger0d6q3uyr43yzjetmjmzf8p93ltycrwj28lsee3e0n",
358-
"pubkey": "df0e070ca2fca05ecd191bdba047841d62414b2bdcb6249c258fd64c0dd251ff",
359-
"output": "OP_1 df0e070ca2fca05ecd191bdba047841d62414b2bdcb6249c258fd64c0dd251ff",
360-
"hash": "027391d0aac8d94725e4fcec4b07214d7c8a14bcdca2b1c08e4bc786308bdae5",
360+
"address": "bc1pd2llmtym6c5hyecf5zqsyjz9q0jlxaaksw9j0atx8lc8a0e0vrmsw9ewly",
361+
"pubkey": "6abffdac9bd629726709a08102484503e5f377b6838b27f5663ff07ebf2f60f7",
362+
"output": "OP_1 6abffdac9bd629726709a08102484503e5f377b6838b27f5663ff07ebf2f60f7",
363+
"hash": "88b7e3b495a84aa2bc12780b1773f130ce5eb747b0c28dc4840b7c9280f7326d",
361364
"signature": null,
362365
"input": null,
363-
"witness": null
366+
"witness": [
367+
"2050929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac4ac",
368+
"c0aba457d16a8d59151c387f24d1eb887efbe24644c1ee64b261282e7baebdb247dac795766bbda1eaeaa45e5bfa0a950fdd5f4c4aada5b1f3082edc9689b9fd0a315fb34a7a93dcaed5e26cf7468be5bd377dda7a4d29128f7dd98db6da9bf04325fff3aa86365bac7534dcb6495867109941ec444dd35294e0706e29e051066d73e0d427bd3249bb921fa78c04fb76511f583ff48c97210d17c2d9dcfbb95023"
369+
]
364370
}
365371
},
366372
{

ts_src/payments/p2tr.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ export function p2tr(a: Payment, opts?: PaymentOpts): Payment {
4747
network: typef.maybe(typef.Object),
4848
output: typef.maybe(typef.BufferN(34)),
4949
internalPubkey: typef.maybe(typef.BufferN(32)),
50-
hash: typef.maybe(typef.BufferN(32)),
51-
pubkey: typef.maybe(typef.BufferN(32)),
50+
hash: typef.maybe(typef.BufferN(32)), // merkle root hash, the tweak
51+
pubkey: typef.maybe(typef.BufferN(32)), // tweaked with `hash` from `internalPubkey`
5252
signature: typef.maybe(typef.BufferN(64)),
5353
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
5454
scriptTree: typef.maybe(isTapTree),
5555
redeem: typef.maybe({
56-
output: typef.maybe(typef.Buffer),
57-
redeemVersion: typef.maybe(typef.Number),
56+
output: typef.maybe(typef.Buffer), // tapleaf script
57+
redeemVersion: typef.maybe(typef.Number), // tapleaf version
5858
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
5959
}),
6060
redeemVersion: typef.maybe(typef.Number),

ts_src/payments/taprootutils.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,12 @@ export function toHashTree(scriptTree: TaprootLeaf[]): HashTree {
6060
};
6161
}
6262

63-
const left = toHashTree([scriptTree[0]]);
64-
const right = toHashTree([scriptTree[1]]);
63+
let left = toHashTree([scriptTree[0]]);
64+
let right = toHashTree([scriptTree[1]]);
6565

66-
let leftHash = left.hash;
67-
let rightHash = right.hash;
68-
69-
if (leftHash.compare(rightHash) === 1)
70-
[leftHash, rightHash] = [rightHash, leftHash];
66+
if (left.hash.compare(right.hash) === 1) [left, right] = [right, left];
7167
return {
72-
hash: tapBranchHash(leftHash, rightHash),
68+
hash: tapBranchHash(left.hash, right.hash),
7369
left,
7470
right,
7571
};

0 commit comments

Comments
 (0)