diff --git a/.github/workflows/deploy-wallet-at-pr.yml b/.github/workflows/deploy-wallet-at-pr.yml index b0cdf819863..f30938f02d7 100644 --- a/.github/workflows/deploy-wallet-at-pr.yml +++ b/.github/workflows/deploy-wallet-at-pr.yml @@ -16,7 +16,7 @@ jobs: - name: build the site working-directory: ./anoma-wallet - run: CI=false yarn build-with-craco + run: CI=false yarn build - name: Deploy to Netlify uses: nwtgck/actions-netlify@v1.2.3 diff --git a/anoma-lib/Cargo.toml b/anoma-lib/Cargo.toml index 68161bfea93..85da202dd89 100644 --- a/anoma-lib/Cargo.toml +++ b/anoma-lib/Cargo.toml @@ -12,7 +12,8 @@ crate-type = ["cdylib", "rlib"] [dependencies] anoma = { git = "https://github.com/anoma/anoma", tag = "v0.4.0", features = ["rand", "ferveo-tpke"] } -bip39 = "1.0.1" +bip32 = "0.3.0" +bip0039 = "0.6.0" borsh = "0.9.0" ed25519-dalek = {version = "1.0.1", default-features = false, features = ["rand", "u64_backend", "serde"]} serde-wasm-bindgen = "0.3.1" @@ -28,10 +29,11 @@ wasm-bindgen = { version = "0.2.78", features = ["serde-serialize"] } console_error_panic_hook = "0.1.7" js-sys = "0.3.5" chrono = "0.4.0" +bitcoin = "0.27.1" [dependencies.web-sys] version = "0.3" -features = [ "console", "FileReader", "Window" ] +features = [ "console" ] [dev-dependencies] wasm-bindgen-test = "0.3.13" diff --git a/anoma-lib/src/account.rs b/anoma-lib/src/account.rs index 64f14acfd75..1253204e6ae 100644 --- a/anoma-lib/src/account.rs +++ b/anoma-lib/src/account.rs @@ -16,6 +16,7 @@ pub struct Account(pub Transaction); #[wasm_bindgen] impl Account { + /// Initialize an account on the Ledger pub fn init( serialized_keypair: JsValue, token: String, diff --git a/anoma-lib/src/lib.rs b/anoma-lib/src/lib.rs index a60f19de4e0..71b64e20c37 100644 --- a/anoma-lib/src/lib.rs +++ b/anoma-lib/src/lib.rs @@ -2,6 +2,7 @@ use wasm_bindgen::prelude::*; pub mod transfer; pub mod account; +pub mod wallet; mod utils; mod types; diff --git a/anoma-lib/src/wallet.rs b/anoma-lib/src/wallet.rs new file mode 100644 index 00000000000..54c4e6273b6 --- /dev/null +++ b/anoma-lib/src/wallet.rs @@ -0,0 +1,129 @@ +use serde::{Serialize, Deserialize}; +use bip32::{Prefix, XPrv}; +use bitcoin::{ + util::{address::Address, key::PrivateKey}, + ecdsa::PublicKey, + network::constants::Network +}; +use bip0039::{Mnemonic, Seed, Language}; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +#[derive(Serialize, Deserialize)] +pub struct Wallet { + root_key: String, + seed: Vec, + phrase: String, + password: String, +} + +#[wasm_bindgen] +#[derive(Serialize, Deserialize)] +pub struct DerivedAccount { + address: String, + wif: String, + private_key: Vec, + public_key: Vec, + secret: Vec, + public: Vec, +} + +#[wasm_bindgen] +#[derive(Serialize, Deserialize)] +pub struct ExtendedKeys { + xpriv: String, + xpub: String, +} + +#[wasm_bindgen] +impl Wallet { + pub fn new( + phrase: String, + password: String) -> Wallet { + + let mnemonic = Mnemonic::from_phrase(&phrase, Language::English).unwrap(); + let seed = Seed::new(&mnemonic, &password); + let seed: &[u8] = seed.as_bytes(); + + // BIP32 Root Key + let root_xprv = XPrv::new(&seed); + let root_xprv_str = root_xprv.unwrap().to_string(Prefix::XPRV).to_string(); + + Wallet { + phrase, + password, + seed: seed.to_vec(), + root_key: root_xprv_str, + } + } + + /// Derive account from a seed and a path + pub fn derive(&self, path: String) -> DerivedAccount { + let seed: &[u8] = &self.seed; + + // BIP32 Extended Private Key + let xprv = XPrv::derive_from_path(&seed, &path.parse().unwrap()).unwrap(); + + // BIP32 Extended Public Key + let xpub = xprv.public_key(); + + // Address - Public Key to p2pkh (compressed) + let pub_bytes: &[u8] = &xpub.public_key().clone().to_bytes().to_vec(); + let pk = PublicKey::from_slice(pub_bytes); + let address = Address::p2pkh(&pk.unwrap(), Network::Bitcoin); + + // Private Key to WIF (Wallet Import Format) + let prv_bytes: &[u8] = &xprv.private_key().clone().to_bytes().to_vec(); + let prv = PrivateKey::from_slice(&prv_bytes, Network::Bitcoin).unwrap(); + let key = prv.to_wif(); + + // ed25519 keypair + let secret = ed25519_dalek::SecretKey::from_bytes(prv_bytes) + .expect("Could not create secret from bytes"); + let public = ed25519_dalek::PublicKey::from(&secret); + + DerivedAccount { + address: address.to_string(), + wif: key.to_string(), + private_key: xprv.private_key().to_bytes().to_vec(), + public_key: xpub.public_key().to_bytes().to_vec(), + secret: secret.to_bytes().to_vec(), + public: public.to_bytes().to_vec(), + } + } + + /// Get extended keys from path + pub fn get_extended_keys(&self, path: String) -> ExtendedKeys { + let seed: &[u8] = &self.seed; + + // BIP32 Extended Private Key + let xprv = XPrv::derive_from_path(&seed, &path.parse().unwrap()).unwrap(); + let xprv_str = xprv.to_string(Prefix::XPRV).to_string(); + + // BIP32 Extended Public Key + let xpub = xprv.public_key(); + let xpub_str = xpub.to_string(Prefix::XPUB); + + ExtendedKeys { + xpriv: xprv_str, + xpub: xpub_str, + } + } + + /// Get serialized Wallet + pub fn serialize(&self) -> Result { + Ok(JsValue::from_serde(&self).expect("Wallet should serialize correctly")) + } + + /// Get serialized extended keys + pub fn extended_keys(&self, path: String) -> Result { + let keys = &self.get_extended_keys(path); + Ok(JsValue::from_serde(&keys).unwrap()) + } + + /// Get serialized derived account + pub fn account(&self, path: String) -> Result { + let keys = &self.derive(path); + Ok(JsValue::from_serde(&keys).unwrap()) + } +} diff --git a/anoma-wallet/package.json b/anoma-wallet/package.json index f513b325e85..949c717f937 100644 --- a/anoma-wallet/package.json +++ b/anoma-wallet/package.json @@ -11,6 +11,7 @@ "@cosmjs/tendermint-rpc": "^0.27.1", "bn.js": "^5.2.0", "borsh": "^0.7.0", + "bs58": "^5.0.0", "buffer": "^6.0.3", "framer-motion": "^6.2.8", "path": "^0.12.7", @@ -18,23 +19,21 @@ "react-dom": "^17.0.2", "react-router-dom": "6", "react-scripts": "5.0.0", + "slip44": "^1.2.24", "stream": "^0.0.2", "styled-components": "^5.3.3", "typescript": "^4.5.5", - "wasm-react-scripts": "^5.0.2", "web-vitals": "^2.1.4" }, "scripts": { - "start": "npx wasm-react-scripts start", - "start-with-craco": "craco start", + "start": "craco start", "start:local": "REACT_APP_LOCAL=\"true\" yarn start", "wasm:build": "wasm-pack build ../anoma-lib/ --out-dir ../anoma-wallet/src/lib/anoma --out-name anoma --target web", "wasm:build:node": "wasm-pack build ../anoma-lib/ --out-dir ../anoma-wallet/src/lib/anoma --out-name anoma --target nodejs", - "build": "npx wasm-react-scripts build", - "build-with-craco": "craco build", + "build": "craco build", "lint": "npx eslint src --ext .ts,.tsx", "lint:fix": "yarn lint -- --fix", - "test": "yarn wasm:build:node && npx wasm-react-scripts test", + "test": "yarn wasm:build:node && npx create-react-scripts test", "eject": "npx react-scripts eject" }, "eslintConfig": { @@ -67,6 +66,7 @@ "@types/react-dom": "^17.0.11", "@types/styled-components": "^5.1.22", "babel-plugin-styled-components": "^2.0.3", + "create-react-scripts": "^0.1.6", "eslint": "^8.9.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^8.4.0", diff --git a/anoma-wallet/src/App/App.tsx b/anoma-wallet/src/App/App.tsx index 355541db687..ba8c562dd93 100644 --- a/anoma-wallet/src/App/App.tsx +++ b/anoma-wallet/src/App/App.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ import React from "react"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import { TopNavigation } from "./TopNavigation"; diff --git a/anoma-wallet/src/constants/index.ts b/anoma-wallet/src/constants/index.ts index 265708eb309..5b5aae74686 100644 --- a/anoma-wallet/src/constants/index.ts +++ b/anoma-wallet/src/constants/index.ts @@ -1,3 +1,3 @@ -export { type Token, TokenType, Tokens } from "./tokens"; +export { type TokenType, Tokens } from "./tokens"; export { TxResponse } from "./tx"; export { TxWasm, VpWasm } from "./wasm"; diff --git a/anoma-wallet/src/constants/tokens.ts b/anoma-wallet/src/constants/tokens.ts index 58f8c5aee49..29231db8ec1 100644 --- a/anoma-wallet/src/constants/tokens.ts +++ b/anoma-wallet/src/constants/tokens.ts @@ -1,42 +1,45 @@ -/* eslint-disable max-len */ -export enum TokenType { - XAN, - BTC, - ETH, - DOT, -} - -export type Token = { +import { registeredCoinTypes, RegisteredCoinType } from "slip44"; + +export type TokenType = "BTC" | "LTC" | "ETH" | "DOT"; + +type TokenInfo = { symbol: string; - name: string; - address: string; + type: number; + path: number; + coin: string; + url: string; + address?: string; }; -// TODO: We need to have token addresses for the livenet. Currently, only -// testnet token addresses are listed below: -export const Tokens: Record = { - [TokenType.XAN]: { - symbol: "XAN", - name: "Anoma", - address: - "atest1v4ehgw36x3prswzxggunzv6pxqmnvdj9xvcyzvpsggeyvs3cg9qnywf589qnwvfsg5erg3fkl09rg5", - }, - [TokenType.BTC]: { - symbol: "BTC", - name: "Bitcoin", - address: - "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp", - }, - [TokenType.ETH]: { - symbol: "ETH", - name: "Ethereum", - address: - "atest1v4ehgw36xqmr2d3nx3ryvd2xxgmrq33j8qcns33sxezrgv6zxdzrydjrxveygd2yxumrsdpsf9jc2p", - }, - [TokenType.DOT]: { - symbol: "DOT", - name: "Polkadot", - address: - "atest1v4ehgw36gg6nvs2zgfpyxsfjgc65yv6pxy6nwwfsxgungdzrggeyzv35gveyxsjyxymyz335hur2jn", - }, +type Tokens = { + [key: string]: TokenInfo; }; + +// Declare symbols for tokens we support: +const SYMBOLS = ["BTC", "LTC", "ETH", "DOT"]; + +export const Tokens: Tokens = registeredCoinTypes + .filter(([, , symbol]) => { + return SYMBOLS.indexOf(`${symbol}`) > -1; + }) + .reduce((tokens: Tokens, coinType: RegisteredCoinType) => { + const [type, path, symbol, coin, url] = coinType; + + tokens[symbol as TokenType] = { + type, + path, + symbol, + coin, + url, + } as TokenInfo; + + return tokens; + }, {}); + +// Map a few test addresses for now: +Tokens["BTC"].address = + "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp"; +Tokens["ETH"].address = + "atest1v4ehgw36xqmr2d3nx3ryvd2xxgmrq33j8qcns33sxezrgv6zxdzrydjrxveygd2yxumrsdpsf9jc2p"; +Tokens["DOT"].address = + "atest1v4ehgw36gg6nvs2zgfpyxsfjgc65yv6pxy6nwwfsxgungdzrggeyzv35gveyxsjyxymyz335hur2jn"; diff --git a/anoma-wallet/src/lib/AnomaClient.ts b/anoma-wallet/src/lib/AnomaClient.ts index 7ed67544f03..69268f3c67b 100644 --- a/anoma-wallet/src/lib/AnomaClient.ts +++ b/anoma-wallet/src/lib/AnomaClient.ts @@ -1,4 +1,4 @@ -import init, { Address, Keypair, Transfer, Account } from "lib/anoma"; +import init, { Address, Keypair, Transfer, Account, Wallet } from "lib/anoma"; class AnomaClient { public memory: WebAssembly.Memory | null = null; @@ -8,6 +8,7 @@ class AnomaClient { public readonly keypair = Keypair; public readonly transfer = Transfer; public readonly account = Account; + public readonly wallet = Wallet; public async init(): Promise { const _init = @@ -21,4 +22,11 @@ class AnomaClient { } } +// Alias types to avoid conflicts with classes +export type AddressType = Address; +export type KeypairType = Keypair; +export type TransferType = Transfer; +export type AccountType = Account; +export type WalletType = Wallet; + export default AnomaClient; diff --git a/anoma-wallet/src/lib/Wallet.test.ts b/anoma-wallet/src/lib/Wallet.test.ts new file mode 100644 index 00000000000..44f7549ca06 --- /dev/null +++ b/anoma-wallet/src/lib/Wallet.test.ts @@ -0,0 +1,149 @@ +import { fromHex, toHex } from "@cosmjs/encoding"; +import { Tokens } from "constants/"; +import Wallet from "./Wallet"; +import AnomaClient from "./AnomaClient"; + +const MNEMONIC_24 = + // eslint-disable-next-line max-len + "caught pig embody hip goose like become worry face oval manual flame pizza steel viable proud eternal speed chapter sunny boat because view bullet"; + +describe("Wallet class", () => { + test("It should derive the correct public keys from mnemonic", async () => { + const walletBtc = await new Wallet(MNEMONIC_24, "BTC").init(); + const child1 = walletBtc.new(0); + const child2 = walletBtc.new(1); + + expect(child1.publicKey).toBe( + "02ac3900403f7d59537edb3694abbdb7f9d334f4fe64ba27dc6b41dc7e298d0dc6" + ); + expect(child2.publicKey).toBe( + "02a2bfde72171d5e78f23e9bf91a3a40493ba0685281afaa93f9d8222dec923d80" + ); + + const walletEth = await new Wallet(MNEMONIC_24, "ETH").init(); + const child3 = walletEth.new(0); + const child4 = walletEth.new(1); + const child5 = walletEth.new(2); + + expect(child3.publicKey).toBe( + "0332331c814be320962dcfeea877e489b0c34c4ab72ac8970c42fb7fedc5e0c437" + ); + expect(child4.publicKey).toBe( + "037cd72f4365235646e0864a3fd4835cec554940facbdb8ed1dee5d19aad0664b0" + ); + expect(child5.publicKey).toBe( + "038a6d7ef037260bf6f362e0c530b041d99be2c3283e529f18a5e5e76875cd052a" + ); + }); + + test("Derives the correct addresses and private key WIFs from mnemonic", async () => { + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + const child1 = wallet.new(0); + const child2 = wallet.new(1); + const { address: address1, wif: wif1 } = child1; + const { address: address2, wif: wif2 } = child2; + + expect(address1).toBe("1Lj43YSQ47b22oRL37LBEmEeMC7nLT3fEb"); + expect(wif1).toBe("L4DrSoPAR7tNrfx91GGejYiGnzEYWfvBhg7BmeLeUPs6QEzpzM6g"); + + expect(address2).toBe("17cwJyBe3WMVZwdyMbuZcxX3zcVR4By7h6"); + expect(wif2).toBe("L41p9JoMKCuiF3ro4cihMusszpCCrENM36NWFoEo3sKGeSq9epvH"); + }); + + test("Wallet should return correct BIP39 hexadecimal seed from mnemonic", async () => { + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + expect(wallet.seed).toBe( + // eslint-disable-next-line max-len + "b240a0a82144543f0089791d422f7b244026a0ec5d26359da9772a99bc50d195335cfba896dc464ee61098a055f87352b77e60703aeee63f59ef00faa3a9a6ae" + ); + }); + + test("Wallet should produce the correct BIP32 Root Key", async () => { + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + const { root_key } = wallet.serialized; + + // Bip32 Root Key + expect(root_key).toBe( + // eslint-disable-next-line max-len + "xprv9s21ZrQH143K2nNmvrGtqZCbH6yQuqeH3r8vnQwpREXdvUYn6q52CcLryyzXn7fP6CLqct57zWGdXaYWwPTZh6DhdSeriaNSD8FNZpjCjYC" + ); + }); + + test("Wallet should generate the correct Account Extended Keys", async () => { + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + const { xpriv, xpub } = wallet.account; + + expect(xpriv).toBe( + // eslint-disable-next-line max-len + "xprv9xg3gheKiCPMDqi2SQcAKxJeseeZA9axa44mpErUcgYaU8bLitnb9MpD84K2xF6Ju2kkWtNKP1PvvvAiq8aN3CwR58pJjdWQXQRa769U6sJ" + ); + expect(xpub).toBe( + // eslint-disable-next-line max-len + "xpub6BfQ6DBDYZweSKnVYS9Ah6FPRgV3ZcJowGzNcdG6B25ZLvvVGS6qhA8gyMbqewueUu4sLk2CEPUwFTst1UMcyfm83VQUAQFLXC3AxRLXTEL" + ); + }); + + test("Wallet should generate the correct BIP32 Extended Keys", async () => { + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + const { xpriv, xpub } = wallet.extended; + + // Bip32 Extended Private Key + expect(xpriv).toBe( + // eslint-disable-next-line max-len + "xprv9zjJ1S9riY38bWqL7oGqdXi6r5E35grYZSxiyQB1zwBey3PJXo4wXZhv19YDL7Km23wzG3PCnNdUGsntEcFrVFqNoKYD5NA2tYZTvgt9Fjx" + ); + // Bip32 Extended Public Key + expect(xpub).toBe( + // eslint-disable-next-line max-len + "xpub6DieQwgkYubRozuoDpoqzfeqQ74XV9aPvftKmnadZGidqqiT5LPC5N2PrS8KYaoLMk851qkp3JbnveTtmSXRGyoRwhT5QSMiko3mek4ZsWH" + ); + }); + + test("Wallet.makePath should return a correct base derivation path", () => { + const expectedBtc = "m/44'/0'/0'/0"; + const pathBtc = Wallet.makePath({ type: Tokens["BTC"].type, change: 0 }); + expect(pathBtc).toBe(expectedBtc); + + const expectedEth = "m/44'/60'/0'/0"; + const pathEth = Wallet.makePath({ type: Tokens["ETH"].type, change: 0 }); + expect(pathEth).toBe(expectedEth); + + const expected = "m/44'/60'/1'/1"; + const path = Wallet.makePath({ + type: Tokens["ETH"].type, + account: 1, + change: 1, + }); + expect(path).toBe(expected); + }); + + test("Can override the default encoding for private/public keys", async () => { + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + const child = wallet.new(0, "base58"); + const { publicKey, privateKey } = child; + + expect(publicKey).toBe("o3vH5artnxqVVJw4NnBAs5qZMrXELqJqqp3P4KbK7ERs"); + expect(privateKey).toBe("F4bWCLdKybk4DGtphKo1DCKTVQTryEzMMcLFGmatNUhW"); + }); + + test("ed25519 keypair can be serialized from derived account", async () => { + const { keypair } = await new AnomaClient().init(); + const wallet = await new Wallet(MNEMONIC_24, "BTC").init(); + const child = wallet.new(0); + const { secret, public: pub } = child; + + // The following will fail if there is a signature error: + const deserializedKeypair = keypair.deserialize({ + secret: fromHex(secret), + public: fromHex(pub), + }); + const serializedKeypair = deserializedKeypair.serialize(); + + expect(toHex(serializedKeypair.public)).toBe( + "ab39c3edf24f6ee00138a2d10595f4e5abbddac2ee80922e4aef55dc76efc9fa" + ); + expect(toHex(serializedKeypair.secret)).toBe( + "d0ef5f5af3b148b0e902a5c79a6b5e85e5d67582d43fd1e25a1e46d20d1d6d91" + ); + }); +}); diff --git a/anoma-wallet/src/lib/Wallet.ts b/anoma-wallet/src/lib/Wallet.ts new file mode 100644 index 00000000000..8ae21ac3f7e --- /dev/null +++ b/anoma-wallet/src/lib/Wallet.ts @@ -0,0 +1,203 @@ +import { toHex } from "@cosmjs/encoding"; +import base58 from "bs58"; +import { Tokens, TokenType } from "constants/"; +import AnomaClient, { WalletType } from "./AnomaClient"; + +type Encoding = "hex" | "base58" | null; + +export type DerivedAccount = { + address: string; + wif: string; + privateKey: string | Uint8Array; + publicKey: string | Uint8Array; + secret: string; + public: string; +}; + +export type ExtendedKeys = { + xpriv: string; + xpub: string; +}; + +type PathOptions = { + type: number; + account?: number; + change?: number; + index?: string; +}; + +// Serialized Wallet data from WASM +type WalletData = { + root_key: string; + seed: number[]; + phrase: string; + password: string; +}; + +// Serialized Derived Account data from WASM +type DerivedAccountData = { + address: string; + wif: string; + private_key: Uint8Array; + public_key: Uint8Array; + // ed25519 secret & public + secret: Uint8Array; + public: Uint8Array; +}; + +class Wallet { + private _mnemonic: string; + private _wallet: WalletType | undefined; + private _tokenType: TokenType; + + constructor(mnemonic: string, token: TokenType) { + this._mnemonic = mnemonic; + this._tokenType = token; + } + + public async init(): Promise { + const anoma = await new AnomaClient().init(); + + this._wallet = anoma.wallet.new(this._mnemonic, ""); + return this; + } + + /** + * Derive a new child account using mnemonic. This + * uses hardened address by default. + * + * NOTE: A "child" account is represented as a + * set of Bip32 keys derived from our root account. + */ + public new( + index: number, + encoding: Encoding = "hex", + isHardened = true + ): DerivedAccount { + const { type } = Tokens[this._tokenType]; + const path = Wallet.makePath({ + type, + index: `${index}${isHardened ? "'" : ""}`, + }); + + const childAccount: DerivedAccountData = this._wallet?.account(path); + const { + address, + wif, + private_key: privateKey, + public_key: publicKey, + secret, + public: pk, + } = childAccount; + + let encodedPrivateKey; + let encodedPublicKey; + + switch (encoding) { + case "hex": { + encodedPrivateKey = toHex(privateKey); + encodedPublicKey = toHex(publicKey); + break; + } + case "base58": { + encodedPrivateKey = base58.encode(privateKey); + encodedPublicKey = base58.encode(publicKey); + break; + } + default: { + encodedPrivateKey = privateKey; + encodedPublicKey = publicKey; + } + } + + const child: DerivedAccount = { + address, + wif, + privateKey: encodedPrivateKey, + publicKey: encodedPublicKey, + secret: toHex(secret), + public: toHex(pk), + }; + + return child; + } + + /** + * Get Account Extended Private and Public Keys + */ + public get account(): ExtendedKeys { + const { type } = Tokens[this._tokenType]; + const path = Wallet.makePath({ type }); + const { xpriv, xpub }: ExtendedKeys = this._wallet?.extended_keys(path); + + return { + xpriv, + xpub, + }; + } + + /** + * Get Bip32 Extended Private and Public keys + */ + public get extended(): ExtendedKeys { + const { type } = Tokens[this._tokenType]; + const path = Wallet.makePath({ + type, + change: 0, + }); + const { xpriv, xpub }: ExtendedKeys = this._wallet?.extended_keys(path); + + return { + xpriv, + xpub, + }; + } + + /** + * Get serialized Wallet struct data + */ + public get serialized(): WalletData { + return this._wallet?.serialize(); + } + + /** + * Get seed as a hexadecimal value + */ + public get seed(): string { + const wallet = this._wallet?.serialize(); + return toHex(new Uint8Array(wallet.seed)); + } + + /** + * Creates a derivation path: m/44'/0'/0'/0 + * The index can be passed to the wasm to generate sub-accounts: + * - m/44'/0'/0'/0/0' + * - m/44'/0'/0'/0/1' + * - m/44'/0'/0'/0/2', etc. + * + * "change" can be omitted if wanting to generate Account-level + * keys, e.g., a path of m/44'/0'/0' + * + * NOTE: + * 0 = 0, + * 0' = 2147483648 + */ + public static makePath({ + type = 0, + account = 0, + change, + index, + }: PathOptions): string { + let path = `m/44'/${type}'/${account}'`; + + if (index) { + path += `/${change ? change : 0}/${index}`; + } else if (typeof change === "number") { + path += `/${change}`; + } + + return path; + } +} + +export default Wallet; diff --git a/anoma-wallet/src/lib/anoma/anoma.d.ts b/anoma-wallet/src/lib/anoma/anoma.d.ts index eec7d1b3487..2d420242d0e 100644 --- a/anoma-wallet/src/lib/anoma/anoma.d.ts +++ b/anoma-wallet/src/lib/anoma/anoma.d.ts @@ -6,6 +6,7 @@ export function run(): void; export class Account { free(): void; /** +* Initialize an account on the Ledger * @param {any} serialized_keypair * @param {string} token * @param {number} epoch @@ -38,6 +39,16 @@ export class Address { } /** */ +export class DerivedAccount { + free(): void; +} +/** +*/ +export class ExtendedKeys { + free(): void; +} +/** +*/ export class Keypair { free(): void; /** @@ -77,6 +88,46 @@ export class Tx { } /** */ +export class Wallet { + free(): void; +/** +* @param {string} phrase +* @param {string} password +* @returns {Wallet} +*/ + static new(phrase: string, password: string): Wallet; +/** +* Derive account from a seed and a path +* @param {string} path +* @returns {DerivedAccount} +*/ + derive(path: string): DerivedAccount; +/** +* Get extended keys from path +* @param {string} path +* @returns {ExtendedKeys} +*/ + get_extended_keys(path: string): ExtendedKeys; +/** +* Get serialized Wallet +* @returns {any} +*/ + serialize(): any; +/** +* Get serialized extended keys +* @param {string} path +* @returns {any} +*/ + extended_keys(path: string): any; +/** +* Get serialized derived account +* @param {string} path +* @returns {any} +*/ + account(path: string): any; +} +/** +*/ export class WrapperTx { free(): void; } @@ -85,6 +136,21 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl export interface InitOutput { readonly memory: WebAssembly.Memory; + readonly __wbg_wallet_free: (a: number) => void; + readonly __wbg_derivedaccount_free: (a: number) => void; + readonly __wbg_extendedkeys_free: (a: number) => void; + readonly wallet_new: (a: number, b: number, c: number, d: number) => number; + readonly wallet_derive: (a: number, b: number, c: number) => number; + readonly wallet_get_extended_keys: (a: number, b: number, c: number) => number; + readonly wallet_serialize: (a: number, b: number) => void; + readonly wallet_extended_keys: (a: number, b: number, c: number, d: number) => void; + readonly wallet_account: (a: number, b: number, c: number, d: number) => void; + readonly __wbg_address_free: (a: number) => void; + readonly address_encoded: (a: number, b: number) => void; + readonly address_from_keypair: (a: number) => number; + readonly address_decode: (a: number, b: number, c: number) => void; + readonly account_init: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => void; + readonly run: () => void; readonly __wbg_tx_free: (a: number) => void; readonly __wbg_wrappertx_free: (a: number) => void; readonly __wbg_keypair_free: (a: number) => void; @@ -92,12 +158,10 @@ export interface InitOutput { readonly keypair_deserialize: (a: number, b: number) => void; readonly keypair_to_bytes: (a: number, b: number) => void; readonly transfer_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number) => void; - readonly __wbg_address_free: (a: number) => void; - readonly address_encoded: (a: number, b: number) => void; - readonly address_from_keypair: (a: number) => number; - readonly address_decode: (a: number, b: number, c: number) => void; - readonly account_init: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => void; - readonly run: () => void; + readonly rustsecp256k1_v0_4_1_context_create: (a: number) => number; + readonly rustsecp256k1_v0_4_1_context_destroy: (a: number) => void; + readonly rustsecp256k1_v0_4_1_default_illegal_callback_fn: (a: number, b: number) => void; + readonly rustsecp256k1_v0_4_1_default_error_callback_fn: (a: number, b: number) => void; readonly __wbindgen_malloc: (a: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number) => number; readonly __wbindgen_add_to_stack_pointer: (a: number) => number; diff --git a/anoma-wallet/src/lib/anoma/anoma.js b/anoma-wallet/src/lib/anoma/anoma.js index bb122172099..168ae0dc352 100644 --- a/anoma-wallet/src/lib/anoma/anoma.js +++ b/anoma-wallet/src/lib/anoma/anoma.js @@ -186,8 +186,11 @@ function debugString(val) { return className; } -function getArrayU8FromWasm0(ptr, len) { - return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +function _assertClass(instance, klass) { + if (!(instance instanceof klass)) { + throw new Error(`expected instance of ${klass.name}`); + } + return instance.ptr; } function passArray8ToWasm0(arg, malloc) { @@ -196,19 +199,16 @@ function passArray8ToWasm0(arg, malloc) { WASM_VECTOR_LEN = arg.length; return ptr; } - -function _assertClass(instance, klass) { - if (!(instance instanceof klass)) { - throw new Error(`expected instance of ${klass.name}`); - } - return instance.ptr; -} /** */ export function run() { wasm.run(); } +function getArrayU8FromWasm0(ptr, len) { + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} + function handleError(f, args) { try { return f.apply(this, args); @@ -231,6 +231,7 @@ export class Account { wasm.__wbg_account_free(ptr); } /** + * Initialize an account on the Ledger * @param {any} serialized_keypair * @param {string} token * @param {number} epoch @@ -332,6 +333,52 @@ export class Address { } /** */ +export class DerivedAccount { + + static __wrap(ptr) { + const obj = Object.create(DerivedAccount.prototype); + obj.ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.ptr; + this.ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_derivedaccount_free(ptr); + } +} +/** +*/ +export class ExtendedKeys { + + static __wrap(ptr) { + const obj = Object.create(ExtendedKeys.prototype); + obj.ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.ptr; + this.ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_extendedkeys_free(ptr); + } +} +/** +*/ export class Keypair { static __wrap(ptr) { @@ -464,6 +511,127 @@ export class Tx { } /** */ +export class Wallet { + + static __wrap(ptr) { + const obj = Object.create(Wallet.prototype); + obj.ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.ptr; + this.ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_wallet_free(ptr); + } + /** + * @param {string} phrase + * @param {string} password + * @returns {Wallet} + */ + static new(phrase, password) { + var ptr0 = passStringToWasm0(phrase, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + var ptr1 = passStringToWasm0(password, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + var ret = wasm.wallet_new(ptr0, len0, ptr1, len1); + return Wallet.__wrap(ret); + } + /** + * Derive account from a seed and a path + * @param {string} path + * @returns {DerivedAccount} + */ + derive(path) { + var ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + var ret = wasm.wallet_derive(this.ptr, ptr0, len0); + return DerivedAccount.__wrap(ret); + } + /** + * Get extended keys from path + * @param {string} path + * @returns {ExtendedKeys} + */ + get_extended_keys(path) { + var ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + var ret = wasm.wallet_get_extended_keys(this.ptr, ptr0, len0); + return ExtendedKeys.__wrap(ret); + } + /** + * Get serialized Wallet + * @returns {any} + */ + serialize() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wallet_serialize(retptr, this.ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Get serialized extended keys + * @param {string} path + * @returns {any} + */ + extended_keys(path) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + var ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + wasm.wallet_extended_keys(retptr, this.ptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Get serialized derived account + * @param {string} path + * @returns {any} + */ + account(path) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + var ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + wasm.wallet_account(retptr, this.ptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} +/** +*/ export class WrapperTx { __destroy_into_raw() { @@ -519,23 +687,23 @@ async function init(input) { imports.wbg.__wbindgen_object_drop_ref = function(arg0) { takeObject(arg0); }; - imports.wbg.__wbindgen_json_parse = function(arg0, arg1) { - var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - var ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; imports.wbg.__wbindgen_is_object = function(arg0) { const val = getObject(arg0); var ret = typeof(val) === 'object' && val !== null; return ret; }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + var ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; imports.wbg.__wbindgen_object_clone_ref = function(arg0) { var ret = getObject(arg0); return addHeapObject(ret); }; + imports.wbg.__wbindgen_json_parse = function(arg0, arg1) { + var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; imports.wbg.__wbindgen_is_null = function(arg0) { var ret = getObject(arg0) === null; return ret; diff --git a/anoma-wallet/src/lib/anoma/anoma_bg.wasm b/anoma-wallet/src/lib/anoma/anoma_bg.wasm index 5e47b9580e6..426263dbd3d 100644 Binary files a/anoma-wallet/src/lib/anoma/anoma_bg.wasm and b/anoma-wallet/src/lib/anoma/anoma_bg.wasm differ diff --git a/anoma-wallet/src/lib/anoma/anoma_bg.wasm.d.ts b/anoma-wallet/src/lib/anoma/anoma_bg.wasm.d.ts index e9854d4cb73..bedccaab752 100644 --- a/anoma-wallet/src/lib/anoma/anoma_bg.wasm.d.ts +++ b/anoma-wallet/src/lib/anoma/anoma_bg.wasm.d.ts @@ -1,6 +1,21 @@ /* tslint:disable */ /* eslint-disable */ export const memory: WebAssembly.Memory; +export function __wbg_wallet_free(a: number): void; +export function __wbg_derivedaccount_free(a: number): void; +export function __wbg_extendedkeys_free(a: number): void; +export function wallet_new(a: number, b: number, c: number, d: number): number; +export function wallet_derive(a: number, b: number, c: number): number; +export function wallet_get_extended_keys(a: number, b: number, c: number): number; +export function wallet_serialize(a: number, b: number): void; +export function wallet_extended_keys(a: number, b: number, c: number, d: number): void; +export function wallet_account(a: number, b: number, c: number, d: number): void; +export function __wbg_address_free(a: number): void; +export function address_encoded(a: number, b: number): void; +export function address_from_keypair(a: number): number; +export function address_decode(a: number, b: number, c: number): void; +export function account_init(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number): void; +export function run(): void; export function __wbg_tx_free(a: number): void; export function __wbg_wrappertx_free(a: number): void; export function __wbg_keypair_free(a: number): void; @@ -8,12 +23,10 @@ export function keypair_serialize(a: number): number; export function keypair_deserialize(a: number, b: number): void; export function keypair_to_bytes(a: number, b: number): void; export function transfer_new(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number): void; -export function __wbg_address_free(a: number): void; -export function address_encoded(a: number, b: number): void; -export function address_from_keypair(a: number): number; -export function address_decode(a: number, b: number, c: number): void; -export function account_init(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number): void; -export function run(): void; +export function rustsecp256k1_v0_4_1_context_create(a: number): number; +export function rustsecp256k1_v0_4_1_context_destroy(a: number): void; +export function rustsecp256k1_v0_4_1_default_illegal_callback_fn(a: number, b: number): void; +export function rustsecp256k1_v0_4_1_default_error_callback_fn(a: number, b: number): void; export function __wbindgen_malloc(a: number): number; export function __wbindgen_realloc(a: number, b: number, c: number): number; export function __wbindgen_add_to_stack_pointer(a: number): number; diff --git a/anoma-wallet/src/lib/index.ts b/anoma-wallet/src/lib/index.ts index ed88b4c743b..130c15f6899 100644 --- a/anoma-wallet/src/lib/index.ts +++ b/anoma-wallet/src/lib/index.ts @@ -4,3 +4,4 @@ export { default as AnomaClient } from "lib/AnomaClient"; export { default as Account } from "lib/tx/Account"; export { default as Transfer } from "lib/tx/Transfer"; export { default as Keypair } from "lib/Keypair"; +export { default as Wallet } from "lib/Wallet"; diff --git a/anoma-wallet/src/lib/tx/Account.ts b/anoma-wallet/src/lib/tx/Account.ts index f5242deb55d..711b6e4b09d 100644 --- a/anoma-wallet/src/lib/tx/Account.ts +++ b/anoma-wallet/src/lib/tx/Account.ts @@ -1,5 +1,5 @@ import { AnomaClient, Keypair } from "lib"; -import { Tokens, TokenType, TxWasm, VpWasm } from "constants/"; +import { Tokens, TxWasm, VpWasm } from "constants/"; class Account { private _txCode: Uint8Array | undefined; @@ -22,7 +22,7 @@ class Account { } public async initialize({ - token = Tokens[TokenType.XAN].address, + token = Tokens["BTC"].address || "", publicKey, privateKey, epoch, diff --git a/anoma-wallet/yarn.lock b/anoma-wallet/yarn.lock index 57dace0b575..5729d7cd949 100644 --- a/anoma-wallet/yarn.lock +++ b/anoma-wallet/yarn.lock @@ -2401,6 +2401,11 @@ acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +address@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" + integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg== + address@^1.0.1, address@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -2468,6 +2473,11 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2480,6 +2490,16 @@ ansi-html-community@^0.0.8: resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -2490,6 +2510,11 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2552,6 +2577,11 @@ aria-query@^5.0.0: resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2573,6 +2603,16 @@ array-includes@^3.1.3, array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -2662,6 +2702,15 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +babel-code-frame@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" @@ -2833,6 +2882,11 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -2935,7 +2989,7 @@ borsh@^0.7.0: bs58 "^4.0.0" text-encoding-utf-8 "^1.0.2" -brace-expansion@^1.1.7: +brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== @@ -2985,6 +3039,13 @@ bs58@^4.0.0: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3086,6 +3147,17 @@ case-sensitive-paths-webpack-plugin@^2.4.0: resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== +chalk@1.1.3, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3126,6 +3198,11 @@ charcodes@^0.2.0: resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + check-types@^11.1.1: version "11.1.2" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" @@ -3181,6 +3258,18 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3344,13 +3433,6 @@ cookie@0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - core-js-compat@^3.20.2, core-js-compat@^3.21.0: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" @@ -3427,6 +3509,13 @@ create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-react-scripts@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/create-react-scripts/-/create-react-scripts-0.1.6.tgz#3d43b9347222e8f6c52a2021974e747f441d53d6" + integrity sha1-PUO5NHIi6PbFKiAhl050f0QdU9Y= + dependencies: + react-dev-utils "^4.0.1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -3439,6 +3528,15 @@ cross-fetch@^3.0.4: dependencies: node-fetch "2.6.7" +cross-spawn@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -3687,7 +3785,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@2.6.9, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.6.0, debug@^2.6.6, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3701,7 +3799,7 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: dependencies: ms "2.1.2" -debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: +debug@^3.1.1, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -3808,6 +3906,14 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +detect-port-alt@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.3.tgz#a4d2f061d757a034ecf37c514260a98750f2b131" + integrity sha1-pNLwYddXoDTs83xRQmCph1DysTE= + dependencies: + address "^1.0.1" + debug "^2.6.0" + detect-port-alt@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" @@ -3974,7 +4080,7 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -duplexer@^0.1.2: +duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -4060,13 +4166,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -errno@^0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4131,7 +4230,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -4461,6 +4560,13 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + integrity sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI= + dependencies: + original ">=0.0.5" + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -4481,6 +4587,13 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + expect@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" @@ -4527,6 +4640,15 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -4560,7 +4682,7 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@^0.11.3: +faye-websocket@^0.11.3, faye-websocket@~0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== @@ -4574,6 +4696,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -4596,6 +4725,11 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" +filesize@3.5.11: + version "3.5.11" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" + integrity sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g== + filesize@^8.0.6: version "8.0.7" resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" @@ -4858,6 +4992,15 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@1.0.0, global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -4865,6 +5008,17 @@ global-modules@^2.0.0: dependencies: global-prefix "^3.0.0" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" @@ -4910,6 +5064,13 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +gzip-size@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + integrity sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA= + dependencies: + duplexer "^0.1.1" + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -4927,6 +5088,13 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -5011,6 +5179,13 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: dependencies: react-is "^16.7.0" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -5150,7 +5325,7 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.17: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5196,11 +5371,6 @@ ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - immer@^9.0.7: version "9.0.12" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.12.tgz#2d33ddf3ee1d247deab9d707ca472c8c942a0f20" @@ -5250,11 +5420,31 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.5: +ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +inquirer@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -5343,6 +5533,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -5420,6 +5615,11 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-root@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" + integrity sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU= + is-root@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" @@ -5461,10 +5661,15 @@ is-weakref@^1.0.1: dependencies: call-bind "^1.0.2" -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.2.0: version "2.2.0" @@ -5985,6 +6190,11 @@ js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -6073,6 +6283,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + json5@2.x, json5@^2.1.2, json5@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" @@ -6096,6 +6311,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonpointer@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" @@ -6136,30 +6356,6 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" -less-loader@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" - integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== - dependencies: - klona "^2.0.4" - -less@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0" - integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^2.5.2" - source-map "~0.6.0" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -6286,7 +6482,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.3.0, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6305,6 +6501,14 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -6324,14 +6528,6 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.4" -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -6427,11 +6623,16 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.51.0" -mime@1.6.0, mime@^1.4.1: +mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -6459,6 +6660,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= +minimatch@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + integrity sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q= + dependencies: + brace-expansion "^1.0.0" + minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -6513,6 +6721,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + nanoid@^3.2.0: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" @@ -6523,15 +6736,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.5.2: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -6719,6 +6923,13 @@ once@^1.3.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -6735,6 +6946,13 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +opn@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + integrity sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg== + dependencies: + is-wsl "^1.1.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -6759,6 +6977,18 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +original@>=0.0.5: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -6858,10 +7088,10 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse5@6.0.1: version "6.0.1" @@ -6955,11 +7185,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pirates@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -7612,10 +7837,10 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.33: version "1.8.0" @@ -7637,6 +7862,11 @@ qs@6.9.7: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -7718,6 +7948,30 @@ react-dev-utils@^12.0.0: strip-ansi "^6.0.1" text-table "^0.2.0" +react-dev-utils@^4.0.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-4.2.3.tgz#5b42d9ea58d5e9e017a2f57a40a8af408a3a46fb" + integrity sha512-uvmkwl5uMexCmC0GUv1XGQP0YjfYePJufGg4YYiukhqk2vN1tQxwWJIBERqhOmSi80cppZg8mZnPP/kOMf1sUQ== + dependencies: + address "1.0.3" + babel-code-frame "6.26.0" + chalk "1.1.3" + cross-spawn "5.1.0" + detect-port-alt "1.1.3" + escape-string-regexp "1.0.5" + filesize "3.5.11" + global-modules "1.0.0" + gzip-size "3.0.0" + inquirer "3.3.0" + is-root "1.0.0" + opn "5.1.0" + react-error-overlay "^3.0.0" + recursive-readdir "2.2.1" + shell-quote "1.6.1" + sockjs-client "1.1.4" + strip-ansi "3.0.1" + text-table "0.2.0" + react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -7727,6 +7981,11 @@ react-dom@^17.0.2: object-assign "^4.1.1" scheduler "^0.20.2" +react-error-overlay@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-3.0.0.tgz#c2bc8f4d91f1375b3dad6d75265d51cd5eeaf655" + integrity sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw== + react-error-overlay@^6.0.10: version "6.0.10" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" @@ -7859,6 +8118,13 @@ readonly-date@^1.0.0: resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== +recursive-readdir@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" + integrity sha1-kO8jHQd4xc4JPJpI105cVCLROpk= + dependencies: + minimatch "3.0.3" + recursive-readdir@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -7978,6 +8244,14 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-dir@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -8021,6 +8295,14 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -8063,6 +8345,11 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -8070,6 +8357,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8098,7 +8397,7 @@ sass-loader@^12.3.0: klona "^2.0.4" neo-async "^2.6.2" -sax@^1.2.4, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -8179,11 +8478,6 @@ semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -8268,6 +8562,13 @@ shallowequal@^1.1.0: resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -8275,11 +8576,26 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + shell-quote@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" @@ -8314,6 +8630,23 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slip44@^1.2.24: + version "1.2.24" + resolved "https://registry.yarnpkg.com/slip44/-/slip44-1.2.24.tgz#a10c361da7b665cee45c2653b556fb09a7f1d143" + integrity sha512-RNa5bz7ywLVgMvEEAT8X1Jp53bLsjiJMmYMqwYa/8hTKFrJUAF/8QQ9Lo7O1Xx/Cb6DOwb5CYIPCLK2ETdKKkA== + +sockjs-client@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + integrity sha1-W6vjhrd15M8U51IJEUUmVAFsixI= + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + sockjs@^0.3.21: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -8468,6 +8801,14 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -8530,6 +8871,20 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@3.0.1, strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -8613,6 +8968,11 @@ stylehacks@^5.0.3: browserslist "^4.16.6" postcss-selector-parser "^6.0.4" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -8789,7 +9149,7 @@ text-encoding-utf-8@^1.0.2: resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== -text-table@^0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -8799,6 +9159,11 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -8809,6 +9174,13 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -8922,7 +9294,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: +tslib@^2.0.3, tslib@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -9060,6 +9432,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.1.8, url-parse@^1.4.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -9142,63 +9522,6 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" -wasm-react-scripts@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/wasm-react-scripts/-/wasm-react-scripts-5.0.2.tgz#0e83e203a12169201040bc469bcf2d3022420827" - integrity sha512-kR03EtlcBoXdE+P9JKF+QLefpnsjb3jzAuLsb8H5KJBXT4jV9YHIjwORScK6G6lcLBKl4qhTUP/E2v2xNHXPnQ== - dependencies: - "@babel/core" "^7.16.0" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" - "@svgr/webpack" "^5.5.0" - babel-jest "^27.4.2" - babel-loader "^8.2.3" - babel-plugin-named-asset-import "^0.3.8" - babel-preset-react-app "^10.0.1" - bfj "^7.0.2" - browserslist "^4.18.1" - camelcase "^6.2.1" - case-sensitive-paths-webpack-plugin "^2.4.0" - css-loader "^6.5.1" - css-minimizer-webpack-plugin "^3.2.0" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - eslint "^8.3.0" - eslint-config-react-app "^7.0.0" - eslint-webpack-plugin "^3.1.1" - file-loader "^6.2.0" - fs-extra "^10.0.0" - html-webpack-plugin "^5.5.0" - identity-obj-proxy "^3.0.0" - jest "^27.4.3" - jest-resolve "^27.4.2" - jest-watch-typeahead "^1.0.0" - less "^4.1.2" - less-loader "^10.2.0" - mini-css-extract-plugin "^2.4.5" - postcss "^8.4.4" - postcss-flexbugs-fixes "^5.0.2" - postcss-loader "^6.2.1" - postcss-normalize "^10.0.1" - postcss-preset-env "^7.0.1" - prompts "^2.4.2" - react-app-polyfill "^3.0.0" - react-dev-utils "^12.0.0" - react-refresh "^0.11.0" - resolve "^1.20.0" - resolve-url-loader "^4.0.0" - sass-loader "^12.3.0" - semver "^7.3.5" - source-map-loader "^3.0.0" - style-loader "^3.3.1" - tailwindcss "^3.0.2" - terser-webpack-plugin "^5.2.5" - webpack "^5.64.4" - webpack-dev-server "^4.6.0" - webpack-manifest-plugin "^4.0.2" - workbox-webpack-plugin "^6.4.1" - optionalDependencies: - fsevents "^2.3.2" - watchpack@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" @@ -9420,7 +9743,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which@^1.3.1: +which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -9672,6 +9995,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"