diff --git a/package.json b/package.json index 08c0906..0aabb1e 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ }, "homepage": "https://github.com/blockworks-foundation/mangolana#readme", "dependencies": { - "@solana/web3.js": "^1.91.6", + "@solana/web3.js": "^1.95.2", "bs58": "^5.0.0", "isomorphic-ws": "^5.0.0", "node-fetch": "3.3.2", - "ws": "^8.16.0" + "ws": "^8.18.0" }, "devDependencies": { "@types/node": "20.12.7", diff --git a/src/globalTypes.ts b/src/globalTypes.ts index a79cfc9..224af9b 100644 --- a/src/globalTypes.ts +++ b/src/globalTypes.ts @@ -1,13 +1,25 @@ -import { BlockhashWithExpiryBlockHeight, Keypair, TransactionInstruction } from '@solana/web3.js'; +import { + AddressLookupTableAccount, + BlockhashWithExpiryBlockHeight, + Keypair, + PublicKey, + TransactionInstruction, +} from '@solana/web3.js'; export type WalletSigner = Pick; export class TransactionInstructionWithSigners { transactionInstruction: TransactionInstruction; - signers?: Keypair[]; - constructor(transactionInstruction: TransactionInstruction, signers: Keypair[] = []) { + signers?: Keypair[] = []; + alts?: AddressLookupTableAccount[] = []; + constructor( + transactionInstruction: TransactionInstruction, + signers: Keypair[] = [], + alts: AddressLookupTableAccount[] = [], + ) { this.transactionInstruction = transactionInstruction; this.signers = signers; + this.alts = alts; } } @@ -86,3 +98,12 @@ export const getTimeoutConfig = (timeoutStrategy: BlockHeightStrategy | TimeStra : new BlockHeightStrategyClass({ ...timeoutStrategy }); return timeoutConfig; }; + +export type SignaturePubkeyPair = { + signature: Buffer | null; + publicKey: PublicKey; +}; + +export function isSignaturePubKeyPair(sigPubkey: any): sigPubkey is SignaturePubkeyPair { + return sigPubkey?.signature !== undefined; +} diff --git a/src/transactions.ts b/src/transactions.ts index 1712967..cf15c9e 100644 --- a/src/transactions.ts +++ b/src/transactions.ts @@ -1,13 +1,17 @@ import { + AddressLookupTableAccount, Commitment, Connection, Keypair, + MessageV0, RpcResponseAndContext, SignatureStatus, SimulatedTransactionResponse, Transaction, TransactionConfirmationStatus, + TransactionInstruction, TransactionSignature, + VersionedTransaction, } from '@solana/web3.js'; import bs58 = require('bs58'); import { getUnixTs, Logger, sleep } from './tools'; @@ -20,6 +24,8 @@ import { TimeStrategyClass, TransactionInstructionWithSigners, WalletSigner, + SignaturePubkeyPair, + isSignaturePubKeyPair, } from './globalTypes'; import Websocket from 'isomorphic-ws'; @@ -302,7 +308,7 @@ const timeoutCheck = ( }; export type sendAndConfirmSignedTransactionProps = { - signedTransaction: Transaction; + signedTransaction: Transaction | VersionedTransaction; connection: Connection; confirmLevel?: TransactionConfirmationStatus; timeoutStrategy: TimeStrategy | BlockHeightStrategy; @@ -315,6 +321,7 @@ export type sendAndConfirmSignedTransactionProps = { resendPoolTimeMs?: number; logFlowInfo?: boolean; skipPreflight?: boolean; + useVersionedTransactions?: boolean; }; backupConnections?: Connection[]; }; @@ -370,7 +377,12 @@ export const sendAndConfirmSignedTransaction = async ({ } const rawTransaction = signedTransaction.serialize(); - let txid = bs58.encode(signedTransaction.signatures[0].signature!); + let txid = bs58.encode( + isSignaturePubKeyPair(signedTransaction.signatures[0]) + ? signedTransaction.signatures[0].signature! + : signedTransaction.signatures[0], + ); + const startTime = getUnixTs(); txid = await Promise.any( connections.map((c) => { @@ -488,6 +500,7 @@ export type sendSignAndConfirmTransactionsProps = { maxRetries?: number; retried?: number; logFlowInfo?: boolean; + useVersionedTransactions?: boolean; }; backupConnections?: Connection[]; }; @@ -515,6 +528,7 @@ export type sendSignAndConfirmTransactionsProps = { * @param config.maxRetries if auto retry is true, it will try this amount of times before actual error, default 5 * @param config.retired argument passed by recursive function best not to change it, default 0 * @param config.logFlowInfo when true it will console log process of processing transactions + * @param config.useVersionedTransactions will send all txes as versioned transactions */ export const sendSignAndConfirmTransactions = async ({ connection, @@ -529,6 +543,7 @@ export const sendSignAndConfirmTransactions = async ({ maxRetries: 5, retried: 0, logFlowInfo: false, + useVersionedTransactions: false, }, backupConnections, }: sendSignAndConfirmTransactionsProps) => { @@ -546,29 +561,18 @@ export const sendSignAndConfirmTransactions = async ({ } //block will be used for timeout calculation //max usable transactions per one sign is 40 + const useVersionedTransactions = config.useVersionedTransactions; const maxTransactionsInBath = config.maxTxesInBatch; const currentTransactions = transactionInstructions.slice(0, maxTransactionsInBath); - const unsignedTxns: Transaction[] = []; + const unsignedTxns: (Transaction | VersionedTransaction)[] = []; //this object will determine how we run transactions e.g [ParallelTx, SequenceTx, ParallelTx] const transactionCallOrchestrator: TransactionsPlayingIndexes[] = []; for (let i = 0; i < currentTransactions.length; i++) { const transactionInstruction = currentTransactions[i]; - const signers: Keypair[] = []; if (transactionInstruction.instructionsSet.length === 0) { continue; } - const transaction = new Transaction({ feePayer: wallet.publicKey }); - transactionInstruction.instructionsSet.forEach((instruction) => { - transaction.add(instruction.transactionInstruction); - if (instruction.signers?.length) { - signers.push(...instruction.signers); - } - }); - transaction.recentBlockhash = block.blockhash; - if (signers?.length) { - transaction.partialSign(...signers); - } //we take last index of unsignedTransactions to have right indexes because //if transactions was empty //then unsigned transactions could not mach TransactionInstructions param indexes @@ -588,8 +592,51 @@ export const sendSignAndConfirmTransactions = async ({ sequenceType: transactionInstruction.sequenceType, }); } - unsignedTxns.push(transaction); + + if (useVersionedTransactions) { + const ixes: TransactionInstruction[] = []; + const signers: Keypair[] = []; + const alts: AddressLookupTableAccount[] = []; + + transactionInstruction.instructionsSet.forEach((instruction) => { + ixes.push(instruction.transactionInstruction); + if (instruction.signers?.length) { + signers.push(...instruction.signers); + } + if (instruction.alts?.length) { + alts.push(...instruction.alts); + } + }); + + const message = MessageV0.compile({ + payerKey: wallet.publicKey, + instructions: [...ixes], + recentBlockhash: block.blockhash, + addressLookupTableAccounts: [...alts], + }); + let vtx = new VersionedTransaction(message); + if (signers?.length) { + vtx.sign([...signers]); + } + + unsignedTxns.push(vtx); + } else { + const signers: Keypair[] = []; + const transaction = new Transaction({ feePayer: wallet.publicKey }); + transactionInstruction.instructionsSet.forEach((instruction) => { + transaction.add(instruction.transactionInstruction); + if (instruction.signers?.length) { + signers.push(...instruction.signers); + } + }); + transaction.recentBlockhash = block.blockhash; + if (signers?.length) { + transaction.partialSign(...signers); + } + unsignedTxns.push(transaction); + } } + logger.log(transactionCallOrchestrator); const signedTxns = await wallet.signAllTransactions(unsignedTxns); if (callbacks?.afterFirstBatchSign) { @@ -763,33 +810,46 @@ export const sendSignAndConfirmTransactions = async ({ /** Copy of Connection.simulateTransaction that takes a commitment parameter. */ export async function simulateTransaction( connection: Connection, - transaction: Transaction, + transaction: Transaction | VersionedTransaction, commitment: Commitment, logInfo?: boolean, ): Promise> { const logger = new Logger({ logFlowInfo: !!logInfo }); const latestBlockhash = await connection.getLatestBlockhash(); - transaction.lastValidBlockHeight = latestBlockhash.lastValidBlockHeight; - transaction.recentBlockhash = latestBlockhash.blockhash; + if (transaction instanceof Transaction) { + transaction.lastValidBlockHeight = latestBlockhash.lastValidBlockHeight; + transaction.recentBlockhash = latestBlockhash.blockhash; - logger.log('simulating transaction', transaction); + logger.log('simulating transaction', transaction); - const signData = transaction.serializeMessage(); - // @ts-ignore - const wireTransaction = transaction._serialize(signData); - const encodedTransaction = wireTransaction.toString('base64'); + const signData = transaction.serializeMessage(); - logger.log('encoding'); - const config: any = { encoding: 'base64', commitment }; - const args = [encodedTransaction, config]; - logger.log('simulating data', args); + // @ts-ignore + const wireTransaction = transaction._serialize(signData); + const encodedTransaction = wireTransaction.toString('base64'); - // @ts-ignore - const res = await connection._rpcRequest('simulateTransaction', args); + logger.log('encoding'); + const config: any = { encoding: 'base64', commitment }; + const args = [encodedTransaction, config]; + logger.log('simulating data', args); - logger.log('res simulating transaction', res); - if (res.error) { - throw new Error('failed to simulate transaction: ' + res.error.message); + // @ts-ignore + const res = await connection._rpcRequest('simulateTransaction', args); + + logger.log('res simulating transaction', res); + if (res.error) { + throw new Error('failed to simulate transaction: ' + res.error.message); + } + return res.result; + } else { + logger.log('simulating transaction', transaction); + + const res = await connection.simulateTransaction(transaction); + + logger.log('res simulating transaction', res); + if (res.value.err) { + throw new Error('failed to simulate transaction: ' + res.value.err.toString()); + } + return res; } - return res.result; } diff --git a/yarn.lock b/yarn.lock index 3dfa495..63b9910 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,33 +23,21 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/runtime@^7.17.2": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.23.4": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" - integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== +"@babel/runtime@^7.24.8": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== dependencies: regenerator-runtime "^0.14.0" -"@noble/curves@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" - integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== +"@noble/curves@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== dependencies: - "@noble/hashes" "1.3.3" + "@noble/hashes" "1.4.0" -"@noble/hashes@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" - integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== - -"@noble/hashes@^1.3.3": +"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== @@ -61,14 +49,14 @@ dependencies: buffer "~6.0.3" -"@solana/web3.js@^1.91.6": - version "1.91.6" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.6.tgz#c090661c344cbc61e6cdeb0da67d3ea80d5848e1" - integrity sha512-dm20nN6HQvXToo+kM51nxHdtaa2wMSRdeK37p+WIWESfeiVHqV8XbV4XnWupq6ngt5vIckhGFG7ZnTBxUgLzDA== +"@solana/web3.js@^1.95.2": + version "1.95.2" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.2.tgz#6f8a0362fa75886a21550dbec49aad54481463a6" + integrity sha512-SjlHp0G4qhuhkQQc+YXdGkI8EerCqwxvgytMgBpzMUQTafrkNant3e7pgilBGgjy/iM40ICvWBLgASTPMrQU7w== dependencies: - "@babel/runtime" "^7.23.4" - "@noble/curves" "^1.2.0" - "@noble/hashes" "^1.3.3" + "@babel/runtime" "^7.24.8" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" "@solana/buffer-layout" "^4.0.1" agentkeepalive "^4.5.0" bigint-buffer "^1.1.5" @@ -77,10 +65,17 @@ bs58 "^4.0.1" buffer "6.0.3" fast-stable-stringify "^1.0.0" - jayson "^4.1.0" + jayson "^4.1.1" node-fetch "^2.7.0" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + +"@swc/helpers@^0.5.11": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" + integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== + dependencies: + tslib "^2.4.0" "@types/connect@^3.4.33": version "3.4.35" @@ -106,6 +101,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" @@ -113,6 +113,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.2.2": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -221,7 +228,7 @@ bs58@^5.0.0: dependencies: base-x "^4.0.0" -buffer@6.0.3, buffer@~6.0.3: +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -309,10 +316,10 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== eyes@^0.1.8: version "0.1.8" @@ -420,10 +427,10 @@ isomorphic-ws@^5.0.0: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== -jayson@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" - integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== +jayson@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.1.tgz#282ff13d3cea09776db684b7eeca98c47b2fa99a" + integrity sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w== dependencies: "@types/connect" "^3.4.33" "@types/node" "^12.12.54" @@ -436,7 +443,7 @@ jayson@^4.1.0: isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" uuid "^8.3.2" - ws "^7.4.5" + ws "^7.5.10" js-tokens@^4.0.0: version "4.0.0" @@ -555,11 +562,6 @@ prettier@^2.7.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -574,13 +576,16 @@ resolve@^1.3.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -rpc-websockets@^7.5.1: - version "7.9.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.9.0.tgz#a3938e16d6f134a3999fdfac422a503731bf8973" - integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== +rpc-websockets@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.2.tgz#4c1568d00b8100f997379a363478f41f8f4b242c" + integrity sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw== dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" + "@swc/helpers" "^0.5.11" + "@types/uuid" "^8.3.4" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" uuid "^8.3.2" ws "^8.5.0" optionalDependencies: @@ -611,10 +616,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== +superstruct@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== supports-color@^5.3.0: version "5.5.0" @@ -648,6 +653,11 @@ tslib@^1.13.0, tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -744,15 +754,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.4.5: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.16.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== ws@^8.5.0: version "8.9.0"