import invariant from 'tiny-invariant' import request from 'request' import { getAddress } from '@ethersproject/address' import { BigNumber } from '@ethersproject/bignumber'; export function validateAndParseAddress(address: string): string { try { const checksummedAddress = getAddress(address) return checksummedAddress } catch (error) { invariant(false, `${address} is not a valid address.`) } } export function tokenAddrContains(arr: { address: string }[], token: { address: string }) { for (var i = 0; i < arr.length; i++) { if (arr[i].address === token.address) { return true; } } return false; } export function sortsAddress(address0: string, address1: string): boolean { invariant(address0 !== address1, 'ADDRESSES') return address0.toLowerCase() < address1.toLowerCase() } export function formatPairAddress(_address0: string, _address1: string): string { let address0 = validateAndParseAddress(_address0) let address1 = validateAndParseAddress(_address1) const tokens = sortsAddress(address0, address1) ? [address0, address1] : [address1, address0] return tokens[0] + "+" + tokens[1] } export async function getBody(url: string, defaultBody: string) { const options = { url: url, method: 'GET', timeout: 5000 }; return new Promise(function (resolve, reject) { request.get(options, function (err, resp, body) { if (err) { // reject(err); console.log("request err msg:", err); resolve(defaultBody); } else { resolve(body); } }) }) } export function getFullUrl(url: string, options: any) { let params = []; for (let key in options) { params.push(`${key}=${options[key]}`); } return url + '?' + params.join("&"); } export function parseAbiArray(data: string, loc: number) { let lenStr = data.substring(loc / 32 * 64, loc / 32 * 64 + 64) let len = BigNumber.from("0x" + lenStr).toNumber() let arr: string[] = [] for (let i = 1; i <= len; i++) { let offset = (loc / 32 + i) * 64 let idxEnd = offset + 64 arr.push(data.substring(offset, idxEnd)) } return arr } export function parseAbiString(data: string, loc: number) { let lenStr = data.substring(loc / 32 * 64, loc / 32 * 64 + 64) let len = BigNumber.from("0x" + lenStr).toNumber() let offset = (loc / 32 + 1) * 64 let idxEnd = Math.ceil((len * 2) / 64) * 64 + offset return data.substring(offset, idxEnd) }