From f11659cb43f65effae2f471d5c9b09266cdd4fa8 Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Tue, 31 Aug 2021 14:16:16 -0500 Subject: [PATCH] H (#260) * Adding candy machine * Still working on stuff * Commit where is top using anchor * Working on candy machine * Continue working on candy machine * Still working * Completely reasonable failure * Completely unreasonable failure * Finally, we have uploading configs and tests * Add uuid support to candy machines so candy machine can rerun with same config * feat: init cli * Got minting now bro. All downhill from here. * All done * Chang eaddress * Minor fix to anchor settings * feat: integrate candy * feat: cli upload * Heck yeah. Switch out the pda for a non pda to allow for alrger allocs * Send authority to candy machine authority if retain authority is true * feat: add add congif lines * Forgotten conflict * Rewire CLI to chunkify and add verification * Current changes * Client finished * Fuckin bitmasks bro * Fix metadata client * Working on cli * Fixed the healing loop * here we go. * Fix the error that caused price to be 1 instead of 5 Co-authored-by: bartosz-lipinski <264380+bartosz-lipinski@users.noreply.github.com> --- .gitignore | 3 + js/packages/cli/README.md | 15 + js/packages/cli/package.json | 35 + js/packages/cli/src/cli.ts | 761 +++++++ js/packages/cli/src/helper.ts | 317 +++ js/packages/cli/src/tsconfig.json | 23 + js/packages/web/.env | 2 +- .../web/src/components/AuctionCard/index.tsx | 1 + js/yarn.lock | 426 +++- rust/Anchor.toml | 12 + rust/Cargo.lock | 558 +++-- rust/Cargo.toml | 1 + rust/auction/cli/Cargo.toml | 6 +- rust/auction/program/Cargo.toml | 6 +- rust/metaplex/program/Cargo.toml | 2 +- rust/metaplex/test/Cargo.toml | 6 +- rust/migrations/deploy.js | 13 + rust/nft-candy-machine/Cargo.toml | 22 + rust/nft-candy-machine/Xargo.toml | 2 + rust/nft-candy-machine/src/lib.rs | 615 ++++++ rust/nft-candy-machine/src/utils.rs | 71 + rust/package.json | 26 + rust/test/idlToTs.js | 95 + rust/test/nft-candy-machine-types.ts | 12 + rust/test/nft-candy-machine.ts | 923 ++++++++ rust/token-metadata/program/Cargo.toml | 2 +- .../token-metadata/program/src/instruction.rs | 23 +- rust/token-metadata/program/src/state.rs | 13 +- rust/token-metadata/test/Cargo.toml | 6 +- rust/token-vault/program/Cargo.toml | 2 +- rust/token-vault/test/Cargo.toml | 6 +- rust/tsconfig.json | 10 + rust/yarn.lock | 1874 +++++++++++++++++ 33 files changed, 5689 insertions(+), 200 deletions(-) create mode 100644 js/packages/cli/README.md create mode 100644 js/packages/cli/package.json create mode 100755 js/packages/cli/src/cli.ts create mode 100644 js/packages/cli/src/helper.ts create mode 100644 js/packages/cli/src/tsconfig.json create mode 100644 rust/Anchor.toml create mode 100644 rust/migrations/deploy.js create mode 100644 rust/nft-candy-machine/Cargo.toml create mode 100644 rust/nft-candy-machine/Xargo.toml create mode 100644 rust/nft-candy-machine/src/lib.rs create mode 100644 rust/nft-candy-machine/src/utils.rs create mode 100644 rust/package.json create mode 100644 rust/test/idlToTs.js create mode 100644 rust/test/nft-candy-machine-types.ts create mode 100644 rust/test/nft-candy-machine.ts create mode 100644 rust/tsconfig.json create mode 100644 rust/yarn.lock diff --git a/.gitignore b/.gitignore index e075fe7..6a51275 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ node_modules/ +.anchor +**/*.rs.bk build/ +rust/test/nft-candy-machine.js dist/ lib/ deploy/ diff --git a/js/packages/cli/README.md b/js/packages/cli/README.md new file mode 100644 index 0000000..72ed453 --- /dev/null +++ b/js/packages/cli/README.md @@ -0,0 +1,15 @@ + +Format + +* Folder with files named from 0-1.png +* JSON file with attributes, format + - Array with indices matching images + - Contains: title, description and array of traits ({"display_type":"number","trait_type":"generation","value":2}) + + +Install dependencies +``` +yarn +``` + + diff --git a/js/packages/cli/package.json b/js/packages/cli/package.json new file mode 100644 index 0000000..67591e7 --- /dev/null +++ b/js/packages/cli/package.json @@ -0,0 +1,35 @@ +{ + "name": "@metaplex/cli", + "version": "0.0.1", + "main": "./build/cli.js", + "license": "MIT", + "bin": { + "metaplex": "./build/cli.js" + }, + "scripts": { + "build": "tsc -p ./src", + "watch": "tsc -w -p ./src", + "package:linux": "pkg . --no-bytecode --targets node14-linux-x64 --output bin/linux/metaplex", + "package:macos": "pkg . --no-bytecode --targets node14-macos-x64 --output bin/macos/metaplex", + "format": "prettier --loglevel warn --write \"**/*.{ts,js,json,yaml}\"", + "format:check": "prettier --loglevel warn --check \"**/*.{ts,js,json,yaml}\"", + "lint": "eslint \"src/**/*.ts\" --fix", + "lint:check": "eslint \"src/**/*.ts\"" + }, + "pkg": { + "scripts": "./build/**/*.js" + }, + "dependencies": { + "@project-serum/anchor": "^0.13.2", + "@solana/web3.js": "^1.24.1", + "arweave": "^1.10.16", + "bn.js": "^5.2.0", + "commander": "^8.1.0", + "form-data": "^4.0.0", + "node-fetch": "^2.6.1" + }, + "devDependencies": { + "pkg": "^5.3.1", + "typescript": "^4.3.5" + } +} diff --git a/js/packages/cli/src/cli.ts b/js/packages/cli/src/cli.ts new file mode 100755 index 0000000..d81856a --- /dev/null +++ b/js/packages/cli/src/cli.ts @@ -0,0 +1,761 @@ +#!/usr/bin/env node +import * as fs from 'fs'; +import Arweave from 'arweave'; +import * as path from 'path'; +import fetch from 'node-fetch'; +import FormData from 'form-data'; +import { program } from 'commander'; +import * as anchor from '@project-serum/anchor'; +import BN from 'bn.js'; +import { MintLayout, Token } from '@solana/spl-token'; + +import { sendTransactionWithRetryWithKeypair, fromUTF8Array } from './helper'; +import { + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + SYSVAR_RENT_PUBKEY, + TransactionInstruction, +} from '@solana/web3.js'; +import { token } from '@project-serum/anchor/dist/utils'; + +const CACHE_PATH = './.cache'; +const PAYMENT_WALLET = new anchor.web3.PublicKey( + 'HvwC9QSAzvGXhhVrgPmauVwFWcYZhne3hVot9EbHuFTm', +); +const ENV = 'devnet'; +const CANDY_MACHINE = 'candy_machine'; + +const programId = new anchor.web3.PublicKey( + 'cndyAnrLdpjq1Ssp1z8xxDsB8dxe7u4HL5Nxi2K5WXZ', +); +const TOKEN_METADATA_PROGRAM_ID = new PublicKey( + 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', +); + +const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey( + 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL', +); +const TOKEN_PROGRAM_ID = new PublicKey( + 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', +); +const getTokenWallet = async function (wallet: PublicKey, mint: PublicKey) { + return ( + await PublicKey.findProgramAddress( + [wallet.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + ) + )[0]; +}; + +export function createAssociatedTokenAccountInstruction( + associatedTokenAddress: PublicKey, + payer: PublicKey, + walletAddress: PublicKey, + splTokenMintAddress: PublicKey, +) { + const keys = [ + { + pubkey: payer, + isSigner: true, + isWritable: true, + }, + { + pubkey: associatedTokenAddress, + isSigner: false, + isWritable: true, + }, + { + pubkey: walletAddress, + isSigner: false, + isWritable: false, + }, + { + pubkey: splTokenMintAddress, + isSigner: false, + isWritable: false, + }, + { + pubkey: SystemProgram.programId, + isSigner: false, + isWritable: false, + }, + { + pubkey: TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: SYSVAR_RENT_PUBKEY, + isSigner: false, + isWritable: false, + }, + ]; + return new TransactionInstruction({ + keys, + programId: SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + data: Buffer.from([]), + }); +} + +function chunks(array, size) { + return Array.apply(0, new Array(Math.ceil(array.length / size))).map( + (_, index) => array.slice(index * size, (index + 1) * size), + ); +} + +const configArrayStart = + 32 + // authority + 4 + + 6 + // uuid + u32 len + 4 + + 10 + // u32 len + symbol + 2 + // seller fee basis points + 1 + + 4 + + 5 * 34 + // optional + u32 len + actual vec + 8 + //max supply + 1 + //is mutable + 1 + // retain authority + 4; // max number of lines; +const configLineSize = 4 + 32 + 4 + 200; +program.version('0.0.1'); + +if (!fs.existsSync(CACHE_PATH)) { + fs.mkdirSync(CACHE_PATH); +} + +const getCandyMachine = async (config: anchor.web3.PublicKey, uuid: string) => { + return await anchor.web3.PublicKey.findProgramAddress( + [Buffer.from(CANDY_MACHINE), config.toBuffer(), Buffer.from(uuid)], + programId, + ); +}; + +const getConfig = async (authority: anchor.web3.PublicKey, uuid: string) => { + return await anchor.web3.PublicKey.findProgramAddress( + [Buffer.from(CANDY_MACHINE), authority.toBuffer(), Buffer.from(uuid)], + programId, + ); +}; + +const getMetadata = async ( + mint: anchor.web3.PublicKey, +): Promise => { + return ( + await anchor.web3.PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + ], + TOKEN_METADATA_PROGRAM_ID, + ) + )[0]; +}; + +const getMasterEdition = async ( + mint: anchor.web3.PublicKey, +): Promise => { + return ( + await anchor.web3.PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + Buffer.from('edition'), + ], + TOKEN_METADATA_PROGRAM_ID, + ) + )[0]; +}; + +const createConfig = async function ( + anchorProgram: anchor.Program, + payerWallet: anchor.web3.Keypair, + configData: { + maxNumberOfLines: BN; + symbol: string; + sellerFeeBasisPoints: number; + isMutable: boolean; + maxSupply: BN; + retainAuthority: boolean; + creators: { + address: anchor.web3.PublicKey; + verified: boolean; + share: number; + }[]; + }, +) { + const size = + configArrayStart + + 4 + + configData.maxNumberOfLines.toNumber() * configLineSize + + 4 + + Math.ceil(configData.maxNumberOfLines.toNumber() / 8); + + const config = anchor.web3.Keypair.generate(); + const uuid = config.publicKey.toBase58().slice(0, 6); + + return { + config: config.publicKey, + uuid, + txId: await anchorProgram.rpc.initializeConfig( + { + uuid, + ...configData, + }, + { + accounts: { + config: config.publicKey, + authority: payerWallet.publicKey, + payer: payerWallet.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [payerWallet, config], + instructions: [ + anchor.web3.SystemProgram.createAccount({ + fromPubkey: payerWallet.publicKey, + newAccountPubkey: config.publicKey, + space: size, + lamports: + await anchorProgram.provider.connection.getMinimumBalanceForRentExemption( + size, + ), + programId: programId, + }), + ], + }, + ), + }; +}; + +program + .command('upload') + .argument( + '', + 'Directory containing images named from 0-n', + val => { + return fs.readdirSync(`${val}`).map(file => path.join(val, file)); + }, + ) + .option( + '-u, --url', + 'Solana cluster url', + 'https://api.mainnet-beta.solana.com/', + ) + .option('-k, --keypair ', 'Solana wallet') + // .argument('[second]', 'integer argument', (val) => parseInt(val), 1000) + .option('-s, --start-with', 'Image index to start with', '0') + .option('-n, --number', 'Number of images to upload', '10000') + .option('-c, --cache-name ', 'Cache file name') + .action(async (files: string[], options, cmd) => { + const extension = '.png'; + const { startWith, keypair } = cmd.opts(); + const cacheName = program.getOptionValue('cacheName') || 'temp'; + const cachePath = path.join(CACHE_PATH, cacheName); + const savedContent = fs.existsSync(cachePath) + ? JSON.parse(fs.readFileSync(cachePath).toString()) + : undefined; + const cacheContent = savedContent || {}; + + if (!cacheContent.program) { + cacheContent.program = {}; + } + + let existingInCache = []; + if (!cacheContent.items) { + cacheContent.items = {}; + } else { + existingInCache = Object.keys(cacheContent.items); + } + + const seen = {}; + const newFiles = []; + + files.forEach(f => { + if (!seen[f.replace(extension, '').split('/').pop()]) { + seen[f.replace(extension, '').split('/').pop()] = true; + newFiles.push(f); + } + }); + existingInCache.forEach(f => { + if (!seen[f]) { + seen[f] = true; + newFiles.push(f + '.png'); + } + }); + + const images = newFiles.filter(val => path.extname(val) === extension); + const SIZE = images.length; // images.length; + const walletKey = anchor.web3.Keypair.fromSecretKey( + new Uint8Array(JSON.parse(fs.readFileSync(keypair).toString())), + ); + + // const conversionRates = JSON.parse( + // await ( + // await fetch( + // 'https://api.coingecko.com/api/v3/simple/price?ids=solana,arweave&vs_currencies=usd', + // ) + // ).text(), + // ); + // const baseCost = fetch(``); + // const increment = fetch(``); + + const solConnection = new anchor.web3.Connection( + `https://api.${ENV}.solana.com/`, + ); + + const walletWrapper = new anchor.Wallet(walletKey); + const provider = new anchor.Provider(solConnection, walletWrapper, { + preflightCommitment: 'recent', + }); + const idl = await anchor.Program.fetchIdl(programId, provider); + const anchorProgram = new anchor.Program(idl, programId, provider); + let config = cacheContent.program.config + ? new anchor.web3.PublicKey(cacheContent.program.config) + : undefined; + + const block = await solConnection.getRecentBlockhash(); + for (let i = 0; i < SIZE; i++) { + const image = images[i]; + const imageName = path.basename(image); + const index = imageName.replace(extension, ''); + + console.log(`Processing file: ${index}`); + + const storageCost = 10; + + let link = cacheContent?.items?.[index]?.link; + if (!link || !cacheContent.program.uuid) { + const imageBuffer = Buffer.from(fs.readFileSync(image)); + const manifestPath = image.replace(extension, '.json'); + const manifestContent = fs + .readFileSync(manifestPath) + .toString() + .replace(imageName, 'image.png') + .replace(imageName, 'image.png'); + const manifest = JSON.parse(manifestContent); + + const manifestBuffer = Buffer.from(JSON.stringify(manifest)); + const sizeInBytes = imageBuffer.length + manifestBuffer.length; + + if (i === 0 && !cacheContent.program.uuid) { + // initialize config + try { + const res = await createConfig(anchorProgram, walletKey, { + maxNumberOfLines: new BN(SIZE), + symbol: manifest.symbol, + sellerFeeBasisPoints: manifest.seller_fee_basis_points, + isMutable: true, + maxSupply: new BN(0), + retainAuthority: true, + creators: manifest.properties.creators.map(creator => { + return { + address: new anchor.web3.PublicKey(creator.address), + verified: false, + share: creator.share, + }; + }), + }); + cacheContent.program.uuid = res.uuid; + cacheContent.program.config = res.config.toBase58(); + config = res.config; + + fs.writeFileSync( + path.join(CACHE_PATH, cacheName), + JSON.stringify(cacheContent), + ); + } catch (exx) { + console.error('Error deploying config to Solana network.', exx); + // console.error(exx); + } + } + + if (!link) { + let instructions = [ + anchor.web3.SystemProgram.transfer({ + fromPubkey: walletKey.publicKey, + toPubkey: PAYMENT_WALLET, + lamports: storageCost, + }), + ]; + + const tx = await sendTransactionWithRetryWithKeypair( + solConnection, + walletKey, + instructions, + [], + 'single', + ); + + // data.append('tags', JSON.stringify(tags)); + // payment transaction + const data = new FormData(); + data.append('transaction', tx); + data.append('env', ENV); + data.append('file[]', fs.createReadStream(image), `image.png`); + data.append('file[]', manifestBuffer, 'metadata.json'); + try { + const result = await ( + await fetch( + 'https://us-central1-principal-lane-200702.cloudfunctions.net/uploadFile3', + { + method: 'POST', + body: data, + }, + ) + ).json(); + + const metadataFile = result.messages?.find( + m => m.filename === 'manifest.json', + ); + if (metadataFile?.transactionId) { + link = `https://arweave.net/${metadataFile.transactionId}`; + console.log(`File uploaded: ${link}`); + } + + cacheContent.items[index] = { + link, + name: manifest.name, + onChain: false, + }; + fs.writeFileSync( + path.join(CACHE_PATH, cacheName), + JSON.stringify(cacheContent), + ); + } catch (er) { + console.error(`Error uploading file ${index}`, er); + } + } + } + } + + try { + await Promise.all( + chunks(Array.from(Array(images.length).keys()), 1000).map( + async allIndexesInSlice => { + for ( + let offset = 0; + offset < allIndexesInSlice.length; + offset += 10 + ) { + const indexes = allIndexesInSlice.slice(offset, offset + 10); + const onChain = indexes.filter(i => { + const index = images[i].replace(extension, '').split('/').pop(); + return cacheContent.items[index].onChain; + }); + const ind = images[indexes[0]] + .replace(extension, '') + .split('/') + .pop(); + + if (onChain.length != indexes.length) { + console.log( + 'Writing indices ', + ind, + '-', + parseInt(ind) + indexes.length, + ); + const txId = await anchorProgram.rpc.addConfigLines( + ind, + indexes.map(i => ({ + uri: cacheContent.items[ + images[i].replace(extension, '').split('/').pop() + ].link, + name: cacheContent.items[ + images[i].replace(extension, '').split('/').pop() + ].name, + })), + { + accounts: { + config, + authority: walletKey.publicKey, + }, + signers: [walletKey], + }, + ); + indexes.forEach(i => { + cacheContent.items[ + images[i].replace(extension, '').split('/').pop() + ] = { + ...cacheContent.items[ + images[i].replace(extension, '').split('/').pop() + ], + onChain: true, + }; + }); + fs.writeFileSync( + path.join(CACHE_PATH, cacheName), + JSON.stringify(cacheContent), + ); + } + } + }, + ), + ); + } catch (e) { + console.error(e); + } finally { + fs.writeFileSync( + path.join(CACHE_PATH, cacheName), + JSON.stringify(cacheContent), + ); + } + console.log('Done'); + // TODO: start candy machine + }); +program + .command('set_start_date') + .option('-k, --keypair ', 'Solana wallet') + .option('-c, --cache-name ', 'Cache file name') + .option('-d, --date ', 'timestamp - eg "04 Dec 1995 00:12:00 GMT"') + .action(async (directory, cmd) => { + const solConnection = new anchor.web3.Connection( + `https://api.${ENV}.solana.com/`, + ); + + const { keypair } = cmd.opts(); + + const cacheName = cmd.getOptionValue('cacheName') || 'temp'; + const cachePath = path.join(CACHE_PATH, cacheName); + const cachedContent = fs.existsSync(cachePath) + ? JSON.parse(fs.readFileSync(cachePath).toString()) + : undefined; + + const date = cmd.getOptionValue('date'); + const secondsSinceEpoch = (date ? Date.parse(date) : Date.now()) / 1000; + const walletKey = anchor.web3.Keypair.fromSecretKey( + new Uint8Array(JSON.parse(fs.readFileSync(keypair).toString())), + ); + const walletWrapper = new anchor.Wallet(walletKey); + const provider = new anchor.Provider(solConnection, walletWrapper, { + preflightCommitment: 'recent', + }); + const idl = await anchor.Program.fetchIdl(programId, provider); + const anchorProgram = new anchor.Program(idl, programId, provider); + const [candyMachine, _] = await getCandyMachine( + new anchor.web3.PublicKey(cachedContent.program.config), + cachedContent.program.uuid, + ); + const tx = await anchorProgram.rpc.updateCandyMachine( + null, + new anchor.BN(secondsSinceEpoch), + { + accounts: { + candyMachine, + authority: walletKey.publicKey, + }, + }, + ); + + console.log('Done', secondsSinceEpoch, tx); + }); + +program + .command('create_candy_machine') + .option('-k, --keypair ', 'Solana wallet') + .option('-c, --cache-name ', 'Cache file name') + .option('-p, --price ', 'SOL price') + .action(async (directory, cmd) => { + const solConnection = new anchor.web3.Connection( + `https://api.${ENV}.solana.com/`, + ); + + const { keypair } = cmd.opts(); + const solPriceStr = cmd.getOptionValue('price') || '1'; + + const lamports = parseInt(solPriceStr) * LAMPORTS_PER_SOL; + + const cacheName = program.getOptionValue('cacheName') || 'temp'; + const cachePath = path.join(CACHE_PATH, cacheName); + const cachedContent = fs.existsSync(cachePath) + ? JSON.parse(fs.readFileSync(cachePath).toString()) + : undefined; + + const walletKey = anchor.web3.Keypair.fromSecretKey( + new Uint8Array(JSON.parse(fs.readFileSync(keypair).toString())), + ); + const walletWrapper = new anchor.Wallet(walletKey); + const provider = new anchor.Provider(solConnection, walletWrapper, { + preflightCommitment: 'recent', + }); + const idl = await anchor.Program.fetchIdl(programId, provider); + const anchorProgram = new anchor.Program(idl, programId, provider); + const config = new anchor.web3.PublicKey(cachedContent.program.config); + const [candyMachine, bump] = await getCandyMachine( + config, + cachedContent.program.uuid, + ); + const tx = await anchorProgram.rpc.initializeCandyMachine( + bump, + { + uuid: cachedContent.program.uuid, + price: new anchor.BN(lamports), + itemsAvailable: new anchor.BN(Object.keys(cachedContent.items).length), + goLiveDate: null, + }, + { + accounts: { + candyMachine, + wallet: walletKey.publicKey, + config: config, + authority: walletKey.publicKey, + payer: walletKey.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [], + }, + ); + + console.log('Done'); + }); + +program + .command('mint_token_as_candy_machine_owner') + .option('-k, --keypair ', 'Solana wallet') + .option('-c, --cache-name ', 'Cache file name') + .action(async (directory, cmd) => { + const solConnection = new anchor.web3.Connection( + `https://api.${ENV}.solana.com/`, + ); + + const { keypair } = cmd.opts(); + const solPriceStr = program.getOptionValue('price') || '1'; + const lamports = parseInt(solPriceStr) * LAMPORTS_PER_SOL; + + const cacheName = program.getOptionValue('cacheName') || 'temp'; + const cachePath = path.join(CACHE_PATH, cacheName); + const cachedContent = fs.existsSync(cachePath) + ? JSON.parse(fs.readFileSync(cachePath).toString()) + : undefined; + const mint = anchor.web3.Keypair.generate(); + + const walletKey = anchor.web3.Keypair.fromSecretKey( + new Uint8Array(JSON.parse(fs.readFileSync(keypair).toString())), + ); + const token = await getTokenWallet(walletKey.publicKey, mint.publicKey); + const walletWrapper = new anchor.Wallet(walletKey); + const provider = new anchor.Provider(solConnection, walletWrapper, { + preflightCommitment: 'recent', + }); + const idl = await anchor.Program.fetchIdl(programId, provider); + const anchorProgram = new anchor.Program(idl, programId, provider); + const config = new anchor.web3.PublicKey(cachedContent.program.config); + const [candyMachine, bump] = await getCandyMachine( + config, + cachedContent.program.uuid, + ); + const metadata = await getMetadata(mint.publicKey); + const masterEdition = await getMasterEdition(mint.publicKey); + const tx = await anchorProgram.rpc.mintNft({ + accounts: { + config: config, + candyMachine: candyMachine, + payer: walletKey.publicKey, + wallet: walletKey.publicKey, + mint: mint.publicKey, + metadata, + masterEdition, + mintAuthority: walletKey.publicKey, + updateAuthority: walletKey.publicKey, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + signers: [mint, walletKey], + instructions: [ + anchor.web3.SystemProgram.createAccount({ + fromPubkey: walletKey.publicKey, + newAccountPubkey: mint.publicKey, + space: MintLayout.span, + lamports: await provider.connection.getMinimumBalanceForRentExemption( + MintLayout.span, + ), + programId: TOKEN_PROGRAM_ID, + }), + Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + 0, + walletKey.publicKey, + walletKey.publicKey, + ), + createAssociatedTokenAccountInstruction( + token, + walletKey.publicKey, + walletKey.publicKey, + mint.publicKey, + ), + Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + token, + walletKey.publicKey, + [], + 1, + ), + ], + }); + + console.log('Done', tx); + }); +program + .command('verify') + .option('-c, --cache-name ', 'Cache file name') + .action(async (directory, second, options) => { + const solConnection = new anchor.web3.Connection( + `https://api.${ENV}.solana.com/`, + ); + const cacheName = program.getOptionValue('cacheName') || 'temp'; + const cachePath = path.join(CACHE_PATH, cacheName); + const cachedContent = fs.existsSync(cachePath) + ? JSON.parse(fs.readFileSync(cachePath).toString()) + : undefined; + + const config = await solConnection.getAccountInfo( + new PublicKey(cachedContent.program.config), + ); + + const keys = Object.keys(cachedContent.items); + for (let i = 0; i < keys.length; i++) { + console.log('Looking at key ', i); + const key = keys[i]; + const thisSlice = config.data.slice( + configArrayStart + 4 + configLineSize * i, + configArrayStart + 4 + configLineSize * (i + 1), + ); + const name = fromUTF8Array([...thisSlice.slice(4, 36)]); + const uri = fromUTF8Array([...thisSlice.slice(40, 240)]); + const cacheItem = cachedContent.items[key]; + if (!name.match(cacheItem.name) || !uri.match(cacheItem.link)) { + console.log( + 'Name', + name, + 'or uri', + uri, + 'didnt match cache values of', + cacheItem.name, + 'and', + cacheItem.link, + ' marking to rerun for image', + key, + ); + cacheItem.onChain = false; + } else { + console.log('Name', name, 'with', uri, 'checked out'); + } + } + fs.writeFileSync( + path.join(CACHE_PATH, cacheName), + JSON.stringify(cachedContent), + ); + }); + +program.command('find-wallets').action(() => {}); + +program.parse(process.argv); diff --git a/js/packages/cli/src/helper.ts b/js/packages/cli/src/helper.ts new file mode 100644 index 0000000..f4d419d --- /dev/null +++ b/js/packages/cli/src/helper.ts @@ -0,0 +1,317 @@ +// const createPaymentTransaction = () => { +// // TODO: +// const tx = new Transaction(); +// tx.add(SystemProgram.transfer({ +// fromPubkey: walletKey.publicKey, +// toPubkey: PAYMENT_WALLET, +// lamports: storageCost, +// })); + +import { + Connection, + Keypair, + TransactionInstruction, + Commitment, + Transaction, + RpcResponseAndContext, + SignatureStatus, + SimulatedTransactionResponse, + TransactionSignature, + FeeCalculator, + Blockhash, +} from '@solana/web3.js'; + +interface BlockhashAndFeeCalculator { + blockhash: Blockhash; + feeCalculator: FeeCalculator; +} +export const sendTransactionWithRetryWithKeypair = async ( + connection: Connection, + wallet: Keypair, + instructions: TransactionInstruction[], + signers: Keypair[], + commitment: Commitment = 'singleGossip', + includesFeePayer: boolean = false, + block?: BlockhashAndFeeCalculator, + beforeSend?: () => void, +) => { + let transaction = new Transaction(); + instructions.forEach(instruction => transaction.add(instruction)); + transaction.recentBlockhash = ( + block || (await connection.getRecentBlockhash(commitment)) + ).blockhash; + + if (includesFeePayer) { + transaction.setSigners(...signers.map(s => s.publicKey)); + } else { + transaction.setSigners( + // fee payed by the wallet owner + wallet.publicKey, + ...signers.map(s => s.publicKey), + ); + } + + if (signers.length > 0) { + transaction.partialSign(...signers); + } + + transaction.sign(wallet); + + if (beforeSend) { + beforeSend(); + } + + const { txid, slot } = await sendSignedTransaction({ + connection, + signedTransaction: transaction, + }); + + return { txid, slot }; +}; + +export const getUnixTs = () => { + return new Date().getTime() / 1000; +}; +const DEFAULT_TIMEOUT = 15000; + +export async function sendSignedTransaction({ + signedTransaction, + connection, + timeout = DEFAULT_TIMEOUT, +}: { + signedTransaction: Transaction; + connection: Connection; + sendingMessage?: string; + sentMessage?: string; + successMessage?: string; + timeout?: number; +}): Promise<{ txid: string; slot: number }> { + const rawTransaction = signedTransaction.serialize(); + const startTime = getUnixTs(); + let slot = 0; + const txid: TransactionSignature = await connection.sendRawTransaction( + rawTransaction, + { + skipPreflight: true, + }, + ); + + console.log('Started awaiting confirmation for', txid); + + let done = false; + (async () => { + while (!done && getUnixTs() - startTime < timeout) { + connection.sendRawTransaction(rawTransaction, { + skipPreflight: true, + }); + await sleep(500); + } + })(); + try { + const confirmation = await awaitTransactionSignatureConfirmation( + txid, + timeout, + connection, + 'recent', + true, + ); + + if (!confirmation) + throw new Error('Timed out awaiting confirmation on transaction'); + + if (confirmation.err) { + console.error(confirmation.err); + throw new Error('Transaction failed: Custom instruction error'); + } + + slot = confirmation?.slot || 0; + } catch (err) { + console.error('Timeout Error caught', err); + if (err.timeout) { + throw new Error('Timed out awaiting confirmation on transaction'); + } + let simulateResult: SimulatedTransactionResponse | null = null; + try { + simulateResult = ( + await simulateTransaction(connection, signedTransaction, 'single') + ).value; + } catch (e) {} + if (simulateResult && simulateResult.err) { + if (simulateResult.logs) { + for (let i = simulateResult.logs.length - 1; i >= 0; --i) { + const line = simulateResult.logs[i]; + if (line.startsWith('Program log: ')) { + throw new Error( + 'Transaction failed: ' + line.slice('Program log: '.length), + ); + } + } + } + throw new Error(JSON.stringify(simulateResult.err)); + } + // throw new Error('Transaction failed'); + } finally { + done = true; + } + + console.log('Latency', txid, getUnixTs() - startTime); + return { txid, slot }; +} + +async function simulateTransaction( + connection: Connection, + transaction: Transaction, + commitment: Commitment, +): Promise> { + // @ts-ignore + transaction.recentBlockhash = await connection._recentBlockhash( + // @ts-ignore + connection._disableBlockhashCaching, + ); + + const signData = transaction.serializeMessage(); + // @ts-ignore + const wireTransaction = transaction._serialize(signData); + const encodedTransaction = wireTransaction.toString('base64'); + const config: any = { encoding: 'base64', commitment }; + const args = [encodedTransaction, config]; + + // @ts-ignore + const res = await connection._rpcRequest('simulateTransaction', args); + if (res.error) { + throw new Error('failed to simulate transaction: ' + res.error.message); + } + return res.result; +} + +async function awaitTransactionSignatureConfirmation( + txid: TransactionSignature, + timeout: number, + connection: Connection, + commitment: Commitment = 'recent', + queryStatus = false, +): Promise { + let done = false; + let status: SignatureStatus | null | void = { + slot: 0, + confirmations: 0, + err: null, + }; + let subId = 0; + status = await new Promise(async (resolve, reject) => { + setTimeout(() => { + if (done) { + return; + } + done = true; + console.log('Rejecting for timeout...'); + reject({ timeout: true }); + }, timeout); + try { + subId = connection.onSignature( + txid, + (result, context) => { + done = true; + status = { + err: result.err, + slot: context.slot, + confirmations: 0, + }; + if (result.err) { + console.log('Rejected via websocket', result.err); + reject(status); + } else { + console.log('Resolved via websocket', result); + resolve(status); + } + }, + commitment, + ); + } catch (e) { + done = true; + console.error('WS error in setup', txid, e); + } + while (!done && queryStatus) { + // eslint-disable-next-line no-loop-func + (async () => { + try { + const signatureStatuses = await connection.getSignatureStatuses([ + txid, + ]); + status = signatureStatuses && signatureStatuses.value[0]; + if (!done) { + if (!status) { + console.log('REST null result for', txid, status); + } else if (status.err) { + console.log('REST error for', txid, status); + done = true; + reject(status.err); + } else if (!status.confirmations) { + console.log('REST no confirmations for', txid, status); + } else { + console.log('REST confirmation for', txid, status); + done = true; + resolve(status); + } + } + } catch (e) { + if (!done) { + console.log('REST connection error: txid', txid, e); + } + } + })(); + await sleep(2000); + } + }); + + //@ts-ignore + if (connection._signatureSubscriptions[subId]) + connection.removeSignatureListener(subId); + done = true; + console.log('Returning status', status); + return status; +} + +export function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export function fromUTF8Array(data: number[]) { + // array of bytes + let str = '', + i; + + for (i = 0; i < data.length; i++) { + const value = data[i]; + + if (value < 0x80) { + str += String.fromCharCode(value); + } else if (value > 0xbf && value < 0xe0) { + str += String.fromCharCode(((value & 0x1f) << 6) | (data[i + 1] & 0x3f)); + i += 1; + } else if (value > 0xdf && value < 0xf0) { + str += String.fromCharCode( + ((value & 0x0f) << 12) | + ((data[i + 1] & 0x3f) << 6) | + (data[i + 2] & 0x3f), + ); + i += 2; + } else { + // surrogate pair + const charCode = + (((value & 0x07) << 18) | + ((data[i + 1] & 0x3f) << 12) | + ((data[i + 2] & 0x3f) << 6) | + (data[i + 3] & 0x3f)) - + 0x010000; + + str += String.fromCharCode( + (charCode >> 10) | 0xd800, + (charCode & 0x03ff) | 0xdc00, + ); + i += 3; + } + } + + return str; +} diff --git a/js/packages/cli/src/tsconfig.json b/js/packages/cli/src/tsconfig.json new file mode 100644 index 0000000..2c03376 --- /dev/null +++ b/js/packages/cli/src/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "outDir": "./../build", + "declaration": false, + "esModuleInterop": true, + "noImplicitAny": false, + "removeComments": false, + "isolatedModules": false, + "experimentalDecorators": true, + "downlevelIteration": true, + "emitDecoratorMetadata": true, + "noLib": false, + "preserveConstEnums": true, + "suppressImplicitAnyIndexErrors": true, + "lib": ["dom", "es6"] + }, + "exclude": ["node_modules", "typings/browser", "typings/browser.d.ts"], + "atom": { + "rewriteTsconfig": false + } +} diff --git a/js/packages/web/.env b/js/packages/web/.env index f01fb3a..9d5a95c 100644 --- a/js/packages/web/.env +++ b/js/packages/web/.env @@ -1,3 +1,3 @@ -REACT_APP_STORE_OWNER_ADDRESS_ADDRESS= +REACT_APP_STORE_OWNER_ADDRESS_ADDRESS=CduMjFZLBeg3A9wMP3hQCoU1RQzzCpgSvQNXfCi1GCSB REACT_APP_STORE_ADDRESS= REACT_APP_BIG_STORE=FALSE diff --git a/js/packages/web/src/components/AuctionCard/index.tsx b/js/packages/web/src/components/AuctionCard/index.tsx index 52671dc..e752b29 100644 --- a/js/packages/web/src/components/AuctionCard/index.tsx +++ b/js/packages/web/src/components/AuctionCard/index.tsx @@ -19,6 +19,7 @@ import { BidderMetadata, MAX_METADATA_LEN, MAX_EDITION_LEN, + placeBid, useWalletModal, } from '@oyster/common'; import { useWallet } from '@solana/wallet-adapter-react'; diff --git a/js/yarn.lock b/js/yarn.lock index 82f8dda..8c895ae 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -237,6 +237,11 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-validator-identifier@^7.12.11": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== + "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" @@ -279,6 +284,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@7.13.13": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df" + integrity sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw== + "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.3": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" @@ -380,6 +390,15 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/types@7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.12.tgz#edbf99208ef48852acdff1c8a681a1e4ade580cd" + integrity sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" @@ -2006,6 +2025,26 @@ snake-case "^3.0.4" toml "^3.0.0" +"@project-serum/anchor@^0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.13.2.tgz#c6c9a15720cbecd0f79bab56a0690d156fd06f8a" + integrity sha512-xfjzHBy8ZvJuK1EYAba7+CT6TmJ+UWXmGGm915J0IFJTwGwYT4+bDa/qZF7EnZ6trYxg7owEOMLfvF7Jp+WC0w== + dependencies: + "@project-serum/borsh" "^0.2.2" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.0" + camelcase "^5.3.1" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + "@project-serum/borsh@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.2.tgz#63e558f2d6eb6ab79086bf499dea94da3182498f" @@ -2172,6 +2211,26 @@ superstruct "^0.14.2" tweetnacl "^1.0.0" +"@solana/web3.js@^1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.24.1.tgz#1fb29f344454669183206f452ab3b8792567cade" + integrity sha512-XImMWAvjcXteMQwe1FFjoe6u72xmcu+UYobPIxLEMX29XXWVTalyYRKBXvcOXwz6DliTYnFXmncNEwUDEFFHGg== + dependencies: + "@babel/runtime" "^7.12.5" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + crypto-hash "^1.2.2" + jayson "^3.4.4" + js-sha3 "^0.8.0" + node-fetch "^2.6.1" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + "@testing-library/dom@*", "@testing-library/dom@^7.28.1": version "7.31.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.0.tgz#938451abd3ca27e1b69bb395d4a40759fd7f5b3b" @@ -3096,6 +3155,13 @@ agent-base@4, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + agent-base@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -3292,6 +3358,13 @@ aproba@^2.0.0: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +arconnect@^0.2.8: + version "0.2.9" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.2.9.tgz#be07d2281f20d864a91cdcb44e3eed7fccb97f12" + integrity sha512-Us49eN/+8l6BrkAPdXnJVPwWlxxUPR7QaBjA0j3OBAcioIFRpwTdoPN9FxtwDGN91lgM6ebOudTXJToRiNizoA== + dependencies: + arweave "^1.10.13" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -3402,12 +3475,23 @@ arweave-deploy@^1.9.1: resolved "https://registry.yarnpkg.com/arweave-deploy/-/arweave-deploy-1.9.1.tgz#1cc45fc5eb2fd62985ad4e54076ffe850a6a33f7" integrity sha512-yNC9joASgsqQBASLwNivzMJxUHyXuzWHg7qLIGg/+y5hDprSy3fsMUNJ83qCpATYnmJdnECcBXKESBnhalM88w== +arweave@^1.10.13, arweave@^1.10.16: + version "1.10.16" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.10.16.tgz#b968590cb413242636196d2339562dd106840bb9" + integrity sha512-j2UM7C/2MHO7Mv7wbzhihgVs8uN2+QltA+3cYaM82dNNEBBJylIClJUHHMqsK/2ejCnziQm4FofiUFbsQDdQDg== + dependencies: + arconnect "^0.2.8" + asn1.js "^5.4.1" + axios "^0.21.1" + base64-js "^1.3.1" + bignumber.js "^9.0.1" + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^5.2.0: +asn1.js@^5.2.0, asn1.js@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== @@ -3530,6 +3614,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob-lite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" @@ -3583,6 +3672,13 @@ axios@^0.18.0: follow-redirects "1.5.10" is-buffer "^2.0.2" +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + 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" @@ -4289,6 +4385,15 @@ bip66@^1.1.5: dependencies: safe-buffer "^5.0.1" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blakejs@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" @@ -4606,7 +4711,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1, buffer@^5.4.3: +buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4976,6 +5081,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -5071,7 +5185,7 @@ columnify@^1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5093,6 +5207,11 @@ commander@^6.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" + integrity sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -5651,6 +5770,13 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" +debug@4: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -5695,6 +5821,13 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5719,6 +5852,11 @@ deep-equal@^1.0.1, deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -5848,6 +5986,11 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -6125,7 +6268,7 @@ encoding@0.1.13, encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.4: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -6274,6 +6417,18 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -6974,6 +7129,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" @@ -7361,6 +7521,11 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +follow-redirects@^1.10.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.2.tgz#cecb825047c00f5e66b142f90fed4f515dec789b" + integrity sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA== + for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -7383,6 +7548,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -7416,7 +7590,7 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.0: +from2@^2.1.0, from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -7424,6 +7598,11 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -7433,6 +7612,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -7507,7 +7696,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -7668,6 +7857,11 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -8095,6 +8289,14 @@ https-proxy-agent@^2.2.3: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -8268,7 +8470,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.2, ini@^1.3.4: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -8338,6 +8540,14 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +into-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" + integrity sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA== + dependencies: + from2 "^2.3.0" + p-is-promise "^3.0.0" + invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -9438,6 +9648,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + 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" @@ -10235,6 +10454,11 @@ mimic-response@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -10289,7 +10513,7 @@ minimist-options@^3.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -10333,6 +10557,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" @@ -10417,6 +10646,14 @@ multimatch@^3.0.0: arrify "^1.0.1" minimatch "^3.0.4" +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -10468,6 +10705,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + native-request@^1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.0.8.tgz#8f66bf606e0f7ea27c0e5995eb2f5d03e33ae6fb" @@ -10590,6 +10832,13 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abi@^2.7.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b" + integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg== + dependencies: + semver "^5.4.1" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -10711,6 +10960,11 @@ node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + nopt@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -10864,7 +11118,7 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -11122,6 +11376,11 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" + integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== + p-limit@3.1.0, p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -11529,6 +11788,40 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" +pkg-fetch@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.2.2.tgz#33f391eb176c1844e93189a32f2279b36a1ec949" + integrity sha512-bLhFNT4cNnONxzbHo1H2mCCKuQkCR4dgQtv0gUZnWtp8TDP0v0UAXKHG7DXhAoTC5IYP3slLsFJtIda9ksny8g== + dependencies: + chalk "^4.1.0" + fs-extra "^9.1.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" + progress "^2.0.3" + semver "^7.3.5" + yargs "^16.2.0" + +pkg@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.3.1.tgz#8f81671613b9e5bb1d83c39b2eed4799e1e679fe" + integrity sha512-jT/sptM1ZG++FNk+jnJYNoWLDQXYd7hqpnBhd5j18SNW1jJzNYo55RahuCiD0KN0PX9mb53GWCqKM0ia/mJytA== + dependencies: + "@babel/parser" "7.13.13" + "@babel/types" "7.13.12" + chalk "^4.1.0" + escodegen "^2.0.0" + fs-extra "^9.1.0" + globby "^11.0.3" + into-stream "^6.0.0" + minimist "^1.2.5" + multistream "^4.1.0" + pkg-fetch "3.2.2" + prebuild-install "6.0.1" + progress "^2.0.3" + resolve "^1.20.0" + stream-meter "^1.0.4" + tslib "2.1.0" + platform@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" @@ -11605,6 +11898,27 @@ preact@^10.5.9: resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.13.tgz#85f6c9197ecd736ce8e3bec044d08fd1330fa019" integrity sha512-q/vlKIGNwzTLu+jCcvywgGrt+H/1P/oIRSD6mV4ln3hmlC+Aa34C7yfPI4+5bzW8pONyVXYS7SvXosy2dKKtWQ== +prebuild-install@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.0.1.tgz#5902172f7a40eb67305b96c2a695db32636ee26d" + integrity sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" @@ -11670,7 +11984,7 @@ process@0.11.10, process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -12349,6 +12663,16 @@ rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0: rc-resize-observer "^1.0.0" rc-util "^5.0.7" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-chartjs-2@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-3.0.4.tgz#88e14c6b4d577941c736f0657b071c8273916652" @@ -12556,7 +12880,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -13341,6 +13665,15 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" +simple-get@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -13788,6 +14121,13 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-meter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" + integrity sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0= + dependencies: + readable-stream "^2.1.4" + stream-parser@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" @@ -14011,6 +14351,11 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -14130,6 +14475,27 @@ tape@^4.6.3: string.prototype.trim "~1.2.1" through "~2.3.8" +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -14441,6 +14807,11 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +tslib@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -14577,6 +14948,11 @@ typescript@^4.1.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + uglify-js@^3.1.4: version "3.13.8" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.8.tgz#7c2f9f2553f611f3ff592bdc19c6fb208dc60afb" @@ -14653,6 +15029,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -15606,6 +15987,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" @@ -15649,6 +16035,11 @@ yargs-parser@^15.0.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^20.2.3: version "20.2.7" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" @@ -15687,6 +16078,19 @@ yargs@^14.2.2: y18n "^4.0.0" yargs-parser "^15.0.1" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" diff --git a/rust/Anchor.toml b/rust/Anchor.toml new file mode 100644 index 0000000..76a873b --- /dev/null +++ b/rust/Anchor.toml @@ -0,0 +1,12 @@ +[registry] +url = "https://anchor.projectserum.com" + +[provider] +cluster = "localnet" +wallet = "/Users/jprince/.config/solana/id.json" + +[scripts] +test = "mocha -t 1000000 tests/" + +[workspace] +members = ["nft-candy-machine"] diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 99850ef..3175c1f 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1,7 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 - [[package]] name = "Inflector" version = "0.11.4" @@ -48,6 +46,151 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "anchor-attribute-access-control" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ba6adc8bed8a9b284219ba12489b459ad233679a489edf9642987e6b090473" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2 1.0.28", + "quote 1.0.9", + "regex", + "syn 1.0.75", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab91b688a60b289767724288d73bf5d4fc425438e13d4d4f604a73ab9686c675" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a7a9215bb3b101f7237c06d5fc873278b82f685bfee95e4ec7e8427ff83c390" +dependencies = [ + "anchor-syn", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b26d266d84ec0d8097214cf37430b4681e29da0522fbd3fdb0afc6fc16b2313" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-attribute-interface" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e35d76a8f8bc8934acc877c8643ec14ddcb355d423de8f9b7e225fe9824b60" +dependencies = [ + "anchor-syn", + "anyhow", + "heck", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6e8a3822e58df25ef45125a6dbe5ceeefebea68954f22beeeff83e4bd040a4" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-attribute-state" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86586d43cf7e0f10431e018c72f51cfc60d1ce3323df44249ff3a70a45168b20" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85aa313d4317811983cab3e7a66ede358c4eb3f1fe47acf51a6078cd239bdbe7" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", +] + +[[package]] +name = "anchor-lang" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0b300d7222b786b7947bd1c14ab82a6c519fa1bbce4ed0f0ffe4db1e6c05669" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-interface", + "anchor-attribute-program", + "anchor-attribute-state", + "anchor-derive-accounts", + "base64 0.13.0", + "borsh", + "bytemuck", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-syn" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833a32a3945814ecd8b6fdcb8666580e69037fe2efc4eaa4a9c68b1940450505" +dependencies = [ + "anyhow", + "bs58", + "heck", + "proc-macro2 1.0.28", + "proc-macro2-diagnostics", + "quote 1.0.9", + "serde", + "serde_json", + "sha2", + "syn 1.0.75", + "thiserror", +] + [[package]] name = "ansi_term" version = "0.11.0" @@ -95,7 +238,7 @@ checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -242,7 +385,7 @@ dependencies = [ "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", "proc-macro2 1.0.28", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -253,7 +396,7 @@ checksum = "2102f62f8b6d3edeab871830782285b64cc1830168094db05c8e458f209bc5c3" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -264,7 +407,7 @@ checksum = "196c978c4c9b0b142d446ef3240690bf5a8a33497074a113ff9a337ccb750483" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -295,6 +438,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +[[package]] +name = "bytemuck" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" + [[package]] name = "byteorder" version = "1.4.3" @@ -320,9 +469,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "bzip2" @@ -482,9 +631,9 @@ checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] name = "cpufeatures" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" dependencies = [ "libc", ] @@ -690,7 +839,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -805,7 +954,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -839,7 +988,7 @@ dependencies = [ "num-traits", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -873,7 +1022,7 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", "synstructure", ] @@ -1024,7 +1173,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -1137,11 +1286,11 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" +checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "fnv", "futures-core", "futures-sink", @@ -1149,7 +1298,7 @@ dependencies = [ "http", "indexmap", "slab", - "tokio 1.10.0", + "tokio 1.10.1", "tokio-util", "tracing", ] @@ -1178,6 +1327,15 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1251,7 +1409,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "fnv", "itoa", ] @@ -1262,7 +1420,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "http", "pin-project-lite", ] @@ -1287,11 +1445,11 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.11" +version = "0.14.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" +checksum = "13f67199e765030fa08fe0bd581af683f0d5bc04ea09c2b1102012c5fb90e7fd" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "futures-channel", "futures-core", "futures-util", @@ -1303,7 +1461,7 @@ dependencies = [ "itoa", "pin-project-lite", "socket2 0.4.1", - "tokio 1.10.0", + "tokio 1.10.1", "tower-service", "tracing", "want", @@ -1319,7 +1477,7 @@ dependencies = [ "hyper", "log", "rustls", - "tokio 1.10.0", + "tokio 1.10.1", "tokio-rustls", "webpki", ] @@ -1401,9 +1559,9 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "jobserver" @@ -1465,9 +1623,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.99" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765" +checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" [[package]] name = "libloading" @@ -1544,9 +1702,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -1714,6 +1872,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "nft-candy-machine" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "arrayref", + "spl-token", + "spl-token-metadata", +] + [[package]] name = "nix" version = "0.19.1" @@ -1736,16 +1904,39 @@ dependencies = [ ] [[package]] -name = "num-bigint" +name = "num" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e97c412795abf6c24ba30055a8f20642ea57ca12875220b854cfa501bf1e48" dependencies = [ "autocfg", "num-integer", "num-traits", ] +[[package]] +name = "num-complex" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +dependencies = [ + "num-traits", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -1754,7 +1945,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -1767,6 +1958,29 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.14" @@ -1805,7 +2019,7 @@ dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -1816,9 +2030,9 @@ checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" [[package]] name = "object" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2766204889d09937d00bfbb7fec56bb2a199e2ade963cab19185d8a6104c7c" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" dependencies = [ "memchr", ] @@ -1829,7 +2043,7 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" dependencies = [ - "parking_lot 0.11.1", + "parking_lot 0.11.2", ] [[package]] @@ -1898,7 +2112,7 @@ dependencies = [ "proc-macro-error", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -1924,13 +2138,13 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api 0.4.4", - "parking_lot_core 0.8.3", + "lock_api 0.4.5", + "parking_lot_core 0.8.5", ] [[package]] @@ -1964,9 +2178,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if 1.0.0", "instant", @@ -2026,7 +2240,7 @@ checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -2087,7 +2301,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", "version_check", ] @@ -2132,6 +2346,19 @@ dependencies = [ "unicode-xid 0.2.2", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" +dependencies = [ + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.75", + "version_check", + "yansi", +] + [[package]] name = "qstring" version = "0.7.2" @@ -2333,7 +2560,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" dependencies = [ "base64 0.13.0", - "bytes 1.0.1", + "bytes 1.1.0", "encoding_rs", "futures-core", "futures-util", @@ -2352,7 +2579,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "tokio 1.10.0", + "tokio 1.10.1", "tokio-rustls", "url", "wasm-bindgen", @@ -2389,9 +2616,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc-hash" @@ -2475,7 +2702,7 @@ checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -2490,22 +2717,23 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" +checksum = "5b9bd29cdffb8875b04f71c51058f940cf4e390bbfd2ce669c4f22cd70b492a5" dependencies = [ "bitflags", "core-foundation", "core-foundation-sys", "libc", + "num", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" +checksum = "19133a286e494cc3311c165c4676ccb1fd47bed45b55f9d71fbd784ad4cea6f8" dependencies = [ "core-foundation-sys", "libc", @@ -2546,9 +2774,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.127" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" dependencies = [ "serde_derive", ] @@ -2564,20 +2792,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.127" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] name = "serde_json" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" +checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" dependencies = [ "itoa", "ryu", @@ -2598,12 +2826,12 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.18" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039ba818c784248423789eec090aab9fb566c7b94d6ebbfa1814a9fd52c8afb2" +checksum = "ad104641f3c958dab30eb3010e834c2622d1f3f4c530fef1dee20ad9485f3c09" dependencies = [ "dtoa", - "linked-hash-map", + "indexmap", "serde", "yaml-rust", ] @@ -2622,9 +2850,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", @@ -2704,9 +2932,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e644f9c77d5e59a35aa5fa8cb0a8f186332a3db19abb60f579cf3d750600cf1a" +checksum = "a67e4a537eccc21f8b942f60990d57f76980638db834161747e47cfba4b8f050" dependencies = [ "Inflector", "base64 0.12.3", @@ -2727,9 +2955,9 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a79b6ef4ce2ff4e0a6c515a5030dfd75c69089ddf1a85f805b904516a8bf04" +checksum = "a51c83e33eb5fc2a688db5e7e19a8c5b481385e1d9f30b012962e9bcdb002629" dependencies = [ "bincode", "borsh", @@ -2740,15 +2968,15 @@ dependencies = [ "solana-program", "solana-sdk", "tarpc", - "tokio 1.10.0", + "tokio 1.10.1", "tokio-serde", ] [[package]] name = "solana-banks-interface" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70c75f0b27b97c7e27d7f6ba16e766990e9374d9a9ae0f60183619d5126b041e" +checksum = "f73a34a243df509dfde8fe42129aa34a3db9913e90b7c7eb290f597361016268" dependencies = [ "mio 0.7.13", "serde", @@ -2758,9 +2986,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810298b1760b59356dcccb354f913d059ce12ebf615dcf7bd4520fc991af5f38" +checksum = "3929ed2f73a4a9c80ddff4b1b49ecc81fa6e8689ca475e9e625034aaebc22516" dependencies = [ "bincode", "futures 0.3.16", @@ -2771,16 +2999,16 @@ dependencies = [ "solana-runtime", "solana-sdk", "tarpc", - "tokio 1.10.0", + "tokio 1.10.1", "tokio-serde", "tokio-stream", ] [[package]] name = "solana-bpf-loader-program" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb56a6bf09f3502afc77afaf6b1ed888e1a438ba5cd3f4f471dd82f27b7d80bb" +checksum = "d848ee15b984d2703750a52e3cbe23024256184b11426a1677bc98934087f8c7" dependencies = [ "bincode", "byteorder", @@ -2799,9 +3027,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c57b6f6857ecf2c404cfb550419f67350b716eae49ede1f456d5b5de5b043540" +checksum = "97d2792f093f28b0a7403443225494c0d75215253784897a6f8b8e6fb83ce91a" dependencies = [ "chrono", "clap", @@ -2816,9 +3044,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e214778deefe3c170c1a33c5367d0594c0517bec4093098025cb7b2c662e9b8c" +checksum = "d1c3982b00bf2ac283c86e760aae127d395ab8b610cc3690a0a6ff500ae561e7" dependencies = [ "dirs-next", "lazy_static", @@ -2830,9 +3058,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "932b71d73ef7a588700cbaa0244f25aa8bb3ef30fa2840bafa12aa4d0ca21708" +checksum = "023263a79a3356532549c9e0555c6e1b2a2e94205b5d58c7041703bbd455133d" dependencies = [ "base64 0.13.0", "bincode", @@ -2857,16 +3085,16 @@ dependencies = [ "solana-version", "solana-vote-program", "thiserror", - "tokio 1.10.0", + "tokio 1.10.1", "tungstenite", "url", ] [[package]] name = "solana-config-program" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e67bbd8b59afa4c1d9adeae9bd4b332e34ee06a0e14bbc6222caeed6951f3c" +checksum = "9b5348055cf52ab01efc1578d4159ec40bb39c3913df4365787c3e1382c101c1" dependencies = [ "bincode", "chrono", @@ -2879,9 +3107,9 @@ dependencies = [ [[package]] name = "solana-crate-features" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668eb5b0fd053f35e5664ef6bf3f0da1e3b9bcb5643b8c4aa80cc4433b9d47ce" +checksum = "5c9b446eea7a5af7d4631ce3fd0625439fdc68eda4557223233f1c6bba3e847a" dependencies = [ "backtrace", "bytes 0.4.12", @@ -2897,16 +3125,16 @@ dependencies = [ "ring", "serde", "syn 0.15.44", - "syn 1.0.74", + "syn 1.0.75", "tokio 0.1.22", "winapi 0.3.9", ] [[package]] name = "solana-faucet" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9b774547ae7eab0e20817c5179892ce9a9e9fa572d951aa31d01c5641bd71" +checksum = "d58750a03b49940f486c0dcb5744bb6ee5da82ced6636000a90af7618a67dd1b" dependencies = [ "bincode", "byteorder", @@ -2922,14 +3150,14 @@ dependencies = [ "solana-version", "spl-memo", "thiserror", - "tokio 1.10.0", + "tokio 1.10.1", ] [[package]] name = "solana-frozen-abi" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f5ed8279eb2dca03341ff9ee7a5d9b84a9fc4a4a6d12f112e7ee9ec98ad6cab" +checksum = "45c6760c1dd139c202ef6df28bff467c904aa35b1aa1a59be268c47aec8bc6c0" dependencies = [ "bs58", "bv", @@ -2947,21 +3175,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "888b45e492fdc5216b982437de9ef6bff96423fbe108c01710ecc8769c994a4e" +checksum = "a4dbe296c16dec41e8e6f4e6c2694c6224820d34c0ab11a2d3ff9683f44878ef" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", "rustc_version", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] name = "solana-logger" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cd962c3fc95a433cd5e8368161fa54cfc9f216f66be06a71ccf05f8db3cc518" +checksum = "80af1959b520c0fc99bc6583ba9d82bfa15b1ac007516795bceeb4a951af77c7" dependencies = [ "env_logger", "lazy_static", @@ -2970,9 +3198,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b0405692ecd5b0daea7a6ee8d076afa627492c25623a89e3519e6b8f773e790" +checksum = "db2915d20f35948b35deffa8624cb189385f13758bd171d8d4a966ae8bf360a4" dependencies = [ "log", "solana-metrics", @@ -2981,9 +3209,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b191f80988c11b6be15c33e9fcd48086e0f8d7b64a5215a562b7fefd50858f" +checksum = "8d87867f1f9e399274e08902eb72c9158bef5399e2566161dbe831abeaaa7d14" dependencies = [ "env_logger", "gethostname", @@ -2995,9 +3223,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f826d57f78d3b40fe6c008813367ce70c44e1b2488270b6c68cc050a75d8bb6b" +checksum = "cc7dd877b66b4436b9fcb6d2c2e6055a1dd18b0dcf5938ea1f20efa0b7f09159" dependencies = [ "bincode", "clap", @@ -3011,15 +3239,15 @@ dependencies = [ "solana-logger", "solana-sdk", "solana-version", - "tokio 1.10.0", + "tokio 1.10.1", "url", ] [[package]] name = "solana-program" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd1398350ee06070854399743f4d726b1ea7f71766714b0767cc6133ba18c7b" +checksum = "fe5e5dd99d642b5e89eeb20457310c3c23f20dbf44e67c64e473a02fbc50d646" dependencies = [ "bincode", "blake3", @@ -3052,9 +3280,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1b0f6563b79f3cbbca0f0a5ce04eca634d82c14fa922d0ed662c1609484161" +checksum = "20a2961354afb2ef3ed35ec477961f1f6f0113291c83b993a30382180c496d96" dependencies = [ "async-trait", "base64 0.12.3", @@ -3073,14 +3301,14 @@ dependencies = [ "solana-sdk", "solana-vote-program", "thiserror", - "tokio 1.10.0", + "tokio 1.10.1", ] [[package]] name = "solana-rayon-threadlimit" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436c020428e66f511568edbb1e3d2bddee3336c2dadea4d45ecdcd57572c55bf" +checksum = "30c3a0037afa0b03e0aad9f8fb451d1008d5538023919835cf86c9833bc93103" dependencies = [ "lazy_static", "num_cpus", @@ -3088,9 +3316,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8865f453aabda56c7200b54ef463b1dd1aa824e326293ab5d8ce6a858d5e5bd" +checksum = "083d31e6510a746ecc4ce8d151a232324056c7a124a218948060947b668d6db8" dependencies = [ "base32", "console 0.14.1", @@ -3109,9 +3337,9 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "932185b5b954d3828a39df54487391cd5b982aa994c39c261771b8f8599210bb" +checksum = "f047727075c3434f17d33467bd26033fea3b4e71e7c23caa261015507b162581" dependencies = [ "arrayref", "bincode", @@ -3160,9 +3388,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5475909aab00963154a2748cb3ac78eacce511c2a194b28e041c926099c0d286" +checksum = "0048d346fdf3629dca2bccc2ed63320da9d0291c32b816911ed63d34c65286a5" dependencies = [ "assert_matches", "bincode", @@ -3209,31 +3437,31 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3839bc6b8f3163878e7f1675a0faffa641edf760aec1d9a7a056f71712e94642" +checksum = "fee909dcddb5b4d349b3e5e1ae92f6660cd2f783dea392ae2e73210776aadc9b" dependencies = [ "bs58", "proc-macro2 1.0.28", "quote 1.0.9", "rustversion", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] name = "solana-secp256k1-program" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd7e16a637da71fbb12343ea57e107c49b91ee3d3f858ff09eb65b712bfb76a" +checksum = "bbd4c29c6b269800898610da38de45d28fd56b24cb4030c588ffd6acc11a7443" dependencies = [ "solana-sdk", ] [[package]] name = "solana-stake-program" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626a1205b053064cf2824ae09c5660e6b93443591f65ff5976c9dac1bfc1675b" +checksum = "3c01fa18bedd1773c9abf86fc58b87ed6e1117ce9f42c9a703becc1d351d810d" dependencies = [ "bincode", "log", @@ -3253,9 +3481,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef363db47e30b1b0f9a1a8a3d2fec529ff51588b66b385e1f1ee7db9acd48dc" +checksum = "b6ea7cfdeff6ff1fba74096f3bb94688f0fdb780524e08676323108352532dfa" dependencies = [ "Inflector", "base64 0.12.3", @@ -3277,9 +3505,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d72405fc6f59f499fbea7f79e6fdd1ed20a76c953670dd7416e3fe4f1c2992cc" +checksum = "978569fec8c913d798f5e3dad2c8b6d03a6a30e8e04da633ac356ddde832f933" dependencies = [ "log", "rustc_version", @@ -3293,9 +3521,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.7.10" +version = "1.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c338f2c1bb6056380947a5dcfa0b132a2021a1177f944a8d805cccd14a26d29" +checksum = "506df67749a343d9f9a48b7b5566faf2bc43d0611b520467664a58cd78d4b1be" dependencies = [ "bincode", "log", @@ -3544,9 +3772,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.74" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" +checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", @@ -3561,7 +3789,7 @@ checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", "unicode-xid 0.2.2", ] @@ -3592,7 +3820,7 @@ dependencies = [ "serde", "static_assertions", "tarpc-plugins", - "tokio 1.10.0", + "tokio 1.10.1", "tokio-serde", "tokio-util", ] @@ -3605,7 +3833,7 @@ checksum = "f3240378a22b1195734e085ba71d1d4188d50f034aea82635acc430b7005afb5" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -3661,22 +3889,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "283d5230e63df9608ac7d9691adc1dfb6e701225436eb64d0b9a7f0a5a04f6ec" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "fa3884228611f5cd3608e2d409bf7dce832e4eb3135e3f11addbd7e41bd68e71" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -3749,18 +3977,18 @@ dependencies = [ [[package]] name = "tokio" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cf844b23c6131f624accf65ce0e4e9956a8bb329400ea5bcc26ae3a5c20b0b" +checksum = "92036be488bb6594459f2e03b60e42df6f937fe6ca5c5ffdcb539c6b84dc40f5" dependencies = [ "autocfg", - "bytes 1.0.1", + "bytes 1.1.0", "libc", "memchr", "mio 0.7.13", "num_cpus", "once_cell", - "parking_lot 0.11.1", + "parking_lot 0.11.2", "pin-project-lite", "signal-hook-registry", "tokio-macros", @@ -3828,7 +4056,7 @@ checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", ] [[package]] @@ -3857,7 +4085,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ "rustls", - "tokio 1.10.0", + "tokio 1.10.1", "webpki", ] @@ -3868,7 +4096,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" dependencies = [ "bincode", - "bytes 1.0.1", + "bytes 1.1.0", "educe", "futures-core", "futures-sink", @@ -3885,7 +4113,7 @@ checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" dependencies = [ "futures-core", "pin-project-lite", - "tokio 1.10.0", + "tokio 1.10.1", ] [[package]] @@ -3980,12 +4208,12 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "futures-core", "futures-sink", "log", "pin-project-lite", - "tokio 1.10.0", + "tokio 1.10.1", ] [[package]] @@ -4076,6 +4304,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + [[package]] name = "unicode-width" version = "0.1.8" @@ -4217,7 +4451,7 @@ dependencies = [ "log", "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", "wasm-bindgen-shared", ] @@ -4251,7 +4485,7 @@ checksum = "0195807922713af1e67dc66132c7328206ed9766af3858164fb583eedc25fbad" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4371,6 +4605,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yansi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" + [[package]] name = "zeroize" version = "1.4.1" @@ -4388,7 +4628,7 @@ checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" dependencies = [ "proc-macro2 1.0.28", "quote 1.0.9", - "syn 1.0.74", + "syn 1.0.75", "synstructure", ] diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 1f65d88..8a33bb5 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "nft-candy-machine/", "auction/program", "metaplex/program", "token-vault/program", diff --git a/rust/auction/cli/Cargo.toml b/rust/auction/cli/Cargo.toml index 8cedb73..815c112 100644 --- a/rust/auction/cli/Cargo.toml +++ b/rust/auction/cli/Cargo.toml @@ -15,8 +15,8 @@ clap = "2.33.3" rand = "*" solana-clap-utils = "1.6" solana-cli-config = "1.6" -solana-client = "1.7.6" -solana-program = "1.7.6" -solana-sdk = "1.7.6" +solana-client = "1.7.8" +solana-program = "1.7.8" +solana-sdk = "1.7.8" spl-auction = { path = "../program", features = [ "no-entrypoint" ] } spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } diff --git a/rust/auction/program/Cargo.toml b/rust/auction/program/Cargo.toml index 62c48ce..3e81c9e 100644 --- a/rust/auction/program/Cargo.toml +++ b/rust/auction/program/Cargo.toml @@ -17,13 +17,13 @@ borsh = "0.9.1" num-derive = "0.3" num-traits = "0.2" arrayref = "0.3.6" -solana-program = "1.7.6" +solana-program = "1.7.8" spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } thiserror = "1.0" [dev-dependencies] -solana-program-test = "1.7.6" -solana-sdk = "1.7.6" +solana-program-test = "1.7.8" +solana-sdk = "1.7.8" [lib] crate-type = ["cdylib", "lib"] diff --git a/rust/metaplex/program/Cargo.toml b/rust/metaplex/program/Cargo.toml index 4e9c4dd..b93c1f3 100644 --- a/rust/metaplex/program/Cargo.toml +++ b/rust/metaplex/program/Cargo.toml @@ -17,7 +17,7 @@ spl-auction = { path = "../../auction/program", features = [ "no-entrypoint" ] } num-derive = "0.3" num-traits = "0.2" arrayref = "0.3.6" -solana-program = "1.7.6" +solana-program = "1.7.8" spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } spl-token-vault = { path = "../../token-vault/program", features = [ "no-entrypoint" ] } spl-token-metadata = { path = "../../token-metadata/program", features = [ "no-entrypoint" ] } diff --git a/rust/metaplex/test/Cargo.toml b/rust/metaplex/test/Cargo.toml index 06f2b4f..7e86c30 100644 --- a/rust/metaplex/test/Cargo.toml +++ b/rust/metaplex/test/Cargo.toml @@ -9,9 +9,9 @@ edition = "2018" publish = false [dependencies] -solana-client = "1.7.6" -solana-program = "1.7.6" -solana-sdk = "1.7.6" +solana-client = "1.7.8" +solana-program = "1.7.8" +solana-sdk = "1.7.8" bincode = "1.3.2" arrayref = "0.3.6" borsh = "0.9.1" diff --git a/rust/migrations/deploy.js b/rust/migrations/deploy.js new file mode 100644 index 0000000..7cca271 --- /dev/null +++ b/rust/migrations/deploy.js @@ -0,0 +1,13 @@ + +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@project-serum/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +} diff --git a/rust/nft-candy-machine/Cargo.toml b/rust/nft-candy-machine/Cargo.toml new file mode 100644 index 0000000..8bb8a28 --- /dev/null +++ b/rust/nft-candy-machine/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "nft-candy-machine" +version = "0.1.0" +description = "Created with Anchor" +edition = "2018" + +[lib] +crate-type = ["cdylib", "lib"] +name = "nft_candy_machine" + +[features] +no-entrypoint = [] +no-idl = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = "0.13.2" +arrayref = "0.3.6" +spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } +spl-token-metadata = { path = "../token-metadata/program", features = [ "no-entrypoint" ] } + diff --git a/rust/nft-candy-machine/Xargo.toml b/rust/nft-candy-machine/Xargo.toml new file mode 100644 index 0000000..475fb71 --- /dev/null +++ b/rust/nft-candy-machine/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/rust/nft-candy-machine/src/lib.rs b/rust/nft-candy-machine/src/lib.rs new file mode 100644 index 0000000..1bb60a9 --- /dev/null +++ b/rust/nft-candy-machine/src/lib.rs @@ -0,0 +1,615 @@ +pub mod utils; + +use { + crate::utils::{assert_initialized, assert_owned_by, spl_token_transfer, TokenTransferParams}, + anchor_lang::{ + prelude::*, solana_program::system_program, AnchorDeserialize, AnchorSerialize, + Discriminator, Key, + }, + arrayref::array_ref, + spl_token::state::{Account, Mint}, + spl_token_metadata::{ + instruction::{create_master_edition, create_metadata_accounts, update_metadata_accounts}, + state::{ + MAX_CREATOR_LEN, MAX_CREATOR_LIMIT, MAX_NAME_LENGTH, MAX_SYMBOL_LENGTH, MAX_URI_LENGTH, + }, + }, + std::cell::Ref, +}; + +const PREFIX: &str = "candy_machine"; +#[program] +pub mod nft_candy_machine { + use anchor_lang::solana_program::{ + program::{invoke, invoke_signed}, + system_instruction, + }; + + use super::*; + + pub fn mint_nft<'info>(ctx: Context<'_, '_, '_, 'info, MintNFT<'info>>) -> ProgramResult { + let candy_machine = &mut ctx.accounts.candy_machine; + let config = &ctx.accounts.config; + let clock = &ctx.accounts.clock; + + match candy_machine.data.go_live_date { + None => { + if *ctx.accounts.payer.key != candy_machine.authority { + return Err(ErrorCode::CandyMachineNotLiveYet.into()); + } + } + Some(val) => { + if clock.unix_timestamp < val { + if *ctx.accounts.payer.key != candy_machine.authority { + return Err(ErrorCode::CandyMachineNotLiveYet.into()); + } + } + } + } + + if candy_machine.items_redeemed >= candy_machine.data.items_available { + return Err(ErrorCode::CandyMachineEmpty.into()); + } + + if let Some(mint) = candy_machine.token_mint { + let token_account_info = &ctx.remaining_accounts[0]; + let transfer_authority_info = &ctx.remaining_accounts[1]; + let token_account: Account = assert_initialized(&token_account_info)?; + + assert_owned_by(&token_account_info, &spl_token::id())?; + + if token_account.mint != mint { + return Err(ErrorCode::MintMismatch.into()); + } + + if token_account.amount < candy_machine.data.price { + return Err(ErrorCode::NotEnoughTokens.into()); + } + + spl_token_transfer(TokenTransferParams { + source: token_account_info.clone(), + destination: ctx.accounts.wallet.clone(), + authority: transfer_authority_info.clone(), + authority_signer_seeds: &[], + token_program: ctx.accounts.token_program.clone(), + amount: candy_machine.data.price, + })?; + } else { + if ctx.accounts.payer.lamports() < candy_machine.data.price { + return Err(ErrorCode::NotEnoughSOL.into()); + } + + invoke( + &system_instruction::transfer( + &ctx.accounts.payer.key, + ctx.accounts.wallet.key, + candy_machine.data.price, + ), + &[ + ctx.accounts.payer.clone(), + ctx.accounts.wallet.clone(), + ctx.accounts.system_program.clone(), + ], + )?; + } + + let config_line = get_config_line( + &config.to_account_info(), + candy_machine.items_redeemed as usize, + )?; + + candy_machine.items_redeemed = candy_machine + .items_redeemed + .checked_add(1) + .ok_or(ErrorCode::NumericalOverflowError)?; + + let config_key = config.key(); + let authority_seeds = [ + PREFIX.as_bytes(), + config_key.as_ref(), + candy_machine.data.uuid.as_bytes(), + &[candy_machine.bump], + ]; + + let mut creators: Vec = + vec![spl_token_metadata::state::Creator { + address: candy_machine.key(), + verified: true, + share: 0, + }]; + + for c in &config.data.creators { + creators.push(spl_token_metadata::state::Creator { + address: c.address, + verified: false, + share: c.share, + }); + } + + let metadata_infos = vec![ + ctx.accounts.metadata.clone(), + ctx.accounts.mint.clone(), + ctx.accounts.mint_authority.clone(), + ctx.accounts.payer.clone(), + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.token_program.clone(), + ctx.accounts.system_program.clone(), + ctx.accounts.rent.to_account_info().clone(), + candy_machine.to_account_info().clone(), + ]; + + let master_edition_infos = vec![ + ctx.accounts.master_edition.clone(), + ctx.accounts.mint.clone(), + ctx.accounts.mint_authority.clone(), + ctx.accounts.payer.clone(), + ctx.accounts.metadata.clone(), + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.token_program.clone(), + ctx.accounts.system_program.clone(), + ctx.accounts.rent.to_account_info().clone(), + candy_machine.to_account_info().clone(), + ]; + + invoke_signed( + &create_metadata_accounts( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.metadata.key, + *ctx.accounts.mint.key, + *ctx.accounts.mint_authority.key, + *ctx.accounts.payer.key, + candy_machine.key(), + config_line.name, + config.data.symbol.clone(), + config_line.uri, + Some(creators), + config.data.seller_fee_basis_points, + false, + config.data.is_mutable, + ), + metadata_infos.as_slice(), + &[&authority_seeds], + )?; + + invoke_signed( + &create_master_edition( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.master_edition.key, + *ctx.accounts.mint.key, + candy_machine.key(), + *ctx.accounts.mint_authority.key, + *ctx.accounts.metadata.key, + *ctx.accounts.payer.key, + Some(config.data.max_supply), + ), + master_edition_infos.as_slice(), + &[&authority_seeds], + )?; + + let mut new_update_authority = Some(candy_machine.authority); + + if !ctx.accounts.config.data.retain_authority { + new_update_authority = Some(ctx.accounts.update_authority.key()); + } + + invoke_signed( + &update_metadata_accounts( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.metadata.key, + candy_machine.key(), + new_update_authority, + None, + Some(true), + ), + &[ + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.metadata.clone(), + candy_machine.to_account_info().clone(), + ], + &[&authority_seeds], + )?; + + Ok(()) + } + + pub fn update_candy_machine( + ctx: Context, + price: Option, + go_live_date: Option, + ) -> ProgramResult { + let candy_machine = &mut ctx.accounts.candy_machine; + + if let Some(p) = price { + candy_machine.data.price = p; + } + + if let Some(go_l) = go_live_date { + msg!("Go live date changed to {}", go_l); + candy_machine.data.go_live_date = Some(go_l) + } + Ok(()) + } + + pub fn initialize_config(ctx: Context, data: ConfigData) -> ProgramResult { + let config_info = &mut ctx.accounts.config; + if data.uuid.len() != 6 { + return Err(ErrorCode::UuidMustBeExactly6Length.into()); + } + + let mut config = Config { + data, + authority: *ctx.accounts.authority.key, + }; + + let mut array_of_zeroes = vec![]; + while array_of_zeroes.len() < MAX_SYMBOL_LENGTH - config.data.symbol.len() { + array_of_zeroes.push(0u8); + } + let new_symbol = + config.data.symbol.clone() + std::str::from_utf8(&array_of_zeroes).unwrap(); + config.data.symbol = new_symbol; + + // - 1 because we are going to be a creator + if config.data.creators.len() > MAX_CREATOR_LIMIT - 1 { + return Err(ErrorCode::TooManyCreators.into()); + } + + let mut new_data = Config::discriminator().try_to_vec().unwrap(); + new_data.append(&mut config.try_to_vec().unwrap()); + let mut data = config_info.data.borrow_mut(); + // god forgive me couldnt think of better way to deal with this + for i in 0..new_data.len() { + data[i] = new_data[i]; + } + + let vec_start = + CONFIG_ARRAY_START + 4 + (config.data.max_number_of_lines as usize) * CONFIG_LINE_SIZE; + let as_bytes = (config + .data + .max_number_of_lines + .checked_div(8) + .ok_or(ErrorCode::NumericalOverflowError)? as u32) + .to_le_bytes(); + for i in 0..4 { + data[vec_start + i] = as_bytes[i] + } + + Ok(()) + } + + pub fn add_config_lines( + ctx: Context, + index: u32, + config_lines: Vec, + ) -> ProgramResult { + let config = &mut ctx.accounts.config; + let account = config.to_account_info(); + let current_count = get_config_count(&account.data.borrow())?; + let mut data = account.data.borrow_mut(); + + let mut fixed_config_lines = vec![]; + + if index > config.data.max_number_of_lines - 1 { + return Err(ErrorCode::IndexGreaterThanLength.into()); + } + + for line in &config_lines { + let mut array_of_zeroes = vec![]; + while array_of_zeroes.len() < MAX_NAME_LENGTH - line.name.len() { + array_of_zeroes.push(0u8); + } + let name = line.name.clone() + std::str::from_utf8(&array_of_zeroes).unwrap(); + + let mut array_of_zeroes = vec![]; + while array_of_zeroes.len() < MAX_URI_LENGTH - line.uri.len() { + array_of_zeroes.push(0u8); + } + let uri = line.uri.clone() + std::str::from_utf8(&array_of_zeroes).unwrap(); + fixed_config_lines.push(ConfigLine { name, uri }) + } + + let as_vec = fixed_config_lines.try_to_vec()?; + // remove unneeded u32 because we're just gonna edit the u32 at the front + let serialized: &[u8] = &as_vec.as_slice()[4..]; + + let position = CONFIG_ARRAY_START + 4 + (index as usize) * CONFIG_LINE_SIZE; + + let array_slice: &mut [u8] = + &mut data[position..position + fixed_config_lines.len() * CONFIG_LINE_SIZE]; + array_slice.copy_from_slice(serialized); + + let bit_mask_vec_start = CONFIG_ARRAY_START + + 4 + + (config.data.max_number_of_lines as usize) * CONFIG_LINE_SIZE + + 4; + + let mut new_count = current_count; + for i in 0..fixed_config_lines.len() { + let position = (index as usize) + .checked_add(i) + .ok_or(ErrorCode::NumericalOverflowError)?; + let my_position_in_vec = bit_mask_vec_start + + position + .checked_div(8) + .ok_or(ErrorCode::NumericalOverflowError)?; + let position_from_right = 7 - position + .checked_rem(8) + .ok_or(ErrorCode::NumericalOverflowError)?; + let mask = u8::pow(2, position_from_right as u32); + + let old_value_in_vec = data[my_position_in_vec]; + data[my_position_in_vec] = data[my_position_in_vec] | mask; + msg!( + "My position in vec is {} my mask is going to be {}, the old value is {}", + position, + mask, + old_value_in_vec + ); + msg!( + "My new value is {} and my position from right is {}", + data[my_position_in_vec], + position_from_right + ); + if old_value_in_vec != data[my_position_in_vec] { + new_count = new_count + .checked_add(1) + .ok_or(ErrorCode::NumericalOverflowError)?; + } + } + + // plug in new count. + data[CONFIG_ARRAY_START..CONFIG_ARRAY_START + 4] + .copy_from_slice(&(new_count as u32).to_le_bytes()); + + Ok(()) + } + + pub fn initialize_candy_machine( + ctx: Context, + bump: u8, + data: CandyMachineData, + ) -> ProgramResult { + let candy_machine = &mut ctx.accounts.candy_machine; + + if data.uuid.len() != 6 { + return Err(ErrorCode::UuidMustBeExactly6Length.into()); + } + candy_machine.data = data; + candy_machine.wallet = *ctx.accounts.wallet.key; + candy_machine.authority = *ctx.accounts.authority.key; + candy_machine.config = ctx.accounts.config.key(); + candy_machine.bump = bump; + if ctx.remaining_accounts.len() > 0 { + let token_mint_info = &ctx.remaining_accounts[0]; + let _token_mint: Mint = assert_initialized(&token_mint_info)?; + let token_account: Account = assert_initialized(&ctx.accounts.wallet)?; + + assert_owned_by(&token_mint_info, &spl_token::id())?; + assert_owned_by(&ctx.accounts.wallet, &spl_token::id())?; + + if token_account.mint != *token_mint_info.key { + return Err(ErrorCode::MintMismatch.into()); + } + + candy_machine.token_mint = Some(*token_mint_info.key); + } + + if get_config_count(&ctx.accounts.config.to_account_info().data.borrow())? + != candy_machine.data.items_available as usize + { + return Err(ErrorCode::ConfigLineMismatch.into()); + } + + let _config_line = match get_config_line(&ctx.accounts.config.to_account_info(), 0) { + Ok(val) => val, + Err(_) => return Err(ErrorCode::ConfigMustHaveAtleastOneEntry.into()), + }; + + Ok(()) + } +} + +#[derive(Accounts)] +#[instruction(bump: u8, data: CandyMachineData)] +pub struct InitializeCandyMachine<'info> { + #[account(init, seeds=[PREFIX.as_bytes(), config.key().as_ref(), data.uuid.as_bytes()], payer=payer, bump=bump, space=8+32+32+33+32+64+64+64+200)] + candy_machine: ProgramAccount<'info, CandyMachine>, + #[account(constraint= wallet.owner == &spl_token::id() || (wallet.data_is_empty() && wallet.lamports() > 0) )] + wallet: AccountInfo<'info>, + #[account(has_one=authority)] + config: ProgramAccount<'info, Config>, + #[account(signer, constraint= authority.data_is_empty() && authority.lamports() > 0)] + authority: AccountInfo<'info>, + #[account(mut, signer)] + payer: AccountInfo<'info>, + #[account(address = system_program::ID)] + system_program: AccountInfo<'info>, + rent: Sysvar<'info, Rent>, +} + +#[derive(Accounts)] +#[instruction(data: ConfigData)] +pub struct InitializeConfig<'info> { + #[account(mut, constraint= config.to_account_info().owner == program_id && config.to_account_info().data_len() > CONFIG_ARRAY_START+4+(data.max_number_of_lines as usize)*CONFIG_LINE_SIZE + 4 + (data.max_number_of_lines.checked_div(8).ok_or(ErrorCode::NumericalOverflowError)? as usize))] + config: AccountInfo<'info>, + #[account(constraint= authority.data_is_empty() && authority.lamports() > 0 )] + authority: AccountInfo<'info>, + #[account(mut, signer)] + payer: AccountInfo<'info>, + rent: Sysvar<'info, Rent>, +} + +#[derive(Accounts)] +pub struct AddConfigLines<'info> { + #[account(mut, has_one = authority)] + config: ProgramAccount<'info, Config>, + #[account(signer)] + authority: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct MintNFT<'info> { + config: ProgramAccount<'info, Config>, + #[account(mut, has_one = config, has_one = wallet, seeds=[PREFIX.as_bytes(), config.key().as_ref(), candy_machine.data.uuid.as_bytes(), &[candy_machine.bump]])] + candy_machine: ProgramAccount<'info, CandyMachine>, + #[account(mut, signer)] + payer: AccountInfo<'info>, + #[account(mut)] + wallet: AccountInfo<'info>, + // With the following accounts we aren't using anchor macros because they are CPI'd + // through to token-metadata which will do all the validations we need on them. + #[account(mut)] + metadata: AccountInfo<'info>, + #[account(mut)] + mint: AccountInfo<'info>, + #[account(signer)] + mint_authority: AccountInfo<'info>, + #[account(signer)] + update_authority: AccountInfo<'info>, + #[account(mut)] + master_edition: AccountInfo<'info>, + #[account(address = spl_token_metadata::id())] + token_metadata_program: AccountInfo<'info>, + #[account(address = spl_token::id())] + token_program: AccountInfo<'info>, + #[account(address = system_program::ID)] + system_program: AccountInfo<'info>, + rent: Sysvar<'info, Rent>, + clock: Sysvar<'info, Clock>, +} + +#[derive(Accounts)] +pub struct UpdateCandyMachine<'info> { + #[account(mut, has_one=authority, seeds=[PREFIX.as_bytes(), candy_machine.config.key().as_ref(), candy_machine.data.uuid.as_bytes(), &[candy_machine.bump]])] + candy_machine: ProgramAccount<'info, CandyMachine>, + #[account(signer)] + authority: AccountInfo<'info>, +} + +#[account] +#[derive(Default)] +pub struct CandyMachine { + pub authority: Pubkey, + pub wallet: Pubkey, + pub token_mint: Option, + pub config: Pubkey, + pub data: CandyMachineData, + pub items_redeemed: u64, + pub bump: u8, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] +pub struct CandyMachineData { + pub uuid: String, + pub price: u64, + pub items_available: u64, + pub go_live_date: Option, +} + +pub const CONFIG_ARRAY_START: usize = 32 + // authority +4 + 6 + // uuid + u32 len +4 + MAX_SYMBOL_LENGTH + // u32 len + symbol +2 + // seller fee basis points +1 + 4 + MAX_CREATOR_LIMIT*MAX_CREATOR_LEN + // optional + u32 len + actual vec +8 + //max supply +1 + // is mutable +1 + // retain authority +4; // max number of lines; + +#[account] +#[derive(Default)] +pub struct Config { + pub authority: Pubkey, + pub data: ConfigData, + // there's a borsh vec u32 denoting how many actual lines of data there are currently (eventually equals max number of lines) + // There is actually lines and lines of data after this but we explicitly never want them deserialized. + // here there is a borsh vec u32 indicating number of bytes in bitmask array. + // here there is a number of bytes equal to ceil(max_number_of_lines/8) and it is a bit mask used to figure out when to increment borsh vec u32 +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] +pub struct ConfigData { + pub uuid: String, + /// The symbol for the asset + pub symbol: String, + /// Royalty basis points that goes to creators in secondary sales (0-10000) + pub seller_fee_basis_points: u16, + pub creators: Vec, + pub max_supply: u64, + pub is_mutable: bool, + pub retain_authority: bool, + pub max_number_of_lines: u32, +} + +pub fn get_config_count(data: &Ref<&mut [u8]>) -> core::result::Result { + return Ok(u32::from_le_bytes(*array_ref![data, CONFIG_ARRAY_START, 4]) as usize); +} + +pub fn get_config_line( + a: &AccountInfo, + index: usize, +) -> core::result::Result { + let arr = a.data.borrow(); + + let total = get_config_count(&arr)?; + if index > total { + return Err(ErrorCode::IndexGreaterThanLength.into()); + } + let data_array = &arr[CONFIG_ARRAY_START + 4 + index * (CONFIG_LINE_SIZE) + ..CONFIG_ARRAY_START + 4 + (index + 1) * (CONFIG_LINE_SIZE)]; + + let config_line: ConfigLine = ConfigLine::try_from_slice(data_array)?; + + Ok(config_line) +} + +pub const CONFIG_LINE_SIZE: usize = 4 + MAX_NAME_LENGTH + 4 + MAX_URI_LENGTH; +#[derive(AnchorSerialize, AnchorDeserialize, Debug)] +pub struct ConfigLine { + /// The name of the asset + pub name: String, + /// URI pointing to JSON representing the asset + pub uri: String, +} + +// Unfortunate duplication of token metadata so that IDL picks it up. + +#[derive(AnchorSerialize, AnchorDeserialize, Clone)] +pub struct Creator { + pub address: Pubkey, + pub verified: bool, + // In percentages, NOT basis points ;) Watch out! + pub share: u8, +} + +#[error] +pub enum ErrorCode { + #[msg("Account does not have correct owner!")] + IncorrectOwner, + #[msg("Account is not initialized!")] + Uninitialized, + #[msg("Mint Mismatch!")] + MintMismatch, + #[msg("Index greater than length!")] + IndexGreaterThanLength, + #[msg("Config must have atleast one entry!")] + ConfigMustHaveAtleastOneEntry, + #[msg("Numerical overflow error!")] + NumericalOverflowError, + #[msg("Can only provide up to 4 creators to candy machine (because candy machine is one)!")] + TooManyCreators, + #[msg("Uuid must be exactly of 6 length")] + UuidMustBeExactly6Length, + #[msg("Not enough tokens to pay for this minting")] + NotEnoughTokens, + #[msg("Not enough SOL to pay for this minting")] + NotEnoughSOL, + #[msg("Token transfer failed")] + TokenTransferFailed, + #[msg("Candy machine is empty!")] + CandyMachineEmpty, + #[msg("Candy machine is not live yet!")] + CandyMachineNotLiveYet, + #[msg("Number of config lines must match items available")] + ConfigLineMismatch, +} diff --git a/rust/nft-candy-machine/src/utils.rs b/rust/nft-candy-machine/src/utils.rs new file mode 100644 index 0000000..1473326 --- /dev/null +++ b/rust/nft-candy-machine/src/utils.rs @@ -0,0 +1,71 @@ +use { + crate::ErrorCode, + anchor_lang::{ + prelude::{AccountInfo, ProgramError, ProgramResult, Pubkey}, + solana_program::{ + program::invoke_signed, + program_pack::{IsInitialized, Pack}, + }, + }, +}; + +pub fn assert_initialized( + account_info: &AccountInfo, +) -> Result { + let account: T = T::unpack_unchecked(&account_info.data.borrow())?; + if !account.is_initialized() { + Err(ErrorCode::Uninitialized.into()) + } else { + Ok(account) + } +} + +pub fn assert_owned_by(account: &AccountInfo, owner: &Pubkey) -> ProgramResult { + if account.owner != owner { + Err(ErrorCode::IncorrectOwner.into()) + } else { + Ok(()) + } +} +///TokenTransferParams +pub struct TokenTransferParams<'a: 'b, 'b> { + /// source + pub source: AccountInfo<'a>, + /// destination + pub destination: AccountInfo<'a>, + /// amount + pub amount: u64, + /// authority + pub authority: AccountInfo<'a>, + /// authority_signer_seeds + pub authority_signer_seeds: &'b [&'b [u8]], + /// token_program + pub token_program: AccountInfo<'a>, +} + +#[inline(always)] +pub fn spl_token_transfer(params: TokenTransferParams<'_, '_>) -> ProgramResult { + let TokenTransferParams { + source, + destination, + authority, + token_program, + amount, + authority_signer_seeds, + } = params; + + let result = invoke_signed( + &spl_token::instruction::transfer( + token_program.key, + source.key, + destination.key, + authority.key, + &[], + amount, + )?, + &[source, destination, authority, token_program], + &[authority_signer_seeds], + ); + + result.map_err(|_| ErrorCode::TokenTransferFailed.into()) +} diff --git a/rust/package.json b/rust/package.json new file mode 100644 index 0000000..83bee04 --- /dev/null +++ b/rust/package.json @@ -0,0 +1,26 @@ +{ + "name": "@metaplex/metaplex-programs", + "version": "1.0.0", + "private": true, + "description": "Metaplex Program Tests", + "license": "MIT", + "type": "module", + "author": "Metaplex Contributors", + "devDependencies": { + "@types/mocha": "^9.0.0", + "@project-serum/anchor": "^0.13.2", + "mocha": "^9.0.3", + "ts-mocha": "^8.0.0", + "ts-node": "^10.2.1", + "typescript": "^4.3.5", + "@solana/web3.js": "^1.21.0" + }, + "scripts": { + "idl": "node test/idlToTs", + "test": "env MY_WALLET=$HOME/.config/solana/id.json ts-mocha -p ./tsconfig.json -t 1000000 test/*.ts" + }, + "dependencies": { + "@project-serum/common": "^0.0.1-beta.3", + "quicktype-core": "^6.0.70" + } +} diff --git a/rust/test/idlToTs.js b/rust/test/idlToTs.js new file mode 100644 index 0000000..67640ba --- /dev/null +++ b/rust/test/idlToTs.js @@ -0,0 +1,95 @@ +import { watch, readdir, readFile, writeFile } from "fs/promises"; +import camelcase from "camelcase"; + +const idl = "./target/idl/"; + +function enumVariantToTs(variant) { + return `${variant.name}: { ${variant.name.toLowerCase()}: {} }`; +} + +function enumToTs(struct) { + const enumVariants = struct.type.variants; + if (enumVariants) { + return `export type ${capitalizeFirstLetter( + struct.name + )} = Record> +export const ${capitalizeFirstLetter(struct.name)} = { + ${enumVariants.map(enumVariantToTs).join(",\n ")} +} + `; + } +} + +function allEnumsToTs(idlDef) { + return ` +${idlDef.types ? idlDef.types.map(enumToTs).filter(Boolean).join("\n\n") : ""} +${ + idlDef.accounts + ? idlDef.accounts.map(enumToTs).filter(Boolean).join("\n\n") + : "" +} + `; +} + +function accountToTs(idlName, account) { + return `export type ${capitalizeFirstLetter( + account.name + )} = IdlAccounts<${idlName}>["${account.name}"]`; +} + +function allAccountsToTs(idlName, idlDef) { + return ` +${idlDef.accounts + .map((a) => accountToTs(idlName, a)) + .filter(Boolean) + .join("\n\n")} + `; +} + +function capitalizeFirstLetter(str) { + return str[0].toUpperCase() + str.slice(1); +} + +(async () => { + const files = await readdir(idl); + await Promise.all( + files.map(async (filename) => { + try { + const path = `${idl}${filename}`; + const watcher = watch(path); + async function generate() { + const rawdata = await readFile(path); + console.log(`Change in ${path}`); + const name = filename.replace(".json", "").replace(/\_/g, "-"); + let idlJson = JSON.parse(rawdata.toString()); + for (let account of idlJson.accounts) { + account.name = camelcase(account.name); + } + const idlName = `${capitalizeFirstLetter(camelcase(name))}IDL`; + + const fileContents = `export type ${idlName} = ${JSON.stringify( + idlJson + )}; +import { IdlAccounts } from '@project-serum/anchor'; +${allEnumsToTs(idlJson)} +${allAccountsToTs(idlName, idlJson)} + `; + + writeFile(`./test/${name}-types.ts`, fileContents); + } + await generate(); + for await (const event of watcher) { + await generate(); + } + } catch (err) { + if (err.name === "AbortError") { + console.log("Aborted"); + console.log(err); + return; + } else { + throw err; + } + } + }) + ); +})(); diff --git a/rust/test/nft-candy-machine-types.ts b/rust/test/nft-candy-machine-types.ts new file mode 100644 index 0000000..70b3fc4 --- /dev/null +++ b/rust/test/nft-candy-machine-types.ts @@ -0,0 +1,12 @@ +export type NftCandyMachineIDL = {"version":"0.0.0","name":"nft_candy_machine","instructions":[{"name":"mintNft","accounts":[{"name":"config","isMut":false,"isSigner":false},{"name":"candyMachine","isMut":true,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"wallet","isMut":true,"isSigner":false},{"name":"metadata","isMut":true,"isSigner":false},{"name":"mint","isMut":true,"isSigner":false},{"name":"mintAuthority","isMut":false,"isSigner":true},{"name":"updateAuthority","isMut":false,"isSigner":true},{"name":"masterEdition","isMut":true,"isSigner":false},{"name":"tokenMetadataProgram","isMut":false,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[]},{"name":"updateCandyMachine","accounts":[{"name":"candyMachine","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true}],"args":[{"name":"price","type":{"option":"u64"}},{"name":"goLiveDate","type":{"option":"i64"}}]},{"name":"initializeConfig","accounts":[{"name":"config","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"rent","isMut":false,"isSigner":false}],"args":[{"name":"data","type":{"defined":"ConfigData"}}]},{"name":"addConfigLines","accounts":[{"name":"config","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true}],"args":[{"name":"index","type":"u32"},{"name":"configLines","type":{"vec":{"defined":"ConfigLine"}}}]},{"name":"initializeCandyMachine","accounts":[{"name":"candyMachine","isMut":true,"isSigner":false},{"name":"wallet","isMut":false,"isSigner":false},{"name":"config","isMut":false,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"},{"name":"data","type":{"defined":"CandyMachineData"}}]}],"accounts":[{"name":"candyMachine","type":{"kind":"struct","fields":[{"name":"authority","type":"publicKey"},{"name":"wallet","type":"publicKey"},{"name":"tokenMint","type":{"option":"publicKey"}},{"name":"config","type":"publicKey"},{"name":"data","type":{"defined":"CandyMachineData"}},{"name":"itemsRedeemed","type":"u64"},{"name":"bump","type":"u8"}]}},{"name":"config","type":{"kind":"struct","fields":[{"name":"authority","type":"publicKey"},{"name":"data","type":{"defined":"ConfigData"}}]}}],"types":[{"name":"CandyMachineData","type":{"kind":"struct","fields":[{"name":"uuid","type":"string"},{"name":"price","type":"u64"},{"name":"itemsAvailable","type":"u64"},{"name":"goLiveDate","type":{"option":"i64"}}]}},{"name":"ConfigData","type":{"kind":"struct","fields":[{"name":"uuid","type":"string"},{"name":"symbol","type":"string"},{"name":"sellerFeeBasisPoints","type":"u16"},{"name":"creators","type":{"vec":{"defined":"Creator"}}},{"name":"maxSupply","type":"u64"},{"name":"isMutable","type":"bool"},{"name":"retainAuthority","type":"bool"},{"name":"maxNumberOfLines","type":"u32"}]}},{"name":"ConfigLine","type":{"kind":"struct","fields":[{"name":"name","type":"string"},{"name":"uri","type":"string"}]}},{"name":"Creator","type":{"kind":"struct","fields":[{"name":"address","type":"publicKey"},{"name":"verified","type":"bool"},{"name":"share","type":"u8"}]}}],"errors":[{"code":300,"name":"IncorrectOwner","msg":"Account does not have correct owner!"},{"code":301,"name":"Uninitialized","msg":"Account is not initialized!"},{"code":302,"name":"MintMismatch","msg":"Mint Mismatch!"},{"code":303,"name":"IndexGreaterThanLength","msg":"Index greater than length!"},{"code":304,"name":"ConfigMustHaveAtleastOneEntry","msg":"Config must have atleast one entry!"},{"code":305,"name":"NumericalOverflowError","msg":"Numerical overflow error!"},{"code":306,"name":"TooManyCreators","msg":"Can only provide up to 4 creators to candy machine (because candy machine is one)!"},{"code":307,"name":"UuidMustBeExactly6Length","msg":"Uuid must be exactly of 6 length"},{"code":308,"name":"NotEnoughTokens","msg":"Not enough tokens to pay for this minting"},{"code":309,"name":"NotEnoughSOL","msg":"Not enough SOL to pay for this minting"},{"code":310,"name":"TokenTransferFailed","msg":"Token transfer failed"},{"code":311,"name":"CandyMachineEmpty","msg":"Candy machine is empty!"},{"code":312,"name":"CandyMachineNotLiveYet","msg":"Candy machine is not live yet!"},{"code":313,"name":"ConfigLineMismatch","msg":"Number of config lines must match items available"}]}; +import { IdlAccounts } from '@project-serum/anchor'; + + + + + +export type CandyMachine = IdlAccounts["candyMachine"] + +export type Config = IdlAccounts["config"] + + \ No newline at end of file diff --git a/rust/test/nft-candy-machine.ts b/rust/test/nft-candy-machine.ts new file mode 100644 index 0000000..31cb730 --- /dev/null +++ b/rust/test/nft-candy-machine.ts @@ -0,0 +1,923 @@ +import * as anchor from "@project-serum/anchor"; + +import assert from "assert"; + +import { AccountLayout, MintLayout, Token } from "@solana/spl-token"; +import { + PublicKey, + SystemProgram, + SYSVAR_RENT_PUBKEY, + TransactionInstruction, +} from "@solana/web3.js"; +import { CandyMachine, Config } from "./nft-candy-machine-types"; +const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +); +const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" +); +const TOKEN_METADATA_PROGRAM_ID = new PublicKey( + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" +); +function fromUTF8Array(data: number[]) { + // array of bytes + let str = "", + i; + + for (i = 0; i < data.length; i++) { + const value = data[i]; + + if (value < 0x80) { + str += String.fromCharCode(value); + } else if (value > 0xbf && value < 0xe0) { + str += String.fromCharCode(((value & 0x1f) << 6) | (data[i + 1] & 0x3f)); + i += 1; + } else if (value > 0xdf && value < 0xf0) { + str += String.fromCharCode( + ((value & 0x0f) << 12) | + ((data[i + 1] & 0x3f) << 6) | + (data[i + 2] & 0x3f) + ); + i += 2; + } else { + // surrogate pair + const charCode = + (((value & 0x07) << 18) | + ((data[i + 1] & 0x3f) << 12) | + ((data[i + 2] & 0x3f) << 6) | + (data[i + 3] & 0x3f)) - + 0x010000; + + str += String.fromCharCode( + (charCode >> 10) | 0xd800, + (charCode & 0x03ff) | 0xdc00 + ); + i += 3; + } + } + + return str; +} +export function createAssociatedTokenAccountInstruction( + associatedTokenAddress: PublicKey, + payer: PublicKey, + walletAddress: PublicKey, + splTokenMintAddress: PublicKey +) { + const keys = [ + { + pubkey: payer, + isSigner: true, + isWritable: true, + }, + { + pubkey: associatedTokenAddress, + isSigner: false, + isWritable: true, + }, + { + pubkey: walletAddress, + isSigner: false, + isWritable: false, + }, + { + pubkey: splTokenMintAddress, + isSigner: false, + isWritable: false, + }, + { + pubkey: SystemProgram.programId, + isSigner: false, + isWritable: false, + }, + { + pubkey: TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, + { + pubkey: SYSVAR_RENT_PUBKEY, + isSigner: false, + isWritable: false, + }, + ]; + return new TransactionInstruction({ + keys, + programId: SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + data: Buffer.from([]), + }); +} +const configArrayStart = + 32 + // authority + 4 + + 6 + // uuid + u32 len + 4 + + 10 + // u32 len + symbol + 2 + // seller fee basis points + 1 + + 4 + + 5 * 34 + // optional + u32 len + actual vec + 8 + //max supply + 1 + //is mutable + 1 + // retain authority + 4; // max number of lines; +const configLineSize = 4 + 32 + 4 + 200; + +const CANDY_MACHINE = "candy_machine"; +describe("nft-candy-machine", function () { + // Configure the client to use the local cluster. + const idl = JSON.parse( + require("fs").readFileSync("./target/idl/nft_candy_machine.json", "utf8") + ); + const myWallet = anchor.web3.Keypair.fromSecretKey( + new Uint8Array( + JSON.parse(require("fs").readFileSync(process.env.MY_WALLET, "utf8")) + ) + ); + + const connection = new anchor.web3.Connection( + "https://api.devnet.solana.com/", + "recent" + ); + + // Address of the deployed program. + const programId = new anchor.web3.PublicKey( + "cndyAnrLdpjq1Ssp1z8xxDsB8dxe7u4HL5Nxi2K5WXZ" + ); + + const walletWrapper = new anchor.Wallet(myWallet); + + const provider = new anchor.Provider(connection, walletWrapper, { + preflightCommitment: "recent", + }); + const program = new anchor.Program(idl, programId, provider); + + const getCandyMachine = async ( + config: anchor.web3.PublicKey, + uuid: string + ) => { + return await anchor.web3.PublicKey.findProgramAddress( + [Buffer.from(CANDY_MACHINE), config.toBuffer(), Buffer.from(uuid)], + programId + ); + }; + + const getMetadata = async ( + mint: anchor.web3.PublicKey + ): Promise => { + return ( + await anchor.web3.PublicKey.findProgramAddress( + [ + Buffer.from("metadata"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + ], + TOKEN_METADATA_PROGRAM_ID + ) + )[0]; + }; + + const getMasterEdition = async ( + mint: anchor.web3.PublicKey + ): Promise => { + return ( + await anchor.web3.PublicKey.findProgramAddress( + [ + Buffer.from("metadata"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + Buffer.from("edition"), + ], + TOKEN_METADATA_PROGRAM_ID + ) + )[0]; + }; + + const createConfig = async function ( + that, + retainAuthority: boolean, + size: number + ): Promise { + that.authority = anchor.web3.Keypair.generate(); + that.uuid = anchor.web3.Keypair.generate().publicKey.toBase58().slice(0, 6); + + return await program.instruction.initializeConfig( + { + uuid: that.uuid, + maxNumberOfLines: new anchor.BN(size), + symbol: "SYMBOL", + sellerFeeBasisPoints: 500, + isMutable: true, + maxSupply: new anchor.BN(0), + retainAuthority, + creators: [ + { address: myWallet.publicKey, verified: false, share: 100 }, + ], + }, + { + accounts: { + config: that.config.publicKey, + authority: that.authority.publicKey, + payer: myWallet.publicKey, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [myWallet, that.config], + } + ); + }; + + const addConfigLines = async function ( + that, + size: number + ): Promise { + const sample = { + uri: "www.aol.com", + isMutable: true, + }; + const firstVec = []; + for (let i = 0; i < 5; i++) { + firstVec.push({ ...sample, name: `Sample ${i}` }); + } + + const tx1 = await program.instruction.addConfigLines(0, firstVec, { + accounts: { + config: that.config.publicKey, + authority: that.authority.publicKey, + }, + signers: [that.authority, myWallet], + }); + if (size != 5) { + const secondVec = []; + for (let i = 5; i < 10; i++) { + secondVec.push({ ...sample, name: `Sample ${i}` }); + } + const tx2 = await program.instruction.addConfigLines(5, secondVec, { + accounts: { + config: that.config.publicKey, + authority: that.authority.publicKey, + }, + signers: [that.authority, myWallet], + }); + + // Run tx2 twice to simulate an overwrite which might tip counter to overcount. + return [tx1, tx2, tx2]; + } else return [tx1]; + }; + + const getTokenWallet = async function (wallet: PublicKey, mint: PublicKey) { + return ( + await PublicKey.findProgramAddress( + [wallet.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ) + )[0]; + }; + + describe("sol only", function () { + beforeEach(async function () { + const config = await anchor.web3.Keypair.generate(); + this.config = config; + const txInstr = await createConfig(this, false, 10); + const linesInstr = await addConfigLines(this, 10); + this.candyMachineUuid = anchor.web3.Keypair.generate() + .publicKey.toBase58() + .slice(0, 6); + const [candyMachine, bump] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + + try { + const tx = await program.rpc.initializeCandyMachine( + bump, + { + uuid: this.candyMachineUuid, + price: new anchor.BN(1000000000), + itemsAvailable: new anchor.BN(10), + goLiveDate: null, + }, + { + accounts: { + candyMachine, + wallet: myWallet.publicKey, + config: this.config.publicKey, + authority: this.authority.publicKey, + payer: myWallet.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [myWallet, this.authority, this.config], + instructions: [ + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: config.publicKey, + space: configArrayStart + 4 + 10 * configLineSize + 4 + 2, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + configArrayStart + 4 + 10 * configLineSize + 4 + 2 + ), + programId: programId, + }), + anchor.web3.SystemProgram.transfer({ + fromPubkey: myWallet.publicKey, + toPubkey: this.authority.publicKey, + lamports: 5, + }), + txInstr, + ...linesInstr, + ], + } + ); + } catch (e) { + console.log(e); + throw e; + } + }); + + it("has all ten lines", async function () { + const config = await connection.getAccountInfo(this.config.publicKey); + + const amountOfConfigs = new anchor.BN( + config.data.slice(configArrayStart, configArrayStart + 4), + "le" + ); + assert.equal(amountOfConfigs.toNumber(), 10); + for (let i = 0; i < amountOfConfigs.toNumber(); i++) { + const thisSlice = config.data.slice( + configArrayStart + 4 + configLineSize * i, + configArrayStart + 4 + configLineSize * (i + 1) + ); + const name = fromUTF8Array([...thisSlice.slice(4, 36)]); + const uri = fromUTF8Array([...thisSlice.slice(40, 240)]); + assert.equal(name.replace(/\0/g, "").trim(), `Sample ${i}`); + assert.equal(uri.replace(/\0/g, "").trim(), "www.aol.com"); + } + }); + + it("Is initialized!", async function () { + // Add your test here. + const [candyMachine, bump] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + + const machine: CandyMachine = await program.account.candyMachine.fetch( + candyMachine + ); + assert.equal(machine.data.uuid, this.candyMachineUuid); + assert.ok(machine.wallet.equals(myWallet.publicKey)); + assert.ok(machine.config.equals(this.config.publicKey)); + assert.ok(machine.authority.equals(this.authority.publicKey)); + assert.equal( + machine.data.price.toNumber(), + new anchor.BN(1000000000).toNumber() + ); + assert.equal(machine.bump, bump); + assert.equal( + machine.data.itemsAvailable.toNumber(), + new anchor.BN(10).toNumber() + ); + assert.equal(machine.tokenMint, null); + }); + + it("mints 10x and then ends due to being out of candy", async function () { + for (let i = 0; i < 11; i++) { + const mint = anchor.web3.Keypair.generate(); + const token = await getTokenWallet( + this.authority.publicKey, + mint.publicKey + ); + const metadata = await getMetadata(mint.publicKey); + const masterEdition = await getMasterEdition(mint.publicKey); + const [candyMachine, _] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + try { + const tx = await program.rpc.mintNft({ + accounts: { + config: this.config.publicKey, + candyMachine: candyMachine, + payer: this.authority.publicKey, + wallet: myWallet.publicKey, + mint: mint.publicKey, + metadata, + masterEdition, + mintAuthority: this.authority.publicKey, + updateAuthority: this.authority.publicKey, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + signers: [mint, this.authority, myWallet], + instructions: [ + // Give authority enough to pay off the cost of the nft! + // it'll be funnneled right back + anchor.web3.SystemProgram.transfer({ + fromPubkey: myWallet.publicKey, + toPubkey: this.authority.publicKey, + lamports: 1000000000 + 10000000, // add minting fees in there + }), + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: mint.publicKey, + space: MintLayout.span, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + MintLayout.span + ), + programId: TOKEN_PROGRAM_ID, + }), + Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + 0, + this.authority.publicKey, + this.authority.publicKey + ), + createAssociatedTokenAccountInstruction( + token, + myWallet.publicKey, + this.authority.publicKey, + mint.publicKey + ), + Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + token, + this.authority.publicKey, + [], + 1 + ), + ], + }); + } catch (e) { + if (i != 10) { + console.log("Failure at ", i, e); + throw e; + } + } + + if (i != 10) { + const metadataAccount = await connection.getAccountInfo(metadata); + assert.ok(metadataAccount.data.length > 0); + const masterEditionAccount = await connection.getAccountInfo( + masterEdition + ); + assert.ok(masterEditionAccount.data.length > 0); + } + } + }); + + it("mints with goLive date not as the authority over the candy machine", async function () { + // myWallet isnt authority, this.authority is, so shouldnt be able to mint until goLive set. + const mint = anchor.web3.Keypair.generate(); + const token = await getTokenWallet(myWallet.publicKey, mint.publicKey); + const metadata = await getMetadata(mint.publicKey); + const masterEdition = await getMasterEdition(mint.publicKey); + const [candyMachine, _] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + + try { + const tx = await program.rpc.mintNft({ + accounts: { + config: this.config.publicKey, + candyMachine, + payer: myWallet.publicKey, + wallet: myWallet.publicKey, + mint: mint.publicKey, + metadata, + masterEdition, + mintAuthority: myWallet.publicKey, + updateAuthority: myWallet.publicKey, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + signers: [mint, this.authority, myWallet], + instructions: [ + program.instruction.updateCandyMachine(null, new anchor.BN(500), { + accounts: { + candyMachine, + authority: this.authority.publicKey, + }, + }), + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: mint.publicKey, + space: MintLayout.span, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + MintLayout.span + ), + programId: TOKEN_PROGRAM_ID, + }), + Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + 0, + myWallet.publicKey, + myWallet.publicKey + ), + createAssociatedTokenAccountInstruction( + token, + myWallet.publicKey, + myWallet.publicKey, + mint.publicKey + ), + Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + token, + myWallet.publicKey, + [], + 1 + ), + ], + }); + } catch (e) { + console.log(e); + throw e; + } + + const metadataAccount = await connection.getAccountInfo(metadata); + assert.ok(metadataAccount.data.length > 0); + + const metadataAuthority = metadataAccount.data.slice(1, 33).join(""); + + assert.equal(metadataAuthority, myWallet.publicKey.toBytes().join("")); + + const masterEditionAccount = await connection.getAccountInfo( + masterEdition + ); + assert.ok(masterEditionAccount.data.length > 0); + }); + + it("mints without goLive date", async function () { + const authorityLamports = await connection.getBalance( + this.authority.publicKey + ); + const walletLamports = await connection.getBalance(myWallet.publicKey); + const mint = anchor.web3.Keypair.generate(); + const token = await getTokenWallet( + this.authority.publicKey, + mint.publicKey + ); + const metadata = await getMetadata(mint.publicKey); + const masterEdition = await getMasterEdition(mint.publicKey); + const [candyMachine, _] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + try { + const tx = await program.rpc.mintNft({ + accounts: { + config: this.config.publicKey, + candyMachine: candyMachine, + payer: this.authority.publicKey, + wallet: myWallet.publicKey, + mint: mint.publicKey, + metadata, + masterEdition, + mintAuthority: this.authority.publicKey, + updateAuthority: this.authority.publicKey, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + signers: [mint, this.authority, myWallet], + instructions: [ + // Give authority enough to pay off the cost of the nft! + // it'll be funnneled right back + anchor.web3.SystemProgram.transfer({ + fromPubkey: myWallet.publicKey, + toPubkey: this.authority.publicKey, + lamports: 1000000000 + 10000000, // add minting fees in there + }), + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: mint.publicKey, + space: MintLayout.span, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + MintLayout.span + ), + programId: TOKEN_PROGRAM_ID, + }), + Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + 0, + this.authority.publicKey, + this.authority.publicKey + ), + createAssociatedTokenAccountInstruction( + token, + myWallet.publicKey, + this.authority.publicKey, + mint.publicKey + ), + Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + token, + this.authority.publicKey, + [], + 1 + ), + ], + }); + } catch (e) { + console.log(e); + throw e; + } + + const metadataAccount = await connection.getAccountInfo(metadata); + assert.ok(metadataAccount.data.length > 0); + const masterEditionAccount = await connection.getAccountInfo( + masterEdition + ); + assert.ok(masterEditionAccount.data.length > 0); + // since we transferred in the exact amount in advance from our own wallet, + // should be no net change in authority, and should be minor change in wallet + // since nft price paid back. Only real cost should be tx fees. + const newAuthorityLamports = await connection.getBalance( + this.authority.publicKey + ); + const newWalletLamports = await connection.getBalance(myWallet.publicKey); + assert.ok(authorityLamports - newAuthorityLamports < 10000); + // less minting fees... + assert.ok(walletLamports - newWalletLamports < 15000000); + }); + }); + + describe("token", function () { + beforeEach(async function () { + const config = await anchor.web3.Keypair.generate(); + this.config = config; + const txInstr = await createConfig(this, true, 5); + const linesInstr = await addConfigLines(this, 5); + this.tokenMint = anchor.web3.Keypair.generate(); + this.candyMachineUuid = anchor.web3.Keypair.generate() + .publicKey.toBase58() + .slice(0, 6); + const [candyMachine, bump] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + this.walletToken = await getTokenWallet( + myWallet.publicKey, + this.tokenMint.publicKey + ); + try { + const tx = await program.rpc.initializeCandyMachine( + bump, + { + uuid: this.candyMachineUuid, + price: new anchor.BN(1), + itemsAvailable: new anchor.BN(5), + goLiveDate: null, + }, + { + accounts: { + candyMachine, + wallet: this.walletToken, + config: this.config.publicKey, + authority: this.authority.publicKey, + payer: myWallet.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + remainingAccounts: [ + { + pubkey: this.tokenMint.publicKey, + isWritable: false, + isSigner: true, + }, + ], + signers: [myWallet, this.tokenMint, this.authority, this.config], + instructions: [ + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: config.publicKey, + space: configArrayStart + 4 + 5 * configLineSize + 4 + 1, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + configArrayStart + 4 + 5 * configLineSize + 4 + 1 + ), + programId: programId, + }), + anchor.web3.SystemProgram.transfer({ + fromPubkey: myWallet.publicKey, + toPubkey: this.authority.publicKey, + lamports: 5, + }), + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: this.tokenMint.publicKey, + space: MintLayout.span, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + MintLayout.span + ), + programId: TOKEN_PROGRAM_ID, + }), + Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + this.tokenMint.publicKey, + 0, + myWallet.publicKey, + myWallet.publicKey + ), + createAssociatedTokenAccountInstruction( + this.walletToken, + myWallet.publicKey, + myWallet.publicKey, + this.tokenMint.publicKey + ), + txInstr, + ...linesInstr, + ], + } + ); + } catch (e) { + console.log(e); + throw e; + } + }); + + it("Is initialized!", async function () { + // Add your test here. + const [candyMachine, bump] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + + const machine: CandyMachine = await program.account.candyMachine.fetch( + candyMachine + ); + + assert.equal(machine.data.uuid, this.candyMachineUuid); + assert.ok(machine.wallet.equals(this.walletToken)); + assert.ok(machine.config.equals(this.config.publicKey)); + assert.ok(machine.authority.equals(this.authority.publicKey)); + assert.equal(machine.data.price.toNumber(), new anchor.BN(1).toNumber()); + assert.equal(machine.bump, bump); + + assert.equal( + machine.data.itemsAvailable.toNumber(), + new anchor.BN(5).toNumber() + ); + assert.ok(machine.tokenMint.equals(this.tokenMint.publicKey)); + }); + + it("mints without goLive date", async function () { + const walletTokens = await connection.getTokenAccountBalance( + this.walletToken + ); + const mint = anchor.web3.Keypair.generate(); + const token = await getTokenWallet( + this.authority.publicKey, + mint.publicKey + ); + const transferAuthority = anchor.web3.Keypair.generate(); + const payingToken = await getTokenWallet( + this.authority.publicKey, + this.tokenMint.publicKey + ); + const metadata = await getMetadata(mint.publicKey); + const masterEdition = await getMasterEdition(mint.publicKey); + const [candyMachine, _] = await getCandyMachine( + this.config.publicKey, + this.candyMachineUuid + ); + try { + const tx = await program.rpc.mintNft({ + accounts: { + config: this.config.publicKey, + candyMachine: candyMachine, + payer: this.authority.publicKey, + wallet: this.walletToken, + mint: mint.publicKey, + metadata, + masterEdition, + mintAuthority: this.authority.publicKey, + updateAuthority: this.authority.publicKey, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + remainingAccounts: [ + { + pubkey: payingToken, + isWritable: true, + isSigner: false, + }, + { + pubkey: transferAuthority.publicKey, + isWritable: false, + isSigner: true, + }, + ], + signers: [mint, this.authority, myWallet, transferAuthority], + instructions: [ + // Give authority enough to pay off the cost of the nft! + // it'll be funnneled right back + anchor.web3.SystemProgram.transfer({ + fromPubkey: myWallet.publicKey, + toPubkey: this.authority.publicKey, + lamports: 10000000, // add minting fees in there + }), + anchor.web3.SystemProgram.createAccount({ + fromPubkey: myWallet.publicKey, + newAccountPubkey: mint.publicKey, + space: MintLayout.span, + lamports: + await provider.connection.getMinimumBalanceForRentExemption( + MintLayout.span + ), + programId: TOKEN_PROGRAM_ID, + }), + Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + 0, + this.authority.publicKey, + this.authority.publicKey + ), + createAssociatedTokenAccountInstruction( + token, + myWallet.publicKey, + this.authority.publicKey, + mint.publicKey + ), + Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + mint.publicKey, + token, + this.authority.publicKey, + [], + 1 + ), + // token account we use to pay + createAssociatedTokenAccountInstruction( + payingToken, + myWallet.publicKey, + this.authority.publicKey, + this.tokenMint.publicKey + ), + Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + this.tokenMint.publicKey, + payingToken, + myWallet.publicKey, + [], + 1 + ), + Token.createApproveInstruction( + TOKEN_PROGRAM_ID, + payingToken, + transferAuthority.publicKey, + this.authority.publicKey, + [], + 1 + ), + ], + }); + } catch (e) { + console.log(e); + throw e; + } + + const metadataAccount = await connection.getAccountInfo(metadata); + assert.ok(metadataAccount.data.length > 0); + + const masterEditionAccount = await connection.getAccountInfo( + masterEdition + ); + assert.ok(masterEditionAccount.data.length > 0); + + const newWalletTokens = await connection.getTokenAccountBalance( + this.walletToken + ); + + assert.ok( + newWalletTokens.value.uiAmount - walletTokens.value.uiAmount == 1 + ); + const payingTokenBalance = await connection.getTokenAccountBalance( + payingToken + ); + assert.equal(payingTokenBalance.value.uiAmount, 0); + }); + }); +}); diff --git a/rust/token-metadata/program/Cargo.toml b/rust/token-metadata/program/Cargo.toml index 19cca3f..58050ee 100644 --- a/rust/token-metadata/program/Cargo.toml +++ b/rust/token-metadata/program/Cargo.toml @@ -16,7 +16,7 @@ test-bpf = [] num-derive = "0.3" arrayref = "0.3.6" num-traits = "0.2" -solana-program = "1.7.6" +solana-program = "1.7.8" spl-token-vault = { path = "../../token-vault/program", features = [ "no-entrypoint" ] } spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } thiserror = "1.0" diff --git a/rust/token-metadata/program/src/instruction.rs b/rust/token-metadata/program/src/instruction.rs index 653af91..e69680e 100644 --- a/rust/token-metadata/program/src/instruction.rs +++ b/rust/token-metadata/program/src/instruction.rs @@ -268,7 +268,7 @@ pub fn create_metadata_accounts( AccountMeta::new(metadata_account, false), AccountMeta::new_readonly(mint, false), AccountMeta::new_readonly(mint_authority, true), - AccountMeta::new_readonly(payer, true), + AccountMeta::new(payer, true), AccountMeta::new_readonly(update_authority, update_authority_is_signer), AccountMeta::new_readonly(solana_program::system_program::id(), false), AccountMeta::new_readonly(sysvar::rent::id(), false), @@ -360,7 +360,7 @@ pub fn create_master_edition( AccountMeta::new(mint, false), AccountMeta::new_readonly(update_authority, true), AccountMeta::new_readonly(mint_authority, true), - AccountMeta::new_readonly(payer, true), + AccountMeta::new(payer, true), AccountMeta::new_readonly(metadata, false), AccountMeta::new_readonly(spl_token::id(), false), AccountMeta::new_readonly(solana_program::system_program::id(), false), @@ -434,6 +434,25 @@ pub fn mint_new_edition_from_master_edition_via_token( } } +/// Sign Metadata +#[allow(clippy::too_many_arguments)] +pub fn sign_metadata( + program_id: Pubkey, + metadata: Pubkey, + creator: Pubkey, +) -> Instruction { + Instruction { + program_id, + accounts: vec![ + AccountMeta::new(metadata, false), + AccountMeta::new_readonly(creator, true), + ], + data: MetadataInstruction::SignMetadata + .try_to_vec() + .unwrap(), + } +} + /// Converts a master edition v1 to v2 #[allow(clippy::too_many_arguments)] pub fn convert_master_edition_v1_to_v2( diff --git a/rust/token-metadata/program/src/state.rs b/rust/token-metadata/program/src/state.rs index 9bd2cb2..b7504d8 100644 --- a/rust/token-metadata/program/src/state.rs +++ b/rust/token-metadata/program/src/state.rs @@ -20,10 +20,9 @@ pub const MAX_SYMBOL_LENGTH: usize = 10; pub const MAX_URI_LENGTH: usize = 200; -pub const MAX_METADATA_LEN: usize = 1 - + 32 - + 32 - + 4 +pub const MAX_METADATA_LEN: usize = 1 + 32 + 32 + MAX_DATA_SIZE + 1 + 1 + 9 + 172; + +pub const MAX_DATA_SIZE: usize = 4 + MAX_NAME_LENGTH + 4 + MAX_SYMBOL_LENGTH @@ -32,11 +31,7 @@ pub const MAX_METADATA_LEN: usize = 1 + 2 + 1 + 4 - + MAX_CREATOR_LIMIT * MAX_CREATOR_LEN - + 1 - + 1 - + 9 - + 172; + + MAX_CREATOR_LIMIT * MAX_CREATOR_LEN; pub const MAX_EDITION_LEN: usize = 1 + 32 + 8 + 200; diff --git a/rust/token-metadata/test/Cargo.toml b/rust/token-metadata/test/Cargo.toml index 1f3ffea..50cb696 100644 --- a/rust/token-metadata/test/Cargo.toml +++ b/rust/token-metadata/test/Cargo.toml @@ -9,9 +9,9 @@ edition = "2018" publish = false [dependencies] -solana-client = "1.7.6" -solana-program = "1.7.6" -solana-sdk = "1.7.6" +solana-client = "1.7.8" +solana-program = "1.7.8" +solana-sdk = "1.7.8" bincode = "1.3.2" borsh = "0.9.1" clap = "2.33.3" diff --git a/rust/token-vault/program/Cargo.toml b/rust/token-vault/program/Cargo.toml index 215d1ed..e29c6d0 100644 --- a/rust/token-vault/program/Cargo.toml +++ b/rust/token-vault/program/Cargo.toml @@ -15,7 +15,7 @@ test-bpf = [] [dependencies] num-derive = "0.3" num-traits = "0.2" -solana-program = "1.7.6" +solana-program = "1.7.8" spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } thiserror = "1.0" borsh = "0.9.1" diff --git a/rust/token-vault/test/Cargo.toml b/rust/token-vault/test/Cargo.toml index 0d20798..18d978c 100644 --- a/rust/token-vault/test/Cargo.toml +++ b/rust/token-vault/test/Cargo.toml @@ -9,9 +9,9 @@ edition = "2018" publish = false [dependencies] -solana-client = "1.7.6" -solana-program = "1.7.6" -solana-sdk = "1.7.6" +solana-client = "1.7.8" +solana-program = "1.7.8" +solana-sdk = "1.7.8" bincode = "1.3.2" borsh = "0.9.1" clap = "2.33.3" diff --git a/rust/tsconfig.json b/rust/tsconfig.json new file mode 100644 index 0000000..8634a05 --- /dev/null +++ b/rust/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/rust/yarn.lock b/rust/yarn.lock new file mode 100644 index 0000000..c6e2806 --- /dev/null +++ b/rust/yarn.lock @@ -0,0 +1,1874 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"101@^1.0.0", "101@^1.2.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/101/-/101-1.6.3.tgz#9071196e60c47e4ce327075cf49c0ad79bd822fd" + integrity sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw== + dependencies: + clone "^1.0.2" + deep-eql "^0.1.3" + keypather "^1.10.2" + +"@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" + integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== + dependencies: + regenerator-runtime "^0.13.4" + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" + integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + +"@mark.probst/unicode-properties@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mark.probst/unicode-properties/-/unicode-properties-1.1.0.tgz#5caafeab4737df93163d6d288007df33f9939b80" + integrity sha512-7AQsO0hMmpqDledV7AhBuSYqYPFsKP9PaltMecX9nlnsyFxqtsqUg9/pvB2L/jxvskrDrNkdKYz2KTbQznCtng== + dependencies: + brfs "^1.4.0" + unicode-trie "^0.3.0" + +"@project-serum/anchor@^0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.11.1.tgz#155bff2c70652eafdcfd5559c81a83bb19cec9ff" + integrity sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA== + dependencies: + "@project-serum/borsh" "^0.2.2" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.0" + camelcase "^5.3.1" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + +"@project-serum/anchor@^0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.13.2.tgz#c6c9a15720cbecd0f79bab56a0690d156fd06f8a" + integrity sha512-xfjzHBy8ZvJuK1EYAba7+CT6TmJ+UWXmGGm915J0IFJTwGwYT4+bDa/qZF7EnZ6trYxg7owEOMLfvF7Jp+WC0w== + dependencies: + "@project-serum/borsh" "^0.2.2" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.0" + camelcase "^5.3.1" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + +"@project-serum/borsh@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.2.tgz#63e558f2d6eb6ab79086bf499dea94da3182498f" + integrity sha512-Ms+aWmGVW6bWd3b0+MWwoaYig2QD0F90h0uhr7AzY3dpCb5e2S6RsRW02vFTfa085pY2VLB7nTZNbFECQ1liTg== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@project-serum/common@^0.0.1-beta.3": + version "0.0.1-beta.3" + resolved "https://registry.yarnpkg.com/@project-serum/common/-/common-0.0.1-beta.3.tgz#53586eaff9d9fd7e8938b1e12080c935b8b6ad07" + integrity sha512-gnQE/eUydTtto5okCgLWj1M97R9RRPJqnhKklikYI7jP/pnNhDmngSXC/dmfzED2GXSJEIKNIlxVw1k+E2Aw3w== + dependencies: + "@project-serum/serum" "^0.13.21" + bn.js "^5.1.2" + superstruct "0.8.3" + +"@project-serum/serum@^0.13.21": + version "0.13.57" + resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.13.57.tgz#e194f5a7bb28c50cd3611d6f1559fd09e060b748" + integrity sha512-I638MKCEIQDv1WoPeRJhjOUmAn73fQCy1hNyb3f6GIecwxfiesoN6e0CClXyN7GG2nE7KPjFejGkF1KziJaltA== + dependencies: + "@project-serum/anchor" "^0.11.1" + "@solana/spl-token" "^0.1.6" + "@solana/web3.js" "^1.21.0" + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@solana/buffer-layout@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" + integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== + dependencies: + buffer "~6.0.3" + +"@solana/spl-token@^0.1.6": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.8.tgz#f06e746341ef8d04165e21fc7f555492a2a0faa6" + integrity sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ== + dependencies: + "@babel/runtime" "^7.10.5" + "@solana/web3.js" "^1.21.0" + bn.js "^5.1.0" + buffer "6.0.3" + buffer-layout "^1.2.0" + dotenv "10.0.0" + +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.24.1.tgz#1fb29f344454669183206f452ab3b8792567cade" + integrity sha512-XImMWAvjcXteMQwe1FFjoe6u72xmcu+UYobPIxLEMX29XXWVTalyYRKBXvcOXwz6DliTYnFXmncNEwUDEFFHGg== + dependencies: + "@babel/runtime" "^7.12.5" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + crypto-hash "^1.2.2" + jayson "^3.4.4" + js-sha3 "^0.8.0" + node-fetch "^2.6.1" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/bn.js@^4.11.5": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/connect@^3.4.33": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.9": + version "4.17.24" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/lodash@^4.14.159": + version "4.14.172" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a" + integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw== + +"@types/mocha@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" + integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== + +"@types/node@*": + version "16.7.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.1.tgz#c6b9198178da504dfca1fd0be9b2e1002f1586f0" + integrity sha512-ncRdc45SoYJ2H4eWU9ReDfp3vtFqDYhjOsKlFFUDEn8V1Bgr2RjYal8YT5byfadWIRluhPFU6JiDOl0H6Sl87A== + +"@types/node@^12.12.54": + version "12.20.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.20.tgz#ce3d6c13c15c5e622a85efcd3a1cb2d9c7fa43a6" + integrity sha512-kqmxiJg4AT7rsSPIhO6eoBIx9mNwwpeH42yjtgQh6X2ANSpLpvToMXv+LMFdfxpwG1FZXZ41OGZMiUAtbBLEvg== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +acorn-walk@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" + integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +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.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +assert-args@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/assert-args/-/assert-args-1.2.1.tgz#404103a1452a32fe77898811e54e590a8a9373bd" + integrity sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70= + dependencies: + "101" "^1.2.0" + compound-subject "0.0.1" + debug "^2.2.0" + get-prototype-of "0.0.0" + is-capitalized "^1.0.0" + is-class "0.0.4" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +borsh@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" + integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== + dependencies: + "@types/bn.js" "^4.11.5" + bn.js "^5.0.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +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== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brfs@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" + integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== + dependencies: + quote-stream "^1.0.1" + resolve "^1.1.5" + static-module "^2.2.0" + through2 "^2.0.0" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-or-node@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-1.3.0.tgz#f2a4e8568f60263050a6714b2cc236bb976647a7" + integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-layout@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +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== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" + integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== + dependencies: + node-gyp-build "^4.2.0" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +collection-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collection-utils/-/collection-utils-1.0.1.tgz#31d14336488674f27aefc0a7c5eccacf6df78044" + integrity sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +compound-subject@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/compound-subject/-/compound-subject-0.0.1.tgz#271554698a15ae608b1dfcafd30b7ba1ea892c4b" + integrity sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +convert-source-map@^1.5.1: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +crypto-hash@^1.2.2, crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= + dependencies: + type-detect "0.1.1" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +elliptic@^6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@~1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" + integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== + dependencies: + traverse-chain "~0.1.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-prototype-of@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/get-prototype-of/-/get-prototype-of-0.0.0.tgz#98772bd10716d16deb4b322516c469efca28ac44" + integrity sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ= + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-capitalized@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-capitalized/-/is-capitalized-1.0.0.tgz#4c8464b4d91d3e4eeb44889dd2cd8f1b0ac4c136" + integrity sha1-TIRktNkdPk7rRIid0s2PGwrEwTY= + +is-class@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/is-class/-/is-class-0.0.4.tgz#e057451705bb34e39e3e33598c93a9837296b736" + integrity sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY= + +is-core-module@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" + integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "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" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isomorphic-fetch@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^3.4.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.4.tgz#9e9d1ba2a75d811f254bceff61a096772fa04832" + integrity sha512-GH63DsRFFlodS8krFgAhxwYvQFmSwjsFxKnPrHQtp+BJj/tpeSj3hyBGGqmTkuq043U1Gn6u8VdsVRFZX1EEiQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/express-serve-static-core" "^4.17.9" + "@types/lodash" "^4.14.159" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^3.4.0" + ws "^7.4.5" + +js-base64@^2.4.3: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +keypather@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614" + integrity sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ= + dependencies: + "101" "^1.0.0" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +magic-string@^0.22.4: + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== + dependencies: + vlq "^0.2.2" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +merge-source-map@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= + dependencies: + source-map "^0.5.6" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "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.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@^9.0.3: + version "9.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.0.tgz#0a7aa6fc4f59d1015d4e11747d9104b752553c67" + integrity sha512-Kjg/XxYOFFUi0h/FwMOeb6RoroiZ+P1yOfya6NK7h3dNhahrJx1r2XIT3ge4ZQvJM86mdjNA+W5phqRQh7DwCg== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.2" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.23" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.5" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp-build@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-inspect@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" + integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== + +object-keys@^1.0.6: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + +pako@^1.0.6: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +pako@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +quicktype-core@^6.0.70: + version "6.0.70" + resolved "https://registry.yarnpkg.com/quicktype-core/-/quicktype-core-6.0.70.tgz#3be15eef505d356bc16fad01d2941d726c0a5700" + integrity sha512-BMoG1omvauNhgGFzz1AkFVIC0LPXPArE6cCGI5fTeHvXKQsVUCbHt+seee2TaqUkELX9Pk6yA0s8OW8vW3kllA== + dependencies: + "@mark.probst/unicode-properties" "~1.1.0" + browser-or-node "^1.2.1" + collection-utils "^1.0.1" + is-url "^1.2.4" + isomorphic-fetch "^2.2.1" + js-base64 "^2.4.3" + pako "^1.0.6" + pluralize "^7.0.0" + readable-stream "2.3.0" + urijs "^1.19.1" + wordwrap "^1.0.0" + yaml "^1.5.0" + +quote-stream@^1.0.1, quote-stream@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= + dependencies: + buffer-equal "0.0.1" + minimist "^1.1.3" + through2 "^2.0.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.0.tgz#640f5dcda88c91a8dc60787145629170813a1ed2" + integrity sha512-c7KMXGd4b48nN3OJ1U9qOsn6pXNzf6kLd3kdZCkg2sxAcoiufInqF0XckwEnlrcwuaYwonlNK8GQUIOC/WC7sg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.0" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.3, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +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== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +resolve@^1.1.5: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +rpc-websockets@^7.4.2: + version "7.4.12" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.12.tgz#6a187a772cbe9ee48ed04e001b6d9c29b8e69bae" + integrity sha512-WxZRM4443SiYbJhsLwVJc6P/VAQJIkeDS89CQAuHqyMt/GX8GEplWZezcLw6MMGemzA6Kp32kz7CbQppMTLQxA== + dependencies: + "@babel/runtime" "^7.11.2" + assert-args "^1.2.1" + circular-json "^0.5.9" + eventemitter3 "^4.0.7" + uuid "^8.3.0" + ws "^7.4.5" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +secp256k1@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.6: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +static-eval@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +static-module@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" + integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== + dependencies: + concat-stream "~1.6.0" + convert-source-map "^1.5.1" + duplexer2 "~0.1.4" + escodegen "~1.9.0" + falafel "^2.1.0" + has "^1.0.1" + magic-string "^0.22.4" + merge-source-map "1.0.4" + object-inspect "~1.4.0" + quote-stream "~1.0.2" + readable-stream "~2.3.3" + shallow-copy "~0.0.1" + static-eval "^2.0.0" + through2 "~2.0.3" + +"string-width@^1.0.2 || 2": + 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.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.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: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.8.3.tgz#fb4d8901aca3bf9f79afab1bbab7a7f335cc4ef2" + integrity sha512-LbtbFpktW1FcwxVIJlxdk7bCyBq/GzOx2FSFLRLTUhWIA1gHkYPIl3aXRG5mBdGZtnPNT6t+4eEcLDCMOuBHww== + dependencies: + kind-of "^6.0.2" + tiny-invariant "^1.0.6" + +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== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "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== + +through2@^2.0.0, through2@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tiny-inflate@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== + +tiny-invariant@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +traverse-chain@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" + integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= + +ts-mocha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" + integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +ts-node@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" + integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== + dependencies: + "@cspotcode/source-map-support" "0.6.1" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + +tsconfig-paths@^3.5.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" + integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q== + dependencies: + json5 "^2.2.0" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tweetnacl@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + +unicode-trie@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" + integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU= + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + +urijs@^1.19.1: + version "1.19.7" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.7.tgz#4f594e59113928fea63c00ce688fb395b1168ab9" + integrity sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA== + +utf-8-validate@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1" + integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ== + dependencies: + node-gyp-build "^4.2.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +workerpool@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.4.5: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaml@^1.5.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==