From 8f72de89562b7a18d51f4cb5714085917ef2188c Mon Sep 17 00:00:00 2001 From: nope <83512286+nope-finance@users.noreply.github.com> Date: Thu, 31 Mar 2022 01:51:11 -0700 Subject: [PATCH] Publish crate2 (#80) * setting up to publish + add missing instruction * add test for withdraw and fix all the renames that had to happen * delete js since unused anyway * post rebase fix * minor cli fix --- .../workflows/pull-request-token-lending.yml | 24 - Cargo.lock | 78 +- ci/js-test-token-lending.sh | 12 - ci/js-test-token-swap.sh | 13 - ci/js-test-token.sh | 15 - deploy_token_lending.sh | 12 +- token-lending/README.md | 4 +- token-lending/cli/Cargo.toml | 14 +- token-lending/cli/README.md | 14 +- token-lending/cli/src/main.rs | 35 +- token-lending/js/.eslintrc.json | 32 - token-lending/js/.gitignore | 14 - token-lending/js/README.md | 69 - token-lending/js/cli/main.ts | 20 - token-lending/js/cli/token-lending-test.ts | 52 - token-lending/js/client/index.ts | 165 - token-lending/js/client/layout.ts | 111 - .../client/util/new-account-with-lamports.ts | 14 - token-lending/js/client/util/sleep.ts | 4 - token-lending/js/client/util/url.ts | 37 - token-lending/js/cluster-devnet.env | 2 - token-lending/js/cluster-mainnet-beta.env | 2 - token-lending/js/cluster-testnet.env | 2 - token-lending/js/package-lock.json | 2699 ----------------- token-lending/js/package.json | 72 - token-lending/js/rollup.config.ts | 41 - token-lending/js/tsconfig.json | 23 - token-lending/js/types/buffer-layout.d.ts | 1 - token-lending/program/Cargo.toml | 8 +- token-lending/program/src/instruction.rs | 44 + token-lending/program/src/processor.rs | 22 +- .../tests/borrow_obligation_liquidity.rs | 46 +- .../tests/deposit_obligation_collateral.rs | 10 +- .../tests/deposit_reserve_liquidity.rs | 6 +- ...rve_liquidity_and_obligation_collateral.rs | 6 +- token-lending/program/tests/flash_loan.rs | 16 +- token-lending/program/tests/helpers/mod.rs | 96 +- .../program/tests/init_lending_market.rs | 12 +- .../program/tests/init_obligation.rs | 12 +- token-lending/program/tests/init_reserve.rs | 64 +- .../program/tests/liquidate_obligation.rs | 12 +- ...uidate_obligation_and_redeem_collateral.rs | 10 +- .../program/tests/obligation_end_to_end.rs | 56 +- .../tests/redeem_reserve_collateral.rs | 10 +- .../program/tests/refresh_obligation.rs | 16 +- .../program/tests/refresh_reserve.rs | 10 +- .../tests/repay_obligation_liquidity.rs | 10 +- .../program/tests/set_lending_market_owner.rs | 20 +- .../tests/withdraw_obligation_collateral.rs | 26 +- ...ollateral_and_redeem_reserve_collateral.rs | 98 + 50 files changed, 490 insertions(+), 3701 deletions(-) delete mode 100755 ci/js-test-token-lending.sh delete mode 100755 ci/js-test-token-swap.sh delete mode 100755 ci/js-test-token.sh delete mode 100644 token-lending/js/.eslintrc.json delete mode 100644 token-lending/js/.gitignore delete mode 100644 token-lending/js/README.md delete mode 100644 token-lending/js/cli/main.ts delete mode 100644 token-lending/js/cli/token-lending-test.ts delete mode 100644 token-lending/js/client/index.ts delete mode 100644 token-lending/js/client/layout.ts delete mode 100644 token-lending/js/client/util/new-account-with-lamports.ts delete mode 100644 token-lending/js/client/util/sleep.ts delete mode 100644 token-lending/js/client/util/url.ts delete mode 100644 token-lending/js/cluster-devnet.env delete mode 100644 token-lending/js/cluster-mainnet-beta.env delete mode 100644 token-lending/js/cluster-testnet.env delete mode 100644 token-lending/js/package-lock.json delete mode 100644 token-lending/js/package.json delete mode 100644 token-lending/js/rollup.config.ts delete mode 100644 token-lending/js/tsconfig.json delete mode 100644 token-lending/js/types/buffer-layout.d.ts create mode 100644 token-lending/program/tests/withdraw_obligation_collateral_and_redeem_reserve_collateral.rs diff --git a/.github/workflows/pull-request-token-lending.yml b/.github/workflows/pull-request-token-lending.yml index 416bbfe6d65..38bae044d13 100644 --- a/.github/workflows/pull-request-token-lending.yml +++ b/.github/workflows/pull-request-token-lending.yml @@ -64,27 +64,3 @@ jobs: name: token-lending-programs path: "target/deploy/*.so" if-no-files-found: error - - js-test: - runs-on: ubuntu-latest - env: - NODE_VERSION: 12.x - needs: cargo-test-bpf - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v1 - with: - node-version: ${{ env.NODE_VERSION }} - - uses: actions/cache@v2 - with: - path: ~/.npm - key: node-${{ hashFiles('token-lending/js/package-lock.json') }} - restore-keys: | - node- - - name: Download programs - uses: actions/download-artifact@v2 - with: - name: token-lending-programs - path: target/deploy - - run: ./ci/js-test-token-lending.sh diff --git a/Cargo.lock b/Cargo.lock index 221046eafb9..735e1788d0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3636,6 +3636,45 @@ dependencies = [ "time", ] +[[package]] +name = "solend-program" +version = "0.1.0" +dependencies = [ + "arrayref", + "assert_matches", + "base64 0.13.0", + "bytemuck", + "log", + "num-derive", + "num-traits", + "proptest", + "serde", + "serde_yaml", + "solana-program", + "solana-program-test", + "solana-sdk", + "spl-token", + "switchboard-program", + "switchboard-v2", + "thiserror", + "uint", +] + +[[package]] +name = "solend-program-cli" +version = "0.1.0" +dependencies = [ + "clap", + "solana-clap-utils", + "solana-cli-config", + "solana-client", + "solana-logger", + "solana-program", + "solana-sdk", + "solend-program", + "spl-token", +] + [[package]] name = "spin" version = "0.5.2" @@ -3675,45 +3714,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-lending" -version = "0.1.0" -dependencies = [ - "arrayref", - "assert_matches", - "base64 0.13.0", - "bytemuck", - "log", - "num-derive", - "num-traits", - "proptest", - "serde", - "serde_yaml", - "solana-program", - "solana-program-test", - "solana-sdk", - "spl-token", - "switchboard-program", - "switchboard-v2", - "thiserror", - "uint", -] - -[[package]] -name = "spl-token-lending-cli" -version = "0.1.0" -dependencies = [ - "clap", - "solana-clap-utils", - "solana-cli-config", - "solana-client", - "solana-logger", - "solana-program", - "solana-sdk", - "spl-token", - "spl-token-lending", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" diff --git a/ci/js-test-token-lending.sh b/ci/js-test-token-lending.sh deleted file mode 100755 index d7d4fd88941..00000000000 --- a/ci/js-test-token-lending.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -e -cd "$(dirname "$0")/.." -source ./ci/solana-version.sh install - -set -x -cd token-lending/js -npm install -npm run lint -npm run build -npm run start-with-test-validator diff --git a/ci/js-test-token-swap.sh b/ci/js-test-token-swap.sh deleted file mode 100755 index 867b292f3fe..00000000000 --- a/ci/js-test-token-swap.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -ex -cd "$(dirname "$0")/.." -source ./ci/solana-version.sh install - -cd token-swap/js -npm install -npm run lint -npm run build -npm run start-with-test-validator -(cd ../../target/deploy && mv spl_token_swap_production.so spl_token_swap.so) -SWAP_PROGRAM_OWNER_FEE_ADDRESS="HfoTxFR1Tm6kGmWgYWD6J7YHVy1UwqSULUGVLXkJqaKN" npm run start-with-test-validator diff --git a/ci/js-test-token.sh b/ci/js-test-token.sh deleted file mode 100755 index cf0805365db..00000000000 --- a/ci/js-test-token.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -set -e -cd "$(dirname "$0")/.." -source ./ci/solana-version.sh install - -set -x -cd token/js -npm install -npm run lint -npm run flow -npm run defs -npm run test -npm run start-with-test-validator -PROGRAM_VERSION=2.0.4 npm run start-with-test-validator diff --git a/deploy_token_lending.sh b/deploy_token_lending.sh index 6a1bd818b40..387fd812fb2 100755 --- a/deploy_token_lending.sh +++ b/deploy_token_lending.sh @@ -21,10 +21,10 @@ SOURCE=`target/debug/spl-token --config $SOLANA_CONFIG wrap 10 2>&1 | head -n1 | solana program --config $SOLANA_CONFIG deploy \ --program-id $PROGRAM_ID \ - target/deploy/spl_token_lending.so; + target/deploy/solend_program.so; echo "Creating Lending Market"; -CREATE_MARKET_OUTPUT=`target/debug/spl-token-lending create-market \ +CREATE_MARKET_OUTPUT=`target/debug/solend-program create-market \ --fee-payer $OWNER \ --market-owner $MARKET_OWNER \ --verbose`; @@ -34,7 +34,7 @@ MARKET_ADDR=`echo $CREATE_MARKET_OUTPUT | head -n1 | awk '{print $4}'`; AUTHORITY_ADDR=`echo $CREATE_MARKET_OUTPUT | grep "Authority Address" | awk '{print $NF}'`; echo "Creating SOL reserve"; -SOL_RESERVE_OUTPUT=`target/debug/spl-token-lending add-reserve \ +SOL_RESERVE_OUTPUT=`target/debug/solend-program add-reserve \ --fee-payer $OWNER \ --market-owner $OWNER \ --source-owner $OWNER \ @@ -63,7 +63,7 @@ echo "USDC MINT: $USDC_TOKEN_MINT" USDC_TOKEN_ACCOUNT=`target/debug/spl-token --config $SOLANA_CONFIG create-account $USDC_TOKEN_MINT | awk '{print $3}'`; target/debug/spl-token --config $SOLANA_CONFIG mint $USDC_TOKEN_MINT 30000000; -USDC_RESERVE_OUTPUT=`target/debug/spl-token-lending add-reserve \ +USDC_RESERVE_OUTPUT=`target/debug/solend-program add-reserve \ --fee-payer $OWNER \ --market-owner $OWNER \ --source-owner $OWNER \ @@ -92,7 +92,7 @@ echo "ETH MINT: $ETH_TOKEN_MINT" ETH_TOKEN_ACCOUNT=`target/debug/spl-token --config $SOLANA_CONFIG create-account $ETH_TOKEN_MINT | awk '{print $3}'`; target/debug/spl-token --config $SOLANA_CONFIG mint $ETH_TOKEN_MINT 8000000; -ETH_RESERVE_OUTPUT=`target/debug/spl-token-lending add-reserve \ +ETH_RESERVE_OUTPUT=`target/debug/solend-program add-reserve \ --fee-payer $OWNER \ --market-owner $OWNER \ --source-owner $OWNER \ @@ -121,7 +121,7 @@ echo "BTC MINT: $BTC_TOKEN_MINT" BTC_TOKEN_ACCOUNT=`target/debug/spl-token --config $SOLANA_CONFIG create-account $BTC_TOKEN_MINT | awk '{print $3}'`; target/debug/spl-token --config $SOLANA_CONFIG mint $BTC_TOKEN_MINT 8000000; -BTC_RESERVE_OUTPUT=`target/debug/spl-token-lending add-reserve \ +BTC_RESERVE_OUTPUT=`target/debug/solend-program add-reserve \ --fee-payer $OWNER \ --market-owner $OWNER \ --source-owner $OWNER \ diff --git a/token-lending/README.md b/token-lending/README.md index d0555addce4..b55b81950ec 100644 --- a/token-lending/README.md +++ b/token-lending/README.md @@ -30,7 +30,7 @@ This is optional! You can skip these steps and use the [Token Lending CLI](./cli 1. Install the Token and Token Lending CLIs: ```shell cargo install spl-token-cli - cargo install spl-token-lending-cli + cargo install solend-program-cli ``` 1. Clone the SPL repo: @@ -101,7 +101,7 @@ This is optional! You can skip these steps and use the [Token Lending CLI](./cli solana program deploy \ -k owner.json \ --program-id lending.json \ - target/deploy/spl_token_lending.so + target/deploy/solend_program.so # Program Id: 6TvznH3B2e3p2mbhufNBpgSrLx6UkgvxtVQvopEZ2kuH ``` diff --git a/token-lending/cli/Cargo.toml b/token-lending/cli/Cargo.toml index fcb59df9239..19456542dfb 100644 --- a/token-lending/cli/Cargo.toml +++ b/token-lending/cli/Cargo.toml @@ -1,11 +1,11 @@ [package] -authors = ["Solana Maintainers "] -description = "SPL Token Lending CLI" +authors = ["Solend Maintainers "] +description = "Solend Program CLI" edition = "2018" -homepage = "https://spl.solana.com/token-lending" +homepage = "https://solend.fi" license = "Apache-2.0" -name = "spl-token-lending-cli" -repository = "https://github.com/solana-labs/solana-program-library" +name = "solend-program-cli" +repository = "https://github.com/solendprotocol/solana-program-library" version = "0.1.0" [dependencies] @@ -16,9 +16,9 @@ solana-client = "=1.8.14" solana-logger = "=1.8.14" solana-sdk = "=1.8.14" solana-program = "=1.8.14" -spl-token-lending = { path="../program", features = [ "no-entrypoint" ] } +solend-program = { path="../program", features = [ "no-entrypoint" ] } spl-token = { version = "3.2.0", features=["no-entrypoint"] } [[bin]] -name = "spl-token-lending" +name = "solend-program" path = "src/main.rs" diff --git a/token-lending/cli/README.md b/token-lending/cli/README.md index 800b8b4bebe..033a9afda32 100644 --- a/token-lending/cli/README.md +++ b/token-lending/cli/README.md @@ -6,7 +6,7 @@ See https://spl.solana.com/token-lending for more details ## Install the CLI ```shell -cargo install spl-token-lending-cli +cargo install solend-program-cli ``` ## Deploy a lending program (optional) @@ -23,7 +23,7 @@ The lending market owner must sign to add reserves. ### Usage ```shell -spl-token-lending \ +solend-program \ --program PUBKEY \ --fee-payer SIGNER \ create-market \ @@ -33,11 +33,11 @@ spl-token-lending \ - `--fee-payer` will sign to pay transaction fees. - `--market-owner` is the lending market owner pubkey. -Run `spl-token-lending create-market --help` for more details and options. +Run `solend-program create-market --help` for more details and options. ### Example ```shell -spl-token-lending \ +solend-program \ --program 6TvznH3B2e3p2mbhufNBpgSrLx6UkgvxtVQvopEZ2kuH \ --fee-payer owner.json \ create-market \ @@ -54,7 +54,7 @@ A reserve is a liquidity pool that can be deposited into, borrowed from, and opt ### Usage ```shell -spl-token-lending \ +solend-program \ --program PUBKEY \ --fee-payer SIGNER \ add-reserve \ @@ -76,11 +76,11 @@ spl-token-lending \ - `--pyth-product` and `--pyth-price` are oracle accounts [provided by Pyth](https://pyth.network/developers/consumers/accounts). -Run `spl-token-lending add-reserve --help` for more details and options. +Run `solend-program add-reserve --help` for more details and options. ### Example ```shell -spl-token-lending \ +solend-program \ --program 6TvznH3B2e3p2mbhufNBpgSrLx6UkgvxtVQvopEZ2kuH \ --fee-payer owner.json \ add-reserve \ diff --git a/token-lending/cli/src/main.rs b/token-lending/cli/src/main.rs index 829aefe8f7b..4ff58f5ba9b 100644 --- a/token-lending/cli/src/main.rs +++ b/token-lending/cli/src/main.rs @@ -17,18 +17,18 @@ use { system_instruction, transaction::Transaction, }, + solend_program::{ + self, + instruction::{init_lending_market, init_reserve, update_reserve_config}, + math::WAD, + state::{LendingMarket, Reserve, ReserveConfig, ReserveFees}, + }, spl_token::{ amount_to_ui_amount, instruction::{approve, revoke}, state::{Account as Token, Mint}, ui_amount_to_amount, }, - spl_token_lending::{ - self, - instruction::{init_lending_market, init_reserve, update_reserve_config}, - math::WAD, - state::{LendingMarket, Reserve, ReserveConfig, ReserveFees}, - }, std::{borrow::Borrow, process::exit, str::FromStr}, system_instruction::create_account, }; @@ -90,7 +90,7 @@ const SWITCHBOARD_PROGRAM_ID_DEV: &str = "7azgmy1pFXHikv36q1zZASvFq5vFa39TT9NweV fn main() { solana_logger::setup_with_default("solana=info"); - let default_lending_program_id: &str = &spl_token_lending::id().to_string(); + let default_lending_program_id: &str = &solend_program::id().to_string(); let matches = App::new(crate_name!()) .about(crate_description!()) @@ -368,6 +368,16 @@ fn main() { .default_value("20") .help("Amount of fee going to host account: [0, 100]"), ) + .arg( + Arg::with_name("protocol_liquidation_fee") + .long("protocol-liquidation-fee") + .validator(is_parsable::) + .value_name("INTEGER_PERCENT") + .takes_value(true) + .required(false) + .default_value("30") + .help("Amount of liquidation bonus going to fee reciever: [0, 100]"), + ) .arg( Arg::with_name("deposit_limit") .long("deposit-limit") @@ -510,6 +520,15 @@ fn main() { .required(false) .help("Amount of fee going to host account: [0, 100]"), ) + .arg( + Arg::with_name("protocol_liquidation_fee") + .long("protocol-liquidation-fee") + .validator(is_parsable::) + .value_name("INTEGER_PERCENT") + .takes_value(true) + .required(false) + .help("Amount of liquidation bonus going to fee reciever: [0, 100]"), + ) .arg( Arg::with_name("deposit_limit") .long("deposit-limit") @@ -1180,7 +1199,7 @@ fn command_update_reserve( reserve.config.protocol_liquidation_fee = reserve_config.protocol_liquidation_fee.unwrap(); } - let mut new_pyth_product_pubkey = spl_token_lending::NULL_PUBKEY; + let mut new_pyth_product_pubkey = solend_program::NULL_PUBKEY; if pyth_price_pubkey.is_some() { println!( "Updating pyth oracle pubkey from {} to {}", diff --git a/token-lending/js/.eslintrc.json b/token-lending/js/.eslintrc.json deleted file mode 100644 index b714d6c4f76..00000000000 --- a/token-lending/js/.eslintrc.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "root": true, - "env": { - "node": true, - "browser": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "prettier", - "prettier/@typescript-eslint" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2020, - "parser": "babel-eslint", - "project": "./tsconfig.json", - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "no-console": 0, - "semi": 0, - "template-curly-spacing": ["error", "never"], - "@typescript-eslint/no-explicit-any": 0 - } -} diff --git a/token-lending/js/.gitignore b/token-lending/js/.gitignore deleted file mode 100644 index 123d1f4d0ce..00000000000 --- a/token-lending/js/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -node_modules -coverage -.nyc_output -.DS_Store -*.log -.vscode -.idea -dist -compiled -.awcache -.rpt2_cache -docs -lib -test-ledger diff --git a/token-lending/js/README.md b/token-lending/js/README.md deleted file mode 100644 index df4533dcdf5..00000000000 --- a/token-lending/js/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Token-lending JavaScript API - -The Token-lending JavaScript library comprises: - -* A library to interact with the on-chain program -* A test client that exercises the program -* Scripts to facilitate building the program - -## Getting Started - -First fetch the npm dependencies, including `@solana/web3.js`, by running: -```sh -$ npm install -``` - -### Select a Network - -The client connects to a local Solana cluster by default. - -To enable on-chain program logs, set the `RUST_LOG` environment variable: - -```bash -$ export RUST_LOG=solana_runtime::native_loader=trace,solana_runtime::system_instruction_processor=trace,solana_runtime::bank=debug,solana_bpf_loader=debug,solana_rbpf=debug -``` - -To start a local Solana cluster run: -```bash -$ npm run localnet:update -$ npm run localnet:up -``` - -Solana cluster logs are available with: -```bash -$ npm run localnet:logs -``` - -For more details on working with a local cluster, see the [full -instructions](https://github.com/solana-labs/solana-web3.js#local-network). - -### Build the on-chain program - -```bash -$ npm run build:program -``` - -### Run the test client - -```sh -$ npm run start -``` - -## Pointing to a public Solana cluster - -Solana maintains three public clusters: -- `devnet` - Development cluster -- `testnet` - Tour De Sol test cluster -- `mainnet-beta` - Main cluster - -Use npm scripts to configure which cluster. - -To point to `devnet`: -```bash -$ npm run cluster:devnet -``` - -To point back to the local cluster: -```bash -$ npm run cluster:localnet -``` diff --git a/token-lending/js/cli/main.ts b/token-lending/js/cli/main.ts deleted file mode 100644 index 3109c73af55..00000000000 --- a/token-lending/js/cli/main.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Exercises the token-lending program - */ - -import { createLendingMarket } from "./token-lending-test"; - -async function main() { - // These test cases are designed to run sequentially and in the following order - console.log("Run test: createLendingMarket"); - await createLendingMarket(); - console.log("Success\n"); -} - -main().then( - () => process.exit(), - (err) => { - console.error(err); - process.exit(-1); - } -); diff --git a/token-lending/js/cli/token-lending-test.ts b/token-lending/js/cli/token-lending-test.ts deleted file mode 100644 index 12614f20e25..00000000000 --- a/token-lending/js/cli/token-lending-test.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ - -import { Account, Connection } from "@solana/web3.js"; -import { Token, TOKEN_PROGRAM_ID } from "@solana/spl-token"; - -import { LENDING_PROGRAM_ID, LendingMarket } from "../client"; -import { newAccountWithLamports } from "../client/util/new-account-with-lamports"; -import { url } from "../client/util/url"; - -let connection: Connection | undefined; -async function getConnection(): Promise { - if (connection) return connection; - - connection = new Connection(url, "recent"); - const version = await connection.getVersion(); - - console.log("Connection to cluster established:", url, version); - return connection; -} - -export async function createLendingMarket(): Promise { - const connection = await getConnection(); - - const payer = await newAccountWithLamports( - connection, - 100000000000 /* wag */ - ); - - console.log("creating quote token mint"); - const quoteMintAuthority = new Account(); - const quoteTokenMint = await Token.createMint( - connection, - payer, - quoteMintAuthority.publicKey, - null, - 2, - TOKEN_PROGRAM_ID - ); - - console.log("creating lending market"); - const lendingMarketAccount = new Account(); - await LendingMarket.create({ - connection, - tokenProgramId: TOKEN_PROGRAM_ID, - lendingProgramId: LENDING_PROGRAM_ID, - quoteTokenMint: quoteTokenMint.publicKey, - lendingMarketAccount, - lendingMarketOwner: payer.publicKey, - payer, - }); -} diff --git a/token-lending/js/client/index.ts b/token-lending/js/client/index.ts deleted file mode 100644 index 02916fbcd6c..00000000000 --- a/token-lending/js/client/index.ts +++ /dev/null @@ -1,165 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ - -import { - Account, - Connection, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, - SYSVAR_RENT_PUBKEY, - sendAndConfirmTransaction, -} from "@solana/web3.js"; -import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; -import * as BufferLayout from "buffer-layout"; -import * as Layout from "./layout"; - -export const LENDING_PROGRAM_ID = new PublicKey( - "LendZqTs7gn5CTSJU1jWKhKuVpjJGom45nnwPb2AMTi" -); - -/** - * @private - */ -export const LendingMarketLayout: typeof BufferLayout.Structure = BufferLayout.struct( - [ - BufferLayout.u8("version"), - BufferLayout.u8("bumpSeed"), - Layout.publicKey("owner"), - Layout.publicKey("quoteTokenMint"), - Layout.publicKey("tokenProgramId"), - Layout.publicKey("oracleProgramId"), - Layout.publicKey("switchboardOracleProgramId"), - BufferLayout.blob(128, "padding"), - ] -); - -export type CreateLendingMarketParams = { - connection: Connection; - tokenProgramId?: PublicKey; - lendingProgramId: PublicKey; - lendingMarketAccount: Account; - lendingMarketOwner: PublicKey; - quoteTokenMint: PublicKey; - payer: Account; -}; - -export class LendingMarket { - account: Account; - connection: Connection; - owner: PublicKey; - quoteTokenMint: PublicKey; - tokenProgramId: PublicKey; - lendingProgramId: PublicKey; - payer: Account; - - constructor(params: CreateLendingMarketParams) { - this.account = params.lendingMarketAccount; - this.connection = params.connection; - this.owner = params.lendingMarketOwner; - this.quoteTokenMint = params.quoteTokenMint; - this.tokenProgramId = params.tokenProgramId || TOKEN_PROGRAM_ID; - this.lendingProgramId = params.lendingProgramId; - this.payer = params.payer; - } - - static async create( - params: CreateLendingMarketParams - ): Promise { - const lendingMarket = new LendingMarket(params); - - // Allocate memory for the account - const balanceNeeded = await LendingMarket.getMinBalanceRentForExemptTokenReserve( - lendingMarket.connection - ); - - const transaction = new Transaction() - .add( - SystemProgram.createAccount({ - fromPubkey: params.payer.publicKey, - newAccountPubkey: lendingMarket.account.publicKey, - lamports: balanceNeeded, - space: LendingMarketLayout.span, - programId: params.lendingProgramId, - }) - ) - .add(LendingMarket.createInitLendingMarketInstruction(lendingMarket)); - - await sendAndConfirmTransaction( - lendingMarket.connection, - transaction, - [lendingMarket.payer, lendingMarket.account], - { commitment: "singleGossip", preflightCommitment: "singleGossip" } - ); - - return lendingMarket; - } - - /** - * Get the minimum balance for the lending market account to be rent exempt - * - * @return Number of lamports required - */ - static async getMinBalanceRentForExemptTokenReserve( - connection: Connection - ): Promise { - return await connection.getMinimumBalanceForRentExemption( - LendingMarketLayout.span - ); - } - - static createInitLendingMarketInstruction( - lendingMarket: LendingMarket - ): TransactionInstruction { - const programId = lendingMarket.lendingProgramId; - const keys = [ - { - pubkey: lendingMarket.account.publicKey, - isSigner: false, - isWritable: true, - }, - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, - { - pubkey: lendingMarket.tokenProgramId, - isSigner: false, - isWritable: false, - }, - { - pubkey: new Account().publicKey, // TODO use the pyth oracle program id - isSigner: false, - isWritable: false, - }, - { - pubkey: new Account().publicKey, // TODO use the switchboard oracle program id - isSigner: false, - isWritable: false, - }, - ]; - - const commandDataLayout = BufferLayout.struct([ - BufferLayout.u8("instruction"), - Layout.publicKey("owner"), - Layout.publicKey("quoteCurrency"), - ]); - let data = Buffer.alloc(1024); - { - const encodeLength = commandDataLayout.encode( - { - instruction: 0, // InitLendingMarket instruction - owner: lendingMarket.owner.toBuffer(), - quoteCurrency: lendingMarket.quoteTokenMint.toBuffer(), - }, - data - ); - data = data.slice(0, encodeLength); - } - - return new TransactionInstruction({ - keys, - programId, - data, - }); - } -} diff --git a/token-lending/js/client/layout.ts b/token-lending/js/client/layout.ts deleted file mode 100644 index 4dfc971fa8f..00000000000 --- a/token-lending/js/client/layout.ts +++ /dev/null @@ -1,111 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/restrict-template-expressions */ - -import * as BufferLayout from "buffer-layout"; -import BN from "bn.js"; - -/** - * Layout for a public key - */ -export const publicKey = (property = "publicKey"): unknown => { - return BufferLayout.blob(32, property); -}; - -/** - * Layout for a 64bit unsigned value - */ -export const uint64 = (property = "uint64"): unknown => { - const layout = BufferLayout.blob(8, property); - - const _decode = layout.decode.bind(layout); - const _encode = layout.encode.bind(layout); - - layout.decode = (buffer: Buffer, offset: number) => { - const data = _decode(buffer, offset); - return new BN( - [...data] - .reverse() - .map((i) => `00${i.toString(16)}`.slice(-2)) - .join(""), - 16 - ); - }; - - layout.encode = (num: BN, buffer: Buffer, offset: number) => { - const a = num.toArray().reverse(); - let b = Buffer.from(a); - if (b.length !== 8) { - const zeroPad = Buffer.alloc(8); - b.copy(zeroPad); - b = zeroPad; - } - return _encode(b, buffer, offset); - }; - - return layout; -}; - -export const uint128 = (property = "uint128"): unknown => { - const layout = BufferLayout.blob(16, property); - - const _decode = layout.decode.bind(layout); - const _encode = layout.encode.bind(layout); - - layout.decode = (buffer: Buffer, offset: number) => { - const data = _decode(buffer, offset); - return new BN( - [...data] - .reverse() - .map((i) => `00${i.toString(16)}`.slice(-2)) - .join(""), - 16 - ); - }; - - layout.encode = (num: BN, buffer: Buffer, offset: number) => { - const a = num.toArray().reverse(); - let b = Buffer.from(a); - if (b.length !== 16) { - const zeroPad = Buffer.alloc(16); - b.copy(zeroPad); - b = zeroPad; - } - - return _encode(b, buffer, offset); - }; - - return layout; -}; - -/** - * Layout for a Rust String type - */ -export const rustString = (property = "string"): unknown => { - const rsl = BufferLayout.struct( - [ - BufferLayout.u32("length"), - BufferLayout.u32("lengthPadding"), - BufferLayout.blob(BufferLayout.offset(BufferLayout.u32(), -8), "chars"), - ], - property - ); - const _decode = rsl.decode.bind(rsl); - const _encode = rsl.encode.bind(rsl); - - rsl.decode = (buffer: Buffer, offset: number) => { - const data = _decode(buffer, offset); - return data.chars.toString("utf8"); - }; - - rsl.encode = (str: string, buffer: Buffer, offset: number) => { - const data = { - chars: Buffer.from(str, "utf8"), - }; - return _encode(data, buffer, offset); - }; - - return rsl; -}; diff --git a/token-lending/js/client/util/new-account-with-lamports.ts b/token-lending/js/client/util/new-account-with-lamports.ts deleted file mode 100644 index 328f935c3d6..00000000000 --- a/token-lending/js/client/util/new-account-with-lamports.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Account, Connection } from "@solana/web3.js"; - -export async function newAccountWithLamports( - connection: Connection, - lamports = 1000000 -): Promise { - const account = new Account(); - const signature = await connection.requestAirdrop( - account.publicKey, - lamports - ); - await connection.confirmTransaction(signature, "singleGossip"); - return account; -} diff --git a/token-lending/js/client/util/sleep.ts b/token-lending/js/client/util/sleep.ts deleted file mode 100644 index 8294593a679..00000000000 --- a/token-lending/js/client/util/sleep.ts +++ /dev/null @@ -1,4 +0,0 @@ -// zzz -export function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); -} diff --git a/token-lending/js/client/util/url.ts b/token-lending/js/client/util/url.ts deleted file mode 100644 index c74d983d689..00000000000 --- a/token-lending/js/client/util/url.ts +++ /dev/null @@ -1,37 +0,0 @@ -// To connect to a public cluster, set `export LIVE=1` in your -// environment. By default, `LIVE=1` will connect to the devnet cluster. - -import { clusterApiUrl, Cluster } from "@solana/web3.js"; -import dotenv from "dotenv"; - -function chooseCluster(): Cluster | undefined { - dotenv.config(); - if (!process.env.LIVE) return; - switch (process.env.CLUSTER) { - case "devnet": - case "testnet": - case "mainnet-beta": { - return process.env.CLUSTER; - } - } - if (process.env.CLUSTER) { - throw new Error( - `Unknown cluster "${process.env.CLUSTER}", check the .env file` - ); - } else { - throw new Error("CLUSTER is not specified, check the .env file"); - } -} - -export const cluster = chooseCluster(); - -export const url = - process.env.RPC_URL || - (process.env.LIVE ? clusterApiUrl(cluster, false) : "http://localhost:8899"); - -export const urlTls = - process.env.RPC_URL || - (process.env.LIVE ? clusterApiUrl(cluster, true) : "http://localhost:8899"); - -export const walletUrl = - process.env.WALLET_URL || "https://solana-example-webwallet.herokuapp.com/"; diff --git a/token-lending/js/cluster-devnet.env b/token-lending/js/cluster-devnet.env deleted file mode 100644 index eccad4158e7..00000000000 --- a/token-lending/js/cluster-devnet.env +++ /dev/null @@ -1,2 +0,0 @@ -LIVE=1 -CLUSTER=devnet diff --git a/token-lending/js/cluster-mainnet-beta.env b/token-lending/js/cluster-mainnet-beta.env deleted file mode 100644 index 17239e5100d..00000000000 --- a/token-lending/js/cluster-mainnet-beta.env +++ /dev/null @@ -1,2 +0,0 @@ -LIVE=1 -CLUSTER=mainnet-beta diff --git a/token-lending/js/cluster-testnet.env b/token-lending/js/cluster-testnet.env deleted file mode 100644 index 9bcfb25a2ab..00000000000 --- a/token-lending/js/cluster-testnet.env +++ /dev/null @@ -1,2 +0,0 @@ -LIVE=1 -CLUSTER=testnet diff --git a/token-lending/js/package-lock.json b/token-lending/js/package-lock.json deleted file mode 100644 index 0f40f65a730..00000000000 --- a/token-lending/js/package-lock.json +++ /dev/null @@ -1,2699 +0,0 @@ -{ - "name": "@solana/spl-token-lending", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "101": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/101/-/101-1.6.3.tgz", - "integrity": "sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw==", - "requires": { - "clone": "^1.0.2", - "deep-eql": "^0.1.3", - "keypather": "^1.10.2" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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=", - "dev": true - } - } - }, - "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@hapi/hoek": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", - "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", - "dev": true - }, - "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-commonjs": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.0.tgz", - "integrity": "sha512-adTpD6ATGbehdaQoZQ6ipDFhdjqsTgpOAhFiPwl+dzre4pPshsecptDPyEFb61JMJ1+mGljktaC4jI8ARMSNyw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sideway/address": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", - "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "@solana/spl-token": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.6.tgz", - "integrity": "sha512-fYj+a3w1bqWN6Ibf85XF3h2JkuxevI3Spvqi+mjsNqVUEo2AgxxTZmujNLn/jIzQDNdWkBfF/wYzH5ikcGHmfw==", - "requires": { - "@babel/runtime": "^7.10.5", - "@solana/web3.js": "^1.12.0", - "bn.js": "^5.1.0", - "buffer": "6.0.3", - "buffer-layout": "^1.2.0", - "dotenv": "10.0.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "@solana/web3.js": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.20.0.tgz", - "integrity": "sha512-s/hmbeC7h0QeMKDHl5HTJbY4NSrT3IK1oGerNwdmFfnbs9ygtBbXo1MXaeYVDcNazsthKgiYE+unNd+cpVH8HA==", - "requires": { - "@babel/runtime": "^7.12.5", - "bn.js": "^5.0.0", - "borsh": "^0.4.0", - "bs58": "^4.0.1", - "buffer": "6.0.1", - "buffer-layout": "^1.2.0", - "crypto-hash": "^1.2.2", - "jayson": "^3.4.4", - "js-sha3": "^0.8.0", - "node-fetch": "^2.6.1", - "rpc-websockets": "^7.4.2", - "secp256k1": "^4.0.2", - "superstruct": "^0.14.2", - "tweetnacl": "^1.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz", - "integrity": "sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.7.tgz", - "integrity": "sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", - "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", - "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", - "dev": true - }, - "@tsconfig/recommended": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/recommended/-/recommended-1.0.1.tgz", - "integrity": "sha512-2xN+iGTbPBEzGSnVp/Hd64vKJCJWxsi9gfs88x4PPMyEjHJoA3o5BY9r5OLPHIZU2pAQxkSAsJFqn6itClP8mQ==", - "dev": true - }, - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", - "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-6/UIuz99F0IvtDez4U3bRwAmN4VKnuw10Ibblf0iZhtNbmbonMSLqs/qqsXrGIAWvjy+vXqYwOljgtLhrETSMg==", - "dev": true, - "requires": { - "@types/eslint": "*" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/express-serve-static-core": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.22.tgz", - "integrity": "sha512-WdqmrUsRS4ootGha6tVwk/IVHM1iorU8tGehftQD2NWiPniw/sm7xdJOIlXLwqdInL9wBw/p7oO8vaYEF3NDmA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.170", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", - "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" - }, - "@types/mkdirp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", - "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/mz": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/mz/-/mz-2.7.3.tgz", - "integrity": "sha512-Zp1NUJ4Alh3gaun0a5rkF3DL7b2j1WB6rPPI5h+CJ98sQnxe9qwskClvupz/4bqChGR3L/BRhTjlaOwR+uiZJg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "15.12.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.5.tgz", - "integrity": "sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==" - }, - "@types/prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", - "dev": true - }, - "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/rollup-plugin-json": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/rollup-plugin-json/-/rollup-plugin-json-3.0.2.tgz", - "integrity": "sha512-eTRym5nG4HEKDR/KrTnCMYwF7V0hgVjEesvtJCK3V8ho/aT0ZFRFgsDtx38VarM30HCsN372+i4FKYwnhcwiVA==", - "dev": true, - "requires": { - "@types/node": "*", - "rollup": "^0.63.4" - }, - "dependencies": { - "rollup": { - "version": "0.63.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.63.5.tgz", - "integrity": "sha512-dFf8LpUNzIj3oE0vCvobX6rqOzHzLBoblyFp+3znPbjiSmSvOoK2kMKx+Fv9jYduG1rvcCfCveSgEaQHjWRF6g==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "@types/node": "*" - } - } - } - }, - "@types/ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-8mbDgtc8xpxDDem5Gwj76stBDJX35KQ3YBoayxlqUQcL5BZUthiqP/VQ4PQnLHqM4PmlbyO74t98eJpURO+gPA==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", - "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.28.0", - "@typescript-eslint/scope-manager": "4.28.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", - "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.1.tgz", - "integrity": "sha512-UjrMsgnhQIIK82hXGaD+MCN8IfORS1CbMdu7VlZbYa8LCZtbZjJA26De4IPQB7XYZbL8gJ99KWNj0l6WD0guJg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.28.1", - "@typescript-eslint/types": "4.28.1", - "@typescript-eslint/typescript-estree": "4.28.1", - "debug": "^4.3.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.1.tgz", - "integrity": "sha512-o95bvGKfss6705x7jFGDyS7trAORTy57lwJ+VsYwil/lOUxKQ9tA7Suuq+ciMhJc/1qPwB3XE2DKh9wubW8YYA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.1", - "@typescript-eslint/visitor-keys": "4.28.1" - } - }, - "@typescript-eslint/types": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.1.tgz", - "integrity": "sha512-4z+knEihcyX7blAGi7O3Fm3O6YRCP+r56NJFMNGsmtdw+NCdpG5SgNz427LS9nQkRVTswZLhz484hakQwB8RRg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.1.tgz", - "integrity": "sha512-GhKxmC4sHXxHGJv8e8egAZeTZ6HI4mLU6S7FUzvFOtsk7ZIDN1ksA9r9DyOgNqowA9yAtZXV0Uiap61bIO81FQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.1", - "@typescript-eslint/visitor-keys": "4.28.1", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.1.tgz", - "integrity": "sha512-K4HMrdFqr9PFquPu178SaSb92CaWe2yErXyPumc8cYWxFmhgJsNY9eSePmO05j0JhBvf2Cdhptd6E6Yv9HVHcg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.1", - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", - "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0" - } - }, - "@typescript-eslint/types": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", - "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", - "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", - "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "assert-args": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/assert-args/-/assert-args-1.2.1.tgz", - "integrity": "sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70=", - "requires": { - "101": "^1.2.0", - "compound-subject": "0.0.1", - "debug": "^2.2.0", - "get-prototype-of": "0.0.0", - "is-capitalized": "^1.0.0", - "is-class": "0.0.4" - }, - "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=" - } - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dev": true, - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "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" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, - "borsh": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", - "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", - "requires": { - "@types/bn.js": "^4.11.5", - "bn.js": "^5.0.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - }, - "dependencies": { - "@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": "*" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "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==", - "dev": true, - "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=" - }, - "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" - } - }, - "buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-layout": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.0.tgz", - "integrity": "sha512-iiyRoho/ERzBUv6kFvfsrLNgTlVwOkqQcSQN7WrO3Y+c5SeuEhCn6+y1KwhM0V3ndptF5mI/RI44zkw0qcR5Jg==" - }, - "bufferutil": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", - "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "optional": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", - "dev": true, - "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==", - "dev": 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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", - "dev": true - }, - "circular-json": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==" - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "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==", - "dev": true, - "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=", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compound-subject": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/compound-subject/-/compound-subject-0.0.1.tgz", - "integrity": "sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "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==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "crypto-hash": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", - "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==" - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "requires": { - "type-detect": "0.1.1" - } - }, - "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=", - "dev": true - }, - "delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "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" - }, - "dependencies": { - "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==" - } - } - }, - "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==", - "dev": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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" - } - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "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==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-prototype-of": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/get-prototype-of/-/get-prototype-of-0.0.0.tgz", - "integrity": "sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ=" - }, - "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==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "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=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "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==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "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==" - }, - "is-capitalized": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-capitalized/-/is-capitalized-1.0.0.tgz", - "integrity": "sha1-TIRktNkdPk7rRIid0s2PGwrEwTY=" - }, - "is-class": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.4.tgz", - "integrity": "sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY=" - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "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=", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" - }, - "jayson": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.4.tgz", - "integrity": "sha512-GH63DsRFFlodS8krFgAhxwYvQFmSwjsFxKnPrHQtp+BJj/tpeSj3hyBGGqmTkuq043U1Gn6u8VdsVRFZX1EEiQ==", - "requires": { - "@types/connect": "^3.4.33", - "@types/express-serve-static-core": "^4.17.9", - "@types/lodash": "^4.14.159", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "JSONStream": "^1.3.5", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "uuid": "^3.4.0", - "ws": "^7.4.5" - }, - "dependencies": { - "@types/node": { - "version": "12.20.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", - "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" - } - } - }, - "joi": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", - "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "keypather": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/keypather/-/keypather-1.10.2.tgz", - "integrity": "sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ=", - "requires": { - "101": "^1.0.0" - } - }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "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==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "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==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "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==" - }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.3.tgz", - "integrity": "sha512-QF3Sju8Kl2z0osI4unyOLyUudyhOMK6G0AeqJWgfiyigqLAlnNrfBcDWDx+f1cqn+JU2iIYVkDrgQ6/KtwEfrg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", - "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", - "dev": true, - "requires": { - "rollup-pluginutils": "^2.5.0" - } - }, - "rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", - "dev": true, - "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-sourcemaps": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.0" - } - }, - "rollup-plugin-typescript2": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", - "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.1.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.20.0", - "tslib": "2.1.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", - "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rpc-websockets": { - "version": "7.4.12", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.12.tgz", - "integrity": "sha512-WxZRM4443SiYbJhsLwVJc6P/VAQJIkeDS89CQAuHqyMt/GX8GEplWZezcLw6MMGemzA6Kp32kz7CbQppMTLQxA==", - "requires": { - "@babel/runtime": "^7.11.2", - "assert-args": "^1.2.1", - "bufferutil": "^4.0.1", - "circular-json": "^0.5.9", - "eventemitter3": "^4.0.7", - "utf-8-validate": "^5.0.2", - "uuid": "^8.3.0", - "ws": "^7.4.5" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "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==" - }, - "secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", - "dev": true, - "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==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "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==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "start-server-and-test": { - "version": "1.12.5", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.12.5.tgz", - "integrity": "sha512-8Wl0J1xwTDhvWoFeXLIP1VyT9GS5i0XG2440gbMQDNgyCBpb+t2XhahY3ysHIs2g5sDsiom6Iyvh3uQtNrAg5g==", - "dev": true, - "requires": { - "bluebird": "3.7.2", - "check-more-types": "2.24.0", - "debug": "4.3.1", - "execa": "5.1.1", - "lazy-ass": "1.6.0", - "ps-tree": "1.2.0", - "wait-on": "5.3.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "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==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "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==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-node": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", - "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", - "dev": 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": "1.14.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.0.tgz", - "integrity": "sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.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==", - "optional": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - } - }, - "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==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", - "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/token-lending/js/package.json b/token-lending/js/package.json deleted file mode 100644 index 79696a85909..00000000000 --- a/token-lending/js/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "@solana/spl-token-lending", - "version": "0.1.0", - "description": "SPL Token Lending JavaScript API", - "license": "MIT", - "author": "Solana Maintainers ", - "repository": { - "type": "git", - "url": "https://github.com/solana-labs/solana-program-library" - }, - "bugs": { - "url": "https://github.com/solana-labs/solana-program-library/issues" - }, - "keywords": [], - "publishConfig": { - "access": "public" - }, - "main": "lib/index.cjs.js", - "module": "lib/index.esm.js", - "types": "lib/index.d.ts", - "files": [ - "lib" - ], - "scripts": { - "build": "rollup -c rollup.config.ts", - "build:program": "cargo build-bpf --manifest-path ../program/Cargo.toml", - "start": "ts-node cli/main.ts", - "start-with-test-validator": "start-server-and-test 'solana-test-validator --bpf-program LendZqTs7gn5CTSJU1jWKhKuVpjJGom45nnwPb2AMTi ../../target/deploy/spl_token_lending.so --reset --quiet' http://localhost:8899/health start", - "lint": "eslint --ext .ts {cli,client}/* && prettier --check \"{cli,client}/**/*.ts\"", - "lint:fix": "eslint --ext .ts {cli,client}/* --fix && prettier --write \"{cli,client}/**/*.ts\"", - "cluster:localnet": "rm -f .env", - "cluster:devnet": "cp cluster-devnet.env .env", - "cluster:testnet": "cp cluster-testnet.env .env", - "cluster:mainnet-beta": "cp cluster-mainnet-beta.env .env" - }, - "dependencies": { - "@solana/spl-token": "0.1.6", - "@solana/web3.js": "^1.20.0", - "bn.js": "^5.2.0", - "mkdirp": "^1.0.4" - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^19.0.0", - "@tsconfig/recommended": "^1.0.1", - "@types/bn.js": "^5.1.0", - "@types/eslint": "^7.2.13", - "@types/eslint-plugin-prettier": "^3.1.0", - "@types/mkdirp": "^1.0.1", - "@types/mz": "^2.7.3", - "@types/node": "^15.12.5", - "@types/prettier": "^2.3.0", - "@types/rollup-plugin-json": "^3.0.2", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.1", - "dotenv": "^10.0.0", - "eslint": "^7.29.0", - "eslint-config-prettier": "^7.2.0", - "eslint-plugin-prettier": "^3.4.0", - "prettier": "^2.2.1", - "rollup": "^2.52.3", - "rollup-plugin-json": "^4.0.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rollup-plugin-typescript2": "^0.30.0", - "start-server-and-test": "^1.12.5", - "ts-node": "^10.0.0", - "typescript": "^4.3.4" - }, - "engines": { - "node": ">= 10" - } -} diff --git a/token-lending/js/rollup.config.ts b/token-lending/js/rollup.config.ts deleted file mode 100644 index 1ad376f12d9..00000000000 --- a/token-lending/js/rollup.config.ts +++ /dev/null @@ -1,41 +0,0 @@ -import commonjs from '@rollup/plugin-commonjs' -import json from 'rollup-plugin-json' -import resolve from 'rollup-plugin-node-resolve' -import sourceMaps from 'rollup-plugin-sourcemaps' -import typescript from 'rollup-plugin-typescript2' - -const pkg = require('./package.json') - -export default { - input: `client/index.ts`, - output: [ - { file: pkg.main, format: 'cjs', sourcemap: true }, - { file: pkg.module, format: 'es', sourcemap: true } - ], - external: [ - 'assert', - 'url', - 'http', - 'https', - 'crypto', - 'buffer', - 'path', - 'stream', - 'zlib', - 'events', - 'tls', - 'net', - 'os', - 'fs' - ], - watch: { - include: 'src/**' - }, - plugins: [ - json(), - typescript({useTsconfigDeclarationDir: false}), - commonjs(), - resolve({preferBuiltins: true}), - sourceMaps() - ] -} diff --git a/token-lending/js/tsconfig.json b/token-lending/js/tsconfig.json deleted file mode 100644 index 614bab8136d..00000000000 --- a/token-lending/js/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "@tsconfig/recommended/tsconfig.json", - "ts-node": { - "compilerOptions": { - "module": "commonjs", - "baseUrl": "./", - "paths": { - "*" : ["types/*"] - } - } - }, - "compilerOptions": { - "declaration": true, - "moduleResolution": "node", - "module": "es2015", - "baseUrl": "./", - "paths": { - "*" : ["types/*"] - } - }, - "include": ["cli/**/*", "client/**/*"], - "exclude": ["node_modules"] -} diff --git a/token-lending/js/types/buffer-layout.d.ts b/token-lending/js/types/buffer-layout.d.ts deleted file mode 100644 index f27644b6d3d..00000000000 --- a/token-lending/js/types/buffer-layout.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'buffer-layout'; diff --git a/token-lending/program/Cargo.toml b/token-lending/program/Cargo.toml index b0e23a9fc2c..2276b063780 100644 --- a/token-lending/program/Cargo.toml +++ b/token-lending/program/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "spl-token-lending" +name = "solend-program" version = "0.1.0" -description = "Solana Program Library Token Lending" -authors = ["Solana Maintainers "] -repository = "https://github.com/solana-labs/solana-program-library" +description = "Solend Program" +authors = ["Solend Maintainers "] +repository = "https://github.com/solendprotocol/solana-program-library" license = "Apache-2.0" edition = "2018" diff --git a/token-lending/program/src/instruction.rs b/token-lending/program/src/instruction.rs index 81065ca004f..8b0f90fb59a 100644 --- a/token-lending/program/src/instruction.rs +++ b/token-lending/program/src/instruction.rs @@ -1051,6 +1051,50 @@ pub fn deposit_reserve_liquidity_and_obligation_collateral( } } +/// Creates a 'WithdrawObligationCollateralAndRedeemReserveCollateral' instruction. +#[allow(clippy::too_many_arguments)] +pub fn withdraw_obligation_collateral_and_redeem_reserve_collateral( + program_id: Pubkey, + collateral_amount: u64, + source_collateral_pubkey: Pubkey, + destination_collateral_pubkey: Pubkey, + withdraw_reserve_pubkey: Pubkey, + obligation_pubkey: Pubkey, + lending_market_pubkey: Pubkey, + destination_liquidity_pubkey: Pubkey, + reserve_collateral_mint_pubkey: Pubkey, + reserve_liquidity_supply_pubkey: Pubkey, + obligation_owner_pubkey: Pubkey, + user_transfer_authority_pubkey: Pubkey, +) -> Instruction { + let (lending_market_authority_pubkey, _bump_seed) = Pubkey::find_program_address( + &[&lending_market_pubkey.to_bytes()[..PUBKEY_BYTES]], + &program_id, + ); + Instruction { + program_id, + accounts: vec![ + AccountMeta::new(source_collateral_pubkey, false), + AccountMeta::new(destination_collateral_pubkey, false), + AccountMeta::new(withdraw_reserve_pubkey, false), + AccountMeta::new(obligation_pubkey, false), + AccountMeta::new_readonly(lending_market_pubkey, false), + AccountMeta::new_readonly(lending_market_authority_pubkey, false), + AccountMeta::new(destination_liquidity_pubkey, false), + AccountMeta::new(reserve_collateral_mint_pubkey, false), + AccountMeta::new(reserve_liquidity_supply_pubkey, false), + AccountMeta::new(obligation_owner_pubkey, true), + AccountMeta::new_readonly(user_transfer_authority_pubkey, true), + AccountMeta::new_readonly(sysvar::clock::id(), false), + AccountMeta::new_readonly(spl_token::id(), false), + ], + data: LendingInstruction::WithdrawObligationCollateralAndRedeemReserveCollateral { + collateral_amount, + } + .pack(), + } +} + /// Creates a 'WithdrawObligationCollateral' instruction. #[allow(clippy::too_many_arguments)] pub fn withdraw_obligation_collateral( diff --git a/token-lending/program/src/processor.rs b/token-lending/program/src/processor.rs index 36fd3691291..0521b3ec689 100644 --- a/token-lending/program/src/processor.rs +++ b/token-lending/program/src/processor.rs @@ -1,7 +1,7 @@ //! Program state processor use crate::{ - self as spl_token_lending, + self as solend_program, error::LendingError, instruction::LendingInstruction, math::{Decimal, Rate, TryAdd, TryDiv, TryMul, TrySub, WAD}, @@ -279,9 +279,9 @@ fn process_init_reserve( msg!("Lending market owner provided must be a signer"); return Err(LendingError::InvalidSigner.into()); } - if *switchboard_feed_info.key == spl_token_lending::NULL_PUBKEY - && (*pyth_price_info.key == spl_token_lending::NULL_PUBKEY - || *pyth_product_info.key == spl_token_lending::NULL_PUBKEY) + if *switchboard_feed_info.key == solend_program::NULL_PUBKEY + && (*pyth_price_info.key == solend_program::NULL_PUBKEY + || *pyth_product_info.key == solend_program::NULL_PUBKEY) { msg!("Both price oracles are null. At least one must be non-null"); return Err(LendingError::InvalidOracleConfig.into()); @@ -2181,9 +2181,9 @@ fn process_update_reserve_config( validate_switchboard_keys(&lending_market, switchboard_feed_info)?; reserve.liquidity.switchboard_oracle_pubkey = *switchboard_feed_info.key; } - if reserve.liquidity.switchboard_oracle_pubkey == spl_token_lending::NULL_PUBKEY - && (*pyth_price_info.key == spl_token_lending::NULL_PUBKEY - || *pyth_product_info.key == spl_token_lending::NULL_PUBKEY) + if reserve.liquidity.switchboard_oracle_pubkey == solend_program::NULL_PUBKEY + && (*pyth_price_info.key == solend_program::NULL_PUBKEY + || *pyth_product_info.key == solend_program::NULL_PUBKEY) { msg!("At least one price oracle must have a non-null pubkey"); return Err(LendingError::InvalidOracleConfig.into()); @@ -2280,7 +2280,7 @@ fn get_price( fn get_pyth_price(pyth_price_info: &AccountInfo, clock: &Clock) -> Result { const STALE_AFTER_SLOTS_ELAPSED: u64 = 240; - if *pyth_price_info.key == spl_token_lending::NULL_PUBKEY { + if *pyth_price_info.key == solend_program::NULL_PUBKEY { return Err(LendingError::NullOracleConfig.into()); } @@ -2361,7 +2361,7 @@ fn get_switchboard_price( ) -> Result { const STALE_AFTER_SLOTS_ELAPSED: u64 = 240; - if *switchboard_feed_info.key == spl_token_lending::NULL_PUBKEY { + if *switchboard_feed_info.key == solend_program::NULL_PUBKEY { return Err(LendingError::NullOracleConfig.into()); } if switchboard_feed_info.owner == &switchboard_v2_mainnet::id() @@ -2612,7 +2612,7 @@ fn validate_pyth_keys( pyth_product_info: &AccountInfo, pyth_price_info: &AccountInfo, ) -> ProgramResult { - if *pyth_price_info.key == spl_token_lending::NULL_PUBKEY { + if *pyth_price_info.key == solend_program::NULL_PUBKEY { return Ok(()); } if &lending_market.oracle_program_id != pyth_product_info.owner { @@ -2663,7 +2663,7 @@ fn validate_switchboard_keys( lending_market: &LendingMarket, switchboard_feed_info: &AccountInfo, ) -> ProgramResult { - if *switchboard_feed_info.key == spl_token_lending::NULL_PUBKEY { + if *switchboard_feed_info.key == solend_program::NULL_PUBKEY { return Ok(()); } if switchboard_feed_info.owner != &lending_market.switchboard_oracle_program_id diff --git a/token-lending/program/tests/borrow_obligation_liquidity.rs b/token-lending/program/tests/borrow_obligation_liquidity.rs index 14ca5bbbdb0..ffa67bbdf9d 100644 --- a/token-lending/program/tests/borrow_obligation_liquidity.rs +++ b/token-lending/program/tests/borrow_obligation_liquidity.rs @@ -10,7 +10,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::{Transaction, TransactionError}, }; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::{borrow_obligation_liquidity, refresh_obligation, refresh_reserve}, math::Decimal, @@ -22,8 +22,8 @@ use std::u64; #[tokio::test] async fn test_borrow_usdc_fixed_amount() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -96,12 +96,12 @@ async fn test_borrow_usdc_fixed_amount() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey], ), borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_BORROW_AMOUNT_FRACTIONAL, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, @@ -166,8 +166,8 @@ async fn test_borrow_usdc_fixed_amount() { #[tokio::test] async fn test_borrow_sol_max_amount() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -240,12 +240,12 @@ async fn test_borrow_sol_max_amount() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![usdc_test_reserve.pubkey], ), borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), u64::MAX, sol_test_reserve.liquidity_supply_pubkey, sol_test_reserve.user_liquidity_pubkey, @@ -304,8 +304,8 @@ async fn test_borrow_sol_max_amount() { #[tokio::test] async fn test_borrow_too_large() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -368,12 +368,12 @@ async fn test_borrow_too_large() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey], ), borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_BORROW_AMOUNT_FRACTIONAL, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, @@ -407,8 +407,8 @@ async fn test_borrow_too_large() { #[tokio::test] async fn test_borrow_limit() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -471,12 +471,12 @@ async fn test_borrow_limit() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey], ), borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), reserve_config.borrow_limit + 1, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, @@ -510,12 +510,12 @@ async fn test_borrow_limit() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey], ), borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), u64::MAX, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, @@ -527,7 +527,7 @@ async fn test_borrow_limit() { Some(usdc_test_reserve.liquidity_host_pubkey), ), refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, @@ -548,18 +548,18 @@ async fn test_borrow_limit() { let mut transaction = Transaction::new_with_payer( &[ refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey, usdc_test_reserve.pubkey], ), borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), u64::MAX, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, diff --git a/token-lending/program/tests/deposit_obligation_collateral.rs b/token-lending/program/tests/deposit_obligation_collateral.rs index 9b5387919b5..4335b60c7ab 100644 --- a/token-lending/program/tests/deposit_obligation_collateral.rs +++ b/token-lending/program/tests/deposit_obligation_collateral.rs @@ -9,17 +9,17 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token::instruction::approve; -use spl_token_lending::{ +use solend_program::{ instruction::deposit_obligation_collateral, processor::process_instruction, state::INITIAL_COLLATERAL_RATIO, }; +use spl_token::instruction::approve; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -91,7 +91,7 @@ async fn test_success() { ) .unwrap(), deposit_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), SOL_DEPOSIT_AMOUNT_LAMPORTS, sol_test_reserve.user_collateral_pubkey, sol_test_reserve.collateral_supply_pubkey, diff --git a/token-lending/program/tests/deposit_reserve_liquidity.rs b/token-lending/program/tests/deposit_reserve_liquidity.rs index 1fbccf72030..99313f11649 100644 --- a/token-lending/program/tests/deposit_reserve_liquidity.rs +++ b/token-lending/program/tests/deposit_reserve_liquidity.rs @@ -5,13 +5,13 @@ mod helpers; use helpers::*; use solana_program_test::*; use solana_sdk::{pubkey::Pubkey, signature::Keypair}; -use spl_token_lending::processor::process_instruction; +use solend_program::processor::process_instruction; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); diff --git a/token-lending/program/tests/deposit_reserve_liquidity_and_obligation_collateral.rs b/token-lending/program/tests/deposit_reserve_liquidity_and_obligation_collateral.rs index 7efba9dcbdb..e7c0e9c1655 100644 --- a/token-lending/program/tests/deposit_reserve_liquidity_and_obligation_collateral.rs +++ b/token-lending/program/tests/deposit_reserve_liquidity_and_obligation_collateral.rs @@ -5,13 +5,13 @@ mod helpers; use helpers::*; use solana_program_test::*; use solana_sdk::{pubkey::Pubkey, signature::Keypair}; -use spl_token_lending::processor::process_instruction; +use solend_program::processor::process_instruction; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); diff --git a/token-lending/program/tests/flash_loan.rs b/token-lending/program/tests/flash_loan.rs index 9d01e40f4a1..4fa9be5f588 100644 --- a/token-lending/program/tests/flash_loan.rs +++ b/token-lending/program/tests/flash_loan.rs @@ -10,16 +10,16 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::{Transaction, TransactionError}, }; -use spl_token::solana_program::instruction::InstructionError; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::flash_loan, processor::process_instruction, }; +use spl_token::solana_program::instruction::InstructionError; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -86,7 +86,7 @@ async fn test_success() { let mut transaction = Transaction::new_with_payer( &[flash_loan( - spl_token_lending::id(), + solend_program::id(), FLASH_LOAN_AMOUNT, usdc_test_reserve.liquidity_supply_pubkey, program_owned_token_account, @@ -139,8 +139,8 @@ async fn test_success() { #[tokio::test] async fn test_failure() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -195,7 +195,7 @@ async fn test_failure() { let mut transaction = Transaction::new_with_payer( &[flash_loan( - spl_token_lending::id(), + solend_program::id(), FLASH_LOAN_AMOUNT, usdc_test_reserve.liquidity_supply_pubkey, program_owned_token_account, diff --git a/token-lending/program/tests/helpers/mod.rs b/token-lending/program/tests/helpers/mod.rs index 79f1f89f048..50805befdab 100644 --- a/token-lending/program/tests/helpers/mod.rs +++ b/token-lending/program/tests/helpers/mod.rs @@ -12,15 +12,12 @@ use solana_sdk::{ system_instruction::create_account, transaction::{Transaction, TransactionError}, }; -use spl_token::{ - instruction::approve, - state::{Account as Token, AccountState, Mint}, -}; -use spl_token_lending::{ +use solend_program::{ instruction::{ borrow_obligation_liquidity, deposit_reserve_liquidity, deposit_reserve_liquidity_and_obligation_collateral, init_lending_market, init_obligation, - init_reserve, liquidate_obligation, refresh_reserve, + init_reserve, liquidate_obligation, refresh_obligation, refresh_reserve, + withdraw_obligation_collateral_and_redeem_reserve_collateral, }, math::{Decimal, Rate, TryAdd, TryMul}, processor::switchboard_v2_mainnet, @@ -32,6 +29,10 @@ use spl_token_lending::{ ReserveLiquidity, INITIAL_COLLATERAL_RATIO, PROGRAM_VERSION, }, }; +use spl_token::{ + instruction::approve, + state::{Account as Token, AccountState, Mint}, +}; use std::{convert::TryInto, str::FromStr}; use switchboard_v2::AggregatorAccountData; @@ -103,7 +104,7 @@ impl AddPacked for ProgramTest { pub fn add_lending_market(test: &mut ProgramTest) -> TestLendingMarket { let lending_market_pubkey = Pubkey::new_unique(); let (lending_market_authority, bump_seed) = - Pubkey::find_program_address(&[lending_market_pubkey.as_ref()], &spl_token_lending::id()); + Pubkey::find_program_address(&[lending_market_pubkey.as_ref()], &solend_program::id()); let lending_market_owner = read_keypair_file("tests/fixtures/lending_market_owner.json").unwrap(); @@ -122,7 +123,7 @@ pub fn add_lending_market(test: &mut ProgramTest) -> TestLendingMarket { oracle_program_id, switchboard_oracle_program_id: oracle_program_id, }), - &spl_token_lending::id(), + &solend_program::id(), ); TestLendingMarket { @@ -214,7 +215,7 @@ pub fn add_obligation( obligation_pubkey, u32::MAX as u64, &obligation, - &spl_token_lending::id(), + &solend_program::id(), ); TestObligation { @@ -389,7 +390,7 @@ pub fn add_reserve( reserve_pubkey, u32::MAX as u64, &reserve, - &spl_token_lending::id(), + &solend_program::id(), ); let amount = if let COption::Some(rent_reserve) = is_native { @@ -504,7 +505,7 @@ impl TestLendingMarket { let lending_market_pubkey = lending_market_keypair.pubkey(); let (lending_market_authority, _bump_seed) = Pubkey::find_program_address( &[&lending_market_pubkey.to_bytes()[..32]], - &spl_token_lending::id(), + &solend_program::id(), ); let rent = banks_client.get_rent().await.unwrap(); @@ -515,10 +516,10 @@ impl TestLendingMarket { &lending_market_pubkey, rent.minimum_balance(LendingMarket::LEN), LendingMarket::LEN as u64, - &spl_token_lending::id(), + &solend_program::id(), ), init_lending_market( - spl_token_lending::id(), + solend_program::id(), lending_market_owner.pubkey(), QUOTE_CURRENCY, lending_market_pubkey, @@ -551,7 +552,7 @@ impl TestLendingMarket { ) { let mut transaction = Transaction::new_with_payer( &[refresh_reserve( - spl_token_lending::id(), + solend_program::id(), reserve.pubkey, reserve.liquidity_pyth_oracle_pubkey, reserve.liquidity_switchboard_oracle_pubkey, @@ -586,7 +587,7 @@ impl TestLendingMarket { ) .unwrap(), deposit_reserve_liquidity( - spl_token_lending::id(), + solend_program::id(), liquidity_amount, reserve.user_liquidity_pubkey, reserve.user_collateral_pubkey, @@ -640,7 +641,7 @@ impl TestLendingMarket { ) .unwrap(), deposit_reserve_liquidity_and_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), liquidity_amount, reserve.user_liquidity_pubkey, reserve.user_collateral_pubkey, @@ -668,6 +669,57 @@ impl TestLendingMarket { assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); } + pub async fn withdraw_and_redeem_collateral( + &self, + banks_client: &mut BanksClient, + user_accounts_owner: &Keypair, + payer: &Keypair, + reserve: &TestReserve, + obligation: &TestObligation, + collateral_amount: u64, + ) { + let user_transfer_authority = Keypair::new(); + let mut transaction = Transaction::new_with_payer( + &[ + approve( + &spl_token::id(), + &reserve.user_collateral_pubkey, + &user_transfer_authority.pubkey(), + &user_accounts_owner.pubkey(), + &[], + collateral_amount, + ) + .unwrap(), + refresh_obligation( + solend_program::id(), + obligation.pubkey, + vec![reserve.pubkey], + ), + withdraw_obligation_collateral_and_redeem_reserve_collateral( + solend_program::id(), + collateral_amount, + reserve.collateral_supply_pubkey, + reserve.user_collateral_pubkey, + reserve.pubkey, + obligation.pubkey, + self.pubkey, + reserve.user_liquidity_pubkey, + reserve.collateral_mint_pubkey, + reserve.liquidity_supply_pubkey, + obligation.owner, + user_transfer_authority.pubkey(), + ), + ], + Some(&payer.pubkey()), + ); + let recent_blockhash = banks_client.get_recent_blockhash().await.unwrap(); + transaction.sign( + &[payer, user_accounts_owner, &user_transfer_authority], + recent_blockhash, + ); + + assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); + } pub async fn liquidate( &self, banks_client: &mut BanksClient, @@ -695,7 +747,7 @@ impl TestLendingMarket { ) .unwrap(), liquidate_obligation( - spl_token_lending::id(), + solend_program::id(), liquidity_amount, repay_reserve.user_liquidity_pubkey, withdraw_reserve.user_collateral_pubkey, @@ -734,7 +786,7 @@ impl TestLendingMarket { let mut transaction = Transaction::new_with_payer( &[borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), liquidity_amount, borrow_reserve.liquidity_supply_pubkey, borrow_reserve.user_liquidity_pubkey, @@ -880,10 +932,10 @@ impl TestReserve { &reserve_pubkey, rent.minimum_balance(Reserve::LEN), Reserve::LEN as u64, - &spl_token_lending::id(), + &solend_program::id(), ), init_reserve( - spl_token_lending::id(), + solend_program::id(), liquidity_amount, config, user_liquidity_pubkey, @@ -1023,10 +1075,10 @@ impl TestObligation { &obligation.keypair.pubkey(), rent.minimum_balance(Obligation::LEN), Obligation::LEN as u64, - &spl_token_lending::id(), + &solend_program::id(), ), init_obligation( - spl_token_lending::id(), + solend_program::id(), obligation.pubkey, lending_market.pubkey, user_accounts_owner.pubkey(), diff --git a/token-lending/program/tests/init_lending_market.rs b/token-lending/program/tests/init_lending_market.rs index b22a70d07c3..bd131099b8b 100644 --- a/token-lending/program/tests/init_lending_market.rs +++ b/token-lending/program/tests/init_lending_market.rs @@ -10,15 +10,15 @@ use solana_sdk::{ signature::Signer, transaction::{Transaction, TransactionError}, }; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::init_lending_market, processor::process_instruction, }; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -35,8 +35,8 @@ async fn test_success() { #[tokio::test] async fn test_already_initialized() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -45,7 +45,7 @@ async fn test_already_initialized() { let mut transaction = Transaction::new_with_payer( &[init_lending_market( - spl_token_lending::id(), + solend_program::id(), existing_market.owner.pubkey(), existing_market.quote_currency, existing_market.pubkey, diff --git a/token-lending/program/tests/init_obligation.rs b/token-lending/program/tests/init_obligation.rs index 8e6216818d1..593c6aa0d55 100644 --- a/token-lending/program/tests/init_obligation.rs +++ b/token-lending/program/tests/init_obligation.rs @@ -10,15 +10,15 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::{Transaction, TransactionError}, }; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::init_obligation, processor::process_instruction, }; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -44,8 +44,8 @@ async fn test_success() { #[tokio::test] async fn test_already_initialized() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -65,7 +65,7 @@ async fn test_already_initialized() { let (mut banks_client, payer, recent_blockhash) = test.start().await; let mut transaction = Transaction::new_with_payer( &[init_obligation( - spl_token_lending::id(), + solend_program::id(), usdc_obligation.pubkey, lending_market.pubkey, user_accounts_owner.pubkey(), diff --git a/token-lending/program/tests/init_reserve.rs b/token-lending/program/tests/init_reserve.rs index 158e901f411..66a8c75c32e 100644 --- a/token-lending/program/tests/init_reserve.rs +++ b/token-lending/program/tests/init_reserve.rs @@ -10,7 +10,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::{Transaction, TransactionError}, }; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::{init_reserve, update_reserve_config}, math::Decimal, @@ -21,8 +21,8 @@ use spl_token_lending::{ #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -86,8 +86,8 @@ async fn test_success() { #[tokio::test] async fn test_init_reserve_null_oracles() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -97,9 +97,9 @@ async fn test_init_reserve_null_oracles() { let user_accounts_owner = Keypair::new(); let lending_market = add_lending_market(&mut test); let all_null_oracles = TestOracle { - pyth_product_pubkey: spl_token_lending::NULL_PUBKEY, - pyth_price_pubkey: spl_token_lending::NULL_PUBKEY, - switchboard_feed_pubkey: spl_token_lending::NULL_PUBKEY, + pyth_product_pubkey: solend_program::NULL_PUBKEY, + pyth_price_pubkey: solend_program::NULL_PUBKEY, + switchboard_feed_pubkey: solend_program::NULL_PUBKEY, price: Decimal::from(1u64), }; @@ -147,8 +147,8 @@ async fn test_init_reserve_null_oracles() { #[tokio::test] async fn test_null_switchboard() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -158,7 +158,7 @@ async fn test_null_switchboard() { let user_accounts_owner = Keypair::new(); let lending_market = add_lending_market(&mut test); let mut sol_oracle = add_sol_oracle(&mut test); - sol_oracle.switchboard_feed_pubkey = spl_token_lending::NULL_PUBKEY; + sol_oracle.switchboard_feed_pubkey = solend_program::NULL_PUBKEY; let (mut banks_client, payer, _recent_blockhash) = test.start().await; @@ -213,8 +213,8 @@ async fn test_null_switchboard() { #[tokio::test] async fn test_already_initialized() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -242,7 +242,7 @@ async fn test_already_initialized() { let mut transaction = Transaction::new_with_payer( &[init_reserve( - spl_token_lending::id(), + solend_program::id(), 42, usdc_test_reserve.config, usdc_test_reserve.user_liquidity_pubkey, @@ -281,8 +281,8 @@ async fn test_already_initialized() { #[tokio::test] async fn test_invalid_fees() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -377,8 +377,8 @@ async fn test_invalid_fees() { #[tokio::test] async fn test_update_reserve_config() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -424,7 +424,7 @@ async fn test_update_reserve_config() { let (mut banks_client, payer, recent_blockhash) = test.start().await; let mut transaction = Transaction::new_with_payer( &[update_reserve_config( - spl_token_lending::id(), + solend_program::id(), new_config, test_reserve.pubkey, lending_market.pubkey, @@ -445,8 +445,8 @@ async fn test_update_reserve_config() { #[tokio::test] async fn test_update_invalid_oracle_config() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -474,14 +474,14 @@ async fn test_update_invalid_oracle_config() { // Try setting both of the oracles to null: Should fail let mut transaction = Transaction::new_with_payer( &[update_reserve_config( - spl_token_lending::id(), + solend_program::id(), config, test_reserve.pubkey, lending_market.pubkey, lending_market.owner.pubkey(), - spl_token_lending::NULL_PUBKEY, - spl_token_lending::NULL_PUBKEY, - spl_token_lending::NULL_PUBKEY, + solend_program::NULL_PUBKEY, + solend_program::NULL_PUBKEY, + solend_program::NULL_PUBKEY, )], Some(&payer.pubkey()), ); @@ -502,14 +502,14 @@ async fn test_update_invalid_oracle_config() { // Set one of the oracles to null let mut transaction = Transaction::new_with_payer( &[update_reserve_config( - spl_token_lending::id(), + solend_program::id(), config, test_reserve.pubkey, lending_market.pubkey, lending_market.owner.pubkey(), oracle.pyth_product_pubkey, oracle.pyth_price_pubkey, - spl_token_lending::NULL_PUBKEY, + solend_program::NULL_PUBKEY, )], Some(&payer.pubkey()), ); @@ -523,21 +523,21 @@ async fn test_update_invalid_oracle_config() { ); assert_eq!( updated_reserve.liquidity.switchboard_oracle_pubkey, - spl_token_lending::NULL_PUBKEY + solend_program::NULL_PUBKEY ); // Setting both oracles to null still fails, even if one is // already null let mut transaction = Transaction::new_with_payer( &[update_reserve_config( - spl_token_lending::id(), + solend_program::id(), config, test_reserve.pubkey, lending_market.pubkey, lending_market.owner.pubkey(), - spl_token_lending::NULL_PUBKEY, - spl_token_lending::NULL_PUBKEY, - spl_token_lending::NULL_PUBKEY, + solend_program::NULL_PUBKEY, + solend_program::NULL_PUBKEY, + solend_program::NULL_PUBKEY, )], Some(&payer.pubkey()), ); diff --git a/token-lending/program/tests/liquidate_obligation.rs b/token-lending/program/tests/liquidate_obligation.rs index 1bd5444bfbf..21f1aa5883a 100644 --- a/token-lending/program/tests/liquidate_obligation.rs +++ b/token-lending/program/tests/liquidate_obligation.rs @@ -9,18 +9,18 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token::instruction::approve; -use spl_token_lending::{ +use solend_program::{ instruction::{liquidate_obligation, refresh_obligation}, processor::process_instruction, state::INITIAL_COLLATERAL_RATIO, }; +use spl_token::instruction::approve; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -118,12 +118,12 @@ async fn test_success() { ) .unwrap(), refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey, usdc_test_reserve.pubkey], ), liquidate_obligation( - spl_token_lending::id(), + solend_program::id(), USDC_LIQUIDATION_AMOUNT_FRACTIONAL, usdc_test_reserve.user_liquidity_pubkey, sol_test_reserve.user_collateral_pubkey, diff --git a/token-lending/program/tests/liquidate_obligation_and_redeem_collateral.rs b/token-lending/program/tests/liquidate_obligation_and_redeem_collateral.rs index ac83b0495ec..c97545979d4 100644 --- a/token-lending/program/tests/liquidate_obligation_and_redeem_collateral.rs +++ b/token-lending/program/tests/liquidate_obligation_and_redeem_collateral.rs @@ -9,7 +9,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token_lending::{ +use solend_program::{ instruction::{liquidate_obligation_and_redeem_reserve_collateral, refresh_obligation}, processor::process_instruction, state::INITIAL_COLLATERAL_RATIO, @@ -19,8 +19,8 @@ use std::cmp::max; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -117,12 +117,12 @@ async fn test_success() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey, usdc_test_reserve.pubkey], ), liquidate_obligation_and_redeem_reserve_collateral( - spl_token_lending::id(), + solend_program::id(), USDC_LIQUIDATION_AMOUNT_FRACTIONAL, usdc_test_reserve.user_liquidity_pubkey, sol_test_reserve.user_collateral_pubkey, diff --git a/token-lending/program/tests/obligation_end_to_end.rs b/token-lending/program/tests/obligation_end_to_end.rs index 3a26cb875fe..634bf94e56f 100644 --- a/token-lending/program/tests/obligation_end_to_end.rs +++ b/token-lending/program/tests/obligation_end_to_end.rs @@ -11,8 +11,7 @@ use solana_sdk::{ system_instruction::create_account, transaction::Transaction, }; -use spl_token::{instruction::approve, solana_program::program_pack::Pack}; -use spl_token_lending::{ +use solend_program::{ instruction::{ borrow_obligation_liquidity, deposit_obligation_collateral, init_obligation, refresh_obligation, refresh_reserve, repay_obligation_liquidity, @@ -22,12 +21,13 @@ use spl_token_lending::{ processor::process_instruction, state::{Obligation, INITIAL_COLLATERAL_RATIO}, }; +use spl_token::{instruction::approve, solana_program::program_pack::Pack}; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -113,11 +113,11 @@ async fn test_success() { &obligation_keypair.pubkey(), rent.minimum_balance(Obligation::LEN), Obligation::LEN as u64, - &spl_token_lending::id(), + &solend_program::id(), ), // 1 init_obligation( - spl_token_lending::id(), + solend_program::id(), obligation_pubkey, lending_market.pubkey, user_accounts_owner_pubkey, @@ -134,7 +134,7 @@ async fn test_success() { .unwrap(), // 3 deposit_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), SOL_DEPOSIT_AMOUNT_LAMPORTS, sol_test_reserve.user_collateral_pubkey, sol_test_reserve.collateral_supply_pubkey, @@ -146,27 +146,27 @@ async fn test_success() { ), // 4 refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), // 5 refresh_reserve( - spl_token_lending::id(), + solend_program::id(), sol_test_reserve.pubkey, sol_oracle.pyth_price_pubkey, sol_oracle.switchboard_feed_pubkey, ), // 6 refresh_obligation( - spl_token_lending::id(), + solend_program::id(), obligation_pubkey, vec![sol_test_reserve.pubkey], ), // 7 borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_BORROW_AMOUNT_FRACTIONAL, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, @@ -189,7 +189,7 @@ async fn test_success() { .unwrap(), // 9 repay_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_REPAY_AMOUNT_FRACTIONAL, usdc_test_reserve.user_liquidity_pubkey, usdc_test_reserve.liquidity_supply_pubkey, @@ -200,20 +200,20 @@ async fn test_success() { ), // 10 refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), // 11 refresh_obligation( - spl_token_lending::id(), + solend_program::id(), obligation_pubkey, vec![sol_test_reserve.pubkey], ), // 12 withdraw_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), SOL_DEPOSIT_AMOUNT_LAMPORTS, sol_test_reserve.collateral_supply_pubkey, sol_test_reserve.user_collateral_pubkey, @@ -285,8 +285,8 @@ async fn test_success() { #[tokio::test] async fn test_success2() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -372,11 +372,11 @@ async fn test_success2() { &obligation_keypair.pubkey(), rent.minimum_balance(Obligation::LEN), Obligation::LEN as u64, - &spl_token_lending::id(), + &solend_program::id(), ), // 1 init_obligation( - spl_token_lending::id(), + solend_program::id(), obligation_pubkey, lending_market.pubkey, user_accounts_owner_pubkey, @@ -393,7 +393,7 @@ async fn test_success2() { .unwrap(), // 3 deposit_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), SOL_DEPOSIT_AMOUNT_LAMPORTS, sol_test_reserve.user_collateral_pubkey, sol_test_reserve.collateral_supply_pubkey, @@ -405,27 +405,27 @@ async fn test_success2() { ), // 4 refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), // 5 refresh_reserve( - spl_token_lending::id(), + solend_program::id(), sol_test_reserve.pubkey, sol_oracle.pyth_price_pubkey, sol_oracle.switchboard_feed_pubkey, ), // 6 refresh_obligation( - spl_token_lending::id(), + solend_program::id(), obligation_pubkey, vec![sol_test_reserve.pubkey], ), // 7 borrow_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_BORROW_AMOUNT_FRACTIONAL, usdc_test_reserve.liquidity_supply_pubkey, usdc_test_reserve.user_liquidity_pubkey, @@ -448,7 +448,7 @@ async fn test_success2() { .unwrap(), // 9 repay_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_REPAY_AMOUNT_FRACTIONAL, usdc_test_reserve.user_liquidity_pubkey, usdc_test_reserve.liquidity_supply_pubkey, @@ -459,20 +459,20 @@ async fn test_success2() { ), // 10 refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), // 11 refresh_obligation( - spl_token_lending::id(), + solend_program::id(), obligation_pubkey, vec![sol_test_reserve.pubkey], ), // 12 withdraw_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), SOL_DEPOSIT_AMOUNT_LAMPORTS, sol_test_reserve.collateral_supply_pubkey, sol_test_reserve.user_collateral_pubkey, diff --git a/token-lending/program/tests/redeem_reserve_collateral.rs b/token-lending/program/tests/redeem_reserve_collateral.rs index e673de146f8..5cbfdab2485 100644 --- a/token-lending/program/tests/redeem_reserve_collateral.rs +++ b/token-lending/program/tests/redeem_reserve_collateral.rs @@ -9,17 +9,17 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token::instruction::approve; -use spl_token_lending::{ +use solend_program::{ instruction::redeem_reserve_collateral, processor::process_instruction, state::INITIAL_COLLATERAL_RATIO, }; +use spl_token::instruction::approve; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -78,7 +78,7 @@ async fn test_success() { ) .unwrap(), redeem_reserve_collateral( - spl_token_lending::id(), + solend_program::id(), COLLATERAL_AMOUNT, usdc_test_reserve.user_collateral_pubkey, usdc_test_reserve.user_liquidity_pubkey, diff --git a/token-lending/program/tests/refresh_obligation.rs b/token-lending/program/tests/refresh_obligation.rs index 25f291b9daf..48f976b840d 100644 --- a/token-lending/program/tests/refresh_obligation.rs +++ b/token-lending/program/tests/refresh_obligation.rs @@ -9,9 +9,9 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token_lending::math::{Rate, TryAdd, TryMul}; -use spl_token_lending::state::SLOTS_PER_YEAR; -use spl_token_lending::{ +use solend_program::math::{Rate, TryAdd, TryMul}; +use solend_program::state::SLOTS_PER_YEAR; +use solend_program::{ instruction::{refresh_obligation, refresh_reserve}, math::{Decimal, TryDiv}, processor::process_instruction, @@ -21,8 +21,8 @@ use spl_token_lending::{ #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -108,19 +108,19 @@ async fn test_success() { let mut transaction = Transaction::new_with_payer( &[ refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), refresh_reserve( - spl_token_lending::id(), + solend_program::id(), sol_test_reserve.pubkey, sol_oracle.pyth_price_pubkey, sol_oracle.switchboard_feed_pubkey, ), refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey, usdc_test_reserve.pubkey], ), diff --git a/token-lending/program/tests/refresh_reserve.rs b/token-lending/program/tests/refresh_reserve.rs index 0ab5a34c745..349a46947e1 100644 --- a/token-lending/program/tests/refresh_reserve.rs +++ b/token-lending/program/tests/refresh_reserve.rs @@ -9,7 +9,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token_lending::{ +use solend_program::{ instruction::refresh_reserve, math::{Decimal, Rate, TryAdd, TryDiv, TryMul}, processor::process_instruction, @@ -19,8 +19,8 @@ use spl_token_lending::{ #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -91,13 +91,13 @@ async fn test_success() { let mut transaction = Transaction::new_with_payer( &[ refresh_reserve( - spl_token_lending::id(), + solend_program::id(), usdc_test_reserve.pubkey, usdc_oracle.pyth_price_pubkey, usdc_oracle.switchboard_feed_pubkey, ), refresh_reserve( - spl_token_lending::id(), + solend_program::id(), sol_test_reserve.pubkey, sol_oracle.pyth_price_pubkey, sol_oracle.switchboard_feed_pubkey, diff --git a/token-lending/program/tests/repay_obligation_liquidity.rs b/token-lending/program/tests/repay_obligation_liquidity.rs index db6ca44a34f..0cfa3e9e6cd 100644 --- a/token-lending/program/tests/repay_obligation_liquidity.rs +++ b/token-lending/program/tests/repay_obligation_liquidity.rs @@ -9,19 +9,19 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::Transaction, }; -use spl_token::instruction::approve; -use spl_token_lending::{ +use solend_program::{ instruction::repay_obligation_liquidity, math::{Decimal, Rate, TryAdd, TryMul, TrySub}, processor::process_instruction, state::INITIAL_COLLATERAL_RATIO, }; +use spl_token::instruction::approve; #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -107,7 +107,7 @@ async fn test_success() { ) .unwrap(), repay_obligation_liquidity( - spl_token_lending::id(), + solend_program::id(), USDC_BORROW_AMOUNT_FRACTIONAL, usdc_test_reserve.user_liquidity_pubkey, usdc_test_reserve.liquidity_supply_pubkey, diff --git a/token-lending/program/tests/set_lending_market_owner.rs b/token-lending/program/tests/set_lending_market_owner.rs index 053332ad1af..7d06114df1c 100644 --- a/token-lending/program/tests/set_lending_market_owner.rs +++ b/token-lending/program/tests/set_lending_market_owner.rs @@ -11,7 +11,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::{Transaction, TransactionError}, }; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::{set_lending_market_owner, LendingInstruction}, processor::process_instruction, @@ -20,8 +20,8 @@ use spl_token_lending::{ #[tokio::test] async fn test_success() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -34,7 +34,7 @@ async fn test_success() { let new_owner = Pubkey::new_unique(); let mut transaction = Transaction::new_with_payer( &[set_lending_market_owner( - spl_token_lending::id(), + solend_program::id(), lending_market.pubkey, lending_market.owner.pubkey(), new_owner, @@ -57,8 +57,8 @@ async fn test_success() { #[tokio::test] async fn test_invalid_owner() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -69,7 +69,7 @@ async fn test_invalid_owner() { let new_owner = Pubkey::new_unique(); let mut transaction = Transaction::new_with_payer( &[set_lending_market_owner( - spl_token_lending::id(), + solend_program::id(), lending_market.pubkey, invalid_owner.pubkey(), new_owner, @@ -95,8 +95,8 @@ async fn test_invalid_owner() { #[tokio::test] async fn test_owner_not_signer() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -106,7 +106,7 @@ async fn test_owner_not_signer() { let new_owner = Pubkey::new_unique(); let mut transaction = Transaction::new_with_payer( &[Instruction { - program_id: spl_token_lending::id(), + program_id: solend_program::id(), accounts: vec![ AccountMeta::new(lending_market.pubkey, false), AccountMeta::new_readonly(lending_market.owner.pubkey(), false), diff --git a/token-lending/program/tests/withdraw_obligation_collateral.rs b/token-lending/program/tests/withdraw_obligation_collateral.rs index abd22d2655c..bc390ca307a 100644 --- a/token-lending/program/tests/withdraw_obligation_collateral.rs +++ b/token-lending/program/tests/withdraw_obligation_collateral.rs @@ -10,7 +10,7 @@ use solana_sdk::{ signature::{Keypair, Signer}, transaction::{Transaction, TransactionError}, }; -use spl_token_lending::{ +use solend_program::{ error::LendingError, instruction::{refresh_obligation, withdraw_obligation_collateral}, processor::process_instruction, @@ -21,8 +21,8 @@ use std::u64; #[tokio::test] async fn test_withdraw_fixed_amount() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -102,12 +102,12 @@ async fn test_withdraw_fixed_amount() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey, usdc_test_reserve.pubkey], ), withdraw_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), WITHDRAW_AMOUNT, sol_test_reserve.collateral_supply_pubkey, sol_test_reserve.user_collateral_pubkey, @@ -148,8 +148,8 @@ async fn test_withdraw_fixed_amount() { #[tokio::test] async fn test_withdraw_max_amount() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -212,12 +212,12 @@ async fn test_withdraw_max_amount() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![usdc_test_reserve.pubkey], ), withdraw_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), WITHDRAW_AMOUNT, usdc_test_reserve.collateral_supply_pubkey, usdc_test_reserve.user_collateral_pubkey, @@ -257,8 +257,8 @@ async fn test_withdraw_max_amount() { #[tokio::test] async fn test_withdraw_too_large() { let mut test = ProgramTest::new( - "spl_token_lending", - spl_token_lending::id(), + "solend_program", + solend_program::id(), processor!(process_instruction), ); @@ -323,12 +323,12 @@ async fn test_withdraw_too_large() { let mut transaction = Transaction::new_with_payer( &[ refresh_obligation( - spl_token_lending::id(), + solend_program::id(), test_obligation.pubkey, vec![sol_test_reserve.pubkey, usdc_test_reserve.pubkey], ), withdraw_obligation_collateral( - spl_token_lending::id(), + solend_program::id(), WITHDRAW_AMOUNT, sol_test_reserve.collateral_supply_pubkey, sol_test_reserve.user_collateral_pubkey, diff --git a/token-lending/program/tests/withdraw_obligation_collateral_and_redeem_reserve_collateral.rs b/token-lending/program/tests/withdraw_obligation_collateral_and_redeem_reserve_collateral.rs new file mode 100644 index 00000000000..17c2c12c552 --- /dev/null +++ b/token-lending/program/tests/withdraw_obligation_collateral_and_redeem_reserve_collateral.rs @@ -0,0 +1,98 @@ +#![cfg(feature = "test-bpf")] + +mod helpers; + +use helpers::*; +use solana_program_test::*; +use solana_sdk::{pubkey::Pubkey, signature::Keypair}; +use solend_program::processor::process_instruction; + +#[tokio::test] +async fn test_success() { + let mut test = ProgramTest::new( + "solend_program", + solend_program::id(), + processor!(process_instruction), + ); + + // limit to track compute unit increase + test.set_bpf_compute_max_units(70_000); + + let user_accounts_owner = Keypair::new(); + let lending_market = add_lending_market(&mut test); + + let usdc_mint = add_usdc_mint(&mut test); + let usdc_oracle = add_usdc_oracle(&mut test); + let usdc_test_reserve = add_reserve( + &mut test, + &lending_market, + &usdc_oracle, + &user_accounts_owner, + AddReserveArgs { + user_liquidity_amount: 100 * FRACTIONAL_TO_USDC, + liquidity_amount: 10_000 * FRACTIONAL_TO_USDC, + liquidity_mint_decimals: usdc_mint.decimals, + liquidity_mint_pubkey: usdc_mint.pubkey, + config: test_reserve_config(), + mark_fresh: true, + ..AddReserveArgs::default() + }, + ); + + let test_obligation = add_obligation( + &mut test, + &lending_market, + &user_accounts_owner, + AddObligationArgs::default(), + ); + + let (mut banks_client, payer, _recent_blockhash) = test.start().await; + + test_obligation.validate_state(&mut banks_client).await; + + lending_market + .deposit_obligation_and_collateral( + &mut banks_client, + &user_accounts_owner, + &payer, + &usdc_test_reserve, + &test_obligation, + 100 * FRACTIONAL_TO_USDC, + ) + .await; + + let usdc_reserve = usdc_test_reserve.get_state(&mut banks_client).await; + assert_eq!(usdc_reserve.last_update.stale, true); + + let user_liquidity_balance = + get_token_balance(&mut banks_client, usdc_test_reserve.user_liquidity_pubkey).await; + assert_eq!(user_liquidity_balance, 0); + let liquidity_supply = + get_token_balance(&mut banks_client, usdc_test_reserve.liquidity_supply_pubkey).await; + assert_eq!(liquidity_supply, 10_100 * FRACTIONAL_TO_USDC); + + lending_market + .refresh_reserve(&mut banks_client, &payer, &usdc_test_reserve) + .await; + + lending_market + .withdraw_and_redeem_collateral( + &mut banks_client, + &user_accounts_owner, + &payer, + &usdc_test_reserve, + &test_obligation, + 50 * FRACTIONAL_TO_USDC, + ) + .await; + + let usdc_reserve = usdc_test_reserve.get_state(&mut banks_client).await; + assert_eq!(usdc_reserve.last_update.stale, true); + + let user_liquidity_balance = + get_token_balance(&mut banks_client, usdc_test_reserve.user_liquidity_pubkey).await; + assert_eq!(user_liquidity_balance, 50 * FRACTIONAL_TO_USDC); + let liquidity_supply = + get_token_balance(&mut banks_client, usdc_test_reserve.liquidity_supply_pubkey).await; + assert_eq!(liquidity_supply, 10_050 * FRACTIONAL_TO_USDC); +}