// Copyright (C) 2018 Zilliqa
//
// This file is part of zilliqa-js
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
import BN from 'bn.js';
import Long from 'long';
export const isAddress = (address: string) => {
return isByteString(address, 40);
};
export const isBech32 = (raw: string) => {
return !!raw.match(/^zil1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}$/);
};
export const isBase58 = (raw: string) => {
return !!raw.match(
/^[1-9ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/,
);
};
export const isPrivateKey = (privateKey: string) => {
return isByteString(privateKey, 64);
};
export const isPubKey = (pubKey: string) => {
return isByteString(pubKey, 66);
};
export const isSignature = (sig: string) => {
return isByteString(sig, 128);
};
export const isByteString = (str: string, len: number) => {
return !!str.replace('0x', '').match(`^[0-9a-fA-F]{${len}}$`);
};
export const isNumber = (x: unknown): x is number => {
return typeof x === 'number';
};
export const isBN = (x: unknown): x is BN => {
return BN.isBN(x);
};
export const isLong = (x: unknown): x is Long => {
return Long.isLong(x);
};
export const isString = (x: unknown): x is string => {
return typeof x === 'string';
};
export const isPlainObject = (x: unknown): x is { [key: string]: any } => {
if (typeof x === 'object' && x !== null) {
const proto = Object.getPrototypeOf(x);
return proto === Object.prototype || proto === null;
}
return false;
};
const PRAGMA_REQUIRED = '@@ZJS_REQUIRED@@';
export interface Validator extends Function {
required?: typeof PRAGMA_REQUIRED;
}
export const required = (fn: T): Validator => {
if (typeof fn === 'function') {
return Object.defineProperty(fn, 'required', {
value: PRAGMA_REQUIRED,
});
}
throw new Error('fn is not a function');
};
export const matchesObject = (
x: unknown,
test: { [key: string]: Validator[] },
): x is T => {
if (isPlainObject(x)) {
for (const key in test) {
if (test.hasOwnProperty(key)) {
for (const tester of test[key]) {
const value = x[key];
if (typeof value === 'undefined' && tester.required) {
throw new Error('Key not found: ' + key);
} else {
continue;
}
}
}
}
}
return true;
};