From 48c9645e099945d3ff303b46b83ca59985d4b33d Mon Sep 17 00:00:00 2001 From: Alexander Kireev Date: Fri, 19 Jun 2026 01:23:58 +0700 Subject: [PATCH] fix(isBtcAddress): accept 62-character bech32 P2WSH addresses The bech32 regex capped the data part after the bc1/tb1 prefix at 58 characters, but a witness-v0 32-byte program (P2WSH) squashes to 52 base32 chars, giving 1 (witness version) + 52 + 6 (checksum) = 59 data characters (62 total). As a result valid P2WSH addresses, including the official BIP-173 test vectors, were rejected. Bump the upper bound from 58 to 59 so v0 32-byte addresses match while the upper length limit is still enforced. --- src/lib/isBtcAddress.js | 2 +- test/validators.test.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/isBtcAddress.js b/src/lib/isBtcAddress.js index 1a309e682..c98d57e31 100644 --- a/src/lib/isBtcAddress.js +++ b/src/lib/isBtcAddress.js @@ -1,6 +1,6 @@ import assertString from './util/assertString'; -const bech32 = /^(bc1|tb1|bc1p|tb1p)[ac-hj-np-z02-9]{39,58}$/; +const bech32 = /^(bc1|tb1|bc1p|tb1p)[ac-hj-np-z02-9]{39,59}$/; const base58 = /^(1|2|3|m)[A-HJ-NP-Za-km-z1-9]{25,39}$/; export default function isBtcAddress(str) { diff --git a/test/validators.test.js b/test/validators.test.js index 7d9d12690..f44a92351 100644 --- a/test/validators.test.js +++ b/test/validators.test.js @@ -12217,9 +12217,12 @@ describe('Validators', () => { 'tb1qxhkl607frtvjsy9nlyeg03lf6fsq947pl2pe82', 'bc1p5d7rjq7g6rdk2yhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297', 'tb1pzpelffrdh9ptpaqnurwx30dlewqv57rcxfeetp86hsssk30p4cws38tr9y', + 'bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3', + 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7', ], invalid: [ '3J98t1WpEZ73CNmQviecrnyiWrnqh0WNL0', + 'bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3q', '3J98t1WpEZ73CNmQviecrnyiWrnqh0WNLo', '3J98t1WpEZ73CNmQviecrnyiWrnqh0WNLI', '3J98t1WpEZ73CNmQviecrnyiWrnqh0WNLl',