From f99f8bfe826972c6e659f25c88bc639d5bcef1e5 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Thu, 21 Aug 2025 23:27:35 -0700 Subject: [PATCH] Extract account validation to its own file. --- src/lib/account/index.ts | 25 +++---------------------- src/lib/account/validate.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 src/lib/account/validate.ts diff --git a/src/lib/account/index.ts b/src/lib/account/index.ts index 889206b..5954e02 100644 --- a/src/lib/account/index.ts +++ b/src/lib/account/index.ts @@ -8,6 +8,7 @@ import { base32, bytes, hex } from '../convert' import { Blake2b, NanoNaCl } from '../crypto' import { Rpc } from '../rpc' import { _refresh } from './refresh' +import { _validate } from './validate' /** * Represents a single Nano address and the associated public key. To include the @@ -233,28 +234,8 @@ export class Account { * @param {string} address - Nano address to validate * @throws Error if address is undefined, not a string, or an invalid format */ - static validate (address: unknown): asserts address is string { - if (address === undefined) { - throw new ReferenceError('Address is undefined.') - } - if (typeof address !== 'string') { - throw new TypeError('Address must be a string.') - } - const pattern = new RegExp(`^(${PREFIX}|${PREFIX_LEGACY})[13]{1}[${ALPHABET}]{59}$`) - if (!pattern.test(address)) { - throw new RangeError('Invalid address format') - } - - const expectedChecksum = address.slice(-8) - const keyBase32 = address.slice(address.indexOf('_') + 1, -8) - const keyBuf = base32.toBytes(keyBase32) - const actualChecksumBuf = new Blake2b(5).update(keyBuf).digest() - actualChecksumBuf.reverse() - const actualChecksum = bytes.toBase32(actualChecksumBuf) - - if (expectedChecksum !== actualChecksum) { - throw new Error('Incorrect address checksum') - } + static validate (address: string): asserts address is string { + return _validate(address) } /** diff --git a/src/lib/account/validate.ts b/src/lib/account/validate.ts new file mode 100644 index 0000000..0f00695 --- /dev/null +++ b/src/lib/account/validate.ts @@ -0,0 +1,30 @@ +//! SPDX-FileCopyrightText: 2025 Chris Duncan +//! SPDX-License-Identifier: GPL-3.0-or-later + +import { ALPHABET, PREFIX, PREFIX_LEGACY } from "../constants" +import { base32, bytes } from "../convert" +import { Blake2b } from "../crypto" + +export function _validate (address: unknown): asserts address is string { + if (address === undefined) { + throw new ReferenceError('Address is undefined.') + } + if (typeof address !== 'string') { + throw new TypeError('Address must be a string.') + } + const pattern = new RegExp(`^(${PREFIX}|${PREFIX_LEGACY})[13]{1}[${ALPHABET}]{59}$`) + if (!pattern.test(address)) { + throw new RangeError('Invalid address format') + } + + const expectedChecksum = address.slice(-8) + const keyBase32 = address.slice(address.indexOf('_') + 1, -8) + const keyBuf = base32.toBytes(keyBase32) + const actualChecksumBuf = new Blake2b(5).update(keyBuf).digest() + actualChecksumBuf.reverse() + const actualChecksum = bytes.toBase32(actualChecksumBuf) + + if (expectedChecksum !== actualChecksum) { + throw new Error('Incorrect address checksum') + } +} -- 2.47.3