From da0b937748593384d9168b1b2896bcbb3a91581f Mon Sep 17 00:00:00 2001 From: Philip Hickey Date: Thu, 27 Jul 2023 18:17:05 +0100 Subject: [PATCH] feat: add checkdigit validation for aba routing numbers --- src/routing-number.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/routing-number.ts b/src/routing-number.ts index 31831bb..962d695 100644 --- a/src/routing-number.ts +++ b/src/routing-number.ts @@ -16,10 +16,36 @@ export default function (value: string | unknown): BankValidity { } const isValid = value in allowedRoutingNumbers; - const isPotentiallyValid = /^\d{0,8}$/.test(value); + const isPotentiallyValid = isCheckDigitValid(value); return { isValid, isPotentiallyValid: isValid || isPotentiallyValid, }; } + +/** + * reference: https://en.wikipedia.org/wiki/ABA_routing_transit_number#Check_digit + * @param abaRoutingNumber an ABA routing number to be checked + * @returns whether check digit of the ABA routing number is valid + */ +const isCheckDigitValid = (abaRoutingNumber: string) => { + try { + if (!/^\d+$/.test(abaRoutingNumber)) return false; + + const d = abaRoutingNumber.split("").map((digit) => parseInt(digit)); + + const res = + // prettier-ignore + ( + (3 * (d[0] + d[3] + d[6])) + + (7 * (d[1] + d[4] + d[7])) + + (1 * (d[2] + d[5] + d[8])) + ) + % 10 === 0; + + return res; + } catch (e) { + return false; + } +};