walletlink-e
Version:
WalletLink JavaScript SDK
185 lines (184 loc) • 6.7 kB
JavaScript
;
// Copyright (c) 2018-2020 WalletLink.org <https://www.walletlink.org/>
// Copyright (c) 2018-2020 Coinbase, Inc. <https://www.coinbase.com/>
// Licensed under the Apache License, version 2.0
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFavicon = exports.range = exports.isBigNumber = exports.ensureParsedJSONObject = exports.ensureBN = exports.ensureRegExpString = exports.ensureIntNumber = exports.ensureBuffer = exports.ensureAddressString = exports.ensureEvenLengthHexString = exports.ensureHexString = exports.isHexString = exports.prepend0x = exports.strip0x = exports.has0xPrefix = exports.hexStringFromIntNumber = exports.intNumberFromHexString = exports.bigIntStringFromBN = exports.hexStringFromBuffer = void 0;
const bn_js_1 = __importDefault(require("bn.js"));
const types_1 = require("./types");
const INT_STRING_REGEX = /^[0-9]*$/;
const HEXADECIMAL_STRING_REGEX = /^[a-f0-9]*$/;
function hexStringFromBuffer(buf, includePrefix = false) {
const hex = buf.toString("hex");
return types_1.HexString(includePrefix ? "0x" + hex : hex);
}
exports.hexStringFromBuffer = hexStringFromBuffer;
function bigIntStringFromBN(bn) {
return types_1.BigIntString(bn.toString(10));
}
exports.bigIntStringFromBN = bigIntStringFromBN;
function intNumberFromHexString(hex) {
return types_1.IntNumber(new bn_js_1.default(ensureEvenLengthHexString(hex, false), 16).toNumber());
}
exports.intNumberFromHexString = intNumberFromHexString;
function hexStringFromIntNumber(num) {
return types_1.HexString("0x" + new bn_js_1.default(num).toString(16));
}
exports.hexStringFromIntNumber = hexStringFromIntNumber;
function has0xPrefix(str) {
return str.startsWith("0x") || str.startsWith("0X");
}
exports.has0xPrefix = has0xPrefix;
function strip0x(hex) {
if (has0xPrefix(hex)) {
return hex.slice(2);
}
return hex;
}
exports.strip0x = strip0x;
function prepend0x(hex) {
if (has0xPrefix(hex)) {
return "0x" + hex.slice(2);
}
return "0x" + hex;
}
exports.prepend0x = prepend0x;
function isHexString(hex) {
if (typeof hex !== "string") {
return false;
}
const s = strip0x(hex).toLowerCase();
return HEXADECIMAL_STRING_REGEX.test(s);
}
exports.isHexString = isHexString;
function ensureHexString(hex, includePrefix = false) {
if (typeof hex === "string") {
const s = strip0x(hex).toLowerCase();
if (HEXADECIMAL_STRING_REGEX.test(s)) {
return types_1.HexString(includePrefix ? "0x" + s : s);
}
}
throw new Error(`"${hex}" is not a hexadecimal string`);
}
exports.ensureHexString = ensureHexString;
function ensureEvenLengthHexString(hex, includePrefix = false) {
let h = ensureHexString(hex, false);
if (h.length % 2 === 1) {
h = types_1.HexString("0" + h);
}
return includePrefix ? types_1.HexString("0x" + h) : h;
}
exports.ensureEvenLengthHexString = ensureEvenLengthHexString;
function ensureAddressString(str) {
if (typeof str === "string") {
const s = strip0x(str).toLowerCase();
if (isHexString(s) && s.length === 40) {
return types_1.AddressString(prepend0x(s));
}
}
throw new Error(`Invalid Ethereum address: ${str}`);
}
exports.ensureAddressString = ensureAddressString;
function ensureBuffer(str) {
if (Buffer.isBuffer(str)) {
return str;
}
if (typeof str === "string") {
if (isHexString(str)) {
const s = ensureEvenLengthHexString(str, false);
return Buffer.from(s, "hex");
}
else {
return Buffer.from(str, "utf8");
}
}
throw new Error(`Not binary data: ${str}`);
}
exports.ensureBuffer = ensureBuffer;
function ensureIntNumber(num) {
if (typeof num === "number" && Number.isInteger(num)) {
return types_1.IntNumber(num);
}
if (typeof num === "string") {
if (INT_STRING_REGEX.test(num)) {
return types_1.IntNumber(Number(num));
}
if (isHexString(num)) {
return types_1.IntNumber(new bn_js_1.default(ensureEvenLengthHexString(num, false), 16).toNumber());
}
}
throw new Error(`Not an integer: ${num}`);
}
exports.ensureIntNumber = ensureIntNumber;
function ensureRegExpString(regExp) {
if (regExp instanceof RegExp) {
return types_1.RegExpString(regExp.toString());
}
throw new Error(`Not a RegExp: ${regExp}`);
}
exports.ensureRegExpString = ensureRegExpString;
function ensureBN(val) {
if (val != null && (bn_js_1.default.isBN(val) || isBigNumber(val))) {
return new bn_js_1.default(val.toString(10), 10);
}
if (typeof val === "number") {
return new bn_js_1.default(ensureIntNumber(val));
}
if (typeof val === "string") {
if (INT_STRING_REGEX.test(val)) {
return new bn_js_1.default(val, 10);
}
if (isHexString(val)) {
return new bn_js_1.default(ensureEvenLengthHexString(val, false), 16);
}
}
throw new Error(`Not an integer: ${val}`);
}
exports.ensureBN = ensureBN;
function ensureParsedJSONObject(val) {
if (typeof val === "string") {
return JSON.parse(val);
}
if (typeof val === "object") {
return val;
}
throw new Error(`Not a JSON string or an object: ${val}`);
}
exports.ensureParsedJSONObject = ensureParsedJSONObject;
function isBigNumber(val) {
if (val == null || typeof val.constructor !== "function") {
return false;
}
const { constructor } = val;
return (typeof constructor.config === "function" &&
typeof constructor.EUCLID === "number");
}
exports.isBigNumber = isBigNumber;
function range(start, stop) {
return Array.from({ length: stop - start }, (_, i) => start + i);
}
exports.range = range;
function getFavicon() {
const el = document.querySelector('link[sizes="192x192"]') ||
document.querySelector('link[sizes="180x180"]') ||
document.querySelector('link[rel="icon"]') ||
document.querySelector('link[rel="shortcut icon"]');
const { protocol, host } = document.location;
const href = el ? el.getAttribute("href") : null;
if (!href || href.startsWith("javascript:")) {
return null;
}
if (href.startsWith("http://") ||
href.startsWith("https://") ||
href.startsWith("data:")) {
return href;
}
if (href.startsWith("//")) {
return protocol + href;
}
return `${protocol}//${host}${href}`;
}
exports.getFavicon = getFavicon;