From 7f86d3d2bfd9f2dc6df7c919d63624df8a7380ce Mon Sep 17 00:00:00 2001 From: MszBednarski Date: Sun, 22 Aug 2021 19:42:04 +0100 Subject: [PATCH 1/4] add repo --- .../.env | 1 + .../.gitignore | 1 + .../README.md | 70 + .../boost-zil/index.ts | 3 + .../boost-zil/infra-manipulation/Logger.ts | 60 + .../boost-zil/infra-manipulation/calls.ts | 103 + .../boost-zil/infra-manipulation/index.ts | 7 + .../boost-zil/infra-manipulation/setup.ts | 53 + .../boost-zil/infra-manipulation/shared.ts | 66 + .../boost-zil/signable/bystr.ts | 57 + .../boost-zil/signable/customADT.ts | 57 + .../boost-zil/signable/index.ts | 6 + .../boost-zil/signable/list.ts | 31 + .../boost-zil/signable/other.ts | 42 + .../boost-zil/signable/pair.ts | 32 + .../boost-zil/signable/shared.ts | 36 + .../boost-zil/signable/types.ts | 19 + .../boost-zil/signable/uint.ts | 40 + .../boost-zil/utill.ts | 23 + .../chart.png | Bin 0 -> 651604 bytes .../dev.ipynb | 1796 +++ .../package-lock.json | 11598 ++++++++++++++++ .../package.json | 35 + .../scillaTest/ScillaServer.ts | 54 + .../scillaTest/index.ts | 7 + .../scillaTest/testMaker.ts | 70 + .../scillaTest/utill.ts | 64 + .../src/BancorFormula/BancorFormula.scilla | 901 ++ .../src/BancorFormula/README.md | 41 + .../testCalculateCrossConnectorReturn.ts | 56 + .../bancor/testCalculatePurchaseReturn.ts | 56 + .../bancor/testCalculateSaleReturn.ts | 53 + .../BancorFormula/__tests__/bancor/utill.ts | 40 + .../cases/crossConnectorReturnCases.ts | 167 + .../cases/purchaseReturnTestCases.ts | 625 + .../__tests__/cases/saleReturnTestCases.ts | 198 + .../src/BancorFormula/__tests__/run.ts | 17 + .../src/BancorFormula/build/abi.json | 178 + .../src/BancorFormula/build/bind.ts | 1152 ++ .../src/Operator/Operator.scilla | 108 + .../src/Operator/README.md | 49 + .../src/Operator/__tests__/run.ts | 13 + .../src/Operator/__tests__/tests.ts | 59 + .../src/Operator/build/abi.json | 105 + .../src/Operator/build/bind.ts | 523 + .../src/Token/README.md | 97 + .../src/Token/Token.scilla | 692 + .../src/Token/__tests__/run.ts | 15 + .../src/Token/__tests__/shared.ts | 22 + .../testDeployAndInitTokenWithZIL.ts | 77 + .../testDeployAndInitTokenWithZRC2/index.ts | 104 + .../zrc2Bind.ts | 593 + .../src/Token/__tests__/utils.ts | 6 + .../src/Token/build/abi.json | 381 + .../src/Token/build/bind.ts | 1330 ++ .../tsconfig.json | 12 + 56 files changed, 22001 insertions(+) create mode 100644 reference/continuous-token-bonding-curve-contracts/.env create mode 100644 reference/continuous-token-bonding-curve-contracts/.gitignore create mode 100644 reference/continuous-token-bonding-curve-contracts/README.md create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/index.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/Logger.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/calls.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/index.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/setup.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/shared.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/bystr.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/customADT.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/index.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/list.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/other.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/pair.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/shared.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/types.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/signable/uint.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/boost-zil/utill.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/chart.png create mode 100644 reference/continuous-token-bonding-curve-contracts/dev.ipynb create mode 100644 reference/continuous-token-bonding-curve-contracts/package-lock.json create mode 100644 reference/continuous-token-bonding-curve-contracts/package.json create mode 100644 reference/continuous-token-bonding-curve-contracts/scillaTest/ScillaServer.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/scillaTest/index.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/scillaTest/testMaker.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/scillaTest/utill.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/BancorFormula.scilla create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/README.md create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateCrossConnectorReturn.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculatePurchaseReturn.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateSaleReturn.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/utill.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/crossConnectorReturnCases.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/purchaseReturnTestCases.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/saleReturnTestCases.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/run.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/abi.json create mode 100644 reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/bind.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Operator/Operator.scilla create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Operator/README.md create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/run.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/tests.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Operator/build/abi.json create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Operator/build/bind.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/README.md create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/Token.scilla create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/run.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/shared.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZIL.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/index.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/zrc2Bind.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/utils.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/build/abi.json create mode 100644 reference/continuous-token-bonding-curve-contracts/src/Token/build/bind.ts create mode 100644 reference/continuous-token-bonding-curve-contracts/tsconfig.json diff --git a/reference/continuous-token-bonding-curve-contracts/.env b/reference/continuous-token-bonding-curve-contracts/.env new file mode 100644 index 000000000..204d88935 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/.env @@ -0,0 +1 @@ +CUR_NETWORK=ISOLATED \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/.gitignore b/reference/continuous-token-bonding-curve-contracts/.gitignore new file mode 100644 index 000000000..b512c09d4 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/README.md b/reference/continuous-token-bonding-curve-contracts/README.md new file mode 100644 index 000000000..a7b118cc1 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/README.md @@ -0,0 +1,70 @@ +# Bancor Continuous Token Bonding Curve Scilla Contracts + +This repository contains 3 scilla contracts that issues its own tokens through buy and sell functions. To buy tokens, you send a reserve token that can be $zil or a stablecoin to the buy function which calculates the average price of the token in reserve token terms and issues you the correct amount. The sell function works in reverse: first you provide the bonding contract with permission to take the amount of tokens you want to sell and then you trigger the function to take those tokens from you. The contract will calculate the current average selling price and will send you the correct amount of $zil or stablecoin. There is a configurable spread (protected by a unchangable max spread) between buying and selling with the spread amount going to an address owned by the development team. + +The contract are provided with *PRODUCTION READY TYPESCRIPT TYPESAFE SDKS* + +## Overview + +There are 3 contracts. Available in ./src/* + +- BancorFormula + +Does the bancor formula calculation for the sell and buy functions to work, it sends the result of the calculation in a callback of the Token contract. + +- Operator + +Has an admin that can set the current spread of the buy/sell functions, the bancor formula implementation and the fee beneficiary address. + +- Token + +The changed ZRC-2 contract that now also now can be pegged to a ZIL or any other ZRC2 token to make it its connected token (provides the aformentioned sell and buy functions for the token). + +The contract has a one time initialization transition to initialize it with the market cap of the token and the initial CW (see the bancor paper for what is CW or Connector Weight) + +Buy function: Simply send the connected token to the contract address, the contract will automatically send back its smart token! + +Sell function: Simply send the smart token to the contract address, the contract will automatically send back its connected token! + +## How does it look like? + +![Chart of how it works](chart.png) + +Q: Why is the bancor formula in a separate contract? + +A: The contract computation is expensive so any evaluation of the entire contract content should be evaluated only when Sell or Buy is actually triggered! Otherwise we would be introducing massive costs to the ZRC-2 protocol! + +## Info + +Going to ./src/Operator ./src/BancorFormula ./src/Token, you can find their respective READMEs. As well as their PRODUCTION READY SDKS. + +## Testing + +There are unit and integration tests! + +All tests are located in ./src/*./\_\_tests\_\_ directories! + + +### Running tests + +In this directory (we need to run local isolated server for integration testing): + +```bash +git clone https://github.com/Zilliqa/zilliqa-isolated-server.git && cd zilliqa-isolated-server && docker build --rm -f "Dockerfile" -t isolatedserver:1 "." && docker run -d -p 5555:5555 isolatedserver:1 && cd .. && npm i && npm run test +``` + +# Other + +Tip: The Token contract supports both ZIL and ZRC2 out of the box however not to introduce unneeded gas costs I would recommed trimming the contract to support only ZIL or ZRC2 depending on the usecase! + +./dev.ipynb is the notebook used for making of parts of the contracts and research. + +Sources: + +https://github.com/AragonBlack/fundraising/blob/master/apps/bancor-formula/contracts/BancorFormula.sol + +https://github.com/AragonBlack/fundraising/blob/master/apps/tap/contracts/Tap.sol + +https://discourse.sourcecred.io/t/bonding-curve-references/271 + +https://storage.googleapis.com/website-bancor/2018/04/01ba8253-bancor_protocol_whitepaper_en.pdf \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/index.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/index.ts new file mode 100644 index 000000000..b1eb0876d --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/index.ts @@ -0,0 +1,3 @@ +export * from "./infra-manipulation"; +export * from "./signable"; +export * from "./utill"; diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/Logger.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/Logger.ts new file mode 100644 index 000000000..ca567e1a5 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/Logger.ts @@ -0,0 +1,60 @@ +import { Transaction } from "@zilliqa-js/account"; +import { getNetworkName } from "./shared"; +import { units, BN, toBech32Address } from "@zilliqa-js/zilliqa"; + +const RED = "\x1B[31m%s\x1b[0m"; +const CYAN = "\x1B[36m%s\x1b[0m"; +const GREEN = "\x1B[32m%s\x1b[0m"; +const MAGENTA = "\x1B[35m%s\x1b[0m"; + +export function state(v: {}) { + const color = "\x1b[33m%s\x1b[0m"; + console.log(color, JSON.stringify(v, null, 4)); +} + +export function balance(inQa: BN) { + const color = "\x1b[35m%s\x1b[0m"; + console.log( + color, + `In Zil: ${units.fromQa(inQa, units.Units.Zil).toString()}` + ); + console.log(color, `In Li: ${units.fromQa(inQa, units.Units.Li).toString()}`); + console.log(color, `In Qa: ${inQa.toString()}`); +} + +export function txLink(t: Transaction, msg: string) { + const id = t.id; + const url = `https://viewblock.io/zilliqa/tx/0x${id}?network=${getNetworkName()}`; + console.log(MAGENTA, msg); + const receipt = t.getReceipt(); + if (receipt) { + if (receipt.success) { + console.log(GREEN, "Success."); + } else { + console.log(RED, "Failed."); + console.log(RED, JSON.stringify(receipt, null, 2)); + if (receipt.event_logs) + receipt.event_logs.forEach((e) => + console.log(GREEN, JSON.stringify(e, null, 2)) + ); + } + } + if (!(getNetworkName() == "ISOLATED")) { + console.log(CYAN, url); + } else console.log(CYAN, t.txParams.toAddr); +} + +export function contractLink(a: string, msg: string) { + console.log(RED, msg); + if (!(getNetworkName() == "ISOLATED")) { + const url = `https://viewblock.io/zilliqa/address/${a}?network=${getNetworkName()}&tab=state`; + console.log(RED, url); + } +} + +export function logAccount(a: string) { + console.log(RED, `Bech32: ${toBech32Address(a)}`); + console.log(RED, `20 byte: ${a}`); + const url = `https://viewblock.io/zilliqa/address/${a}?network=${getNetworkName()}`; + console.log(CYAN, url); +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/calls.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/calls.ts new file mode 100644 index 000000000..490544917 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/calls.ts @@ -0,0 +1,103 @@ +import { BN, Zilliqa } from "@zilliqa-js/zilliqa"; +import { getZil } from "./setup"; +import { Contract } from "@zilliqa-js/contract"; +import { TxParams } from "@zilliqa-js/account"; +import { ByStr20 } from "../signable"; + +const sleep = async (mil: number) => + new Promise((res, rej) => setTimeout(() => res(), mil)); + +export async function waitUntilBlock(target: string): Promise { + const secondsPerTxBlock = await getSecondsPerBlock(); + console.log(`Waiting ... target: ${target}`); + console.log(`Current seconds per tx block is ${secondsPerTxBlock}`); + const targetBNum = parseInt(target); + while (true) { + const cur = await getCurrentBlock(); + if (cur < targetBNum) { + console.log(`Current block ${cur}`); + await sleep(secondsPerTxBlock * 1000); + continue; + } else { + break; + } + } +} + +export async function getCurrentBlock(): Promise { + const zil = getZil(); + const txblock = await zil.blockchain.getLatestTxBlock(); + if (typeof txblock.result == "undefined") { + throw new Error("Couldn't get tx block"); + } + return parseInt(txblock.result.header.BlockNum); +} + +export async function getSecondsPerBlock(): Promise { + const zil = getZil(); + const txblockRate = await zil.blockchain.getTxBlockRate(); + if (typeof txblockRate.result == "undefined") { + throw new Error("Couldn't get tx block rate"); + } + return Math.ceil(1 / txblockRate.result); +} + +export async function getBlockNumber(secondsToAdd: number): Promise { + const curBlockNumber = await getCurrentBlock(); + const secondsPerTxBlock = await getSecondsPerBlock(); + const res = + "" + (curBlockNumber + Math.round(secondsToAdd / secondsPerTxBlock)); + console.log(`Current block number: ${curBlockNumber}`); + console.log(`Returned Block number: ${res}`); + return res; +} + +export async function getMinGasPrice() { + const zil = getZil(); + const res = await zil.blockchain.getMinimumGasPrice(); + if (!res.result) { + throw "no gas price"; + } + return new BN(res.result); +} + +export interface Value { + vname: string; + type: string; + value: string | ADTValue | ADTValue[] | string[]; +} +interface ADTValue { + constructor: string; + argtypes: string[]; + arguments: Value[] | string[]; +} + +export function newContract( + zil: Zilliqa, + code: string, + init: Value[] +): Contract { + //@ts-ignore + return zil.contracts.new(code, init); +} + +export function getContract( + zil: Zilliqa, + a: string +): Contract & { + call: ( + transition: string, + args: Value[], + params: Pick< + TxParams, + "version" | "amount" | "gasPrice" | "gasLimit" | "nonce" | "pubKey" + >, + attempts?: number, + interval?: number, + toDs?: boolean + ) => ReturnType; +} { + const address = new ByStr20(a).toSend(); + //@ts-ignore + return zil.contracts.at(address); +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/index.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/index.ts new file mode 100644 index 000000000..1e748f62e --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/index.ts @@ -0,0 +1,7 @@ +export * from "./shared"; +export * from "./setup"; +export * as log from "./Logger"; +export * from "./calls"; + +export const sleep = (milis: number) => + new Promise((res) => setTimeout(res, milis)); diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/setup.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/setup.ts new file mode 100644 index 000000000..4b212453c --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/setup.ts @@ -0,0 +1,53 @@ +import { Zilliqa } from "@zilliqa-js/zilliqa"; +import { getNode, getCurNetwork, getNetworkName } from "./shared"; + +const color = "\x1b[41m\x1b[5m%s\x1b[0m"; +const logColor = (s: string) => console.log(color, s); + +logColor(`::: NETWORK => ${getCurNetwork()} !!!!`); + +const isolatedServerAccounts = { + d90f2e538ce0df89c8273cad3b63ec44a3c4ed82: { + privateKey: + "e53d1c3edaffc7a7bab5418eb836cf75819a82872b4a1a0f1c7fcf5c3e020b89", + amount: "90000000000000000000000", + nonce: 0, + }, + "381f4008505e940ad7681ec3468a719060caf796": { + privateKey: + "d96e9eb5b782a80ea153c937fa83e5948485fbfc8b7e7c069d7b914dbc350aba", + amount: "90000000000000000000000", + nonce: 0, + }, + b028055ea3bc78d759d10663da40d171dec992aa: { + privateKey: + "e7f59a4beb997a02a13e0d5e025b39a6f0adc64d37bb1e6a849a4863b4680411", + amount: "90000000000000000000000", + nonce: 0, + }, +}; + +var zil: Zilliqa; + +export function getZil() { + if (zil) { + return zil; + } + const zils = new Zilliqa(getNode()); + if (getNetworkName() == "ISOLATED") { + for (const [k, v] of Object.entries(isolatedServerAccounts)) { + zils.wallet.addByPrivateKey(v.privateKey); + } + } + zil = zils; + return zils; +} + +export function getDefaultAccount() { + const zil = getZil(); + const def = zil.wallet.defaultAccount; + if (!def) { + throw new Error("No default account!"); + } + return def; +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/shared.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/shared.ts new file mode 100644 index 000000000..82dfce276 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/infra-manipulation/shared.ts @@ -0,0 +1,66 @@ +import { bytes } from "@zilliqa-js/util"; + +type Nets = "TESTNET" | "MAINNET" | "ISOLATED"; + +type EnvVariables = { env: { [key: string]: string } }; + +var proc: EnvVariables = { env: {} }; + +if (require("dotenv")) { + const resolve = require("path").resolve; + require("dotenv").config({ path: resolve(process.cwd(), ".env") }); +} +if (process) { + proc = process as EnvVariables; +} else { + console.log( + `Not in NodeJS env, waiting for env variables to be set using @setEnvVariables` + ); +} + +/* + * Add PRIV_${CUR_NETWORK} + * and any + * PRIV_${CUR_NETWORK}_${cur} + * in ascending order starting from 1 + */ +export function setEnvVariables(envConfig: { + CUR_NETWORK: Nets; + [key: string]: string; +}) { + Object.entries(envConfig).forEach(([k, v]) => (proc.env[k] = v)); +} + +export function getCurNetwork() { + return proc.env!.CUR_NETWORK as Nets; +} + +const nodes: { [key in Nets]: string } = { + TESTNET: "https://dev-api.zilliqa.com", + MAINNET: "https://ssn.zillacracy.com/api", + ISOLATED: "http://localhost:5555", +}; + +const version: { [key in Nets]: number } = { + TESTNET: bytes.pack(333, 1), + ISOLATED: bytes.pack(222, 3), + MAINNET: bytes.pack(1, 1), +}; + +const networkName: { [key in Nets]: "testnet" | "mainnet" | "ISOLATED" } = { + TESTNET: "testnet", + ISOLATED: "ISOLATED", + MAINNET: "mainnet", +}; + +export function getNetworkName(): "testnet" | "mainnet" | "ISOLATED" { + return networkName[getCurNetwork()]; +} + +export function getVersion() { + return version[getCurNetwork()]; +} + +export function getNode() { + return nodes[getCurNetwork()]; +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/bystr.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/bystr.ts new file mode 100644 index 000000000..9b748b162 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/bystr.ts @@ -0,0 +1,57 @@ +import { Signable, sha256 } from "./shared"; +import { normaliseAddress } from "../utill"; + +abstract class ByStrSignable extends Signable { + value: string; + constructor(v: string) { + super(); + this.value = v; + } +} + +abstract class AnyByStr extends ByStrSignable { + constructor(v: string) { + let toSet = v.startsWith("0x") ? v : `0x${v}`; + super(toSet); + } + toHash() { + return sha256(this.value.toLowerCase().replace("0x", "")); + } + toSend() { + return this.value.toLowerCase(); + } +} + +export class ByStr20 extends ByStrSignable { + type = "ByStr20"; + protected zero = "0x" + new Array(40).fill(0).join(""); + static getZeroByStr20() { + return new ByStr20("0x" + new Array(40).fill(0).join("")); + } + constructor(v: string) { + super(v); + } + toHash() { + return sha256(normaliseAddress(this.value).replace("0x", "")); + } + toSend() { + if (this.value == this.zero) { + return this.zero; + } + const res = normaliseAddress(this.value); + if (!res) { + throw new Error("spooky undefined address"); + } + return res; + } +} + +export class ByStr33 extends AnyByStr { + type = "ByStr33"; +} +export class ByStr64 extends AnyByStr { + type = "ByStr64"; +} +export class ByStr extends AnyByStr { + type = "ByStr"; +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/customADT.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/customADT.ts new file mode 100644 index 000000000..75ae47076 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/customADT.ts @@ -0,0 +1,57 @@ +import { Signable } from "./shared"; +import { getHashed } from "../utill"; +import { Sendable } from "./types"; +import { ByStr20 } from "./bystr"; + +/** + * { + tname: string; + tparams: string[]; + tmap: { + cname: string; + argtypes: string[]; + }[]; + { + constructor: `${addr}.Uint128Pair`, + argtypes: [], + arguments: [threshold.toString(), discount.toString()], + } +} + */ +export class CustomADT extends Signable { + value: T; + constructor(...v: T) { + super(); + this.value = v; + } + toHash() { + return getHashed(...this.value); + } + toSend() { + return { + constructor: this.getType(), + argtypes: [], + arguments: this.value.map((v) => v.toSend()), + } as unknown as Sendable; + } + setADTname(s: string) { + this.type = s; + this.ADTname = s; + this.value.forEach((v) => v.setADTname(s)); + return this; + } + setContractAddress(a: ByStr20) { + this.contractAddress = a; + this.value.forEach((v) => v.setContractAddress(a)); + return this; + } + getType() { + if (!this.contractAddress) { + throw new Error("Contract name not set!"); + } + if (!this.ADTname) { + throw new Error("Custom ADT name not set!"); + } + return `${this.contractAddress.toSend().toLowerCase()}.${this.ADTname}`; + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/index.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/index.ts new file mode 100644 index 000000000..127d8f123 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/index.ts @@ -0,0 +1,6 @@ +export * from "./bystr"; +export * from "./uint"; +export * from "./other"; +export * from "./list"; +export * from "./customADT"; +export * from "./pair"; diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/list.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/list.ts new file mode 100644 index 000000000..4d0fc0770 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/list.ts @@ -0,0 +1,31 @@ +import { Signable } from "./shared"; +import { getHashed } from "../utill"; +import { Sendable } from "./types"; +import { ByStr20 } from "./bystr"; + +export class List extends Signable { + value: T[]; + constructor(v: T[]) { + super(); + this.value = v; + } + toHash() { + return getHashed(...this.value); + } + toSend() { + return this.value.map((v) => v.toSend()) as unknown as Sendable; + } + setADTname(s: string) { + this.ADTname = s; + this.value.forEach((v) => v.setADTname(s)); + return this; + } + setContractAddress(a: ByStr20) { + this.contractAddress = a; + this.value.forEach((v) => v.setContractAddress(a)); + return this; + } + getType() { + return `List (${this.value[0].getType()})`; + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/other.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/other.ts new file mode 100644 index 000000000..d124b9ab4 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/other.ts @@ -0,0 +1,42 @@ +import { Signable } from "./shared"; +import createHash from "create-hash"; + +function sha256String(s: string): string { + const sha = createHash("sha256"); + sha.update(s); + return `0x${sha.digest().toString("hex")}`; +} + +abstract class StringSignable extends Signable { + value: string; + constructor(v: string) { + super(); + this.value = v; + } +} + +export class BNum extends StringSignable { + type = "BNum"; + constructor(v: string) { + super(v); + } + toHash() { + return sha256String(this.value); + } + toSend() { + return this.value; + } +} + +export class ScillaString extends StringSignable { + type = "String"; + constructor(v: string) { + super(v); + } + toHash() { + return sha256String(this.value); + } + toSend() { + return this.value; + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/pair.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/pair.ts new file mode 100644 index 000000000..697cf01fb --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/pair.ts @@ -0,0 +1,32 @@ +import { Signable } from "./shared"; +import { getHashed } from "../utill"; +import { Sendable } from "./types"; +import { ByStr20 } from "./bystr"; + +export class Pair extends Signable { + value: [F, S]; + constructor(...v: [F, S]) { + super(); + this.value = v; + } + toHash() { + return getHashed(...this.value); + } + toSend() { + return { + constructor: "Pair", + argtypes: this.value.map((v) => v.getType()), + arguments: this.value.map((v) => v.toSend()), + } as unknown as Sendable; + } + setADTname(s: string) { + this.ADTname = s; + this.value.forEach((v) => v.setADTname(s)); + return this; + } + setContractAddress(a: ByStr20) { + this.contractAddress = a; + this.value.forEach((v) => v.setContractAddress(a)); + return this; + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/shared.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/shared.ts new file mode 100644 index 000000000..32a9379a0 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/shared.ts @@ -0,0 +1,36 @@ +import createHash from "create-hash"; +import { Sendable } from "./types"; +import { ByStr20 } from "."; + +export abstract class Signable { + abstract value: any; + protected type?: string; + contractAddress?: ByStr20; + ADTname?: string; + abstract toHash(): string; + abstract toSend(): Sendable; + setContractAddress(contractAddress: ByStr20) { + this.contractAddress = contractAddress; + return this; + } + setADTname(ADTname: string) { + this.ADTname = ADTname; + return this; + } + getType() { + if (!this.type) { + throw new Error("type was not defined!"); + } + return this.type; + } +} + +/** + * @param b + * @returns hash of form `0x${sha.digest().toString("hex")}` + */ +export function sha256(b: string): string { + const sha = createHash("sha256"); + sha.update(Buffer.from(b, "hex")); + return `0x${sha.digest().toString("hex")}`; +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/types.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/types.ts new file mode 100644 index 000000000..9ce6192c6 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/types.ts @@ -0,0 +1,19 @@ +export interface Value { + vname: string; + type: string; + value: string | ADTValue | ADTValue[] | string[]; +} +interface ADTValue { + constructor: string; + argtypes: string[]; + arguments: Value[] | string[]; +} + +export type Sendable = + | Value["value"] + | { + constructor: string; + argtypes: string[]; + arguments: Value[] | string[]; + }[] + | string[]; diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/uint.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/uint.ts new file mode 100644 index 000000000..9442e9b71 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/signable/uint.ts @@ -0,0 +1,40 @@ +import { BN } from "@zilliqa-js/util"; +import { Signable, sha256 } from "./shared"; +import randomBytes from "randombytes"; + +abstract class UintSignable extends Signable { + value: BN; + constructor(v: string | BN) { + super(); + this.value = new BN(v); + } +} + +export class Uint32 extends UintSignable { + type = "Uint32"; + constructor(v: string | BN) { + super(v); + } + toHash() { + return sha256(this.value.toString("hex", 8)); + } + toSend() { + return this.value.toString(); + } +} + +export class Uint128 extends UintSignable { + type = "Uint128"; + constructor(v: string | BN) { + super(v); + } + toHash() { + return sha256(this.value.toString("hex", 32)); + } + toSend() { + return this.value.toString(); + } + static getRandom() { + return new Uint128(new BN(randomBytes(16).toString("hex"), "hex")); + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/boost-zil/utill.ts b/reference/continuous-token-bonding-curve-contracts/boost-zil/utill.ts new file mode 100644 index 000000000..67fe28f37 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/boost-zil/utill.ts @@ -0,0 +1,23 @@ +import { fromBech32Address, toChecksumAddress } from "@zilliqa-js/zilliqa"; +import { validation } from "@zilliqa-js/util"; +import { Signable } from "./signable/shared"; + +export const normaliseAddress = (address: string): string => { + if (validation.isBech32(address)) { + return fromBech32Address(address); + } + if (!validation.isAddress(address.replace("0x", ""))) { + throw Error( + "Wrong address format, should be either bech32 or checksummed address" + ); + } + return toChecksumAddress(address); +}; + +export function concatHashed(...hashes: string[]): string { + return `0x${hashes.reduce((prev, cur) => prev + cur.replace("0x", ""), "")}`; +} + +export function getHashed(...hashes: Signable[]): string { + return concatHashed(...hashes.map((a) => a.toHash())); +} diff --git a/reference/continuous-token-bonding-curve-contracts/chart.png b/reference/continuous-token-bonding-curve-contracts/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..5b2ac2d1e11dee374b89a296fe8085083b52fb57 GIT binary patch literal 651604 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≤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�ldDmBrSX95L39dAZVQPVD3aM#|hrR`CI7BEmQH zvZ`~AJM84U$;#~7%N`Cf`}CX=DrtYgM~f~PfIjow{UK*JE-pHvAP%%taTGJthw}Y2 z&`gIdj0KC1rrha$XZ>!XDj^`xFODhfidF0Kpc-)p^^c(K;zo`@XSXCTF#PY z?#z2QvsubX3bLnZoBZ6v;58xipm5mES6{v7sj>&r+a!_sFHX{4ox!dO`oIa)-DFu& zqObq)$l>1}#e>e2;$io>BN@agY)g}Q=mPJVpsT*qD&Dsjc;BlL{9({pF@Htnm9oWi z43dacSCN2@ETiXnpj|XOzxt<~-s4!o;SEmm@z?!H*fgQ;9|8#z8(*ZniMU%J@2{?l zIm%2}*SzuPqun@2G)tRw>#2IPLUcxc*dMwgDGh|+$Ys?jdL`94L4x{tZIF3UUQ?7p zLkU5tW&ZC1Ll zVRnl#7aEY%Bq5SGyn~H0xaM#PrL!}zv`qI1h8}Wvyz$`8$;2C)^%y4;1qoE)$@KN| zZG4N}pq)pAGE{9(^~%ouxVP7U@GXfz^|QPvDlDn@^?Gb}Eyo#eb)TedZQCh<8ih7A zlGbY0Q5Lt16xqY6EQhW1)8!2Lgkw;^Z;FosHlhfRX4d7w@;d~|OMWY8A}P_VrK2CO zk}fVzt8mB@@{V2bcwMxQxpFYAPz5(wr0=}Cdr93~B&p0p4Aq`f1b zxmEA5lHt%%O;D-Y)_E=X&pBkLh{>N*bJA8C(tWXAy%x_vF27DtbXsR`m2seZv-$cU zE`Ha|Q_Nd^tmlU;f-1>E8IFc13;hU{%D{+M$abzukB5Z5b!Vs%{fynfxl%5uY>~r1qLne~cyZPbG$bihskuiGLsT$`aax$2Gd+Wq_3L z$q%~m;bU(;c0CR{ft;nCtM?IgbGkKT%v^Hc|4~E}Km^=D;u%-6nwZ|Df1HAaoJMY_kG~?m z_lxkmJ3b%EsaetL^jDuo&5h~Kmj0mIs%J3YZnL#$X@?45Qkmp2QEtOfLOz^6xSg-} zjzKcMKgQ+X@b?g;udcqF&Zu3`bG*YBTb%$}pm9y(uJxhaXAgEd32?CHG7Mb+M&viA z{sKNx{m@X~rzDobzc$Q&&sCcZN&1Gv1*!3e^$js9)#9^Vk%!=XtH8kJj^aI0#OM!QS>&(SDdu^>d z;LXy_p?bF-v4r~yp0_%4V{^Z6LU0NEkTI|Gk;u+-^P_+Tc%c8574|?dqxGu9P(TIS zjIzhw@y<}l#kWl^#@Z5KOc)__xfGz29|G{Vb&y-MS!4eE^cE+Qc4L8}Hb($Iyd3`4 zc3Q}a9e|>^C}S(j8Jbw!t4lXYsWU( znf8h|4k;WznbbC8qELcJz1hdd!Tlgy2!<}Gl3Kz#IE_Fpcr4gaD=yf9UFnU2| zGg1PUAz>HFc~e!lV7l{^?L5*?kYm&LgeL#SmSIDhuFP_CZe2MZF}A&(l1A=jOww+OoI zC4S7*mZ@5H0zvi5BwpSO?#h{NW}r-bdTr2`9%#8d)hA3om^{03}byts)Cl zqPuv+!u#i)35DPP(4$_C-k$u5XWVk8C62@#S*aZz{03nTNc$5H9@ar&ggC z(=B`%O2H|EW1nY6c?om9$PQBoj<%e|w!%-3P*$q;uD^))lU19g25X5~C@j~1Icgf$ zR!i@HjBTliG!Iqjaap6c{&o@r`#w6<5^#Wzn)-aw4X^-C2ME&*4ConlABP5RMt*f6&#{sWRw{Zxp&lY zJ3_M`?P##`=UslSS;mnq# zI?zxl@O2$$)kzePyS2bn8|F)z@F?$j!@bzLDC-Plk~)beyohmLzWrV-{5P#GD*<_e z1=m#vXf|12A#Tg7Cg{OAsOltl2Z*hCd{yJo1JFV?A(6Cf#6=@V0>hbuWFJ0r+#x%( zNLMOwpcnY^MYD6UDt-O%9u@txg3L{yJkd{4Wa+wJ>IAHvJ2c>IAj} zVdj(jK9r=S8cm2#6~aI+_9^0zKJyTM{zyJc^;euKQNyJ56Q<*I-r3$uRr$ki8*xt@ zLYi!XK8?QXUx;YfF8E+AD{NQ(kBlHMaL<>-2DC|b0`nltUW|QNU~26c^g*^Pgym7c zPG55VYczNt4@WL}VTHWxaz=hRrdDMkyQhWpckiu z)urIk-ql5F*5WfrHwiI5V8R6z!_*w>o>o&7l0!%O%&A!z=3RV zAyl$E)^>K+UqRGxH|^w@ooAvhOy{sEN>$Ugo^swPHurNL-NtZ}J?I8U^M!{iM9Xh| zxe*2#rc|_Q?YL~z) z+N+b~bGMFWpy2U?!74p-&kcWK;H0oqU?g-54h_PdgoL92#@63oKpa<>Udq|ydF{9nBN7An}ECU*VH4)9OZdE+UY#s1UJFWcT4jBhl%tLBTZ^g(3+(9tG{d!f5cWdE*bh0}Ib5ZK^&K1F4jZ zDDA`)o(@sg%!@mi6tDVPGS#94yYUbVpoS1kc4g!SL@X#?0CVsvapCbZ{hh5-9 z^0Dwp8Pevdm+|)oGUV{N7VyCIz%Qc=co)tZZ#_ha_fP+DCaP;Pd1cPZ>%z2H2sV88ECU;@xq)AA}}Ex)^&!Mm#(iBP~aOnK;`j=LeS#`p*}{& z*_BKF+E^6tcjnaSPXbu?) z0P`;wC{{=Wk@lXU6B_EWss-3R0fXb`ne|;k7n)1+L;l>k1;NHK5xxq=&HF&3k;`8u$<=Gn5Fajr z9{S%x)1m62PfoeDqR4y~gP}k{F>f!cJA<0b=zvYar~AMJ-mlp5#I!FPD^2lv)4Y8F zO69C$^~0gl{!BFpm;LH`s<)o;#P@4$3c$*ZJFIS`VEW2K$hoK+uvU$oOK>Hy z?u<_)Vr|-m&}ST-J5XmHGd%Km%M2lDI6JRwa6(H6;9h>gm+2TF_0@)1m(IU*ovkwS zTy$z$nXAyr5^<#cnIpoH=J??Op?`lI6+T~*{H(={R^z|1_uf%aJ<*=8h>D1Sppu~# zkRTue5+pT}sZsfLAWh zG88_uVdV-VZtR)AA7nsX*;vEgPqU{B-Yg+N0};mgnZ&zT*MPP;yS%yxaD_MeURc{( zq68gWjD2&(*L$d27Vu>mK|D0$k|;xftok&KTMbWVD=a#-NdUyDjEw`IQ0#7~*!1yP zSUhWWh4jtmXuN6}!NO*GR`GN}*~lI_TeqKENvv%uLaNq+*8C~0OcdXZK_tvcq1=z_ z~%>^-%AO?-1%(OdG5cP-EM zgP6EwrvN_VDz@0weVQem7p-k)MhI)}78;5!`ryP(O_tKkxELyo8AhAMnqSJMf+zaD zf$Tt94fNz*o^Q}aXyX#w;A2*)kB}=|6j-xEcr}er_rizwqa75Hek6L@ME~yxb%*=! zX6D-4pySVC>{wM>1n7+@S!<^BUd$RaswFCwCa*jSzUKAhWH2apqnYB>sSr19%dTS7 zEQY-c=|^JAFf{$4W|Xb>)5{Bqxj+RW|AYH0(^(#y$vj1A{D^MU}-rlXYN7-z|kCYe?0{~B&SB;|5V-YX0@*CedSkH;_{dNjaw>et8`rym^N1kha z`gykv4?Wyv@ORWU9`L7?8NsuaD!TfjiTK6ER0cdo2>My#JxdQynal_qooxdq#b|TF z$W_Uovj5NW*0(mK{U3FY6aD`&}QvM&L&l?eA-a=0sz(b77D27l!AX9 z$bg#B*&w388Bn0)iF9n6h2}2kc2OhK*~)v2X1}rX2MRn`im@ybC`G{#_m=N9JbP(i zW!*yj_dzfS?=x7z6^-#9dg~!zIU;IQGP9eHcl?c+Lq>K->q~{=V)=mw(`myQc{W-% z=%6wJ+9T70Cwjyt&M-l51Ynk8^QLLA!#vh~5Bx9NNWiuxZp2kGaRW^~{F+#)7`{@Qory9t(JTbx-rOF%cSgg9LWZt5V!eT2E^e) z(Ds{b(2D<^MS_sMt`R~xBdJE5I6R}M#lc?F^=0JTq8w0ZR z955w3v=qigVft=mh_JBF+1M~2Z zrRLY7doADnohO0@DUK=zI-2^@^O)PMZ{%XBy1T%(Sq|9HKp`%4x9l3AViye9<}la{ z%};o&)x&_oyWi@af4ur`@Wk=_@8>^j;ZT{VmpxC9UoD^f)Yn3SOYfSt|H|x_oT#3v z^WGu8DU(??yo=TS=DoY=^jq@H8mtCLY$Aq)V8-R(>(@TFwz;s3>@Oq(!#VjMP}v== z#a2@`L2)0J!syuEal{sO^?K!mJnm79{g6Qy^6S|NPB2{z87l71LLzNBp=S7|gGD{1 zcky91kMDzdV{v4VNQm7KYt<2Yw|8^YHqHRX*S45FwVtmfW|@$_bi6rg-}d{m#Kq59 znJl}f>D!QAZ=oAijt{rcWyTBEeTb0$EU8qR!EDy5@Hrv9SJN#-S8m237>IA)7$+?t z_%5aGWKDIqTKAR)j)Q`2zxkM07X;wgZmZ4t#0&u$n*r-Kr>nzWHB?m*Bp`E{?DvZ@0EJtgGpcRAW|^-M*X6jZrQ z4Un154@GgDEP&iHdX8@Fbfn1Bo-z>b&pX_^5G&i7xc&BhFVdcvtsftVFaKSqU(w|+ z;}hyK-x*yzl^c~Gb}tvOUE;Acy(Du>%03zC3~CRuZ4lq%(+K>BQH38*VM~9+Ef5Db z{LO5YX&dSKKUWk->_?f1&sO@@@uAZYwMT(mK4Yyh8}*jeCiVAZPl#2LAuRXq0&MQm zbe$S(T{M01lJdlp>n%>w_0v{6_N%bWRT>jUYt1l{92k0*bf%RQ7ZSGNTk%~skZynC zZX>PpajxJaKUe0CmPf}Y^r)%=RnLW+8hY@qyzQg$R+R!>{j?5s1O7eKe(>h41)cMt zSkUzsV!fGK%BGH;?dSJ1vUtdlMakXD!3LnYs}CXNDFxr5{+WSY%FTMch;wbLvxm*d z$*O>dYed-9C9WX9FBm9#nROG4&I!L0bT4xx3hHwc=y-*IVIq}E0y^EohRtG#TnvBC z0G?$7QyAEmmMUoij|fMY5eS7+rUq8LF>E@`t$$Y(8WxWPxADmJD-*?+77}m~0}eDF zO0fzCH#Z4|6A+ZEGwhu^4#?%;hmMiLq+5s@A9!Y(l<6e+J8t^X*tKW%Pg9p?>zoT& z_0zJ1y)Q|rp>;#Z5>v0ggXQ-KzGe7A^M{B!>7ahwWGCrUp`K{zuN{{rv@$b0yJ&$e zXRIS0QjhG-dVkp*Ac=(B@DRT^ryor{a?CLQVkXL@q3K||;}L%OQ7}`8(38VYZ>zUq z$~*BE!!f%Dy_Ea-EOul%Ylx-qSco$W`zmx?Mq;k}x$y8TSSwIB+@B%dO?@=_O)WoN zA};Xk`Y)Lc&?CuxLzjqEOnq-~N-S|O0+DZz&al+nSVSx@R>z0LXJGL2TOnIP0&-H$ z34Q{T$VGsbu~1^^oNXW@>}Ct-2oAFu&BAM8S>W9(WdUru(LWum2E}$cmwG~vg>57+ zCJ!xKy3GuGfv^eB`&g}S6U6(8v9!{l;F*l1g~9{f8QH4ACf0I9nX>7l33LS#cvR9n zfBv0B<}~tMR`w7j286k#Dm=LT^T z%%d=k7ET0bPjKS*8hD#TG@lvri?qIqWNdKx9Pe$hHB7_oQ8DsWzqNp10kfhShyci# z`XqHNM0+DNrYuQto!0;TcVl;dbcFz@gv~HV@Me1ukd3yi_e}s+L%B< zklMxHI57tZEx z4I1=^D8Pe0@qqu$f8dGA`g${vf})B=;4$uk13z;YtpKcL&{E*jRya%ewG}-Vle1U5 znH-}geNk@Y4DRfjyM^+XskF>4$1~plc?R!9E}X)%u&DQrA!v$a_=DAl%g|2}D?}mZ?L2s6O_P}kB zDP_9(@(u3(<2b11B$)%R3Tuqqs3sqp!403QHVy5T@ahaB=vnHaUNCE#1aWvh{LJ>! z7#4zBjkx6!1Q^d(VBL1cf({7!owt8-Gy04ZArtXl?DlG+FM~ zAQWoH^N_YIo+AQmz`tRm5}5V9zF|=AO02|4U_DHgB~`u-rMl|m-3d<#?tbI+$<2sJ z;V}pBzYqUJnxaeEZ8O@yNz01E--1*d>yw+qZF6+JbfR8R{!6mE!}wiemeOYTH(AxB z0i%#r^m@6hx<1Qgn7qPz%g0_D=odHDJ7xr5${@)vVbs5c2J`aoJHcj8NC@k`A6hZ_ z;UWGqbOIGTJuca@FLsYCgkik`2DWlrg&F4t8C};juh}USMi9+1-0W5;K^Dv)ykhRYSfzMg zhZ3BzH7N#JBjHVRK&bNTyAV|s0t;n#K;VVrV(i3Cb> z#rj*TUi4PoO7n;%>igfB4Fr6()HEml7dXjlwU@y~_sGPKeP4xcavhbeqV1 zHXdzSqE6na>>lm+_ER`HE3s@eo=d=R(h!*|^MnJnmkB%n?X-?&wFN?a88z zJxPQoH+xMB8@}7WcU1Sy2TSMLNrZTVZ`#Mx@<=& zQx0thf)F2Z~6mS6fB9i62&s0BRt{>m8aYrn&GQyN96c5*JM;1>Y z+eaUIw>WL$7R}Cj-4lJMLO5{#HVS3@MQ_a;5#eJwsC?ybeN719w%)e-3-}9pzX#U-L?5{o6BhVVEfMbB!zCPWK%5P`L;HRC1<8*iC+FQ^A`YutH@xQ1htV_g* zKWV1tAKyg2v2NuY1GkueVuM8XuZ05%J2!mvi>OgpFv`(Sd~51N+(PI)Lhq2~ccz{% zTdU})b)@OsSkB9TZ5_4ot!%zcjVkk zQmHyK!Vz`|=CJ!dy=(xLT9-zW;Vj{K@F&4zQ+HREF$FDU_)t{mlC4_QJ;OnKk%;wj*aucp>V@VNX=+ylD(VTD@VnV`9G7%e%u-#M5YVWhi zD`aA=^=&7L%sk%V%yMEKASkoHRs1cx#LQv25C=+a5Nl~U{SyuCmKvn!6(90vNX%?FodBNnNu}$rbp@N7J`DRZsmW=sY_}Q|~JIt%; z{x)A3+XZ98B`F&WRUSbzNH2g0ozqWhp+eB?jogh~4^I2ipDmi9J9oOk5OHi&Jkj;l=e07bJ9mG#^*V;)XD>mm zu((LjE3${ZiGY7C%NM~5)yLx#(Gl*_u$t=+Zgy8*5Xg4z%dt8Ugr{tDtXrPmr@Ie{ z6fHag8Dzf$lfTlQq7fAJg>VCUcn$m}OW78Qm(Rjfk;W z{5aR4uayHu9pLi&Ul~jFPyIC--(RDRpAb1(NSNP~@z0jz+-4RzG%nG@>{Tl9cPbq~ z=7_)bL!t-U=gObW>N>-pV}aX59LIVN``AH(boOxQk5ZI|O#n4G zjY1K~s6$%eNzJLpL(Yt^0`xmy(UeuL_V?6TwCxidyL{dz#MLL0b`ct$6|GM?z_;^r zVU$BB?q4~wSr+~j?Ut*fw=c!Pw?iI!E zeCs*<+CFfk2K3!I5SIPj$?GL zP~af%J_#(TxILifYtz%sls=ivW%Tpiq*Bv(aCT*Q5=}XlE~2!#E9kOe#S+bj=+y-^ zim*~(em+rw{m7&F&H890645Wjb)3T2{ zvnj4!x=!fo@N@Kj<-4C#J{>C0erB&)-n9#YCqr86RX(|VEqU$?9w9j!4=5z4e2q8| z+v+)zUy#Ai6a+&)vt?y8>ky#NmtEHfNC+M8B^DTw-+~#$!eudT58wF5$`Z;jI1!Q@C~wTJ#>*OB9C@4jyh>j!);02JC^~ll>~me_ zufI3Etc7t@W&iVxSm&nn=l=5Dp?3HBF&xZIMQIx=MS>va04L#(KQ&mhNWB%|4bHY? zY3EFbITSb&9M9uNu|z~5+eb-zX;~PCxk@7icDls8eD! z(gx2>JN$G2r7S}LSFPirvL=ouuf;G28gw~}?v*u5je0q4!(sOg;jTk!`c^ElQvB*6 zman5gSn=2U*UWbi*P&(!T=@hFxWt#})^Dbn;=XddL_HFq0?0ZX>R{lV%GX&VZ^x#Q z3IMe(+>JEz3GsN-MmsqX+i!r-^R2x|gB5Zz2VQ|-cP65-*y`&-=ra5MzoGTrM{pSIAfJ%PFV z`H+f7bDro2WR0xRMsVkn@ccu>!{8jV6ap!I(->~gn5cE$LS=d&qP0?Zvg)1h^0{4v zpTIZlJ;yGcf-}A&=JSZ~csPrTv5pIj2x^RrsJ{ApQ0g>F2Gr*g@ffh+lRHZ1KlC@@&R?47VQHOoBl5fR7+Wv zsuE3{H5OwFe~9YFOs+JL;Dgya-7?%pI_%8=0ud`f>bW9S1$&5aV0;BTY!|jAzCX0Z z+CUfAv&Z_c2*#6fYNC9jVb>wgtocTh&16C4nfxT^CaY1~K)Dj1aCVk+HJ6mp>!|{r zYd+-z(twF?nzs%d%uECx(3t6flUP)1*oQQJf-9p>?}Ntz@wbhApG!)1>1f`RVEOHX z+xz&pb3_92pDcgiE3FS%5oom3NmYza{rz8!^Zj3q^A`t6JWi?Yj*!+R6%XoP|DAt1 z+WG-52}VGco*n%NsP)`EgZOWq$9FDTrNazgJu4YIfzP7;dM+28OJ?X%@Qz~_b6>nd z`25sleoVt6yKgToHJkl~HR#!au#rQs)q~po@~S6sB@AigrT-M^JcrEZ5L~%^2Fgr4 zS)Hfq-zxdKM|3~|2@CcG zhQD*UzvNEQ$>Xi*ioeJuE_*N|gmZWp^0jR&EF9i6TYuN``SyquQ0*1|v0>^AUpk0v zw#~iy;PFezJYd~SuQWa}x)iO4D(}o`rNA5~&1p9NmIO}w;E5T;+VRJEf1&S!*V)D5 z9zHGF&p|B`ss=zATJD~s@^v1|O^prB4Fj!cphzE7ow@fcODnBqTHEDKF2##~A#8f( zE>Nuu!YfhtwulUhW{E(;jA&_Al|!oUz=IBPTY3T0r>UjD+l9bC=hn>ALV@M^@hPZ} zxQrSp-{ruX4b-9K-A6Wy*Pr0N@zeR-BjyjzVY}dnZ?!_wFSiG7;RInrPe zVG9=5#GtPhs)uqtJcb`T^D$Jq3w40Yf;gISa@mIt_i?(t|Yk#+Jt_GY0pu^|HpqP=y;Ltf#++}MULm*0uiLBCd#5@krSqB^T z$;E(m2(hfH8L3aftec$5x3Yg`sn*P2E-zSTeu@3dH={~gYqhX%J1;MDiA~XR3qK=u zXuQX#+4;z>hf0S?&l7NGC$jVYcU-2*i(BKTvlTD-Q_)Fk>ep|-Rc&AGG_7^ES_5x? zbsd@CA=k!KWjmOX_0#buPm?1Vowc>^jh;W8)}6=cURMwKP2VX_Pxy`4B9SVpuUjL( z5_@0v^8ZYP=6^D`6D-Ch@wND6Ons4^lS8W-_yOeo2LHmHgyp2<8IUl>8f-*|nid74 zD;f~y7^p_sVk{FZvGA``dFAx%hUlU5^dqGes$8^r;$CR^zpRL~sD3%(D%m&;rTOrG zC&}|a$SgI_0yCO!O`OJ`0dIY;Z?j$5KA#Nn1Bn&M@d}Wy9&(|#|EG4cTM%+o3o}*u zUuQ}FFW?__ms|%9*|$3}%=YUW56F)3PHBvT(u&1s+hAo$)vZ@E?khdHpWrx_74q8+$!+bx4h--7 zqeCNAYE5eRtEl-L5jx7%FZ<=+8e!0F`NzLOSeBeb1jv~@n$!Gm*inhG#*UqT#f<(> z{vO~A^B#6n{_hin0bf#oj}FZz#?XRA+18uv(FbWe{%VW#ploCJYhY~|IjGq`~9vz);V9c2l!66 zK=uuOtw-uH!r$jk#tT9vZjZ$vK5ECpU!&`85~D1oQ5SLx0;L7UXl#Z5>TE zg?bBa^Ui4ek1dT}+JuRReAoy-T@Kj=R@bEH6FicwNccCu-7l(Kwe2E*0w{bN1_u|K zF4(77*}lf<>FGefAw`;`s+vCeeEfKcR_WQ|2SvIac9PmVoMcL`W8Po)xe@-c-QwbJ zDmA%x74GlaNW@a)UQ5MLQn}rUiOs&c-KIc2`{qVU+qJv98x?T6s#t~Uk~x5+NxQOTemE;i-h}0pI)@i23K+WuLqza zVBOu@Dsg4>1iWp<+@IU5>Nj4KDQ!rN@$%f;P4YuAeV!=ao7Ir(#pg5kH4K#c+=y-I z>GK*4c^)A-4LgIPsKb^wW1+axsXAG7qzCE@Q`y8_XJgGjgYBHlLvst8=vfU#U+!Gp ztg_vCK3#nHbq9|f4|fo9mFKlDc{}(K1x3K(VArDx#Q{vaJfgXLPxh)O-Wu?ckhmZV-vIYHUleYIFfdF4#dmP^=jD_o*$o7!7uxFEj_ zay)oFtL{rub$J@jOdlo;c;Mar%W~DyS@e-S@Hl z1E2^99hn3%k<$-KeL6`-Ba@R-K8R;!Ja4&3X*?9Bz8e#^;1`~M@BE&(HdFl+9Bf&RJ4ILorUidwjQqMRvoSUx zu@P%4VOVLVC0_8BB4Fr8mirL%pj)*S{Hu!!DgE&mZ7I|j@$4nL?vUs6Nmm|h$QSx_ z%DYPc!6jBrx_SCE z^7V`Hn%e|^x=9amJM6M>1D%OZ>%HJ!MgO%H@yJSom4_C`cmRiF^3j3{qEIWtqv{f$NPp7&oVNK^P zzhT<$M+NM+Hen5!kKo=Fx-TRRI+0HJ-MyU+;zB-H*;&YLF1(as+VyCkoNuFVZS!zp z(o~?_t6Y$-)H$ns-D(pw07qfkGv{W4i>P`lyoSuZPchKQSUQoLIV;#+^yEAy1ETz5 z#^O0mlw}5NXI^j>h1Bn9fjKlmtAJ^IH1iKnk%#yq4aRQlO~@p3Q9vF70KwbNTT8FZ^6GwB%p)QuDrO+&wc}L%PMP-SG$XZgQO|1hE^XnXpQ}tmD;F^apxz zz7pUd9{Ibw_lClQ3{v8#NK0=t6gB|V;xrc=r>5Uk>q?H3)il< z_NR63s7AqlLru&1hf(Z4q-5Xbk)5$suzGgc$bygzchg&nbJEYPW(dx9z4a~=QB2$6 znzt&LB_8eqVlF`zao~Vhc4lxQ{4pPSda#rW>e#-y6&viQbt1EM3o{#Yl*hBY_MClm z&sAYo8py9p%K5i<%m5%Q1^EBrqGNDFVAVF0UXeyzgErj<#ys;4RCeWsqMCW4>is`; zRiDoeoiLt*^lp|XYrc~MsCB0tT^fUiFM{>74O1LJ!REEu!SXkDxB|yEtA7~kb64DY zf5^2nqoa9}11R6I!oRk2liM)xW0jDsbUM%{Z;KWN#Gu7VgJ(A}_6CG6o;kG;u)l95 z`81f~>`DZ|HOkRVbxnx?m;L_?uE zx%mKL(3PxJ>QKP&Rsv;1Via-P9)#W?RvxvnkdrQdS%;*95eE)4(r z<#~P{tx|FAbauFqs=Q;AU8K@V+qwDD5J@bb$vt{e@2|QA>kc9+mEbX~6RF7rYm%B> z?H5P#*SR7)9AkZZIy;s8S7ki3PgYroYxVAxv`C5?fpyr?HNvo68LRE?S;4}w^Z@e;p<~VmQsHj9q4q9^s!ybWgo45mvCaG z9cEhQFk=O7!rGs7LOQQOgrG{O{Tiro4$+s>V8Y-;3yXbLupQjT4@opHyee;ibeatgLywC@Q; z&$0s2u;*+QhmOZB8mxj%)fZ?dtKKy)Ssa2Vm?tyLG{p| zpn24m3FZvr6aQ{_?cLATh|xY`$gVM8Hiwp;mWK|AS{x;3fQrpyktw=p`#GEv>ku?2c0Uy{2G%PAEd zJA!ZP#akRIS#IiFu=}sybT{i5&rfR})(^OS!7#l9GxM@qcTUe8!^7qJD8=;h8(l8P z7O`8Uw@?57+x@TDu5@`m13Q6-++SUQmI_SzY@IWwN@&&OG#O z*Pd=xxfNC4^wg-o5{6MZgS-vv>cvW#qV~t8iC$q&k_Vc@*>LE2-iw=JChe6>Jm~JP z9+?WA)0|_Q#q}1q62+NR%P-3DCDxcSM@>YX-!Eh9Sc&Z%DZVh&V^umCo>#Nn8da<; zvKul(8Ee&kopr$whF&LbDA7m2XKaZ_I{FPo=zM&gmw#@ zIsvJ-)Xl6o-Wb@YUFIw_Ds~ragGR!ff1MF|i6h-n0_Ull9E2RSuNMM&f{RblhMbN1 z1KipBr$L~R)Wd<$_%{sO2 z3g^dbHVt0rPxmNi)SRMOsk|&`FPDO)5k{+f^G$|0yy|){W3$-FPhekGe&azr+>cA* zl729Y;-2(qRtX9oM$wH)j$P*E{1biA)anzD>RLrDd5oZ!T^@hjpIV;*I{{BTnXj4! z-!()0DwbMSTR)g%%4AK>`Y}ibi`nCVsCfYUq0dSA*1`o)IRdW;MrB zfvyYOs_{5Kgb3J{w(H(n!GZY$aLz1y1u-nufx!SsbZAJ4Q3>Lnw4S4Z$BP_+KV5{yDMr=x zug0kX5SPB0<=ZI_%_dXoyZv@&Y7TFRGfui!Y;27eTL)YIY0kZEXhO4<_kCu9iROn+ z+-l_pP`O;RR?o?Iz||D4S<5CpMB>2+5B8@Mf9rqn zq_-8Mv^#Pso{IwN(6gT>%Uept)5X#4JL9QloqTJP-(FO77x~Wt`*W>Ed##?##KW2W z=elHJOTRfz;W&g8+0X3tvq4n(9_7F_Q?02WZlz@;M=;)Z|1Qhk(#%0{Oos_xZDHPH zdqTARFwCQ9Cy7FE$==7`Aw*;6XI=04FQbzJiJxc2I9ik=y$9xsI;VOTi6rwfB%B#r z89GMKYua&O9vG<~azRS^b*q1^aXtQiwp9XiW8rRR*<6>&AHLZqd{+vA2u)jCI$aS2 z+`mvTgL?Ht*P3iE4*7d(j#gTM*ekAOIEM^i&HZx~T^^AY_pt8L;Egpjy+$Ox6$(Gh z{yjI6uk>0EDjgK4h2=JToI(YovvMYzYj>f|oZ?;eK;-Glj~92xBOQvji|4-H4)jjE z{kxY=-K)b?Y=WAiGS-^GE~B~!7zG(&43xt64}32nkd>Kyz5|4T!-47Y{v&ACB(bux zzTfBR6A`dHZtH{phY;G^?%CiUM(+mE)L{`Xt)r}sjz>o@^wXo8G(YUlcm392haaDt zf{qDpBXO`bFpUyz7B3a$gI9cTF6HTD<%heZ&Xi+P{~?U-UKU1xh2K`!X%L%rzXmrH28c>l>b9dh%4PMTL`oE@gEf ztI7I&Ng?>&{$*()K5@n-XD#}fwcIU6CY_m^!7T^7O};%IzU7%RzO|WB(HRdh7jHQ> zMl=ny)ywPj9db4M?q_-IFQl}dY%Uj2_<8tPA_=K#TWDM1113|lRo$jL#lhp~R1_2oXAAe+_&jLN-F*>Q#h24; z=WffgGc50R5H}FKC&85zsW2%|xzz`H0XJRi9a-EKNA-9TR~kR+Q_))2=21iE|h-Yb07?s%g-hL>>8UIz<@%XFo>%=VQ?EN42^<0{1VDwT-FHb z!BJH0A9g!SEC zPlg?mT7iU1yPkDwQ&ZWxcw4}XKq1_H`l6tqETh(s?L8hYBeebYmd}-s{%?R35*Ohf z*Mc%ic&bW<&3xTm;{(-~wV&0Vtax*sF;_8TTOPIWngdiRxvg#A9PJ)yz0m0`_Ggow z>!dW0&ZryUhUJ!UFI7A+;*6DC{^t11tEmYqV1#udEf-Gl{Sau{6SZe@m2C-ZwRV+j z3)_ugO3XOB`HOqc5pR&1Q7yy92d4Tia6$`v!vYy7oZ!h z0f7vG4+qh(rwEwLSisjmOJeRfcEo{0EF!rvpgLi#BmC+4lRgk*xy8K=WqTz55dk3$ z(yt4R2rVp9X0~q(f4Yr;1=sN}v};$1x7wyX4JCvCkV*J@3t$6EG)nsn-UXk7h2Xt^ zUf-z!^r87t^dt5|e7vQW4KhUgg^n$tfxHCUtpk2ZAAzqozfs6%&@vgozC_+fG19d*S#i5P&3H^B?|x{;pjR!+6rh?}qSPDSLjAra_P-b~)*Z^a8S zEjlTV5`e1zmWk4JF~+ECj&!$P$wKO58KUHaJ1m@^FjZt!zwBN+A&I^|o^1#+@BevW zI9GpJpwJA_Z_x1i{2FjDv!Y$E+4L4F?cHR&C{BwZ?IB|on}*;r=ajNNd}AnVIA5$^ z-Ce~e9%*!%u~^AUIy z&$v^b8r-t2b*EwWFBjHPyXP`@AtoD#N$mq?{e%BTV-fBx0KQ}Z6b2DNvRS)@pTu^h z0@#k=zAlh+&20^sr7qM>qQU?zK)27~*Jgg>1C2p})`zRT?#bGv*R(C#`T!Y|=O72e z95Wji)sqX1*F%{!c0)f9&y2x$ySD8ubM2gXHv{KPAqc8+wuJyvdKkKn@Vt5b3heM! zN#o_q#trQkj5hB45qQPuNNd?REp@vPCAg6LK9_|`ci5*u*tJWS#QD2k)UrPY{>$~5 z>$1{rI(72u+P2@lL&tjg^X$qwzmDu`nfDpBhgJfz%U+dU&-xtwf7A`v@P1lIl6^hlb@) z{>tEcNS>XBNd;i0+pv>z^vT>|`7xMy3N?MLD|>+0iH?vR|B>&VJsQeS0Grq0JJ2Ig z8tmRS^EO>RUb#tk$sY(S2&L*if=K*nkuQJ5bg_$QyxT|%{2E7o`e0cR?8icA+U}Q)|@S5?PHoV(M z=Y(+G0L{gV*ViJ#oT499k3?UjH-89au`>Fan{0Zk{z4dT>CP-WW$AI=ugeU5)MV3i z_I3sImmmBx50U7qeWt+I@?nn3rMC5bM#bTMi@A@%Sn>ncYB)Bdd?tmnMk_Vr0Nco< z4HM(DRlr`+epI01*pu}rTd3k}>QU3ihTZW+O#CDyHI_QrgATU6PuAhMG_ewCn9%Dw zQ#PtPmA@E!p~*z%`X6FT%q=`_Bv+39$k!?|8Ez`RrTEVn%)h@0vM_A$$zdeapr?Od zG_cm2cG3(jw+An<@W*SI0yvjt@R7$jF*sR}c}|<5Ol5S2RUrNJIU@G{&3|jWe}8-b zujl9ggC^R{*T93Df_E;Cq^5&5K;TFjv^U0m3Ok55Yd+l*KZSk{Xd8f?aoYsz;UZ0j zLU}&iDzg9SyYZz1a^DTi@Ns&HW!#N<=2#@n!zy_&@!6_2;y^yn`u5<5N|>Jv_-#}@J$tbjq5#&Q*@U}0_l5A}r8Mz35`6Ftac4875w8i~x`2EdZ-s+Y1+wEL z?H_a1r9Z-Lszumq^!#5+dMyTvK0kp3598Gz?ce(oD@MBZ!vn5q_Sl@um6Zht$OtU!TmK`+q? z9H!6O&d?4-7hStgtr9^s0v>SM#`VGZOANh^U)O3i6@~VMjS%x6@EBs|;{ypRjghMr zAlUlrY34fAt$k-=O)e?Z(y|alePG(Z>Ol>EA3f^ho{InkdeS3&H<$d#s-yAHt zV5m_4{5s7urg=^U<+6twc)S7_S71qN%Rm)AF-nm z63|%0dmaU<_-_v`N9$lKb;{tuKn_lM&Fquina`7>L7j6LrY`w#2J+iADQj5T-9-sg zbS+P@y;}0^k)UtO8TS#qkGPLj$qPXhtN`xym0|Jruk%SGLc{D9Osn|7I_!3Fhko*(*Nb70~e9N^lG zP8h~2dI_KY< zhBd&4hMgR#`V)-szSe&#Jp1{ZO1iursP)Nmv&ono_u4c{5WrF^%gO? zH8>-T+lQDWb48h5l;gTQz$Ym`X7D5|f4L77GWeh{MkD6_9og>dPCOj~;wUdz+~f_2 z3Nd{T(bcNh;L!k~Fk-+6xvcr*=!Q}34js7AsfI6p(4)90;Mb2JF=aM~6RWY=elfJ3V;Yvly(oF4bHI>0atu;1!-9l; zm^C^VKzlslNNcaVe~L`v+u@Ht;g$`?iSC>iKp}<|Uft=hulPxyiqZV4-682pEJI

s}HN6z<+~<4^V46>q)CP>eP-+v(QOacpbkyylh}Ad*1^1VnO_7DP}a2?7!X$r&VP3PeOCspOm_ zC&`%>$vJ1F$t^jwKsR((-D2+(_POtj_s+QI-Y@qJK6O*QYOYmb%{Ax$H`m%0#rA=h z>FRxP70Y8-1|k4bunW0+`yKePEDytp5{TL4rqGT!G+V3D&5Q5Ink679j3{kgBFP*H zf%2M#$VDz3Ig=@9?7(Ka3Q%5masKo;Toi}R%J(cT%71sFgdBTsbie)4V3MV9 zIob@2#Hr{53v~?gp$oXLk2@SPz4Lw=n`CiwAyu`BgHtku-;%^$yVn(;VwGZmABI4l}!AMwsr(*l_m&Y~x{$@I5-|S+S>=y@; zfN%&-_f9;@h&4(||6QT<-J9Pu9>@H-*pHyzrz-aq zu)yMfE)rSn_30_6B*_&RGB=e(k-qcS;EL|!$ly3pftW(DEhDAGczqiWEOp9PoZ)N| zA+PMhc#yt}`!kj=Oxg4wA4u8auf*iYj%JhbYvu_Bjw$)gMn+q!4}Tl~YRD)blUD|~ zsPN1MLIVx@)aa%QC5b01*cPSf1M>Ok4&D%q%f>?{6M;`0-8fz}(wGloS@!WQ+pV7B zxa1W@We$G9O*r%;?B|cn5V)MZCq)t;-Dyc`!ROf-P8UC&j^oIIiqXQiRisu^cGMA2 z$h}t;<3L)}v;28#BJcLi0q*iz@TbxiJ}9L^JFd6~FM-+VMcNAX_OZ|lQT<}R`Kl

**5C7I*sJq{L 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
wDJ!Xy7tLE3pQ8WrzQhBz*H zy>NJ-jghm+lV8)~H`+9g*g(UjJHwQwP6;umPG0q~+<>D6`#<>{DoOl#!ifud4%vJx&7hM=e5Ef=(qW%t|M$Q?oMUnhK7+|jCLi1J zEFE`b@B1W-$QrZF^}U+9|A{PqL|$h_?jl)HE#UJlyT-+UX zB1~v5zvz)}wi0hRx`K(C0Yw@^`UFu&fdFe1&DOjPF0z5)0+A5axC=po;E~=t`q_kD_)R#q};0@`!Kmod{OV zcj!<7zjvL|VW`Opd{zic4)z^&klz0<;8YdF>B8SoEudSq=yk(MCpD;AZYt7Q@3QTn zeP?50zZlE+`;*xa=Yeic`B9pw6tFBMoc|JbMZ;*ou*?TuX#!=T4C?j0RuL<5N>Dh~ zwdC^_q39nrg4%Ct{j4!0@JfK(4p`@R<)wSE#FIV%OrE%d zHxcaY4GilxYlZL^%xC$fI+I9yJtvW#tyS9~DT;Ss_;8QT^cM+9!}Dffi2i z9U@o_@E`2D943|e6j24HbRp|)Vg>dRBP5}^|U~2f-6CuG!mCKWZN3?b?c%}U6H6Uj%atp8(V5OSP6D z3vHuYG$=xR7+fSGQbSa(^auwuZZ6ql^kE8LiCZa?;8!qV4WU&5`o*D|L#n>+YlmaO zcu+^BUk3D}F6|C&oQR2{_hb3)(k|i?(G!hO22Z;Htz1aZmO6cEkbp$}1ixozesew< z=+1Tjk(5?8nC4R6_%Xs!swHf`O84i&(IkdWQ;Q}LY$U;19rJU{B3--$nC68>4Bl3n zAb&peJZx$lfuwNzWQ%^h=TR&7T&(D?v1Ik!wJmw%gv=La2Pt0Yofh_I1r((gr8Ng{ zu5L$(d&UvrXBiB3{KLKwGcV4V${iZ=;A<}~IFf(@^6ba>& z4hB%a927vK0;rHz%LcMfCH^4a4fCvRvieDU)J03txSF>u)YX*qf-+EvthzQxgm+}e z!%ia<0Ew(K?QfNU&95n;+Z%gKo-(}2_YUB-X2n^ZhZaVFlYLyAPV@TXGS%KyO=m3) zc$%@ZGFoi~$d#nKvf(wkm-vtEi>gO+^|qFE>0QWdxo^P3`hr1Y634tS>iMZ)O0U74 z7nytM?VBgs!@&YLV#Vv9&nr*H#=i_V(>kEV5b(0l+Bkm7!mw_AaoELLckt(t`8o7z z(18oNn(JTA`y7QwIAwjgc_nWV?@4hpQg&>7^oF6Rl{e@pn{2-SmBBCP-x`er?jU#? zfp5vO7J6twv6ShGNcq-ew&sjI_S7O}78b`bd()St5j1}{mishOsd=n8Y1LWhomaQC zS;@*O<3%-RwHKVrp6qqoMu}~~G;�$dfp<)M7r(cLiL*AkZMNL&W>E4=7l7xf7S6 zM}CA>6)Iu57C{k&cm0?}&Z1u-o=|U+W|Isb;ovHEKhX$9@Cjjw+OQ=U^Qj3a-xun0 z)$uqLPsQe4T($<42!MJA3f%!)@haU*1>cQnkx=4^YYqmCvK~CB);# z+fFdv5z(YVQ<_DsdWNF+6AjuCl7!9iz%ntP1XBQ)h$l$d zSLGkkz5&o5PoKHc7)Eg<0OM&#?j(mtqO!jF@9@dkQc6%k+0o8%QwU7J@a>i@QaR54 z!uey;%VBK50Y}!KU@c;I)}G&uDgnlbI>utV03=$Is1qB= zSvU?x!DnZIuD#!mYyjjc3_|dRK>RQyvaFR2K-*DP+(Bb~Y_af~PMzUZwVTR3GoS(1Ak-O>Y&8q#!Wuxx!yE+c} zQD@j#xHT4b!TdOPm>dTLA+SlIPh2-Sl&Q9-|&+L#is8}*Pj^&&?mqNu-OlAr_|9>EUl5S z0D!QEx_T=RSl!zh8_iY*iB!MQJ$*#&BK9YOpWAXhJSE0~LtFT+M9u)fm*qP-gp}X< zMGb5TB`k)NoGN^I@K)||T63^S5r-@ZYx&)+4>2%=6Z`_Yj-I>~)@!8`+8R_Y`P2ur q($p9@1|y%`Z)!4u?epUYDU62w(vYDFdkzEibL-|Ejj|gL!u}nk7}C%H literal 0 HcmV?d00001 diff --git a/reference/continuous-token-bonding-curve-contracts/dev.ipynb b/reference/continuous-token-bonding-curve-contracts/dev.ipynb new file mode 100644 index 000000000..6b146a315 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/dev.ipynb @@ -0,0 +1,1796 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Bancor.ipynb", + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "y43goonPbn7j" + }, + "source": [ + "tokens issued = supply ×\n", + "(((balance + connected tokens paid)/balance)^CW− 1)\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kDa7E36LxhnE" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8rJBc6qbb9hS" + }, + "source": [ + "tokens_issued = supply*(exp^(log((balance+connected_tokens_paid)/balance)*CW)))" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SoqSgm1Dkpq-" + }, + "source": [ + "# Exponent width: 19 bits\n", + "# Significand precision: 237 bits (236 explicitly stored)\n", + "\n", + "# 3fff f000\n", + "# 0 | 011 1111 1111 1111 111 | 1 0000 0000 0000 ... => 1\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZNDwVw7FxubQ" + }, + "source": [ + "u = [0 for i in range(256)]\n", + "u" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "DTUbsA1GyoJR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "ccc1f6dc-ecc0-4849-fcf1-2c439e5a10a6" + }, + "source": [ + "0xd3094c70f034de4b96ff7d5b6f99fcd8 - 0x080000000000000000000000000000000" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "110374204732899226283719123795156008152" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 1 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ECScMY_FXkzO" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "whHChBOHkeE_" + }, + "source": [ + "s = \"\"\"\n", + " if (x >= 0xd3094c70f034de4b96ff7d5b6f99fcd8) {res += 0x40000000000000000000000000000000; x = x * FIXED_1 / 0xd3094c70f034de4b96ff7d5b6f99fcd8;} // add 1 / 2^1\n", + " if (x >= 0xa45af1e1f40c333b3de1db4dd55f29a7) {res += 0x20000000000000000000000000000000; x = x * FIXED_1 / 0xa45af1e1f40c333b3de1db4dd55f29a7;} // add 1 / 2^2\n", + " if (x >= 0x910b022db7ae67ce76b441c27035c6a1) {res += 0x10000000000000000000000000000000; x = x * FIXED_1 / 0x910b022db7ae67ce76b441c27035c6a1;} // add 1 / 2^3\n", + " if (x >= 0x88415abbe9a76bead8d00cf112e4d4a8) {res += 0x08000000000000000000000000000000; x = x * FIXED_1 / 0x88415abbe9a76bead8d00cf112e4d4a8;} // add 1 / 2^4\n", + " if (x >= 0x84102b00893f64c705e841d5d4064bd3) {res += 0x04000000000000000000000000000000; x = x * FIXED_1 / 0x84102b00893f64c705e841d5d4064bd3;} // add 1 / 2^5\n", + " if (x >= 0x8204055aaef1c8bd5c3259f4822735a2) {res += 0x02000000000000000000000000000000; x = x * FIXED_1 / 0x8204055aaef1c8bd5c3259f4822735a2;} // add 1 / 2^6\n", + " if (x >= 0x810100ab00222d861931c15e39b44e99) {res += 0x01000000000000000000000000000000; x = x * FIXED_1 / 0x810100ab00222d861931c15e39b44e99;} // add 1 / 2^7\n", + " if (x >= 0x808040155aabbbe9451521693554f733) {res += 0x00800000000000000000000000000000; x = x * FIXED_1 / 0x808040155aabbbe9451521693554f733;} // add 1 / 2^8\n", + "\"\"\"\n", + "pow_of_2 = \"\"\"\n", + " 0x40000000000000000000000000000000 ,\n", + " 0x20000000000000000000000000000000 ,\n", + " 0x10000000000000000000000000000000 ,\n", + " 0x08000000000000000000000000000000 ,\n", + " 0x04000000000000000000000000000000 ,\n", + " 0x02000000000000000000000000000000 ,\n", + " 0x01000000000000000000000000000000 ,\n", + " 0x00800000000000000000000000000000 ,\n", + "\"\"\"" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 232 + }, + "id": "IWr2BB2SYvn8", + "outputId": "2614256b-cd39-4b34-b1f0-1c8a675d123b" + }, + "source": [ + "import math\n", + "pow_2 = [int(i.strip(), base=16) for i in pow_of_2.split(\",\") if \"0x\" in i]\n", + "k = [i.strip().split(\") {\") for i in s.strip().split(\">=\")]\n", + "b = [int(i[0], base=16) for i in k if len(i) > 1]\n", + "OPT_LOG_MAX_VAL = 0x15bf0a8b1457695355fb8ac404e7a79e3 - 1\n", + "FIXED_1 = 0x080000000000000000000000000000000\n", + "FIRST_CHECK = 0xd3094c70f034de4b96ff7d5b6f99fcd8\n", + "reduced = [i - FIXED_1 for i in b]\n", + "print(math.log(OPT_LOG_MAX_VAL))\n", + "print(\"start\")\n", + "for i in b:\n", + " print(math.log(i))\n", + "print(\"end\")\n", + "print(math.log(FIXED_1))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "error", + "ename": "NameError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mpow_2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpow_of_2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\",\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m\"0x\"\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\") {\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\">=\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbase\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mOPT_LOG_MAX_VAL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0x15bf0a8b1457695355fb8ac404e7a79e3\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'pow_of_2' is not defined" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OJYsvVcxjSRz", + "outputId": "c813928c-6503-4869-c3d0-371be65a330a" + }, + "source": [ + "value = OPT_LOG_MAX_VAL\n", + "res = 0\n", + "for index in range(len(b)):\n", + " check = b[index]\n", + " if value >= check:\n", + " print(\"add pow \", str(index+1))\n", + " res += pow_2[index]\n", + " value = (value*FIXED_1)//check\n", + "print(math.log(res))\n", + "print(\"ln(x) - ln(FIXED_1), that would be the fractional part?\")\n", + "print(math.log(value) - math.log(FIXED_1))\n", + "\n" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "add pow 1\n", + "add pow 2\n", + "add pow 3\n", + "add pow 4\n", + "add pow 5\n", + "add pow 6\n", + "add pow 7\n", + "add pow 8\n", + "88.02577803179192\n", + "ln(x) - ln(FIXED_1), that would be the fractional part?\n", + "0.00390625\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6v5Pi0QFYzqj", + "outputId": "3733aa72-ce8e-4e40-e04e-708812b9e94c" + }, + "source": [ + "s = 0\n", + "for i in range(1, 9):\n", + " s += 1/2**i\n", + "1- s" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.00390625" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q4iVlPxDbrip", + "outputId": "da9c9c0f-2da3-4d8c-974d-315087852cdb" + }, + "source": [ + "print(0x099999999999999999999999999999999 - FIXED_1*(6/5))\n", + "print(math.log(FIXED_1))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.0\n", + "88.02969193111305\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "u5r5y-SltPNS", + "outputId": "4a7a7c7e-7fdb-4c87-fe5d-24d771fff475" + }, + "source": [ + "math.pow(math.e, 89.02969193111305) - math.pow(math.e, 88.02969193111305) - FIXED_1" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1.2220932035216892e+38" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8V1bgor6yY0J", + "outputId": "4966708a-8ad9-4b76-d496-8d79372b6f12" + }, + "source": [ + "FIXED_2 = 0x100000000000000000000000000000000\n", + "FIXED_1*2 - FIXED_2" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KSOC-nIgy1YO", + "outputId": "dc15e7d2-4168-43ee-a29d-55d364aed585" + }, + "source": [ + "0x10000000000000000000000000000000 - FIXED_1//8" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vrM89C82PVcw", + "outputId": "6743a6b8-8b30-46a2-a2f7-ac83008196d2" + }, + "source": [ + "0x080000000000000000000000000000000" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "170141183460469231731687303715884105728" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NoHzQFwrtuXJ" + }, + "source": [ + "# Generate optimal log part 1\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qXsj5L4kfxlQ", + "outputId": "4d1ee00a-9205-470e-a667-46871032dea6" + }, + "source": [ + " s = \"\"\" if (x >= 0xd3094c70f034de4b96ff7d5b6f99fcd8) {res += 0x40000000000000000000000000000000; x = x * FIXED_1 / 0xd3094c70f034de4b96ff7d5b6f99fcd8;} // add 1 / 2^1\n", + " if (x >= 0xa45af1e1f40c333b3de1db4dd55f29a7) {res += 0x20000000000000000000000000000000; x = x * FIXED_1 / 0xa45af1e1f40c333b3de1db4dd55f29a7;} // add 1 / 2^2\n", + " if (x >= 0x910b022db7ae67ce76b441c27035c6a1) {res += 0x10000000000000000000000000000000; x = x * FIXED_1 / 0x910b022db7ae67ce76b441c27035c6a1;} // add 1 / 2^3\n", + " if (x >= 0x88415abbe9a76bead8d00cf112e4d4a8) {res += 0x08000000000000000000000000000000; x = x * FIXED_1 / 0x88415abbe9a76bead8d00cf112e4d4a8;} // add 1 / 2^4\n", + " if (x >= 0x84102b00893f64c705e841d5d4064bd3) {res += 0x04000000000000000000000000000000; x = x * FIXED_1 / 0x84102b00893f64c705e841d5d4064bd3;} // add 1 / 2^5\n", + " if (x >= 0x8204055aaef1c8bd5c3259f4822735a2) {res += 0x02000000000000000000000000000000; x = x * FIXED_1 / 0x8204055aaef1c8bd5c3259f4822735a2;} // add 1 / 2^6\n", + " if (x >= 0x810100ab00222d861931c15e39b44e99) {res += 0x01000000000000000000000000000000; x = x * FIXED_1 / 0x810100ab00222d861931c15e39b44e99;} // add 1 / 2^7\n", + " if (x >= 0x808040155aabbbe9451521693554f733) {res += 0x00800000000000000000000000000000; x = x * FIXED_1 / 0x808040155aabbbe9451521693554f733;} // add 1 / 2^8\"\"\"\n", + "b = [i.split(\") {res += \") for i in s.strip().split(\"(x >= \") if \") {res += \" in i]\n", + "c = [i[1].split(\";} //\")[1].replace(\"\\n if \", \"\") for i in b if \";} //\" in i[1]]\n", + "toAdd = [int(i[1].split(\"; x = x * FIXED_1\")[0], base=16) for i in b if \"; x = x * FIXED_1\" in i[1]]\n", + "n = [int(i[0], base=16) for i in b]\n", + "def getThreshold(index):\n", + " thr_val = \"threshold_val{}\".format(str(index))\n", + " to_add = \"to_add{}\".format(str(index))\n", + " print(\"\\tlet {} = Uint256 {} in\".format(thr_val, str(n[index])))\n", + " print(\"\\tlet {} = Uint256 {} in\".format(to_add, str(toAdd[index])))\n", + " print(\"let threshold{} = ThresholdAndToAdd {} {} in (* {} *)\".format(str(index), thr_val, to_add, c[index]))\n", + "print(n)\n", + "print(c)\n", + "print(toAdd)\n", + "for i in range(8):\n", + " getThreshold(i)\n", + "# let l1 = Cons {Int32} one nil in\n", + "# let l2 = Cons {Int32} two l1 in\n", + "# let l3 = Cons {Int32} ten l2 in\n", + "for i in range(1, 8):\n", + " prev = i-1\n", + " print(\"let l{} = Cons {{ThresholdAndToAdd}} threshold{} l{} in\".format(str(i), str(i), str(prev)))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[280515388193368458015406427511040113880, 218465603988574474844591417643679820199, 192795218841189805222451540510555621025, 181114347027396448854165353426875372712, 175542044379434494067323265867529472979, 172820517236198538127967385733353125282, 171475617301169790829459146906809945753, 170807097224429000759274174605493073715]\n", + "[' add 1 / 2^1', ' add 1 / 2^2', ' add 1 / 2^3', ' add 1 / 2^4', ' add 1 / 2^5', ' add 1 / 2^6', ' add 1 / 2^7', ' add 1 / 2^8']\n", + "[85070591730234615865843651857942052864, 42535295865117307932921825928971026432, 21267647932558653966460912964485513216, 10633823966279326983230456482242756608, 5316911983139663491615228241121378304, 2658455991569831745807614120560689152, 1329227995784915872903807060280344576, 664613997892457936451903530140172288]\n", + "\tlet threshold_val0 = Uint256 280515388193368458015406427511040113880 in\n", + "\tlet to_add0 = Uint256 85070591730234615865843651857942052864 in\n", + "let threshold0 = ThresholdAndToAdd threshold_val0 to_add0 in (* add 1 / 2^1 *)\n", + "\tlet threshold_val1 = Uint256 218465603988574474844591417643679820199 in\n", + "\tlet to_add1 = Uint256 42535295865117307932921825928971026432 in\n", + "let threshold1 = ThresholdAndToAdd threshold_val1 to_add1 in (* add 1 / 2^2 *)\n", + "\tlet threshold_val2 = Uint256 192795218841189805222451540510555621025 in\n", + "\tlet to_add2 = Uint256 21267647932558653966460912964485513216 in\n", + "let threshold2 = ThresholdAndToAdd threshold_val2 to_add2 in (* add 1 / 2^3 *)\n", + "\tlet threshold_val3 = Uint256 181114347027396448854165353426875372712 in\n", + "\tlet to_add3 = Uint256 10633823966279326983230456482242756608 in\n", + "let threshold3 = ThresholdAndToAdd threshold_val3 to_add3 in (* add 1 / 2^4 *)\n", + "\tlet threshold_val4 = Uint256 175542044379434494067323265867529472979 in\n", + "\tlet to_add4 = Uint256 5316911983139663491615228241121378304 in\n", + "let threshold4 = ThresholdAndToAdd threshold_val4 to_add4 in (* add 1 / 2^5 *)\n", + "\tlet threshold_val5 = Uint256 172820517236198538127967385733353125282 in\n", + "\tlet to_add5 = Uint256 2658455991569831745807614120560689152 in\n", + "let threshold5 = ThresholdAndToAdd threshold_val5 to_add5 in (* add 1 / 2^6 *)\n", + "\tlet threshold_val6 = Uint256 171475617301169790829459146906809945753 in\n", + "\tlet to_add6 = Uint256 1329227995784915872903807060280344576 in\n", + "let threshold6 = ThresholdAndToAdd threshold_val6 to_add6 in (* add 1 / 2^7 *)\n", + "\tlet threshold_val7 = Uint256 170807097224429000759274174605493073715 in\n", + "\tlet to_add7 = Uint256 664613997892457936451903530140172288 in\n", + "let threshold7 = ThresholdAndToAdd threshold_val7 to_add7 in (* add 1 / 2^8 *)\n", + "let l1 = Cons {ThresholdAndToAdd} threshold1 l0 in\n", + "let l2 = Cons {ThresholdAndToAdd} threshold2 l1 in\n", + "let l3 = Cons {ThresholdAndToAdd} threshold3 l2 in\n", + "let l4 = Cons {ThresholdAndToAdd} threshold4 l3 in\n", + "let l5 = Cons {ThresholdAndToAdd} threshold5 l4 in\n", + "let l6 = Cons {ThresholdAndToAdd} threshold6 l5 in\n", + "let l7 = Cons {ThresholdAndToAdd} threshold7 l6 in\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "n2VLVN0dyXBh" + }, + "source": [ + "# Generate optimal log part 2" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PEBTmEtHmoFd", + "outputId": "6e9a8421-ceb2-48b1-87f5-b219f13dde3a" + }, + "source": [ + "s = \"\"\" \n", + " res += z * (0x100000000000000000000000000000000 - y) / 0x100000000000000000000000000000000; z = z * w / FIXED_1; // add y^01 / 01 - y^02 / 02\n", + " res += z * (0x0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - y) / 0x200000000000000000000000000000000; z = z * w / FIXED_1; // add y^03 / 03 - y^04 / 04\n", + " res += z * (0x099999999999999999999999999999999 - y) / 0x300000000000000000000000000000000; z = z * w / FIXED_1; // add y^05 / 05 - y^06 / 06\n", + " res += z * (0x092492492492492492492492492492492 - y) / 0x400000000000000000000000000000000; z = z * w / FIXED_1; // add y^07 / 07 - y^08 / 08\n", + " res += z * (0x08e38e38e38e38e38e38e38e38e38e38e - y) / 0x500000000000000000000000000000000; z = z * w / FIXED_1; // add y^09 / 09 - y^10 / 10\n", + " res += z * (0x08ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b - y) / 0x600000000000000000000000000000000; z = z * w / FIXED_1; // add y^11 / 11 - y^12 / 12\n", + " res += z * (0x089d89d89d89d89d89d89d89d89d89d89 - y) / 0x700000000000000000000000000000000; z = z * w / FIXED_1; // add y^13 / 13 - y^14 / 14\n", + " res += z * (0x088888888888888888888888888888888 - y) / 0x800000000000000000000000000000000; z = z * w / FIXED_1; // add y^15 / 15 - y^16 / 16\n", + " \"\"\"\n", + "k = [i.strip().split(\"|\") for i in s.strip().replace(\"res += z * (\", \"\").replace(\" - y) / \", \"|\").replace(\"; z = z * w / FIXED_1; // \", \"|\").split(\"\\n\")]\n", + "index = 1\n", + "for [numerator, denominator, comment] in k:\n", + " numerName = \"numerator{}\".format(str(index))\n", + " print(\"\\tlet {} = Uint256 {} in\".format(numerName, str(int(numerator, base=16))))\n", + " denomName = \"denominator{}\".format(str(index))\n", + " print(\"\\tlet {} = Uint256 {} in\".format(denomName, str(int(denominator, base=16))))\n", + " prev = str(index-1)\n", + " print(\"let local_res_{} = submuldivadd z{} {} y {} local_res_{} in let z{} = muldiv z{} w FIXED_1 in (* {} *)\".format(str(index),prev, numerName, denomName, prev, str(index), prev, comment))\n", + " index += 1" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "\tlet numerator1 = Uint256 340282366920938463463374607431768211456 in\n", + "\tlet denominator1 = Uint256 340282366920938463463374607431768211456 in\n", + "let local_res_1 = submuldivadd z0 numerator1 y denominator1 local_res_0 in let z1 = muldiv z0 w FIXED_1 in (* add y^01 / 01 - y^02 / 02 *)\n", + "\tlet numerator2 = Uint256 226854911280625642308916404954512140970 in\n", + "\tlet denominator2 = Uint256 680564733841876926926749214863536422912 in\n", + "let local_res_2 = submuldivadd z1 numerator2 y denominator2 local_res_1 in let z2 = muldiv z1 w FIXED_1 in (* add y^03 / 03 - y^04 / 04 *)\n", + "\tlet numerator3 = Uint256 204169420152563078078024764459060926873 in\n", + "\tlet denominator3 = Uint256 1020847100762815390390123822295304634368 in\n", + "let local_res_3 = submuldivadd z2 numerator3 y denominator3 local_res_2 in let z3 = muldiv z2 w FIXED_1 in (* add y^05 / 05 - y^06 / 06 *)\n", + "\tlet numerator4 = Uint256 194447066811964836264785489961010406546 in\n", + "\tlet denominator4 = Uint256 1361129467683753853853498429727072845824 in\n", + "let local_res_4 = submuldivadd z3 numerator4 y denominator4 local_res_3 in let z4 = muldiv z3 w FIXED_1 in (* add y^07 / 07 - y^08 / 08 *)\n", + "\tlet numerator5 = Uint256 189045759400521368590763670795426784142 in\n", + "\tlet denominator5 = Uint256 1701411834604692317316873037158841057280 in\n", + "let local_res_5 = submuldivadd z4 numerator5 y denominator5 local_res_4 in let z5 = muldiv z4 w FIXED_1 in (* add y^09 / 09 - y^10 / 10 *)\n", + "\tlet numerator6 = Uint256 185608563775057343707295240417328115339 in\n", + "\tlet denominator6 = Uint256 2041694201525630780780247644590609268736 in\n", + "let local_res_6 = submuldivadd z5 numerator6 y denominator6 local_res_5 in let z6 = muldiv z5 w FIXED_1 in (* add y^11 / 11 - y^12 / 12 *)\n", + "\tlet numerator7 = Uint256 183228966803582249557201711694029036937 in\n", + "\tlet denominator7 = Uint256 2381976568446569244243622252022377480192 in\n", + "let local_res_7 = submuldivadd z6 numerator7 y denominator7 local_res_6 in let z7 = muldiv z6 w FIXED_1 in (* add y^13 / 13 - y^14 / 14 *)\n", + "\tlet numerator8 = Uint256 181483929024500513847133123963609712776 in\n", + "\tlet denominator8 = Uint256 2722258935367507707706996859454145691648 in\n", + "let local_res_8 = submuldivadd z7 numerator8 y denominator8 local_res_7 in let z8 = muldiv z7 w FIXED_1 in (* add y^15 / 15 - y^16 / 16 *)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9NeCaJI06hhz", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "3e0e6cee-ea76-4117-d53a-23926bf0755f" + }, + "source": [ + "0x100000000000000000000000000000000" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "340282366920938463463374607431768211456" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 74 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7XTMR-bqyX0a", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "bf2b5df1-20c9-4c9f-99ac-1db772fa4f96" + }, + "source": [ + "0x5b9de1d10bf4103d647b0955897ba80" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "7611219895485218073587121647846406784" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 2 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "k816RpQNWG0W" + }, + "source": [ + "# generate floorLog2 loop\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 188 + }, + "id": "iQRCpNScWFBj", + "outputId": "607c8c43-aacb-44c3-f41a-330fd14b2ef6" + }, + "source": [ + " # for (uint8 i = MAX_PRECISION; i > 0; --i) {\n", + " # x = (x * x) / FIXED_1; // now 1 < x < 4\n", + " # if (x >= FIXED_2) {\n", + " # x >>= 1; // now 1 < x < 2\n", + " # res += ONE << (i - 1);\n", + " # }\n", + " # }\n", + "# let MAX_PRECISION = Uint256 127\n", + "res = \"\"\n", + "for i in range(1, 128):\n", + " prev = str(i-1)\n", + " now = str(i)\n", + " itemp = \"i_temp{}\".format(now)\n", + " res += \" let {} = Uint256 {} in\".format(itemp, now)\n", + " res += \" let l{} = Cons {{Uint256}} {} l{} in\".format(now,itemp, prev)\n", + "res\n" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "' let i_temp1 = Uint256 1 in let l1 = Cons {Uint256} i_temp1 l0 in let i_temp2 = Uint256 2 in let l2 = Cons {Uint256} i_temp2 l1 in let i_temp3 = Uint256 3 in let l3 = Cons {Uint256} i_temp3 l2 in let i_temp4 = Uint256 4 in let l4 = Cons {Uint256} i_temp4 l3 in let i_temp5 = Uint256 5 in let l5 = Cons {Uint256} i_temp5 l4 in let i_temp6 = Uint256 6 in let l6 = Cons {Uint256} i_temp6 l5 in let i_temp7 = Uint256 7 in let l7 = Cons {Uint256} i_temp7 l6 in let i_temp8 = Uint256 8 in let l8 = Cons {Uint256} i_temp8 l7 in let i_temp9 = Uint256 9 in let l9 = Cons {Uint256} i_temp9 l8 in let i_temp10 = Uint256 10 in let l10 = Cons {Uint256} i_temp10 l9 in let i_temp11 = Uint256 11 in let l11 = Cons {Uint256} i_temp11 l10 in let i_temp12 = Uint256 12 in let l12 = Cons {Uint256} i_temp12 l11 in let i_temp13 = Uint256 13 in let l13 = Cons {Uint256} i_temp13 l12 in let i_temp14 = Uint256 14 in let l14 = Cons {Uint256} i_temp14 l13 in let i_temp15 = Uint256 15 in let l15 = Cons {Uint256} i_temp15 l14 in let i_temp16 = Uint256 16 in let l16 = Cons {Uint256} i_temp16 l15 in let i_temp17 = Uint256 17 in let l17 = Cons {Uint256} i_temp17 l16 in let i_temp18 = Uint256 18 in let l18 = Cons {Uint256} i_temp18 l17 in let i_temp19 = Uint256 19 in let l19 = Cons {Uint256} i_temp19 l18 in let i_temp20 = Uint256 20 in let l20 = Cons {Uint256} i_temp20 l19 in let i_temp21 = Uint256 21 in let l21 = Cons {Uint256} i_temp21 l20 in let i_temp22 = Uint256 22 in let l22 = Cons {Uint256} i_temp22 l21 in let i_temp23 = Uint256 23 in let l23 = Cons {Uint256} i_temp23 l22 in let i_temp24 = Uint256 24 in let l24 = Cons {Uint256} i_temp24 l23 in let i_temp25 = Uint256 25 in let l25 = Cons {Uint256} i_temp25 l24 in let i_temp26 = Uint256 26 in let l26 = Cons {Uint256} i_temp26 l25 in let i_temp27 = Uint256 27 in let l27 = Cons {Uint256} i_temp27 l26 in let i_temp28 = Uint256 28 in let l28 = Cons {Uint256} i_temp28 l27 in let i_temp29 = Uint256 29 in let l29 = Cons {Uint256} i_temp29 l28 in let i_temp30 = Uint256 30 in let l30 = Cons {Uint256} i_temp30 l29 in let i_temp31 = Uint256 31 in let l31 = Cons {Uint256} i_temp31 l30 in let i_temp32 = Uint256 32 in let l32 = Cons {Uint256} i_temp32 l31 in let i_temp33 = Uint256 33 in let l33 = Cons {Uint256} i_temp33 l32 in let i_temp34 = Uint256 34 in let l34 = Cons {Uint256} i_temp34 l33 in let i_temp35 = Uint256 35 in let l35 = Cons {Uint256} i_temp35 l34 in let i_temp36 = Uint256 36 in let l36 = Cons {Uint256} i_temp36 l35 in let i_temp37 = Uint256 37 in let l37 = Cons {Uint256} i_temp37 l36 in let i_temp38 = Uint256 38 in let l38 = Cons {Uint256} i_temp38 l37 in let i_temp39 = Uint256 39 in let l39 = Cons {Uint256} i_temp39 l38 in let i_temp40 = Uint256 40 in let l40 = Cons {Uint256} i_temp40 l39 in let i_temp41 = Uint256 41 in let l41 = Cons {Uint256} i_temp41 l40 in let i_temp42 = Uint256 42 in let l42 = Cons {Uint256} i_temp42 l41 in let i_temp43 = Uint256 43 in let l43 = Cons {Uint256} i_temp43 l42 in let i_temp44 = Uint256 44 in let l44 = Cons {Uint256} i_temp44 l43 in let i_temp45 = Uint256 45 in let l45 = Cons {Uint256} i_temp45 l44 in let i_temp46 = Uint256 46 in let l46 = Cons {Uint256} i_temp46 l45 in let i_temp47 = Uint256 47 in let l47 = Cons {Uint256} i_temp47 l46 in let i_temp48 = Uint256 48 in let l48 = Cons {Uint256} i_temp48 l47 in let i_temp49 = Uint256 49 in let l49 = Cons {Uint256} i_temp49 l48 in let i_temp50 = Uint256 50 in let l50 = Cons {Uint256} i_temp50 l49 in let i_temp51 = Uint256 51 in let l51 = Cons {Uint256} i_temp51 l50 in let i_temp52 = Uint256 52 in let l52 = Cons {Uint256} i_temp52 l51 in let i_temp53 = Uint256 53 in let l53 = Cons {Uint256} i_temp53 l52 in let i_temp54 = Uint256 54 in let l54 = Cons {Uint256} i_temp54 l53 in let i_temp55 = Uint256 55 in let l55 = Cons {Uint256} i_temp55 l54 in let i_temp56 = Uint256 56 in let l56 = Cons {Uint256} i_temp56 l55 in let i_temp57 = Uint256 57 in let l57 = Cons {Uint256} i_temp57 l56 in let i_temp58 = Uint256 58 in let l58 = Cons {Uint256} i_temp58 l57 in let i_temp59 = Uint256 59 in let l59 = Cons {Uint256} i_temp59 l58 in let i_temp60 = Uint256 60 in let l60 = Cons {Uint256} i_temp60 l59 in let i_temp61 = Uint256 61 in let l61 = Cons {Uint256} i_temp61 l60 in let i_temp62 = Uint256 62 in let l62 = Cons {Uint256} i_temp62 l61 in let i_temp63 = Uint256 63 in let l63 = Cons {Uint256} i_temp63 l62 in let i_temp64 = Uint256 64 in let l64 = Cons {Uint256} i_temp64 l63 in let i_temp65 = Uint256 65 in let l65 = Cons {Uint256} i_temp65 l64 in let i_temp66 = Uint256 66 in let l66 = Cons {Uint256} i_temp66 l65 in let i_temp67 = Uint256 67 in let l67 = Cons {Uint256} i_temp67 l66 in let i_temp68 = Uint256 68 in let l68 = Cons {Uint256} i_temp68 l67 in let i_temp69 = Uint256 69 in let l69 = Cons {Uint256} i_temp69 l68 in let i_temp70 = Uint256 70 in let l70 = Cons {Uint256} i_temp70 l69 in let i_temp71 = Uint256 71 in let l71 = Cons {Uint256} i_temp71 l70 in let i_temp72 = Uint256 72 in let l72 = Cons {Uint256} i_temp72 l71 in let i_temp73 = Uint256 73 in let l73 = Cons {Uint256} i_temp73 l72 in let i_temp74 = Uint256 74 in let l74 = Cons {Uint256} i_temp74 l73 in let i_temp75 = Uint256 75 in let l75 = Cons {Uint256} i_temp75 l74 in let i_temp76 = Uint256 76 in let l76 = Cons {Uint256} i_temp76 l75 in let i_temp77 = Uint256 77 in let l77 = Cons {Uint256} i_temp77 l76 in let i_temp78 = Uint256 78 in let l78 = Cons {Uint256} i_temp78 l77 in let i_temp79 = Uint256 79 in let l79 = Cons {Uint256} i_temp79 l78 in let i_temp80 = Uint256 80 in let l80 = Cons {Uint256} i_temp80 l79 in let i_temp81 = Uint256 81 in let l81 = Cons {Uint256} i_temp81 l80 in let i_temp82 = Uint256 82 in let l82 = Cons {Uint256} i_temp82 l81 in let i_temp83 = Uint256 83 in let l83 = Cons {Uint256} i_temp83 l82 in let i_temp84 = Uint256 84 in let l84 = Cons {Uint256} i_temp84 l83 in let i_temp85 = Uint256 85 in let l85 = Cons {Uint256} i_temp85 l84 in let i_temp86 = Uint256 86 in let l86 = Cons {Uint256} i_temp86 l85 in let i_temp87 = Uint256 87 in let l87 = Cons {Uint256} i_temp87 l86 in let i_temp88 = Uint256 88 in let l88 = Cons {Uint256} i_temp88 l87 in let i_temp89 = Uint256 89 in let l89 = Cons {Uint256} i_temp89 l88 in let i_temp90 = Uint256 90 in let l90 = Cons {Uint256} i_temp90 l89 in let i_temp91 = Uint256 91 in let l91 = Cons {Uint256} i_temp91 l90 in let i_temp92 = Uint256 92 in let l92 = Cons {Uint256} i_temp92 l91 in let i_temp93 = Uint256 93 in let l93 = Cons {Uint256} i_temp93 l92 in let i_temp94 = Uint256 94 in let l94 = Cons {Uint256} i_temp94 l93 in let i_temp95 = Uint256 95 in let l95 = Cons {Uint256} i_temp95 l94 in let i_temp96 = Uint256 96 in let l96 = Cons {Uint256} i_temp96 l95 in let i_temp97 = Uint256 97 in let l97 = Cons {Uint256} i_temp97 l96 in let i_temp98 = Uint256 98 in let l98 = Cons {Uint256} i_temp98 l97 in let i_temp99 = Uint256 99 in let l99 = Cons {Uint256} i_temp99 l98 in let i_temp100 = Uint256 100 in let l100 = Cons {Uint256} i_temp100 l99 in let i_temp101 = Uint256 101 in let l101 = Cons {Uint256} i_temp101 l100 in let i_temp102 = Uint256 102 in let l102 = Cons {Uint256} i_temp102 l101 in let i_temp103 = Uint256 103 in let l103 = Cons {Uint256} i_temp103 l102 in let i_temp104 = Uint256 104 in let l104 = Cons {Uint256} i_temp104 l103 in let i_temp105 = Uint256 105 in let l105 = Cons {Uint256} i_temp105 l104 in let i_temp106 = Uint256 106 in let l106 = Cons {Uint256} i_temp106 l105 in let i_temp107 = Uint256 107 in let l107 = Cons {Uint256} i_temp107 l106 in let i_temp108 = Uint256 108 in let l108 = Cons {Uint256} i_temp108 l107 in let i_temp109 = Uint256 109 in let l109 = Cons {Uint256} i_temp109 l108 in let i_temp110 = Uint256 110 in let l110 = Cons {Uint256} i_temp110 l109 in let i_temp111 = Uint256 111 in let l111 = Cons {Uint256} i_temp111 l110 in let i_temp112 = Uint256 112 in let l112 = Cons {Uint256} i_temp112 l111 in let i_temp113 = Uint256 113 in let l113 = Cons {Uint256} i_temp113 l112 in let i_temp114 = Uint256 114 in let l114 = Cons {Uint256} i_temp114 l113 in let i_temp115 = Uint256 115 in let l115 = Cons {Uint256} i_temp115 l114 in let i_temp116 = Uint256 116 in let l116 = Cons {Uint256} i_temp116 l115 in let i_temp117 = Uint256 117 in let l117 = Cons {Uint256} i_temp117 l116 in let i_temp118 = Uint256 118 in let l118 = Cons {Uint256} i_temp118 l117 in let i_temp119 = Uint256 119 in let l119 = Cons {Uint256} i_temp119 l118 in let i_temp120 = Uint256 120 in let l120 = Cons {Uint256} i_temp120 l119 in let i_temp121 = Uint256 121 in let l121 = Cons {Uint256} i_temp121 l120 in let i_temp122 = Uint256 122 in let l122 = Cons {Uint256} i_temp122 l121 in let i_temp123 = Uint256 123 in let l123 = Cons {Uint256} i_temp123 l122 in let i_temp124 = Uint256 124 in let l124 = Cons {Uint256} i_temp124 l123 in let i_temp125 = Uint256 125 in let l125 = Cons {Uint256} i_temp125 l124 in let i_temp126 = Uint256 126 in let l126 = Cons {Uint256} i_temp126 l125 in let i_temp127 = Uint256 127 in let l127 = Cons {Uint256} i_temp127 l126 in'" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DUaSb1drXFuI", + "outputId": "951d3362-90be-441e-d4b5-56232380fb19" + }, + "source": [ + "import math\n", + "0x10e1b3be415a0000/ math.factorial(20)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.5" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KipWHMu7ldN_" + }, + "source": [ + "import math\n", + "\n", + "def PrintFunctionOptimalExp():\n", + " print(\"\"\" \n", + "(*\n", + " Return e ^ (x / FIXED_1) * FIXED_1\n", + " Input range: 0 <= x <= OPT_EXP_MAX_VAL - 1\n", + " Auto-generated via 'PrintFunctionOptimalExp.py'\n", + " Detailed description:\n", + " - Rewrite the input as a sum of binary exponents and a single residual r, as small as possible\n", + " - The exponentiation of each binary exponent is given (pre-calculated)\n", + " - The exponentiation of r is calculated via Taylor series for e^x, where x = r\n", + " - The exponentiation of the input is calculated by multiplying the intermediate results above\n", + " - For example: e^5.521692859 = e^(4 + 1 + 0.5 + 0.021692859) = e^4 * e^1 * e^0.5 * e^0.021692859\n", + "*)\n", + " \"\"\")\n", + " print(\"let optimalExp: Uint256 -> Uint256 = fun(x: Uint256) =>\")\n", + " two_pow_minus_three = str(int(\"0x10000000000000000000000000000000\", base=16))\n", + " print(\"let res1 = Uint256 0 in\")\n", + " print(\"let two_pow_minus_three = {} in\".format(two_pow_minus_three))\n", + " print(\"let z1 = builtin rem x two_pow_minus_three in (* get the input modulo 2^(-3) *)\")\n", + " print(\"let y = z1 in\")\n", + " fac20 = math.factorial(20)\n", + " for fac in range(2, 21):\n", + " # z = z * y / FIXED_1; res += z * 0x10e1b3be415a0000; // add y^02 * (20! / 02!)\n", + " prev = str(fac-1)\n", + " now = str(fac)\n", + " fac20_over_cur = fac20 // math.factorial(fac)\n", + " print(\"let z{} = muldiv z{} y FIXED_1 in let tmp{} = Uint256 {} in let res{} = muladd z{} tmp{} res{} in (* add y^{} * (20! / {}!) *)\".format(now, prev, now, str(fac20_over_cur), now, now, now, prev, now, now))\n", + " print(\"let y_add_fixed_1 = builtin add y FIXED_1 in\")\n", + " print(\"let fac20 = Uint256 {} in\".format(str(fac20)))\n", + " print(\"let res_div_fac_20 = builtin div res20 fac20 in\")\n", + " print(\"let res21 = builtin add res_div_fac_20 y_add_fixed_1 in (* divide by 20! and then add y^1 / 1! + y^0 / 0 *)\")\n", + "\n", + " print(\"\"\" \n", + "(* ex: if ((x & 0x010000000000000000000000000000000) != 0) res = res * 0x1c3d6a24ed82218787d624d3e5eba95f9 / 0x18ebef9eac820ae8682b9793ac6d1e776; *)\n", + "let if_contains_muldiv: Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 =\n", + " fun(local_x: Uint256) => fun(bits: Uint256) => fun(res: Uint256) => fun(numerator: Uint256) => fun(denominator: Uint256) =>\n", + " let one = Uint256 1 in\n", + " let bits_plus_one = builtin add bits one in \n", + " let x_mod_condition = builtin rem local_x bits_plus_one in\n", + " let two_pow_bits = builtin pow two_uint256 bits in\n", + " let modded_div_bits = builtin div x_mod_condition two_pow_bits in\n", + " let x_not_contains = builtin eq zero_uint256 modded_div_bits in\n", + " match x_not_contains with\n", + " | True => res\n", + " | False => muldiv res numerator denominator\n", + " end in\n", + " \"\"\")\n", + "\n", + " # if ((x & 0x010000000000000000000000000000000) != 0) res = res * 0x1c3d6a24ed82218787d624d3e5eba95f9 / 0x18ebef9eac820ae8682b9793ac6d1e776; // multiply by e^2^(-3)\n", + " # if ((x & 0x020000000000000000000000000000000) != 0) res = res * 0x18ebef9eac820ae8682b9793ac6d1e778 / 0x1368b2fc6f9609fe7aceb46aa619baed4; // multiply by e^2^(-2)\n", + " # if ((x & 0x040000000000000000000000000000000) != 0) res = res * 0x1368b2fc6f9609fe7aceb46aa619baed5 / 0x0bc5ab1b16779be3575bd8f0520a9f21f; // multiply by e^2^(-1)\n", + " # if ((x & 0x080000000000000000000000000000000) != 0) res = res * 0x0bc5ab1b16779be3575bd8f0520a9f21e / 0x0454aaa8efe072e7f6ddbab84b40a55c9; // multiply by e^2^(+0)\n", + " # if ((x & 0x100000000000000000000000000000000) != 0) res = res * 0x0454aaa8efe072e7f6ddbab84b40a55c5 / 0x00960aadc109e7a3bf4578099615711ea; // multiply by e^2^(+1)\n", + " # if ((x & 0x200000000000000000000000000000000) != 0) res = res * 0x00960aadc109e7a3bf4578099615711d7 / 0x0002bf84208204f5977f9a8cf01fdce3d; // multiply by e^2^(+2)\n", + " # if ((x & 0x400000000000000000000000000000000) != 0) res = res * 0x0002bf84208204f5977f9a8cf01fdc307 / 0x0000003c6ab775dd0b95b4cbee7e65d11; // multiply by e^2^(+3)\n", + " def get_e_pow_2_pow(two_exponent):\n", + " import fractions\n", + " frac = fractions.Fraction(math.pow(math.e, math.pow(2, two_exponent)))\n", + " #print(\"FRAC\", str(frac.numerator), str(frac.denominator))\n", + " return ([frac.numerator, frac.denominator])\n", + " # [num, denom] = get_e_pow_2_pow(-3)\n", + "\n", + " resIndex = 22\n", + " two_exponent = -3\n", + " for bits in range(124, 131):\n", + " prev = str(resIndex-1)\n", + " print(\"(* if bit {} set then multiply by e^2^({})*)\".format(str(bits), str(two_exponent)))\n", + " [num, denom] = get_e_pow_2_pow(two_exponent)\n", + " print(\"let res{} = let bits = Uint256 {} in let numerator = Uint256 {} in let denominator = Uint256 {} in if_contains_muldiv x bits res{} numerator denominator in\".format(str(resIndex), str(bits), str(num), str(denom), prev))\n", + " resIndex += 1\n", + " two_exponent += 1\n", + "\n", + " #finally\n", + " print(\"res28\")\n", + "\n", + "\n", + "PrintFunctionOptimalExp()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fIxpDgQLKfZS", + "outputId": "8ef1770f-dc2b-45a4-cb4a-540227b3ca3b" + }, + "source": [ + "import math\n", + "# FRAC 5103246950987213 4503599627370496\n", + "# FRAC 2891368194064579 2251799813685248\n", + "# FRAC 1856295125090727 1125899906842624\n", + "# FRAC 6121026514868073 2251799813685248\n", + "# FRAC 8319337573440941 1125899906842624\n", + "# FRAC 7684006504512087 140737488355328\n", + "# FRAC 6555195937328235 2199023255552\n", + "s=\"\"\" if ((x & 0x010000000000000000000000000000000) != 0) res = res * 0x1c3d6a24ed82218787d624d3e5eba95f9 / 0x18ebef9eac820ae8682b9793ac6d1e776; // multiply by e^2^(-3)\n", + " if ((x & 0x020000000000000000000000000000000) != 0) res = res * 0x18ebef9eac820ae8682b9793ac6d1e778 / 0x1368b2fc6f9609fe7aceb46aa619baed4; // multiply by e^2^(-2)\n", + " if ((x & 0x040000000000000000000000000000000) != 0) res = res * 0x1368b2fc6f9609fe7aceb46aa619baed5 / 0x0bc5ab1b16779be3575bd8f0520a9f21f; // multiply by e^2^(-1)\n", + " if ((x & 0x080000000000000000000000000000000) != 0) res = res * 0x0bc5ab1b16779be3575bd8f0520a9f21e / 0x0454aaa8efe072e7f6ddbab84b40a55c9; // multiply by e^2^(+0)\n", + " if ((x & 0x100000000000000000000000000000000) != 0) res = res * 0x0454aaa8efe072e7f6ddbab84b40a55c5 / 0x00960aadc109e7a3bf4578099615711ea; // multiply by e^2^(+1)\n", + " if ((x & 0x200000000000000000000000000000000) != 0) res = res * 0x00960aadc109e7a3bf4578099615711d7 / 0x0002bf84208204f5977f9a8cf01fdce3d; // multiply by e^2^(+2)\n", + " if ((x & 0x400000000000000000000000000000000) != 0) res = res * 0x0002bf84208204f5977f9a8cf01fdc307 / 0x0000003c6ab775dd0b95b4cbee7e65d11; // multiply by e^2^(+3)\"\"\"\n", + "b = [ i.split(\" / \") for i in s.strip().replace(\"; //\", \"||\").replace(\"res = res * \", \"||\").split(\"||\") if \" / 0x\" in i]\n", + "for [num, denom] in b:\n", + " print(\"FRAC\", str(int(num, base=16)), str(int(denom, base=16)))\n", + "# print(600596269623765960634066700837880239609/530024347646835984032474664511850276726)\n", + "# print(5103246950987213/4503599627370496)\n", + "print(math.log(600596269623765960634066700837880239609), math.log(530024347646835984032474664511850276726))\n", + "print(math.log2(FIXED_1))\n", + "print(math.log2(5103246950987213), math.log2((4503599627370496)))\n", + "# print(0x010000000000000000000000000000000 == math.pow(2, 124))\n", + "# print(0x400000000000000000000000000000000 == math.pow(2, 130))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "FRAC 600596269623765960634066700837880239609 530024347646835984032474664511850276726\n", + "FRAC 530024347646835984032474664511850276728 412783376994266390547521411024565284564\n", + "FRAC 412783376994266390547521411024565284565 250365773966741064234501452596301656607\n", + "FRAC 250365773966741064234501452596301656606 92104421015340344839251721785254237641\n", + "FRAC 92104421015340344839251721785254237637 12464977905455307901915658421775307242\n", + "FRAC 12464977905455307901915658421775307223 228304034072369565894155946646425149\n", + "FRAC 228304034072369565894155946646422279 76587471230661696290698490699025\n", + "89.29098629223294 89.16598629223294\n", + "127.0\n", + "52.18033688011112 52.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "O7xMXtw7mAZn", + "outputId": "0fcb8838-97a5-45f0-a09e-4730e63e4700" + }, + "source": [ + "import math\n", + "import fractions\n", + "FIXED_1 = 0x080000000000000000000000000000000\n", + "\n", + "def get_e_pow_2_pow(two_exponent):\n", + " frac = fractions.Fraction(math.pow(math.e, math.pow(2, two_exponent)))\n", + " return [[frac.numerator, frac.denominator])\n", + "[num, denom] = get_e_pow_2_pow(-3)\n", + "print(math.log2(0x010000000000000000000000000000000))\n", + "print(math.log2(0x020000000000000000000000000000000))\n", + "print(math.log2(0x400000000000000000000000000000000))\n", + "print(math.log(0x1c3d6a24ed82218787d624d3e5eba95f9 / 0x18ebef9eac820ae8682b9793ac6d1e776))\n", + "frac = fractions.Fraction(math.pow(math.e, math.pow(2, -3)))\n", + "frac2 = fractions.Fraction(0x1c3d6a24ed82218787d624d3e5eba95f9 / 0x18ebef9eac820ae8682b9793ac6d1e776)\n", + "print(frac2)\n", + "print(get_e_pow_2_pow(-3))\n", + "print(frac)\n", + "print(math.log(frac))\n", + "print(math.log(math.pow(math.e, math.pow(2, -3))))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "124.0\n", + "125.0\n", + "130.0\n", + "0.125\n", + "5103246950987213/4503599627370496\n", + "[5103246950987213, 4503599627370496]\n", + "5103246950987213/4503599627370496\n", + "0.125\n", + "0.125\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mtRjN-Mw5ZZS" + }, + "source": [ + "def PrintFindPositionInMaxExpArray():\n", + " # /**\n", + " # The global \"maxExpArray\" is sorted in descending order, and therefore the following statements are equivalent:\n", + " # - This function finds the position of [the smallest value in \"maxExpArray\" larger than or equal to \"x\"]\n", + " # - This function finds the highest position of [a value in \"maxExpArray\" larger than or equal to \"x\"]\n", + " # */\n", + " # function findPositionInMaxExpArray(uint256 _x) internal view returns (uint8) {\n", + " # uint8 lo = MIN_PRECISION;\n", + " # uint8 hi = MAX_PRECISION;\n", + "\n", + " # while (lo + 1 < hi) {\n", + " # uint8 mid = (lo + hi) / 2;\n", + " # if (maxExpArray[mid] >= _x)\n", + " # lo = mid;\n", + " # else\n", + " # hi = mid;\n", + " # }\n", + "\n", + " # if (maxExpArray[hi] >= _x)\n", + " # return hi;\n", + " # if (maxExpArray[lo] >= _x)\n", + " # return lo;\n", + "\n", + " # require(false);\n", + " # return 0;\n", + " # }\n", + " bancor_s = \"\"\"\n", + " maxExpArray[ 32] = 0x1c35fedd14ffffffffffffffffffffffff;\n", + " maxExpArray[ 33] = 0x1b0ce43b323fffffffffffffffffffffff;\n", + " maxExpArray[ 34] = 0x19f0028ec1ffffffffffffffffffffffff;\n", + " maxExpArray[ 35] = 0x18ded91f0e7fffffffffffffffffffffff;\n", + " maxExpArray[ 36] = 0x17d8ec7f0417ffffffffffffffffffffff;\n", + " maxExpArray[ 37] = 0x16ddc6556cdbffffffffffffffffffffff;\n", + " maxExpArray[ 38] = 0x15ecf52776a1ffffffffffffffffffffff;\n", + " maxExpArray[ 39] = 0x15060c256cb2ffffffffffffffffffffff;\n", + " maxExpArray[ 40] = 0x1428a2f98d72ffffffffffffffffffffff;\n", + " maxExpArray[ 41] = 0x13545598e5c23fffffffffffffffffffff;\n", + " maxExpArray[ 42] = 0x1288c4161ce1dfffffffffffffffffffff;\n", + " maxExpArray[ 43] = 0x11c592761c666fffffffffffffffffffff;\n", + " maxExpArray[ 44] = 0x110a688680a757ffffffffffffffffffff;\n", + " maxExpArray[ 45] = 0x1056f1b5bedf77ffffffffffffffffffff;\n", + " maxExpArray[ 46] = 0x0faadceceeff8bffffffffffffffffffff;\n", + " maxExpArray[ 47] = 0x0f05dc6b27edadffffffffffffffffffff;\n", + " maxExpArray[ 48] = 0x0e67a5a25da4107fffffffffffffffffff;\n", + " maxExpArray[ 49] = 0x0dcff115b14eedffffffffffffffffffff;\n", + " maxExpArray[ 50] = 0x0d3e7a392431239fffffffffffffffffff;\n", + " maxExpArray[ 51] = 0x0cb2ff529eb71e4fffffffffffffffffff;\n", + " maxExpArray[ 52] = 0x0c2d415c3db974afffffffffffffffffff;\n", + " maxExpArray[ 53] = 0x0bad03e7d883f69bffffffffffffffffff;\n", + " maxExpArray[ 54] = 0x0b320d03b2c343d5ffffffffffffffffff;\n", + " maxExpArray[ 55] = 0x0abc25204e02828dffffffffffffffffff;\n", + " maxExpArray[ 56] = 0x0a4b16f74ee4bb207fffffffffffffffff;\n", + " maxExpArray[ 57] = 0x09deaf736ac1f569ffffffffffffffffff;\n", + " maxExpArray[ 58] = 0x0976bd9952c7aa957fffffffffffffffff;\n", + " maxExpArray[ 59] = 0x09131271922eaa606fffffffffffffffff;\n", + " maxExpArray[ 60] = 0x08b380f3558668c46fffffffffffffffff;\n", + " maxExpArray[ 61] = 0x0857ddf0117efa215bffffffffffffffff;\n", + " maxExpArray[ 62] = 0x07ffffffffffffffffffffffffffffffff;\n", + " maxExpArray[ 63] = 0x07abbf6f6abb9d087fffffffffffffffff;\n", + " maxExpArray[ 64] = 0x075af62cbac95f7dfa7fffffffffffffff;\n", + " maxExpArray[ 65] = 0x070d7fb7452e187ac13fffffffffffffff;\n", + " maxExpArray[ 66] = 0x06c3390ecc8af379295fffffffffffffff;\n", + " maxExpArray[ 67] = 0x067c00a3b07ffc01fd6fffffffffffffff;\n", + " maxExpArray[ 68] = 0x0637b647c39cbb9d3d27ffffffffffffff;\n", + " maxExpArray[ 69] = 0x05f63b1fc104dbd39587ffffffffffffff;\n", + " maxExpArray[ 70] = 0x05b771955b36e12f7235ffffffffffffff;\n", + " maxExpArray[ 71] = 0x057b3d49dda84556d6f6ffffffffffffff;\n", + " maxExpArray[ 72] = 0x054183095b2c8ececf30ffffffffffffff;\n", + " maxExpArray[ 73] = 0x050a28be635ca2b888f77fffffffffffff;\n", + " maxExpArray[ 74] = 0x04d5156639708c9db33c3fffffffffffff;\n", + " maxExpArray[ 75] = 0x04a23105873875bd52dfdfffffffffffff;\n", + " maxExpArray[ 76] = 0x0471649d87199aa990756fffffffffffff;\n", + " maxExpArray[ 77] = 0x04429a21a029d4c1457cfbffffffffffff;\n", + " maxExpArray[ 78] = 0x0415bc6d6fb7dd71af2cb3ffffffffffff;\n", + " maxExpArray[ 79] = 0x03eab73b3bbfe282243ce1ffffffffffff;\n", + " maxExpArray[ 80] = 0x03c1771ac9fb6b4c18e229ffffffffffff;\n", + " maxExpArray[ 81] = 0x0399e96897690418f785257fffffffffff;\n", + " maxExpArray[ 82] = 0x0373fc456c53bb779bf0ea9fffffffffff;\n", + " maxExpArray[ 83] = 0x034f9e8e490c48e67e6ab8bfffffffffff;\n", + " maxExpArray[ 84] = 0x032cbfd4a7adc790560b3337ffffffffff;\n", + " maxExpArray[ 85] = 0x030b50570f6e5d2acca94613ffffffffff;\n", + " maxExpArray[ 86] = 0x02eb40f9f620fda6b56c2861ffffffffff;\n", + " maxExpArray[ 87] = 0x02cc8340ecb0d0f520a6af58ffffffffff;\n", + " maxExpArray[ 88] = 0x02af09481380a0a35cf1ba02ffffffffff;\n", + " maxExpArray[ 89] = 0x0292c5bdd3b92ec810287b1b3fffffffff;\n", + " maxExpArray[ 90] = 0x0277abdcdab07d5a77ac6d6b9fffffffff;\n", + " maxExpArray[ 91] = 0x025daf6654b1eaa55fd64df5efffffffff;\n", + " maxExpArray[ 92] = 0x0244c49c648baa98192dce88b7ffffffff;\n", + " maxExpArray[ 93] = 0x022ce03cd5619a311b2471268bffffffff;\n", + " maxExpArray[ 94] = 0x0215f77c045fbe885654a44a0fffffffff;\n", + " maxExpArray[ 95] = 0x01ffffffffffffffffffffffffffffffff;\n", + " maxExpArray[ 96] = 0x01eaefdbdaaee7421fc4d3ede5ffffffff;\n", + " maxExpArray[ 97] = 0x01d6bd8b2eb257df7e8ca57b09bfffffff;\n", + " maxExpArray[ 98] = 0x01c35fedd14b861eb0443f7f133fffffff;\n", + " maxExpArray[ 99] = 0x01b0ce43b322bcde4a56e8ada5afffffff;\n", + " maxExpArray[100] = 0x019f0028ec1fff007f5a195a39dfffffff;\n", + " maxExpArray[101] = 0x018ded91f0e72ee74f49b15ba527ffffff;\n", + " maxExpArray[102] = 0x017d8ec7f04136f4e5615fd41a63ffffff;\n", + " maxExpArray[103] = 0x016ddc6556cdb84bdc8d12d22e6fffffff;\n", + " maxExpArray[104] = 0x015ecf52776a1155b5bd8395814f7fffff;\n", + " maxExpArray[105] = 0x015060c256cb23b3b3cc3754cf40ffffff;\n", + " maxExpArray[106] = 0x01428a2f98d728ae223ddab715be3fffff;\n", + " maxExpArray[107] = 0x013545598e5c23276ccf0ede68034fffff;\n", + " maxExpArray[108] = 0x01288c4161ce1d6f54b7f61081194fffff;\n", + " maxExpArray[109] = 0x011c592761c666aa641d5a01a40f17ffff;\n", + " maxExpArray[110] = 0x0110a688680a7530515f3e6e6cfdcdffff;\n", + " maxExpArray[111] = 0x01056f1b5bedf75c6bcb2ce8aed428ffff;\n", + " maxExpArray[112] = 0x00faadceceeff8a0890f3875f008277fff;\n", + " maxExpArray[113] = 0x00f05dc6b27edad306388a600f6ba0bfff;\n", + " maxExpArray[114] = 0x00e67a5a25da41063de1495d5b18cdbfff;\n", + " maxExpArray[115] = 0x00dcff115b14eedde6fc3aa5353f2e4fff;\n", + " maxExpArray[116] = 0x00d3e7a3924312399f9aae2e0f868f8fff;\n", + " maxExpArray[117] = 0x00cb2ff529eb71e41582cccd5a1ee26fff;\n", + " maxExpArray[118] = 0x00c2d415c3db974ab32a51840c0b67edff;\n", + " maxExpArray[119] = 0x00bad03e7d883f69ad5b0a186184e06bff;\n", + " maxExpArray[120] = 0x00b320d03b2c343d4829abd6075f0cc5ff;\n", + " maxExpArray[121] = 0x00abc25204e02828d73c6e80bcdb1a95bf;\n", + " maxExpArray[122] = 0x00a4b16f74ee4bb2040a1ec6c15fbbf2df;\n", + " maxExpArray[123] = 0x009deaf736ac1f569deb1b5ae3f36c130f;\n", + " maxExpArray[124] = 0x00976bd9952c7aa957f5937d790ef65037;\n", + " maxExpArray[125] = 0x009131271922eaa6064b73a22d0bd4f2bf;\n", + " maxExpArray[126] = 0x008b380f3558668c46c91c49a2f8e967b9;\n", + " maxExpArray[127] = 0x00857ddf0117efa215952912839f6473e6;\n", + " \"\"\"\n", + " clean = bancor_s.strip().replace(\";\", \"\").replace(\" = \", \"|\")\n", + " numbers = [i.split(\"\\n\")[0] for i in clean.split(\"|\") if \"0x\" in i]\n", + " # print(numbers)\n", + "\n", + " print(\"\"\" \n", + "(*\n", + " The \"maxExpArray\" is sorted in descending order, and therefore the following statements are equivalent:\n", + " - This function finds the position of [the smallest value in \"maxExpArray\" larger than or equal to \"x\"]\n", + " - This function finds the highest position of [a value in \"maxExpArray\" larger than or equal to \"x\"]\n", + "*)\"\"\")\n", + " print(\"let findPositionInMaxExpArray: Uint256 -> Uint256 = fun(x: Uint256) =>\")\n", + " print(\"type PrecisionAndMax = | PrecisionAndMax of Uint256 Uint256 in\")\n", + " print(\"let res31 = PrecisionAndMax 0 0 in\")\n", + "\n", + " print(\"let setNewIfXSmaller: PrecisionAndMax -> Uint256 -> Uint256 -> PrecisionAndMax =\")\n", + " print(\" fun(prev: PrecisionAndMax) => fun(arrIndex: Uint256) => fun(val: Uint256) =>\")\n", + " print(\" let x_lt_val = uint256_lt x val in\")\n", + " print(\" match x_lt_val with | True => PrecisionAndMax arrIndex val | False => prev end in\")\n", + "\n", + " precision_bias = 32\n", + " for i in range(96):\n", + " maxExpArrayIndex = i + precision_bias\n", + " prev = str(maxExpArrayIndex - 1)\n", + " print(\"\\tlet res{} = let arrIndex = Uint256 {} in let val = Uint256 {} in setNewIfXSmaller res{} arrIndex val in\".format(str(maxExpArrayIndex), str(maxExpArrayIndex), str(int(str(numbers[i]),base=16)), prev))\n", + " print(\"match res127 with | PrecisionAndMax precision max =>\")\n", + " print(\"let precision_is_zero = builtin eq zero_uint256 precision in\")\n", + " print(\"match precision_is_zero with\")\n", + " print(\"| True => (* means that x is bigger than the biggest number permitted *) panic zero_uint25\")\n", + " print(\"| False => precision\")\n", + " print(\"end\")\n", + "\n", + "PrintFindPositionInMaxExpArray()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9ZJ3AWNGA2-3", + "outputId": "4fe7c49f-30ab-4783-cb76-d67c43ae2cb6" + }, + "source": [ + " # maxExpArray[122] = 0x00a4b16f74ee4bb2040a1ec6c15fbbf2df;\n", + " # maxExpArray[123] = 0x009deaf736ac1f569deb1b5ae3f36c130f;\n", + " # maxExpArray[124] = 0x00976bd9952c7aa957f5937d790ef65037;\n", + " # maxExpArray[125] = 0x009131271922eaa6064b73a22d0bd4f2bf;\n", + " # maxExpArray[126] = 0x008b380f3558668c46c91c49a2f8e967b9;\n", + " # maxExpArray[127] = 0x00857ddf0117efa215952912839f6473e6\n", + "import math\n", + "\n", + "# for i in range(122, 128):\n", + "# print(str(i))\n", + "# print(hex(int(math.sqrt(math.pow(2, i)))))\n", + "diff = 0x009deaf736ac1f569deb1b5ae3f36c130f - 0x00976bd9952c7aa957f5937d790ef65037\n", + "# print(math.log(0x009deaf736ac1f569deb1b5ae3f36c130f*0x009deaf736ac1f569deb1b5ae3f36c130f))\n", + "# print(math.log2(0x009deaf736ac1f569deb1b5ae3f36c130f*0x009deaf736ac1f569deb1b5ae3f36c130f))\n", + "# print(hex(0x6bffffffffffffffffffffffffffffffff))\n", + "\n", + "fac = math.factorial(30)\n", + "\n", + "maxval = 0x00857ddf0117efa215952912839f6473e6\n", + "precision = 127\n", + "MAX_PRECISION = 127\n", + "\n", + "x = maxval >> MAX_PRECISION - precision\n", + "xi = x\n", + "res = 0\n", + "\n", + "def log(_xi, _res):\n", + " print(math.log2(_xi))\n", + " print(math.log2(_res))\n", + "\n", + "fac30 = math.factorial(30)\n", + "\n", + "for i in range(2,31):\n", + " fac = fac30 // math.factorial(i)\n", + " xi = (xi*x) >> precision\n", + " res += xi * fac\n", + " # log(xi, res)\n", + "print(math.log(res / fac30 + x + (1 << precision)))\n", + "print(math.log2(res / fac30 + x + (1 << precision)))\n", + "# add x^02 * (33! / 02!\n", + "# add x^33 * (33! / 33!)\n", + "print(math.log2(inval*inval*fac))\n", + "print((math.sqrt(inval*inval*fac)))\n", + "# print([hex(int(math.pow(math.e, i))) for i in range(100, 127)])" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "89.07259571255945\n", + "128.50459211361706\n", + "254.12121212121212\n", + "1.774408836106883e+38\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "arh6BYKMBJqP", + "outputId": "255bea16-9280-4e33-bf51-f23732053986" + }, + "source": [ + "def PrintFunctionGeneralExp():\n", + " # /**\n", + " # This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'.\n", + " # It approximates \"e ^ x\" via maclaurin summation: \"(x^0)/0! + (x^1)/1! + ... + (x^n)/n!\".\n", + " # It returns \"e ^ (x / 2 ^ precision) * 2 ^ precision\", that is, the result is upshifted for accuracy.\n", + " # The global \"maxExpArray\" maps each \"precision\" to \"((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1\".\n", + " # The maximum permitted value for \"x\" is therefore given by \"maxExpArray[precision] >> (MAX_PRECISION - precision)\".\n", + " # */\n", + " # function generalExp(uint256 _x, uint8 _precision) internal pure returns (uint256) {\n", + " # uint256 xi = _x;\n", + " # uint256 res = 0;\n", + "\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x3442c4e6074a82f1797f72ac0000000; // add x^02 * (33! / 02!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x116b96f757c380fb287fd0e40000000; // add x^03 * (33! / 03!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x045ae5bdd5f0e03eca1ff4390000000; // add x^04 * (33! / 04!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00defabf91302cd95b9ffda50000000; // add x^05 * (33! / 05!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x002529ca9832b22439efff9b8000000; // add x^06 * (33! / 06!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00054f1cf12bd04e516b6da88000000; // add x^07 * (33! / 07!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000a9e39e257a09ca2d6db51000000; // add x^08 * (33! / 08!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000012e066e7b839fa050c309000000; // add x^09 * (33! / 09!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000001e33d7d926c329a1ad1a800000; // add x^10 * (33! / 10!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000002bee513bdb4a6b19b5f800000; // add x^11 * (33! / 11!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000003a9316fa79b88eccf2a00000; // add x^12 * (33! / 12!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000048177ebe1fa812375200000; // add x^13 * (33! / 13!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000005263fe90242dcbacf00000; // add x^14 * (33! / 14!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000000000057e22099c030d94100000; // add x^15 * (33! / 15!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000057e22099c030d9410000; // add x^16 * (33! / 16!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000052b6b54569976310000; // add x^17 * (33! / 17!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000004985f67696bf748000; // add x^18 * (33! / 18!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000000000000003dea12ea99e498000; // add x^19 * (33! / 19!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000000031880f2214b6e000; // add x^20 * (33! / 20!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000000000000000025bcff56eb36000; // add x^21 * (33! / 21!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000000000000000001b722e10ab1000; // add x^22 * (33! / 22!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000001317c70077000; // add x^23 * (33! / 23!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000cba84aafa00; // add x^24 * (33! / 24!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000082573a0a00; // add x^25 * (33! / 25!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000005035ad900; // add x^26 * (33! / 26!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x000000000000000000000002f881b00; // add x^27 * (33! / 27!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000001b29340; // add x^28 * (33! / 28!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000000000efc40; // add x^29 * (33! / 29!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000007fe0; // add x^30 * (33! / 30!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000000420; // add x^31 * (33! / 31!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000000021; // add x^32 * (33! / 32!)\n", + " # xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000000001; // add x^33 * (33! / 33!)\n", + "\n", + " # return res / 0x688589cc0e9505e2f2fee5580000000 + _x + (ONE << _precision); // divide by 33! and then add x^1 / 1! + x^0 / 0!\n", + " # }\n", + " print(\"\"\" \n", + " (*\n", + " This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'.\n", + " It approximates \"e ^ x\" via maclaurin summation: \"(x^0)/0! + (x^1)/1! + ... + (x^n)/n!\".\n", + " It returns \"e ^ (x / 2 ^ precision) * 2 ^ precision\", that is, the result is upshifted for accuracy.\n", + " The global \"maxExpArray\" maps each \"precision\" to \"((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1\".\n", + " The maximum permitted value for \"x\" is therefore given by \"maxExpArray[precision] >> (MAX_PRECISION - precision)\".\n", + " *)\n", + " \"\"\")\n", + " print(\"let generalExp: Uint256 -> Uint256 -> Uint256 =\")\n", + " print(\"fun(x: Uint256) => fun(precision: Uint256) =>\")\n", + " print(\"let two_pow_precision = builtin pow two_uint256 precision in\")\n", + "\n", + " import math\n", + " fac33 = math.factorial(33)\n", + "\n", + " print(\"let res1 = Uint256 0 in\")\n", + " print(\"let xi1 = x in\")\n", + " for i in range(2, 34):\n", + " prev = str(i - 1)\n", + " now = str(i)\n", + " fac = fac33 // math.factorial(i)\n", + " print(\"\\t(* add x^{} * (33! / {}!) *)\".format(now, now))\n", + " print(\"\\tlet xi{} = muldiv xi{} x two_pow_precision in let res{} = let fac = Uint256 {} in muladd xi{} fac res{} in\".format(now, prev, now, str(fac), now, prev))\n", + " #return res / 0x688589cc0e9505e2f2fee5580000000 + _x + (ONE << _precision); // divide by 33! and then add x^1 / 1! + x^0 / 0!\n", + " print(\"(* divide by 33! and then add x^1 / 1! + x^0 / 0! *)\")\n", + " print(\"let fac33 = Uint256 {} in\".format(str(fac33)))\n", + " print(\"let res_div_fac33 = builtin div res33 fac33 in\")\n", + " print(\"let x_add_two_pow_precision = builtin add x two_pow_precision in\")\n", + " print(\"builtin add res_div_fac33 x_add_two_pow_precision\")\n", + "\n", + "\n", + "PrintFunctionGeneralExp()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + " \n", + " (*\n", + " This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'.\n", + " It approximates \"e ^ x\" via maclaurin summation: \"(x^0)/0! + (x^1)/1! + ... + (x^n)/n!\".\n", + " It returns \"e ^ (x / 2 ^ precision) * 2 ^ precision\", that is, the result is upshifted for accuracy.\n", + " The global \"maxExpArray\" maps each \"precision\" to \"((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1\".\n", + " The maximum permitted value for \"x\" is therefore given by \"maxExpArray[precision] >> (MAX_PRECISION - precision)\".\n", + " *)\n", + " \n", + "let generalExp: Uint256 -> Uint256 -> Uint256 =\n", + "fun(x: Uint256) => fun(precision: Uint256) =>\n", + "let two_pow_precision = builtin pow two_uint256 precision in\n", + "let res1 = Uint256 0 in\n", + "let xi1 = x in\n", + "\t(* add x^2 * (33! / 2!) *)\n", + "\tlet xi2 = muldiv xi1 x two_pow_precision in let res2 = let fac = Uint256 4341658809405943247759097200640000000 in muladd xi2 fac res1 in\n", + "\t(* add x^3 * (33! / 3!) *)\n", + "\tlet xi3 = muldiv xi2 x two_pow_precision in let res3 = let fac = Uint256 1447219603135314415919699066880000000 in muladd xi3 fac res2 in\n", + "\t(* add x^4 * (33! / 4!) *)\n", + "\tlet xi4 = muldiv xi3 x two_pow_precision in let res4 = let fac = Uint256 361804900783828603979924766720000000 in muladd xi4 fac res3 in\n", + "\t(* add x^5 * (33! / 5!) *)\n", + "\tlet xi5 = muldiv xi4 x two_pow_precision in let res5 = let fac = Uint256 72360980156765720795984953344000000 in muladd xi5 fac res4 in\n", + "\t(* add x^6 * (33! / 6!) *)\n", + "\tlet xi6 = muldiv xi5 x two_pow_precision in let res6 = let fac = Uint256 12060163359460953465997492224000000 in muladd xi6 fac res5 in\n", + "\t(* add x^7 * (33! / 7!) *)\n", + "\tlet xi7 = muldiv xi6 x two_pow_precision in let res7 = let fac = Uint256 1722880479922993352285356032000000 in muladd xi7 fac res6 in\n", + "\t(* add x^8 * (33! / 8!) *)\n", + "\tlet xi8 = muldiv xi7 x two_pow_precision in let res8 = let fac = Uint256 215360059990374169035669504000000 in muladd xi8 fac res7 in\n", + "\t(* add x^9 * (33! / 9!) *)\n", + "\tlet xi9 = muldiv xi8 x two_pow_precision in let res9 = let fac = Uint256 23928895554486018781741056000000 in muladd xi9 fac res8 in\n", + "\t(* add x^10 * (33! / 10!) *)\n", + "\tlet xi10 = muldiv xi9 x two_pow_precision in let res10 = let fac = Uint256 2392889555448601878174105600000 in muladd xi10 fac res9 in\n", + "\t(* add x^11 * (33! / 11!) *)\n", + "\tlet xi11 = muldiv xi10 x two_pow_precision in let res11 = let fac = Uint256 217535414131691079834009600000 in muladd xi11 fac res10 in\n", + "\t(* add x^12 * (33! / 12!) *)\n", + "\tlet xi12 = muldiv xi11 x two_pow_precision in let res12 = let fac = Uint256 18127951177640923319500800000 in muladd xi12 fac res11 in\n", + "\t(* add x^13 * (33! / 13!) *)\n", + "\tlet xi13 = muldiv xi12 x two_pow_precision in let res13 = let fac = Uint256 1394457782895455639961600000 in muladd xi13 fac res12 in\n", + "\t(* add x^14 * (33! / 14!) *)\n", + "\tlet xi14 = muldiv xi13 x two_pow_precision in let res14 = let fac = Uint256 99604127349675402854400000 in muladd xi14 fac res13 in\n", + "\t(* add x^15 * (33! / 15!) *)\n", + "\tlet xi15 = muldiv xi14 x two_pow_precision in let res15 = let fac = Uint256 6640275156645026856960000 in muladd xi15 fac res14 in\n", + "\t(* add x^16 * (33! / 16!) *)\n", + "\tlet xi16 = muldiv xi15 x two_pow_precision in let res16 = let fac = Uint256 415017197290314178560000 in muladd xi16 fac res15 in\n", + "\t(* add x^17 * (33! / 17!) *)\n", + "\tlet xi17 = muldiv xi16 x two_pow_precision in let res17 = let fac = Uint256 24412776311194951680000 in muladd xi17 fac res16 in\n", + "\t(* add x^18 * (33! / 18!) *)\n", + "\tlet xi18 = muldiv xi17 x two_pow_precision in let res18 = let fac = Uint256 1356265350621941760000 in muladd xi18 fac res17 in\n", + "\t(* add x^19 * (33! / 19!) *)\n", + "\tlet xi19 = muldiv xi18 x two_pow_precision in let res19 = let fac = Uint256 71382386874839040000 in muladd xi19 fac res18 in\n", + "\t(* add x^20 * (33! / 20!) *)\n", + "\tlet xi20 = muldiv xi19 x two_pow_precision in let res20 = let fac = Uint256 3569119343741952000 in muladd xi20 fac res19 in\n", + "\t(* add x^21 * (33! / 21!) *)\n", + "\tlet xi21 = muldiv xi20 x two_pow_precision in let res21 = let fac = Uint256 169958063987712000 in muladd xi21 fac res20 in\n", + "\t(* add x^22 * (33! / 22!) *)\n", + "\tlet xi22 = muldiv xi21 x two_pow_precision in let res22 = let fac = Uint256 7725366544896000 in muladd xi22 fac res21 in\n", + "\t(* add x^23 * (33! / 23!) *)\n", + "\tlet xi23 = muldiv xi22 x two_pow_precision in let res23 = let fac = Uint256 335885501952000 in muladd xi23 fac res22 in\n", + "\t(* add x^24 * (33! / 24!) *)\n", + "\tlet xi24 = muldiv xi23 x two_pow_precision in let res24 = let fac = Uint256 13995229248000 in muladd xi24 fac res23 in\n", + "\t(* add x^25 * (33! / 25!) *)\n", + "\tlet xi25 = muldiv xi24 x two_pow_precision in let res25 = let fac = Uint256 559809169920 in muladd xi25 fac res24 in\n", + "\t(* add x^26 * (33! / 26!) *)\n", + "\tlet xi26 = muldiv xi25 x two_pow_precision in let res26 = let fac = Uint256 21531121920 in muladd xi26 fac res25 in\n", + "\t(* add x^27 * (33! / 27!) *)\n", + "\tlet xi27 = muldiv xi26 x two_pow_precision in let res27 = let fac = Uint256 797448960 in muladd xi27 fac res26 in\n", + "\t(* add x^28 * (33! / 28!) *)\n", + "\tlet xi28 = muldiv xi27 x two_pow_precision in let res28 = let fac = Uint256 28480320 in muladd xi28 fac res27 in\n", + "\t(* add x^29 * (33! / 29!) *)\n", + "\tlet xi29 = muldiv xi28 x two_pow_precision in let res29 = let fac = Uint256 982080 in muladd xi29 fac res28 in\n", + "\t(* add x^30 * (33! / 30!) *)\n", + "\tlet xi30 = muldiv xi29 x two_pow_precision in let res30 = let fac = Uint256 32736 in muladd xi30 fac res29 in\n", + "\t(* add x^31 * (33! / 31!) *)\n", + "\tlet xi31 = muldiv xi30 x two_pow_precision in let res31 = let fac = Uint256 1056 in muladd xi31 fac res30 in\n", + "\t(* add x^32 * (33! / 32!) *)\n", + "\tlet xi32 = muldiv xi31 x two_pow_precision in let res32 = let fac = Uint256 33 in muladd xi32 fac res31 in\n", + "\t(* add x^33 * (33! / 33!) *)\n", + "\tlet xi33 = muldiv xi32 x two_pow_precision in let res33 = let fac = Uint256 1 in muladd xi33 fac res32 in\n", + "(* divide by 33! and then add x^1 / 1! + x^0 / 0! *)\n", + "let fac33 = Uint256 8683317618811886495518194401280000000 in\n", + "let res_div_fac33 = builtin div res33 fac33 in\n", + "let x_add_two_pow_precision = builtin add x two_pow_precision in\n", + "builtin add res_div_fac33 x_add_two_pow_precision\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Jp4E9HR2aN-2", + "outputId": "af618dd3-e93a-47f7-f77a-ad78ad0fe876" + }, + "source": [ + "# debuging ! yay\n", + "import math\n", + "supply = 1000\n", + "connector_balance = 250\n", + "connector_weight = 500000\n", + "deposit_amount = 10\n", + "FIXED_1 = 170141183460469231731687303715884105728\n", + "OPT_LOG_MAX_VAL = 46249168727311016857545551792166839753\n", + "MAX_WEIGHT = 1000000\n", + "\n", + "def CalculatePurchaseReturn(supply, connector_balance, connector_weight, deposit_amount):\n", + " return math.floor(supply * (math.pow((1 + deposit_amount / connector_balance), (connector_weight / 1000000)) - 1))\n", + "\n", + "CalculatePurchaseReturn(supply, connector_balance, connector_weight, deposit_amount)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "19" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ex3hGZieMvBT" + }, + "source": [ + "import math\n", + "def CalculateCrossConnectorReturn(_fromConnectorBalance, _fromConnectorWeight, _toConnectorBalance, _toConnectorWeight, _amount):\n", + " return int(_toConnectorBalance * (1 - math.pow((_fromConnectorBalance / (_fromConnectorBalance + _amount)),(_fromConnectorWeight / _toConnectorWeight))))\n", + "\n", + "# Formula:\n", + "# Return = _toConnectorBalance * (1 - (_fromConnectorBalance / (_fromConnectorBalance + _amount)) ^ (_fromConnectorWeight / _toConnectorWeight))\n", + "#param _fromConnectorBalance input connector balance\n", + "#param _fromConnectorWeight input connector weight, represented in ppm, 1-1000000\n", + "#param _toConnectorBalance output connector balance\n", + "#param _toConnectorWeight output connector weight, represented in ppm, 1-1000000\n", + "#param _amount input connector amount\n", + "\n", + "def printTestCase(_fromConnectorBalance, _fromConnectorWeight, _toConnectorBalance, _toConnectorWeight, _amount):\n", + " t = [str(i) for i in [_fromConnectorBalance, _fromConnectorWeight, _toConnectorBalance, _toConnectorWeight, _amount, CalculateCrossConnectorReturn(_fromConnectorBalance, _fromConnectorWeight, _toConnectorBalance, _toConnectorWeight, _amount)]]\n", + " print(t, \",\")\n", + "\n", + "print(\"[\")\n", + "print(\"//equal weights\")\n", + "for i in range(0, 1000, 50):\n", + " printTestCase((1000), (40), (250), (40), (i))\n", + "print(\"//different weights\")\n", + "for i in range(0, 1000, 50):\n", + " printTestCase((1000), (12341), (250), (65341), (i))\n", + "print(\"//zil scaled\")\n", + "for i in range(0, 400, 50):\n", + " printTestCase(zil(561), (12341), zil(435), (65341), zil(i))\n", + "print(\"//zil scaled other\")\n", + "for i in range(0, 400, 50):\n", + " printTestCase(zil(51234151234), (12341), zil(123451324123), (65341), zil(i))\n", + "print(\"]\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5tbrtXZ5xrjB" + }, + "source": [ + "def CalculateSaleReturn(s, cb, cw, sa):\n", + " return math.floor(cb * (1 - math.pow((1 - sa / s), (1 / (cw / 1000000)))))\n", + "\n", + "def printTestCase(s, cb, cw, sa):\n", + " t = [str(i) for i in [s, cb, cw, sa, CalculateSaleReturn(s, cb, cw, sa)]]\n", + " print(t, \",\")\n", + "\n", + "print(\"[\")\n", + "print(\"//bancor paper test cases\")\n", + "printTestCase((1000), (250), (500000), (0))\n", + "for i in range(10, 1000, 50):\n", + " printTestCase((1000), (250), (500000), (i))\n", + "print(\"//below 50 % test cases\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase((1000), (250), (250000), (i))\n", + "print(\"//above 50% test cases\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase((1000), (250), (750000), (i))\n", + "print(\"//bancor paper test cases zil\")\n", + "printTestCase(zil(1000), zil(250), (500000), (0))\n", + "for i in range(10, 1000, 50):\n", + " printTestCase(zil(1000), zil(250), (500000), zil(i))\n", + "print(\"]\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "GStkqBAJpgao" + }, + "source": [ + "def printTestCase(s, cb, cw, da):\n", + " t = [str(i) for i in [s, cb, cw, da, CalculatePurchaseReturn(s, cb, cw, da)]]\n", + " print(t, \",\")\n", + "\n", + "def zil(s):\n", + " return int(s*math.pow(10,12))\n", + "\n", + "def eighteen(s):\n", + " return int(s*math.pow(10,18))\n", + "\n", + "def thirty(s):\n", + " return int(s*math.pow(10,30))\n", + "\n", + "def thirty_five(s):\n", + " return int(s*math.pow(10,35))\n", + "\n", + "printTestCase((1000), (250), (500000), (0))\n", + "print(\"bancor paper test cases\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase((1000), (250), (500000), (i))\n", + "print(\"below 50 % test cases\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase((1000), (250), (250000), (i))\n", + "print(\"above 50% test cases\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase((1000), (250), (750000), (i))\n", + "print(\"connector weight is max weight\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase((1000), (250), (1000000), (i))\n", + "print(\"upscaled to zil\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase(zil(1000), zil(250), (500000), zil(i))\n", + "print(\"eighteen zeroes\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase(eighteen(1000), eighteen(250), (500000), eighteen(i))\n", + "\n", + "print(\"thirty zeroes\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase(thirty(1000), thirty(250), (500000), thirty(i))\n", + "\n", + "print(\"thirty five zeroes\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase(thirty_five(1000), thirty_five(250), (500000), thirty_five(i))\n", + "\n", + "print(\"generalLogGeneralExp\")\n", + "for i in range(10, 750, 50):\n", + " printTestCase(eighteen(1000), (250), (500000), eighteen(i))\n", + "# debug\n", + "# for i in range(60, 110):\n", + "# printTestCase((1000), (250), (500000), (i))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q9DgXMPmzOXJ", + "outputId": "04957def-7901-4953-9542-09924f90abe2" + }, + "source": [ + "# Test: [\"1000\",\"250\",\"500000\",\"71\",\"133\"]:\n", + "# result: success\n", + "# event: \n", + "# ________________________________\n", + "# 0 133\n", + "# Test: [\"1000\",\"250\",\"500000\",\"72\",\"134\"]:\n", + "# result: success\n", + "# event: \n", + "# ________________________________\n", + "# -133 1\n", + "import math\n", + "OPT_LOG_MAX_VAL = 462491687273110168575455517921668397539\n", + "MAX_WEIGHT = 1000000\n", + "OPT_EXP_MAX_VAL = 2722258935367507707706996859454145691648\n", + "s = 1000\n", + "cb = 250\n", + "cw = 500000\n", + "\n", + "def if_contains_muldiv_condition(x, bits):\n", + " # let if_contains_muldiv: Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 =\n", + " # fun(local_x: Uint256) => fun(bits: Uint256) => fun(res: Uint256) => fun(numerator: Uint256) => fun(denominator: Uint256) =>\n", + " # let one = Uint256 1 in\n", + " # let bits_plus_one = builtin add bits one in \n", + " # let x_mod_condition = builtin rem local_x bits_plus_one in\n", + " # let two_pow_bits = pow_uint256 two_uint256 bits in\n", + " # let modded_div_bits = builtin div x_mod_condition two_pow_bits in\n", + " # let x_not_contains = builtin eq zero_uint256 modded_div_bits in\n", + " # match x_not_contains with\n", + " # | True => res\n", + " # | False => muldiv res numerator denominator\n", + " # end in\n", + " bits_add_one = 1 + bits\n", + "# working case\n", + "def printInfo(cb, depo):\n", + " baseN = (cb+depo)\n", + " print()\n", + " print(baseN/cb, \"base |\")\n", + " print((baseN * FIXED_1 / cb) < OPT_LOG_MAX_VAL, \"can do optimal log |\",)\n", + " base_log = math.log(baseN/cb)*FIXED_1\n", + " print(base_log, \"baseLog |\",)\n", + " base_log_times_exp = (base_log*cw)/MAX_WEIGHT\n", + " print(base_log_times_exp, \"baselogTimesExp |\",)\n", + " print(base_log_times_exp < OPT_EXP_MAX_VAL, \"can do optimal exp |\",)\n", + " x = int(base_log_times_exp)\n", + " print((x & 0x010000000000000000000000000000000) != 0)\n", + " print(x & 0x020000000000000000000000000000000 != 0)\n", + " print(x & 0x040000000000000000000000000000000 != 0)\n", + " print(x & 0x080000000000000000000000000000000 != 0)\n", + " print(x & 0x100000000000000000000000000000000 != 0)\n", + " print(x & 0x200000000000000000000000000000000 != 0)\n", + " print(x & 0x400000000000000000000000000000000 != 0)\n", + "\n", + "# printInfo(250, 71)\n", + "# print()\n", + "# printInfo(250, 72)\n", + "\n", + "# # [\"1000000000000000\",\"250000000000000\",\"500000\",\"410000000000000\",\"624807680927192\"]\n", + "# # [\"1000000000000000000000\",\"250000000000000000000\",\"500000\",\"410000000000000000000\",\"624807680927192055808\"]\n", + "# print(\"zil\")\n", + "# printInfo(250000000000000, 410000000000000)\n", + "# print(\"eighteen zeroes\")\n", + "# printInfo(250000000000000000000, 410000000000000000000)\n", + "# # [\"1000000000000000089690419062898688\",\"250000000000000022422604765724672\",\"500000\",\"409999999999999980568148466204672\",\"624807680927192113214042178322432\"]\n", + "# print(\"thirty zeroes\")\n", + "# printInfo(250000000000000022422604765724672, 409999999999999980568148466204672)\n", + "# # [\"99999999999999997748809823456034029568\",\"24999999999999999437202455864008507392\",\"500000\",\"40999999999999997754749412413473292288\",\"62480768092719207401471102168963481600\"]\n", + "# printInfo(1, 4099990000099922288)\n", + "\n", + "def printInfoCrossReturn(frob, amt):\n", + " baseN = frob+amt\n", + " baseD = frob\n", + " print()\n", + " print(baseN/baseD, \"base |\")\n", + " print((baseN * FIXED_1 / baseD) < OPT_LOG_MAX_VAL, \"can do optimal log |\",)\n", + " base_log = math.log(baseN/baseD)*FIXED_1\n", + " print(base_log, \"baseLog |\",)\n", + " base_log_times_exp = (base_log*cw)/MAX_WEIGHT\n", + " print(base_log_times_exp, \"baselogTimesExp |\",)\n", + " print(base_log_times_exp < OPT_EXP_MAX_VAL, \"can do optimal exp |\",)\n", + " x = int(base_log_times_exp)\n", + " print((x & 0x010000000000000000000000000000000) != 0)\n", + " print(x & 0x020000000000000000000000000000000 != 0)\n", + " print(x & 0x040000000000000000000000000000000 != 0)\n", + " print(x & 0x080000000000000000000000000000000 != 0)\n", + " print(x & 0x100000000000000000000000000000000 != 0)\n", + " print(x & 0x200000000000000000000000000000000 != 0)\n", + " print(x & 0x400000000000000000000000000000000 != 0)\n", + "\n", + "# [\n", + "# \"561000000000000\",\n", + "# \"12341\",\n", + "# \"435000000000000\",\n", + "# \"65341\",\n", + "# \"50000000000000\",\n", + "# \"6958139114315\",\n", + "# ]\n", + "printInfoCrossReturn(561000000000000, 50000000000000)" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "\n", + "1.089126559714795 base |\n", + "True can do optimal log |\n", + "1.4525982807008188e+37 baseLog |\n", + "7.262991403504094e+36 baselogTimesExp |\n", + "True can do optimal exp |\n", + "False\n", + "False\n", + "False\n", + "False\n", + "False\n", + "False\n", + "False\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "g2uFFF7r_4ay", + "outputId": "1c795697-e75b-4aec-94bb-9999726c6061" + }, + "source": [ + "print(math.log10(462491687273110168575455517921668397539))\n", + "math.log10(680564733841876926926749214863536422912)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "38.66510393122886\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "38.832869440653575" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 150 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5jQgGfP_Rxp1", + "outputId": "82bcb8be-f73a-4799-9f61-5453ca657410" + }, + "source": [ + "(2000000000*30877)/math.pow(10,12)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "61.754" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 162 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nY38ccsmnjBW", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "04ce51b7-6f7c-4bb7-8739-72dfe701e3ad" + }, + "source": [ + "# figure out the get reserve ratio algorithm\n", + "import random\n", + "import math\n", + "\n", + "FIXED_1 = math.pow(10, 18)\n", + "FIXED_DENOM = math.pow(10, 12)\n", + "max = (math.pow(2,128)-1)\n", + "\n", + "def getRandom():\n", + " return random.randint(1,max)\n", + "def getNum(s):\n", + " return random.randint(1 , s - 1)\n", + "\n", + "denom = getRandom()\n", + "num = getNum(denom)\n", + "num*(max*math.pow(10,6))//(denom*max)" + ], + "execution_count": 77, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "610090.0" + ] + }, + "metadata": {}, + "execution_count": 77 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "KayhxXAh_ZTT", + "outputId": "5c0ad155-62eb-403f-c2c5-44b634cd3c82" + }, + "source": [ + "import math\n", + "\"{:.0f}\".format((math.pow(2,128)-1))\n" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'340282366920938463463374607431768211456'" + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hmYfWLI8bXPZ", + "outputId": "303bed39-98c0-44e1-f6d4-e23049e71d91" + }, + "source": [ + "int(math.pow(10,6))" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1000000" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "g5BWkL8TdUgd" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/package-lock.json b/reference/continuous-token-bonding-curve-contracts/package-lock.json new file mode 100644 index 000000000..c320c1a63 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/package-lock.json @@ -0,0 +1,11598 @@ +{ + "name": "continuous-token-bonding-curve-contracts", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "@zilliqa-js/zilliqa": "^3.0.0", + "big.js": "^6.1.1", + "create-hash": "^1.2.0", + "dotenv": "^10.0.0", + "jest": "^27.0.6", + "nodemon": "^2.0.9", + "ts-jest": "^27.0.4", + "websocket": "^1.0.34" + }, + "devDependencies": { + "@types/big.js": "^6.1.1", + "@types/bn.js": "^4.11.6", + "@types/create-hash": "^1.2.2", + "@types/jest": "^27.0.0", + "@types/long": "^4.0.1", + "@types/node": "^16.4.0", + "@types/node-fetch": "^2.5.12", + "@types/prettier": "^2.3.2", + "@types/websocket": "^1.0.4", + "node-fetch": "^2.6.1", + "prettier": "2.3.2", + "ts-node": "^10.0.0", + "tslib": "^2.3.0", + "typescript": "^4.3.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "dependencies": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "dependencies": { + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "dependencies": { + "@babel/types": "^7.14.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", + "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "dependencies": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "dependencies": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "dependencies": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "dependencies": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "devOptional": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/big.js": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.1.tgz", + "integrity": "sha512-Zns+nT0hj96ie+GDbL5NeHxhL4wNz8QMxCHqBvxgc4x0hhgQ/o92rPwqxvPBhY3ZYnH8TJGw/8oCkjhOy2Rfzw==", + "dev": true + }, + "node_modules/@types/bip39": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bip39/-/bip39-2.4.2.tgz", + "integrity": "sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/create-hash": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/create-hash/-/create-hash-1.2.2.tgz", + "integrity": "sha512-Fg8/kfMJObbETFU/Tn+Y0jieYewryLrbKwLCEIwPyklZZVY2qB+64KFjhplGSw+cseZosfFXctXO+PyIYD8iZQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hdkey": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@types/hdkey/-/hdkey-0.7.1.tgz", + "integrity": "sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.0.tgz", + "integrity": "sha512-IlpQZVpxufe+3qPaAqEoSPHVSxnJh1cf0BqqWHJeKiAUbwnHdmNzjP3ZCWSZSTbmAGXQPNk9QmM3Bif0pR54rg==", + "devOptional": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "devOptional": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "devOptional": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "devOptional": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "devOptional": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "devOptional": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "devOptional": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/node": { + "version": "16.4.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", + "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==" + }, + "node_modules/@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/websocket": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.4.tgz", + "integrity": "sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + }, + "node_modules/@zilliqa-js/account": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/account/-/account-3.0.0.tgz", + "integrity": "sha512-3+Mprf8sgYzdCzqMG3Hz9jFAYbGo7oCZlMqCbl9IZu1RU4wU5Zb0HBQrJHcw9H02IePCP/NVMVmEQOcWVPTwAA==", + "dependencies": { + "@types/bip39": "^2.4.0", + "@types/hdkey": "^0.7.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/proto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "bip39": "^2.5.0", + "hdkey": "^1.1.0" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/@zilliqa-js/blockchain": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/blockchain/-/blockchain-3.0.0.tgz", + "integrity": "sha512-jrGBogGupJ8yl0TW78GBytQmSzGguz8oOEfwOXJVSfXDDsFKNuWY3eDJp4a8Af6dA66bl9slXEIF76Kpj28tng==", + "dependencies": { + "@zilliqa-js/account": "3.0.0", + "@zilliqa-js/contract": "3.0.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "utility-types": "^3.4.1" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/@zilliqa-js/contract": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/contract/-/contract-3.0.0.tgz", + "integrity": "sha512-8GhqBD3/rhCiGhcggkFL3zM8s/f8GyaH1RM3Kkg11ETVPLw3xlxbbG668wyagQ0Qb2yEt5n/C/fLbtR9Ch8Jyg==", + "dependencies": { + "@zilliqa-js/account": "3.0.0", + "@zilliqa-js/blockchain": "3.0.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "hash.js": "^1.1.5", + "utility-types": "^2.1.0" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/@zilliqa-js/contract/node_modules/utility-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-2.1.0.tgz", + "integrity": "sha512-/nP2gqavggo6l38rtQI/CdeV+2fmBGXVvHgj9kV2MAnms3TIi77Mz9BtapPFI0+GZQCqqom0vACQ+VlTTaCovw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@zilliqa-js/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/core/-/core-3.0.0.tgz", + "integrity": "sha512-aDeOqGl2gOZ8LQhCFDGgOX0L8ZX6amnFEIyLc3vXzzQ0vX+jZ19U2q6IFI82eIPNZuUBNrcei0Wefe3D6dyjsw==", + "dependencies": { + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "cross-fetch": "^2.2.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/@zilliqa-js/crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/crypto/-/crypto-3.0.0.tgz", + "integrity": "sha512-vs4xWG8C+/UzqfKNreRfe1TrzKwvXZUI+3BD2X+fTtSST1ZXwX9KRa3T3MdmK252tiYqNhWm/YJBr36lPYRX3A==", + "dependencies": { + "@zilliqa-js/util": "3.0.0", + "aes-js": "^3.1.1", + "bsert": "^0.0.4", + "elliptic": "^6.5.0", + "hash.js": "^1.1.5", + "hmac-drbg": "^1.0.1", + "pbkdf2": "^3.0.16", + "randombytes": "^2.0.6", + "scrypt-js": "^3.0.1", + "scryptsy": "^2.1.0", + "sodium-native": "^3.2.0", + "uuid": "^3.3.2" + } + }, + "node_modules/@zilliqa-js/proto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/proto/-/proto-3.0.0.tgz", + "integrity": "sha512-FnLmNica3kZwUY8WbzPyUDM27YnXvWdzReuX87VVrhQgTIfGExOECIep/8ogs465U7CJQtEjxrOTAqSytDBNPA==", + "dependencies": { + "protobufjs": "^6.8.8" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/@zilliqa-js/subscriptions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/subscriptions/-/subscriptions-3.0.0.tgz", + "integrity": "sha512-AmMsgNOTjGOO2TdYr+RUTXHTVnTU8gXeuRDJOpWJfeRQi27tf99zi7GwqbyYiWsPznBqD2BmirBHNxao+QKf6A==", + "dependencies": { + "@zilliqa-js/core": "3.0.0", + "mock-socket": "^9.0.2", + "websocket": "^1.0.28" + } + }, + "node_modules/@zilliqa-js/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/util/-/util-3.0.0.tgz", + "integrity": "sha512-4TWHZ8gXmMmRrwkok2Py3YSUXl4udnnmI6EY6UmdtRtKiJl9LEjpGlq0+3YwGAouLrTPPkIxBXXETCDhX6D6Xg==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "@types/long": "^4.0.0", + "bn.js": "^4.11.8", + "long": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/@zilliqa-js/zilliqa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/zilliqa/-/zilliqa-3.0.0.tgz", + "integrity": "sha512-dG8dXqsIhLs7KS8qCdC8ilP+rOX7wKEQuLG+ra3sdGeJgD283jw8bb05UGzqpmrRKFtG3DybHtYcqcgSWY9uBw==", + "dependencies": { + "@zilliqa-js/account": "3.0.0", + "@zilliqa-js/blockchain": "3.0.0", + "@zilliqa-js/contract": "3.0.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/subscriptions": "3.0.0", + "@zilliqa-js/util": "3.0.0" + }, + "engines": { + "node": ">=12.0.0 <15" + } + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "dependencies": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "dependencies": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/big.js": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.1.1.tgz", + "integrity": "sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip39": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", + "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", + "dependencies": { + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "unorm": "^1.3.3" + } + }, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", + "dependencies": { + "caniuse-lite": "^1.0.30001248", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.793", + "escalade": "^3.1.1", + "node-releases": "^1.1.73" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bsert": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bsert/-/bsert-0.0.4.tgz", + "integrity": "sha512-VReLe1aTaHRmf80YLOHUk8ONQ48SjseZP76GlNIDheD5REYByn/Mm9yrtI0/ZCaFrcfxzgpiw1/hMMCUOSMa3w==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/cross-fetch": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.5.tgz", + "integrity": "sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w==", + "dependencies": { + "node-fetch": "2.6.1", + "whatwg-fetch": "2.0.4" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "dependencies": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.802", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.802.tgz", + "integrity": "sha512-dXB0SGSypfm3iEDxrb5n/IVKeX4uuTnFHdve7v+yKJqNpEP0D4mjFJ8e1znmSR+OOVlVC+kDO6f2kAkTFXvJBg==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hdkey": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.2.tgz", + "integrity": "sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ==", + "dependencies": { + "bs58check": "^2.1.2", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", + "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "dependencies": { + "@jest/core": "^27.0.6", + "import-local": "^3.0.2", + "jest-cli": "^27.0.6" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "dependencies": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "dependencies": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "dependencies": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "dependencies": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "dependencies": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "dependencies": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "dependencies": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "dependencies": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "dependencies": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mock-socket": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.0.3.tgz", + "integrity": "sha512-SxIiD2yE/By79p3cNAAXyLQWTvEFNEzcAO7PH+DzRqKSFaplAPFjiQLmw8ofmpCsZf+Rhfn2/xCJagpdGmYdTw==", + "dependencies": { + "url-parse": "^1.4.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-releases": { + "version": "1.1.74", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", + "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" + }, + "node_modules/nodemon": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", + "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, + "node_modules/secp256k1": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", + "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.5.2", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sodium-native": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-3.2.1.tgz", + "integrity": "sha512-EgDZ/Z7PxL2kCasKk7wnRkV8W9kvwuIlHuHXAxkQm3FF0MgVsjyLBXGjSRGhjE6u7rhSpk3KaMfFM23bfMysIQ==", + "hasInstallScript": true, + "dependencies": { + "ini": "^1.3.5", + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.4.tgz", + "integrity": "sha512-c4E1ECy9Xz2WGfTMyHbSaArlIva7Wi2p43QOMmCqjSSjHP06KXv+aT+eSY+yZMuqsMi3k7pyGsGj2q5oSl5WfQ==", + "dependencies": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^26.0.0", + "babel-jest": ">=27.0.0 <28", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", + "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", + "devOptional": true, + "dependencies": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/undefsafe/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/undefsafe/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helpers": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", + "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "@babel/parser": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "requires": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + } + }, + "@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "requires": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + } + }, + "@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "requires": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + } + }, + "@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "devOptional": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "devOptional": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "devOptional": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "devOptional": true + }, + "@types/babel__core": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/big.js": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.1.tgz", + "integrity": "sha512-Zns+nT0hj96ie+GDbL5NeHxhL4wNz8QMxCHqBvxgc4x0hhgQ/o92rPwqxvPBhY3ZYnH8TJGw/8oCkjhOy2Rfzw==", + "dev": true + }, + "@types/bip39": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bip39/-/bip39-2.4.2.tgz", + "integrity": "sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg==", + "requires": { + "@types/node": "*" + } + }, + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "requires": { + "@types/node": "*" + } + }, + "@types/create-hash": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/create-hash/-/create-hash-1.2.2.tgz", + "integrity": "sha512-Fg8/kfMJObbETFU/Tn+Y0jieYewryLrbKwLCEIwPyklZZVY2qB+64KFjhplGSw+cseZosfFXctXO+PyIYD8iZQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/hdkey": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@types/hdkey/-/hdkey-0.7.1.tgz", + "integrity": "sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.0.tgz", + "integrity": "sha512-IlpQZVpxufe+3qPaAqEoSPHVSxnJh1cf0BqqWHJeKiAUbwnHdmNzjP3ZCWSZSTbmAGXQPNk9QmM3Bif0pR54rg==", + "devOptional": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "devOptional": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "devOptional": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "devOptional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "devOptional": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "devOptional": true + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "devOptional": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "@types/node": { + "version": "16.4.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", + "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==" + }, + "@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/websocket": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.4.tgz", + "integrity": "sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + }, + "@zilliqa-js/account": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/account/-/account-3.0.0.tgz", + "integrity": "sha512-3+Mprf8sgYzdCzqMG3Hz9jFAYbGo7oCZlMqCbl9IZu1RU4wU5Zb0HBQrJHcw9H02IePCP/NVMVmEQOcWVPTwAA==", + "requires": { + "@types/bip39": "^2.4.0", + "@types/hdkey": "^0.7.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/proto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "bip39": "^2.5.0", + "hdkey": "^1.1.0" + } + }, + "@zilliqa-js/blockchain": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/blockchain/-/blockchain-3.0.0.tgz", + "integrity": "sha512-jrGBogGupJ8yl0TW78GBytQmSzGguz8oOEfwOXJVSfXDDsFKNuWY3eDJp4a8Af6dA66bl9slXEIF76Kpj28tng==", + "requires": { + "@zilliqa-js/account": "3.0.0", + "@zilliqa-js/contract": "3.0.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "utility-types": "^3.4.1" + } + }, + "@zilliqa-js/contract": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/contract/-/contract-3.0.0.tgz", + "integrity": "sha512-8GhqBD3/rhCiGhcggkFL3zM8s/f8GyaH1RM3Kkg11ETVPLw3xlxbbG668wyagQ0Qb2yEt5n/C/fLbtR9Ch8Jyg==", + "requires": { + "@zilliqa-js/account": "3.0.0", + "@zilliqa-js/blockchain": "3.0.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "hash.js": "^1.1.5", + "utility-types": "^2.1.0" + }, + "dependencies": { + "utility-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-2.1.0.tgz", + "integrity": "sha512-/nP2gqavggo6l38rtQI/CdeV+2fmBGXVvHgj9kV2MAnms3TIi77Mz9BtapPFI0+GZQCqqom0vACQ+VlTTaCovw==" + } + } + }, + "@zilliqa-js/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/core/-/core-3.0.0.tgz", + "integrity": "sha512-aDeOqGl2gOZ8LQhCFDGgOX0L8ZX6amnFEIyLc3vXzzQ0vX+jZ19U2q6IFI82eIPNZuUBNrcei0Wefe3D6dyjsw==", + "requires": { + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/util": "3.0.0", + "cross-fetch": "^2.2.2", + "mitt": "^1.1.3" + } + }, + "@zilliqa-js/crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/crypto/-/crypto-3.0.0.tgz", + "integrity": "sha512-vs4xWG8C+/UzqfKNreRfe1TrzKwvXZUI+3BD2X+fTtSST1ZXwX9KRa3T3MdmK252tiYqNhWm/YJBr36lPYRX3A==", + "requires": { + "@zilliqa-js/util": "3.0.0", + "aes-js": "^3.1.1", + "bsert": "^0.0.4", + "elliptic": "^6.5.0", + "hash.js": "^1.1.5", + "hmac-drbg": "^1.0.1", + "pbkdf2": "^3.0.16", + "randombytes": "^2.0.6", + "scrypt-js": "^3.0.1", + "scryptsy": "^2.1.0", + "sodium-native": "^3.2.0", + "uuid": "^3.3.2" + } + }, + "@zilliqa-js/proto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/proto/-/proto-3.0.0.tgz", + "integrity": "sha512-FnLmNica3kZwUY8WbzPyUDM27YnXvWdzReuX87VVrhQgTIfGExOECIep/8ogs465U7CJQtEjxrOTAqSytDBNPA==", + "requires": { + "protobufjs": "^6.8.8" + } + }, + "@zilliqa-js/subscriptions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/subscriptions/-/subscriptions-3.0.0.tgz", + "integrity": "sha512-AmMsgNOTjGOO2TdYr+RUTXHTVnTU8gXeuRDJOpWJfeRQi27tf99zi7GwqbyYiWsPznBqD2BmirBHNxao+QKf6A==", + "requires": { + "@zilliqa-js/core": "3.0.0", + "mock-socket": "^9.0.2", + "websocket": "^1.0.28" + } + }, + "@zilliqa-js/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/util/-/util-3.0.0.tgz", + "integrity": "sha512-4TWHZ8gXmMmRrwkok2Py3YSUXl4udnnmI6EY6UmdtRtKiJl9LEjpGlq0+3YwGAouLrTPPkIxBXXETCDhX6D6Xg==", + "requires": { + "@types/bn.js": "^4.11.3", + "@types/long": "^4.0.0", + "bn.js": "^4.11.8", + "long": "^4.0.0" + } + }, + "@zilliqa-js/zilliqa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@zilliqa-js/zilliqa/-/zilliqa-3.0.0.tgz", + "integrity": "sha512-dG8dXqsIhLs7KS8qCdC8ilP+rOX7wKEQuLG+ra3sdGeJgD283jw8bb05UGzqpmrRKFtG3DybHtYcqcgSWY9uBw==", + "requires": { + "@zilliqa-js/account": "3.0.0", + "@zilliqa-js/blockchain": "3.0.0", + "@zilliqa-js/contract": "3.0.0", + "@zilliqa-js/core": "3.0.0", + "@zilliqa-js/crypto": "3.0.0", + "@zilliqa-js/subscriptions": "3.0.0", + "@zilliqa-js/util": "3.0.0" + } + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "requires": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "requires": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "big.js": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.1.1.tgz", + "integrity": "sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip39": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", + "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", + "requires": { + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "unorm": "^1.3.3" + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserslist": { + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", + "requires": { + "caniuse-lite": "^1.0.30001248", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.793", + "escalade": "^3.1.1", + "node-releases": "^1.1.73" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "bsert": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bsert/-/bsert-0.0.4.tgz", + "integrity": "sha512-VReLe1aTaHRmf80YLOHUk8ONQ48SjseZP76GlNIDheD5REYByn/Mm9yrtI0/ZCaFrcfxzgpiw1/hMMCUOSMa3w==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "cross-fetch": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.5.tgz", + "integrity": "sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w==", + "requires": { + "node-fetch": "2.6.1", + "whatwg-fetch": "2.0.4" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "requires": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "electron-to-chromium": { + "version": "1.3.802", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.802.tgz", + "integrity": "sha512-dXB0SGSypfm3iEDxrb5n/IVKeX4uuTnFHdve7v+yKJqNpEP0D4mjFJ8e1znmSR+OOVlVC+kDO6f2kAkTFXvJBg==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "requires": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "requires": { + "ini": "1.3.7" + }, + "dependencies": { + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hdkey": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.2.tgz", + "integrity": "sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ==", + "requires": { + "bs58check": "^2.1.2", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", + "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "requires": { + "@jest/core": "^27.0.6", + "import-local": "^3.0.2", + "jest-cli": "^27.0.6" + } + }, + "jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "requires": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "requires": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "requires": { + "ci-info": "^3.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==" + }, + "jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "requires": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "requires": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} + }, + "jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==" + }, + "jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "requires": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + } + }, + "jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "requires": { + "ci-info": "^3.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "requires": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "requires": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mock-socket": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.0.3.tgz", + "integrity": "sha512-SxIiD2yE/By79p3cNAAXyLQWTvEFNEzcAO7PH+DzRqKSFaplAPFjiQLmw8ofmpCsZf+Rhfn2/xCJagpdGmYdTw==", + "requires": { + "url-parse": "^1.4.4" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-releases": { + "version": "1.1.74", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", + "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==" + }, + "nodemon": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", + "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.3", + "update-notifier": "^4.1.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, + "secp256k1": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", + "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.5.2", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sodium-native": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-3.2.1.tgz", + "integrity": "sha512-EgDZ/Z7PxL2kCasKk7wnRkV8W9kvwuIlHuHXAxkQm3FF0MgVsjyLBXGjSRGhjE6u7rhSpk3KaMfFM23bfMysIQ==", + "requires": { + "ini": "^1.3.5", + "node-gyp-build": "^4.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-jest": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.4.tgz", + "integrity": "sha512-c4E1ECy9Xz2WGfTMyHbSaArlIva7Wi2p43QOMmCqjSSjHP06KXv+aT+eSY+yZMuqsMi3k7pyGsGj2q5oSl5WfQ==", + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "ts-node": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", + "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", + "devOptional": true, + "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true + } + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/package.json b/reference/continuous-token-bonding-curve-contracts/package.json new file mode 100644 index 000000000..6ed03996f --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/package.json @@ -0,0 +1,35 @@ +{ + "scripts": { + "check": "nodemon", + "test": "npm run test:bancor && npm run test:operator &&npm run test:token", + "test:token": "ts-node ./src/Token/__tests__/run.ts", + "test:bancor": "ts-node ./src/BancorFormula/__tests__/run.ts", + "test:operator": "ts-node ./src/Operator/__tests__/run.ts" + }, + "dependencies": { + "@zilliqa-js/zilliqa": "^3.0.0", + "big.js": "^6.1.1", + "create-hash": "^1.2.0", + "dotenv": "^10.0.0", + "jest": "^27.0.6", + "nodemon": "^2.0.9", + "ts-jest": "^27.0.4", + "websocket": "^1.0.34" + }, + "devDependencies": { + "@types/big.js": "^6.1.1", + "@types/bn.js": "^4.11.6", + "@types/create-hash": "^1.2.2", + "@types/jest": "^27.0.0", + "@types/long": "^4.0.1", + "@types/node": "^16.4.0", + "@types/node-fetch": "^2.5.12", + "@types/prettier": "^2.3.2", + "@types/websocket": "^1.0.4", + "node-fetch": "^2.6.1", + "prettier": "2.3.2", + "ts-node": "^10.0.0", + "tslib": "^2.3.0", + "typescript": "^4.3.5" + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/scillaTest/ScillaServer.ts b/reference/continuous-token-bonding-curve-contracts/scillaTest/ScillaServer.ts new file mode 100644 index 000000000..a101bed20 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/scillaTest/ScillaServer.ts @@ -0,0 +1,54 @@ +import fetch from "node-fetch"; + +export class ScillaServer { + host: string; + + constructor(host: string) { + this.host = host; + } + + /** + * + * @param testBody body of the test to send + * @param gaslimit defaults to 100000 + */ + async runTest({ + testBody, + gaslimit = "100000", + }: { + testBody: { [key: string]: string }; + gaslimit?: string; + }) { + try { + const body = { + ...testBody, + gaslimit, + }; + // console.log(body); + const res = await fetch(`${this.host}/contract/call`, { + method: "POST", + body: JSON.stringify(body), + headers: { + accept: "application/json, text/plain, */*", + "accept-language": "en-GB,en-US;q=0.9,en;q=0.8", + "content-type": "application/json;charset=UTF-8", + "sec-ch-ua": + '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"', + "sec-ch-ua-mobile": "?0", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-site", + }, + }); + const text = await res.text(); + try { + const data = JSON.parse(text); + return data; + } catch (e) { + console.error(text); + } + } catch (e) { + throw e; + } + } +} diff --git a/reference/continuous-token-bonding-curve-contracts/scillaTest/index.ts b/reference/continuous-token-bonding-curve-contracts/scillaTest/index.ts new file mode 100644 index 000000000..f07d3cd35 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/scillaTest/index.ts @@ -0,0 +1,7 @@ +import { ScillaServer } from "./ScillaServer"; + +const scillaServerUrl = "https://scilla-server.zilliqa.com"; +export const scillaServer = new ScillaServer(scillaServerUrl); +export * from "./ScillaServer"; +export * from "./testMaker"; +export { getGasAvg } from "./utill"; diff --git a/reference/continuous-token-bonding-curve-contracts/scillaTest/testMaker.ts b/reference/continuous-token-bonding-curve-contracts/scillaTest/testMaker.ts new file mode 100644 index 000000000..16d189262 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/scillaTest/testMaker.ts @@ -0,0 +1,70 @@ +import { ByStr20, Value } from "../boost-zil"; + +type TransactionData = { + /** + * the signature hash of the source code of the contract that this data interacts with + */ + contractSignature: string; + /** + * contract to send the transaction to + */ + contractAddress: string; + /** + * zil amount to send + */ + amount: string; + /** + * the name of the transition called in the target contract + */ + contractTransitionName: string; + data: any[]; +}; + +export const testMaker = + (code: string) => + (bNum: string) => + (init: Value[]) => + (_balance: string) => + (state: Value[]) => + (from: ByStr20) => + (t: TransactionData) => { + return { + code: code, + init: JSON.stringify([ + { + vname: "_this_address", + type: "ByStr20", + value: "0xabfeccdc9012345678901234567890f777567890", + }, + { + vname: "_creation_block", + type: "BNum", + value: "1", + }, + ...init, + ]), + blockchain: JSON.stringify([ + { + vname: "BLOCKNUMBER", + type: "BNum", + value: bNum, + }, + ]), + output: JSON.stringify([]), + message: JSON.stringify({ + _tag: t.contractTransitionName, + _amount: t.amount, + _sender: from.toSend(), + params: t.data, + _origin: from.toSend(), + }), + state: JSON.stringify([ + ...state, + { + vname: "_balance", + type: "Uint128", + value: _balance, + }, + ]), + }; + }; diff --git a/reference/continuous-token-bonding-curve-contracts/scillaTest/utill.ts b/reference/continuous-token-bonding-curve-contracts/scillaTest/utill.ts new file mode 100644 index 000000000..eef252ed2 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/scillaTest/utill.ts @@ -0,0 +1,64 @@ +import Big from "big.js"; +import { ScillaServer } from "."; +import { BN } from "@zilliqa-js/zilliqa"; + +const FgRed = "\x1b[31m"; +const FgGreen = "\x1b[32m"; +const FgYellow = "\x1b[33m"; +const Reset = "\x1b[0m"; +const FgCyan = "\x1b[36m"; +const FgMagenta = "\x1b[35m"; +const InjectReset = "%s" + Reset; +export const RED = FgRed + InjectReset; +export const GREEN = FgGreen + InjectReset; +export const YELLOW = FgYellow + InjectReset; +export const CYAN = FgCyan + InjectReset; +export const MAGENTA = FgMagenta + InjectReset; + +export type TestingFunction = (code: string, ss: ScillaServer) => Promise; + +export function printResult(result: { result: "error" | "success" }) { + process.stdout.write(result.result == "error" ? " ❌" : " ✅"); +} + +export const testRunner = (ss: ScillaServer) => (scope: string) => { + const allResults: any[] = []; + const allErrors: { result: any; error: Big | unknown }[] = []; + return { + getAllResults: () => { + console.log(""); + return allResults; + }, + getAllErrors: () => { + console.log(""); + return allErrors; + }, + runner: async ( + testBody: any, + errorEval = (response: any) => + console.log(response) as unknown as any + ) => { + try { + const result = await ss.runTest({ testBody }); + allResults.push(result); + allErrors.push({ result, error: errorEval(result) }); + printResult(result); + return result; + } catch (e) { + throw e; + } + }, + }; +}; + +export function getGasAvg(results: any[]) { + const limit = new BN("100000"); + console.log( + `Average gas across ${results.length} tests: `, + results + .map((r) => limit.sub(new BN(r.message.gas_remaining))) + .reduce((prev, cur) => prev.add(cur), new BN(0)) + .div(new BN(results.length)) + .toString() + ); +} diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/BancorFormula.scilla b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/BancorFormula.scilla new file mode 100644 index 000000000..154bdd50d --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/BancorFormula.scilla @@ -0,0 +1,901 @@ +scilla_version 0 +(* + Authors: Mateusz Bednarski https://github.com/MszBednarski + and bancor people: + https://github.com/AragonBlack/fundraising/blob/master/apps/bancor-formula/contracts/BancorFormula.sol +*) + + +import IntUtils ListUtils +library BancorFormula + +let c_MIN_PRECISION = Uint256 32 +let c_MAX_PRECISION = Uint256 127 +let c_MAX_WEIGHT = Uint256 1000000 +let c_FIXED_1 = Uint256 170141183460469231731687303715884105728 +let c_FIXED_2 = Uint256 340282366920938463463374607431768211456 +let c_MAX_NUM = Uint256 680564733841876926926749214863536422912 +let c_OPT_LOG_MAX_VAL = Uint256 462491687273110168575455517921668397539 +let c_OPT_EXP_MAX_VAL = Uint256 2722258935367507707706996859454145691648 +let c_LN2_NUMERATOR = Uint256 5275695611177340518812009417546793976 +let c_LN2_DENOMINATOR = Uint256 7611219895485218073587121647846406784 +let zero_uint128 = Uint128 0 +let zero_uint256 = Uint256 0 +let two_uint256 = Uint256 2 + +let one_msg = + fun (msg : Message) => + let nil_msg = Nil {Message} in + Cons {Message} msg nil_msg + +type Error = +| CodeInputIsZero +| CodeInputNotInBounds + +let make_error = + fun (result : Error) => + let result_code = + match result with + | CodeInputIsZero => Int32 -1 + | CodeInputNotInBounds => Int32 -2 + end + in + { _exception : "Error"; code : result_code } + +(* implements (x * y) / z *) +let muldiv: Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(y: Uint256) => fun(z: Uint256) => + let xy = builtin mul x y in + builtin div xy z + +(* implements (x*y)+z *) +let muladd: Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(y: Uint256) => fun(z: Uint256) => + let xy = builtin mul x y in + builtin add xy z + +(* implements ((x * (k - b)) / z ) + r *) +let submuldivadd: Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(k: Uint256) => fun(b: Uint256) => fun(z: Uint256) => fun(r: Uint256) => + let k_sub_b = builtin sub k b in + let tmp = muldiv x k_sub_b z in + builtin add tmp r + +(* used to panic, divides by zero! *) +let panic: Uint256 -> Uint256 = + fun(numerator: Uint256) => + builtin div zero_uint256 zero_uint256 + +(* used to panic with a different return type *) +let panic_uint128: Uint128 -> Uint128 = + fun(numerator: Uint128) => + let one = Uint128 1 in + let zero = Uint128 0 in + builtin div one zero + +let uint128_to_uint256: Uint128 -> Uint256 = + fun (x: Uint128) => + let ox256 = builtin to_uint256 x in + match ox256 with + | None => + (* this never happens, hence we throw a division by zero exception just in case *) + panic zero_uint256 + | Some x256 => x256 + end +let uint256_to_uint32: Uint256 -> Uint32 = + fun (x: Uint256) => + let ores32 = builtin to_uint32 x in + match ores32 with + | None => + (* this must never happen, panic by dividing by zero *) + let zero = Uint32 0 in + let one = Uint32 1 in + (* do the trick *) + builtin div one zero + | Some res32 => + res32 + end +(* wrap the builtin power second argument is Uint32 because it is annoying, panic if conversion fails *) +(* calculate x^y *) +let pow_uint256: Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(y: Uint256) => + let y_32 = uint256_to_uint32 y in + builtin pow x y_32 + +let uint256_to_uint128: Uint256 -> Uint128 = + fun (x: Uint256) => + let ores128 = builtin to_uint128 x in + match ores128 with + | None => + (* this must never happen, panic by dividing by zero *) + let zero = Uint128 0 in + panic_uint128 zero + | Some res128 => + res128 + end + +(* + Return log(x / c_FIXED_1) * c_FIXED_1 + Input range: c_FIXED_1 <= x <= LOG_EXP_MAX_VAL - 1 + Detailed description: + - Rewrite the input as a product of natural exponents and a single residual r, such that 1 < r < 2 + - The natural logarithm of each (pre-calculated) exponent is the degree of the exponent + - The natural logarithm of r is calculated via Taylor series for log(1 + x), where x = r - 1 + - The natural logarithm of the input is calculated by summing up the intermediate results above + - For example: log(250) = log(e^4 * e^1 * e^0.5 * 1.021692859) = 4 + 1 + 0.5 + log(1 + 0.021692859) +*) +type ThresholdAndToAdd = | ThresholdAndToAdd of Uint256 Uint256 +type XAndRes = | XAndRes of Uint256 Uint256 +let optimalLog: Uint256 -> Uint256 = + fun(x: Uint256) => + (* build the list for foldl *) + (* Auto-generated via # Generate optimal log part 1 .ipynb *) + let threshold_val0 = Uint256 280515388193368458015406427511040113880 in + let to_add0 = Uint256 85070591730234615865843651857942052864 in + let threshold0 = ThresholdAndToAdd threshold_val0 to_add0 in (* add 1 / 2^1 *) + let threshold_val1 = Uint256 218465603988574474844591417643679820199 in + let to_add1 = Uint256 42535295865117307932921825928971026432 in + let threshold1 = ThresholdAndToAdd threshold_val1 to_add1 in (* add 1 / 2^2 *) + let threshold_val2 = Uint256 192795218841189805222451540510555621025 in + let to_add2 = Uint256 21267647932558653966460912964485513216 in + let threshold2 = ThresholdAndToAdd threshold_val2 to_add2 in (* add 1 / 2^3 *) + let threshold_val3 = Uint256 181114347027396448854165353426875372712 in + let to_add3 = Uint256 10633823966279326983230456482242756608 in + let threshold3 = ThresholdAndToAdd threshold_val3 to_add3 in (* add 1 / 2^4 *) + let threshold_val4 = Uint256 175542044379434494067323265867529472979 in + let to_add4 = Uint256 5316911983139663491615228241121378304 in + let threshold4 = ThresholdAndToAdd threshold_val4 to_add4 in (* add 1 / 2^5 *) + let threshold_val5 = Uint256 172820517236198538127967385733353125282 in + let to_add5 = Uint256 2658455991569831745807614120560689152 in + let threshold5 = ThresholdAndToAdd threshold_val5 to_add5 in (* add 1 / 2^6 *) + let threshold_val6 = Uint256 171475617301169790829459146906809945753 in + let to_add6 = Uint256 1329227995784915872903807060280344576 in + let threshold6 = ThresholdAndToAdd threshold_val6 to_add6 in (* add 1 / 2^7 *) + let threshold_val7 = Uint256 170807097224429000759274174605493073715 in + let to_add7 = Uint256 664613997892457936451903530140172288 in + let threshold7 = ThresholdAndToAdd threshold_val7 to_add7 in (* add 1 / 2^8 *) + + let nil = Nil {ThresholdAndToAdd} in + let l0 = Cons {ThresholdAndToAdd} threshold0 nil in + let l1 = Cons {ThresholdAndToAdd} threshold1 l0 in + let l2 = Cons {ThresholdAndToAdd} threshold2 l1 in + let l3 = Cons {ThresholdAndToAdd} threshold3 l2 in + let l4 = Cons {ThresholdAndToAdd} threshold4 l3 in + let l5 = Cons {ThresholdAndToAdd} threshold5 l4 in + let l6 = Cons {ThresholdAndToAdd} threshold6 l5 in + let l7 = Cons {ThresholdAndToAdd} threshold7 l6 in + + let folder_stage_1 = fun(x_and_res: XAndRes) => fun(threshold_and_to_add: ThresholdAndToAdd) => + match x_and_res with + | XAndRes local_x local_res => + match threshold_and_to_add with + | ThresholdAndToAdd threshold to_add => + let x_ge = uint256_ge local_x threshold in + match x_ge with + | True => + let newRes = builtin add local_res to_add in + let newX = muldiv local_x c_FIXED_1 threshold in + XAndRes newX newRes + | False => XAndRes local_x local_res + end + end + end in + + let fold_stage_1 = @list_foldl ThresholdAndToAdd XAndRes in + + let xAndResInit = XAndRes x zero_uint256 in + + let stage_1_x_and_res = fold_stage_1 folder_stage_1 xAndResInit l7 in + match stage_1_x_and_res with + | XAndRes x_1 local_res_0 => + (* now taylor series *) + (* Auto-generated via # Generate optimal log part 2 .ipynb *) + let y = builtin sub x_1 c_FIXED_1 in + let z0 = y in + let w = muldiv y y c_FIXED_1 in + + (* ((x * (k - b)) / z ) + r *) + let numerator1 = Uint256 340282366920938463463374607431768211456 in + let denominator1 = Uint256 340282366920938463463374607431768211456 in + let local_res_1 = submuldivadd z0 numerator1 y denominator1 local_res_0 in let z1 = muldiv z0 w c_FIXED_1 in (* add y^01 / 01 - y^02 / 02 *) + let numerator2 = Uint256 226854911280625642308916404954512140970 in + let denominator2 = Uint256 680564733841876926926749214863536422912 in + let local_res_2 = submuldivadd z1 numerator2 y denominator2 local_res_1 in let z2 = muldiv z1 w c_FIXED_1 in (* add y^03 / 03 - y^04 / 04 *) + let numerator3 = Uint256 204169420152563078078024764459060926873 in + let denominator3 = Uint256 1020847100762815390390123822295304634368 in + let local_res_3 = submuldivadd z2 numerator3 y denominator3 local_res_2 in let z3 = muldiv z2 w c_FIXED_1 in (* add y^05 / 05 - y^06 / 06 *) + let numerator4 = Uint256 194447066811964836264785489961010406546 in + let denominator4 = Uint256 1361129467683753853853498429727072845824 in + let local_res_4 = submuldivadd z3 numerator4 y denominator4 local_res_3 in let z4 = muldiv z3 w c_FIXED_1 in (* add y^07 / 07 - y^08 / 08 *) + let numerator5 = Uint256 189045759400521368590763670795426784142 in + let denominator5 = Uint256 1701411834604692317316873037158841057280 in + let local_res_5 = submuldivadd z4 numerator5 y denominator5 local_res_4 in let z5 = muldiv z4 w c_FIXED_1 in (* add y^09 / 09 - y^10 / 10 *) + let numerator6 = Uint256 185608563775057343707295240417328115339 in + let denominator6 = Uint256 2041694201525630780780247644590609268736 in + let local_res_6 = submuldivadd z5 numerator6 y denominator6 local_res_5 in let z6 = muldiv z5 w c_FIXED_1 in (* add y^11 / 11 - y^12 / 12 *) + let numerator7 = Uint256 183228966803582249557201711694029036937 in + let denominator7 = Uint256 2381976568446569244243622252022377480192 in + let local_res_7 = submuldivadd z6 numerator7 y denominator7 local_res_6 in let z7 = muldiv z6 w c_FIXED_1 in (* add y^13 / 13 - y^14 / 14 *) + let numerator8 = Uint256 181483929024500513847133123963609712776 in + let denominator8 = Uint256 2722258935367507707706996859454145691648 in + let local_res_8 = submuldivadd z7 numerator8 y denominator8 local_res_7 in (* add y^15 / 15 - y^16 / 16 *) + (* done! *) + local_res_8 + end + +(* + Compute the largest integer smaller than or equal to the binary logarithm of the input. +*) +type NAndRes = | NAndRes of Uint256 Uint256 +let floorLog2: Uint256 -> Uint256 = + fun(in_n: Uint256) => + let nil = Nil {Uint256} in + let i_temp1 = Uint256 1 in let l1 = Cons {Uint256} i_temp1 nil in let i_temp2 = Uint256 2 in let l2 = Cons {Uint256} i_temp2 l1 in let i_temp3 = Uint256 4 in let l3 = Cons {Uint256} i_temp3 l2 in let i_temp4 = Uint256 8 in let l4 = Cons {Uint256} i_temp4 l3 in let i_temp5 = Uint256 16 in let l5 = Cons {Uint256} i_temp5 l4 in let i_temp6 = Uint256 32 in let l6 = Cons {Uint256} i_temp6 l5 in let i_temp7 = Uint256 64 in let l7 = Cons {Uint256} i_temp7 l6 in let i_temp8 = Uint256 128 in let l8 = Cons {Uint256} i_temp8 l7 in + let uint256_256 = Uint256 256 in + let in_n_lt_256 = uint256_lt in_n uint256_256 in + let init = NAndRes in_n zero_uint256 in + let result_n_and_res = match in_n_lt_256 with + | True => + let folder: NAndRes -> Uint256 -> Option NAndRes = + fun(local_n_and_res: NAndRes) => fun(index: Uint256) => + match local_n_and_res with + | NAndRes local_n local_res => + let one = Uint256 1 in + let local_n_gt_one = uint256_gt local_n one in + match local_n_gt_one with + | False => None {NAndRes} + | True => + let new_n = builtin div local_n two_uint256 in + let new_res = builtin add local_res one in + let tmp = NAndRes new_n new_res in + Some {NAndRes} tmp + end + end in + let fold = @list_foldl_while Uint256 NAndRes in + fold folder init l8 + | False => + let folder: NAndRes -> Uint256 -> NAndRes = + fun(local_n_and_res: NAndRes) => fun(bits: Uint256) => + match local_n_and_res with + | NAndRes local_n local_res => + let two_pow_bits = pow_uint256 two_uint256 bits in + let n_ge_two_pow_bits = uint256_ge local_n two_pow_bits in + match n_ge_two_pow_bits with + | True => + (* divide by biggest component *) + let new_n = builtin div local_n two_pow_bits in + (* add exponent *) + let new_res = builtin add local_res bits in + NAndRes new_n new_res + | False => NAndRes local_n local_res + end + end in + let fold = @list_foldl Uint256 NAndRes in + fold folder init l8 + end in + match result_n_and_res with + | NAndRes result_n result_res => result_res + end + +(* + Compute log(x / c_FIXED_1) * c_FIXED_1. + This functions assumes that "x >= c_FIXED_1", because the output would be negative otherwise. +*) +type ResAndX = | ResAndX of Uint256 Uint256 +let generalLog: Uint256 -> Uint256 = + fun(x: Uint256) => + (* If x >= 2, then we compute the integer part of log2(x), which is larger than 0. *) + let x_ge_two = uint256_ge x c_FIXED_2 in + let res_and_x = match x_ge_two with + | True => + let x_div_c_FIXED_1 = builtin div x c_FIXED_1 in + let count = floorLog2 x_div_c_FIXED_1 in + let two_pow_count = pow_uint256 two_uint256 count in + let xshifted = builtin div x two_pow_count in (* now x < 2 *) + let newRes = builtin mul count c_FIXED_1 in + ResAndX newRes xshifted + | False => ResAndX zero_uint256 x + end in + match res_and_x with + | ResAndX res1 x1 => + (* If x > 1, then we compute the fraction part of log2(x), which is larger than 0. *) + let x1_gt_c_FIXED_1 = uint256_gt x1 c_FIXED_1 in + match x1_gt_c_FIXED_1 with + | True => + (* autogenerated by generate floorLog2 loop *) + let nil = Nil {Uint256} in + let i_temp1 = Uint256 1 in let l1 = Cons {Uint256} i_temp1 nil in let i_temp2 = Uint256 2 in let l2 = Cons {Uint256} i_temp2 l1 in let i_temp3 = Uint256 3 in let l3 = Cons {Uint256} i_temp3 l2 in let i_temp4 = Uint256 4 in let l4 = Cons {Uint256} i_temp4 l3 in let i_temp5 = Uint256 5 in let l5 = Cons {Uint256} i_temp5 l4 in let i_temp6 = Uint256 6 in let l6 = Cons {Uint256} i_temp6 l5 in let i_temp7 = Uint256 7 in let l7 = Cons {Uint256} i_temp7 l6 in let i_temp8 = Uint256 8 in let l8 = Cons {Uint256} i_temp8 l7 in let i_temp9 = Uint256 9 in let l9 = Cons {Uint256} i_temp9 l8 in let i_temp10 = Uint256 10 in let l10 = Cons {Uint256} i_temp10 l9 in let i_temp11 = Uint256 11 in let l11 = Cons {Uint256} i_temp11 l10 in let i_temp12 = Uint256 12 in let l12 = Cons {Uint256} i_temp12 l11 in let i_temp13 = Uint256 13 in let l13 = Cons {Uint256} i_temp13 l12 in let i_temp14 = Uint256 14 in let l14 = Cons {Uint256} i_temp14 l13 in let i_temp15 = Uint256 15 in let l15 = Cons {Uint256} i_temp15 l14 in let i_temp16 = Uint256 16 in let l16 = Cons {Uint256} i_temp16 l15 in let i_temp17 = Uint256 17 in let l17 = Cons {Uint256} i_temp17 l16 in let i_temp18 = Uint256 18 in let l18 = Cons {Uint256} i_temp18 l17 in let i_temp19 = Uint256 19 in let l19 = Cons {Uint256} i_temp19 l18 in let i_temp20 = Uint256 20 in let l20 = Cons {Uint256} i_temp20 l19 in let i_temp21 = Uint256 21 in let l21 = Cons {Uint256} i_temp21 l20 in let i_temp22 = Uint256 22 in let l22 = Cons {Uint256} i_temp22 l21 in + let i_temp23 = Uint256 23 in let l23 = Cons {Uint256} i_temp23 l22 in let i_temp24 = Uint256 24 in let l24 = Cons {Uint256} i_temp24 l23 in let i_temp25 = Uint256 25 in let l25 = Cons {Uint256} i_temp25 l24 in let i_temp26 = Uint256 26 in let l26 = Cons {Uint256} i_temp26 l25 in let i_temp27 = Uint256 27 in let l27 = Cons {Uint256} i_temp27 l26 in let i_temp28 = Uint256 28 in let l28 = Cons {Uint256} i_temp28 l27 in let i_temp29 = Uint256 29 in let l29 = Cons {Uint256} i_temp29 l28 in let i_temp30 = Uint256 30 in let l30 = Cons {Uint256} i_temp30 l29 in let i_temp31 = Uint256 31 in let l31 = Cons {Uint256} i_temp31 l30 in let i_temp32 = Uint256 32 in let l32 = Cons {Uint256} i_temp32 l31 in let i_temp33 = Uint256 33 in let l33 = Cons {Uint256} i_temp33 l32 in let i_temp34 = Uint256 34 in let l34 = Cons {Uint256} i_temp34 l33 in let i_temp35 = Uint256 35 in let l35 = Cons {Uint256} i_temp35 l34 in let i_temp36 = Uint256 36 in let l36 = Cons {Uint256} i_temp36 l35 in let i_temp37 = Uint256 37 in let l37 = Cons {Uint256} i_temp37 l36 in let i_temp38 = Uint256 38 in let l38 = Cons {Uint256} i_temp38 l37 in let i_temp39 = Uint256 39 in let l39 = Cons {Uint256} i_temp39 l38 in let i_temp40 = Uint256 40 in let l40 = Cons {Uint256} i_temp40 l39 in let i_temp41 = Uint256 41 in let l41 = Cons {Uint256} i_temp41 l40 in let i_temp42 = Uint256 42 in let l42 = Cons {Uint256} i_temp42 l41 in let i_temp43 = Uint256 43 in let l43 = Cons {Uint256} i_temp43 l42 in + let i_temp44 = Uint256 44 in let l44 = Cons {Uint256} i_temp44 l43 in let i_temp45 = Uint256 45 in let l45 = Cons {Uint256} i_temp45 l44 in let i_temp46 = Uint256 46 in let l46 = Cons {Uint256} i_temp46 l45 in let i_temp47 = Uint256 47 in let l47 = Cons {Uint256} i_temp47 l46 in let i_temp48 = Uint256 48 in let l48 = Cons {Uint256} i_temp48 l47 in let i_temp49 = Uint256 49 in let l49 = Cons {Uint256} i_temp49 l48 in let i_temp50 = Uint256 50 in let l50 = Cons {Uint256} i_temp50 l49 in let i_temp51 = Uint256 51 in let l51 = Cons {Uint256} i_temp51 l50 in let i_temp52 = Uint256 52 in let l52 = Cons {Uint256} i_temp52 l51 in let i_temp53 = Uint256 53 in let l53 = Cons {Uint256} i_temp53 l52 in let i_temp54 = Uint256 54 in let l54 = Cons {Uint256} i_temp54 l53 in let i_temp55 = Uint256 55 in let l55 = Cons {Uint256} i_temp55 l54 in let i_temp56 = Uint256 56 in let l56 = Cons {Uint256} i_temp56 l55 in let i_temp57 = Uint256 57 in let l57 = Cons {Uint256} i_temp57 l56 in let i_temp58 = Uint256 58 in let l58 = Cons {Uint256} i_temp58 l57 in let i_temp59 = Uint256 59 in let l59 = Cons {Uint256} i_temp59 l58 in let i_temp60 = Uint256 60 in let l60 = Cons {Uint256} i_temp60 l59 in let i_temp61 = Uint256 61 in let l61 = Cons {Uint256} i_temp61 l60 in let i_temp62 = Uint256 62 in let l62 = Cons {Uint256} i_temp62 l61 in let i_temp63 = Uint256 63 in let l63 = Cons {Uint256} i_temp63 l62 in let i_temp64 = Uint256 64 in let l64 = Cons {Uint256} i_temp64 l63 in + let i_temp65 = Uint256 65 in let l65 = Cons {Uint256} i_temp65 l64 in let i_temp66 = Uint256 66 in let l66 = Cons {Uint256} i_temp66 l65 in let i_temp67 = Uint256 67 in let l67 = Cons {Uint256} i_temp67 l66 in let i_temp68 = Uint256 68 in let l68 = Cons {Uint256} i_temp68 l67 in let i_temp69 = Uint256 69 in let l69 = Cons {Uint256} i_temp69 l68 in let i_temp70 = Uint256 70 in let l70 = Cons {Uint256} i_temp70 l69 in let i_temp71 = Uint256 71 in let l71 = Cons {Uint256} i_temp71 l70 in let i_temp72 = Uint256 72 in let l72 = Cons {Uint256} i_temp72 l71 in let i_temp73 = Uint256 73 in let l73 = Cons {Uint256} i_temp73 l72 in let i_temp74 = Uint256 74 in let l74 = Cons {Uint256} i_temp74 l73 in let i_temp75 = Uint256 75 in let l75 = Cons {Uint256} i_temp75 l74 in let i_temp76 = Uint256 76 in let l76 = Cons {Uint256} i_temp76 l75 in let i_temp77 = Uint256 77 in let l77 = Cons {Uint256} i_temp77 l76 in let i_temp78 = Uint256 78 in let l78 = Cons {Uint256} i_temp78 l77 in let i_temp79 = Uint256 79 in let l79 = Cons {Uint256} i_temp79 l78 in let i_temp80 = Uint256 80 in let l80 = Cons {Uint256} i_temp80 l79 in let i_temp81 = Uint256 81 in let l81 = Cons {Uint256} i_temp81 l80 in let i_temp82 = Uint256 82 in let l82 = Cons {Uint256} i_temp82 l81 in let i_temp83 = Uint256 83 in let l83 = Cons {Uint256} i_temp83 l82 in let i_temp84 = Uint256 84 in let l84 = Cons {Uint256} i_temp84 l83 in let i_temp85 = Uint256 85 in let l85 = Cons {Uint256} i_temp85 l84 in + let i_temp86 = Uint256 86 in let l86 = Cons {Uint256} i_temp86 l85 in let i_temp87 = Uint256 87 in let l87 = Cons {Uint256} i_temp87 l86 in let i_temp88 = Uint256 88 in let l88 = Cons {Uint256} i_temp88 l87 in let i_temp89 = Uint256 89 in let l89 = Cons {Uint256} i_temp89 l88 in let i_temp90 = Uint256 90 in let l90 = Cons {Uint256} i_temp90 l89 in let i_temp91 = Uint256 91 in let l91 = Cons {Uint256} i_temp91 l90 in let i_temp92 = Uint256 92 in let l92 = Cons {Uint256} i_temp92 l91 in let i_temp93 = Uint256 93 in let l93 = Cons {Uint256} i_temp93 l92 in let i_temp94 = Uint256 94 in let l94 = Cons {Uint256} i_temp94 l93 in let i_temp95 = Uint256 95 in let l95 = Cons {Uint256} i_temp95 l94 in let i_temp96 = Uint256 96 in let l96 = Cons {Uint256} i_temp96 l95 in let i_temp97 = Uint256 97 in let l97 = Cons {Uint256} i_temp97 l96 in let i_temp98 = Uint256 98 in let l98 = Cons {Uint256} i_temp98 l97 in let i_temp99 = Uint256 99 in let l99 = Cons {Uint256} i_temp99 l98 in let i_temp100 = Uint256 100 in let l100 = Cons {Uint256} i_temp100 l99 in let i_temp101 = Uint256 101 in let l101 = Cons {Uint256} i_temp101 l100 in let i_temp102 = Uint256 102 in let l102 = Cons {Uint256} i_temp102 l101 in let i_temp103 = Uint256 103 in let l103 = Cons {Uint256} i_temp103 l102 in let i_temp104 = Uint256 104 in let l104 = Cons {Uint256} i_temp104 l103 in let i_temp105 = Uint256 105 in let l105 = Cons {Uint256} i_temp105 l104 in + let i_temp106 = Uint256 106 in let l106 = Cons {Uint256} i_temp106 l105 in let i_temp107 = Uint256 107 in let l107 = Cons {Uint256} i_temp107 l106 in let i_temp108 = Uint256 108 in let l108 = Cons {Uint256} i_temp108 l107 in let i_temp109 = Uint256 109 in let l109 = Cons {Uint256} i_temp109 l108 in let i_temp110 = Uint256 110 in let l110 = Cons {Uint256} i_temp110 l109 in let i_temp111 = Uint256 111 in let l111 = Cons {Uint256} i_temp111 l110 in let i_temp112 = Uint256 112 in let l112 = Cons {Uint256} i_temp112 l111 in let i_temp113 = Uint256 113 in let l113 = Cons {Uint256} i_temp113 l112 in let i_temp114 = Uint256 114 in let l114 = Cons {Uint256} i_temp114 l113 in let i_temp115 = Uint256 115 in let l115 = Cons {Uint256} i_temp115 l114 in let i_temp116 = Uint256 116 in let l116 = Cons {Uint256} i_temp116 l115 in let i_temp117 = Uint256 117 in let l117 = Cons {Uint256} i_temp117 l116 in let i_temp118 = Uint256 118 in let l118 = Cons {Uint256} i_temp118 l117 in let i_temp119 = Uint256 119 in let l119 = Cons {Uint256} i_temp119 l118 in let i_temp120 = Uint256 120 in let l120 = Cons {Uint256} i_temp120 l119 in let i_temp121 = Uint256 121 in let l121 = Cons {Uint256} i_temp121 l120 in let i_temp122 = Uint256 122 in let l122 = Cons {Uint256} i_temp122 l121 in let i_temp123 = Uint256 123 in let l123 = Cons {Uint256} i_temp123 l122 in let i_temp124 = Uint256 124 in let l124 = Cons {Uint256} i_temp124 l123 in + let i_temp125 = Uint256 125 in let l125 = Cons {Uint256} i_temp125 l124 in let i_temp126 = Uint256 126 in let l126 = Cons {Uint256} i_temp126 l125 in let i_temp127 = Uint256 127 in let l127 = Cons {Uint256} i_temp127 l126 in + let folder = fun(cur_res_and_x: ResAndX) => fun(i: Uint256) => + match cur_res_and_x with + | ResAndX local_res local_x => + let new_x = muldiv local_x local_x c_FIXED_1 in (* now 1 < x < 4 *) + let new_x_ge_two = uint256_ge new_x c_FIXED_2 in + match new_x_ge_two with + | True => + let shiftedX = builtin div new_x two_uint256 in + let one = Uint256 1 in + let i_minus_one = builtin sub i one in + let two_pow_i_minus_one = pow_uint256 two_uint256 i_minus_one in + let oneShifted = builtin mul one two_pow_i_minus_one in + let newRes = builtin add local_res oneShifted in + ResAndX newRes shiftedX + | False => ResAndX local_res new_x + end + end in + let fold = @list_foldl Uint256 ResAndX in + let init = ResAndX res1 x1 in + let result_res_and_x = fold folder init l127 in + match result_res_and_x with + | ResAndX res2 x2 => + muldiv res2 c_LN2_NUMERATOR c_LN2_DENOMINATOR + end + | False => muldiv res1 c_LN2_NUMERATOR c_LN2_DENOMINATOR + end + end + +(* implements both optimal log and general log to provide an abstraction layer for log *) +let log: Uint256 -> Uint256 = + fun(base: Uint256) => + let can_do_optimal_log = uint256_lt base c_OPT_LOG_MAX_VAL in + match can_do_optimal_log with + | True => optimalLog base + | False => generalLog base + end + +(* @result is the result of the apply of the power function *) +(* @precision is 2^numberOfBitsOfPrecision *) +type PowerResultAndPrecision = +| PowerResultAndPrecision of Uint256 Uint256 + +(* this is used as a guard in the power function *) +let panic_if_uint256_not_lt_uint256: Uint256 -> Uint256 -> Bool = + fun(i1: Uint256) => fun(i2: Uint256) => + let is_less_than = uint256_lt i1 i2 in + let tmp = match is_less_than with | True => zero_uint256 | False => panic zero_uint256 end in + is_less_than + +(* + Return e ^ (x / c_FIXED_1) * c_FIXED_1 + Input range: 0 <= x <= c_c_OPT_EXP_MAX_VAL - 1 + Auto-generated via 'PrintFunctionOptimalExp.py' + Detailed description: + - Rewrite the input as a sum of binary exponents and a single residual r, as small as possible + - The exponentiation of each binary exponent is given (pre-calculated) + - The exponentiation of r is calculated via Taylor series for e^x, where x = r + - The exponentiation of the input is calculated by multiplying the intermediate results above + - For example: e^5.521692859 = e^(4 + 1 + 0.5 + 0.021692859) = e^4 * e^1 * e^0.5 * e^0.021692859 +*) +let optimalExp: Uint256 -> Uint256 = fun(x: Uint256) => + let res1 = Uint256 0 in + let two_pow_minus_three = Uint256 21267647932558653966460912964485513216 in + let z1 = builtin rem x two_pow_minus_three in (* get the input modulo 2^(-3) *) + let y = z1 in + let z2 = muldiv z1 y c_FIXED_1 in let tmp2 = Uint256 1216451004088320000 in let res2 = muladd z2 tmp2 res1 in (* add y^2 * (20! / 2!) *) + let z3 = muldiv z2 y c_FIXED_1 in let tmp3 = Uint256 405483668029440000 in let res3 = muladd z3 tmp3 res2 in (* add y^3 * (20! / 3!) *) + let z4 = muldiv z3 y c_FIXED_1 in let tmp4 = Uint256 101370917007360000 in let res4 = muladd z4 tmp4 res3 in (* add y^4 * (20! / 4!) *) + let z5 = muldiv z4 y c_FIXED_1 in let tmp5 = Uint256 20274183401472000 in let res5 = muladd z5 tmp5 res4 in (* add y^5 * (20! / 5!) *) + let z6 = muldiv z5 y c_FIXED_1 in let tmp6 = Uint256 3379030566912000 in let res6 = muladd z6 tmp6 res5 in (* add y^6 * (20! / 6!) *) + let z7 = muldiv z6 y c_FIXED_1 in let tmp7 = Uint256 482718652416000 in let res7 = muladd z7 tmp7 res6 in (* add y^7 * (20! / 7!) *) + let z8 = muldiv z7 y c_FIXED_1 in let tmp8 = Uint256 60339831552000 in let res8 = muladd z8 tmp8 res7 in (* add y^8 * (20! / 8!) *) + let z9 = muldiv z8 y c_FIXED_1 in let tmp9 = Uint256 6704425728000 in let res9 = muladd z9 tmp9 res8 in (* add y^9 * (20! / 9!) *) + let z10 = muldiv z9 y c_FIXED_1 in let tmp10 = Uint256 670442572800 in let res10 = muladd z10 tmp10 res9 in (* add y^10 * (20! / 10!) *) + let z11 = muldiv z10 y c_FIXED_1 in let tmp11 = Uint256 60949324800 in let res11 = muladd z11 tmp11 res10 in (* add y^11 * (20! / 11!) *) + let z12 = muldiv z11 y c_FIXED_1 in let tmp12 = Uint256 5079110400 in let res12 = muladd z12 tmp12 res11 in (* add y^12 * (20! / 12!) *) + let z13 = muldiv z12 y c_FIXED_1 in let tmp13 = Uint256 390700800 in let res13 = muladd z13 tmp13 res12 in (* add y^13 * (20! / 13!) *) + let z14 = muldiv z13 y c_FIXED_1 in let tmp14 = Uint256 27907200 in let res14 = muladd z14 tmp14 res13 in (* add y^14 * (20! / 14!) *) + let z15 = muldiv z14 y c_FIXED_1 in let tmp15 = Uint256 1860480 in let res15 = muladd z15 tmp15 res14 in (* add y^15 * (20! / 15!) *) + let z16 = muldiv z15 y c_FIXED_1 in let tmp16 = Uint256 116280 in let res16 = muladd z16 tmp16 res15 in (* add y^16 * (20! / 16!) *) + let z17 = muldiv z16 y c_FIXED_1 in let tmp17 = Uint256 6840 in let res17 = muladd z17 tmp17 res16 in (* add y^17 * (20! / 17!) *) + let z18 = muldiv z17 y c_FIXED_1 in let tmp18 = Uint256 380 in let res18 = muladd z18 tmp18 res17 in (* add y^18 * (20! / 18!) *) + let z19 = muldiv z18 y c_FIXED_1 in let tmp19 = Uint256 20 in let res19 = muladd z19 tmp19 res18 in (* add y^19 * (20! / 19!) *) + let z20 = muldiv z19 y c_FIXED_1 in let tmp20 = Uint256 1 in let res20 = muladd z20 tmp20 res19 in (* add y^20 * (20! / 20!) *) + let y_add_c_FIXED_1 = builtin add y c_FIXED_1 in + let fac20 = Uint256 2432902008176640000 in + let res_div_fac_20 = builtin div res20 fac20 in + let res21 = builtin add res_div_fac_20 y_add_c_FIXED_1 in (* divide by 20! and then add y^1 / 1! + y^0 / 0 *) + + (* ex: if ((x & 0x010000000000000000000000000000000) != 0) res = res * 0x1c3d6a24ed82218787d624d3e5eba95f9 / 0x18ebef9eac820ae8682b9793ac6d1e776; *) + let if_contains_muldiv: Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(local_x: Uint256) => fun(bits: Uint256) => fun(res: Uint256) => fun(numerator: Uint256) => fun(denominator: Uint256) => + let one = Uint256 1 in + let bits_add_one = builtin add bits one in + let two_pow_bits_add_one = pow_uint256 two_uint256 bits_add_one in + let x_mod_condition = builtin rem local_x two_pow_bits_add_one in + let two_pow_bits = pow_uint256 two_uint256 bits in + let modded_div_bits = builtin div x_mod_condition two_pow_bits in + let x_not_contains = builtin eq zero_uint256 modded_div_bits in + match x_not_contains with + | True => res + | False => muldiv res numerator denominator + end in + + (* if bit 124 set then multiply by e^2^(-3)*) + let res22 = let bits = Uint256 124 in let numerator = Uint256 600596269623765960634066700837880239609 in let denominator = Uint256 530024347646835984032474664511850276726 in if_contains_muldiv x bits res21 numerator denominator in + (* if bit 125 set then multiply by e^2^(-2)*) + let res23 = let bits = Uint256 125 in let numerator = Uint256 530024347646835984032474664511850276728 in let denominator = Uint256 412783376994266390547521411024565284564 in if_contains_muldiv x bits res22 numerator denominator in + (* if bit 126 set then multiply by e^2^(-1)*) + let res24 = let bits = Uint256 126 in let numerator = Uint256 412783376994266390547521411024565284565 in let denominator = Uint256 250365773966741064234501452596301656607 in if_contains_muldiv x bits res23 numerator denominator in + (* if bit 127 set then multiply by e^2^(0)*) + let res25 = let bits = Uint256 127 in let numerator = Uint256 250365773966741064234501452596301656606 in let denominator = Uint256 92104421015340344839251721785254237641 in if_contains_muldiv x bits res24 numerator denominator in + (* if bit 128 set then multiply by e^2^(1)*) + let res26 = let bits = Uint256 128 in let numerator = Uint256 92104421015340344839251721785254237637 in let denominator = Uint256 12464977905455307901915658421775307242 in if_contains_muldiv x bits res25 numerator denominator in + (* if bit 129 set then multiply by e^2^(2)*) + let res27 = let bits = Uint256 129 in let numerator = Uint256 12464977905455307901915658421775307223 in let denominator = Uint256 228304034072369565894155946646425149 in if_contains_muldiv x bits res26 numerator denominator in + (* if bit 130 set then multiply by e^2^(3)*) + let res28 = let bits = Uint256 130 in let numerator = Uint256 228304034072369565894155946646422279 in let denominator = Uint256 76587471230661696290698490699025 in if_contains_muldiv x bits res27 numerator denominator in + res28 + + +(* + The "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent: + - This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"] + - This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"] +*) +type PrecisionAndMax = | PrecisionAndMax of Uint256 Uint256 +let findPositionInMaxExpArray: Uint256 -> Uint256 = fun(x: Uint256) => +let res31 = PrecisionAndMax zero_uint256 zero_uint256 in +let setNewIfXSmaller: PrecisionAndMax -> Uint256 -> Uint256 -> PrecisionAndMax = + fun(prev: PrecisionAndMax) => fun(arrIndex: Uint256) => fun(val: Uint256) => + let x_lt_val = uint256_lt x val in + match x_lt_val with | True => PrecisionAndMax arrIndex val | False => prev end in + let res32 = let arrIndex = Uint256 32 in let val = Uint256 9599678685041259184274752310158947254271 in setNewIfXSmaller res31 arrIndex val in + let res33 = let arrIndex = Uint256 33 in let val = Uint256 9204759687141885226475603015507577405439 in setNewIfXSmaller res32 arrIndex val in + let res34 = let arrIndex = Uint256 34 in let val = Uint256 8826087172077985712041017634911355404287 in setNewIfXSmaller res33 arrIndex val in + let res35 = let arrIndex = Uint256 35 in let val = Uint256 8462992779488582574159642900919291478015 in setNewIfXSmaller res34 arrIndex val in + let res36 = let arrIndex = Uint256 36 in let val = Uint256 8114835644520100661580084966409403105279 in setNewIfXSmaller res35 arrIndex val in + let res37 = let arrIndex = Uint256 37 in let val = Uint256 7781001266736647064069662172832600162303 in setNewIfXSmaller res36 arrIndex val in + let res38 = let arrIndex = Uint256 38 in let val = Uint256 7460900425488323202194551465008353509375 in setNewIfXSmaller res37 arrIndex val in + let res39 = let arrIndex = Uint256 39 in let val = Uint256 7153968139937914349310206877837545177087 in setNewIfXSmaller res38 arrIndex val in + let res40 = let arrIndex = Uint256 40 in let val = Uint256 6859662671868001546166128217910528704511 in setNewIfXSmaller res39 arrIndex val in + let res41 = let arrIndex = Uint256 41 in let val = Uint256 6577464569506365633454696454958677491711 in setNewIfXSmaller res40 arrIndex val in + let res42 = let arrIndex = Uint256 42 in let val = Uint256 6306875750689218484600399768107450630143 in setNewIfXSmaller res41 arrIndex val in + let res43 = let arrIndex = Uint256 43 in let val = Uint256 6047418623741353042663269283551730728959 in setNewIfXSmaller res42 arrIndex val in + let res44 = let arrIndex = Uint256 44 in let val = Uint256 5798635244522972732941736303310812479487 in setNewIfXSmaller res43 arrIndex val in + let res45 = let arrIndex = Uint256 45 in let val = Uint256 5560086508154074440893281558760167309311 in setNewIfXSmaller res44 arrIndex val in + let res46 = let arrIndex = Uint256 46 in let val = Uint256 5331351373990447379730864460340651884543 in setNewIfXSmaller res45 arrIndex val in + let res47 = let arrIndex = Uint256 47 in let val = Uint256 5112026122483163422598731111238626967551 in setNewIfXSmaller res46 arrIndex val in + let res48 = let arrIndex = Uint256 48 in let val = Uint256 4901723642609993464238960471454494228479 in setNewIfXSmaller res47 arrIndex val in + let res49 = let arrIndex = Uint256 49 in let val = Uint256 4700072748620998500994433661760029327359 in setNewIfXSmaller res48 arrIndex val in + let res50 = let arrIndex = Uint256 50 in let val = Uint256 4506717524892375150236886652795301658623 in setNewIfXSmaller res49 arrIndex val in + let res51 = let arrIndex = Uint256 51 in let val = Uint256 4321316697732212547034601541953113817087 in setNewIfXSmaller res50 arrIndex val in + let res52 = let arrIndex = Uint256 52 in let val = Uint256 4143543033029384782309349805264440655871 in setNewIfXSmaller res51 arrIndex val in + let res53 = let arrIndex = Uint256 53 in let val = Uint256 3973082758682431363936722477132055314431 in setNewIfXSmaller res52 arrIndex val in + let res54 = let arrIndex = Uint256 54 in let val = Uint256 3809635010789003168527049097368437784575 in setNewIfXSmaller res53 arrIndex val in + let res55 = let arrIndex = Uint256 55 in let val = Uint256 3652911302618395401280222488042819026943 in setNewIfXSmaller res54 arrIndex val in + let res56 = let arrIndex = Uint256 56 in let val = Uint256 3502635015429898674229017626613836152831 in setNewIfXSmaller res55 arrIndex val in + let res57 = let arrIndex = Uint256 57 in let val = Uint256 3358540910238258030536300376569398951935 in setNewIfXSmaller res56 arrIndex val in + let res58 = let arrIndex = Uint256 58 in let val = Uint256 3220374659664501751807634855053158776831 in setNewIfXSmaller res57 arrIndex val in + let res59 = let arrIndex = Uint256 59 in let val = Uint256 3087892399045852422628542596524428754943 in setNewIfXSmaller res58 arrIndex val in + let res60 = let arrIndex = Uint256 60 in let val = Uint256 2960860296012425255212778080756987592703 in setNewIfXSmaller res59 arrIndex val in + let res61 = let arrIndex = Uint256 61 in let val = Uint256 2839054137771012724926516325250418868223 in setNewIfXSmaller res60 arrIndex val in + let res62 = let arrIndex = Uint256 62 in let val = Uint256 2722258935367507707706996859454145691647 in setNewIfXSmaller res61 arrIndex val in + let res63 = let arrIndex = Uint256 63 in let val = Uint256 2610268544229484780765045556213696167935 in setNewIfXSmaller res62 arrIndex val in + let res64 = let arrIndex = Uint256 64 in let val = Uint256 2502885300319193958571922333378000453631 in setNewIfXSmaller res63 arrIndex val in + let res65 = let arrIndex = Uint256 65 in let val = Uint256 2399919671254773659805118819743970623487 in setNewIfXSmaller res64 arrIndex val in + let res66 = let arrIndex = Uint256 66 in let val = Uint256 2301189921783908737703717501630802821119 in setNewIfXSmaller res65 arrIndex val in + let res67 = let arrIndex = Uint256 67 in let val = Uint256 2206521793019491601704439134261549727743 in setNewIfXSmaller res66 arrIndex val in + let res68 = let arrIndex = Uint256 68 in let val = Uint256 2115748194871134515168564783402692116479 in setNewIfXSmaller res67 arrIndex val in + let res69 = let arrIndex = Uint256 69 in let val = Uint256 2028708911129671949307566740521183346687 in setNewIfXSmaller res68 arrIndex val in + let res70 = let arrIndex = Uint256 70 in let val = Uint256 1945250316684124513375052119057996185599 in setNewIfXSmaller res69 arrIndex val in + let res71 = let arrIndex = Uint256 71 in let val = Uint256 1865225106372009884014199587421481336831 in setNewIfXSmaller res70 arrIndex val in + let res72 = let arrIndex = Uint256 72 in let val = Uint256 1788492034984419117666073304513300660223 in setNewIfXSmaller res71 arrIndex val in + let res73 = let arrIndex = Uint256 73 in let val = Uint256 1714915667966964990208967912165996494847 in setNewIfXSmaller res72 arrIndex val in + let res74 = let arrIndex = Uint256 74 in let val = Uint256 1644366142376587317378242124992063995903 in setNewIfXSmaller res73 arrIndex val in + let res75 = let arrIndex = Uint256 75 in let val = Uint256 1576718937672301888428671268411708276735 in setNewIfXSmaller res74 arrIndex val in + let res76 = let arrIndex = Uint256 76 in let val = Uint256 1511854655935336643558907106913628979199 in setNewIfXSmaller res75 arrIndex val in + let res77 = let arrIndex = Uint256 77 in let val = Uint256 1449658811130741678082357454851673161727 in setNewIfXSmaller res76 arrIndex val in + let res78 = let arrIndex = Uint256 78 in let val = Uint256 1390021627038517938156314751863424548863 in setNewIfXSmaller res77 arrIndex val in + let res79 = let arrIndex = Uint256 79 in let val = Uint256 1332837843497611250583009129150422188031 in setNewIfXSmaller res78 arrIndex val in + let res80 = let arrIndex = Uint256 80 in let val = Uint256 1278006530620790610545644364558728429567 in setNewIfXSmaller res79 arrIndex val in + let res81 = let arrIndex = Uint256 81 in let val = Uint256 1225430910652498332846748256431392161791 in setNewIfXSmaller res80 arrIndex val in + let res82 = let arrIndex = Uint256 82 in let val = Uint256 1175018187155249585623915264673694351359 in setNewIfXSmaller res81 arrIndex val in + let res83 = let arrIndex = Uint256 83 in let val = Uint256 1126679381223093780446468558216906145791 in setNewIfXSmaller res82 arrIndex val in + let res84 = let arrIndex = Uint256 84 in let val = Uint256 1080329174433053119456411494679599644671 in setNewIfXSmaller res83 arrIndex val in + let res85 = let arrIndex = Uint256 85 in let val = Uint256 1035885758257346189907937735244580388863 in setNewIfXSmaller res84 arrIndex val in + let res86 = let arrIndex = Uint256 86 in let val = Uint256 993270689670607839608468400662101622783 in setNewIfXSmaller res85 arrIndex val in + let res87 = let arrIndex = Uint256 87 in let val = Uint256 952408752697250790372885759853747765247 in setNewIfXSmaller res86 arrIndex val in + let res88 = let arrIndex = Uint256 88 in let val = Uint256 913227825654598849673391073164504596479 in setNewIfXSmaller res87 arrIndex val in + let res89 = let arrIndex = Uint256 89 in let val = Uint256 875658753857474668265023456619450597375 in setNewIfXSmaller res88 arrIndex val in + let res90 = let arrIndex = Uint256 90 in let val = Uint256 839635227559564507480479102760887779327 in setNewIfXSmaller res89 arrIndex val in + let res91 = let arrIndex = Uint256 91 in let val = Uint256 805093664916125437948904238798044397567 in setNewIfXSmaller res90 arrIndex val in + let res92 = let arrIndex = Uint256 92 in let val = Uint256 771973099761463105605096142810743046143 in setNewIfXSmaller res91 arrIndex val in + let res93 = let arrIndex = Uint256 93 in let val = Uint256 740215074003106313787373698556008333311 in setNewIfXSmaller res92 arrIndex val in + let res94 = let arrIndex = Uint256 94 in let val = Uint256 709763534442753181219281418466841591807 in setNewIfXSmaller res93 arrIndex val in + let res95 = let arrIndex = Uint256 95 in let val = Uint256 680564733841876926926749214863536422911 in setNewIfXSmaller res94 arrIndex val in + let res96 = let arrIndex = Uint256 96 in let val = Uint256 652567136057371195186997586203332575231 in setNewIfXSmaller res95 arrIndex val in + let res97 = let arrIndex = Uint256 97 in let val = Uint256 625721325079798489641586010116704960511 in setNewIfXSmaller res96 arrIndex val in + let res98 = let arrIndex = Uint256 98 in let val = Uint256 599979917813693414950432886451725139967 in setNewIfXSmaller res97 arrIndex val in + let res99 = let arrIndex = Uint256 99 in let val = Uint256 575297480445977184425850753341355720703 in setNewIfXSmaller res98 arrIndex val in + let res100 = let arrIndex = Uint256 100 in let val = Uint256 551630448254872900425972804456347074559 in setNewIfXSmaller res99 arrIndex val in + let res101 = let arrIndex = Uint256 101 in let val = Uint256 528937048717783628792119060092411707391 in setNewIfXSmaller res100 arrIndex val in + let res102 = let arrIndex = Uint256 102 in let val = Uint256 507177227782417987326846600868857380863 in setNewIfXSmaller res101 arrIndex val in + let res103 = let arrIndex = Uint256 103 in let val = Uint256 486312579171031128343732298613950251007 in setNewIfXSmaller res102 arrIndex val in + let res104 = let arrIndex = Uint256 104 in let val = Uint256 466306276593002471003532891264408092671 in setNewIfXSmaller res103 arrIndex val in + let res105 = let arrIndex = Uint256 105 in let val = Uint256 447123008746104779416515886102660251647 in setNewIfXSmaller res104 arrIndex val in + let res106 = let arrIndex = Uint256 106 in let val = Uint256 428728916991741247552240490495652921343 in setNewIfXSmaller res105 arrIndex val in + let res107 = let arrIndex = Uint256 107 in let val = Uint256 411091535594146829344560212836376117247 in setNewIfXSmaller res106 arrIndex val in + let res108 = let arrIndex = Uint256 108 in let val = Uint256 394179734418075472107167272299635146751 in setNewIfXSmaller res107 arrIndex val in + let res109 = let arrIndex = Uint256 109 in let val = Uint256 377963663983834160889726215582593318911 in setNewIfXSmaller res108 arrIndex val in + let res110 = let arrIndex = Uint256 110 in let val = Uint256 362414702782685419520589203652335239167 in setNewIfXSmaller res109 arrIndex val in + let res111 = let arrIndex = Uint256 111 in let val = Uint256 347505406759629484539078662328460836863 in setNewIfXSmaller res110 arrIndex val in + let res112 = let arrIndex = Uint256 112 in let val = Uint256 333209460874402812645752271223906598911 in setNewIfXSmaller res111 arrIndex val in + let res113 = let arrIndex = Uint256 113 in let val = Uint256 319501632655197652636411056021540225023 in setNewIfXSmaller res112 arrIndex val in + let res114 = let arrIndex = Uint256 114 in let val = Uint256 306357727663124583211687061200571318271 in setNewIfXSmaller res113 arrIndex val in + let res115 = let arrIndex = Uint256 115 in let val = Uint256 293754546788812396405978813098581970943 in setNewIfXSmaller res114 arrIndex val in + let res116 = let arrIndex = Uint256 116 in let val = Uint256 281669845305773445111617137421885345791 in setNewIfXSmaller res115 arrIndex val in + let res117 = let arrIndex = Uint256 117 in let val = Uint256 270082293608263279864102872957453496319 in setNewIfXSmaller res116 arrIndex val in + let res118 = let arrIndex = Uint256 118 in let val = Uint256 258971439564336547476984432763364437503 in setNewIfXSmaller res117 arrIndex val in + let res119 = let arrIndex = Uint256 119 in let val = Uint256 248317672417651959902117100034610719743 in setNewIfXSmaller res118 arrIndex val in + let res120 = let arrIndex = Uint256 120 in let val = Uint256 238102188174312697593221439720218478079 in setNewIfXSmaller res119 arrIndex val in + let res121 = let arrIndex = Uint256 121 in let val = Uint256 228306956413649712418347768277622232511 in setNewIfXSmaller res120 arrIndex val in + let res122 = let arrIndex = Uint256 122 in let val = Uint256 218914688464368667066255864092044292831 in setNewIfXSmaller res121 arrIndex val in + let res123 = let arrIndex = Uint256 123 in let val = Uint256 209908806889891126870119775672831054607 in setNewIfXSmaller res122 arrIndex val in + let res124 = let arrIndex = Uint256 124 in let val = Uint256 201273416229031359487226059686877220919 in setNewIfXSmaller res123 arrIndex val in + let res125 = let arrIndex = Uint256 125 in let val = Uint256 192993274940365776401274035698589299391 in setNewIfXSmaller res124 arrIndex val in + let res126 = let arrIndex = Uint256 126 in let val = Uint256 185053768500776578446843424638883162041 in setNewIfXSmaller res125 arrIndex val in + let res127 = let arrIndex = Uint256 127 in let val = Uint256 177440883610688295304820354615089591270 in setNewIfXSmaller res126 arrIndex val in +match res127 with | PrecisionAndMax precision max => +let precision_is_zero = builtin eq zero_uint256 precision in +match precision_is_zero with +| True => (* means that x is bigger than the biggest number permitted *) panic zero_uint256 +| False => precision +end +end + +(* + This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'. + It approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!". + It returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy. + The global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (c_MAX_PRECISION - precision)) - 1". + The maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (c_MAX_PRECISION - precision)". +*) +let generalExp: Uint256 -> Uint256 -> Uint256 = +fun(x: Uint256) => fun(precision: Uint256) => +let two_pow_precision = pow_uint256 two_uint256 precision in +let res1 = Uint256 0 in +let xi1 = x in + (* add x^2 * (33! / 2!) *) + let xi2 = muldiv xi1 x two_pow_precision in let res2 = let fac = Uint256 4341658809405943247759097200640000000 in muladd xi2 fac res1 in + (* add x^3 * (33! / 3!) *) + let xi3 = muldiv xi2 x two_pow_precision in let res3 = let fac = Uint256 1447219603135314415919699066880000000 in muladd xi3 fac res2 in + (* add x^4 * (33! / 4!) *) + let xi4 = muldiv xi3 x two_pow_precision in let res4 = let fac = Uint256 361804900783828603979924766720000000 in muladd xi4 fac res3 in + (* add x^5 * (33! / 5!) *) + let xi5 = muldiv xi4 x two_pow_precision in let res5 = let fac = Uint256 72360980156765720795984953344000000 in muladd xi5 fac res4 in + (* add x^6 * (33! / 6!) *) + let xi6 = muldiv xi5 x two_pow_precision in let res6 = let fac = Uint256 12060163359460953465997492224000000 in muladd xi6 fac res5 in + (* add x^7 * (33! / 7!) *) + let xi7 = muldiv xi6 x two_pow_precision in let res7 = let fac = Uint256 1722880479922993352285356032000000 in muladd xi7 fac res6 in + (* add x^8 * (33! / 8!) *) + let xi8 = muldiv xi7 x two_pow_precision in let res8 = let fac = Uint256 215360059990374169035669504000000 in muladd xi8 fac res7 in + (* add x^9 * (33! / 9!) *) + let xi9 = muldiv xi8 x two_pow_precision in let res9 = let fac = Uint256 23928895554486018781741056000000 in muladd xi9 fac res8 in + (* add x^10 * (33! / 10!) *) + let xi10 = muldiv xi9 x two_pow_precision in let res10 = let fac = Uint256 2392889555448601878174105600000 in muladd xi10 fac res9 in + (* add x^11 * (33! / 11!) *) + let xi11 = muldiv xi10 x two_pow_precision in let res11 = let fac = Uint256 217535414131691079834009600000 in muladd xi11 fac res10 in + (* add x^12 * (33! / 12!) *) + let xi12 = muldiv xi11 x two_pow_precision in let res12 = let fac = Uint256 18127951177640923319500800000 in muladd xi12 fac res11 in + (* add x^13 * (33! / 13!) *) + let xi13 = muldiv xi12 x two_pow_precision in let res13 = let fac = Uint256 1394457782895455639961600000 in muladd xi13 fac res12 in + (* add x^14 * (33! / 14!) *) + let xi14 = muldiv xi13 x two_pow_precision in let res14 = let fac = Uint256 99604127349675402854400000 in muladd xi14 fac res13 in + (* add x^15 * (33! / 15!) *) + let xi15 = muldiv xi14 x two_pow_precision in let res15 = let fac = Uint256 6640275156645026856960000 in muladd xi15 fac res14 in + (* add x^16 * (33! / 16!) *) + let xi16 = muldiv xi15 x two_pow_precision in let res16 = let fac = Uint256 415017197290314178560000 in muladd xi16 fac res15 in + (* add x^17 * (33! / 17!) *) + let xi17 = muldiv xi16 x two_pow_precision in let res17 = let fac = Uint256 24412776311194951680000 in muladd xi17 fac res16 in + (* add x^18 * (33! / 18!) *) + let xi18 = muldiv xi17 x two_pow_precision in let res18 = let fac = Uint256 1356265350621941760000 in muladd xi18 fac res17 in + (* add x^19 * (33! / 19!) *) + let xi19 = muldiv xi18 x two_pow_precision in let res19 = let fac = Uint256 71382386874839040000 in muladd xi19 fac res18 in + (* add x^20 * (33! / 20!) *) + let xi20 = muldiv xi19 x two_pow_precision in let res20 = let fac = Uint256 3569119343741952000 in muladd xi20 fac res19 in + (* add x^21 * (33! / 21!) *) + let xi21 = muldiv xi20 x two_pow_precision in let res21 = let fac = Uint256 169958063987712000 in muladd xi21 fac res20 in + (* add x^22 * (33! / 22!) *) + let xi22 = muldiv xi21 x two_pow_precision in let res22 = let fac = Uint256 7725366544896000 in muladd xi22 fac res21 in + (* add x^23 * (33! / 23!) *) + let xi23 = muldiv xi22 x two_pow_precision in let res23 = let fac = Uint256 335885501952000 in muladd xi23 fac res22 in + (* add x^24 * (33! / 24!) *) + let xi24 = muldiv xi23 x two_pow_precision in let res24 = let fac = Uint256 13995229248000 in muladd xi24 fac res23 in + (* add x^25 * (33! / 25!) *) + let xi25 = muldiv xi24 x two_pow_precision in let res25 = let fac = Uint256 559809169920 in muladd xi25 fac res24 in + (* add x^26 * (33! / 26!) *) + let xi26 = muldiv xi25 x two_pow_precision in let res26 = let fac = Uint256 21531121920 in muladd xi26 fac res25 in + (* add x^27 * (33! / 27!) *) + let xi27 = muldiv xi26 x two_pow_precision in let res27 = let fac = Uint256 797448960 in muladd xi27 fac res26 in + (* add x^28 * (33! / 28!) *) + let xi28 = muldiv xi27 x two_pow_precision in let res28 = let fac = Uint256 28480320 in muladd xi28 fac res27 in + (* add x^29 * (33! / 29!) *) + let xi29 = muldiv xi28 x two_pow_precision in let res29 = let fac = Uint256 982080 in muladd xi29 fac res28 in + (* add x^30 * (33! / 30!) *) + let xi30 = muldiv xi29 x two_pow_precision in let res30 = let fac = Uint256 32736 in muladd xi30 fac res29 in + (* add x^31 * (33! / 31!) *) + let xi31 = muldiv xi30 x two_pow_precision in let res31 = let fac = Uint256 1056 in muladd xi31 fac res30 in + (* add x^32 * (33! / 32!) *) + let xi32 = muldiv xi31 x two_pow_precision in let res32 = let fac = Uint256 33 in muladd xi32 fac res31 in + (* add x^33 * (33! / 33!) *) + let xi33 = muldiv xi32 x two_pow_precision in let res33 = let fac = Uint256 1 in muladd xi33 fac res32 in +(* divide by 33! and then add x^1 / 1! + x^0 / 0! *) +let fac33 = Uint256 8683317618811886495518194401280000000 in +let res_div_fac33 = builtin div res33 fac33 in +let x_add_two_pow_precision = builtin add x two_pow_precision in +builtin add res_div_fac33 x_add_two_pow_precision +(* + General Description: + Determine a value of precision. + Calculate an integer approximation of (in_baseN / in_baseD) ^ (in_expN / in_expD) * 2 ^ precision. + Return the result along with the precision used. + + Detailed Description: + Instead of calculating "base ^ exp", we calculate "e ^ (log(base) * exp)". + The value of "log(base)" is represented with an integer slightly smaller than "log(base) * 2 ^ precision". + The larger "precision" is, the more accurately this value represents the real value. + However, the larger "precision" is, the more bits are required in order to store this value. + And the exponentiation function, which takes "x" and calculates "e ^ x", is limited to a maximum exponent (maximum value of "x"). + This maximum exponent depends on the "precision" used, and it is given by "maxExpArray[precision] >> (c_MAX_PRECISION - precision)". + Hence we need to determine the highest precision which can be used for the given input, before calling the exponentiation function. + This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the intermediate computations. + This functions assumes that "in_expN < 2 ^ 256 / log(c_MAX_NUM - 1)", otherwise the multiplication should be replaced with a "safeMul". +*) +let power: Uint256 -> Uint256 -> Uint256 -> Uint256 -> PowerResultAndPrecision = + fun(in_baseN: Uint256) => fun(in_baseD: Uint256) => fun(in_expN: Uint256) => fun(in_expD: Uint256) => + let is_smaller = panic_if_uint256_not_lt_uint256 in_baseN c_MAX_NUM in + let base = muldiv in_baseN c_FIXED_1 in_baseD in + let baseLog = log base in + let baseLogTimesExp = muldiv baseLog in_expN in_expD in + + let baseLogTimesExp_lt_max_val = uint256_lt baseLogTimesExp c_OPT_EXP_MAX_VAL in + match baseLogTimesExp_lt_max_val with + | True => + let exp_res = optimalExp baseLogTimesExp in + PowerResultAndPrecision exp_res c_MAX_PRECISION + | False => + let precision = findPositionInMaxExpArray baseLogTimesExp in + let max_sub_precision = builtin sub c_MAX_PRECISION precision in + let two_pow_max_sub_precision = pow_uint256 two_uint256 max_sub_precision in + let baseLogTimesExpShifted = builtin div baseLogTimesExp two_pow_max_sub_precision in + let exp_res = generalExp baseLogTimesExpShifted precision in + PowerResultAndPrecision exp_res precision + end + + (* if (baseLogTimesExp < c_OPT_EXP_MAX_VAL) { + return (optimalExp(baseLogTimesExp), c_MAX_PRECISION); + } + else { + uint8 precision = findPositionInMaxExpArray(baseLogTimesExp); + return (generalExp(baseLogTimesExp >> (c_MAX_PRECISION - precision), precision), precision); + } *) + + +contract BancorFormula() + +procedure ThrowError(err : Error) + e = make_error err; + throw e +end + +procedure AssertNotZero(value: Uint256) + is_zero = builtin eq zero_uint256 value; + match is_zero with + | False => + | True => e = CodeInputIsZero; ThrowError e + end +end + +procedure AssertIsLE(i1: Uint256, i2: Uint256) + is_le = uint256_le i1 i2; + match is_le with + | False => e = CodeInputNotInBounds; ThrowError e + | True => + end +end + +procedure SendCalculatePurchaseReturnCallback(result: Uint128) + msg = let m = { + _tag: "CalculatePurchaseReturnCallback"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } in one_msg m; + send msg +end +(* + @dev given a token supply, connector balance, weight and a deposit amount (in the connector token), + calculates the return for a given conversion (in the main token) + + Formula: + Return = in_supply * ((1 + in_deposit_amount / in_connector_balance) ^ (in_connector_weight / 1000000) - 1) + + @param in_supply token total supply + @param in_connector_balance total connector balance + @param in_connector_weight connector weight, represented in ppm, 1-1000000 + @param in_deposit_amount deposit amount, in connector token + + @send purchase return amount + in form: + { + _tag: "CalculatePurchaseReturnCallback"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } +*) +transition CalculatePurchaseReturn(in_supply: Uint128, in_connector_balance: Uint128, in_connector_weight: Uint128, in_deposit_amount: Uint128) + (* convert uint128s to uint256s *) + supply = uint128_to_uint256 in_supply; + connector_balance = uint128_to_uint256 in_connector_balance; + connector_weight = uint128_to_uint256 in_connector_weight; + deposit_amount = uint128_to_uint256 in_deposit_amount; + (* validate input *) + AssertNotZero supply; + AssertNotZero connector_balance; + AssertNotZero connector_weight; + AssertIsLE connector_weight c_MAX_WEIGHT; + deposit_is_zero = builtin eq deposit_amount zero_uint256; + match deposit_is_zero with + | True => + (* special case for 0 deposit amount *) + SendCalculatePurchaseReturnCallback zero_uint128 + | False => + connector_weight_is_c_MAX_WEIGHT = builtin eq connector_weight c_MAX_WEIGHT; + match connector_weight_is_c_MAX_WEIGHT with + | True => + (* special case if the weight = 100% *) + result_uint256 = muldiv supply deposit_amount connector_balance; + result = uint256_to_uint128 result_uint256; + SendCalculatePurchaseReturnCallback result + | False => + baseN = builtin add deposit_amount connector_balance; + power_result_and_precision = power baseN connector_balance connector_weight c_MAX_WEIGHT; + match power_result_and_precision with + | PowerResultAndPrecision power_result precision => + two_pow_precision = pow_uint256 two_uint256 precision; + tmp = muldiv supply power_result two_pow_precision; + result_uint256 = builtin sub tmp supply; + result = uint256_to_uint128 result_uint256; + SendCalculatePurchaseReturnCallback result + end + end + end +end + +procedure SendCalculateSaleReturnCallback(result: Uint128) + msg = let m = { + _tag: "CalculateSaleReturnCallback"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } in one_msg m; + send msg +end +(* + @dev given a token supply, connector balance, weight and a sell amount (in the main token), + calculates the return for a given conversion (in the connector token) + + Formula: + Return = in_connectorBalance * (1 - (1 - in_sellAmount / in_supply) ^ (1 / (in_connectorWeight / 1000000))) + + @param in_supply token total supply + @param in_connectorBalance total connector + @param in_connectorWeight constant connector Weight, represented in ppm, 1-1000000 + @param in_sellAmount sell amount, in the token itself + + @return sale return amount +*) +transition CalculateSaleReturn(in_supply: Uint128, in_connector_balance: Uint128, in_connector_weight: Uint128, in_sell_amount: Uint128) + (* convert uint128s to uint256s *) + supply = uint128_to_uint256 in_supply; + connector_balance = uint128_to_uint256 in_connector_balance; + connector_weight = uint128_to_uint256 in_connector_weight; + sell_amount = uint128_to_uint256 in_sell_amount; + (* validate input *) + AssertNotZero supply; + AssertNotZero connector_balance; + AssertNotZero connector_weight; + AssertIsLE connector_weight c_MAX_WEIGHT; + AssertIsLE sell_amount supply; + sell_is_zero = builtin eq sell_amount zero_uint256; + match sell_is_zero with + | True => + (* special case for 0 sell amount *) + SendCalculateSaleReturnCallback zero_uint128 + | False => + selling_entire_supply = builtin eq sell_amount supply; + match selling_entire_supply with + | True => SendCalculateSaleReturnCallback in_connector_balance + | False => + connector_weight_is_c_MAX_WEIGHT = builtin eq connector_weight c_MAX_WEIGHT; + match connector_weight_is_c_MAX_WEIGHT with + | True => + (* special case if the weight = 100% *) + result_uint256 = muldiv connector_balance sell_amount supply; + result = uint256_to_uint128 result_uint256; + SendCalculateSaleReturnCallback result + | False => + baseD = builtin sub supply sell_amount; + power_result_and_precision = power supply baseD c_MAX_WEIGHT connector_weight; + match power_result_and_precision with + | PowerResultAndPrecision power_result precision => + two_pow_precision = pow_uint256 two_uint256 precision; + temp1 = builtin mul connector_balance power_result; + temp2 = builtin mul connector_balance two_pow_precision; + temp1_sub_temp2 = builtin sub temp1 temp2; + result_uint256 = builtin div temp1_sub_temp2 power_result; + result = uint256_to_uint128 result_uint256; + SendCalculateSaleReturnCallback result + end + end + end + end +end + +procedure SendCalculateCrossConnectorReturnCallback(result: Uint128) + msg = let m = { + _tag: "CalculateCrossConnectorReturn"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } in one_msg m; + send msg +end +(* + @dev given two connector balances/weights and a sell amount (in the first connector token), + calculates the return for a conversion from the first connector token to the second connector token (in the second connector token) + + Formula: + Return = in_to_connector_balance * (1 - (in_from_connector_balance / (in_from_connector_balance + in_amount)) ^ (in_from_connector_weight / in_to_connector_weight)) + + @param in_from_connector_balance input connector balance + @param in_from_connector_weight input connector weight, represented in ppm, 1-1000000 + @param in_to_connector_balance output connector balance + @param in_to_connector_weight output connector weight, represented in ppm, 1-1000000 + @param in_amount input connector amount + + @return second connector amount +*) +transition CalculateCrossConnectorReturn(in_from_connector_balance: Uint128, in_from_connector_weight: Uint128, in_to_connector_balance: Uint128, in_to_connector_weight: Uint128, in_amount: Uint128) + (* convert inputs *) + from_connector_balance = uint128_to_uint256 in_from_connector_balance; + from_connector_weight = uint128_to_uint256 in_from_connector_weight; + to_connector_balance = uint128_to_uint256 in_to_connector_balance; + to_connector_weight = uint128_to_uint256 in_to_connector_weight; + amount = uint128_to_uint256 in_amount; + (* validate inputs *) + AssertNotZero from_connector_balance; + AssertNotZero from_connector_weight; + AssertIsLE from_connector_weight c_MAX_WEIGHT; + AssertNotZero to_connector_balance; + AssertNotZero to_connector_weight; + AssertIsLE to_connector_weight c_MAX_WEIGHT; + + weights_equal = builtin eq to_connector_weight from_connector_weight; + match weights_equal with + | True => + from_connector_balance_add_amount = builtin add from_connector_balance amount; + result_uint256 = muldiv to_connector_balance amount from_connector_balance_add_amount; + result = uint256_to_uint128 result_uint256; + SendCalculateCrossConnectorReturnCallback result + | False => + baseN = builtin add from_connector_balance amount; + power_result_and_precision = power baseN from_connector_balance from_connector_weight to_connector_weight; + match power_result_and_precision with + | PowerResultAndPrecision power_result precision => + two_pow_precision = pow_uint256 two_uint256 precision; + temp1 = builtin mul to_connector_balance power_result; + temp2 = builtin mul to_connector_balance two_pow_precision; + temp1_sub_temp2 = builtin sub temp1 temp2; + result_uint256 = builtin div temp1_sub_temp2 power_result; + result = uint256_to_uint128 result_uint256; + SendCalculateCrossConnectorReturnCallback result + end + end +end diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/README.md b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/README.md new file mode 100644 index 000000000..26aa41ccf --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/README.md @@ -0,0 +1,41 @@ +# I. BancorFormula documentation + +#### CalculatePurchaseReturn() + + @dev given a token supply, connector balance, weight and a deposit amount ( in the connector token), calculates the return for a given conversion ( in the main token) Formula: Return = in_supply ( ( 1 + in_deposit_amount / in_connector_balance) ^ ( in_connector_weight / 1000000) - 1) @param in_supply token total supply @param in_connector_balance total connector balance @param in_connector_weight connector weight, represented in ppm, 1-1000000 @param in_deposit_amount deposit amount, in connector token @send purchase return amount in form: { _tag: "CalculatePurchaseReturnCallback" ; _recipient: _sender ; _amount: zero_uint128 ; result: result } transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `in_supply` | `Uint128` | +| @param | `in_connector_balance` | `Uint128` | +| @param | `in_connector_weight` | `Uint128` | +| @param | `in_deposit_amount` | `Uint128` | + +#### CalculateSaleReturn() + + @dev given a token supply, connector balance, weight and a sell amount ( in the main token), calculates the return for a given conversion ( in the connector token) Formula: Return = in_connectorBalance ( 1 - ( 1 - in_sellAmount / in_supply) ^ ( 1 / ( in_connectorWeight / 1000000))) @param in_supply token total supply @param in_connectorBalance total connector @param in_connectorWeight constant connector Weight, represented in ppm, 1-1000000 @param in_sellAmount sell amount, in the token itself @return sale return amount transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `in_supply` | `Uint128` | +| @param | `in_connector_balance` | `Uint128` | +| @param | `in_connector_weight` | `Uint128` | +| @param | `in_sell_amount` | `Uint128` | + +#### CalculateCrossConnectorReturn() + + @dev given two connector balances/weights and a sell amount ( in the first connector token), calculates the return for a conversion from the first connector token to the second connector token ( in the second connector token) Formula: Return = in_to_connector_balance ( 1 - ( in_from_connector_balance / ( in_from_connector_balance + in_amount)) ^ ( in_from_connector_weight / in_to_connector_weight)) @param in_from_connector_balance input connector balance @param in_from_connector_weight input connector weight, represented in ppm, 1-1000000 @param in_to_connector_balance output connector balance @param in_to_connector_weight output connector weight, represented in ppm, 1-1000000 @param in_amount input connector amount @return second connector amount transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `in_from_connector_balance` | `Uint128` | +| @param | `in_from_connector_weight` | `Uint128` | +| @param | `in_to_connector_balance` | `Uint128` | +| @param | `in_to_connector_weight` | `Uint128` | +| @param | `in_amount` | `Uint128` | \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateCrossConnectorReturn.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateCrossConnectorReturn.ts new file mode 100644 index 000000000..20643755c --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateCrossConnectorReturn.ts @@ -0,0 +1,56 @@ +import { crossConnectorReturnCases } from "../cases/crossConnectorReturnCases"; +import { TestingFunction, testRunner } from "../../../../scillaTest/utill"; +import { testMaker, getGasAvg } from "../../../../scillaTest"; +import { ByStr20, Uint128 } from "../../../../boost-zil"; +import * as sdk from "../../build/bind"; +import { Long, BN } from "@zilliqa-js/util"; +import { getError, getErrorStats } from "./utill"; +import Big from "big.js"; + +export const testCalculateCrossConnectorReturn: TestingFunction = async ( + code, + ss +) => { + try { + console.log("🙌 testCalculateCrossConnectorReturn"); + const fillerAddr = new ByStr20( + "0x1234567890123456789012345678901234567890" + ); + const limit = Long.fromString("100000"); + const testing = testRunner(ss)("BancorFormula"); + const run = testing.runner; + const make = testMaker(code)("1")(sdk.deploy().initToJSON())("0")([])( + fillerAddr + ); + const bancor = sdk + .hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + fillerAddr + ) + .run(limit); + async function runBatch(testCases: string[][]) { + await Promise.all( + testCases.map((test) => + run( + make( + bancor + .CalculateCrossConnectorReturn( + new Uint128(test[0]), + new Uint128(test[1]), + new Uint128(test[2]), + new Uint128(test[3]), + new Uint128(test[4]) + ) + .toJSON() + ), + getError(test[5]) + ) + ) + ); + } + await runBatch(crossConnectorReturnCases); + getErrorStats(testing.getAllErrors() as { result: any; error: Big }[]); + getGasAvg(testing.getAllResults()); + } catch (e) { + throw e; + } +}; diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculatePurchaseReturn.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculatePurchaseReturn.ts new file mode 100644 index 000000000..f9a5e1161 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculatePurchaseReturn.ts @@ -0,0 +1,56 @@ +import { TestingFunction, testRunner } from "../../../../scillaTest/utill"; +import { testMaker, getGasAvg } from "../../../../scillaTest"; +import { ByStr20, Uint128 } from "../../../../boost-zil"; +import * as sdk from "../../build/bind"; +import { Long, BN } from "@zilliqa-js/util"; +import * as testCases from "../cases/purchaseReturnTestCases"; +import { getError, getErrorStats } from "./utill"; +import Big from "big.js"; + +export const testCalculatePurchaseReturn: TestingFunction = async ( + code, + ss +) => { + try { + console.log("🙌 testCalculatePurchaseReturn"); + const fillerAddr = new ByStr20( + "0x1234567890123456789012345678901234567890" + ); + const limit = Long.fromString("100000"); + const testing = testRunner(ss)("BancorFormula"); + const run = testing.runner; + const make = testMaker(code)("1")(sdk.deploy().initToJSON())("0")([])( + fillerAddr + ); + const bancor = + sdk.hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + fillerAddr + ).run(limit); + async function runBatch(testCases: string[][]) { + const res = await Promise.all( + testCases.map((test) => + run( + make( + bancor + .CalculatePurchaseReturn( + new Uint128(test[0]), + new Uint128(test[1]), + new Uint128(test[2]), + new Uint128(test[3]) + ) + .toJSON() + ), + getError(test[4]) + ) + ) + ); + } + for (const [k, t] of Object.entries(testCases)) { + await runBatch(t); + } + getErrorStats(testing.getAllErrors() as { result: any; error: Big }[]); + getGasAvg(testing.getAllResults()); + } catch (e) { + throw e; + } +}; diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateSaleReturn.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateSaleReturn.ts new file mode 100644 index 000000000..55e0322d9 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/testCalculateSaleReturn.ts @@ -0,0 +1,53 @@ +import { saleReturnTestCases } from "../cases/saleReturnTestCases"; +import { TestingFunction, testRunner } from "../../../../scillaTest/utill"; +import { testMaker, getGasAvg } from "../../../../scillaTest"; +import { ByStr20, Uint128 } from "../../../../boost-zil"; +import * as sdk from "../../build/bind"; +import { Long, BN } from "@zilliqa-js/util"; +import { getError, getErrorStats } from "./utill"; +import Big from "big.js"; + +export const testCalculateSaleReturn: TestingFunction = async (code, ss) => { + try { + console.log("🙌 testCalculateSaleReturn"); + const fillerAddr = new ByStr20( + "0x1234567890123456789012345678901234567890" + ); + const limit = Long.fromString("100000"); + const testing = testRunner(ss)("BancorFormula"); + const run = testing.runner; + const make = testMaker(code)("1")(sdk.deploy().initToJSON())("0")([])( + fillerAddr + ); + const bancor = sdk + .hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + fillerAddr + ) + .run(limit); + async function runBatch(testCases: string[][]) { + await Promise.all( + testCases.map((test) => + run( + make( + bancor + .CalculateSaleReturn( + new Uint128(test[0]), + new Uint128(test[1]), + new Uint128(test[2]), + new Uint128(test[3]) + ) + .toJSON() + ), + getError(test[4]) + ) + ) + ); + } + + await runBatch(saleReturnTestCases); + getErrorStats(testing.getAllErrors() as { result: any; error: Big }[]); + getGasAvg(testing.getAllResults()); + } catch (e) { + throw e; + } +}; diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/utill.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/utill.ts new file mode 100644 index 000000000..a6946238a --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/bancor/utill.ts @@ -0,0 +1,40 @@ +import { BN } from "@zilliqa-js/zilliqa"; +import Big from "big.js"; + +/** + * prints the returned - expected val + */ +export const getError = (expected:string) => (res: any) => { + const val = res.message.messages[0].params[0].value; + const b = new BN(val); + const r = new BN(expected); + const err = b.sub(r); + if (err.eq(new BN(0))) { + return new Big("0"); + } else { + // console.log(val, expected) + return new Big("1").sub(new Big(val).div(new Big(expected))).abs(); + } +}; + +export function getErrorStats(errors: { error: Big; result: any }[]) { + let perfectCount = 0; + let maxErr = new Big("-33333333"); + let minErr = new Big("8888"); + const totalErr = errors.reduce((prev, cur) => { + if (cur.error.eq(new Big(0))) { + perfectCount++; + } + if (cur.error.gt(maxErr)) { + maxErr = cur.error; + } + if (cur.error.lt(minErr) && !cur.error.eq(new Big(0))) { + minErr = cur.error; + } + return prev.add(new Big(cur.error)); + }, new Big(0)); + console.log(`✨ ${perfectCount} / ${errors.length} perfect tests`); + console.log(`with average error: ${totalErr.div(new Big(errors.length))}`); + console.log(`🤏 min error ${minErr.toString()}`); + console.log(`👎 max error ${maxErr.toString()}`); +} diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/crossConnectorReturnCases.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/crossConnectorReturnCases.ts new file mode 100644 index 000000000..10d1f348c --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/crossConnectorReturnCases.ts @@ -0,0 +1,167 @@ +export const crossConnectorReturnCases = [ + //equal weights + ["1000", "40", "250", "40", "0", "0"], + ["1000", "40", "250", "40", "50", "11"], + ["1000", "40", "250", "40", "100", "22"], + ["1000", "40", "250", "40", "150", "32"], + ["1000", "40", "250", "40", "200", "41"], + ["1000", "40", "250", "40", "250", "49"], + ["1000", "40", "250", "40", "300", "57"], + ["1000", "40", "250", "40", "350", "64"], + ["1000", "40", "250", "40", "400", "71"], + ["1000", "40", "250", "40", "450", "77"], + ["1000", "40", "250", "40", "500", "83"], + ["1000", "40", "250", "40", "550", "88"], + ["1000", "40", "250", "40", "600", "93"], + ["1000", "40", "250", "40", "650", "98"], + ["1000", "40", "250", "40", "700", "102"], + ["1000", "40", "250", "40", "750", "107"], + ["1000", "40", "250", "40", "800", "111"], + ["1000", "40", "250", "40", "850", "114"], + ["1000", "40", "250", "40", "900", "118"], + ["1000", "40", "250", "40", "950", "121"], + //different weights + ["1000", "12341", "250", "65341", "0", "0"], + ["1000", "12341", "250", "65341", "50", "2"], + ["1000", "12341", "250", "65341", "100", "4"], + ["1000", "12341", "250", "65341", "150", "6"], + ["1000", "12341", "250", "65341", "200", "8"], + ["1000", "12341", "250", "65341", "250", "10"], + ["1000", "12341", "250", "65341", "300", "12"], + ["1000", "12341", "250", "65341", "350", "13"], + ["1000", "12341", "250", "65341", "400", "15"], + ["1000", "12341", "250", "65341", "450", "16"], + ["1000", "12341", "250", "65341", "500", "18"], + ["1000", "12341", "250", "65341", "550", "19"], + ["1000", "12341", "250", "65341", "600", "21"], + ["1000", "12341", "250", "65341", "650", "22"], + ["1000", "12341", "250", "65341", "700", "23"], + ["1000", "12341", "250", "65341", "750", "25"], + ["1000", "12341", "250", "65341", "800", "26"], + ["1000", "12341", "250", "65341", "850", "27"], + ["1000", "12341", "250", "65341", "900", "28"], + ["1000", "12341", "250", "65341", "950", "29"], + //zil scaled + ["561000000000000", "12341", "435000000000000", "65341", "0", "0"], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "50000000000000", + "6958139114315", + ], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "100000000000000", + "13270118868174", + ], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "150000000000000", + "19038448249248", + ], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "200000000000000", + "24343538577689", + ], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "250000000000000", + "29249566228068", + ], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "300000000000000", + "33808522924591", + ], + [ + "561000000000000", + "12341", + "435000000000000", + "65341", + "350000000000000", + "38063084449081", + ], + //zil scaled other + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "0", + "0", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "50000000000000", + "22754685578165", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "100000000000000", + "45509371156330", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "150000000000000", + "68264043028645", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "200000000000000", + "91018728606810", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "250000000000000", + "113773414184975", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "300000000000000", + "136528099763140", + ], + [ + "51234151233999995928576", + "12341", + "123451324123000007032832", + "65341", + "350000000000000", + "159282785341305", + ], +]; diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/purchaseReturnTestCases.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/purchaseReturnTestCases.ts new file mode 100644 index 000000000..856914737 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/purchaseReturnTestCases.ts @@ -0,0 +1,625 @@ +/** + * generated by .ipynb script + * + * the specific test case + * + * ["1000", "250", "500000", "10", "19"] + is from the bancor paper: + https://storage.googleapis.com/website-bancor/2018/04/01ba8253-bancor_protocol_whitepaper_en.pdf + */ +export const bancorPaperTestCases = [ + ["1000", "250", "500000", "0", "0"], + ["1000", "250", "500000", "10", "19"], + ["1000", "250", "500000", "60", "113"], + ["1000", "250", "500000", "110", "199"], + ["1000", "250", "500000", "160", "280"], + ["1000", "250", "500000", "210", "356"], + ["1000", "250", "500000", "260", "428"], + ["1000", "250", "500000", "310", "496"], + ["1000", "250", "500000", "360", "562"], + ["1000", "250", "500000", "410", "624"], + ["1000", "250", "500000", "460", "685"], + ["1000", "250", "500000", "510", "743"], + ["1000", "250", "500000", "560", "800"], + ["1000", "250", "500000", "610", "854"], + ["1000", "250", "500000", "660", "907"], + ["1000", "250", "500000", "710", "959"], +]; + +export const below50percentTestCases = [ + ["1000", "250", "250000", "10", "9"], + ["1000", "250", "250000", "60", "55"], + ["1000", "250", "250000", "110", "95"], + ["1000", "250", "250000", "160", "131"], + ["1000", "250", "250000", "210", "164"], + ["1000", "250", "250000", "260", "195"], + ["1000", "250", "250000", "310", "223"], + ["1000", "250", "250000", "360", "249"], + ["1000", "250", "250000", "410", "274"], + ["1000", "250", "250000", "460", "298"], + ["1000", "250", "250000", "510", "320"], + ["1000", "250", "250000", "560", "341"], + ["1000", "250", "250000", "610", "361"], + ["1000", "250", "250000", "660", "381"], + ["1000", "250", "250000", "710", "399"], +]; + +export const above50percentTestCases = [ + ["1000", "250", "750000", "10", "29"], + ["1000", "250", "750000", "60", "175"], + ["1000", "250", "750000", "110", "314"], + ["1000", "250", "750000", "160", "449"], + ["1000", "250", "750000", "210", "579"], + ["1000", "250", "750000", "260", "706"], + ["1000", "250", "750000", "310", "830"], + ["1000", "250", "750000", "360", "952"], + ["1000", "250", "750000", "410", "1071"], + ["1000", "250", "750000", "460", "1187"], + ["1000", "250", "750000", "510", "1302"], + ["1000", "250", "750000", "560", "1414"], + ["1000", "250", "750000", "610", "1525"], + ["1000", "250", "750000", "660", "1635"], + ["1000", "250", "750000", "710", "1743"], +]; + +export const maxConnectorWeightTestCases = [ + ["1000", "250", "1000000", "10", "40"], + ["1000", "250", "1000000", "60", "240"], + ["1000", "250", "1000000", "110", "439"], + ["1000", "250", "1000000", "160", "640"], + ["1000", "250", "1000000", "210", "839"], + ["1000", "250", "1000000", "260", "1040"], + ["1000", "250", "1000000", "310", "1240"], + ["1000", "250", "1000000", "360", "1440"], + ["1000", "250", "1000000", "410", "1639"], + ["1000", "250", "1000000", "460", "1839"], + ["1000", "250", "1000000", "510", "2040"], + ["1000", "250", "1000000", "560", "2240"], + ["1000", "250", "1000000", "610", "2440"], + ["1000", "250", "1000000", "660", "2640"], + ["1000", "250", "1000000", "710", "2840"], +]; + +export const zilUpscaledTestCases = [ + [ + "1000000000000000", + "250000000000000", + "500000", + "10000000000000", + "19803902718557", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "60000000000000", + "113552872566004", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "110000000000000", + "199999999999999", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "160000000000000", + "280624847486569", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "210000000000000", + "356465996625053", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "260000000000000", + "428285685708569", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "310000000000000", + "496662954709576", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "360000000000000", + "562049935181330", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "410000000000000", + "624807680927192", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "460000000000000", + "685229954635271", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "510000000000000", + "743559577416269", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "560000000000000", + "800000000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "610000000000000", + "854723699099140", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "660000000000000", + "907878402833891", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "710000000000000", + "959591794226542", + ], +]; + +export const eighteenZeroesTestCases = [ + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "10000000000000000000", + "19803902718557032448", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "60000000000000000000", + "113552872566004432896", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "110000000000000000000", + "199999999999999967232", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "160000000000000000000", + "280624847486569807872", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "210000000000000000000", + "356465996625053614080", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "260000000000000000000", + "428285685708569968640", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "310000000000000000000", + "496662954709576646656", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "360000000000000000000", + "562049935181330841600", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "410000000000000000000", + "624807680927192055808", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "460000000000000000000", + "685229954635271634944", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "510000000000000000000", + "743559577416269299712", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "560000000000000000000", + "800000000000000000000", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "610000000000000000000", + "854723699099140751360", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "660000000000000000000", + "907878402833891328000", + ], + [ + "1000000000000000000000", + "250000000000000000000", + "500000", + "710000000000000000000", + "959591794226542411776", + ], +]; + +export const thirtyZeroesTestCases = [ + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "9999999999999999635896294965248", + "19803902718557033536696614912000", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "59999999999999997815377769791488", + "113552872566004449058760597438464", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "110000000000000000498458871988224", + "199999999999999974703527389822976", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "159999999999999994174340719443968", + "280624847486569816614059649269760", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "210000000000000005864621076381696", + "356465996625053661984963023601664", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "260000000000000017554901433319424", + "428285685708569994860300748193792", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "309999999999999993216384771293184", + "496662954709576465671623754645504", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "360000000000000040935462147194880", + "562049935181330924169982566727680", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "409999999999999980568148466204672", + "624807680927192113214042178322432", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "459999999999999992258428823142400", + "685229954635271635445358511783936", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "510000000000000003948709180080128", + "743559577416269460273404904996864", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "560000000000000015638989537017856", + "800000000000000187044485711003648", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "610000000000000027329269893955584", + "854723699099140758995007132663808", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "660000000000000039019550250893312", + "907878402833891398886204521840640", + ], + [ + "1000000000000000089690419062898688", + "250000000000000022422604765724672", + "500000", + "709999999999999978652236569903104", + "959591794226542462429088721141760", + ], +]; + +export const thirtyFiveZeroesTestCases = [ + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "999999999999999894846684784341549056", + "1980390271855703072645044743281049600", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "5999999999999999959375919064754946048", + "11355287256600443194364086154982064128", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "11000000000000000319053058524521168896", + "19999999999999994355158833534597070848", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "15999999999999998317546956549464784896", + "28062484748656980651446726891378049024", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "20999999999999998677224096009231007744", + "35646599662505361340085081946913243136", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "25999999999999999036901235468997230592", + "42828568570856992284882357045012987904", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "30999999999999997035395133493940846592", + "49666295470957670105207813517938262016", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "35999999999999999756255514388529676288", + "56204993518133082833914710380655935488", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "40999999999999997754749412413473292288", + "62480768092719207401471102168963481600", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "46000000000000000475609793308062121984", + "68522995463527152527217953155363897344", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "50999999999999993751737208463360524288", + "74355957741626934299822945638838960128", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "55999999999999996472597589357949353984", + "80000000000000005754834231356259565568", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "60999999999999999193457970252538183680", + "85472369909914065421750079399355482112", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "66000000000000001914318351147127013376", + "90787840283389134133236301186683895808", + ], + [ + "99999999999999997748809823456034029568", + "24999999999999999437202455864008507392", + "500000", + "70999999999999995190445766302425415680", + "95959179422654231342551346575285682176", + ], +]; + +/** + * the general log and exp are executed in very rare scenarios, + * but this confirms they work! + */ +export const generalLogGeneralExp = [ + [ + "1000000000000000000000", + "250", + "500000", + "10000000000000000000", + "199999998999999998009796460544", + ], + [ + "1000000000000000000000", + "250", + "500000", + "60000000000000000000", + "489897947556635603352300814336", + ], + [ + "1000000000000000000000", + "250", + "500000", + "110000000000000000000", + "663324957071080005958144884736", + ], + [ + "1000000000000000000000", + "250", + "500000", + "160000000000000000000", + "799999998999999981793073692672", + ], + [ + "1000000000000000000000", + "250", + "500000", + "210000000000000000000", + "916515137991168079790744797184", + ], + [ + "1000000000000000000000", + "250", + "500000", + "260000000000000000000", + "1019803901718556963011699933184", + ], + [ + "1000000000000000000000", + "250", + "500000", + "310000000000000000000", + "1113552871566004338001367269376", + ], + [ + "1000000000000000000000", + "250", + "500000", + "360000000000000000000", + "1199999999000000017894421299200", + ], + [ + "1000000000000000000000", + "250", + "500000", + "410000000000000000000", + "1280624846486569757348062035968", + ], + [ + "1000000000000000000000", + "250", + "500000", + "460000000000000000000", + "1356465995625053776107551064064", + ], + [ + "1000000000000000000000", + "250", + "500000", + "510000000000000000000", + "1428285684708569971623100153856", + ], + [ + "1000000000000000000000", + "250", + "500000", + "560000000000000000000", + "1496662953709576681125203410944", + ], + [ + "1000000000000000000000", + "250", + "500000", + "610000000000000000000", + "1562049934181331056306969116672", + ], + [ + "1000000000000000000000", + "250", + "500000", + "660000000000000000000", + "1624807679927191966127851831296", + ], + [ + "1000000000000000000000", + "250", + "500000", + "710000000000000000000", + "1685229953635271774337744502784", + ], +]; diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/saleReturnTestCases.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/saleReturnTestCases.ts new file mode 100644 index 000000000..5ba8aea83 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/cases/saleReturnTestCases.ts @@ -0,0 +1,198 @@ +export const saleReturnTestCases = [ + //bancor paper test cases + ["1000", "250", "500000", "0", "0"], + ["1000", "250", "500000", "10", "4"], + ["1000", "250", "500000", "60", "29"], + ["1000", "250", "500000", "110", "51"], + ["1000", "250", "500000", "160", "73"], + ["1000", "250", "500000", "210", "93"], + ["1000", "250", "500000", "260", "113"], + ["1000", "250", "500000", "310", "130"], + ["1000", "250", "500000", "360", "147"], + ["1000", "250", "500000", "410", "162"], + ["1000", "250", "500000", "460", "177"], + ["1000", "250", "500000", "510", "189"], + ["1000", "250", "500000", "560", "201"], + ["1000", "250", "500000", "610", "211"], + ["1000", "250", "500000", "660", "221"], + ["1000", "250", "500000", "710", "228"], + ["1000", "250", "500000", "760", "235"], + ["1000", "250", "500000", "810", "240"], + ["1000", "250", "500000", "860", "245"], + ["1000", "250", "500000", "910", "247"], + ["1000", "250", "500000", "960", "249"], + //below 50 % test cases + ["1000", "250", "250000", "10", "9"], + ["1000", "250", "250000", "60", "54"], + ["1000", "250", "250000", "110", "93"], + ["1000", "250", "250000", "160", "125"], + ["1000", "250", "250000", "210", "152"], + ["1000", "250", "250000", "260", "175"], + ["1000", "250", "250000", "310", "193"], + ["1000", "250", "250000", "360", "208"], + ["1000", "250", "250000", "410", "219"], + ["1000", "250", "250000", "460", "228"], + ["1000", "250", "250000", "510", "235"], + ["1000", "250", "250000", "560", "240"], + ["1000", "250", "250000", "610", "244"], + ["1000", "250", "250000", "660", "246"], + ["1000", "250", "250000", "710", "248"], + //above 50% test cases + ["1000", "250", "750000", "10", "3"], + ["1000", "250", "750000", "60", "19"], + ["1000", "250", "750000", "110", "35"], + ["1000", "250", "750000", "160", "51"], + ["1000", "250", "750000", "210", "67"], + ["1000", "250", "750000", "260", "82"], + ["1000", "250", "750000", "310", "97"], + ["1000", "250", "750000", "360", "112"], + ["1000", "250", "750000", "410", "126"], + ["1000", "250", "750000", "460", "140"], + ["1000", "250", "750000", "510", "153"], + ["1000", "250", "750000", "560", "166"], + ["1000", "250", "750000", "610", "178"], + ["1000", "250", "750000", "660", "190"], + ["1000", "250", "750000", "710", "202"], + //bancor paper test cases zil + ["1000000000000000", "250000000000000", "500000", "0", "0"], + [ + "1000000000000000", + "250000000000000", + "500000", + "10000000000000", + "4975000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "60000000000000", + "29100000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "110000000000000", + "51974999999999", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "160000000000000", + "73600000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "210000000000000", + "93974999999999", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "260000000000000", + "113100000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "310000000000000", + "130975000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "360000000000000", + "147600000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "410000000000000", + "162974999999999", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "460000000000000", + "177099999999999", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "510000000000000", + "189975000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "560000000000000", + "201600000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "610000000000000", + "211975000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "660000000000000", + "221100000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "710000000000000", + "228974999999999", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "760000000000000", + "235600000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "810000000000000", + "240975000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "860000000000000", + "245100000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "910000000000000", + "247975000000000", + ], + [ + "1000000000000000", + "250000000000000", + "500000", + "960000000000000", + "249600000000000", + ], +]; diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/run.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/run.ts new file mode 100644 index 000000000..8b1aed153 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/__tests__/run.ts @@ -0,0 +1,17 @@ +import { scillaServer } from "../../../scillaTest"; +import { testCalculatePurchaseReturn } from "./bancor/testCalculatePurchaseReturn"; +import { testCalculateSaleReturn } from "./bancor/testCalculateSaleReturn"; +import { testCalculateCrossConnectorReturn } from "./bancor/testCalculateCrossConnectorReturn"; +import { code } from "../build/bind"; + +(async () => { + try { + await testCalculatePurchaseReturn(code, scillaServer); + await testCalculateSaleReturn(code, scillaServer); + await testCalculateCrossConnectorReturn(code, scillaServer); + } catch (e) { + console.error(e); + } + console.info("Done!"); + process.exit(); +})(); diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/abi.json b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/abi.json new file mode 100644 index 000000000..78e19453f --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/abi.json @@ -0,0 +1,178 @@ +{ + "contract_info": { + "scilla_major_version": "0", + "vname": "BancorFormula", + "params": [], + "fields": [], + "transitions": [ + { + "vname": "CalculatePurchaseReturn", + "params": [ + { "vname": "in_supply", "type": "Uint128" }, + { "vname": "in_connector_balance", "type": "Uint128" }, + { "vname": "in_connector_weight", "type": "Uint128" }, + { "vname": "in_deposit_amount", "type": "Uint128" } + ] + }, + { + "vname": "CalculateSaleReturn", + "params": [ + { "vname": "in_supply", "type": "Uint128" }, + { "vname": "in_connector_balance", "type": "Uint128" }, + { "vname": "in_connector_weight", "type": "Uint128" }, + { "vname": "in_sell_amount", "type": "Uint128" } + ] + }, + { + "vname": "CalculateCrossConnectorReturn", + "params": [ + { "vname": "in_from_connector_balance", "type": "Uint128" }, + { "vname": "in_from_connector_weight", "type": "Uint128" }, + { "vname": "in_to_connector_balance", "type": "Uint128" }, + { "vname": "in_to_connector_weight", "type": "Uint128" }, + { "vname": "in_amount", "type": "Uint128" } + ] + } + ], + "procedures": [ + { + "vname": "ThrowError", + "params": [ { "vname": "err", "type": "BancorFormula.Error" } ] + }, + { + "vname": "AssertNotZero", + "params": [ { "vname": "value", "type": "Uint256" } ] + }, + { + "vname": "AssertIsLE", + "params": [ + { "vname": "i1", "type": "Uint256" }, + { "vname": "i2", "type": "Uint256" } + ] + }, + { + "vname": "SendCalculatePurchaseReturnCallback", + "params": [ { "vname": "result", "type": "Uint128" } ] + }, + { + "vname": "SendCalculateSaleReturnCallback", + "params": [ { "vname": "result", "type": "Uint128" } ] + }, + { + "vname": "SendCalculateCrossConnectorReturnCallback", + "params": [ { "vname": "result", "type": "Uint128" } ] + } + ], + "events": [], + "ADTs": [ + { + "tname": "BancorFormula.Error", + "tparams": [], + "tmap": [ + { "cname": "BancorFormula.CodeInputIsZero", "argtypes": [] }, + { "cname": "BancorFormula.CodeInputNotInBounds", "argtypes": [] } + ] + }, + { + "tname": "BancorFormula.ResAndX", + "tparams": [], + "tmap": [ + { + "cname": "BancorFormula.ResAndX", + "argtypes": [ "Uint256", "Uint256" ] + } + ] + }, + { + "tname": "Option", + "tparams": [ "'A" ], + "tmap": [ + { "cname": "Some", "argtypes": [ "'A" ] }, + { "cname": "None", "argtypes": [] } + ] + }, + { + "tname": "BancorFormula.ThresholdAndToAdd", + "tparams": [], + "tmap": [ + { + "cname": "BancorFormula.ThresholdAndToAdd", + "argtypes": [ "Uint256", "Uint256" ] + } + ] + }, + { + "tname": "BancorFormula.PrecisionAndMax", + "tparams": [], + "tmap": [ + { + "cname": "BancorFormula.PrecisionAndMax", + "argtypes": [ "Uint256", "Uint256" ] + } + ] + }, + { + "tname": "BancorFormula.XAndRes", + "tparams": [], + "tmap": [ + { + "cname": "BancorFormula.XAndRes", + "argtypes": [ "Uint256", "Uint256" ] + } + ] + }, + { + "tname": "BancorFormula.PowerResultAndPrecision", + "tparams": [], + "tmap": [ + { + "cname": "BancorFormula.PowerResultAndPrecision", + "argtypes": [ "Uint256", "Uint256" ] + } + ] + }, + { + "tname": "Bool", + "tparams": [], + "tmap": [ + { "cname": "True", "argtypes": [] }, + { "cname": "False", "argtypes": [] } + ] + }, + { + "tname": "Nat", + "tparams": [], + "tmap": [ + { "cname": "Zero", "argtypes": [] }, + { "cname": "Succ", "argtypes": [ "Nat" ] } + ] + }, + { + "tname": "List", + "tparams": [ "'A" ], + "tmap": [ + { "cname": "Cons", "argtypes": [ "'A", "List ('A)" ] }, + { "cname": "Nil", "argtypes": [] } + ] + }, + { + "tname": "Pair", + "tparams": [ "'A", "'B" ], + "tmap": [ { "cname": "Pair", "argtypes": [ "'A", "'B" ] } ] + }, + { + "tname": "BancorFormula.NAndRes", + "tparams": [], + "tmap": [ + { + "cname": "BancorFormula.NAndRes", + "argtypes": [ "Uint256", "Uint256" ] + } + ] + } + ] + }, + "warnings": [], + "gas_remaining": "9847" +} + diff --git a/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/bind.ts b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/bind.ts new file mode 100644 index 000000000..5a1575104 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/BancorFormula/build/bind.ts @@ -0,0 +1,1152 @@ +import { + getZil, + log, + getVersion, + getContract, + newContract, + getMinGasPrice, +} from "../../../boost-zil/infra-manipulation"; +import { BN, Long } from "@zilliqa-js/util"; +import { Transaction } from "@zilliqa-js/account"; +import { Contract } from "@zilliqa-js/contract"; +import * as T from "../../../boost-zil/signable"; +import * as BOOST from "../../../boost-zil"; +import { Zilliqa } from "@zilliqa-js/zilliqa"; + +/** + * general interface of the data returned by toJSON() on the transitions + */ +export type TransactionData = { + /** + * the signature hash of the source code of the contract that this data interacts with + */ + contractSignature: string, + /** + * contract to send the transaction to + */ + contractAddress: string, + /** + * zil amount to send + */ + amount: string, + /** + * the name of the transition called in the target contract + */ + contractTransitionName: string, + data: any[], +}; + +export const code = ` +(* sourceCodeHash=0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +(* sourceCodeHashKey=hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +scilla_version 0 + + + +import IntUtils ListUtils +library BancorFormula + +let c_MIN_PRECISION = Uint256 32 +let c_MAX_PRECISION = Uint256 127 +let c_MAX_WEIGHT = Uint256 1000000 +let c_FIXED_1 = Uint256 170141183460469231731687303715884105728 +let c_FIXED_2 = Uint256 340282366920938463463374607431768211456 +let c_MAX_NUM = Uint256 680564733841876926926749214863536422912 +let c_OPT_LOG_MAX_VAL = Uint256 462491687273110168575455517921668397539 +let c_OPT_EXP_MAX_VAL = Uint256 2722258935367507707706996859454145691648 +let c_LN2_NUMERATOR = Uint256 5275695611177340518812009417546793976 +let c_LN2_DENOMINATOR = Uint256 7611219895485218073587121647846406784 +let zero_uint128 = Uint128 0 +let zero_uint256 = Uint256 0 +let two_uint256 = Uint256 2 + +let one_msg = + fun (msg : Message) => + let nil_msg = Nil {Message} in + Cons {Message} msg nil_msg + +type Error = +| CodeInputIsZero +| CodeInputNotInBounds + +let make_error = + fun (result : Error) => + let result_code = + match result with + | CodeInputIsZero => Int32 -1 + | CodeInputNotInBounds => Int32 -2 + end + in + { _exception : "Error"; code : result_code } + + +let muldiv: Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(y: Uint256) => fun(z: Uint256) => + let xy = builtin mul x y in + builtin div xy z + + +let muladd: Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(y: Uint256) => fun(z: Uint256) => + let xy = builtin mul x y in + builtin add xy z + + +let submuldivadd: Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(k: Uint256) => fun(b: Uint256) => fun(z: Uint256) => fun(r: Uint256) => + let k_sub_b = builtin sub k b in + let tmp = muldiv x k_sub_b z in + builtin add tmp r + + +let panic: Uint256 -> Uint256 = + fun(numerator: Uint256) => + builtin div zero_uint256 zero_uint256 + + +let panic_uint128: Uint128 -> Uint128 = + fun(numerator: Uint128) => + let one = Uint128 1 in + let zero = Uint128 0 in + builtin div one zero + +let uint128_to_uint256: Uint128 -> Uint256 = + fun (x: Uint128) => + let ox256 = builtin to_uint256 x in + match ox256 with + | None => + + panic zero_uint256 + | Some x256 => x256 + end +let uint256_to_uint32: Uint256 -> Uint32 = + fun (x: Uint256) => + let ores32 = builtin to_uint32 x in + match ores32 with + | None => + + let zero = Uint32 0 in + let one = Uint32 1 in + + builtin div one zero + | Some res32 => + res32 + end + + +let pow_uint256: Uint256 -> Uint256 -> Uint256 = + fun(x: Uint256) => fun(y: Uint256) => + let y_32 = uint256_to_uint32 y in + builtin pow x y_32 + +let uint256_to_uint128: Uint256 -> Uint128 = + fun (x: Uint256) => + let ores128 = builtin to_uint128 x in + match ores128 with + | None => + + let zero = Uint128 0 in + panic_uint128 zero + | Some res128 => + res128 + end + + +type ThresholdAndToAdd = | ThresholdAndToAdd of Uint256 Uint256 +type XAndRes = | XAndRes of Uint256 Uint256 +let optimalLog: Uint256 -> Uint256 = + fun(x: Uint256) => + + + let threshold_val0 = Uint256 280515388193368458015406427511040113880 in + let to_add0 = Uint256 85070591730234615865843651857942052864 in + let threshold0 = ThresholdAndToAdd threshold_val0 to_add0 in + let threshold_val1 = Uint256 218465603988574474844591417643679820199 in + let to_add1 = Uint256 42535295865117307932921825928971026432 in + let threshold1 = ThresholdAndToAdd threshold_val1 to_add1 in + let threshold_val2 = Uint256 192795218841189805222451540510555621025 in + let to_add2 = Uint256 21267647932558653966460912964485513216 in + let threshold2 = ThresholdAndToAdd threshold_val2 to_add2 in + let threshold_val3 = Uint256 181114347027396448854165353426875372712 in + let to_add3 = Uint256 10633823966279326983230456482242756608 in + let threshold3 = ThresholdAndToAdd threshold_val3 to_add3 in + let threshold_val4 = Uint256 175542044379434494067323265867529472979 in + let to_add4 = Uint256 5316911983139663491615228241121378304 in + let threshold4 = ThresholdAndToAdd threshold_val4 to_add4 in + let threshold_val5 = Uint256 172820517236198538127967385733353125282 in + let to_add5 = Uint256 2658455991569831745807614120560689152 in + let threshold5 = ThresholdAndToAdd threshold_val5 to_add5 in + let threshold_val6 = Uint256 171475617301169790829459146906809945753 in + let to_add6 = Uint256 1329227995784915872903807060280344576 in + let threshold6 = ThresholdAndToAdd threshold_val6 to_add6 in + let threshold_val7 = Uint256 170807097224429000759274174605493073715 in + let to_add7 = Uint256 664613997892457936451903530140172288 in + let threshold7 = ThresholdAndToAdd threshold_val7 to_add7 in + + let nil = Nil {ThresholdAndToAdd} in + let l0 = Cons {ThresholdAndToAdd} threshold0 nil in + let l1 = Cons {ThresholdAndToAdd} threshold1 l0 in + let l2 = Cons {ThresholdAndToAdd} threshold2 l1 in + let l3 = Cons {ThresholdAndToAdd} threshold3 l2 in + let l4 = Cons {ThresholdAndToAdd} threshold4 l3 in + let l5 = Cons {ThresholdAndToAdd} threshold5 l4 in + let l6 = Cons {ThresholdAndToAdd} threshold6 l5 in + let l7 = Cons {ThresholdAndToAdd} threshold7 l6 in + + let folder_stage_1 = fun(x_and_res: XAndRes) => fun(threshold_and_to_add: ThresholdAndToAdd) => + match x_and_res with + | XAndRes local_x local_res => + match threshold_and_to_add with + | ThresholdAndToAdd threshold to_add => + let x_ge = uint256_ge local_x threshold in + match x_ge with + | True => + let newRes = builtin add local_res to_add in + let newX = muldiv local_x c_FIXED_1 threshold in + XAndRes newX newRes + | False => XAndRes local_x local_res + end + end + end in + + let fold_stage_1 = @list_foldl ThresholdAndToAdd XAndRes in + + let xAndResInit = XAndRes x zero_uint256 in + + let stage_1_x_and_res = fold_stage_1 folder_stage_1 xAndResInit l7 in + match stage_1_x_and_res with + | XAndRes x_1 local_res_0 => + + + let y = builtin sub x_1 c_FIXED_1 in + let z0 = y in + let w = muldiv y y c_FIXED_1 in + + + let numerator1 = Uint256 340282366920938463463374607431768211456 in + let denominator1 = Uint256 340282366920938463463374607431768211456 in + let local_res_1 = submuldivadd z0 numerator1 y denominator1 local_res_0 in let z1 = muldiv z0 w c_FIXED_1 in + let numerator2 = Uint256 226854911280625642308916404954512140970 in + let denominator2 = Uint256 680564733841876926926749214863536422912 in + let local_res_2 = submuldivadd z1 numerator2 y denominator2 local_res_1 in let z2 = muldiv z1 w c_FIXED_1 in + let numerator3 = Uint256 204169420152563078078024764459060926873 in + let denominator3 = Uint256 1020847100762815390390123822295304634368 in + let local_res_3 = submuldivadd z2 numerator3 y denominator3 local_res_2 in let z3 = muldiv z2 w c_FIXED_1 in + let numerator4 = Uint256 194447066811964836264785489961010406546 in + let denominator4 = Uint256 1361129467683753853853498429727072845824 in + let local_res_4 = submuldivadd z3 numerator4 y denominator4 local_res_3 in let z4 = muldiv z3 w c_FIXED_1 in + let numerator5 = Uint256 189045759400521368590763670795426784142 in + let denominator5 = Uint256 1701411834604692317316873037158841057280 in + let local_res_5 = submuldivadd z4 numerator5 y denominator5 local_res_4 in let z5 = muldiv z4 w c_FIXED_1 in + let numerator6 = Uint256 185608563775057343707295240417328115339 in + let denominator6 = Uint256 2041694201525630780780247644590609268736 in + let local_res_6 = submuldivadd z5 numerator6 y denominator6 local_res_5 in let z6 = muldiv z5 w c_FIXED_1 in + let numerator7 = Uint256 183228966803582249557201711694029036937 in + let denominator7 = Uint256 2381976568446569244243622252022377480192 in + let local_res_7 = submuldivadd z6 numerator7 y denominator7 local_res_6 in let z7 = muldiv z6 w c_FIXED_1 in + let numerator8 = Uint256 181483929024500513847133123963609712776 in + let denominator8 = Uint256 2722258935367507707706996859454145691648 in + let local_res_8 = submuldivadd z7 numerator8 y denominator8 local_res_7 in + + local_res_8 + end + + +type NAndRes = | NAndRes of Uint256 Uint256 +let floorLog2: Uint256 -> Uint256 = + fun(in_n: Uint256) => + let nil = Nil {Uint256} in + let i_temp1 = Uint256 1 in let l1 = Cons {Uint256} i_temp1 nil in let i_temp2 = Uint256 2 in let l2 = Cons {Uint256} i_temp2 l1 in let i_temp3 = Uint256 4 in let l3 = Cons {Uint256} i_temp3 l2 in let i_temp4 = Uint256 8 in let l4 = Cons {Uint256} i_temp4 l3 in let i_temp5 = Uint256 16 in let l5 = Cons {Uint256} i_temp5 l4 in let i_temp6 = Uint256 32 in let l6 = Cons {Uint256} i_temp6 l5 in let i_temp7 = Uint256 64 in let l7 = Cons {Uint256} i_temp7 l6 in let i_temp8 = Uint256 128 in let l8 = Cons {Uint256} i_temp8 l7 in + let uint256_256 = Uint256 256 in + let in_n_lt_256 = uint256_lt in_n uint256_256 in + let init = NAndRes in_n zero_uint256 in + let result_n_and_res = match in_n_lt_256 with + | True => + let folder: NAndRes -> Uint256 -> Option NAndRes = + fun(local_n_and_res: NAndRes) => fun(index: Uint256) => + match local_n_and_res with + | NAndRes local_n local_res => + let one = Uint256 1 in + let local_n_gt_one = uint256_gt local_n one in + match local_n_gt_one with + | False => None {NAndRes} + | True => + let new_n = builtin div local_n two_uint256 in + let new_res = builtin add local_res one in + let tmp = NAndRes new_n new_res in + Some {NAndRes} tmp + end + end in + let fold = @list_foldl_while Uint256 NAndRes in + fold folder init l8 + | False => + let folder: NAndRes -> Uint256 -> NAndRes = + fun(local_n_and_res: NAndRes) => fun(bits: Uint256) => + match local_n_and_res with + | NAndRes local_n local_res => + let two_pow_bits = pow_uint256 two_uint256 bits in + let n_ge_two_pow_bits = uint256_ge local_n two_pow_bits in + match n_ge_two_pow_bits with + | True => + + let new_n = builtin div local_n two_pow_bits in + + let new_res = builtin add local_res bits in + NAndRes new_n new_res + | False => NAndRes local_n local_res + end + end in + let fold = @list_foldl Uint256 NAndRes in + fold folder init l8 + end in + match result_n_and_res with + | NAndRes result_n result_res => result_res + end + + +type ResAndX = | ResAndX of Uint256 Uint256 +let generalLog: Uint256 -> Uint256 = + fun(x: Uint256) => + + let x_ge_two = uint256_ge x c_FIXED_2 in + let res_and_x = match x_ge_two with + | True => + let x_div_c_FIXED_1 = builtin div x c_FIXED_1 in + let count = floorLog2 x_div_c_FIXED_1 in + let two_pow_count = pow_uint256 two_uint256 count in + let xshifted = builtin div x two_pow_count in + let newRes = builtin mul count c_FIXED_1 in + ResAndX newRes xshifted + | False => ResAndX zero_uint256 x + end in + match res_and_x with + | ResAndX res1 x1 => + + let x1_gt_c_FIXED_1 = uint256_gt x1 c_FIXED_1 in + match x1_gt_c_FIXED_1 with + | True => + + let nil = Nil {Uint256} in + let i_temp1 = Uint256 1 in let l1 = Cons {Uint256} i_temp1 nil in let i_temp2 = Uint256 2 in let l2 = Cons {Uint256} i_temp2 l1 in let i_temp3 = Uint256 3 in let l3 = Cons {Uint256} i_temp3 l2 in let i_temp4 = Uint256 4 in let l4 = Cons {Uint256} i_temp4 l3 in let i_temp5 = Uint256 5 in let l5 = Cons {Uint256} i_temp5 l4 in let i_temp6 = Uint256 6 in let l6 = Cons {Uint256} i_temp6 l5 in let i_temp7 = Uint256 7 in let l7 = Cons {Uint256} i_temp7 l6 in let i_temp8 = Uint256 8 in let l8 = Cons {Uint256} i_temp8 l7 in let i_temp9 = Uint256 9 in let l9 = Cons {Uint256} i_temp9 l8 in let i_temp10 = Uint256 10 in let l10 = Cons {Uint256} i_temp10 l9 in let i_temp11 = Uint256 11 in let l11 = Cons {Uint256} i_temp11 l10 in let i_temp12 = Uint256 12 in let l12 = Cons {Uint256} i_temp12 l11 in let i_temp13 = Uint256 13 in let l13 = Cons {Uint256} i_temp13 l12 in let i_temp14 = Uint256 14 in let l14 = Cons {Uint256} i_temp14 l13 in let i_temp15 = Uint256 15 in let l15 = Cons {Uint256} i_temp15 l14 in let i_temp16 = Uint256 16 in let l16 = Cons {Uint256} i_temp16 l15 in let i_temp17 = Uint256 17 in let l17 = Cons {Uint256} i_temp17 l16 in let i_temp18 = Uint256 18 in let l18 = Cons {Uint256} i_temp18 l17 in let i_temp19 = Uint256 19 in let l19 = Cons {Uint256} i_temp19 l18 in let i_temp20 = Uint256 20 in let l20 = Cons {Uint256} i_temp20 l19 in let i_temp21 = Uint256 21 in let l21 = Cons {Uint256} i_temp21 l20 in let i_temp22 = Uint256 22 in let l22 = Cons {Uint256} i_temp22 l21 in + let i_temp23 = Uint256 23 in let l23 = Cons {Uint256} i_temp23 l22 in let i_temp24 = Uint256 24 in let l24 = Cons {Uint256} i_temp24 l23 in let i_temp25 = Uint256 25 in let l25 = Cons {Uint256} i_temp25 l24 in let i_temp26 = Uint256 26 in let l26 = Cons {Uint256} i_temp26 l25 in let i_temp27 = Uint256 27 in let l27 = Cons {Uint256} i_temp27 l26 in let i_temp28 = Uint256 28 in let l28 = Cons {Uint256} i_temp28 l27 in let i_temp29 = Uint256 29 in let l29 = Cons {Uint256} i_temp29 l28 in let i_temp30 = Uint256 30 in let l30 = Cons {Uint256} i_temp30 l29 in let i_temp31 = Uint256 31 in let l31 = Cons {Uint256} i_temp31 l30 in let i_temp32 = Uint256 32 in let l32 = Cons {Uint256} i_temp32 l31 in let i_temp33 = Uint256 33 in let l33 = Cons {Uint256} i_temp33 l32 in let i_temp34 = Uint256 34 in let l34 = Cons {Uint256} i_temp34 l33 in let i_temp35 = Uint256 35 in let l35 = Cons {Uint256} i_temp35 l34 in let i_temp36 = Uint256 36 in let l36 = Cons {Uint256} i_temp36 l35 in let i_temp37 = Uint256 37 in let l37 = Cons {Uint256} i_temp37 l36 in let i_temp38 = Uint256 38 in let l38 = Cons {Uint256} i_temp38 l37 in let i_temp39 = Uint256 39 in let l39 = Cons {Uint256} i_temp39 l38 in let i_temp40 = Uint256 40 in let l40 = Cons {Uint256} i_temp40 l39 in let i_temp41 = Uint256 41 in let l41 = Cons {Uint256} i_temp41 l40 in let i_temp42 = Uint256 42 in let l42 = Cons {Uint256} i_temp42 l41 in let i_temp43 = Uint256 43 in let l43 = Cons {Uint256} i_temp43 l42 in + let i_temp44 = Uint256 44 in let l44 = Cons {Uint256} i_temp44 l43 in let i_temp45 = Uint256 45 in let l45 = Cons {Uint256} i_temp45 l44 in let i_temp46 = Uint256 46 in let l46 = Cons {Uint256} i_temp46 l45 in let i_temp47 = Uint256 47 in let l47 = Cons {Uint256} i_temp47 l46 in let i_temp48 = Uint256 48 in let l48 = Cons {Uint256} i_temp48 l47 in let i_temp49 = Uint256 49 in let l49 = Cons {Uint256} i_temp49 l48 in let i_temp50 = Uint256 50 in let l50 = Cons {Uint256} i_temp50 l49 in let i_temp51 = Uint256 51 in let l51 = Cons {Uint256} i_temp51 l50 in let i_temp52 = Uint256 52 in let l52 = Cons {Uint256} i_temp52 l51 in let i_temp53 = Uint256 53 in let l53 = Cons {Uint256} i_temp53 l52 in let i_temp54 = Uint256 54 in let l54 = Cons {Uint256} i_temp54 l53 in let i_temp55 = Uint256 55 in let l55 = Cons {Uint256} i_temp55 l54 in let i_temp56 = Uint256 56 in let l56 = Cons {Uint256} i_temp56 l55 in let i_temp57 = Uint256 57 in let l57 = Cons {Uint256} i_temp57 l56 in let i_temp58 = Uint256 58 in let l58 = Cons {Uint256} i_temp58 l57 in let i_temp59 = Uint256 59 in let l59 = Cons {Uint256} i_temp59 l58 in let i_temp60 = Uint256 60 in let l60 = Cons {Uint256} i_temp60 l59 in let i_temp61 = Uint256 61 in let l61 = Cons {Uint256} i_temp61 l60 in let i_temp62 = Uint256 62 in let l62 = Cons {Uint256} i_temp62 l61 in let i_temp63 = Uint256 63 in let l63 = Cons {Uint256} i_temp63 l62 in let i_temp64 = Uint256 64 in let l64 = Cons {Uint256} i_temp64 l63 in + let i_temp65 = Uint256 65 in let l65 = Cons {Uint256} i_temp65 l64 in let i_temp66 = Uint256 66 in let l66 = Cons {Uint256} i_temp66 l65 in let i_temp67 = Uint256 67 in let l67 = Cons {Uint256} i_temp67 l66 in let i_temp68 = Uint256 68 in let l68 = Cons {Uint256} i_temp68 l67 in let i_temp69 = Uint256 69 in let l69 = Cons {Uint256} i_temp69 l68 in let i_temp70 = Uint256 70 in let l70 = Cons {Uint256} i_temp70 l69 in let i_temp71 = Uint256 71 in let l71 = Cons {Uint256} i_temp71 l70 in let i_temp72 = Uint256 72 in let l72 = Cons {Uint256} i_temp72 l71 in let i_temp73 = Uint256 73 in let l73 = Cons {Uint256} i_temp73 l72 in let i_temp74 = Uint256 74 in let l74 = Cons {Uint256} i_temp74 l73 in let i_temp75 = Uint256 75 in let l75 = Cons {Uint256} i_temp75 l74 in let i_temp76 = Uint256 76 in let l76 = Cons {Uint256} i_temp76 l75 in let i_temp77 = Uint256 77 in let l77 = Cons {Uint256} i_temp77 l76 in let i_temp78 = Uint256 78 in let l78 = Cons {Uint256} i_temp78 l77 in let i_temp79 = Uint256 79 in let l79 = Cons {Uint256} i_temp79 l78 in let i_temp80 = Uint256 80 in let l80 = Cons {Uint256} i_temp80 l79 in let i_temp81 = Uint256 81 in let l81 = Cons {Uint256} i_temp81 l80 in let i_temp82 = Uint256 82 in let l82 = Cons {Uint256} i_temp82 l81 in let i_temp83 = Uint256 83 in let l83 = Cons {Uint256} i_temp83 l82 in let i_temp84 = Uint256 84 in let l84 = Cons {Uint256} i_temp84 l83 in let i_temp85 = Uint256 85 in let l85 = Cons {Uint256} i_temp85 l84 in + let i_temp86 = Uint256 86 in let l86 = Cons {Uint256} i_temp86 l85 in let i_temp87 = Uint256 87 in let l87 = Cons {Uint256} i_temp87 l86 in let i_temp88 = Uint256 88 in let l88 = Cons {Uint256} i_temp88 l87 in let i_temp89 = Uint256 89 in let l89 = Cons {Uint256} i_temp89 l88 in let i_temp90 = Uint256 90 in let l90 = Cons {Uint256} i_temp90 l89 in let i_temp91 = Uint256 91 in let l91 = Cons {Uint256} i_temp91 l90 in let i_temp92 = Uint256 92 in let l92 = Cons {Uint256} i_temp92 l91 in let i_temp93 = Uint256 93 in let l93 = Cons {Uint256} i_temp93 l92 in let i_temp94 = Uint256 94 in let l94 = Cons {Uint256} i_temp94 l93 in let i_temp95 = Uint256 95 in let l95 = Cons {Uint256} i_temp95 l94 in let i_temp96 = Uint256 96 in let l96 = Cons {Uint256} i_temp96 l95 in let i_temp97 = Uint256 97 in let l97 = Cons {Uint256} i_temp97 l96 in let i_temp98 = Uint256 98 in let l98 = Cons {Uint256} i_temp98 l97 in let i_temp99 = Uint256 99 in let l99 = Cons {Uint256} i_temp99 l98 in let i_temp100 = Uint256 100 in let l100 = Cons {Uint256} i_temp100 l99 in let i_temp101 = Uint256 101 in let l101 = Cons {Uint256} i_temp101 l100 in let i_temp102 = Uint256 102 in let l102 = Cons {Uint256} i_temp102 l101 in let i_temp103 = Uint256 103 in let l103 = Cons {Uint256} i_temp103 l102 in let i_temp104 = Uint256 104 in let l104 = Cons {Uint256} i_temp104 l103 in let i_temp105 = Uint256 105 in let l105 = Cons {Uint256} i_temp105 l104 in + let i_temp106 = Uint256 106 in let l106 = Cons {Uint256} i_temp106 l105 in let i_temp107 = Uint256 107 in let l107 = Cons {Uint256} i_temp107 l106 in let i_temp108 = Uint256 108 in let l108 = Cons {Uint256} i_temp108 l107 in let i_temp109 = Uint256 109 in let l109 = Cons {Uint256} i_temp109 l108 in let i_temp110 = Uint256 110 in let l110 = Cons {Uint256} i_temp110 l109 in let i_temp111 = Uint256 111 in let l111 = Cons {Uint256} i_temp111 l110 in let i_temp112 = Uint256 112 in let l112 = Cons {Uint256} i_temp112 l111 in let i_temp113 = Uint256 113 in let l113 = Cons {Uint256} i_temp113 l112 in let i_temp114 = Uint256 114 in let l114 = Cons {Uint256} i_temp114 l113 in let i_temp115 = Uint256 115 in let l115 = Cons {Uint256} i_temp115 l114 in let i_temp116 = Uint256 116 in let l116 = Cons {Uint256} i_temp116 l115 in let i_temp117 = Uint256 117 in let l117 = Cons {Uint256} i_temp117 l116 in let i_temp118 = Uint256 118 in let l118 = Cons {Uint256} i_temp118 l117 in let i_temp119 = Uint256 119 in let l119 = Cons {Uint256} i_temp119 l118 in let i_temp120 = Uint256 120 in let l120 = Cons {Uint256} i_temp120 l119 in let i_temp121 = Uint256 121 in let l121 = Cons {Uint256} i_temp121 l120 in let i_temp122 = Uint256 122 in let l122 = Cons {Uint256} i_temp122 l121 in let i_temp123 = Uint256 123 in let l123 = Cons {Uint256} i_temp123 l122 in let i_temp124 = Uint256 124 in let l124 = Cons {Uint256} i_temp124 l123 in + let i_temp125 = Uint256 125 in let l125 = Cons {Uint256} i_temp125 l124 in let i_temp126 = Uint256 126 in let l126 = Cons {Uint256} i_temp126 l125 in let i_temp127 = Uint256 127 in let l127 = Cons {Uint256} i_temp127 l126 in + let folder = fun(cur_res_and_x: ResAndX) => fun(i: Uint256) => + match cur_res_and_x with + | ResAndX local_res local_x => + let new_x = muldiv local_x local_x c_FIXED_1 in + let new_x_ge_two = uint256_ge new_x c_FIXED_2 in + match new_x_ge_two with + | True => + let shiftedX = builtin div new_x two_uint256 in + let one = Uint256 1 in + let i_minus_one = builtin sub i one in + let two_pow_i_minus_one = pow_uint256 two_uint256 i_minus_one in + let oneShifted = builtin mul one two_pow_i_minus_one in + let newRes = builtin add local_res oneShifted in + ResAndX newRes shiftedX + | False => ResAndX local_res new_x + end + end in + let fold = @list_foldl Uint256 ResAndX in + let init = ResAndX res1 x1 in + let result_res_and_x = fold folder init l127 in + match result_res_and_x with + | ResAndX res2 x2 => + muldiv res2 c_LN2_NUMERATOR c_LN2_DENOMINATOR + end + | False => muldiv res1 c_LN2_NUMERATOR c_LN2_DENOMINATOR + end + end + + +let log: Uint256 -> Uint256 = + fun(base: Uint256) => + let can_do_optimal_log = uint256_lt base c_OPT_LOG_MAX_VAL in + match can_do_optimal_log with + | True => optimalLog base + | False => generalLog base + end + + + +type PowerResultAndPrecision = +| PowerResultAndPrecision of Uint256 Uint256 + + +let panic_if_uint256_not_lt_uint256: Uint256 -> Uint256 -> Bool = + fun(i1: Uint256) => fun(i2: Uint256) => + let is_less_than = uint256_lt i1 i2 in + let tmp = match is_less_than with | True => zero_uint256 | False => panic zero_uint256 end in + is_less_than + + +let optimalExp: Uint256 -> Uint256 = fun(x: Uint256) => + let res1 = Uint256 0 in + let two_pow_minus_three = Uint256 21267647932558653966460912964485513216 in + let z1 = builtin rem x two_pow_minus_three in + let y = z1 in + let z2 = muldiv z1 y c_FIXED_1 in let tmp2 = Uint256 1216451004088320000 in let res2 = muladd z2 tmp2 res1 in + let z3 = muldiv z2 y c_FIXED_1 in let tmp3 = Uint256 405483668029440000 in let res3 = muladd z3 tmp3 res2 in + let z4 = muldiv z3 y c_FIXED_1 in let tmp4 = Uint256 101370917007360000 in let res4 = muladd z4 tmp4 res3 in + let z5 = muldiv z4 y c_FIXED_1 in let tmp5 = Uint256 20274183401472000 in let res5 = muladd z5 tmp5 res4 in + let z6 = muldiv z5 y c_FIXED_1 in let tmp6 = Uint256 3379030566912000 in let res6 = muladd z6 tmp6 res5 in + let z7 = muldiv z6 y c_FIXED_1 in let tmp7 = Uint256 482718652416000 in let res7 = muladd z7 tmp7 res6 in + let z8 = muldiv z7 y c_FIXED_1 in let tmp8 = Uint256 60339831552000 in let res8 = muladd z8 tmp8 res7 in + let z9 = muldiv z8 y c_FIXED_1 in let tmp9 = Uint256 6704425728000 in let res9 = muladd z9 tmp9 res8 in + let z10 = muldiv z9 y c_FIXED_1 in let tmp10 = Uint256 670442572800 in let res10 = muladd z10 tmp10 res9 in + let z11 = muldiv z10 y c_FIXED_1 in let tmp11 = Uint256 60949324800 in let res11 = muladd z11 tmp11 res10 in + let z12 = muldiv z11 y c_FIXED_1 in let tmp12 = Uint256 5079110400 in let res12 = muladd z12 tmp12 res11 in + let z13 = muldiv z12 y c_FIXED_1 in let tmp13 = Uint256 390700800 in let res13 = muladd z13 tmp13 res12 in + let z14 = muldiv z13 y c_FIXED_1 in let tmp14 = Uint256 27907200 in let res14 = muladd z14 tmp14 res13 in + let z15 = muldiv z14 y c_FIXED_1 in let tmp15 = Uint256 1860480 in let res15 = muladd z15 tmp15 res14 in + let z16 = muldiv z15 y c_FIXED_1 in let tmp16 = Uint256 116280 in let res16 = muladd z16 tmp16 res15 in + let z17 = muldiv z16 y c_FIXED_1 in let tmp17 = Uint256 6840 in let res17 = muladd z17 tmp17 res16 in + let z18 = muldiv z17 y c_FIXED_1 in let tmp18 = Uint256 380 in let res18 = muladd z18 tmp18 res17 in + let z19 = muldiv z18 y c_FIXED_1 in let tmp19 = Uint256 20 in let res19 = muladd z19 tmp19 res18 in + let z20 = muldiv z19 y c_FIXED_1 in let tmp20 = Uint256 1 in let res20 = muladd z20 tmp20 res19 in + let y_add_c_FIXED_1 = builtin add y c_FIXED_1 in + let fac20 = Uint256 2432902008176640000 in + let res_div_fac_20 = builtin div res20 fac20 in + let res21 = builtin add res_div_fac_20 y_add_c_FIXED_1 in + + + let if_contains_muldiv: Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 -> Uint256 = + fun(local_x: Uint256) => fun(bits: Uint256) => fun(res: Uint256) => fun(numerator: Uint256) => fun(denominator: Uint256) => + let one = Uint256 1 in + let bits_add_one = builtin add bits one in + let two_pow_bits_add_one = pow_uint256 two_uint256 bits_add_one in + let x_mod_condition = builtin rem local_x two_pow_bits_add_one in + let two_pow_bits = pow_uint256 two_uint256 bits in + let modded_div_bits = builtin div x_mod_condition two_pow_bits in + let x_not_contains = builtin eq zero_uint256 modded_div_bits in + match x_not_contains with + | True => res + | False => muldiv res numerator denominator + end in + + + let res22 = let bits = Uint256 124 in let numerator = Uint256 600596269623765960634066700837880239609 in let denominator = Uint256 530024347646835984032474664511850276726 in if_contains_muldiv x bits res21 numerator denominator in + + let res23 = let bits = Uint256 125 in let numerator = Uint256 530024347646835984032474664511850276728 in let denominator = Uint256 412783376994266390547521411024565284564 in if_contains_muldiv x bits res22 numerator denominator in + + let res24 = let bits = Uint256 126 in let numerator = Uint256 412783376994266390547521411024565284565 in let denominator = Uint256 250365773966741064234501452596301656607 in if_contains_muldiv x bits res23 numerator denominator in + + let res25 = let bits = Uint256 127 in let numerator = Uint256 250365773966741064234501452596301656606 in let denominator = Uint256 92104421015340344839251721785254237641 in if_contains_muldiv x bits res24 numerator denominator in + + let res26 = let bits = Uint256 128 in let numerator = Uint256 92104421015340344839251721785254237637 in let denominator = Uint256 12464977905455307901915658421775307242 in if_contains_muldiv x bits res25 numerator denominator in + + let res27 = let bits = Uint256 129 in let numerator = Uint256 12464977905455307901915658421775307223 in let denominator = Uint256 228304034072369565894155946646425149 in if_contains_muldiv x bits res26 numerator denominator in + + let res28 = let bits = Uint256 130 in let numerator = Uint256 228304034072369565894155946646422279 in let denominator = Uint256 76587471230661696290698490699025 in if_contains_muldiv x bits res27 numerator denominator in + res28 + + + +type PrecisionAndMax = | PrecisionAndMax of Uint256 Uint256 +let findPositionInMaxExpArray: Uint256 -> Uint256 = fun(x: Uint256) => +let res31 = PrecisionAndMax zero_uint256 zero_uint256 in +let setNewIfXSmaller: PrecisionAndMax -> Uint256 -> Uint256 -> PrecisionAndMax = + fun(prev: PrecisionAndMax) => fun(arrIndex: Uint256) => fun(val: Uint256) => + let x_lt_val = uint256_lt x val in + match x_lt_val with | True => PrecisionAndMax arrIndex val | False => prev end in + let res32 = let arrIndex = Uint256 32 in let val = Uint256 9599678685041259184274752310158947254271 in setNewIfXSmaller res31 arrIndex val in + let res33 = let arrIndex = Uint256 33 in let val = Uint256 9204759687141885226475603015507577405439 in setNewIfXSmaller res32 arrIndex val in + let res34 = let arrIndex = Uint256 34 in let val = Uint256 8826087172077985712041017634911355404287 in setNewIfXSmaller res33 arrIndex val in + let res35 = let arrIndex = Uint256 35 in let val = Uint256 8462992779488582574159642900919291478015 in setNewIfXSmaller res34 arrIndex val in + let res36 = let arrIndex = Uint256 36 in let val = Uint256 8114835644520100661580084966409403105279 in setNewIfXSmaller res35 arrIndex val in + let res37 = let arrIndex = Uint256 37 in let val = Uint256 7781001266736647064069662172832600162303 in setNewIfXSmaller res36 arrIndex val in + let res38 = let arrIndex = Uint256 38 in let val = Uint256 7460900425488323202194551465008353509375 in setNewIfXSmaller res37 arrIndex val in + let res39 = let arrIndex = Uint256 39 in let val = Uint256 7153968139937914349310206877837545177087 in setNewIfXSmaller res38 arrIndex val in + let res40 = let arrIndex = Uint256 40 in let val = Uint256 6859662671868001546166128217910528704511 in setNewIfXSmaller res39 arrIndex val in + let res41 = let arrIndex = Uint256 41 in let val = Uint256 6577464569506365633454696454958677491711 in setNewIfXSmaller res40 arrIndex val in + let res42 = let arrIndex = Uint256 42 in let val = Uint256 6306875750689218484600399768107450630143 in setNewIfXSmaller res41 arrIndex val in + let res43 = let arrIndex = Uint256 43 in let val = Uint256 6047418623741353042663269283551730728959 in setNewIfXSmaller res42 arrIndex val in + let res44 = let arrIndex = Uint256 44 in let val = Uint256 5798635244522972732941736303310812479487 in setNewIfXSmaller res43 arrIndex val in + let res45 = let arrIndex = Uint256 45 in let val = Uint256 5560086508154074440893281558760167309311 in setNewIfXSmaller res44 arrIndex val in + let res46 = let arrIndex = Uint256 46 in let val = Uint256 5331351373990447379730864460340651884543 in setNewIfXSmaller res45 arrIndex val in + let res47 = let arrIndex = Uint256 47 in let val = Uint256 5112026122483163422598731111238626967551 in setNewIfXSmaller res46 arrIndex val in + let res48 = let arrIndex = Uint256 48 in let val = Uint256 4901723642609993464238960471454494228479 in setNewIfXSmaller res47 arrIndex val in + let res49 = let arrIndex = Uint256 49 in let val = Uint256 4700072748620998500994433661760029327359 in setNewIfXSmaller res48 arrIndex val in + let res50 = let arrIndex = Uint256 50 in let val = Uint256 4506717524892375150236886652795301658623 in setNewIfXSmaller res49 arrIndex val in + let res51 = let arrIndex = Uint256 51 in let val = Uint256 4321316697732212547034601541953113817087 in setNewIfXSmaller res50 arrIndex val in + let res52 = let arrIndex = Uint256 52 in let val = Uint256 4143543033029384782309349805264440655871 in setNewIfXSmaller res51 arrIndex val in + let res53 = let arrIndex = Uint256 53 in let val = Uint256 3973082758682431363936722477132055314431 in setNewIfXSmaller res52 arrIndex val in + let res54 = let arrIndex = Uint256 54 in let val = Uint256 3809635010789003168527049097368437784575 in setNewIfXSmaller res53 arrIndex val in + let res55 = let arrIndex = Uint256 55 in let val = Uint256 3652911302618395401280222488042819026943 in setNewIfXSmaller res54 arrIndex val in + let res56 = let arrIndex = Uint256 56 in let val = Uint256 3502635015429898674229017626613836152831 in setNewIfXSmaller res55 arrIndex val in + let res57 = let arrIndex = Uint256 57 in let val = Uint256 3358540910238258030536300376569398951935 in setNewIfXSmaller res56 arrIndex val in + let res58 = let arrIndex = Uint256 58 in let val = Uint256 3220374659664501751807634855053158776831 in setNewIfXSmaller res57 arrIndex val in + let res59 = let arrIndex = Uint256 59 in let val = Uint256 3087892399045852422628542596524428754943 in setNewIfXSmaller res58 arrIndex val in + let res60 = let arrIndex = Uint256 60 in let val = Uint256 2960860296012425255212778080756987592703 in setNewIfXSmaller res59 arrIndex val in + let res61 = let arrIndex = Uint256 61 in let val = Uint256 2839054137771012724926516325250418868223 in setNewIfXSmaller res60 arrIndex val in + let res62 = let arrIndex = Uint256 62 in let val = Uint256 2722258935367507707706996859454145691647 in setNewIfXSmaller res61 arrIndex val in + let res63 = let arrIndex = Uint256 63 in let val = Uint256 2610268544229484780765045556213696167935 in setNewIfXSmaller res62 arrIndex val in + let res64 = let arrIndex = Uint256 64 in let val = Uint256 2502885300319193958571922333378000453631 in setNewIfXSmaller res63 arrIndex val in + let res65 = let arrIndex = Uint256 65 in let val = Uint256 2399919671254773659805118819743970623487 in setNewIfXSmaller res64 arrIndex val in + let res66 = let arrIndex = Uint256 66 in let val = Uint256 2301189921783908737703717501630802821119 in setNewIfXSmaller res65 arrIndex val in + let res67 = let arrIndex = Uint256 67 in let val = Uint256 2206521793019491601704439134261549727743 in setNewIfXSmaller res66 arrIndex val in + let res68 = let arrIndex = Uint256 68 in let val = Uint256 2115748194871134515168564783402692116479 in setNewIfXSmaller res67 arrIndex val in + let res69 = let arrIndex = Uint256 69 in let val = Uint256 2028708911129671949307566740521183346687 in setNewIfXSmaller res68 arrIndex val in + let res70 = let arrIndex = Uint256 70 in let val = Uint256 1945250316684124513375052119057996185599 in setNewIfXSmaller res69 arrIndex val in + let res71 = let arrIndex = Uint256 71 in let val = Uint256 1865225106372009884014199587421481336831 in setNewIfXSmaller res70 arrIndex val in + let res72 = let arrIndex = Uint256 72 in let val = Uint256 1788492034984419117666073304513300660223 in setNewIfXSmaller res71 arrIndex val in + let res73 = let arrIndex = Uint256 73 in let val = Uint256 1714915667966964990208967912165996494847 in setNewIfXSmaller res72 arrIndex val in + let res74 = let arrIndex = Uint256 74 in let val = Uint256 1644366142376587317378242124992063995903 in setNewIfXSmaller res73 arrIndex val in + let res75 = let arrIndex = Uint256 75 in let val = Uint256 1576718937672301888428671268411708276735 in setNewIfXSmaller res74 arrIndex val in + let res76 = let arrIndex = Uint256 76 in let val = Uint256 1511854655935336643558907106913628979199 in setNewIfXSmaller res75 arrIndex val in + let res77 = let arrIndex = Uint256 77 in let val = Uint256 1449658811130741678082357454851673161727 in setNewIfXSmaller res76 arrIndex val in + let res78 = let arrIndex = Uint256 78 in let val = Uint256 1390021627038517938156314751863424548863 in setNewIfXSmaller res77 arrIndex val in + let res79 = let arrIndex = Uint256 79 in let val = Uint256 1332837843497611250583009129150422188031 in setNewIfXSmaller res78 arrIndex val in + let res80 = let arrIndex = Uint256 80 in let val = Uint256 1278006530620790610545644364558728429567 in setNewIfXSmaller res79 arrIndex val in + let res81 = let arrIndex = Uint256 81 in let val = Uint256 1225430910652498332846748256431392161791 in setNewIfXSmaller res80 arrIndex val in + let res82 = let arrIndex = Uint256 82 in let val = Uint256 1175018187155249585623915264673694351359 in setNewIfXSmaller res81 arrIndex val in + let res83 = let arrIndex = Uint256 83 in let val = Uint256 1126679381223093780446468558216906145791 in setNewIfXSmaller res82 arrIndex val in + let res84 = let arrIndex = Uint256 84 in let val = Uint256 1080329174433053119456411494679599644671 in setNewIfXSmaller res83 arrIndex val in + let res85 = let arrIndex = Uint256 85 in let val = Uint256 1035885758257346189907937735244580388863 in setNewIfXSmaller res84 arrIndex val in + let res86 = let arrIndex = Uint256 86 in let val = Uint256 993270689670607839608468400662101622783 in setNewIfXSmaller res85 arrIndex val in + let res87 = let arrIndex = Uint256 87 in let val = Uint256 952408752697250790372885759853747765247 in setNewIfXSmaller res86 arrIndex val in + let res88 = let arrIndex = Uint256 88 in let val = Uint256 913227825654598849673391073164504596479 in setNewIfXSmaller res87 arrIndex val in + let res89 = let arrIndex = Uint256 89 in let val = Uint256 875658753857474668265023456619450597375 in setNewIfXSmaller res88 arrIndex val in + let res90 = let arrIndex = Uint256 90 in let val = Uint256 839635227559564507480479102760887779327 in setNewIfXSmaller res89 arrIndex val in + let res91 = let arrIndex = Uint256 91 in let val = Uint256 805093664916125437948904238798044397567 in setNewIfXSmaller res90 arrIndex val in + let res92 = let arrIndex = Uint256 92 in let val = Uint256 771973099761463105605096142810743046143 in setNewIfXSmaller res91 arrIndex val in + let res93 = let arrIndex = Uint256 93 in let val = Uint256 740215074003106313787373698556008333311 in setNewIfXSmaller res92 arrIndex val in + let res94 = let arrIndex = Uint256 94 in let val = Uint256 709763534442753181219281418466841591807 in setNewIfXSmaller res93 arrIndex val in + let res95 = let arrIndex = Uint256 95 in let val = Uint256 680564733841876926926749214863536422911 in setNewIfXSmaller res94 arrIndex val in + let res96 = let arrIndex = Uint256 96 in let val = Uint256 652567136057371195186997586203332575231 in setNewIfXSmaller res95 arrIndex val in + let res97 = let arrIndex = Uint256 97 in let val = Uint256 625721325079798489641586010116704960511 in setNewIfXSmaller res96 arrIndex val in + let res98 = let arrIndex = Uint256 98 in let val = Uint256 599979917813693414950432886451725139967 in setNewIfXSmaller res97 arrIndex val in + let res99 = let arrIndex = Uint256 99 in let val = Uint256 575297480445977184425850753341355720703 in setNewIfXSmaller res98 arrIndex val in + let res100 = let arrIndex = Uint256 100 in let val = Uint256 551630448254872900425972804456347074559 in setNewIfXSmaller res99 arrIndex val in + let res101 = let arrIndex = Uint256 101 in let val = Uint256 528937048717783628792119060092411707391 in setNewIfXSmaller res100 arrIndex val in + let res102 = let arrIndex = Uint256 102 in let val = Uint256 507177227782417987326846600868857380863 in setNewIfXSmaller res101 arrIndex val in + let res103 = let arrIndex = Uint256 103 in let val = Uint256 486312579171031128343732298613950251007 in setNewIfXSmaller res102 arrIndex val in + let res104 = let arrIndex = Uint256 104 in let val = Uint256 466306276593002471003532891264408092671 in setNewIfXSmaller res103 arrIndex val in + let res105 = let arrIndex = Uint256 105 in let val = Uint256 447123008746104779416515886102660251647 in setNewIfXSmaller res104 arrIndex val in + let res106 = let arrIndex = Uint256 106 in let val = Uint256 428728916991741247552240490495652921343 in setNewIfXSmaller res105 arrIndex val in + let res107 = let arrIndex = Uint256 107 in let val = Uint256 411091535594146829344560212836376117247 in setNewIfXSmaller res106 arrIndex val in + let res108 = let arrIndex = Uint256 108 in let val = Uint256 394179734418075472107167272299635146751 in setNewIfXSmaller res107 arrIndex val in + let res109 = let arrIndex = Uint256 109 in let val = Uint256 377963663983834160889726215582593318911 in setNewIfXSmaller res108 arrIndex val in + let res110 = let arrIndex = Uint256 110 in let val = Uint256 362414702782685419520589203652335239167 in setNewIfXSmaller res109 arrIndex val in + let res111 = let arrIndex = Uint256 111 in let val = Uint256 347505406759629484539078662328460836863 in setNewIfXSmaller res110 arrIndex val in + let res112 = let arrIndex = Uint256 112 in let val = Uint256 333209460874402812645752271223906598911 in setNewIfXSmaller res111 arrIndex val in + let res113 = let arrIndex = Uint256 113 in let val = Uint256 319501632655197652636411056021540225023 in setNewIfXSmaller res112 arrIndex val in + let res114 = let arrIndex = Uint256 114 in let val = Uint256 306357727663124583211687061200571318271 in setNewIfXSmaller res113 arrIndex val in + let res115 = let arrIndex = Uint256 115 in let val = Uint256 293754546788812396405978813098581970943 in setNewIfXSmaller res114 arrIndex val in + let res116 = let arrIndex = Uint256 116 in let val = Uint256 281669845305773445111617137421885345791 in setNewIfXSmaller res115 arrIndex val in + let res117 = let arrIndex = Uint256 117 in let val = Uint256 270082293608263279864102872957453496319 in setNewIfXSmaller res116 arrIndex val in + let res118 = let arrIndex = Uint256 118 in let val = Uint256 258971439564336547476984432763364437503 in setNewIfXSmaller res117 arrIndex val in + let res119 = let arrIndex = Uint256 119 in let val = Uint256 248317672417651959902117100034610719743 in setNewIfXSmaller res118 arrIndex val in + let res120 = let arrIndex = Uint256 120 in let val = Uint256 238102188174312697593221439720218478079 in setNewIfXSmaller res119 arrIndex val in + let res121 = let arrIndex = Uint256 121 in let val = Uint256 228306956413649712418347768277622232511 in setNewIfXSmaller res120 arrIndex val in + let res122 = let arrIndex = Uint256 122 in let val = Uint256 218914688464368667066255864092044292831 in setNewIfXSmaller res121 arrIndex val in + let res123 = let arrIndex = Uint256 123 in let val = Uint256 209908806889891126870119775672831054607 in setNewIfXSmaller res122 arrIndex val in + let res124 = let arrIndex = Uint256 124 in let val = Uint256 201273416229031359487226059686877220919 in setNewIfXSmaller res123 arrIndex val in + let res125 = let arrIndex = Uint256 125 in let val = Uint256 192993274940365776401274035698589299391 in setNewIfXSmaller res124 arrIndex val in + let res126 = let arrIndex = Uint256 126 in let val = Uint256 185053768500776578446843424638883162041 in setNewIfXSmaller res125 arrIndex val in + let res127 = let arrIndex = Uint256 127 in let val = Uint256 177440883610688295304820354615089591270 in setNewIfXSmaller res126 arrIndex val in +match res127 with | PrecisionAndMax precision max => +let precision_is_zero = builtin eq zero_uint256 precision in +match precision_is_zero with +| True => panic zero_uint256 +| False => precision +end +end + + +let generalExp: Uint256 -> Uint256 -> Uint256 = +fun(x: Uint256) => fun(precision: Uint256) => +let two_pow_precision = pow_uint256 two_uint256 precision in +let res1 = Uint256 0 in +let xi1 = x in + + let xi2 = muldiv xi1 x two_pow_precision in let res2 = let fac = Uint256 4341658809405943247759097200640000000 in muladd xi2 fac res1 in + + let xi3 = muldiv xi2 x two_pow_precision in let res3 = let fac = Uint256 1447219603135314415919699066880000000 in muladd xi3 fac res2 in + + let xi4 = muldiv xi3 x two_pow_precision in let res4 = let fac = Uint256 361804900783828603979924766720000000 in muladd xi4 fac res3 in + + let xi5 = muldiv xi4 x two_pow_precision in let res5 = let fac = Uint256 72360980156765720795984953344000000 in muladd xi5 fac res4 in + + let xi6 = muldiv xi5 x two_pow_precision in let res6 = let fac = Uint256 12060163359460953465997492224000000 in muladd xi6 fac res5 in + + let xi7 = muldiv xi6 x two_pow_precision in let res7 = let fac = Uint256 1722880479922993352285356032000000 in muladd xi7 fac res6 in + + let xi8 = muldiv xi7 x two_pow_precision in let res8 = let fac = Uint256 215360059990374169035669504000000 in muladd xi8 fac res7 in + + let xi9 = muldiv xi8 x two_pow_precision in let res9 = let fac = Uint256 23928895554486018781741056000000 in muladd xi9 fac res8 in + + let xi10 = muldiv xi9 x two_pow_precision in let res10 = let fac = Uint256 2392889555448601878174105600000 in muladd xi10 fac res9 in + + let xi11 = muldiv xi10 x two_pow_precision in let res11 = let fac = Uint256 217535414131691079834009600000 in muladd xi11 fac res10 in + + let xi12 = muldiv xi11 x two_pow_precision in let res12 = let fac = Uint256 18127951177640923319500800000 in muladd xi12 fac res11 in + + let xi13 = muldiv xi12 x two_pow_precision in let res13 = let fac = Uint256 1394457782895455639961600000 in muladd xi13 fac res12 in + + let xi14 = muldiv xi13 x two_pow_precision in let res14 = let fac = Uint256 99604127349675402854400000 in muladd xi14 fac res13 in + + let xi15 = muldiv xi14 x two_pow_precision in let res15 = let fac = Uint256 6640275156645026856960000 in muladd xi15 fac res14 in + + let xi16 = muldiv xi15 x two_pow_precision in let res16 = let fac = Uint256 415017197290314178560000 in muladd xi16 fac res15 in + + let xi17 = muldiv xi16 x two_pow_precision in let res17 = let fac = Uint256 24412776311194951680000 in muladd xi17 fac res16 in + + let xi18 = muldiv xi17 x two_pow_precision in let res18 = let fac = Uint256 1356265350621941760000 in muladd xi18 fac res17 in + + let xi19 = muldiv xi18 x two_pow_precision in let res19 = let fac = Uint256 71382386874839040000 in muladd xi19 fac res18 in + + let xi20 = muldiv xi19 x two_pow_precision in let res20 = let fac = Uint256 3569119343741952000 in muladd xi20 fac res19 in + + let xi21 = muldiv xi20 x two_pow_precision in let res21 = let fac = Uint256 169958063987712000 in muladd xi21 fac res20 in + + let xi22 = muldiv xi21 x two_pow_precision in let res22 = let fac = Uint256 7725366544896000 in muladd xi22 fac res21 in + + let xi23 = muldiv xi22 x two_pow_precision in let res23 = let fac = Uint256 335885501952000 in muladd xi23 fac res22 in + + let xi24 = muldiv xi23 x two_pow_precision in let res24 = let fac = Uint256 13995229248000 in muladd xi24 fac res23 in + + let xi25 = muldiv xi24 x two_pow_precision in let res25 = let fac = Uint256 559809169920 in muladd xi25 fac res24 in + + let xi26 = muldiv xi25 x two_pow_precision in let res26 = let fac = Uint256 21531121920 in muladd xi26 fac res25 in + + let xi27 = muldiv xi26 x two_pow_precision in let res27 = let fac = Uint256 797448960 in muladd xi27 fac res26 in + + let xi28 = muldiv xi27 x two_pow_precision in let res28 = let fac = Uint256 28480320 in muladd xi28 fac res27 in + + let xi29 = muldiv xi28 x two_pow_precision in let res29 = let fac = Uint256 982080 in muladd xi29 fac res28 in + + let xi30 = muldiv xi29 x two_pow_precision in let res30 = let fac = Uint256 32736 in muladd xi30 fac res29 in + + let xi31 = muldiv xi30 x two_pow_precision in let res31 = let fac = Uint256 1056 in muladd xi31 fac res30 in + + let xi32 = muldiv xi31 x two_pow_precision in let res32 = let fac = Uint256 33 in muladd xi32 fac res31 in + + let xi33 = muldiv xi32 x two_pow_precision in let res33 = let fac = Uint256 1 in muladd xi33 fac res32 in + +let fac33 = Uint256 8683317618811886495518194401280000000 in +let res_div_fac33 = builtin div res33 fac33 in +let x_add_two_pow_precision = builtin add x two_pow_precision in +builtin add res_div_fac33 x_add_two_pow_precision + +let power: Uint256 -> Uint256 -> Uint256 -> Uint256 -> PowerResultAndPrecision = + fun(in_baseN: Uint256) => fun(in_baseD: Uint256) => fun(in_expN: Uint256) => fun(in_expD: Uint256) => + let is_smaller = panic_if_uint256_not_lt_uint256 in_baseN c_MAX_NUM in + let base = muldiv in_baseN c_FIXED_1 in_baseD in + let baseLog = log base in + let baseLogTimesExp = muldiv baseLog in_expN in_expD in + + let baseLogTimesExp_lt_max_val = uint256_lt baseLogTimesExp c_OPT_EXP_MAX_VAL in + match baseLogTimesExp_lt_max_val with + | True => + let exp_res = optimalExp baseLogTimesExp in + PowerResultAndPrecision exp_res c_MAX_PRECISION + | False => + let precision = findPositionInMaxExpArray baseLogTimesExp in + let max_sub_precision = builtin sub c_MAX_PRECISION precision in + let two_pow_max_sub_precision = pow_uint256 two_uint256 max_sub_precision in + let baseLogTimesExpShifted = builtin div baseLogTimesExp two_pow_max_sub_precision in + let exp_res = generalExp baseLogTimesExpShifted precision in + PowerResultAndPrecision exp_res precision + end + + + + +contract BancorFormula() + +procedure ThrowError(err : Error) + e = make_error err; + throw e +end + +procedure AssertNotZero(value: Uint256) + is_zero = builtin eq zero_uint256 value; + match is_zero with + | False => + | True => e = CodeInputIsZero; ThrowError e + end +end + +procedure AssertIsLE(i1: Uint256, i2: Uint256) + is_le = uint256_le i1 i2; + match is_le with + | False => e = CodeInputNotInBounds; ThrowError e + | True => + end +end + +procedure SendCalculatePurchaseReturnCallback(result: Uint128) + msg = let m = { + _tag: "CalculatePurchaseReturnCallback"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } in one_msg m; + send msg +end + +transition CalculatePurchaseReturn(in_supply: Uint128, in_connector_balance: Uint128, in_connector_weight: Uint128, in_deposit_amount: Uint128) + + supply = uint128_to_uint256 in_supply; + connector_balance = uint128_to_uint256 in_connector_balance; + connector_weight = uint128_to_uint256 in_connector_weight; + deposit_amount = uint128_to_uint256 in_deposit_amount; + + AssertNotZero supply; + AssertNotZero connector_balance; + AssertNotZero connector_weight; + AssertIsLE connector_weight c_MAX_WEIGHT; + deposit_is_zero = builtin eq deposit_amount zero_uint256; + match deposit_is_zero with + | True => + + SendCalculatePurchaseReturnCallback zero_uint128 + | False => + connector_weight_is_c_MAX_WEIGHT = builtin eq connector_weight c_MAX_WEIGHT; + match connector_weight_is_c_MAX_WEIGHT with + | True => + + result_uint256 = muldiv supply deposit_amount connector_balance; + result = uint256_to_uint128 result_uint256; + SendCalculatePurchaseReturnCallback result + | False => + baseN = builtin add deposit_amount connector_balance; + power_result_and_precision = power baseN connector_balance connector_weight c_MAX_WEIGHT; + match power_result_and_precision with + | PowerResultAndPrecision power_result precision => + two_pow_precision = pow_uint256 two_uint256 precision; + tmp = muldiv supply power_result two_pow_precision; + result_uint256 = builtin sub tmp supply; + result = uint256_to_uint128 result_uint256; + SendCalculatePurchaseReturnCallback result + end + end + end +end + +procedure SendCalculateSaleReturnCallback(result: Uint128) + msg = let m = { + _tag: "CalculateSaleReturnCallback"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } in one_msg m; + send msg +end + +transition CalculateSaleReturn(in_supply: Uint128, in_connector_balance: Uint128, in_connector_weight: Uint128, in_sell_amount: Uint128) + + supply = uint128_to_uint256 in_supply; + connector_balance = uint128_to_uint256 in_connector_balance; + connector_weight = uint128_to_uint256 in_connector_weight; + sell_amount = uint128_to_uint256 in_sell_amount; + + AssertNotZero supply; + AssertNotZero connector_balance; + AssertNotZero connector_weight; + AssertIsLE connector_weight c_MAX_WEIGHT; + AssertIsLE sell_amount supply; + sell_is_zero = builtin eq sell_amount zero_uint256; + match sell_is_zero with + | True => + + SendCalculateSaleReturnCallback zero_uint128 + | False => + selling_entire_supply = builtin eq sell_amount supply; + match selling_entire_supply with + | True => SendCalculateSaleReturnCallback in_connector_balance + | False => + connector_weight_is_c_MAX_WEIGHT = builtin eq connector_weight c_MAX_WEIGHT; + match connector_weight_is_c_MAX_WEIGHT with + | True => + + result_uint256 = muldiv connector_balance sell_amount supply; + result = uint256_to_uint128 result_uint256; + SendCalculateSaleReturnCallback result + | False => + baseD = builtin sub supply sell_amount; + power_result_and_precision = power supply baseD c_MAX_WEIGHT connector_weight; + match power_result_and_precision with + | PowerResultAndPrecision power_result precision => + two_pow_precision = pow_uint256 two_uint256 precision; + temp1 = builtin mul connector_balance power_result; + temp2 = builtin mul connector_balance two_pow_precision; + temp1_sub_temp2 = builtin sub temp1 temp2; + result_uint256 = builtin div temp1_sub_temp2 power_result; + result = uint256_to_uint128 result_uint256; + SendCalculateSaleReturnCallback result + end + end + end + end +end + +procedure SendCalculateCrossConnectorReturnCallback(result: Uint128) + msg = let m = { + _tag: "CalculateCrossConnectorReturn"; + _recipient: _sender; + _amount: zero_uint128; + result: result + } in one_msg m; + send msg +end + +transition CalculateCrossConnectorReturn(in_from_connector_balance: Uint128, in_from_connector_weight: Uint128, in_to_connector_balance: Uint128, in_to_connector_weight: Uint128, in_amount: Uint128) + + from_connector_balance = uint128_to_uint256 in_from_connector_balance; + from_connector_weight = uint128_to_uint256 in_from_connector_weight; + to_connector_balance = uint128_to_uint256 in_to_connector_balance; + to_connector_weight = uint128_to_uint256 in_to_connector_weight; + amount = uint128_to_uint256 in_amount; + + AssertNotZero from_connector_balance; + AssertNotZero from_connector_weight; + AssertIsLE from_connector_weight c_MAX_WEIGHT; + AssertNotZero to_connector_balance; + AssertNotZero to_connector_weight; + AssertIsLE to_connector_weight c_MAX_WEIGHT; + + weights_equal = builtin eq to_connector_weight from_connector_weight; + match weights_equal with + | True => + from_connector_balance_add_amount = builtin add from_connector_balance amount; + result_uint256 = muldiv to_connector_balance amount from_connector_balance_add_amount; + result = uint256_to_uint128 result_uint256; + SendCalculateCrossConnectorReturnCallback result + | False => + baseN = builtin add from_connector_balance amount; + power_result_and_precision = power baseN from_connector_balance from_connector_weight to_connector_weight; + match power_result_and_precision with + | PowerResultAndPrecision power_result precision => + two_pow_precision = pow_uint256 two_uint256 precision; + temp1 = builtin mul to_connector_balance power_result; + temp2 = builtin mul to_connector_balance two_pow_precision; + temp1_sub_temp2 = builtin sub temp1 temp2; + result_uint256 = builtin div temp1_sub_temp2 power_result; + result = uint256_to_uint128 result_uint256; + SendCalculateCrossConnectorReturnCallback result + end + end +end +`; +export const deploy = () => { + const initData = [ + { + type: `Uint32`, + vname: `_scilla_version`, + value: "0", + }, + ]; + return { + initToJSON: () => initData, + send: async function ( + gasLimit: Long + ): Promise<[Transaction, Contract, T.ByStr20]> { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + + const contract = newContract(zil, code, initData); + const [tx, con] = await contract.deploy( + { + version: getVersion(), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "Deploy"); + if (!con.address) { + if (con.error) { + throw new Error(JSON.stringify(con.error, null, 2)); + } + throw new Error("Contract failed to deploy"); + } + return [tx, con, new T.ByStr20(con.address)]; + }, + }; +}; + +/** + * this string is the signature of the hash of the source code + * that was used to generate this sdk + */ +export const contractSignature = + "hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + +/** + * will try to send a transaction to the contract + * @warning WILL NOT THROW ERRORS IF CONTRACT SIGNATURES ARE INVALID + */ +export async function dangerousFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, new T.ByStr20(t.contractAddress).toSend()); + + const tx = await contract.call( + t.contractTransitionName, + t.data, + { + version: getVersion(), + amount: new BN(t.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, t.contractTransitionName); + return tx; +} +/** + * Will throw error if contract signatures are incompatible! + */ +export async function safeFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + if (t.contractSignature != contractSignature) { + throw new Error("Incompatible contract signatures!"); + } + await dangerousFromJSONTransaction(zil, t, gasLimit); +} + +/** + * interface for scilla contract with source code hash: + * 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + * generated on: + * 2021-08-22T17:34:32.735Z + */ +export const hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 = + (a: T.ByStr20) => ({ + state: () => ({ + get: async function (field: string) { + const zil = getZil(); + return ( + await zil.blockchain.getSmartContractSubState(a.toSend(), field) + ).result; + }, + log: async function (field: string | "_balance") { + const zil = getZil(); + if (field == "_balance") { + console.log((await zil.blockchain.getBalance(a.toSend())).result); + return; + } + console.log( + (await zil.blockchain.getSmartContractSubState(a.toSend(), field)) + .result + ); + }, + }), + run: (gasLimit: Long) => ({ + CalculatePurchaseReturn: ( + __in_supply: T.Uint128, + __in_connector_balance: T.Uint128, + __in_connector_weight: T.Uint128, + __in_deposit_amount: T.Uint128 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `CalculatePurchaseReturn`, + data: [ + { + type: `Uint128`, + vname: `in_supply`, + value: __in_supply.toSend(), + }, + { + type: `Uint128`, + vname: `in_connector_balance`, + value: __in_connector_balance.toSend(), + }, + { + type: `Uint128`, + vname: `in_connector_weight`, + value: __in_connector_weight.toSend(), + }, + { + type: `Uint128`, + vname: `in_deposit_amount`, + value: __in_deposit_amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "CalculatePurchaseReturn"); + return tx; + }, + }; + }, + + CalculateSaleReturn: ( + __in_supply: T.Uint128, + __in_connector_balance: T.Uint128, + __in_connector_weight: T.Uint128, + __in_sell_amount: T.Uint128 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `CalculateSaleReturn`, + data: [ + { + type: `Uint128`, + vname: `in_supply`, + value: __in_supply.toSend(), + }, + { + type: `Uint128`, + vname: `in_connector_balance`, + value: __in_connector_balance.toSend(), + }, + { + type: `Uint128`, + vname: `in_connector_weight`, + value: __in_connector_weight.toSend(), + }, + { + type: `Uint128`, + vname: `in_sell_amount`, + value: __in_sell_amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "CalculateSaleReturn"); + return tx; + }, + }; + }, + + CalculateCrossConnectorReturn: ( + __in_from_connector_balance: T.Uint128, + __in_from_connector_weight: T.Uint128, + __in_to_connector_balance: T.Uint128, + __in_to_connector_weight: T.Uint128, + __in_amount: T.Uint128 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `CalculateCrossConnectorReturn`, + data: [ + { + type: `Uint128`, + vname: `in_from_connector_balance`, + value: __in_from_connector_balance.toSend(), + }, + { + type: `Uint128`, + vname: `in_from_connector_weight`, + value: __in_from_connector_weight.toSend(), + }, + { + type: `Uint128`, + vname: `in_to_connector_balance`, + value: __in_to_connector_balance.toSend(), + }, + { + type: `Uint128`, + vname: `in_to_connector_weight`, + value: __in_to_connector_weight.toSend(), + }, + { + type: `Uint128`, + vname: `in_amount`, + value: __in_amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "CalculateCrossConnectorReturn"); + return tx; + }, + }; + }, + }), + }); diff --git a/reference/continuous-token-bonding-curve-contracts/src/Operator/Operator.scilla b/reference/continuous-token-bonding-curve-contracts/src/Operator/Operator.scilla new file mode 100644 index 000000000..7a5f4c3e1 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Operator/Operator.scilla @@ -0,0 +1,108 @@ +scilla_version 0 +(* Author: Mateusz Bednarski https://github.com/MszBednarski *) + +import IntUtils BoolUtils +library Operator +type Error = +| NotAuthorized +| NoStagedAdmin +| SpreadTooBig + +let make_error = +fun (result: Error) => +let result_code = +match result with +| NotAuthorized => Int32 -1 +| NoStagedAdmin => Int32 -2 +| SpreadTooBig => Int32 -3 +end +in +{ _exception: "Error"; code: result_code } + +let spread_denominator = Uint128 10000 +let zeroByStr20 = 0x0000000000000000000000000000000000000000 +let option_value = tfun 'A => fun( default: 'A ) => fun( input: Option 'A) => + match input with + | Some v => v + | None => default end +let option_bystr20_value = let f = @option_value ByStr20 in f zeroByStr20 + +(* + @param init_admin: the admin of the contract + @param init_bancor_formula: the address of the bancor formula contract that the token should use + @params init_spread: the spread for the buy function expressed in terms of 0.01% + @params max_spread: the max unmodifiable spread that the buy function can ever have to + preserve legitimacy as to how big the spread can ever get! +*) +contract Operator( + init_admin: ByStr20, + init_bancor_formula: ByStr20, + init_spread: Uint128, + max_spread: Uint128, + init_beneficiary: ByStr20 +) +with + let valid_spread = uint128_le init_spread max_spread in + let valid_max_spread = uint128_lt max_spread spread_denominator in + andb valid_spread valid_max_spread +=> +field admin: ByStr20 = init_admin +field staging_admin: Option ByStr20 = None {ByStr20} +field bancor_formula_contract: ByStr20 = init_bancor_formula +field spread: Uint128 = init_spread +field beneficiary: ByStr20 = init_beneficiary + +procedure ThrowError(err: Error) + e = make_error err; + throw e +end +(***************************************************) +(* Admin Utill *) +(***************************************************) +procedure AssertAddrEquality(ad1: ByStr20, ad2: ByStr20) + is_same = builtin eq ad1 ad2; + match is_same with + | False => e = NotAuthorized; ThrowError e + | True => + end +end +procedure IsAdmin() + tmp <- admin; + AssertAddrEquality tmp _sender +end +transition SetStagedAdmin(staged: ByStr20) + IsAdmin; + opt_staged = Some {ByStr20} staged; + staging_admin := opt_staged +end +transition ClaimStagedAdmin() + option_staged <- staging_admin; + staged = option_bystr20_value option_staged; + staged_is_sender = builtin eq _sender staged; + match staged_is_sender with + | False => e = NotAuthorized; ThrowError e + | True => admin := staged + end +end +(***************************************************) +(* Admin only *) +(***************************************************) +transition UpgradeFormula(new: ByStr20) + IsAdmin; + bancor_formula_contract := new +end + +transition ChangeSpread(new: Uint128) + IsAdmin; + is_valid = uint128_le new max_spread; + match is_valid with + | False => e = SpreadTooBig; ThrowError e + | True => + spread := new + end +end + +transition ChangeBeneficiary(new: ByStr20) + IsAdmin; + beneficiary := new +end \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/src/Operator/README.md b/reference/continuous-token-bonding-curve-contracts/src/Operator/README.md new file mode 100644 index 000000000..0710e44c6 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Operator/README.md @@ -0,0 +1,49 @@ +# I. Operator documentation + +#### SetStagedAdmin() + +transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `staged` | `ByStr20` | + +#### ClaimStagedAdmin() + +transition + +**No Arguments** + + + +#### UpgradeFormula() + + Admin only transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `new` | `ByStr20` | + +#### ChangeSpread() + +transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `new` | `Uint128` | + +#### ChangeBeneficiary() + +transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `new` | `ByStr20` | \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/run.ts b/reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/run.ts new file mode 100644 index 000000000..0b12af04d --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/run.ts @@ -0,0 +1,13 @@ +import { scillaServer } from "../../../scillaTest"; +import { testOperator } from "./tests"; +import { code } from "../build/bind"; + +(async () => { + try { + await testOperator(code, scillaServer); + } catch (e) { + console.error(e); + } + console.info("Done!"); + process.exit(); +})(); diff --git a/reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/tests.ts b/reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/tests.ts new file mode 100644 index 000000000..c1fb491b4 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Operator/__tests__/tests.ts @@ -0,0 +1,59 @@ +import { TestingFunction, testRunner } from "../../../scillaTest/utill"; +import { testMaker, getGasAvg } from "../../../scillaTest"; +import { ByStr20, Uint128 } from "../../../boost-zil"; +import * as sdk from "../build/bind"; +import { Long, BN } from "@zilliqa-js/util"; + +export const testOperator: TestingFunction = async (code, ss) => { + try { + console.log("🙌 testOperator"); + const fillerAddr = new ByStr20( + "0x1234567890123456789012345678901234567890" + ); + const limit = Long.fromString("100000"); + const operator = + sdk.hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + fillerAddr + ).run(limit); + const testing = testRunner(ss)("Operator"); + const run = testing.runner; + const make = testMaker(code)("1")( + sdk + .deploy( + fillerAddr, + fillerAddr, + new Uint128("10"), + new Uint128("50"), + fillerAddr + ) + .initToJSON() + )("0")([])(fillerAddr); + const differentAddr = new ByStr20( + "0x3334567890123456789012345678901234567890" + ); + const printState = (field: string) => (r: any) => { + console.log( + JSON.stringify( + r.message.states.filter((s: any) => s.vname == field)[0], + null, + 2 + ) + ); + }; + await run( + make(operator.ChangeBeneficiary(differentAddr).toJSON()), + printState("beneficiary") + ); + await run( + make(operator.ChangeSpread(new Uint128("49")).toJSON()), + printState("spread") + ); + await run( + make(operator.UpgradeFormula(differentAddr).toJSON()), + printState("bancor_formula_contract") + ); + getGasAvg(testing.getAllResults()); + } catch (e) { + throw e; + } +}; diff --git a/reference/continuous-token-bonding-curve-contracts/src/Operator/build/abi.json b/reference/continuous-token-bonding-curve-contracts/src/Operator/build/abi.json new file mode 100644 index 000000000..c1de3c659 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Operator/build/abi.json @@ -0,0 +1,105 @@ +{ + "contract_info": { + "scilla_major_version": "0", + "vname": "Operator", + "params": [ + { "vname": "init_admin", "type": "ByStr20" }, + { "vname": "init_bancor_formula", "type": "ByStr20" }, + { "vname": "init_spread", "type": "Uint128" }, + { "vname": "max_spread", "type": "Uint128" }, + { "vname": "init_beneficiary", "type": "ByStr20" } + ], + "fields": [ + { "vname": "admin", "type": "ByStr20", "depth": 0 }, + { "vname": "staging_admin", "type": "Option (ByStr20)", "depth": 0 }, + { "vname": "bancor_formula_contract", "type": "ByStr20", "depth": 0 }, + { "vname": "spread", "type": "Uint128", "depth": 0 }, + { "vname": "beneficiary", "type": "ByStr20", "depth": 0 } + ], + "transitions": [ + { + "vname": "SetStagedAdmin", + "params": [ { "vname": "staged", "type": "ByStr20" } ] + }, + { "vname": "ClaimStagedAdmin", "params": [] }, + { + "vname": "UpgradeFormula", + "params": [ { "vname": "new", "type": "ByStr20" } ] + }, + { + "vname": "ChangeSpread", + "params": [ { "vname": "new", "type": "Uint128" } ] + }, + { + "vname": "ChangeBeneficiary", + "params": [ { "vname": "new", "type": "ByStr20" } ] + } + ], + "procedures": [ + { + "vname": "ThrowError", + "params": [ { "vname": "err", "type": "Operator.Error" } ] + }, + { + "vname": "AssertAddrEquality", + "params": [ + { "vname": "ad1", "type": "ByStr20" }, + { "vname": "ad2", "type": "ByStr20" } + ] + }, + { "vname": "IsAdmin", "params": [] } + ], + "events": [], + "ADTs": [ + { + "tname": "Operator.Error", + "tparams": [], + "tmap": [ + { "cname": "Operator.NotAuthorized", "argtypes": [] }, + { "cname": "Operator.NoStagedAdmin", "argtypes": [] }, + { "cname": "Operator.SpreadTooBig", "argtypes": [] } + ] + }, + { + "tname": "Option", + "tparams": [ "'A" ], + "tmap": [ + { "cname": "Some", "argtypes": [ "'A" ] }, + { "cname": "None", "argtypes": [] } + ] + }, + { + "tname": "Bool", + "tparams": [], + "tmap": [ + { "cname": "True", "argtypes": [] }, + { "cname": "False", "argtypes": [] } + ] + }, + { + "tname": "Nat", + "tparams": [], + "tmap": [ + { "cname": "Zero", "argtypes": [] }, + { "cname": "Succ", "argtypes": [ "Nat" ] } + ] + }, + { + "tname": "List", + "tparams": [ "'A" ], + "tmap": [ + { "cname": "Cons", "argtypes": [ "'A", "List ('A)" ] }, + { "cname": "Nil", "argtypes": [] } + ] + }, + { + "tname": "Pair", + "tparams": [ "'A", "'B" ], + "tmap": [ { "cname": "Pair", "argtypes": [ "'A", "'B" ] } ] + } + ] + }, + "warnings": [], + "gas_remaining": "9941" +} + diff --git a/reference/continuous-token-bonding-curve-contracts/src/Operator/build/bind.ts b/reference/continuous-token-bonding-curve-contracts/src/Operator/build/bind.ts new file mode 100644 index 000000000..1b6b6f0fb --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Operator/build/bind.ts @@ -0,0 +1,523 @@ +import { + getZil, + log, + getVersion, + getContract, + newContract, + getMinGasPrice, +} from "../../../boost-zil/infra-manipulation"; +import { BN, Long } from "@zilliqa-js/util"; +import { Transaction } from "@zilliqa-js/account"; +import { Contract } from "@zilliqa-js/contract"; +import * as T from "../../../boost-zil/signable"; +import * as BOOST from "../../../boost-zil"; +import { Zilliqa } from "@zilliqa-js/zilliqa"; + +/** + * general interface of the data returned by toJSON() on the transitions + */ +export type TransactionData = { + /** + * the signature hash of the source code of the contract that this data interacts with + */ + contractSignature: string, + /** + * contract to send the transaction to + */ + contractAddress: string, + /** + * zil amount to send + */ + amount: string, + /** + * the name of the transition called in the target contract + */ + contractTransitionName: string, + data: any[], +}; + +export const code = ` +(* sourceCodeHash=0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +(* sourceCodeHashKey=hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +scilla_version 0 + + +import IntUtils BoolUtils +library Operator +type Error = +| NotAuthorized +| NoStagedAdmin +| SpreadTooBig + +let make_error = +fun (result: Error) => +let result_code = +match result with +| NotAuthorized => Int32 -1 +| NoStagedAdmin => Int32 -2 +| SpreadTooBig => Int32 -3 +end +in +{ _exception: "Error"; code: result_code } + +let spread_denominator = Uint128 10000 +let zeroByStr20 = 0x0000000000000000000000000000000000000000 +let option_value = tfun 'A => fun( default: 'A ) => fun( input: Option 'A) => + match input with + | Some v => v + | None => default end +let option_bystr20_value = let f = @option_value ByStr20 in f zeroByStr20 + + +contract Operator( + init_admin: ByStr20, + init_bancor_formula: ByStr20, + init_spread: Uint128, + max_spread: Uint128, + init_beneficiary: ByStr20 +) +with + let valid_spread = uint128_le init_spread max_spread in + let valid_max_spread = uint128_lt max_spread spread_denominator in + andb valid_spread valid_max_spread +=> +field admin: ByStr20 = init_admin +field staging_admin: Option ByStr20 = None {ByStr20} +field bancor_formula_contract: ByStr20 = init_bancor_formula +field spread: Uint128 = init_spread +field beneficiary: ByStr20 = init_beneficiary + +procedure ThrowError(err: Error) + e = make_error err; + throw e +end + + + +procedure AssertAddrEquality(ad1: ByStr20, ad2: ByStr20) + is_same = builtin eq ad1 ad2; + match is_same with + | False => e = NotAuthorized; ThrowError e + | True => + end +end +procedure IsAdmin() + tmp <- admin; + AssertAddrEquality tmp _sender +end +transition SetStagedAdmin(staged: ByStr20) + IsAdmin; + opt_staged = Some {ByStr20} staged; + staging_admin := opt_staged +end +transition ClaimStagedAdmin() + option_staged <- staging_admin; + staged = option_bystr20_value option_staged; + staged_is_sender = builtin eq _sender staged; + match staged_is_sender with + | False => e = NotAuthorized; ThrowError e + | True => admin := staged + end +end + + + +transition UpgradeFormula(new: ByStr20) + IsAdmin; + bancor_formula_contract := new +end + +transition ChangeSpread(new: Uint128) + IsAdmin; + is_valid = uint128_le new max_spread; + match is_valid with + | False => e = SpreadTooBig; ThrowError e + | True => + spread := new + end +end + +transition ChangeBeneficiary(new: ByStr20) + IsAdmin; + beneficiary := new +end`; +export const deploy = ( + __init_admin: T.ByStr20, + __init_bancor_formula: T.ByStr20, + __init_spread: T.Uint128, + __max_spread: T.Uint128, + __init_beneficiary: T.ByStr20 +) => { + const initData = [ + { + type: `Uint32`, + vname: `_scilla_version`, + value: "0", + }, + { + type: `ByStr20`, + vname: `init_admin`, + value: __init_admin.toSend(), + }, + { + type: `ByStr20`, + vname: `init_bancor_formula`, + value: __init_bancor_formula.toSend(), + }, + { + type: `Uint128`, + vname: `init_spread`, + value: __init_spread.toSend(), + }, + { + type: `Uint128`, + vname: `max_spread`, + value: __max_spread.toSend(), + }, + { + type: `ByStr20`, + vname: `init_beneficiary`, + value: __init_beneficiary.toSend(), + }, + ]; + return { + initToJSON: () => initData, + send: async function ( + gasLimit: Long + ): Promise<[Transaction, Contract, T.ByStr20]> { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + + const contract = newContract(zil, code, initData); + const [tx, con] = await contract.deploy( + { + version: getVersion(), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "Deploy"); + if (!con.address) { + if (con.error) { + throw new Error(JSON.stringify(con.error, null, 2)); + } + throw new Error("Contract failed to deploy"); + } + return [tx, con, new T.ByStr20(con.address)]; + }, + }; +}; + +/** + * this string is the signature of the hash of the source code + * that was used to generate this sdk + */ +export const contractSignature = + "hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + +/** + * will try to send a transaction to the contract + * @warning WILL NOT THROW ERRORS IF CONTRACT SIGNATURES ARE INVALID + */ +export async function dangerousFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, new T.ByStr20(t.contractAddress).toSend()); + + const tx = await contract.call( + t.contractTransitionName, + t.data, + { + version: getVersion(), + amount: new BN(t.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, t.contractTransitionName); + return tx; +} +/** + * Will throw error if contract signatures are incompatible! + */ +export async function safeFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + if (t.contractSignature != contractSignature) { + throw new Error("Incompatible contract signatures!"); + } + await dangerousFromJSONTransaction(zil, t, gasLimit); +} + +/** + * interface for scilla contract with source code hash: + * 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + * generated on: + * 2021-08-22T17:35:10.774Z + */ +export const hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 = + (a: T.ByStr20) => ({ + state: () => ({ + get: async function ( + field: + | "admin" + | "staging_admin" + | "bancor_formula_contract" + | "spread" + | "beneficiary" + ) { + const zil = getZil(); + return ( + await zil.blockchain.getSmartContractSubState(a.toSend(), field) + ).result; + }, + log: async function ( + field: + | "admin" + | "staging_admin" + | "bancor_formula_contract" + | "spread" + | "beneficiary" + | "_balance" + ) { + const zil = getZil(); + if (field == "_balance") { + console.log((await zil.blockchain.getBalance(a.toSend())).result); + return; + } + console.log( + (await zil.blockchain.getSmartContractSubState(a.toSend(), field)) + .result + ); + }, + }), + run: (gasLimit: Long) => ({ + SetStagedAdmin: (__staged: T.ByStr20) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `SetStagedAdmin`, + data: [ + { + type: `ByStr20`, + vname: `staged`, + value: __staged.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "SetStagedAdmin"); + return tx; + }, + }; + }, + + ClaimStagedAdmin: () => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `ClaimStagedAdmin`, + data: [], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "ClaimStagedAdmin"); + return tx; + }, + }; + }, + + UpgradeFormula: (__new: T.ByStr20) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `UpgradeFormula`, + data: [ + { + type: `ByStr20`, + vname: `new`, + value: __new.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "UpgradeFormula"); + return tx; + }, + }; + }, + + ChangeSpread: (__new: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `ChangeSpread`, + data: [ + { + type: `Uint128`, + vname: `new`, + value: __new.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "ChangeSpread"); + return tx; + }, + }; + }, + + ChangeBeneficiary: (__new: T.ByStr20) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `ChangeBeneficiary`, + data: [ + { + type: `ByStr20`, + vname: `new`, + value: __new.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "ChangeBeneficiary"); + return tx; + }, + }; + }, + }), + }); diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/README.md b/reference/continuous-token-bonding-curve-contracts/src/Token/README.md new file mode 100644 index 000000000..f262dc455 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/README.md @@ -0,0 +1,97 @@ +# I. Token documentation + +#### InitZIL() + + Transitions @dev: Initializes the contract, the contract can be initalized only once @param price: the price of 1 uint of the token, not the conceptual 1 uint 10^decimals but the literal 1 unit in terms of the connector token @param connector_balance: the initial balance of the connector that effectively sets the CW of the contract! where CW = connector_balance / ( total_supply price) transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `price` | `Uint128` | +| @param | `connector_balance` | `Uint128` | + +#### InitZRC2() + + @dev: Initializes the contract, the contract can be initalized only once @param price: the price of 1 uint of the token, not the conceptual 1 uint 10^decimals but the literal 1 unit in terms of the connector token @param connector_balance: the initial balance of the connector that effectively sets the CW of the contract! where CW = connector_balance / ( total_supply price) @param token_address: if it is zeroByStr20 then ZIL connector token is assumed ; tokens are going to be taken using the allowance mechanism transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `price` | `Uint128` | +| @param | `connector_balance` | `Uint128` | +| @param | `token_address` | `ByStr20 with contract field balances : Map (ByStr20) (Uint128) end` | + +#### IncreaseAllowance() + + @dev: Increase the allowance of an approved_spender over the caller tokens. Only token_owner allowed to invoke. param spender: Address of the designated approved_spender. param amount: Number of tokens to be increased as allowance for the approved_spender. transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `spender` | `ByStr20` | +| @param | `amount` | `Uint128` | + +#### DecreaseAllowance() + + @dev: Decrease the allowance of an approved_spender over the caller tokens. Only token_owner allowed to invoke. param spender: Address of the designated approved_spender. param amount: Number of tokens to be decreased as allowance for the approved_spender. transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `spender` | `ByStr20` | +| @param | `amount` | `Uint128` | + +#### Transfer() + + @note: move to _this_address is now a smart token sell! @dev: Moves an amount tokens from _sender to the recipient. Used by token_owner. @dev: Balance of recipient will increase. Balance of _sender will decrease. @param to: Address of the recipient whose balance is increased. @param amount: Amount of tokens to be sent. transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `to` | `ByStr20` | +| @param | `amount` | `Uint128` | + +#### TransferFrom() + + @dev: Move a given amount of tokens from one address to another using the allowance mechanism. The caller must be an approved_spender. @dev: Balance of recipient will increase. Balance of token_owner will decrease. @param from: Address of the token_owner whose balance is decreased. @param to: Address of the recipient whose balance is increased. @param amount: Amount of tokens to be transferred. transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `from` | `ByStr20` | +| @param | `to` | `ByStr20` | +| @param | `amount` | `Uint128` | + +#### AddFunds() + + The scenarios for the following are: TokenConnector: Reject All ; ZILConnector: This is a buy endpoint transition + +**No Arguments** + + + +#### CalculatePurchaseReturnCallback() + +is updated when it is used anyway those callbacks are called by the bancor formula contract and set the tmp result essentially those are return values from the module that is the bancor formula transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `result` | `Uint128` | + +#### CalculateSaleReturnCallback() + +transition + + **Arguments:** + +| | Name | Type | +| ------ | --------- | ------------------ | +| @param | `result` | `Uint128` | \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/Token.scilla b/reference/continuous-token-bonding-curve-contracts/src/Token/Token.scilla new file mode 100644 index 000000000..fa3ccc74a --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/Token.scilla @@ -0,0 +1,692 @@ +scilla_version 0 +(* + Authors: Mateusz Bednarski https://github.com/MszBednarski + and ZRC-2 standard people: + https://github.com/Zilliqa/ZRC/blob/master/zrcs/zrc-2.md +*) + +(***************************************************) +(* Associated library *) +(***************************************************) +import IntUtils +library Token + +let one_msg = + fun (msg : Message) => + let nil_msg = Nil {Message} in + Cons {Message} msg nil_msg + +let two_msgs = +fun (msg1 : Message) => +fun (msg2 : Message) => + let msgs_tmp = one_msg msg2 in + Cons {Message} msg1 msgs_tmp + +(* Error events *) +type Error = +| CodeIsSender +| CodeInsufficientFunds +| CodeInsufficientAllowance +| CodeNotInitialized +| CodeAlreadyInitialized +| CodeInputNotInBounds +| CodeInputIsZero +| CodeUnauthorized +| CodeConnectorError +| CodeNotImplemented +| CodeSupplyOverflow + +let make_error = + fun (result : Error) => + let result_code = + match result with + | CodeIsSender => Int32 -1 + | CodeInsufficientFunds => Int32 -2 + | CodeInsufficientAllowance => Int32 -3 + | CodeNotInitialized => Int32 -4 + | CodeAlreadyInitialized => Int32 -5 + | CodeInputNotInBounds => Int32 -6 + | CodeInputIsZero => Int32 -7 + | CodeUnauthorized => Int32 -8 + | CodeConnectorError => Int32 -9 + | CodeNotImplemented => Int32 -10 + | CodeSupplyOverflow => Int32 -11 + end + in + { _exception : "Error"; code : result_code } + +let zero = Uint128 0 +let zeroByStr20 = 0x0000000000000000000000000000000000000000 +let false = False +let true = True + +(* Dummy user-defined ADT *) +type Unit = +| Unit + +let get_val = + fun (some_val: Option Uint128) => + match some_val with + | Some val => val + | None => zero + end + +let uint128_to_uint256: Uint128 -> Uint256 = + fun (x: Uint128) => + let ox256 = builtin to_uint256 x in + match ox256 with + | None => + (* this never happens, hence we throw a division by zero exception just in case *) + let zero = Uint256 0 in + builtin div zero zero + | Some x256 => x256 + end + +(* calculates reserve ratio connector_balance*(fixed)//(marketcap*max) in ppm *) +let get_reserve_ratio: Uint128 -> Uint128 -> Uint128 = + fun(connector_balance: Uint128) => fun(market_cap: Uint128) => + (* (math.pow(2,128)-1) *) + let max = Uint256 340282366920938463463374607431768211456 in + (* (math.pow(2,128)-1) * math.pow(10,6) *) + let fixed = Uint256 340282366920938463463374607431768211456000000 in + let connector_balance_256 = uint128_to_uint256 connector_balance in + let market_cap_256 = uint128_to_uint256 market_cap in + let denom = builtin mul market_cap_256 max in + let num = builtin mul connector_balance_256 fixed in + let res_256 = builtin div num denom in + let ores_128 = builtin to_uint128 res_256 in + match ores_128 with + | None => + (* this must never happen div by zero ! *) + let f2 = Uint128 42 in builtin div f2 zero + | Some res_128 => res_128 + end + + +type ConnectorToken = +| ZIL +| ZRC2 of ByStr20 with contract field balances: Map ByStr20 Uint128 end + +let spread_denominator = Uint128 10000 + +type Uint128Pair = +| Uint128Pair of Uint128 Uint128 +let uint128_to_uint256 : Uint128 -> Uint256 = + fun (x : Uint128) => + let ox256 = builtin to_uint256 x in + match ox256 with + | None => + + let zero = Uint256 0 in + builtin div zero zero + | Some x256 => x256 + end +let muldiv: Uint128 -> Uint128 -> Uint128 -> Uint128 = + fun (x : Uint128) => + fun (y : Uint128) => + fun (z : Uint128) => + let x256 = uint128_to_uint256 x in + let y256 = uint128_to_uint256 y in + let z256 = uint128_to_uint256 z in + let x_mul_y256 = builtin mul x256 y256 in + let res256 = builtin div x_mul_y256 z256 in + let ores128 = builtin to_uint128 res256 in + match ores128 with + | None => + + let max_uint128 = Uint128 340282366920938463463374607431768211455 in + let fourtytwo128 = Uint128 42 in + builtin mul max_uint128 fourtytwo128 + | Some res128 => + res128 + end +let take_percentage_commission: Uint128 -> Uint128 -> Uint128Pair = + fun (amount: Uint128) => fun (spread_numerator: Uint128) => + let commission = muldiv amount spread_numerator spread_denominator in + let amount_sub_commission = builtin sub amount commission in + let res = Uint128Pair amount_sub_commission commission in + res +(***************************************************) +(* The contract definition *) +(***************************************************) + +contract Token +( + contract_owner: ByStr20, + name: String, + symbol: String, + decimals: Uint32, + init_supply: Uint128, + operator_contract: ByStr20 with contract field bancor_formula_contract: ByStr20, field spread: Uint128, field beneficiary: ByStr20 end +) + +(* Mutable fields *) + +field total_supply: Uint128 = init_supply +field current_supply: Uint128 = zero + +field balances: Map ByStr20 Uint128 + = Emp ByStr20 Uint128 + +field allowances: Map ByStr20 (Map ByStr20 Uint128) + = Emp ByStr20 (Map ByStr20 Uint128) + +field connector_token_type: ConnectorToken = ZIL + +field is_init: Bool = false + +(* used with procedure CalculateReserveRatio to calculate reserve ratio and retrieve it from this field *) +field tmp_reserve_ratio: Uint128 = zero + +(* used with procedure GetConnectorBalance to get the connector balance! *) +field tmp_connector_balance: Uint128 = zero + +(* the market cap of the smart token in terms of the connector token *) +field smart_token_market_cap: Uint128 = zero + +(* used with GetFromBalance to get the from balance *) +field tmp_from_balance: Uint128 = zero + +(* used with bancor formula contract to send the result of the calculation to the right user *) +(* @CalculatePurchaseReturnCallback *) +field tmp_bancor_formula_target: ByStr20 = zeroByStr20 + +(* used with @Transfer and @TransferFrom to package transfer code into a procedure *) +field tmp_is_smart_token_sell: Bool = false + +(* used with @TakeCommission to get the amount and commission numbers *) +field tmp_amount_and_commission: Uint128Pair = Uint128Pair zero zero + +(**************************************) +(* Procedures *) +(**************************************) + +procedure ThrowError(err : Error) + e = make_error err; + throw e +end + +procedure IncrementCurrentSupply(amt: Uint128) + cur <- current_supply; + total <- total_supply; + cur_add_amt = builtin add cur amt; + supply_overflow = uint128_lt total cur_add_amt; + match supply_overflow with + | True => e = CodeSupplyOverflow; ThrowError e + | False => current_supply := cur_add_amt + end +end + +procedure DecrementCurrentSupply(amt: Uint128) + cur <- current_supply; + total <- total_supply; + cur_sub_amt = builtin sub cur amt; + (* don't need to check underflow since scilla will throw if uint goes below zero *) + current_supply := cur_sub_amt +end + + +procedure AssertIsInitialized() + init <- is_init; + match init with + | True => + | False => e = CodeNotInitialized; ThrowError e + end +end + +procedure AssertIsNotInitialized() + init <- is_init; + match init with + | False => + | True => e = CodeAlreadyInitialized; ThrowError e + end +end + +procedure AssertIsLE(i1: Uint128, i2: Uint128) + is_le = uint128_le i1 i2; + match is_le with + | False => e = CodeInputNotInBounds; ThrowError e + | True => + end +end + +procedure AssertEQ(i1: Uint128, i2: Uint128) + is_le = builtin eq i1 i2; + match is_le with + | False => e = CodeInputNotInBounds; ThrowError e + | True => + end +end + +procedure AssertNotZero(value: Uint128) + is_zero = builtin eq zero value; + match is_zero with + | False => + | True => e = CodeInputIsZero; ThrowError e + end +end + +procedure AssertSenderIsAddress(address: ByStr20) + is_authorized = builtin eq address _sender; + match is_authorized with + | True => + | False => e = CodeUnauthorized; ThrowError e + end +end + + +procedure IsNotSender(address: ByStr20) + is_sender = builtin eq _sender address; + match is_sender with + | True => + err = CodeIsSender; + ThrowError err + | False => + end +end + +procedure GetConnectorBalance() + connector <- connector_token_type; + match connector with + | ZIL => + connector_balance <- _balance; + tmp_connector_balance := connector_balance + | ZRC2 token_address => + o_connector_balance <-& token_address.balances[_this_address]; + match o_connector_balance with + | Some connector_balance => + tmp_connector_balance := connector_balance + | None => e = CodeConnectorError; ThrowError e + end + end +end + +(* + @dev: it also gets connector balance so dont need to double read if you used this! + calculates the reserve ratio expressed in ppm +*) +procedure CalculateReserveRatio() + market_cap <- smart_token_market_cap; + GetConnectorBalance; connector_balance <- tmp_connector_balance; + tmp = get_reserve_ratio connector_balance market_cap; + tmp_reserve_ratio := tmp +end + +procedure GetFromBalance(from: ByStr20) + o_from_bal <- balances[from]; + bal = get_val o_from_bal; + tmp_from_balance := bal +end + + +(* Throw CodeInsufficientFunds if transfer cannot be done *) +procedure AssertCanDoTransfer(from: ByStr20, from_balance: Uint128, amount: Uint128) + can_do = uint128_le amount from_balance; + match can_do with + | True => + | False => + (* Balance not sufficient *) + err = CodeInsufficientFunds; + ThrowError err + end +end + +procedure SubtractAmountFromFromBalance(from: ByStr20, from_balance: Uint128, amount: Uint128) + new_from_bal = builtin sub from_balance amount; + balances[from] := new_from_bal +end + +procedure AddAmountToToBalance(to: ByStr20, amount: Uint128) + get_to_bal <- balances[to]; + new_to_bal = match get_to_bal with + | Some bal => builtin add bal amount + | None => amount + end; + balances[to] := new_to_bal +end + +procedure MoveBalance(from: ByStr20, from_balance: Uint128, to: ByStr20, amount: Uint128) + (* Subtract amount from from and add it to to address *) + SubtractAmountFromFromBalance from from_balance amount; + (* Adds amount to to address *) + AddAmountToToBalance to amount +end + +(* the result will be stored in the temp contract field: tmp_bancor_formula_result *) +(* READ INSTANTLY to make sure there is no other operations running in between calculate and result! *) +procedure CalculatePurchaseReturn(in_deposit_amount: Uint128) + bancor <-& operator_contract.bancor_formula_contract; + in_supply <- total_supply; + (* Calculate reserve ratio also gets the connector balance *) + CalculateReserveRatio; in_connector_weight <- tmp_reserve_ratio; in_connector_balance <- tmp_connector_balance; + msg = let m = { + _tag: "CalculatePurchaseReturn"; + _amount: zero; + _recipient: bancor; + in_supply: in_supply; + in_connector_balance: in_connector_balance; + in_connector_weight: in_connector_weight; + in_deposit_amount: in_deposit_amount + } in one_msg m; + send msg +end +procedure CalculateSaleReturn(in_sell_amount: Uint128) + bancor <-& operator_contract.bancor_formula_contract; + in_supply <- total_supply; + (* Calculate reserve ratio also gets the connector balance *) + CalculateReserveRatio; in_connector_weight <- tmp_reserve_ratio; in_connector_balance <- tmp_connector_balance; + msg = let m = { + _tag: "CalculateSaleReturn"; + _amount: zero; + _recipient: bancor; + in_supply: in_supply; + in_connector_balance: in_connector_balance; + in_connector_weight: in_connector_weight; + in_sell_amount: in_sell_amount + } in one_msg m; + send msg +end + +procedure SendConnectedToken(to: ByStr20, amount: Uint128) + connector <- connector_token_type; + match connector with + | ZRC2 token_address => + msg = let m = { + _tag: "Transfer"; + _recipient: token_address; + _amount: zero; + to: to; + amount: amount + } in one_msg m; + send msg + | ZIL => + msg = let m = { + _tag: "AddFunds"; + _recipient: to; + _amount: amount + } in one_msg m; + send msg + end +end + +procedure TakeCommission(amount: Uint128) + spread <-& operator_contract.spread; + tmp = take_percentage_commission amount spread; + tmp_amount_and_commission := tmp +end + +procedure DoBuySmartToken(sender: ByStr20, deposit_amount: Uint128) + tmp_bancor_formula_target := sender; + CalculatePurchaseReturn deposit_amount +end + +procedure BuySmartToken(sender: ByStr20, deposit_amount: Uint128) + TakeCommission deposit_amount; amount_and_commission <- tmp_amount_and_commission; + match amount_and_commission with + | Uint128Pair new_amt commission => + is_zero = builtin eq commission zero; + match is_zero with + | True => DoBuySmartToken sender deposit_amount + | False => + beneficiary <-& operator_contract.beneficiary; + SendConnectedToken beneficiary commission; + DoBuySmartToken sender new_amt + end + end +end + +(***************************************) +(* Transitions *) +(***************************************) +(* + @dev: Initializes the contract, the contract can be initalized only once + @param price: the price of 1 uint of the token, not the conceptual 1 uint * 10^decimals + but the literal 1 unit in terms of the connector token + @param connector_balance: the initial balance of the connector that effectively sets the CW of the contract! + where CW = connector_balance / (total_supply * price) +*) +transition InitZIL(price: Uint128, connector_balance: Uint128) + AssertSenderIsAddress contract_owner; + AssertIsNotInitialized; + AssertNotZero connector_balance; + (* if it overflows it means that it is too big! *) + (* effectively the max market cap of this contract could be the market cap of ZIL *) + supply <- total_supply; + market_cap = builtin mul price supply; + smart_token_market_cap := market_cap; + AssertIsLE connector_balance market_cap; + accept; + tmp = ZIL; + connector_token_type := tmp; + bal <- _balance; + (* if this is wrong there might have been an error while passing params *) + AssertEQ bal connector_balance; + is_init := true +end +(* + @dev: Initializes the contract, the contract can be initalized only once + @param price: the price of 1 uint of the token, not the conceptual 1 uint * 10^decimals + but the literal 1 unit in terms of the connector token + @param connector_balance: the initial balance of the connector that effectively sets the CW of the contract! + where CW = connector_balance / (total_supply * price) + @param token_address: if it is zeroByStr20 then ZIL connector token is assumed; + tokens are going to be taken using the allowance mechanism +*) +transition InitZRC2(price: Uint128, connector_balance: Uint128, token_address: ByStr20 with contract field balances: Map ByStr20 Uint128 end) + AssertSenderIsAddress contract_owner; + AssertIsNotInitialized; + AssertNotZero connector_balance; + (* if it overflows it means that it is too big! *) + (* effectively the max market cap of this contract could be the market cap of ZIL *) + supply <- total_supply; + market_cap = builtin mul price supply; + smart_token_market_cap := market_cap; + AssertIsLE connector_balance market_cap; + tmp = ZRC2 token_address; + connector_token_type := tmp; + (* Assert EQ is done by the ZRC2 *) + msg = let m = { + _tag: "TransferFrom"; + _amount: zero; + _recipient: token_address; + from: _sender; + to: _this_address; + amount: connector_balance + } in one_msg m; + send msg + (* is_init is set in the callback of the transfer from! *) +end + +(* @dev: Increase the allowance of an approved_spender over the caller tokens. Only token_owner allowed to invoke. *) +(* param spender: Address of the designated approved_spender. *) +(* param amount: Number of tokens to be increased as allowance for the approved_spender. *) +transition IncreaseAllowance(spender: ByStr20, amount: Uint128) + AssertIsInitialized; + IsNotSender spender; + some_current_allowance <- allowances[_sender][spender]; + current_allowance = get_val some_current_allowance; + new_allowance = builtin add current_allowance amount; + allowances[_sender][spender] := new_allowance; + e = {_eventname : "IncreasedAllowance"; token_owner : _sender; spender: spender; new_allowance : new_allowance}; + event e +end + +(* @dev: Decrease the allowance of an approved_spender over the caller tokens. Only token_owner allowed to invoke. *) +(* param spender: Address of the designated approved_spender. *) +(* param amount: Number of tokens to be decreased as allowance for the approved_spender. *) +transition DecreaseAllowance(spender: ByStr20, amount: Uint128) + AssertIsInitialized; + IsNotSender spender; + some_current_allowance <- allowances[_sender][spender]; + current_allowance = get_val some_current_allowance; + new_allowance = + let amount_le_allowance = uint128_le amount current_allowance in + match amount_le_allowance with + | True => builtin sub current_allowance amount + | False => zero + end; + allowances[_sender][spender] := new_allowance; + e = {_eventname : "DecreasedAllowance"; token_owner : _sender; spender: spender; new_allowance : new_allowance}; + event e +end + +procedure DoTransferFrom(from: ByStr20, to: ByStr20, amount: Uint128) + GetFromBalance from; from_balance <- tmp_from_balance; + AssertCanDoTransfer from from_balance amount; + is_smart_token_sell = builtin eq to _this_address; + tmp_is_smart_token_sell := is_smart_token_sell; + match is_smart_token_sell with + | True => + (* burn aka sell smart token *) + SubtractAmountFromFromBalance from from_balance amount; + DecrementCurrentSupply amount; + (* send back connected token *) + tmp_bancor_formula_target := from; + CalculateSaleReturn amount + | False => + MoveBalance from from_balance to amount + end +end + + +(* @note: move to _this_address is now a smart token sell! *) +(* @dev: Moves an amount tokens from _sender to the recipient. Used by token_owner. *) +(* @dev: Balance of recipient will increase. Balance of _sender will decrease. *) +(* @param to: Address of the recipient whose balance is increased. *) +(* @param amount: Amount of tokens to be sent. *) +transition Transfer(to: ByStr20, amount: Uint128) + AssertIsInitialized; + DoTransferFrom _sender to amount; is_smart_token_sell <- tmp_is_smart_token_sell; + (* emit the event in both cases to comply with the zrc2 standard *) + e = {_eventname : "TransferSuccess"; sender : _sender; recipient : to; amount : amount}; + event e; + match is_smart_token_sell with + | True => (* everything was done the token was burned *) + | False => + (* Prevent sending to a contract address that does not support transfers of token *) + msg_to_recipient = {_tag : "RecipientAcceptTransfer"; _recipient : to; _amount : zero; + sender : _sender; recipient : to; amount : amount}; + msg_to_sender = {_tag : "TransferSuccessCallBack"; _recipient : _sender; _amount : zero; + sender : _sender; recipient : to; amount : amount}; + msgs = two_msgs msg_to_recipient msg_to_sender; + send msgs + end +end + +(* @dev: Move a given amount of tokens from one address to another using the allowance mechanism. The caller must be an approved_spender. *) +(* @dev: Balance of recipient will increase. Balance of token_owner will decrease. *) +(* @param from: Address of the token_owner whose balance is decreased. *) +(* @param to: Address of the recipient whose balance is increased. *) +(* @param amount: Amount of tokens to be transferred. *) +transition TransferFrom(from: ByStr20, to: ByStr20, amount: Uint128) + AssertIsInitialized; + o_spender_allowed <- allowances[from][_sender]; + allowed = get_val o_spender_allowed; + can_do = uint128_le amount allowed; + match can_do with + | True => + DoTransferFrom from to amount; is_smart_token_sell <- tmp_is_smart_token_sell; + e = {_eventname : "TransferFromSuccess"; initiator : _sender; sender : from; recipient : to; amount : amount}; + event e; + new_allowed = builtin sub allowed amount; + allowances[from][_sender] := new_allowed; + match is_smart_token_sell with + | True => (* everything was done *) + | False => + (* Prevent sending to a contract address that does not support transfers of token *) + msg_to_recipient = {_tag: "RecipientAcceptTransferFrom"; _recipient : to; _amount: zero; + initiator: _sender; sender : from; recipient: to; amount: amount}; + msg_to_sender = {_tag: "TransferFromSuccessCallBack"; _recipient: _sender; _amount: zero; + initiator: _sender; sender: from; recipient: to; amount: amount}; + msgs = two_msgs msg_to_recipient msg_to_sender; + send msgs + end + | False => + err = CodeInsufficientAllowance; + ThrowError err + end +end + +(* + The scenarios for the following are: + TokenConnector: + This is a buy endpoint; + Accept only messages from connectorToken + ZILConnector: + Reject All; + this assumes that the connected token is not hostile implementation but actual + zrc2 which makes sense given the issuer of the smart token is initiating + thus recipient must be _this_address +*) +transition RecipientAcceptTransfer(sender: ByStr20, recipient: ByStr20, amount: Uint128) + AssertIsInitialized; + connector <- connector_token_type; + match connector with + | ZIL => e = CodeNotImplemented; ThrowError e + | ZRC2 token_address => + AssertSenderIsAddress token_address; + BuySmartToken sender amount + end +end +transition RecipientAcceptTransferFrom(initiator: ByStr20, sender: ByStr20, recipient: ByStr20, amount: Uint128) + init <- is_init; + match init with + | False => (* special case only available during contract init zrc2 sequence, set the init status to True *) + is_init := true + | True => + (* general case act as buy endpoint *) + connector <- connector_token_type; + match connector with + | ZIL => e = CodeNotImplemented; ThrowError e + | ZRC2 token_address => + AssertSenderIsAddress token_address; + BuySmartToken sender amount + end + end +end +(* needed to send connector token to the smart token sellers! *) +transition TransferSuccessCallBack(sender: ByStr20, recipient: ByStr20, amount: Uint128) + AssertIsInitialized +end +(* needed for contract init sequence! *) +transition TransferFromSuccessCallBack(initiator: ByStr20, sender: ByStr20, recipient: ByStr20, amount: Uint128) + AssertIsInitialized +end +(* + The scenarios for the following are: + TokenConnector: + Reject All; + ZILConnector: + This is a buy endpoint +*) +transition AddFunds() + AssertIsInitialized; + connector <- connector_token_type; + match connector with + | ZRC2 token_address => e = CodeNotImplemented; ThrowError e + | ZIL => + prev_balance <- _balance; + accept; + cur_balance <- _balance; + deposit_amount = builtin sub cur_balance prev_balance; + BuySmartToken _sender deposit_amount + end +end + +(* people can call these and set them the tmp value field is updated when it is used anyway *) +(* those callbacks are called by the bancor formula contract and set the tmp result *) +(* essentially those are return values from the module that is the bancor formula *) +transition CalculatePurchaseReturnCallback(result: Uint128) + target <- tmp_bancor_formula_target; + bancor <-& operator_contract.bancor_formula_contract; + AssertSenderIsAddress bancor; + AddAmountToToBalance target result; + IncrementCurrentSupply result +end + +transition CalculateSaleReturnCallback(result: Uint128) + target <- tmp_bancor_formula_target; + bancor <-& operator_contract.bancor_formula_contract; + AssertSenderIsAddress bancor; + SendConnectedToken target result +end \ No newline at end of file diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/run.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/run.ts new file mode 100644 index 000000000..b1c43e56d --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/run.ts @@ -0,0 +1,15 @@ +import { scillaServer } from "../../../scillaTest"; +import { testDeployAndInitTokenWithZIL } from "./testDeployAndInitTokenWithZIL"; +import { testDeployAndInitTokenWithZRC2 } from "./testDeployAndInitTokenWithZRC2"; +import { code } from "../build/bind"; + +(async () => { + try { + await testDeployAndInitTokenWithZIL(code, scillaServer); + await testDeployAndInitTokenWithZRC2(code, scillaServer); + } catch (e) { + console.error(e); + } + console.info("Done!"); + process.exit(); +})(); diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/shared.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/shared.ts new file mode 100644 index 000000000..3ce7ae8e4 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/shared.ts @@ -0,0 +1,22 @@ +import * as operatorSDK from "../../Operator/build/bind"; +import * as formulaSDK from "../../BancorFormula/build/bind"; +import { ByStr20, Uint128 } from "../../../boost-zil"; +import { Long } from "@zilliqa-js/util"; + +export async function deployFormulaAndOperator(adminAddr: ByStr20) { + const limit = Long.fromString("100000"); + const thirdIsolatedServerAddress = new ByStr20( + "0xB028055EA3BC78D759d10663Da40D171dec992Aa" + ); + const [, , formulaAddr] = await formulaSDK.deploy().send(limit); + const [, , operatorAddr] = await operatorSDK + .deploy( + adminAddr, + formulaAddr, + new Uint128("10"), // 1% spread + new Uint128("50"), // max 5% spread + thirdIsolatedServerAddress + ) + .send(limit); + return { operatorAddr }; +} diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZIL.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZIL.ts new file mode 100644 index 000000000..54d7bba1b --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZIL.ts @@ -0,0 +1,77 @@ +import { TestingFunction } from "../../../scillaTest/utill"; +import { + ByStr20, + Uint128, + getDefaultAccount, + Uint32, + ScillaString, + sleep, + getZil, +} from "../../../boost-zil"; +import * as tokenSDK from "../build/bind"; +import { Long } from "@zilliqa-js/util"; +import { zils } from "./utils"; +import { deployFormulaAndOperator } from "./shared"; + +export const testDeployAndInitTokenWithZIL: TestingFunction = async ( + code, + ss +) => { + try { + console.log("🙌 testDeployAndInitTokenWithZIL"); + const admin = getDefaultAccount(); + const isolatedServerSecondaryAcc = new ByStr20( + "0x381f4008505e940AD7681EC3468a719060caF796" + ); + const adminAddr = new ByStr20(admin.address); + const limit = Long.fromString("100000"); + const { operatorAddr } = await deployFormulaAndOperator(adminAddr); + const [, , tokenAddr] = await tokenSDK + .deploy( + adminAddr, + new ScillaString("Bancor"), + new ScillaString("BNT"), + new Uint32("12"), + zils("100000"), + operatorAddr + ) + .send(limit); + const token = + tokenSDK.hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + tokenAddr + ); + const tokenContract = token.run(limit); + await token.state().log("is_init"); + await token.state().log("_balance"); + const connectorBalance = zils("1000"); + await tokenContract + .InitZIL(connectorBalance, new Uint128("2"), connectorBalance) + .send(); + await token.state().log("is_init"); + await token.state().log("balances"); + await token.state().log("_balance"); + //buy smart token + await tokenContract.AddFunds(zils("10")).send(); + await token.state().log("balances"); + await token.state().log("_balance"); + //sell smart token + await tokenContract.Transfer(tokenAddr, zils("2")).send(); + await token.state().log("balances"); + await token.state().log("_balance"); + //sell with transfer from + await tokenContract + .IncreaseAllowance(isolatedServerSecondaryAcc, zils("2")) + .send(); + await token.state().log("allowances"); + const zil = getZil(); + zil.wallet.setDefault(isolatedServerSecondaryAcc.value); + await tokenContract.TransferFrom(adminAddr, tokenAddr, zils("2")).send(); + await token.state().log("allowances"); + await token.state().log("balances"); + await token.state().log("_balance"); + //reset zil + zil.wallet.setDefault(admin.address); + } catch (e) { + throw e; + } +}; diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/index.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/index.ts new file mode 100644 index 000000000..3e0cd5e60 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/index.ts @@ -0,0 +1,104 @@ +import { TestingFunction } from "../../../../scillaTest/utill"; +import { + ByStr20, + Uint128, + getDefaultAccount, + Uint32, + ScillaString, + sleep, + getZil, +} from "../../../../boost-zil"; +import * as tokenSDK from "../../build/bind"; +import { Long } from "@zilliqa-js/util"; +import { zils } from "./../utils"; +import { deployFormulaAndOperator } from "./../shared"; +import * as zrc2SDK from "./zrc2Bind"; + +export const testDeployAndInitTokenWithZRC2: TestingFunction = async ( + code, + ss +) => { + try { + console.log("🙌 testDeployAndInitTokenWithZRC2"); + const admin = getDefaultAccount(); + const isolatedServerSecondaryAcc = new ByStr20( + "0x381f4008505e940AD7681EC3468a719060caF796" + ); + const adminAddr = new ByStr20(admin.address); + const limit = Long.fromString("100000"); + const [, , oxygenAddr] = await zrc2SDK + .deploy( + adminAddr, + new ScillaString("Oxygen"), + new ScillaString("OXY"), + new Uint32("12"), + zils("10000") + ) + .send(limit); + const oxygen = + zrc2SDK.hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + oxygenAddr + ); + const oxygenContract = oxygen.run(limit); + const { operatorAddr } = await deployFormulaAndOperator(adminAddr); + const [, , tokenAddr] = await tokenSDK + .deploy( + adminAddr, + new ScillaString("Bancor"), + new ScillaString("BNT"), + new Uint32("12"), + zils("100000"), + operatorAddr + ) + .send(limit); + const token = + tokenSDK.hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855( + tokenAddr + ); + const tokenContract = token.run(limit); + const connectorBalance = zils("1000"); + await oxygenContract.IncreaseAllowance(tokenAddr, connectorBalance).send(); + await token.state().log("is_init"); + // await oxygen.state().log("balances"); + await tokenContract + .InitZRC2(new Uint128("2"), connectorBalance, oxygenAddr) + .send(); + await token.state().log("is_init"); + await token.state().log("balances"); + // await oxygen.state().log("balances"); + //buy smart token + await oxygenContract.Transfer(tokenAddr, zils("5")).send(); + await token.state().log("balances"); + // await oxygen.state().log("balances"); + //buy smart token transfer from + await oxygenContract + .IncreaseAllowance(isolatedServerSecondaryAcc, zils("5")) + .send(); + await oxygen.state().log("allowances"); + const zil = getZil(); + zil.wallet.setDefault(isolatedServerSecondaryAcc.value); + await oxygenContract.TransferFrom(adminAddr, tokenAddr, zils("5")).send(); + token.state().log("balances"); + oxygen.state().log("balances"); + //go back to admin + zil.wallet.setDefault(admin.address); + //sell smart token + await tokenContract.Transfer(tokenAddr, zils("2")).send(); + await token.state().log("balances"); + // await oxygen.state().log("balances"); + //sell with transfer from + await tokenContract + .IncreaseAllowance(isolatedServerSecondaryAcc, zils("2")) + .send(); + await token.state().log("allowances"); + zil.wallet.setDefault(isolatedServerSecondaryAcc.value); + await tokenContract.TransferFrom(adminAddr, tokenAddr, zils("2")).send(); + await token.state().log("allowances"); + await token.state().log("balances"); + await oxygen.state().log("balances"); + //reset zil + zil.wallet.setDefault(admin.address); + } catch (e) { + throw e; + } +}; diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/zrc2Bind.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/zrc2Bind.ts new file mode 100644 index 000000000..c2c5ece80 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/testDeployAndInitTokenWithZRC2/zrc2Bind.ts @@ -0,0 +1,593 @@ +import { + getZil, + log, + getVersion, + getContract, + newContract, + getMinGasPrice, +} from "../../../../boost-zil/infra-manipulation"; +import { BN, Long } from "@zilliqa-js/util"; +import { Transaction } from "@zilliqa-js/account"; +import { Contract } from "@zilliqa-js/contract"; +import * as T from "../../../../boost-zil/signable"; +import * as BOOST from "../../../../boost-zil"; +import { Zilliqa } from "@zilliqa-js/zilliqa"; + +/** + * general interface of the data returned by toJSON() on the transitions + */ +export type TransactionData = { + /** + * the signature hash of the source code of the contract that this data interacts with + */ + contractSignature: string, + /** + * contract to send the transaction to + */ + contractAddress: string, + /** + * zil amount to send + */ + amount: string, + /** + * the name of the transition called in the target contract + */ + contractTransitionName: string, + data: any[], +}; + +export const code = ` +(* sourceCodeHash=0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +(* sourceCodeHashKey=hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +scilla_version 0 + + + + +import IntUtils +library ZRC2 + +let one_msg = + fun (msg : Message) => + let nil_msg = Nil {Message} in + Cons {Message} msg nil_msg + +let two_msgs = +fun (msg1 : Message) => +fun (msg2 : Message) => + let msgs_tmp = one_msg msg2 in + Cons {Message} msg1 msgs_tmp + + +type Error = +| CodeIsSender +| CodeInsufficientFunds +| CodeInsufficientAllowance + +let make_error = + fun (result : Error) => + let result_code = + match result with + | CodeIsSender => Int32 -1 + | CodeInsufficientFunds => Int32 -2 + | CodeInsufficientAllowance => Int32 -3 + end + in + { _exception : "Error"; code : result_code } + +let zero = Uint128 0 + + +type Unit = +| Unit + +let get_val = + fun (some_val: Option Uint128) => + match some_val with + | Some val => val + | None => zero + end + + + + + +contract ZRC2 +( + contract_owner: ByStr20, + name : String, + symbol: String, + decimals: Uint32, + init_supply : Uint128 +) + + + +field total_supply : Uint128 = init_supply + +field balances: Map ByStr20 Uint128 + = let emp_map = Emp ByStr20 Uint128 in + builtin put emp_map contract_owner init_supply + +field allowances: Map ByStr20 (Map ByStr20 Uint128) + = Emp ByStr20 (Map ByStr20 Uint128) + + + + + +procedure ThrowError(err : Error) + e = make_error err; + throw e +end + +procedure IsNotSender(address: ByStr20) + is_sender = builtin eq _sender address; + match is_sender with + | True => + err = CodeIsSender; + ThrowError err + | False => + end +end + +procedure AuthorizedMoveIfSufficientBalance(from: ByStr20, to: ByStr20, amount: Uint128) + o_from_bal <- balances[from]; + bal = get_val o_from_bal; + can_do = uint128_le amount bal; + match can_do with + | True => + + new_from_bal = builtin sub bal amount; + balances[from] := new_from_bal; + + get_to_bal <- balances[to]; + new_to_bal = match get_to_bal with + | Some bal => builtin add bal amount + | None => amount + end; + balances[to] := new_to_bal + | False => + + err = CodeInsufficientFunds; + ThrowError err + end +end + + + + + + + + +transition IncreaseAllowance(spender: ByStr20, amount: Uint128) + IsNotSender spender; + some_current_allowance <- allowances[_sender][spender]; + current_allowance = get_val some_current_allowance; + new_allowance = builtin add current_allowance amount; + allowances[_sender][spender] := new_allowance; + e = {_eventname : "IncreasedAllowance"; token_owner : _sender; spender: spender; new_allowance : new_allowance}; + event e +end + + + + +transition DecreaseAllowance(spender: ByStr20, amount: Uint128) + IsNotSender spender; + some_current_allowance <- allowances[_sender][spender]; + current_allowance = get_val some_current_allowance; + new_allowance = + let amount_le_allowance = uint128_le amount current_allowance in + match amount_le_allowance with + | True => builtin sub current_allowance amount + | False => zero + end; + allowances[_sender][spender] := new_allowance; + e = {_eventname : "DecreasedAllowance"; token_owner : _sender; spender: spender; new_allowance : new_allowance}; + event e +end + + + + + +transition Transfer(to: ByStr20, amount: Uint128) + AuthorizedMoveIfSufficientBalance _sender to amount; + e = {_eventname : "TransferSuccess"; sender : _sender; recipient : to; amount : amount}; + event e; + + msg_to_recipient = {_tag : "RecipientAcceptTransfer"; _recipient : to; _amount : zero; + sender : _sender; recipient : to; amount : amount}; + msg_to_sender = {_tag : "TransferSuccessCallBack"; _recipient : _sender; _amount : zero; + sender : _sender; recipient : to; amount : amount}; + msgs = two_msgs msg_to_recipient msg_to_sender; + send msgs +end + + + + + + +transition TransferFrom(from: ByStr20, to: ByStr20, amount: Uint128) + o_spender_allowed <- allowances[from][_sender]; + allowed = get_val o_spender_allowed; + can_do = uint128_le amount allowed; + match can_do with + | True => + AuthorizedMoveIfSufficientBalance from to amount; + e = {_eventname : "TransferFromSuccess"; initiator : _sender; sender : from; recipient : to; amount : amount}; + event e; + new_allowed = builtin sub allowed amount; + allowances[from][_sender] := new_allowed; + + msg_to_recipient = {_tag: "RecipientAcceptTransferFrom"; _recipient : to; _amount: zero; + initiator: _sender; sender : from; recipient: to; amount: amount}; + msg_to_sender = {_tag: "TransferFromSuccessCallBack"; _recipient: _sender; _amount: zero; + initiator: _sender; sender: from; recipient: to; amount: amount}; + msgs = two_msgs msg_to_recipient msg_to_sender; + send msgs + | False => + err = CodeInsufficientAllowance; + ThrowError err + end +end`; +export const deploy = ( + __contract_owner: T.ByStr20, + __name: T.ScillaString, + __symbol: T.ScillaString, + __decimals: T.Uint32, + __init_supply: T.Uint128 +) => { + const initData = [ + { + type: `Uint32`, + vname: `_scilla_version`, + value: "0", + }, + { + type: `ByStr20`, + vname: `contract_owner`, + value: __contract_owner.toSend(), + }, + { + type: `String`, + vname: `name`, + value: __name.toSend(), + }, + { + type: `String`, + vname: `symbol`, + value: __symbol.toSend(), + }, + { + type: `Uint32`, + vname: `decimals`, + value: __decimals.toSend(), + }, + { + type: `Uint128`, + vname: `init_supply`, + value: __init_supply.toSend(), + }, + ]; + return { + initToJSON: () => initData, + send: async function ( + gasLimit: Long + ): Promise<[Transaction, Contract, T.ByStr20]> { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + + const contract = newContract(zil, code, initData); + const [tx, con] = await contract.deploy( + { + version: getVersion(), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "Deploy"); + if (!con.address) { + if (con.error) { + throw new Error(JSON.stringify(con.error, null, 2)); + } + throw new Error("Contract failed to deploy"); + } + return [tx, con, new T.ByStr20(con.address)]; + }, + }; +}; + +/** + * this string is the signature of the hash of the source code + * that was used to generate this sdk + */ +export const contractSignature = + "hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + +/** + * will try to send a transaction to the contract + * @warning WILL NOT THROW ERRORS IF CONTRACT SIGNATURES ARE INVALID + */ +export async function dangerousFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, new T.ByStr20(t.contractAddress).toSend()); + + const tx = await contract.call( + t.contractTransitionName, + t.data, + { + version: getVersion(), + amount: new BN(t.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, t.contractTransitionName); + return tx; +} +/** + * Will throw error if contract signatures are incompatible! + */ +export async function safeFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + if (t.contractSignature != contractSignature) { + throw new Error("Incompatible contract signatures!"); + } + await dangerousFromJSONTransaction(zil, t, gasLimit); +} + +/** + * interface for scilla contract with source code hash: + * 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + * generated on: + * 2021-08-22T16:54:08.771Z + */ +export const hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 = + (a: T.ByStr20) => ({ + state: () => ({ + get: async function (field: "total_supply" | "balances" | "allowances") { + const zil = getZil(); + return ( + await zil.blockchain.getSmartContractSubState(a.toSend(), field) + ).result; + }, + log: async function ( + field: "total_supply" | "balances" | "allowances" | "_balance" + ) { + const zil = getZil(); + if (field == "_balance") { + console.log((await zil.blockchain.getBalance(a.toSend())).result); + return; + } + console.log( + (await zil.blockchain.getSmartContractSubState(a.toSend(), field)) + .result + ); + }, + }), + run: (gasLimit: Long) => ({ + IncreaseAllowance: (__spender: T.ByStr20, __amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `IncreaseAllowance`, + data: [ + { + type: `ByStr20`, + vname: `spender`, + value: __spender.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "IncreaseAllowance"); + return tx; + }, + }; + }, + + DecreaseAllowance: (__spender: T.ByStr20, __amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `DecreaseAllowance`, + data: [ + { + type: `ByStr20`, + vname: `spender`, + value: __spender.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "DecreaseAllowance"); + return tx; + }, + }; + }, + + Transfer: (__to: T.ByStr20, __amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `Transfer`, + data: [ + { + type: `ByStr20`, + vname: `to`, + value: __to.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "Transfer"); + return tx; + }, + }; + }, + + TransferFrom: ( + __from: T.ByStr20, + __to: T.ByStr20, + __amount: T.Uint128 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `TransferFrom`, + data: [ + { + type: `ByStr20`, + vname: `from`, + value: __from.toSend(), + }, + { + type: `ByStr20`, + vname: `to`, + value: __to.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "TransferFrom"); + return tx; + }, + }; + }, + }), + }); diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/utils.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/utils.ts new file mode 100644 index 000000000..1d05d06c7 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/__tests__/utils.ts @@ -0,0 +1,6 @@ +import { units } from "@zilliqa-js/util"; +import { Uint128 } from "../../../boost-zil"; + +export function zils(s: string) { + return new Uint128(units.toQa(s, units.Units.Zil)); +} diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/build/abi.json b/reference/continuous-token-bonding-curve-contracts/src/Token/build/abi.json new file mode 100644 index 000000000..f13690470 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/build/abi.json @@ -0,0 +1,381 @@ +{ + "contract_info": { + "scilla_major_version": "0", + "vname": "Token", + "params": [ + { "vname": "contract_owner", "type": "ByStr20" }, + { "vname": "name", "type": "String" }, + { "vname": "symbol", "type": "String" }, + { "vname": "decimals", "type": "Uint32" }, + { "vname": "init_supply", "type": "Uint128" }, + { + "vname": "operator_contract", + "type": + "ByStr20 with contract field bancor_formula_contract : ByStr20, field beneficiary : ByStr20, field spread : Uint128 end" + } + ], + "fields": [ + { "vname": "total_supply", "type": "Uint128", "depth": 0 }, + { "vname": "current_supply", "type": "Uint128", "depth": 0 }, + { "vname": "balances", "type": "Map (ByStr20) (Uint128)", "depth": 1 }, + { + "vname": "allowances", + "type": "Map (ByStr20) (Map (ByStr20) (Uint128))", + "depth": 2 + }, + { + "vname": "connector_token_type", + "type": "Token.ConnectorToken", + "depth": 0 + }, + { "vname": "is_init", "type": "Bool", "depth": 0 }, + { "vname": "tmp_reserve_ratio", "type": "Uint128", "depth": 0 }, + { "vname": "tmp_connector_balance", "type": "Uint128", "depth": 0 }, + { "vname": "smart_token_market_cap", "type": "Uint128", "depth": 0 }, + { "vname": "tmp_from_balance", "type": "Uint128", "depth": 0 }, + { "vname": "tmp_bancor_formula_target", "type": "ByStr20", "depth": 0 }, + { "vname": "tmp_is_smart_token_sell", "type": "Bool", "depth": 0 }, + { + "vname": "tmp_amount_and_commission", + "type": "Token.Uint128Pair", + "depth": 0 + } + ], + "transitions": [ + { + "vname": "InitZIL", + "params": [ + { "vname": "price", "type": "Uint128" }, + { "vname": "connector_balance", "type": "Uint128" } + ] + }, + { + "vname": "InitZRC2", + "params": [ + { "vname": "price", "type": "Uint128" }, + { "vname": "connector_balance", "type": "Uint128" }, + { + "vname": "token_address", + "type": + "ByStr20 with contract field balances : Map (ByStr20) (Uint128) end" + } + ] + }, + { + "vname": "IncreaseAllowance", + "params": [ + { "vname": "spender", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "DecreaseAllowance", + "params": [ + { "vname": "spender", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "Transfer", + "params": [ + { "vname": "to", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "TransferFrom", + "params": [ + { "vname": "from", "type": "ByStr20" }, + { "vname": "to", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "RecipientAcceptTransfer", + "params": [ + { "vname": "sender", "type": "ByStr20" }, + { "vname": "recipient", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "RecipientAcceptTransferFrom", + "params": [ + { "vname": "initiator", "type": "ByStr20" }, + { "vname": "sender", "type": "ByStr20" }, + { "vname": "recipient", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "TransferSuccessCallBack", + "params": [ + { "vname": "sender", "type": "ByStr20" }, + { "vname": "recipient", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "TransferFromSuccessCallBack", + "params": [ + { "vname": "initiator", "type": "ByStr20" }, + { "vname": "sender", "type": "ByStr20" }, + { "vname": "recipient", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { "vname": "AddFunds", "params": [] }, + { + "vname": "CalculatePurchaseReturnCallback", + "params": [ { "vname": "result", "type": "Uint128" } ] + }, + { + "vname": "CalculateSaleReturnCallback", + "params": [ { "vname": "result", "type": "Uint128" } ] + } + ], + "procedures": [ + { + "vname": "ThrowError", + "params": [ { "vname": "err", "type": "Token.Error" } ] + }, + { + "vname": "IncrementCurrentSupply", + "params": [ { "vname": "amt", "type": "Uint128" } ] + }, + { + "vname": "DecrementCurrentSupply", + "params": [ { "vname": "amt", "type": "Uint128" } ] + }, + { "vname": "AssertIsInitialized", "params": [] }, + { "vname": "AssertIsNotInitialized", "params": [] }, + { + "vname": "AssertIsLE", + "params": [ + { "vname": "i1", "type": "Uint128" }, + { "vname": "i2", "type": "Uint128" } + ] + }, + { + "vname": "AssertEQ", + "params": [ + { "vname": "i1", "type": "Uint128" }, + { "vname": "i2", "type": "Uint128" } + ] + }, + { + "vname": "AssertNotZero", + "params": [ { "vname": "value", "type": "Uint128" } ] + }, + { + "vname": "AssertSenderIsAddress", + "params": [ { "vname": "address", "type": "ByStr20" } ] + }, + { + "vname": "IsNotSender", + "params": [ { "vname": "address", "type": "ByStr20" } ] + }, + { "vname": "GetConnectorBalance", "params": [] }, + { "vname": "CalculateReserveRatio", "params": [] }, + { + "vname": "GetFromBalance", + "params": [ { "vname": "from", "type": "ByStr20" } ] + }, + { + "vname": "AssertCanDoTransfer", + "params": [ + { "vname": "from", "type": "ByStr20" }, + { "vname": "from_balance", "type": "Uint128" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "SubtractAmountFromFromBalance", + "params": [ + { "vname": "from", "type": "ByStr20" }, + { "vname": "from_balance", "type": "Uint128" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "AddAmountToToBalance", + "params": [ + { "vname": "to", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "MoveBalance", + "params": [ + { "vname": "from", "type": "ByStr20" }, + { "vname": "from_balance", "type": "Uint128" }, + { "vname": "to", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "CalculatePurchaseReturn", + "params": [ { "vname": "in_deposit_amount", "type": "Uint128" } ] + }, + { + "vname": "CalculateSaleReturn", + "params": [ { "vname": "in_sell_amount", "type": "Uint128" } ] + }, + { + "vname": "SendConnectedToken", + "params": [ + { "vname": "to", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "TakeCommission", + "params": [ { "vname": "amount", "type": "Uint128" } ] + }, + { + "vname": "DoBuySmartToken", + "params": [ + { "vname": "sender", "type": "ByStr20" }, + { "vname": "deposit_amount", "type": "Uint128" } + ] + }, + { + "vname": "BuySmartToken", + "params": [ + { "vname": "sender", "type": "ByStr20" }, + { "vname": "deposit_amount", "type": "Uint128" } + ] + }, + { + "vname": "DoTransferFrom", + "params": [ + { "vname": "from", "type": "ByStr20" }, + { "vname": "to", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + } + ], + "events": [ + { + "vname": "TransferFromSuccess", + "params": [ + { "vname": "initiator", "type": "ByStr20" }, + { "vname": "sender", "type": "ByStr20" }, + { "vname": "recipient", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "TransferSuccess", + "params": [ + { "vname": "sender", "type": "ByStr20" }, + { "vname": "recipient", "type": "ByStr20" }, + { "vname": "amount", "type": "Uint128" } + ] + }, + { + "vname": "DecreasedAllowance", + "params": [ + { "vname": "token_owner", "type": "ByStr20" }, + { "vname": "spender", "type": "ByStr20" }, + { "vname": "new_allowance", "type": "Uint128" } + ] + }, + { + "vname": "IncreasedAllowance", + "params": [ + { "vname": "token_owner", "type": "ByStr20" }, + { "vname": "spender", "type": "ByStr20" }, + { "vname": "new_allowance", "type": "Uint128" } + ] + } + ], + "ADTs": [ + { + "tname": "Token.Unit", + "tparams": [], + "tmap": [ { "cname": "Token.Unit", "argtypes": [] } ] + }, + { + "tname": "Token.ConnectorToken", + "tparams": [], + "tmap": [ + { "cname": "Token.ZIL", "argtypes": [] }, + { + "cname": "Token.ZRC2", + "argtypes": [ + "ByStr20 with contract field balances : Map (ByStr20) (Uint128) end" + ] + } + ] + }, + { + "tname": "Token.Error", + "tparams": [], + "tmap": [ + { "cname": "Token.CodeIsSender", "argtypes": [] }, + { "cname": "Token.CodeInsufficientFunds", "argtypes": [] }, + { "cname": "Token.CodeInsufficientAllowance", "argtypes": [] }, + { "cname": "Token.CodeNotInitialized", "argtypes": [] }, + { "cname": "Token.CodeAlreadyInitialized", "argtypes": [] }, + { "cname": "Token.CodeInputNotInBounds", "argtypes": [] }, + { "cname": "Token.CodeInputIsZero", "argtypes": [] }, + { "cname": "Token.CodeUnauthorized", "argtypes": [] }, + { "cname": "Token.CodeConnectorError", "argtypes": [] }, + { "cname": "Token.CodeNotImplemented", "argtypes": [] }, + { "cname": "Token.CodeSupplyOverflow", "argtypes": [] } + ] + }, + { + "tname": "Option", + "tparams": [ "'A" ], + "tmap": [ + { "cname": "Some", "argtypes": [ "'A" ] }, + { "cname": "None", "argtypes": [] } + ] + }, + { + "tname": "Token.Uint128Pair", + "tparams": [], + "tmap": [ + { + "cname": "Token.Uint128Pair", + "argtypes": [ "Uint128", "Uint128" ] + } + ] + }, + { + "tname": "Bool", + "tparams": [], + "tmap": [ + { "cname": "True", "argtypes": [] }, + { "cname": "False", "argtypes": [] } + ] + }, + { + "tname": "Nat", + "tparams": [], + "tmap": [ + { "cname": "Zero", "argtypes": [] }, + { "cname": "Succ", "argtypes": [ "Nat" ] } + ] + }, + { + "tname": "List", + "tparams": [ "'A" ], + "tmap": [ + { "cname": "Cons", "argtypes": [ "'A", "List ('A)" ] }, + { "cname": "Nil", "argtypes": [] } + ] + }, + { + "tname": "Pair", + "tparams": [ "'A", "'B" ], + "tmap": [ { "cname": "Pair", "argtypes": [ "'A", "'B" ] } ] + } + ] + }, + "warnings": [], + "gas_remaining": "9941" +} + diff --git a/reference/continuous-token-bonding-curve-contracts/src/Token/build/bind.ts b/reference/continuous-token-bonding-curve-contracts/src/Token/build/bind.ts new file mode 100644 index 000000000..e8374fe4b --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/src/Token/build/bind.ts @@ -0,0 +1,1330 @@ +import { + getZil, + log, + getVersion, + getContract, + newContract, + getMinGasPrice, +} from "../../../boost-zil/infra-manipulation"; +import { BN, Long } from "@zilliqa-js/util"; +import { Transaction } from "@zilliqa-js/account"; +import { Contract } from "@zilliqa-js/contract"; +import * as T from "../../../boost-zil/signable"; +import * as BOOST from "../../../boost-zil"; +import { Zilliqa } from "@zilliqa-js/zilliqa"; + +/** + * general interface of the data returned by toJSON() on the transitions + */ +export type TransactionData = { + /** + * the signature hash of the source code of the contract that this data interacts with + */ + contractSignature: string, + /** + * contract to send the transaction to + */ + contractAddress: string, + /** + * zil amount to send + */ + amount: string, + /** + * the name of the transition called in the target contract + */ + contractTransitionName: string, + data: any[], +}; + +export const code = ` +(* sourceCodeHash=0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +(* sourceCodeHashKey=hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *) +scilla_version 0 + + + + + +import IntUtils +library Token + +let one_msg = + fun (msg : Message) => + let nil_msg = Nil {Message} in + Cons {Message} msg nil_msg + +let two_msgs = +fun (msg1 : Message) => +fun (msg2 : Message) => + let msgs_tmp = one_msg msg2 in + Cons {Message} msg1 msgs_tmp + + +type Error = +| CodeIsSender +| CodeInsufficientFunds +| CodeInsufficientAllowance +| CodeNotInitialized +| CodeAlreadyInitialized +| CodeInputNotInBounds +| CodeInputIsZero +| CodeUnauthorized +| CodeConnectorError +| CodeNotImplemented +| CodeSupplyOverflow + +let make_error = + fun (result : Error) => + let result_code = + match result with + | CodeIsSender => Int32 -1 + | CodeInsufficientFunds => Int32 -2 + | CodeInsufficientAllowance => Int32 -3 + | CodeNotInitialized => Int32 -4 + | CodeAlreadyInitialized => Int32 -5 + | CodeInputNotInBounds => Int32 -6 + | CodeInputIsZero => Int32 -7 + | CodeUnauthorized => Int32 -8 + | CodeConnectorError => Int32 -9 + | CodeNotImplemented => Int32 -10 + | CodeSupplyOverflow => Int32 -11 + end + in + { _exception : "Error"; code : result_code } + +let zero = Uint128 0 +let zeroByStr20 = 0x0000000000000000000000000000000000000000 +let false = False +let true = True + + +type Unit = +| Unit + +let get_val = + fun (some_val: Option Uint128) => + match some_val with + | Some val => val + | None => zero + end + +let uint128_to_uint256: Uint128 -> Uint256 = + fun (x: Uint128) => + let ox256 = builtin to_uint256 x in + match ox256 with + | None => + + let zero = Uint256 0 in + builtin div zero zero + | Some x256 => x256 + end + + +let get_reserve_ratio: Uint128 -> Uint128 -> Uint128 = + fun(connector_balance: Uint128) => fun(market_cap: Uint128) => + + let max = Uint256 340282366920938463463374607431768211456 in + + let fixed = Uint256 340282366920938463463374607431768211456000000 in + let connector_balance_256 = uint128_to_uint256 connector_balance in + let market_cap_256 = uint128_to_uint256 market_cap in + let denom = builtin mul market_cap_256 max in + let num = builtin mul connector_balance_256 fixed in + let res_256 = builtin div num denom in + let ores_128 = builtin to_uint128 res_256 in + match ores_128 with + | None => + + let f2 = Uint128 42 in builtin div f2 zero + | Some res_128 => res_128 + end + + +type ConnectorToken = +| ZIL +| ZRC2 of ByStr20 with contract field balances: Map ByStr20 Uint128 end + +let spread_denominator = Uint128 10000 + +type Uint128Pair = +| Uint128Pair of Uint128 Uint128 +let uint128_to_uint256 : Uint128 -> Uint256 = + fun (x : Uint128) => + let ox256 = builtin to_uint256 x in + match ox256 with + | None => + + let zero = Uint256 0 in + builtin div zero zero + | Some x256 => x256 + end +let muldiv: Uint128 -> Uint128 -> Uint128 -> Uint128 = + fun (x : Uint128) => + fun (y : Uint128) => + fun (z : Uint128) => + let x256 = uint128_to_uint256 x in + let y256 = uint128_to_uint256 y in + let z256 = uint128_to_uint256 z in + let x_mul_y256 = builtin mul x256 y256 in + let res256 = builtin div x_mul_y256 z256 in + let ores128 = builtin to_uint128 res256 in + match ores128 with + | None => + + let max_uint128 = Uint128 340282366920938463463374607431768211455 in + let fourtytwo128 = Uint128 42 in + builtin mul max_uint128 fourtytwo128 + | Some res128 => + res128 + end +let take_percentage_commission: Uint128 -> Uint128 -> Uint128Pair = + fun (amount: Uint128) => fun (spread_numerator: Uint128) => + let commission = muldiv amount spread_numerator spread_denominator in + let amount_sub_commission = builtin sub amount commission in + let res = Uint128Pair amount_sub_commission commission in + res + + + + +contract Token +( + contract_owner: ByStr20, + name: String, + symbol: String, + decimals: Uint32, + init_supply: Uint128, + operator_contract: ByStr20 with contract field bancor_formula_contract: ByStr20, field spread: Uint128, field beneficiary: ByStr20 end +) + + + +field total_supply: Uint128 = init_supply +field current_supply: Uint128 = zero + +field balances: Map ByStr20 Uint128 + = Emp ByStr20 Uint128 + +field allowances: Map ByStr20 (Map ByStr20 Uint128) + = Emp ByStr20 (Map ByStr20 Uint128) + +field connector_token_type: ConnectorToken = ZIL + +field is_init: Bool = false + + +field tmp_reserve_ratio: Uint128 = zero + + +field tmp_connector_balance: Uint128 = zero + + +field smart_token_market_cap: Uint128 = zero + + +field tmp_from_balance: Uint128 = zero + + + +field tmp_bancor_formula_target: ByStr20 = zeroByStr20 + + +field tmp_is_smart_token_sell: Bool = false + + +field tmp_amount_and_commission: Uint128Pair = Uint128Pair zero zero + + + + + +procedure ThrowError(err : Error) + e = make_error err; + throw e +end + +procedure IncrementCurrentSupply(amt: Uint128) + cur <- current_supply; + total <- total_supply; + cur_add_amt = builtin add cur amt; + supply_overflow = uint128_lt total cur_add_amt; + match supply_overflow with + | True => e = CodeSupplyOverflow; ThrowError e + | False => current_supply := cur_add_amt + end +end + +procedure DecrementCurrentSupply(amt: Uint128) + cur <- current_supply; + total <- total_supply; + cur_sub_amt = builtin sub cur amt; + + current_supply := cur_sub_amt +end + + +procedure AssertIsInitialized() + init <- is_init; + match init with + | True => + | False => e = CodeNotInitialized; ThrowError e + end +end + +procedure AssertIsNotInitialized() + init <- is_init; + match init with + | False => + | True => e = CodeAlreadyInitialized; ThrowError e + end +end + +procedure AssertIsLE(i1: Uint128, i2: Uint128) + is_le = uint128_le i1 i2; + match is_le with + | False => e = CodeInputNotInBounds; ThrowError e + | True => + end +end + +procedure AssertEQ(i1: Uint128, i2: Uint128) + is_le = builtin eq i1 i2; + match is_le with + | False => e = CodeInputNotInBounds; ThrowError e + | True => + end +end + +procedure AssertNotZero(value: Uint128) + is_zero = builtin eq zero value; + match is_zero with + | False => + | True => e = CodeInputIsZero; ThrowError e + end +end + +procedure AssertSenderIsAddress(address: ByStr20) + is_authorized = builtin eq address _sender; + match is_authorized with + | True => + | False => e = CodeUnauthorized; ThrowError e + end +end + + +procedure IsNotSender(address: ByStr20) + is_sender = builtin eq _sender address; + match is_sender with + | True => + err = CodeIsSender; + ThrowError err + | False => + end +end + +procedure GetConnectorBalance() + connector <- connector_token_type; + match connector with + | ZIL => + connector_balance <- _balance; + tmp_connector_balance := connector_balance + | ZRC2 token_address => + o_connector_balance <-& token_address.balances[_this_address]; + match o_connector_balance with + | Some connector_balance => + tmp_connector_balance := connector_balance + | None => e = CodeConnectorError; ThrowError e + end + end +end + + +procedure CalculateReserveRatio() + market_cap <- smart_token_market_cap; + GetConnectorBalance; connector_balance <- tmp_connector_balance; + tmp = get_reserve_ratio connector_balance market_cap; + tmp_reserve_ratio := tmp +end + +procedure GetFromBalance(from: ByStr20) + o_from_bal <- balances[from]; + bal = get_val o_from_bal; + tmp_from_balance := bal +end + + + +procedure AssertCanDoTransfer(from: ByStr20, from_balance: Uint128, amount: Uint128) + can_do = uint128_le amount from_balance; + match can_do with + | True => + | False => + + err = CodeInsufficientFunds; + ThrowError err + end +end + +procedure SubtractAmountFromFromBalance(from: ByStr20, from_balance: Uint128, amount: Uint128) + new_from_bal = builtin sub from_balance amount; + balances[from] := new_from_bal +end + +procedure AddAmountToToBalance(to: ByStr20, amount: Uint128) + get_to_bal <- balances[to]; + new_to_bal = match get_to_bal with + | Some bal => builtin add bal amount + | None => amount + end; + balances[to] := new_to_bal +end + +procedure MoveBalance(from: ByStr20, from_balance: Uint128, to: ByStr20, amount: Uint128) + + SubtractAmountFromFromBalance from from_balance amount; + + AddAmountToToBalance to amount +end + + + +procedure CalculatePurchaseReturn(in_deposit_amount: Uint128) + bancor <-& operator_contract.bancor_formula_contract; + in_supply <- total_supply; + + CalculateReserveRatio; in_connector_weight <- tmp_reserve_ratio; in_connector_balance <- tmp_connector_balance; + msg = let m = { + _tag: "CalculatePurchaseReturn"; + _amount: zero; + _recipient: bancor; + in_supply: in_supply; + in_connector_balance: in_connector_balance; + in_connector_weight: in_connector_weight; + in_deposit_amount: in_deposit_amount + } in one_msg m; + send msg +end +procedure CalculateSaleReturn(in_sell_amount: Uint128) + bancor <-& operator_contract.bancor_formula_contract; + in_supply <- total_supply; + + CalculateReserveRatio; in_connector_weight <- tmp_reserve_ratio; in_connector_balance <- tmp_connector_balance; + msg = let m = { + _tag: "CalculateSaleReturn"; + _amount: zero; + _recipient: bancor; + in_supply: in_supply; + in_connector_balance: in_connector_balance; + in_connector_weight: in_connector_weight; + in_sell_amount: in_sell_amount + } in one_msg m; + send msg +end + +procedure SendConnectedToken(to: ByStr20, amount: Uint128) + connector <- connector_token_type; + match connector with + | ZRC2 token_address => + msg = let m = { + _tag: "Transfer"; + _recipient: token_address; + _amount: zero; + to: to; + amount: amount + } in one_msg m; + send msg + | ZIL => + msg = let m = { + _tag: "AddFunds"; + _recipient: to; + _amount: amount + } in one_msg m; + send msg + end +end + +procedure TakeCommission(amount: Uint128) + spread <-& operator_contract.spread; + tmp = take_percentage_commission amount spread; + tmp_amount_and_commission := tmp +end + +procedure DoBuySmartToken(sender: ByStr20, deposit_amount: Uint128) + tmp_bancor_formula_target := sender; + CalculatePurchaseReturn deposit_amount +end + +procedure BuySmartToken(sender: ByStr20, deposit_amount: Uint128) + TakeCommission deposit_amount; amount_and_commission <- tmp_amount_and_commission; + match amount_and_commission with + | Uint128Pair new_amt commission => + is_zero = builtin eq commission zero; + match is_zero with + | True => DoBuySmartToken sender deposit_amount + | False => + beneficiary <-& operator_contract.beneficiary; + SendConnectedToken beneficiary commission; + DoBuySmartToken sender new_amt + end + end +end + + + + + +transition InitZIL(price: Uint128, connector_balance: Uint128) + AssertSenderIsAddress contract_owner; + AssertIsNotInitialized; + AssertNotZero connector_balance; + + + supply <- total_supply; + market_cap = builtin mul price supply; + smart_token_market_cap := market_cap; + AssertIsLE connector_balance market_cap; + accept; + tmp = ZIL; + connector_token_type := tmp; + bal <- _balance; + + AssertEQ bal connector_balance; + is_init := true +end + +transition InitZRC2(price: Uint128, connector_balance: Uint128, token_address: ByStr20 with contract field balances: Map ByStr20 Uint128 end) + AssertSenderIsAddress contract_owner; + AssertIsNotInitialized; + AssertNotZero connector_balance; + + + supply <- total_supply; + market_cap = builtin mul price supply; + smart_token_market_cap := market_cap; + AssertIsLE connector_balance market_cap; + tmp = ZRC2 token_address; + connector_token_type := tmp; + + msg = let m = { + _tag: "TransferFrom"; + _amount: zero; + _recipient: token_address; + from: _sender; + to: _this_address; + amount: connector_balance + } in one_msg m; + send msg + +end + + + + +transition IncreaseAllowance(spender: ByStr20, amount: Uint128) + AssertIsInitialized; + IsNotSender spender; + some_current_allowance <- allowances[_sender][spender]; + current_allowance = get_val some_current_allowance; + new_allowance = builtin add current_allowance amount; + allowances[_sender][spender] := new_allowance; + e = {_eventname : "IncreasedAllowance"; token_owner : _sender; spender: spender; new_allowance : new_allowance}; + event e +end + + + + +transition DecreaseAllowance(spender: ByStr20, amount: Uint128) + AssertIsInitialized; + IsNotSender spender; + some_current_allowance <- allowances[_sender][spender]; + current_allowance = get_val some_current_allowance; + new_allowance = + let amount_le_allowance = uint128_le amount current_allowance in + match amount_le_allowance with + | True => builtin sub current_allowance amount + | False => zero + end; + allowances[_sender][spender] := new_allowance; + e = {_eventname : "DecreasedAllowance"; token_owner : _sender; spender: spender; new_allowance : new_allowance}; + event e +end + +procedure DoTransferFrom(from: ByStr20, to: ByStr20, amount: Uint128) + GetFromBalance from; from_balance <- tmp_from_balance; + AssertCanDoTransfer from from_balance amount; + is_smart_token_sell = builtin eq to _this_address; + tmp_is_smart_token_sell := is_smart_token_sell; + match is_smart_token_sell with + | True => + + SubtractAmountFromFromBalance from from_balance amount; + DecrementCurrentSupply amount; + + tmp_bancor_formula_target := from; + CalculateSaleReturn amount + | False => + MoveBalance from from_balance to amount + end +end + + + + + + + +transition Transfer(to: ByStr20, amount: Uint128) + AssertIsInitialized; + DoTransferFrom _sender to amount; is_smart_token_sell <- tmp_is_smart_token_sell; + + e = {_eventname : "TransferSuccess"; sender : _sender; recipient : to; amount : amount}; + event e; + match is_smart_token_sell with + | True => + | False => + + msg_to_recipient = {_tag : "RecipientAcceptTransfer"; _recipient : to; _amount : zero; + sender : _sender; recipient : to; amount : amount}; + msg_to_sender = {_tag : "TransferSuccessCallBack"; _recipient : _sender; _amount : zero; + sender : _sender; recipient : to; amount : amount}; + msgs = two_msgs msg_to_recipient msg_to_sender; + send msgs + end +end + + + + + + +transition TransferFrom(from: ByStr20, to: ByStr20, amount: Uint128) + AssertIsInitialized; + o_spender_allowed <- allowances[from][_sender]; + allowed = get_val o_spender_allowed; + can_do = uint128_le amount allowed; + match can_do with + | True => + DoTransferFrom from to amount; is_smart_token_sell <- tmp_is_smart_token_sell; + e = {_eventname : "TransferFromSuccess"; initiator : _sender; sender : from; recipient : to; amount : amount}; + event e; + new_allowed = builtin sub allowed amount; + allowances[from][_sender] := new_allowed; + match is_smart_token_sell with + | True => + | False => + + msg_to_recipient = {_tag: "RecipientAcceptTransferFrom"; _recipient : to; _amount: zero; + initiator: _sender; sender : from; recipient: to; amount: amount}; + msg_to_sender = {_tag: "TransferFromSuccessCallBack"; _recipient: _sender; _amount: zero; + initiator: _sender; sender: from; recipient: to; amount: amount}; + msgs = two_msgs msg_to_recipient msg_to_sender; + send msgs + end + | False => + err = CodeInsufficientAllowance; + ThrowError err + end +end + + +transition RecipientAcceptTransfer(sender: ByStr20, recipient: ByStr20, amount: Uint128) + AssertIsInitialized; + connector <- connector_token_type; + match connector with + | ZIL => e = CodeNotImplemented; ThrowError e + | ZRC2 token_address => + AssertSenderIsAddress token_address; + BuySmartToken sender amount + end +end +transition RecipientAcceptTransferFrom(initiator: ByStr20, sender: ByStr20, recipient: ByStr20, amount: Uint128) + init <- is_init; + match init with + | False => + is_init := true + | True => + + connector <- connector_token_type; + match connector with + | ZIL => e = CodeNotImplemented; ThrowError e + | ZRC2 token_address => + AssertSenderIsAddress token_address; + BuySmartToken sender amount + end + end +end + +transition TransferSuccessCallBack(sender: ByStr20, recipient: ByStr20, amount: Uint128) + AssertIsInitialized +end + +transition TransferFromSuccessCallBack(initiator: ByStr20, sender: ByStr20, recipient: ByStr20, amount: Uint128) + AssertIsInitialized +end + +transition AddFunds() + AssertIsInitialized; + connector <- connector_token_type; + match connector with + | ZRC2 token_address => e = CodeNotImplemented; ThrowError e + | ZIL => + prev_balance <- _balance; + accept; + cur_balance <- _balance; + deposit_amount = builtin sub cur_balance prev_balance; + BuySmartToken _sender deposit_amount + end +end + + + + +transition CalculatePurchaseReturnCallback(result: Uint128) + target <- tmp_bancor_formula_target; + bancor <-& operator_contract.bancor_formula_contract; + AssertSenderIsAddress bancor; + AddAmountToToBalance target result; + IncrementCurrentSupply result +end + +transition CalculateSaleReturnCallback(result: Uint128) + target <- tmp_bancor_formula_target; + bancor <-& operator_contract.bancor_formula_contract; + AssertSenderIsAddress bancor; + SendConnectedToken target result +end`; +export const deploy = ( + __contract_owner: T.ByStr20, + __name: T.ScillaString, + __symbol: T.ScillaString, + __decimals: T.Uint32, + __init_supply: T.Uint128, + __operator_contract: T.ByStr20 +) => { + const initData = [ + { + type: `Uint32`, + vname: `_scilla_version`, + value: "0", + }, + { + type: `ByStr20`, + vname: `contract_owner`, + value: __contract_owner.toSend(), + }, + { + type: `String`, + vname: `name`, + value: __name.toSend(), + }, + { + type: `String`, + vname: `symbol`, + value: __symbol.toSend(), + }, + { + type: `Uint32`, + vname: `decimals`, + value: __decimals.toSend(), + }, + { + type: `Uint128`, + vname: `init_supply`, + value: __init_supply.toSend(), + }, + { + type: `ByStr20`, + vname: `operator_contract`, + value: __operator_contract.toSend(), + }, + ]; + return { + initToJSON: () => initData, + send: async function ( + gasLimit: Long + ): Promise<[Transaction, Contract, T.ByStr20]> { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + + const contract = newContract(zil, code, initData); + const [tx, con] = await contract.deploy( + { + version: getVersion(), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "Deploy"); + if (!con.address) { + if (con.error) { + throw new Error(JSON.stringify(con.error, null, 2)); + } + throw new Error("Contract failed to deploy"); + } + return [tx, con, new T.ByStr20(con.address)]; + }, + }; +}; + +/** + * this string is the signature of the hash of the source code + * that was used to generate this sdk + */ +export const contractSignature = + "hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + +/** + * will try to send a transaction to the contract + * @warning WILL NOT THROW ERRORS IF CONTRACT SIGNATURES ARE INVALID + */ +export async function dangerousFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, new T.ByStr20(t.contractAddress).toSend()); + + const tx = await contract.call( + t.contractTransitionName, + t.data, + { + version: getVersion(), + amount: new BN(t.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, t.contractTransitionName); + return tx; +} +/** + * Will throw error if contract signatures are incompatible! + */ +export async function safeFromJSONTransaction( + zil: Zilliqa, + t: TransactionData, + gasLimit: Long +) { + if (t.contractSignature != contractSignature) { + throw new Error("Incompatible contract signatures!"); + } + await dangerousFromJSONTransaction(zil, t, gasLimit); +} + +/** + * interface for scilla contract with source code hash: + * 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + * generated on: + * 2021-08-22T17:35:51.500Z + */ +export const hash_0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 = + (a: T.ByStr20) => ({ + state: () => ({ + get: async function ( + field: + | "total_supply" + | "current_supply" + | "balances" + | "allowances" + | "connector_token_type" + | "is_init" + | "tmp_reserve_ratio" + | "tmp_connector_balance" + | "smart_token_market_cap" + | "tmp_from_balance" + | "tmp_bancor_formula_target" + | "tmp_is_smart_token_sell" + | "tmp_amount_and_commission" + ) { + const zil = getZil(); + return ( + await zil.blockchain.getSmartContractSubState(a.toSend(), field) + ).result; + }, + log: async function ( + field: + | "total_supply" + | "current_supply" + | "balances" + | "allowances" + | "connector_token_type" + | "is_init" + | "tmp_reserve_ratio" + | "tmp_connector_balance" + | "smart_token_market_cap" + | "tmp_from_balance" + | "tmp_bancor_formula_target" + | "tmp_is_smart_token_sell" + | "tmp_amount_and_commission" + | "_balance" + ) { + const zil = getZil(); + if (field == "_balance") { + console.log((await zil.blockchain.getBalance(a.toSend())).result); + return; + } + console.log( + (await zil.blockchain.getSmartContractSubState(a.toSend(), field)) + .result + ); + }, + }), + run: (gasLimit: Long) => ({ + InitZIL: ( + amount: T.Uint128, + __price: T.Uint128, + __connector_balance: T.Uint128 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `InitZIL`, + data: [ + { + type: `Uint128`, + vname: `price`, + value: __price.toSend(), + }, + { + type: `Uint128`, + vname: `connector_balance`, + value: __connector_balance.toSend(), + }, + ], + amount: amount.value.toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "InitZIL"); + return tx; + }, + }; + }, + + InitZRC2: ( + __price: T.Uint128, + __connector_balance: T.Uint128, + __token_address: T.ByStr20 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `InitZRC2`, + data: [ + { + type: `Uint128`, + vname: `price`, + value: __price.toSend(), + }, + { + type: `Uint128`, + vname: `connector_balance`, + value: __connector_balance.toSend(), + }, + { + type: `ByStr20`, + vname: `token_address`, + value: __token_address.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "InitZRC2"); + return tx; + }, + }; + }, + + IncreaseAllowance: (__spender: T.ByStr20, __amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `IncreaseAllowance`, + data: [ + { + type: `ByStr20`, + vname: `spender`, + value: __spender.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "IncreaseAllowance"); + return tx; + }, + }; + }, + + DecreaseAllowance: (__spender: T.ByStr20, __amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `DecreaseAllowance`, + data: [ + { + type: `ByStr20`, + vname: `spender`, + value: __spender.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "DecreaseAllowance"); + return tx; + }, + }; + }, + + Transfer: (__to: T.ByStr20, __amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `Transfer`, + data: [ + { + type: `ByStr20`, + vname: `to`, + value: __to.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "Transfer"); + return tx; + }, + }; + }, + + TransferFrom: ( + __from: T.ByStr20, + __to: T.ByStr20, + __amount: T.Uint128 + ) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `TransferFrom`, + data: [ + { + type: `ByStr20`, + vname: `from`, + value: __from.toSend(), + }, + { + type: `ByStr20`, + vname: `to`, + value: __to.toSend(), + }, + { + type: `Uint128`, + vname: `amount`, + value: __amount.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "TransferFrom"); + return tx; + }, + }; + }, + + AddFunds: (amount: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `AddFunds`, + data: [], + amount: amount.value.toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "AddFunds"); + return tx; + }, + }; + }, + + CalculatePurchaseReturnCallback: (__result: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `CalculatePurchaseReturnCallback`, + data: [ + { + type: `Uint128`, + vname: `result`, + value: __result.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "CalculatePurchaseReturnCallback"); + return tx; + }, + }; + }, + + CalculateSaleReturnCallback: (__result: T.Uint128) => { + const transactionData = { + contractSignature, + contractAddress: a.toSend(), + contractTransitionName: `CalculateSaleReturnCallback`, + data: [ + { + type: `Uint128`, + vname: `result`, + value: __result.toSend(), + }, + ], + amount: new BN(0).toString(), + }; + return { + /** + * get data needed to perform this transaction + * */ + toJSON: () => transactionData, + /** + * send the transaction to the blockchain + * */ + send: async () => { + const zil = getZil(); + const gasPrice = await getMinGasPrice(); + const contract = getContract(zil, a.toSend()); + + const tx = await contract.call( + transactionData.contractTransitionName, + transactionData.data, + { + version: getVersion(), + amount: new BN(transactionData.amount), + gasPrice, + gasLimit, + }, + 33, + 1000 + ); + log.txLink(tx, "CalculateSaleReturnCallback"); + return tx; + }, + }; + }, + }), + }); diff --git a/reference/continuous-token-bonding-curve-contracts/tsconfig.json b/reference/continuous-token-bonding-curve-contracts/tsconfig.json new file mode 100644 index 000000000..937896f81 --- /dev/null +++ b/reference/continuous-token-bonding-curve-contracts/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "strict": true /* Enable all strict type-checking options. */ /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true, + "outDir": "dist" + }, + "include": ["experiment", "src", "__tests__"] +} From 222ccf088b4b5d3fd8936f99b4dbf62ea219dce2 Mon Sep 17 00:00:00 2001 From: MszBednarski Date: Wed, 25 Aug 2021 11:49:14 +0100 Subject: [PATCH 2/4] add demo script to package json and fix missing randombytes dependency --- .../package-lock.json | 20 +++++++++++++++++++ .../package.json | 5 ++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/reference/continuous-token-bonding-curve-contracts/package-lock.json b/reference/continuous-token-bonding-curve-contracts/package-lock.json index c320c1a63..8f434a32c 100644 --- a/reference/continuous-token-bonding-curve-contracts/package-lock.json +++ b/reference/continuous-token-bonding-curve-contracts/package-lock.json @@ -11,6 +11,7 @@ "dotenv": "^10.0.0", "jest": "^27.0.6", "nodemon": "^2.0.9", + "randombytes": "^2.1.0", "ts-jest": "^27.0.4", "websocket": "^1.0.34" }, @@ -23,6 +24,7 @@ "@types/node": "^16.4.0", "@types/node-fetch": "^2.5.12", "@types/prettier": "^2.3.2", + "@types/randombytes": "^2.0.0", "@types/websocket": "^1.0.4", "node-fetch": "^2.6.1", "prettier": "2.3.2", @@ -1402,6 +1404,15 @@ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" }, + "node_modules/@types/randombytes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/randombytes/-/randombytes-2.0.0.tgz", + "integrity": "sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -7673,6 +7684,15 @@ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" }, + "@types/randombytes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/randombytes/-/randombytes-2.0.0.tgz", + "integrity": "sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", diff --git a/reference/continuous-token-bonding-curve-contracts/package.json b/reference/continuous-token-bonding-curve-contracts/package.json index 6ed03996f..a5ed265fd 100644 --- a/reference/continuous-token-bonding-curve-contracts/package.json +++ b/reference/continuous-token-bonding-curve-contracts/package.json @@ -4,7 +4,8 @@ "test": "npm run test:bancor && npm run test:operator &&npm run test:token", "test:token": "ts-node ./src/Token/__tests__/run.ts", "test:bancor": "ts-node ./src/BancorFormula/__tests__/run.ts", - "test:operator": "ts-node ./src/Operator/__tests__/run.ts" + "test:operator": "ts-node ./src/Operator/__tests__/run.ts", + "demo": "git clone https://github.com/Zilliqa/zilliqa-isolated-server.git && cd zilliqa-isolated-server && docker build --rm -f \"Dockerfile\" -t isolatedserver:1 \".\" && docker run -d -p 5555:5555 isolatedserver:1 && cd .. && npm i && npm run test" }, "dependencies": { "@zilliqa-js/zilliqa": "^3.0.0", @@ -13,6 +14,7 @@ "dotenv": "^10.0.0", "jest": "^27.0.6", "nodemon": "^2.0.9", + "randombytes": "^2.1.0", "ts-jest": "^27.0.4", "websocket": "^1.0.34" }, @@ -25,6 +27,7 @@ "@types/node": "^16.4.0", "@types/node-fetch": "^2.5.12", "@types/prettier": "^2.3.2", + "@types/randombytes": "^2.0.0", "@types/websocket": "^1.0.4", "node-fetch": "^2.6.1", "prettier": "2.3.2", From 4aca5c7777381b14fed7f2e5af3fc741f70a523c Mon Sep 17 00:00:00 2001 From: MszBednarski Date: Wed, 25 Aug 2021 11:52:31 +0100 Subject: [PATCH 3/4] update readme with the npm run demo script --- .../continuous-token-bonding-curve-contracts/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reference/continuous-token-bonding-curve-contracts/README.md b/reference/continuous-token-bonding-curve-contracts/README.md index a7b118cc1..0b3d0c618 100644 --- a/reference/continuous-token-bonding-curve-contracts/README.md +++ b/reference/continuous-token-bonding-curve-contracts/README.md @@ -49,10 +49,14 @@ All tests are located in ./src/*./\_\_tests\_\_ directories! In this directory (we need to run local isolated server for integration testing): +Make sure that you have the Docker desktop daemon runnnig and run + ```bash -git clone https://github.com/Zilliqa/zilliqa-isolated-server.git && cd zilliqa-isolated-server && docker build --rm -f "Dockerfile" -t isolatedserver:1 "." && docker run -d -p 5555:5555 isolatedserver:1 && cd .. && npm i && npm run test +npm run demo ``` +If you want to work on this just go to package json and look how the demo script is implemented. It clones and runs the zilliqa isolated server which is needed for integration testing and then runs it on port 5555 and calls npm i && npm run test + # Other Tip: The Token contract supports both ZIL and ZRC2 out of the box however not to introduce unneeded gas costs I would recommed trimming the contract to support only ZIL or ZRC2 depending on the usecase! From a97cabc10dc785daf0bcd2414645bb311bc7cc6b Mon Sep 17 00:00:00 2001 From: MszBednarski Date: Wed, 25 Aug 2021 12:10:26 +0100 Subject: [PATCH 4/4] add stop container command and remove isolated server dir --- reference/continuous-token-bonding-curve-contracts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/continuous-token-bonding-curve-contracts/package.json b/reference/continuous-token-bonding-curve-contracts/package.json index a5ed265fd..03be11f83 100644 --- a/reference/continuous-token-bonding-curve-contracts/package.json +++ b/reference/continuous-token-bonding-curve-contracts/package.json @@ -5,7 +5,7 @@ "test:token": "ts-node ./src/Token/__tests__/run.ts", "test:bancor": "ts-node ./src/BancorFormula/__tests__/run.ts", "test:operator": "ts-node ./src/Operator/__tests__/run.ts", - "demo": "git clone https://github.com/Zilliqa/zilliqa-isolated-server.git && cd zilliqa-isolated-server && docker build --rm -f \"Dockerfile\" -t isolatedserver:1 \".\" && docker run -d -p 5555:5555 isolatedserver:1 && cd .. && npm i && npm run test" + "demo": "git clone https://github.com/Zilliqa/zilliqa-isolated-server.git && cd zilliqa-isolated-server && docker build --rm -f \"Dockerfile\" -t isolatedserver:1 \".\" && docker run -d -p 5555:5555 isolatedserver:1 && cd .. && npm i && npm run test && docker stop $(docker ps -lq) && rm -rf ./zilliqa-isolated-server" }, "dependencies": { "@zilliqa-js/zilliqa": "^3.0.0",

iHE!+s|yHO=q7}Z=1by!I&H1 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

6@OYb^dZ5am_+q|w65+~40tMcc8+Egg( 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