Skip to content

Commit 2d9eb16

Browse files
committed
feat: add P2MR (BIP-360) address encoding and decoding
Add witness v2 (P2MR) support to the address encoding layer: - Generic bech32 segwit::encode() for all witness versions (v0-v2+) - P2MR script detection (34 bytes, witness v2, OP_PUSHBYTES_32) - OutputScriptSupport.p2mr flag on all Bitcoin networks - P2MR address test vectors (bc1z mainnet, tb1z testnet) validated against BIP-360 spec fixtures BTC-3241
1 parent be276f1 commit 2d9eb16

3 files changed

Lines changed: 142 additions & 3 deletions

File tree

packages/wasm-utxo/src/address/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ mod tests {
462462
"bitcoin.json" => vec![&BITCOIN as &dyn AddressCodec, &BITCOIN_BECH32],
463463
"testnet.json" => vec![&TESTNET, &TESTNET_BECH32],
464464
"bitcoinPublicSignet.json" => vec![&TESTNET, &TESTNET_BECH32],
465+
"bitcoinBitGoSignet.json" => vec![&TESTNET, &TESTNET_BECH32],
465466
"bitcoincash.json" => vec![&BITCOIN_CASH],
466467
"bitcoincash-cashaddr.json" => vec![&BITCOIN_CASH_CASHADDR],
467468
"bitcoincashTestnet.json" => vec![&BITCOIN_CASH_TESTNET],

packages/wasm-utxo/test/address/utxolibCompat.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ const __dirname = dirname(__filename);
1414
type Fixture = [type: string, script: string, address: string];
1515

1616
async function getFixtures(name: string, addressFormat?: AddressFormat): Promise<Fixture[]> {
17-
if (name === "bitcoinBitGoSignet") {
18-
name = "bitcoinPublicSignet";
19-
}
2017
const filename = addressFormat ? `${name}-${addressFormat}` : name;
2118
const fixturePath = path.join(__dirname, "..", "fixtures", "address", `${filename}.json`);
2219
const fixtures = await fs.readFile(fixturePath, "utf8");
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
[
2+
[
3+
"p2pkh",
4+
"76a9141e231c7f9b3415daaa53ee5a7e12e120f00ec21288ac",
5+
"miGJdPMyiLzFnBMxiUiC3Muwf7YgBFfJfp"
6+
],
7+
[
8+
"p2wkh",
9+
"00141e231c7f9b3415daaa53ee5a7e12e120f00ec212",
10+
"tb1qrc33clumxs2a42jnaed8uyhpyrcqassjnud0ns"
11+
],
12+
["p2sh", "a91411510d2560794b3ed7bf734bc0e030e70e4db42d87", "2Mtpna6GkKPDBi5n63kjqR5cyf3JybU8XmH"],
13+
[
14+
"p2shP2wsh",
15+
"a9140c4e25aa3282fa35888f5e1eedb876265328312587",
16+
"2MtNHiLt3xMQwaP3aJh269yHdJXKRf13yZX"
17+
],
18+
[
19+
"p2wsh",
20+
"00208bb2ef4181b60abe68b4c9cdc44c92e73bbb17fa2611e7e5b60d794794a1c94d",
21+
"tb1q3wew7svpkc9tu695e8xugnyjuuamk9l6ycg70edkp4u5099pe9xsjzsuxa"
22+
],
23+
[
24+
"p2tr",
25+
"5120c4beea12923f95c32976d3d1ca7d5490aa3ea28f96d5feacc8ecc28819925eb5",
26+
"tb1pcjlw5y5j872ux2tk60gu5l25jz4rag50jm2latxganpgsxvjt66s5kpdks"
27+
],
28+
[
29+
"p2trMusig2",
30+
"51205f98a79a3f750b250bee5bbdca0705db0ec8621f1bda91a083536a8a8bd6b6ed",
31+
"tb1pt7v20x3lw59j2zlwtw7u5pc9mv8vscslr0dfrgyr2d4g4z7kkmksphha7l"
32+
],
33+
[
34+
"p2pkh",
35+
"76a91491b8f56f155030f74259be43dff4d94a6258d84a88ac",
36+
"mtoTr2XB2QoKpCyca1tvnERZp7ujv9jJrC"
37+
],
38+
[
39+
"p2wkh",
40+
"001491b8f56f155030f74259be43dff4d94a6258d84a",
41+
"tb1qjxu02mc42qc0wsjehepalaxeff393kz23y409u"
42+
],
43+
["p2sh", "a914d640bad0fafe2eeac9fc0e0f09fb899066263ebf87", "2NCn68qY2xgZquvD64GqBFeW3uK1Dqn2PA4"],
44+
[
45+
"p2shP2wsh",
46+
"a914696cab5f237c954fc1fade8c6b234fe93e0e80f287",
47+
"2N2rf7uiywmMGucG3BMEFogQCfYfmK1DNY9"
48+
],
49+
[
50+
"p2wsh",
51+
"0020a0f0ee4bfe6a5393ffb952c17425566c8a6a11600450818afebb68c3c0c18b09",
52+
"tb1q5rcwujl7dffe8lae2tqhgf2kdj9x5ytqq3ggrzh7hd5v8sxp3vys730cst"
53+
],
54+
[
55+
"p2tr",
56+
"5120bc26f82eb59de4f345c94d7a307b022e4da476339f749d4af7e241ab9ea9d804",
57+
"tb1phsn0st44nhj0x3wff4arq7cz9ex6ga3nna6f6jhhufq6h84fmqzqygc0e5"
58+
],
59+
[
60+
"p2trMusig2",
61+
"51205709885a355f7fa37976e8aa16607d831df05107a970ae9cd4b25e401741d2df",
62+
"tb1p2uycsk34tal6x7tkaz4pvcrasvwlq5g849c2a8x5kf0yq96p6t0sxcrwws"
63+
],
64+
[
65+
"p2pkh",
66+
"76a9140a058aec7588fca80070436b020c352c2891b68088ac",
67+
"mgRwh5pFcy1wfTsiLPnw25HtpiLpvCtj6M"
68+
],
69+
[
70+
"p2wkh",
71+
"00140a058aec7588fca80070436b020c352c2891b680",
72+
"tb1qpgzc4mr43r72sqrsgd4syrp49s5frd5q2czc7z"
73+
],
74+
["p2sh", "a914056f5a1c07fe38d27e554b88bd857f64bda8eb6f87", "2Msjxm7dBk2cxBAbEfE3HfgqXLoDw5wBFpQ"],
75+
[
76+
"p2shP2wsh",
77+
"a914f7db4f654f1211a63165cfdaf1170e96d433bc1387",
78+
"2NFqmcbrPQHcjPEik4BHVCKdmWA89nmYpDF"
79+
],
80+
[
81+
"p2wsh",
82+
"00204d240cf4a05921cb8a24c6e373488ef8a038782ba75cd60dbe47ed05e5d940b3",
83+
"tb1qf5jqea9qtysuhz3ycm3hxjywlzsrs7pt5awdvrd7glkstewegzeslx36ac"
84+
],
85+
[
86+
"p2tr",
87+
"512039c67518d173820cc2b97bf6eb873ede5426ec1e6fd2d5ff14c707d44c1c044e",
88+
"tb1p88r82xx3wwpqes4e00mwhpe7me2zdmq7dlfdtlc5curagnquq38qwpz22y"
89+
],
90+
[
91+
"p2trMusig2",
92+
"51208a823980a8c1b9cd182fa7f6771e726f3d2ff16c550ccdb95a26e25bc40f5e84",
93+
"tb1p32prnq9gcxuu6xp05lm8w8njdu7jlutv25xvmw26ym39h3q0t6zqf9e89t"
94+
],
95+
[
96+
"p2pkh",
97+
"76a9145a8451539186feb4578b4f5613df6991e307823088ac",
98+
"momZcush7fbvnERUkx22pvTNz67z3iDSj8"
99+
],
100+
[
101+
"p2wkh",
102+
"00145a8451539186feb4578b4f5613df6991e3078230",
103+
"tb1qt2z9z5u3smltg4utfatp8hmfj83s0q3ssvlmrx"
104+
],
105+
["p2sh", "a9149829fb41e3c2bcf6a164310a7acbf0adcc0c3ee187", "2N77nzNBwNJsmHMwA1FFeDYzQ6uN3yhET3E"],
106+
[
107+
"p2shP2wsh",
108+
"a91493f1dd87104175795a1e37f5245461827237a05787",
109+
"2N6jV4agnmq98Lr2ZB8UQQyXguia7SyGKqG"
110+
],
111+
[
112+
"p2wsh",
113+
"0020161f1f0478c1649e1b1bf5eba467a27ba621d8a0f69fe7f46a27c3bb0f628a54",
114+
"tb1qzc037prcc9jfuxcm7h46geaz0wnzrk9q76070ar2ylpmkrmz3f2qnk3524"
115+
],
116+
[
117+
"p2tr",
118+
"5120a851285f56e16e91512f54b76e72c1cb2da34ae4de457702d095d3135c77fbfb",
119+
"tb1p4pgjsh6ku9hfz5f02jmkuukpevk6xjhymezhwqksjhf3xhrhl0as4aupzq"
120+
],
121+
[
122+
"p2trMusig2",
123+
"512085078b6ce45af8c4dea63248a5fae283d8edcca75f186395b237706c4bb42a36",
124+
"tb1ps5rckm8yttuvfh4xxfy2t7hzs0vwmn98tuvx89djxacxcja59gmqshsqcn"
125+
],
126+
[
127+
"p2mr",
128+
"5220c525714a7f49c28aedbbba78c005931a81c234b2f6c99a73e4d06082adc8bf2b",
129+
"tb1zc5jhzjnlf8pg4mdmhfuvqpvnr2quyd9j7mye5uly6psg9twghu4s8terle"
130+
],
131+
[
132+
"p2mr",
133+
"5220ab179431c28d3b68fb798957faf5497d69c883c6fb1e1cd9f81483d87bac90cc",
134+
"tb1z4vtegvwz35ak37me39tl4a2f045u3q7xlv0pek0czjpas7avjrxq4ze8st"
135+
],
136+
[
137+
"p2mr",
138+
"5220ccbd66c6f7e8fdab47b3a486f59d28262be857f30d4773f2d5ea47f7761ce0e2",
139+
"tb1zej7kd3hhar76k3an5jr0t8fgyc47s4lnp4rh8uk4afrlwasuur3q4q0p60"
140+
]
141+
]

0 commit comments

Comments
 (0)