From 07ad602133c5b0b90414d630b8dc15d1e36df113 Mon Sep 17 00:00:00 2001 From: tjs Date: Fri, 10 Jun 2022 09:02:03 -0400 Subject: [PATCH] integrate initial pass of orcas devnet swap --- package.json | 33 ++-- ts/client/src/accounts/oracle.ts | 1 - ts/client/src/client.ts | 52 +----- ts/client/src/index.ts | 29 +++- ts/client/src/integrations/orca/index.ts | 197 ++++++++++++++++++++++ ts/client/src/integrations/orca/tokens.ts | 41 +++++ ts/client/src/utils.ts | 4 + tsconfig.build.json | 7 + tsconfig.cjs.json | 9 + tsconfig.json | 17 +- yarn.lock | 133 ++++++--------- 11 files changed, 367 insertions(+), 156 deletions(-) create mode 100644 ts/client/src/integrations/orca/index.ts create mode 100644 ts/client/src/integrations/orca/tokens.ts create mode 100644 tsconfig.build.json create mode 100644 tsconfig.cjs.json diff --git a/package.json b/package.json index cef7d3808..794524b73 100644 --- a/package.json +++ b/package.json @@ -2,28 +2,32 @@ "name": "@blockworks-foundation/mango-v4", "version": "0.0.1", "description": "Typescript Client for mango-v4 program.", - "main": "dist/index.js", - "types": "dist/index.d.ts", "repository": "https://github.com/blockworks-foundation/mango-v4", + "author": { + "name": "Blockworks Foundation", + "email": "hello@blockworks.foundation", + "url": "https://blockworks.foundation" + }, + "main": "dist/cjs/index.js", + "types": "dist/types/index.d.ts", + "sideEffects": false, + "files": [ + "dist" + ], "scripts": { - "build": "tsc", + "build": "npm run build:cjs", + "build:cjs": "tsc -p tsconfig.cjs.json", "clean": "rm -rf dist", "example1-user": "ts-node ts/client/src/scripts/example1-user.ts", "example1-admin": "ts-node ts/client/src/scripts/example1-admin.ts", "scratch": "ts-node ts/client/src/scripts/scratch/scratch.ts", "format": "prettier --check .", "lint": "eslint . --ext ts --ext tsx --ext js --quiet", - "type-check": "tsc --pretty --noEmit", - "prepare": "yarn build" + "typecheck": "tsc --noEmit --pretty", + "prebuild": "npm run clean", + "prepublishOnly": "npm run validate && npm run build", + "validate": "npm run typecheck && npm run test && npm run lint && npm run format-check" }, - "author": { - "name": "Blockworks Foundation", - "email": "hello@blockworks.foundation", - "url": "https://blockworks.foundation" - }, - "files": [ - "dist" - ], "devDependencies": { "@tsconfig/recommended": "^1.0.1", "@types/bs58": "^4.0.1", @@ -57,5 +61,8 @@ "big.js": "^6.1.1", "bs58": "^5.0.0" }, + "peerDependencies": { + "@solana/spl-token-swap": "^0.2.0" + }, "license": "MIT" } diff --git a/ts/client/src/accounts/oracle.ts b/ts/client/src/accounts/oracle.ts index a16fce183..e058b2904 100644 --- a/ts/client/src/accounts/oracle.ts +++ b/ts/client/src/accounts/oracle.ts @@ -1,6 +1,5 @@ import { PublicKey, TransactionSignature } from '@solana/web3.js'; import BN from 'bn.js'; -import { MangoClient } from '../client'; import { I80F48, I80F48Dto } from './I80F48'; export class StubOracle { diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index c23972d37..949acbcac 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -1,6 +1,3 @@ -import { ORCA_TOKEN_SWAP_ID_DEVNET } from '@orca-so/sdk'; -import { orcaDevnetPoolConfigs } from '@orca-so/sdk/dist/constants/devnet/pools'; -import { OrcaPoolConfig as OrcaDevnetPoolConfig } from '@orca-so/sdk/dist/public/devnet/pools'; import { AnchorProvider, BN, Program, Provider } from '@project-serum/anchor'; import { getFeeRates, getFeeTier, Market } from '@project-serum/serum'; import { Order } from '@project-serum/serum/lib/market'; @@ -10,7 +7,6 @@ import { WRAPPED_SOL_MINT, } from '@project-serum/serum/lib/token-instructions'; import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; -import { TokenSwap } from '@solana/spl-token-swap'; import { AccountMeta, Keypair, @@ -36,6 +32,10 @@ import { Serum3SelfTradeBehavior, Serum3Side, } from './accounts/serum3'; +import { + buildOrcaInstruction, + ORCA_TOKEN_SWAP_ID_DEVNET, +} from './integrations/orca/index'; import { IDL, MangoV4 } from './mango_v4'; import { MarginTradeWithdraw } from './types'; import { @@ -1120,7 +1120,7 @@ export class MangoClient { const targetProgramId = ORCA_TOKEN_SWAP_ID_DEVNET; - const { instruction, signers } = await this.buildOrcaInstruction( + const { instruction, signers } = await buildOrcaInstruction( targetProgramId, inputBank, outputBank, @@ -1224,46 +1224,4 @@ export class MangoClient { return healthRemainingAccounts; } - - /* - Orca ix references: - swap fn: https://github.com/orca-so/typescript-sdk/blob/main/src/model/orca/pool/orca-pool.ts#L162 - swap ix: https://github.com/orca-so/typescript-sdk/blob/main/src/public/utils/web3/instructions/pool-instructions.ts#L41 - */ - private async buildOrcaInstruction( - orcaTokenSwapId: PublicKey, - inputBank: Bank, - outputBank: Bank, - amountInU64: BN, - minimumAmountOutU64: BN, - ) { - const poolParams = orcaDevnetPoolConfigs[OrcaDevnetPoolConfig.ORCA_SOL]; - - const [authorityForPoolAddress] = await PublicKey.findProgramAddress( - [poolParams.address.toBuffer()], - orcaTokenSwapId, - ); - - const instruction = TokenSwap.swapInstruction( - poolParams.address, - authorityForPoolAddress, - inputBank.publicKey, // userTransferAuthority - inputBank.vault, // inputTokenUserAddress - poolParams.tokens[inputBank.mint.toString()].addr, // inputToken.addr - poolParams.tokens[outputBank.mint.toString()].addr, // outputToken.addr - outputBank.vault, // outputTokenUserAddress - poolParams.poolTokenMint, - poolParams.feeAccount, - null, // hostFeeAccount - orcaTokenSwapId, - TOKEN_PROGRAM_ID, - amountInU64, - minimumAmountOutU64, - ); - - instruction.keys[2].isSigner = false; - instruction.keys[2].isWritable = true; - - return { instruction, signers: [] }; - } } diff --git a/ts/client/src/index.ts b/ts/client/src/index.ts index 2d599b58d..4c500f124 100644 --- a/ts/client/src/index.ts +++ b/ts/client/src/index.ts @@ -1,11 +1,28 @@ -export { Group } from './accounts/group'; -export * from './accounts/I80F48'; -export { +import { Group } from './accounts/group'; +import { StubOracle } from './accounts/oracle'; +import { MangoAccount, TokenAccount, TokenAccountDto, } from './accounts/mangoAccount'; -export { StubOracle } from './accounts/oracle'; -export { Serum3Market } from './accounts/serum3'; -export * from './client'; +import { MANGO_V4_ID, MangoClient } from './client'; + +export * from './accounts/I80F48'; +export { + Serum3Market, + Serum3OrderType, + Serum3SelfTradeBehavior, + Serum3Side, +} from './accounts/serum3'; export * from './constants'; +export * from './integrations/orca/index'; + +export { + Group, + StubOracle, + MangoAccount, + TokenAccount, + TokenAccountDto, + MangoClient, + MANGO_V4_ID, +}; diff --git a/ts/client/src/integrations/orca/index.ts b/ts/client/src/integrations/orca/index.ts new file mode 100644 index 000000000..66fff6a43 --- /dev/null +++ b/ts/client/src/integrations/orca/index.ts @@ -0,0 +1,197 @@ +import { ORCA_TOKEN_SWAP_ID_DEVNET } from '@orca-so/sdk'; +import { Connection, PublicKey } from '@solana/web3.js'; +import { BN } from '@project-serum/anchor'; +import { + AccountInfo, + AccountLayout, + u64, + TOKEN_PROGRAM_ID, +} from '@solana/spl-token'; +import { OrcaPoolToken, PoolTokenCount } from '@orca-so/sdk'; +import { orcaDevnetPoolConfigs } from '@orca-so/sdk/dist/constants/devnet/pools'; +import { OrcaPoolConfig as OrcaDevnetPoolConfig } from '@orca-so/sdk/dist/public/devnet/pools'; +import { OrcaPoolParams } from '@orca-so/sdk/dist/model/orca/pool/pool-types'; +import { TokenSwap } from '@solana/spl-token-swap'; + +import * as Tokens from './tokens'; +import { Bank } from '../../accounts/bank'; +import { toNativeDecimals, toUiDecimals } from '../../utils'; + +export { ORCA_TOKEN_SWAP_ID_DEVNET }; + +/* + Orca ix references: + swap fn: https://github.com/orca-so/typescript-sdk/blob/main/src/model/orca/pool/orca-pool.ts#L162 + swap ix: https://github.com/orca-so/typescript-sdk/blob/main/src/public/utils/web3/instructions/pool-instructions.ts#L41 +*/ +export const buildOrcaInstruction = async ( + orcaTokenSwapId: PublicKey, + inputBank: Bank, + outputBank: Bank, + amountInU64: BN, + minimumAmountOutU64: BN, +) => { + // TODO: select the correct pool params based on passed in banks + const poolParams = orcaDevnetPoolConfigs[OrcaDevnetPoolConfig.ORCA_SOL]; + + const [authorityForPoolAddress] = await PublicKey.findProgramAddress( + [poolParams.address.toBuffer()], + orcaTokenSwapId, + ); + + const instruction = TokenSwap.swapInstruction( + poolParams.address, + authorityForPoolAddress, + inputBank.publicKey, // userTransferAuthority + inputBank.vault, // inputTokenUserAddress + poolParams.tokens[inputBank.mint.toString()].addr, // inputToken.addr + poolParams.tokens[outputBank.mint.toString()].addr, // outputToken.addr + outputBank.vault, // outputTokenUserAddress + poolParams.poolTokenMint, + poolParams.feeAccount, + null, // hostFeeAccount + orcaTokenSwapId, + TOKEN_PROGRAM_ID, + amountInU64, + minimumAmountOutU64, + ); + + instruction.keys[2].isSigner = false; + instruction.keys[2].isWritable = true; + + return { instruction, signers: [] }; +}; + +export const getOrcaOutputAmount = async ( + connection: Connection, + inputToken: string, + outputToken: string, + amountIn: number, +): Promise => { + // TODO: select the correct pool params based on passed in banks + const inputMint = Tokens.solToken; + const poolParams = getOrcaPoolParams(inputToken, outputToken); + + const { inputPoolToken, outputPoolToken } = getTokens( + poolParams, + inputMint.mint.toString(), + ); + + const { inputTokenCount, outputTokenCount } = await getTokenCount( + connection, + poolParams, + inputPoolToken, + outputPoolToken, + ); + + const [poolInputAmount, poolOutputAmount] = [ + inputTokenCount, + outputTokenCount, + ]; + + const invariant = poolInputAmount.mul(poolOutputAmount); + const nativeAmountIn = toNativeDecimals(amountIn, 9); + + const [newPoolOutputAmount] = ceilingDivision( + invariant, + poolInputAmount.add(nativeAmountIn), + ); + + const outputAmount = poolOutputAmount.sub(newPoolOutputAmount); + + return toUiDecimals(outputAmount.toNumber(), 6); +}; + +function getTokens(poolParams: OrcaPoolParams, inputTokenId: string) { + if (poolParams.tokens[inputTokenId] == undefined) { + throw new Error('Input token not part of pool'); + } + + const tokenAId = poolParams.tokenIds[0]; + const tokenBId = poolParams.tokenIds[1]; + + const forward = tokenAId == inputTokenId; + + const inputOrcaToken = forward + ? poolParams.tokens[tokenAId] + : poolParams.tokens[tokenBId]; + const outputOrcaToken = forward + ? poolParams.tokens[tokenBId] + : poolParams.tokens[tokenAId]; + return { inputPoolToken: inputOrcaToken, outputPoolToken: outputOrcaToken }; +} + +const getOrcaPoolParams = (inputToken: string, outputToken: string) => { + return orcaDevnetPoolConfigs[OrcaDevnetPoolConfig.ORCA_SOL]; +}; + +async function getTokenCount( + connection: Connection, + poolParams: OrcaPoolParams, + inputPoolToken: OrcaPoolToken, + outputPoolToken: OrcaPoolToken, +): Promise { + if (poolParams.tokens[inputPoolToken.mint.toString()] == undefined) { + throw new Error('Input token not part of pool'); + } + + if (poolParams.tokens[outputPoolToken.mint.toString()] == undefined) { + throw new Error('Output token not part of pool'); + } + + const accountInfos = await connection.getMultipleAccountsInfo([ + inputPoolToken.addr, + outputPoolToken.addr, + ]); + + const tokens = accountInfos.map((info) => + info != undefined ? deserializeAccount(info.data) : undefined, + ); + const inputTokenAccount = tokens[0], + outputTokenAccount = tokens[1]; + + if (inputTokenAccount === undefined || outputTokenAccount === undefined) { + throw new Error('Unable to fetch accounts for specified tokens.'); + } + + return { + inputTokenCount: inputTokenAccount.amount, + outputTokenCount: outputTokenAccount.amount, + }; +} + +const deserializeAccount = ( + data: Buffer | undefined, +): AccountInfo | undefined => { + if (data == undefined || data.length == 0) { + return undefined; + } + + const accountInfo = AccountLayout.decode(data); + accountInfo.mint = new PublicKey(accountInfo.mint); + accountInfo.owner = new PublicKey(accountInfo.owner); + accountInfo.amount = u64.fromBuffer(accountInfo.amount); + + return accountInfo; +}; + +const ZERO = new u64(0); +const ONE = new u64(1); +const ceilingDivision = (dividend: u64, divisor: u64): [u64, u64] => { + let quotient = dividend.div(divisor); + if (quotient.eq(ZERO)) { + return [ZERO, divisor]; + } + + let remainder = dividend.mod(divisor); + if (remainder.gt(ZERO)) { + quotient = quotient.add(ONE); + divisor = dividend.div(quotient); + remainder = dividend.mod(quotient); + if (remainder.gt(ZERO)) { + divisor = divisor.add(ONE); + } + } + + return [quotient, divisor]; +}; diff --git a/ts/client/src/integrations/orca/tokens.ts b/ts/client/src/integrations/orca/tokens.ts new file mode 100644 index 000000000..52d48d164 --- /dev/null +++ b/ts/client/src/integrations/orca/tokens.ts @@ -0,0 +1,41 @@ +import { OrcaToken } from '@orca-so/sdk'; +import { PublicKey } from '@solana/web3.js'; + +/** + * The following content is auto-generated. + */ + +export const ethToken: OrcaToken = Object.freeze({ + tag: 'ETH', + name: 'Ethereum', + mint: new PublicKey('Ff5JqsAYUD4vAfQUtfRprT4nXu9e28tTBZTDFMnJNdvd'), + scale: 9, +}); + +export const orcaToken: OrcaToken = Object.freeze({ + tag: 'ORCA', + name: 'Orca', + mint: new PublicKey('orcarKHSqC5CDDsGbho8GKvwExejWHxTqGzXgcewB9L'), + scale: 6, +}); + +export const solToken: OrcaToken = Object.freeze({ + tag: 'SOL', + name: 'Solana', + mint: new PublicKey('So11111111111111111111111111111111111111112'), + scale: 9, +}); + +export const usdcToken: OrcaToken = Object.freeze({ + tag: 'USDC', + name: 'USD Coin', + mint: new PublicKey('EmXq3Ni9gfudTiyNKzzYvpnQqnJEMRw2ttnVXoJXjLo1'), + scale: 6, +}); + +export const usdtToken: OrcaToken = Object.freeze({ + tag: 'USDT', + name: 'Tether USD', + mint: new PublicKey('6PE3Mwjzx9h8kCoBp5YPed9TFoG7du8L98yucBP5ps3x'), + scale: 6, +}); diff --git a/ts/client/src/utils.ts b/ts/client/src/utils.ts index cfc7be1e3..a96c1bf62 100644 --- a/ts/client/src/utils.ts +++ b/ts/client/src/utils.ts @@ -72,6 +72,10 @@ export function toNativeDecimals(amount: number, decimals: number): BN { return new BN(Math.trunc(amount * Math.pow(10, decimals))); } +export function toUiDecimals(amount: number, decimals: number): number { + return amount / Math.pow(10, decimals); +} + export function toU64(amount: number, decimals): BN { const bn = toNativeDecimals(amount, decimals).toString(); console.log('bn', bn); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 000000000..3213cda91 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "skipLibCheck": true, + "skipDefaultLibCheck": true + } +} diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json new file mode 100644 index 000000000..6c73afe5f --- /dev/null +++ b/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.build", + "compilerOptions": { + "module": "commonjs", + "outDir": "dist/cjs", + "declaration": true, + "declarationDir": "dist/types" + } +} diff --git a/tsconfig.json b/tsconfig.json index dd7d67348..33e5ae63d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,15 @@ { - "extends": "@tsconfig/recommended/tsconfig.json", "compilerOptions": { - "outDir": "./dist", - "target": "es6", + "esModuleInterop": true, + "moduleResolution": "node", "lib": ["es2019"], - "allowJs": true, - "checkJs": true, - "declaration": true, - "declarationMap": true, - "noImplicitAny": false, + "outDir": "./dist", "resolveJsonModule": true, + "noImplicitAny": false, "sourceMap": true, - "esModuleInterop": true + "skipLibCheck": true, + "target": "es2019" }, - "include": ["./ts/**/*"], + "include": ["ts/client/src"], "exclude": ["./ts/**/*.test.js", "node_modules", "**/node_modules"] } diff --git a/yarn.lock b/yarn.lock index 726f01352..f4bbd3928 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,7 +23,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/runtime@^7.10.5", "@babel/runtime@^7.3.1": +"@babel/runtime@^7.10.5": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.0.tgz#6d77142a19cb6088f0af662af1ada37a604d34ae" integrity sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg== @@ -37,6 +37,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.3.1": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" + integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + dependencies: + regenerator-runtime "^0.13.4" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -206,16 +213,6 @@ bn.js "^5.1.2" buffer-layout "^1.2.0" -"@solana/buffer-layout-utils@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" - integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== - dependencies: - "@solana/buffer-layout" "^4.0.0" - "@solana/web3.js" "^1.32.0" - bigint-buffer "^1.1.5" - bignumber.js "^9.0.1" - "@solana/buffer-layout@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734" @@ -279,32 +276,10 @@ tweetnacl "^1.0.0" ws "^7.0.0" -"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0": - version "1.42.0" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.42.0.tgz#296e4bbab1fbfc198b3e9c3d94016c3876eb6a2c" - integrity sha512-QqGh5DWzrgsWRx4sCPDQIm3390b7buPR16tZI61slQaQwJ2ymrSXPQCe4PPTJEIlzGjCV3dkn2vpT2R32BfK2Q== - dependencies: - "@babel/runtime" "^7.12.5" - "@ethersproject/sha2" "^5.5.0" - "@solana/buffer-layout" "^4.0.0" - "@solana/buffer-layout-utils" "^0.2.0" - bn.js "^5.0.0" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.1" - cross-fetch "^3.1.4" - fast-stable-stringify "^1.0.0" - jayson "^3.4.4" - js-sha3 "^0.8.0" - rpc-websockets "^7.4.2" - secp256k1 "^4.0.2" - superstruct "^0.14.2" - tweetnacl "^1.0.0" - -"@solana/web3.js@^1.20.0", "@solana/web3.js@^1.24.1", "@solana/web3.js@^1.42.0": - version "1.43.1" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.43.1.tgz#f0cfffe7feb798563440f9ca0b0e9ba099e13967" - integrity sha512-s6TRcWz3rYvxM8gg1eQmUAUJQeoXIFMG9MbSWb/uRrLU0q7Xd9Ic1PNbACp1n1O0wyCogTAyFWXXPK476aIVSg== +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.20.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.24.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.42.0": + version "1.43.6" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.43.6.tgz#f18eb7f6fc86562aeaa527a25560a25405318dd2" + integrity sha512-F1Q7EOnLi5X+Ap5bAEi5PTwwXPZR+GTfIyOuWpWJfgm3GoawdP/x5lxJolDzzV5S99bNEU/rSTdxcW9EFzIiEw== dependencies: "@babel/runtime" "^7.12.5" "@ethersproject/sha2" "^5.5.0" @@ -314,10 +289,10 @@ borsh "^0.7.0" bs58 "^4.0.1" buffer "6.0.1" - cross-fetch "^3.1.4" fast-stable-stringify "^1.0.0" jayson "^3.4.4" js-sha3 "^0.8.0" + node-fetch "2" rpc-websockets "^7.4.2" secp256k1 "^4.0.2" superstruct "^0.14.2" @@ -636,11 +611,6 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bignumber.js@^9.0.1: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -905,7 +875,7 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@^3.1.4, cross-fetch@^3.1.5: +cross-fetch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== @@ -940,7 +910,7 @@ crypto-hash@^1.2.2, crypto-hash@^1.3.0: css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + integrity sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA== dependencies: boolbase "~1.0.0" css-what "2.1" @@ -1059,7 +1029,7 @@ domhandler@^2.3.0: domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + integrity sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw== dependencies: dom-serializer "0" domelementtype "1" @@ -1200,7 +1170,7 @@ escape-string-regexp@^1.0.5: esdoc-inject-style-plugin@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esdoc-inject-style-plugin/-/esdoc-inject-style-plugin-1.0.0.tgz#a13597368bb9fb89c365e066495caf97a4decbb1" - integrity sha1-oTWXNou5+4nDZeBmSVyvl6Tey7E= + integrity sha512-LqSGr3YKe+vY2u6TCp9K+EEt97S78KjdJUz5PXyitHkp4nGXRSZq2ftEQJioF/WtTeGYWeQLzNAM9LihIlisqg== dependencies: cheerio "0.22.0" fs-extra "1.0.0" @@ -1434,7 +1404,7 @@ flatted@^3.1.0: fs-extra@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -1486,13 +1456,13 @@ get-func-name@^2.0.0: integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" get-symbol-description@^1.0.0: version "1.0.0" @@ -1683,7 +1653,7 @@ internal-slot@^1.0.3: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" @@ -1907,7 +1877,7 @@ jsonc-parser@^3.0.0: jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" @@ -1933,7 +1903,7 @@ kind-of@^6.0.2: klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" @@ -1953,7 +1923,7 @@ levn@^0.4.1: load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -1970,37 +1940,37 @@ locate-path@^6.0.0: lodash.assignin@^4.0.9: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + integrity sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg== lodash.bind@^4.1.4: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + integrity sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA== lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== lodash.filter@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + integrity sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ== lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== lodash.foreach@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ== lodash.map@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== lodash.merge@^4.4.0, lodash.merge@^4.6.2: version "4.6.2" @@ -2010,22 +1980,22 @@ lodash.merge@^4.4.0, lodash.merge@^4.6.2: lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== lodash.reduce@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + integrity sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw== lodash.reject@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + integrity sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ== lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + integrity sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ== lodash.truncate@^4.4.2: version "4.4.2" @@ -2084,7 +2054,7 @@ marked@^4.0.10: memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" @@ -2217,7 +2187,7 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@2.6.7, node-fetch@^2.2.0: +node-fetch@2, node-fetch@2.6.7, node-fetch@^2.2.0: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -2272,9 +2242,9 @@ object-assign@^4.0.1: integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.1.tgz#28a661153bad7e470e4b01479ef1cb91ce511191" - integrity sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA== + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== object-keys@^1.1.1: version "1.1.1" @@ -2339,7 +2309,7 @@ parent-module@^1.0.0: parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -2357,7 +2327,7 @@ path-is-absolute@^1.0.0: path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.1.0: version "3.1.1" @@ -2399,7 +2369,7 @@ pidtree@^0.3.0: pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== prelude-ls@^1.2.1: version "1.2.1" @@ -2444,7 +2414,7 @@ randombytes@^2.1.0: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -2577,7 +2547,7 @@ serialize-javascript@6.0.0: 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= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -2591,7 +2561,7 @@ shebang-command@^2.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= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -3082,7 +3052,12 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@^7.0.0, ws@^7.4.5: +ws@^7.0.0: + version "7.5.8" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + +ws@^7.4.5: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==