import * as base64 from 'base-64'; import { bech32 } from 'bech32'; import BigNumber from 'bignumber.js'; import Decimaljs from 'decimal.js-light'; import { sha256 } from 'js-sha256'; import config from '../config'; import { Coin } from '../models'; Decimaljs.set({ precision: 40 }); export function bytesToValidatorPublic(bytes: number[]): string { return bech32.encode(config.prefix.valcons, bech32.toWords(bytes)); } export function publicToValidatorConsensus(str: string): string { return bytesToValidatorPublic( getAddressFromPublicED25519(Array.from(Buffer.from(str, 'base64'))), ); } export function consPublicKeyToBase64(str: string): string { return base64.encode(bech32.decode(str).words); } export function getAddressFromPublicED25519(bytes: number[]): number[] { return sha256.array(bytes).slice(0, 20); } export function signatureToValidatorConsensus(signature: string): string { return bytesToValidatorPublic(Array.from(Buffer.from(signature, 'hex'))); } export function getCoinPrice(coin: Coin) { // reserve*(1 - (1 - 1/supply)^ (100/crr)) // 100/crr const pow = new Decimaljs(100).dividedBy(new Decimaljs(coin.crr)); // 1/supply let result = new Decimaljs(1).dividedBy(new Decimaljs(coin.volume)); // 1 - 1/supply result = new Decimaljs(1).minus(result); // (1 - 1/supply)^ (100/crr) result = result.toPower(pow); // 1 - (1 - 1/supply)^ (100/crr) result = new Decimaljs(1).minus(new Decimaljs(result)); // reserve*(1 - (1 - 1/supply)^ (100/crr)) result = new Decimaljs(coin.reserve).times(result); return new BigNumber(result.toNumber()).shiftedBy(18).toString(); } // Return = reserve * (1 - (1 - sellAmount / volume) ^ (100 / crr)) // Рассчитывает сколько DEL вы получите, если продадите sellAmount монет. (Продажа) export function getBaseCoin(coin, sellAmount) { if (new Decimaljs(sellAmount).eq(new Decimaljs(0))) { return '0'; } if (new Decimaljs(sellAmount).eq(new Decimaljs(coin.volume))) { return coin.reserve; } if (new Decimaljs(coin.crr).eq(new Decimaljs(100))) { const ret = new Decimaljs(coin.reserve).times(new Decimaljs(sellAmount)); //reserve * sellAmount return ret.div(new Decimaljs(coin.volume)).toFixed(0).toString(); //reserve * sellAmount / volume } const e1 = new Decimaljs(1).minus(new Decimaljs(sellAmount).div(new Decimaljs(coin.volume))); //(100 / crr) const e2 = new Decimaljs(100).div(new Decimaljs(coin.crr)); //(1 - sellAmount / volume) return new Decimaljs(coin.reserve) .times(new Decimaljs(1).minus(new Decimaljs(e1).pow(new Decimaljs(e2)))) .toFixed(0) .toString(); //reserve * (1 - (1 - sellAmount / volume) ^ (100 / crr)) }