From 3d299465c6e4ebaf4c6478ced1230ae1f6dd114f Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Fri, 7 Jun 2024 00:38:34 -0400 Subject: [PATCH] fix(faucet): isValidAddress should accept all bech32 addresses - check length based on Bech32 from [BIP173](https://github.com/bitcoin/bips/blob/e1e7b77c027b3d40d07d306cc75c2b5859c91db2/bip-0173.mediawiki#bech32) --- packages/faucet/src/addresses.spec.ts | 20 ++++++++++++++++++++ packages/faucet/src/addresses.ts | 13 +++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 packages/faucet/src/addresses.spec.ts diff --git a/packages/faucet/src/addresses.spec.ts b/packages/faucet/src/addresses.spec.ts new file mode 100644 index 0000000000..1092a331c6 --- /dev/null +++ b/packages/faucet/src/addresses.spec.ts @@ -0,0 +1,20 @@ +import { isValidAddress } from "./addresses"; + +describe("isValidAddress", () => { + it("accepts account address", () => { + expect(isValidAddress('cosmos1h806c7khnvmjlywdrkdgk2vrayy2mmvf9rxk2r', 'cosmos')).toBe(true); + }); + + it("accepts an ics-27 address", () => { + expect(isValidAddress('osmo1d6em9ea5y3dye6em0awqyss7ssp0a7sgjk792x8cx647cfs7a4msk0fr45', 'osmo')).toBe(true); + }); + + it("rejects an invalid address", () => { + expect(isValidAddress('cosmos1fail', 'cosmos')).toBe(false); + }); + + it("requires a prefix argument", () => { + // @ts-expect-error intentionally omitting an argument + expect(isValidAddress('cosmos1fail')).toBe(false); + }); +}); diff --git a/packages/faucet/src/addresses.ts b/packages/faucet/src/addresses.ts index 6792a5414d..dff8b26958 100644 --- a/packages/faucet/src/addresses.ts +++ b/packages/faucet/src/addresses.ts @@ -1,12 +1,17 @@ import { fromBech32 } from "@cosmjs/encoding"; +/** + * Check length based on Bech32 from {@link https://github.com/bitcoin/bips/blob/e1e7b77c027b3d40d07d306cc75c2b5859c91db2/bip-0173.mediawiki#bech32 | BIP173} + */ export function isValidAddress(input: string, requiredPrefix: string): boolean { try { const { prefix, data } = fromBech32(input); - if (prefix !== requiredPrefix) { - return false; - } - return data.length === 20; + return ( + prefix === requiredPrefix && + input.length >= 8 && + input.length <= 90 && + data.length >= 4 // 6 chars = 30 bits (3.75 bytes), rounded to whole byte + ); } catch { return false; }