diff --git a/js/packages/cli/src/gumdrop-cli.ts b/js/packages/cli/src/gumdrop-cli.ts new file mode 100644 index 0000000000..f935502f52 --- /dev/null +++ b/js/packages/cli/src/gumdrop-cli.ts @@ -0,0 +1,618 @@ +#!/usr/bin/env ts-node +import * as fs from 'fs'; +import * as path from 'path'; +import { program } from 'commander'; +import log from 'loglevel'; + +import { + SESv2Client, + CreateContactListCommand, + GetContactCommand, +} from '@aws-sdk/client-sesv2'; +import * as anchor from '@project-serum/anchor'; +import * as discord from 'discord.js'; +import { + Commitment, + Connection as RPCConnection, + Keypair, + PublicKey, + Transaction, + TransactionInstruction, +} from '@solana/web3.js'; +import BN from 'bn.js'; +import * as crypto from 'crypto'; + +import { + ClaimantInfo, + Claimants, + buildGumdrop, + closeGumdrop, + dropInfoFor, + parseClaimants, + validateTransferClaims, + validateCandyClaims, + validateEditionClaims, +} from './helpers/gumdrop/claimant'; +import { + AuthKeys, + DropInfo, + Response as DResponse, + distributeAwsSes, + distributeAwsSns, + distributeManual, + distributeWallet, + formatDropMessage, + urlAndHandleFor, +} from './helpers/gumdrop/communication'; +import { + GUMDROP_TEMPORAL_SIGNER, + GUMDROP_DISTRIBUTOR_ID, +} from './helpers/constants'; +import { sendSignedTransaction } from './helpers/transactions'; + +program.version('0.0.1'); + +const LOG_PATH = './.log'; + +if (!fs.existsSync(LOG_PATH)) { + fs.mkdirSync(LOG_PATH); +} + +log.setLevel(log.levels.INFO); + +programCommand('create') + .option( + '--claim-integration ', + 'Backend for claims. Either `transfer` for token-transfers through approve-delegate, `candy` for minting through a candy-machine, or `edition` for minting through a master edition', + ) + .option('--transfer-mint ', 'transfer: public key of mint') + .option( + '--candy-config ', + 'candy: public key of the candy machine config', + ) + .option( + '--candy-uuid ', + 'candy: uuid used to construct the candy machine', + ) + .option('--edition-mint ', 'edition: mint of the master edition') + .option( + '--distribution-method ', + // TODO: more explanation + 'Off-chain distribution of claims. Either `aws-email`, `aws-sms`, `discord`, `manual`, or `wallets`', + ) + .option('--aws-ses-access-key-id ', 'Access Key Id') + .option('--aws-ses-secret-access-key ', 'Secret Access Key') + .option('--discord-token ', 'Discord bot token') + .option('--discord-guild ', 'Discord guild with members') + .option( + '--otp-auth ', + 'Off-chain OTP from claim. Either `default` for AWS OTP endpoint or `none` to skip OTP', + ) + .option('--distribution-list ', 'List of users to build gumdrop from.') + .option( + '--resend-only', + 'Distribute list with off-chain method only. Assumes a validator and urls already exist', + ) + .option( + '--host ', + 'Website to claim gumdrop', + 'https://lwus.github.io/gumdrop', + ) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .action(async (options, cmd) => { + log.info(`Parsed options:`, options); + + const wallet = loadWalletKey(options.keypair); + const connection = new anchor.web3.Connection( + //@ts-ignore + options.rpcUrl || anchor.web3.clusterApiUrl(options.env), + ); + + const getTemporalSigner = auth => { + switch (auth) { + case 'default': + return GUMDROP_TEMPORAL_SIGNER; + case 'none': + return PublicKey.default; + default: + throw new Error(`Unknown OTP authorization type ${auth}`); + } + }; + + if (!options.host) { + throw new Error('No host website specified'); + } + + let temporalSigner; + switch (options.distributionMethod) { + case 'wallets': + temporalSigner = GUMDROP_DISTRIBUTOR_ID; + break; + case 'manual': + case 'aws-email': + case 'aws-sms': + case 'discord': + temporalSigner = getTemporalSigner(options.otpAuth); + break; + default: + throw new Error( + "Distribution method must either be 'aws-email', 'aws-sms', 'discord', 'manual', or 'wallets'.", + ); + } + console.log(`temporal signer: ${temporalSigner.toBase58()}`); + + let claimantsStr; + try { + claimantsStr = fs.readFileSync(options.distributionList).toString(); + } catch (err) { + throw new Error(`Could not read distribution list ${err}`); + } + + const claimants = parseClaimants( + claimantsStr, + options.distributionList, + options.distributionMethod, + ); + if (claimants.length === 0) { + throw new Error(`No claimants provided`); + } + + const dropInfo = dropInfoFor( + options.env, + options.claimIntegration, + options.transferMint, + options.candyConfig, + options.editionMint, + ); + + const distribute = (claimants: Claimants) => { + switch (options.distributionMethod) { + case 'wallets': + return distributeWallet({}, '', claimants, dropInfo); + case 'manual': + return distributeManual({}, '', claimants, dropInfo); + case 'aws-email': + return distributeAwsSes( + { + accessKeyId: options.awsSesAccessKeyId, + secretAccessKey: options.awsSesSecretAccessKey, + }, + 'santa@aws.metaplex.com', + claimants, + dropInfo, + ); + case 'aws-sms': + return distributeAwsSns( + { + accessKeyId: options.awsSesAccessKeyId, + secretAccessKey: options.awsSesSecretAccessKey, + }, + '', + claimants, + dropInfo, + ); + case 'discord': + return distributeDiscord( + { + botToken: options.discordToken, + guild: options.discordGuild, + }, + '', + claimants, + dropInfo, + ); + } + }; + await distribute([]); // check that auth is correct... + + if (options.resendOnly) { + if (claimants.some(c => typeof c.url !== 'string')) { + throw new Error( + "Specified resend only but not all claimants have a 'url'", + ); + } + const responses = await distribute(claimants); + // TODO: old path.1? + const respPath = logPath( + options.env, + `resp-${Keypair.generate().publicKey.toBase58()}.json`, + ); + console.log(`writing responses to ${respPath}`); + fs.writeFileSync(respPath, JSON.stringify(responses)); + return; + } + + let claimInfo; + switch (options.claimIntegration) { + case 'transfer': { + claimInfo = await validateTransferClaims( + connection, + wallet.publicKey, + claimants, + options.transferMint, + ); + break; + } + case 'candy': { + claimInfo = await validateCandyClaims( + connection, + wallet.publicKey, + claimants, + options.candyConfig, + options.candyUuid, + ); + break; + } + case 'edition': { + claimInfo = await validateEditionClaims( + connection, + wallet.publicKey, + claimants, + options.editionMint, + ); + break; + } + default: + throw new Error( + "Claim integration must either be 'transfer', 'candy', or 'edition'.", + ); + } + + claimants.forEach(c => { + c.pin = new BN(randomBytes()); + c.seed = + options.claimIntegration === 'transfer' + ? claimInfo.mint.key + : options.claimIntegration === 'candy' + ? claimInfo.config + : /* === edition */ claimInfo.masterMint.key; + }); + + const base = Keypair.generate(); + + const extraParams: Array = []; + if (options.distributionMethod === 'discord') { + extraParams.push(`guild=${options.discordGuild}`); + } + + const instructions = await buildGumdrop( + connection, + wallet.publicKey, + options.distributionMethod !== 'wallets', + options.claimIntegration, + options.host, + base.publicKey, + temporalSigner, + claimants, + claimInfo, + extraParams, + ); + + const basePath = logPath(options.env, `${base.publicKey.toBase58()}.json`); + console.log(`writing base to ${basePath}`); + fs.writeFileSync(basePath, JSON.stringify([...base.secretKey])); + + const urlPath = logPath( + options.env, + `urls-${base.publicKey.toBase58()}.json`, + ); + console.log(`writing claims to ${urlPath}`); + fs.writeFileSync(urlPath, JSON.stringify(urlAndHandleFor(claimants))); + + const createResult = await sendTransactionWithRetry( + connection, + wallet, + instructions, + [base], + ); + + console.log(createResult); + if (typeof createResult === 'string') { + throw new Error(createResult); + } else { + console.log( + 'gumdrop creation succeeded', + `https://explorer.solana.com/tx/${createResult.txid}?cluster=${options.env}`, + ); + } + + console.log('distributing claim URLs'); + const responses = await distribute(claimants); + const respPath = logPath( + options.env, + `resp-${base.publicKey.toBase58()}.json`, + ); + console.log(`writing responses to ${respPath}`); + fs.writeFileSync(respPath, JSON.stringify(responses)); + }); + +programCommand('close') + .option( + '--claim-integration ', + 'Backend for claims. Either `transfer` for token-transfers through approve-delegate, `candy` for minting through a candy-machine, or `edition` for minting through a master edition', + ) + .option('--transfer-mint ', 'transfer: public key of mint') + .option( + '--candy-config ', + 'candy: public key of the candy machine config', + ) + .option( + '--candy-uuid ', + 'candy: uuid used to construct the candy machine', + ) + .option('--edition-mint ', 'edition: mint of the master edition') + .option('--base ', 'gumdrop authority generated on create') + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .action(async (options, cmd) => { + log.info(`Parsed options:`, options); + + const wallet = loadWalletKey(options.keypair); + const base = loadWalletKey(options.base); + const connection = new anchor.web3.Connection( + //@ts-ignore + options.rpcUrl || anchor.web3.clusterApiUrl(options.env), + ); + + switch (options.claimIntegration) { + case 'transfer': { + if (!options.transferMint) { + throw new Error( + "No transfer-mint provided. Used to check we're not accidentally losing ownership of other accounts", + ); + } + break; + } + case 'candy': { + if (!options.candyConfig || !options.candyUuid) { + throw new Error( + 'No candy-config or candy-uuid provided. Needed to transfer back candy-machine authority', + ); + } + break; + } + case 'edition': { + if (!options.editionMint) { + throw new Error( + 'No master-mint provided. Needed to transfer back master', + ); + } + break; + } + default: + throw new Error( + "Claim integration must either be 'transfer', 'candy', or 'edition'.", + ); + } + + const instructions = await closeGumdrop( + connection, + wallet.publicKey, + base, + options.claimIntegration, + options.transferMint, + options.candyConfig, + options.candyUuid, + options.editionMint, + ); + + const closeResult = await sendTransactionWithRetry( + connection, + wallet, + instructions, + [base], + ); + + console.log(closeResult); + if (typeof closeResult === 'string') { + throw new Error(closeResult); + } else { + console.log( + 'gumdrop close succeeded', + `https://explorer.solana.com/tx/${closeResult.txid}?cluster=${options.env}`, + ); + } + }); + +programCommand('create_contact_list') + .option('--cli-input-json ') + .option('--aws-ses-access-key-id ', 'Access Key Id') + .option('--aws-ses-secret-access-key ', 'Secret Access Key') + .addHelpText( + 'before', + 'A thin wrapper mimicking `aws sesv2 create-contact-list`', + ) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .action(async (options, cmd) => { + log.info(`Parsed options:`, options); + + let message; + try { + message = JSON.parse(fs.readFileSync(options.cliInputJson).toString()); + } catch (err) { + throw new Error(`Could not read distribution list ${err}`); + } + + const client = new SESv2Client({ + region: 'us-east-2', + credentials: { + accessKeyId: options.awsSesAccessKeyId, + secretAccessKey: options.awsSesSecretAccessKey, + }, + }); + + try { + const response = await client.send(new CreateContactListCommand(message)); + log.debug(response); + if (response.$metadata.httpStatusCode !== 200) { + // throw new Error(`AWS SES ssemed to fail to send email: ${response[0].reject_reason}`); + } + } catch (err) { + log.error(err); + } + log.info(`Created contact list ${message.ContactListName}`); + }); + +programCommand('get_contact') + .argument('', 'email address to query') + .option('--aws-ses-access-key-id ', 'Access Key Id') + .option('--aws-ses-secret-access-key ', 'Secret Access Key') + .addHelpText('before', 'A thin wrapper mimicking `aws sesv2 get-contact`') + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .action(async (email, options, cmd) => { + log.info(`Parsed options:`, options); + + const client = new SESv2Client({ + region: 'us-east-2', + credentials: { + accessKeyId: options.awsSesAccessKeyId, + secretAccessKey: options.awsSesSecretAccessKey, + }, + }); + + try { + const response = await client.send( + new GetContactCommand({ + ContactListName: 'Gumdrop', + EmailAddress: email, + }), + ); + console.log(response); + } catch (err) { + log.error(err); + } + }); + +function programCommand(name: string) { + return program + .command(name) + .option( + '-e, --env ', + 'Solana cluster env name', + 'devnet', //mainnet-beta, testnet, devnet + ) + .option( + '-k, --keypair ', + `Solana wallet location`, + '--keypair not provided', + ) + .option('-r, --rpc-url ', 'Custom rpc url') + .option('-l, --log-level ', 'log level', setLogLevel); +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function setLogLevel(value, prev) { + if (value === undefined || value === null) { + return; + } + log.info('setting the log value to: ' + value); + log.setLevel(value); +} + +function loadWalletKey(keypair): Keypair { + if (!keypair || keypair == '') { + throw new Error('Keypair is required!'); + } + const loaded = Keypair.fromSecretKey( + new Uint8Array(JSON.parse(fs.readFileSync(keypair).toString())), + ); + log.info(`wallet public key: ${loaded.publicKey}`); + return loaded; +} + +function logPath(env: string, logName: string, cPath: string = LOG_PATH) { + return path.join(cPath, `${env}-${logName}`); +} + +// NB: assumes no overflow +function randomBytes(): Uint8Array { + // TODO: some predictable seed? sha256? + return crypto.randomBytes(4); +} + +async function sendTransactionWithRetry( + connection: RPCConnection, + wallet: Keypair, + instructions: Array, + signers: Array, + commitment: Commitment = 'singleGossip', +): Promise { + const transaction = new Transaction(); + instructions.forEach(instruction => transaction.add(instruction)); + transaction.recentBlockhash = ( + await connection.getRecentBlockhash(commitment) + ).blockhash; + + transaction.setSigners( + // fee payed by the wallet owner + wallet.publicKey, + ...signers.map(s => s.publicKey), + ); + + if (signers.length > 0) { + transaction.partialSign(...signers); + } + transaction.partialSign(wallet); + + return sendSignedTransaction({ + connection, + signedTransaction: transaction, + }); +} + +async function distributeDiscord( + auth: AuthKeys, + source: string, + claimants: Claimants, + drop: DropInfo, +) { + if (!auth.botToken || !auth.guild) { + throw new Error('Discord auth keys not supplied'); + } + if (claimants.length === 0) return []; + log.debug('Discord auth', auth); + + const client = new discord.Client(); + await client.login(auth.botToken); + + const guild = await client.guilds.fetch(auth.guild); + + const members = await guild.members.fetch({ + user: claimants.map(c => c.handle), + }); + + const single = async (info: ClaimantInfo, drop: DropInfo) => { + const user = members.get(info.handle); + if (user === undefined) { + return { + status: 'error', + handle: info.handle, + error: 'notfound', + }; + } + const formatted = formatDropMessage(info, drop, false); + const response = await (user as any).send(formatted.message); + // canonoical way to check if message succeeded? + if (response.id) { + return { + status: 'success', + handle: info.handle, + messageId: response.id, + }; + } else { + return { + status: 'error', + handle: info.handle, + error: response, // TODO + }; + } + }; + + const responses = Array(); + for (const c of claimants) { + responses.push(await single(c, drop)); + } + client.destroy(); + return responses; +} + +program.parse(process.argv); diff --git a/js/packages/cli/src/helpers/constants.ts b/js/packages/cli/src/helpers/constants.ts index d3425acd8e..4933b2e48a 100644 --- a/js/packages/cli/src/helpers/constants.ts +++ b/js/packages/cli/src/helpers/constants.ts @@ -38,6 +38,12 @@ export const TOKEN_ENTANGLEMENT_PROGRAM_ID = new PublicKey( export const WRAPPED_SOL_MINT = new PublicKey( 'So11111111111111111111111111111111111111112', ); +export const GUMDROP_DISTRIBUTOR_ID = new PublicKey( + 'gdrpGjVffourzkdDRrQmySw4aTHr8a3xmQzzxSwFD1a' +); +export const GUMDROP_TEMPORAL_SIGNER = new PublicKey( + 'MSv9H2sMceAzccBganUXwGq3GXgqYAstmZAbFDZYbAV' +); export const CONFIG_ARRAY_START = 32 + // authority diff --git a/js/packages/cli/src/helpers/gumdrop/claimant.ts b/js/packages/cli/src/helpers/gumdrop/claimant.ts new file mode 100644 index 0000000000..9934c03773 --- /dev/null +++ b/js/packages/cli/src/helpers/gumdrop/claimant.ts @@ -0,0 +1,793 @@ +import { + AccountMeta, + Connection as RPCConnection, + Keypair, + PublicKey, + SystemProgram, + TransactionInstruction, +} from '@solana/web3.js'; +import { AccountLayout, MintInfo, MintLayout, Token } from '@solana/spl-token'; +import * as anchor from '@project-serum/anchor'; +import { sha256 } from 'js-sha256'; +import BN from 'bn.js'; +import * as bs58 from 'bs58'; + +import { + getCandyMachineAddress, + getEditionMarkPda, + getMasterEdition, + getTokenWallet, +} from '../accounts'; +import { + CANDY_MACHINE_PROGRAM_ID, + GUMDROP_DISTRIBUTOR_ID, + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_PROGRAM_ID, +} from '../constants'; +import { MerkleTree } from './merkleTree'; + +export type ClaimantInfo = { + handle: string; + amount: number; + edition: number; + + pin: BN; + url: string; + + seed: PublicKey; + secret: PublicKey; +}; + +const csvStringToArray = (strData: any) => { + const objPattern = new RegExp( + '(\\,|\\r?\\n|\\r|^)(?:"([^"]*(?:""[^"]*)*)"|([^\\,\\r\\n]*))', + 'gi', + ); + let arrMatches: RegExpExecArray | null = null; + const arrData: Array> = [[]]; + while ((arrMatches = objPattern.exec(strData))) { + if (arrMatches[1].length && arrMatches[1] !== ',') arrData.push([]); + arrData[arrData.length - 1].push( + arrMatches[2] + ? arrMatches[2].replace(new RegExp('""', 'g'), '"') + : arrMatches[3], + ); + } + return arrData; +}; + +export type Claimants = Array; +export const parseClaimants = ( + input: string, + filename: string, + method: string, +): Claimants => { + const extension = filename.match(/\.[0-9a-z]+$/i); + if (extension === null) { + throw new Error(`Could not parse file extension from ${filename}`); + } + switch (extension[0]) { + case '.csv': { + const arr = csvStringToArray(input); + // TODO: more robust + let search: string; + if (method === 'aws-sms') { + search = 'phone number'; + } else if (method === 'aws-email') { + search = 'email'; + } else { + throw new Error(`Cannot parse csv for ${method}`); + } + const foundIdx = arr[0].findIndex(s => s.includes(search)); + if (foundIdx === -1) throw new Error(`Could not find ${search} index`); + + const numbers = new Set( + arr + .slice(1) + .filter(arr => arr[foundIdx].length > 0) + .map(arr => arr[foundIdx]), + ); + + return [...numbers].map((n, idx) => { + return { + handle: n, + amount: 1, + edition: idx, + } as any; + }); + } + case '.json': { + const json = JSON.parse(input); + return json.map((obj: any) => { + return { + handle: obj.handle, + amount: obj.amount, + edition: obj.edition, + url: obj.url, + }; + }); + } + default: { + throw new Error(`Cannot parse file format ${extension} from ${filename}`); + } + } +}; + +export const getCandyConfig = async ( + connection: RPCConnection, + config: string, +): Promise => { + let configKey: PublicKey; + try { + configKey = new PublicKey(config); + } catch (err) { + throw new Error(`Invalid config key ${err}`); + } + const configAccount = await connection.getAccountInfo(configKey); + if (configAccount === null) { + throw new Error(`Could not fetch config`); + } + if (!configAccount.owner.equals(CANDY_MACHINE_PROGRAM_ID)) { + throw new Error(`Invalid config owner ${configAccount.owner.toBase58()}`); + } + return configKey; +}; + +export const getCandyMachine = async ( + connection: RPCConnection, + candyMachineKey: PublicKey, +) => { + const candyMachineCoder = new anchor.Coder( + await anchor.Program.fetchIdl(CANDY_MACHINE_PROGRAM_ID, { + connection: connection, + } as anchor.Provider), + ); + if (candyMachineCoder === null) { + throw new Error(`Could not fetch candy machine IDL`); + } + const candyMachineAccount = await connection.getAccountInfo(candyMachineKey); + if (candyMachineAccount === null) { + throw new Error(`Could not fetch candy machine`); + } + return candyMachineCoder.accounts.decode( + 'CandyMachine', + candyMachineAccount.data, + ); +}; + +export const getMintInfo = async ( + connection: RPCConnection, + mint: string, +): Promise<{ key: PublicKey; info: MintInfo }> => { + let mintKey: PublicKey; + try { + mintKey = new PublicKey(mint); + } catch (err) { + throw new Error(`Invalid mint key ${err}`); + } + const mintAccount = await connection.getAccountInfo(mintKey); + if (mintAccount === null) { + throw new Error(`Could not fetch mint`); + } + if (!mintAccount.owner.equals(TOKEN_PROGRAM_ID)) { + const mintOwner = mintAccount.owner.toBase58(); + throw new Error(`Invalid mint owner ${mintOwner}`); + } + if (mintAccount.data.length !== MintLayout.span) { + throw new Error(`Invalid mint size ${mintAccount.data.length}`); + } + const mintInfo = MintLayout.decode(Buffer.from(mintAccount.data)); + return { + key: mintKey, + info: mintInfo, + }; +}; + +export const getCreatorTokenAccount = async ( + walletKey: PublicKey, + connection: RPCConnection, + mintKey: PublicKey, + totalClaim: number, +) => { + const creatorTokenKey = await getTokenWallet(walletKey, mintKey); + const creatorTokenAccount = await connection.getAccountInfo(creatorTokenKey); + if (creatorTokenAccount === null) { + throw new Error(`Could not fetch creator token account`); + } + if (creatorTokenAccount.data.length !== AccountLayout.span) { + throw new Error( + `Invalid token account size ${creatorTokenAccount.data.length}`, + ); + } + const creatorTokenInfo = AccountLayout.decode( + Buffer.from(creatorTokenAccount.data), + ); + if (new BN(creatorTokenInfo.amount, 8, 'le').toNumber() < totalClaim) { + throw new Error(`Creator token account does not have enough tokens`); + } + return creatorTokenKey; +}; + +const explorerUrlFor = (env: string, key: string) => { + return `https://explorer.solana.com/address/${key}?cluster=${env}`; +}; + +export type ClaimInfo = { [key: string]: any }; + +export const dropInfoFor = ( + env: string, + integration: string, + tokenMint: string, + candyConfig: string, + masterMint: string, +) => { + switch (integration) { + case 'transfer': + return { type: 'Token', meta: explorerUrlFor(env, tokenMint) }; + case 'candy': + return { type: 'Candy', meta: explorerUrlFor(env, candyConfig) }; + case 'edition': + return { type: 'Edition', meta: explorerUrlFor(env, masterMint) }; + default: + throw new Error(`Unknown claim integration method ${integration}`); + } +}; + +export const validateTransferClaims = async ( + connection: RPCConnection, + walletKey: PublicKey, + claimants: Claimants, + mintStr: string, +): Promise => { + claimants.forEach((c, idx) => { + if (!c.handle) throw new Error(`Claimant ${idx} doesn't have handle`); + if (!c.amount) throw new Error(`Claimant ${idx} doesn't have amount`); + if (c.amount === 0) throw new Error(`Claimant ${idx} amount is 0`); + }); + + const total = claimants.reduce((acc, c) => acc + c.amount, 0); + const mint = await getMintInfo(connection, mintStr); + const source = await getCreatorTokenAccount( + walletKey, + connection, + mint.key, + total, + ); + + return { + total: total, + mint: mint, + source: source, + }; +}; + +export const validateCandyClaims = async ( + connection: RPCConnection, + walletKey: PublicKey, + claimants: Claimants, + candyConfig: string, + candyUuid: string, +): Promise => { + claimants.forEach((c, idx) => { + if (!c.handle) throw new Error(`Claimant ${idx} doesn't have handle`); + if (!c.amount) throw new Error(`Claimant ${idx} doesn't have amount`); + if (c.amount === 0) throw new Error(`Claimant ${idx} amount is 0`); + }); + + const total = claimants.reduce((acc, c) => acc + c.amount, 0); + const configKey = await getCandyConfig(connection, candyConfig); + const [candyMachineKey] = await getCandyMachineAddress(configKey, candyUuid); + + const candyMachine = await getCandyMachine(connection, candyMachineKey); + + const remaining = + candyMachine.data.itemsAvailable.toNumber() - + candyMachine.itemsRedeemed.toNumber(); + if (isNaN(remaining)) { + // TODO: should this have an override? + throw new Error( + `Could not calculate how many candy machine items are remaining`, + ); + } + if (remaining < total) { + throw new Error( + `Distributor is allocated more mints (${total}) ` + + `than the candy machine has remaining (${remaining})`, + ); + } + if (!candyMachine.authority.equals(walletKey)) { + throw new Error(`Candy machine authority does not match wallet public key`); + } + + return { + total: total, + config: configKey, + uuid: candyUuid, + candyMachineKey: candyMachineKey, + }; +}; + +const getOffsetFromStart = (edition: BN) => { + return edition.mod(new BN(31 * 8)); +}; + +const getIndex = (offsetFromStart: BN) => { + return offsetFromStart.div(new BN(8)); +}; + +const getOffsetFromRight = (offsetFromStart: BN) => { + return new BN(7).sub(offsetFromStart.mod(new BN(8))); +}; + +const getIndexAndMask = (edition: BN) => { + const offsetFromStart = getOffsetFromStart(edition); + return { + index: getIndex(offsetFromStart).toNumber(), + mask: new BN(1) + .shln(getOffsetFromRight(offsetFromStart).toNumber()) + .toNumber(), + }; +}; + +const editionTaken = (marker: Array, edition: BN): boolean => { + const m = getIndexAndMask(edition); + return (marker[m.index] & m.mask) !== 0; +}; + +const setEditionTaken = (marker: Array, edition: BN) => { + const m = getIndexAndMask(edition); + marker[m.index] = marker[m.index] | m.mask; +}; + +export const validateEditionClaims = async ( + connection: RPCConnection, + walletKey: PublicKey, + claimants: Claimants, + masterMintStr: string, +): Promise => { + claimants.forEach((c, idx) => { + if (!c.handle) throw new Error(`Claimant ${idx} doesn't have handle`); + if (c.amount !== 1) { + throw new Error( + `Claimant ${idx} has amount ${c.amount}. Expected 1 for edition gumdrop`, + ); + } + }); + + const total = claimants.reduce((acc, c) => acc + c.amount, 0); + const masterMint = await getMintInfo(connection, masterMintStr); + const masterTokenAccount = await getCreatorTokenAccount( + walletKey, + connection, + masterMint.key, + 1, // just check that the creator has the master mint + ); + + const masterEditionKey = await getMasterEdition(masterMint.key); + const masterEdition = await connection.getAccountInfo(masterEditionKey); + if (masterEdition === null) { + throw new Error(`Could not fetch master edition`); + } + console.log('Master edition', masterEdition); + + // maxSupply is an option, 9 bytes, first is 0 means is none + const currentSupply = new BN( + masterEdition.data.slice(1, 1 + 8), + 8, + 'le', + ).toNumber(); + let maxSupply; + if (masterEdition.data[9] === 0) { + maxSupply = null; + } else { + maxSupply = new BN( + masterEdition.data.slice(10, 10 + 8), + 8, + 'le', + ).toNumber(); + } + console.log('Max supply', maxSupply); + console.log('Current supply', currentSupply); + + if (maxSupply !== null && maxSupply < total) { + throw new Error( + `Distributor is allocated more editions (${total}) ` + + `than the master has total (${maxSupply})`, + ); + } + + // Whether an edition has been claimed is a single bit in a paginated account + // (pda off of master mint). The following code does some sanity checks + // around max supply and internally whether the distribution list has + // duplicate editions, and also checks if the editions were already taken on + // chain. + // + // There is a race condition since the authority to mint is still currently + // the wallet but it seems like a user error to have other editions being + // minted while a gumdrop is being created + const editions: { [key: number]: number } = {}; + const editionMarkers: Array<[PublicKey, Array]> = []; + for (let idx = 0; idx < claimants.length; ++idx) { + const c = claimants[idx]; + if (c.edition === undefined) + throw new Error(`Claimant ${idx} doesn't have edition`); + if (c.edition <= 0) { + throw new Error(`Claimant ${idx} assigned invalid edition ${c.edition}`); + } + if (maxSupply !== null && c.edition > maxSupply) { + throw new Error( + `Claimant ${idx} assigned edition ${c.edition} which is beyond the max supply`, + ); + } + if (c.edition in editions) { + throw new Error( + `Claimant ${idx} and ${ + editions[c.edition] + } are both assigned to edition ${c.edition}`, + ); + } + const edition = new BN(c.edition); + const markerKey = await getEditionMarkPda( + masterMint.key, + edition.toNumber(), + ); + let markerData = editionMarkers.find(pm => pm[0].equals(markerKey)); + if (markerData === undefined) { + const markerAcc = await connection.getAccountInfo(markerKey); + if (markerAcc === null) { + editionMarkers.push([markerKey, Array(31)]); + } else { + editionMarkers.push([markerKey, [...markerAcc.data.slice(1, 32)]]); + } + markerData = editionMarkers[editionMarkers.length - 1]; + } + + if (markerData === undefined) { + throw new Error( + `Internal Error: Edition marker info still undefined ${c.edition}`, + ); + } + + if (editionTaken(markerData[1], edition)) { + throw new Error( + `Claimant ${idx} is assigned to edition ${c.edition} which is already taken`, + ); + } + + setEditionTaken(markerData[1], edition); + + editions[c.edition] = idx; + } + + return { + total: total, + masterMint: masterMint, + masterTokenAccount: masterTokenAccount, + }; +}; + +export const chunk = (arr: Buffer, len: number): Array => { + const chunks: Array = []; + const n = arr.length; + let i = 0; + + while (i < n) { + chunks.push(arr.slice(i, (i += len))); + } + + return chunks; +}; + +export const buildGumdrop = async ( + connection: RPCConnection, + walletKey: PublicKey, + needsPin: boolean, + claimIntegration: string, + host: string, + baseKey: PublicKey, + temporalSigner: PublicKey, + claimants: Claimants, + claimInfo: ClaimInfo, + extraParams: Array = [], +): Promise> => { + const leafs: Array = []; + for (let idx = 0; idx < claimants.length; ++idx) { + const claimant = claimants[idx]; + if (!needsPin) { + try { + claimant.secret = new PublicKey(claimant.handle); + } catch (err) { + throw new Error(`Invalid claimant wallet handle ${err}`); + } + } else { + const seeds = [ + claimant.seed.toBuffer(), + ...chunk(Buffer.from(claimant.handle), 32), + Buffer.from(claimant.pin.toArray('le', 4)), + ]; + const [claimantPda] = await PublicKey.findProgramAddress( + seeds.map(s => s.slice(0, 32)), + GUMDROP_DISTRIBUTOR_ID, + ); + claimant.secret = claimantPda; + } + // TODO: get this clarified with jordan... we can either just assign some + // range of editions to a user or give them an amount and just keep a + // counter on the distributor... the latter is much less work but we lose + // the ability to use gumdrop for auction house winnings and such? + const extra = + claimIntegration === 'edition' + ? [...new BN(claimant.edition).toArray('le', 8)] + : []; + leafs.push( + Buffer.from([ + ...new BN(idx).toArray('le', 8), + ...claimant.secret.toBuffer(), + ...claimant.seed.toBuffer(), + ...new BN(claimant.amount).toArray('le', 8), + ...extra, + ]), + ); + } + + const tree = new MerkleTree(leafs); + const root = tree.getRoot(); + + const [distributor, dbump] = await PublicKey.findProgramAddress( + [Buffer.from('MerkleDistributor'), baseKey.toBuffer()], + GUMDROP_DISTRIBUTOR_ID, + ); + + for (let idx = 0; idx < claimants.length; ++idx) { + const proof = tree.getProof(idx); + const verified = tree.verifyProof(idx, proof, root); + + if (!verified) { + throw new Error('Gumdrop merkle tree verification failed'); + } + + const claimant = claimants[idx]; + const params = [ + `distributor=${distributor}`, + `handle=${encodeURIComponent(claimant.handle)}`, + `amount=${claimant.amount}`, + `index=${idx}`, + `proof=${proof.map(b => bs58.encode(b))}`, + ...extraParams, + ]; + if (needsPin) { + params.push(`pin=${claimant.pin.toNumber()}`); + } else { + params.push(`pin=NA`); + } + if (claimIntegration === 'transfer') { + params.push(`tokenAcc=${claimInfo.source}`); + } else if (claimIntegration === 'candy') { + params.push(`config=${claimInfo.config}`); + params.push(`uuid=${claimInfo.uuid}`); + } else { + params.push(`master=${claimInfo.masterMint.key}`); + params.push(`edition=${claimant.edition}`); + } + const query = params.join('&'); + + claimant.url = `${host}/claim?${query}`; + } + + // initial merkle-distributor state + const instructions = Array(); + instructions.push( + new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: baseKey, isSigner: true, isWritable: false }, + { pubkey: distributor, isSigner: false, isWritable: true }, + { pubkey: walletKey, isSigner: true, isWritable: false }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest('global:new_distributor')).slice(0, 8), + ...new BN(dbump).toArray('le', 1), + ...root, + ...temporalSigner.toBuffer(), + ]), + }), + ); + + if (claimIntegration === 'transfer') { + instructions.push( + Token.createApproveInstruction( + TOKEN_PROGRAM_ID, + claimInfo.source, + distributor, + walletKey, + [], + claimInfo.total, + ), + ); + } else if (claimIntegration === 'candy') { + const [distributorWalletKey] = await PublicKey.findProgramAddress( + [Buffer.from('Wallet'), distributor.toBuffer()], + GUMDROP_DISTRIBUTOR_ID, + ); + + instructions.push( + new TransactionInstruction({ + programId: CANDY_MACHINE_PROGRAM_ID, + keys: [ + { + pubkey: claimInfo.candyMachineKey, + isSigner: false, + isWritable: true, + }, + { pubkey: walletKey, isSigner: true, isWritable: false }, + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest('global:update_authority')).slice(0, 8), + ...new BN(1).toArray('le', 1), // optional exists... + ...distributorWalletKey.toBuffer(), + ]), + }), + ); + } else if (claimIntegration === 'edition') { + // transfer master edition to distributor + const [distributorTokenKey] = await PublicKey.findProgramAddress( + [ + distributor.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + claimInfo.masterMint.key.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + ); + + instructions.push( + Token.createAssociatedTokenAccountInstruction( + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_PROGRAM_ID, + claimInfo.masterMint.key, + distributorTokenKey, + distributor, + walletKey, + ), + ); + + instructions.push( + Token.createTransferInstruction( + TOKEN_PROGRAM_ID, + claimInfo.masterTokenAccount, + distributorTokenKey, + walletKey, + [], + 1, + ), + ); + } + + return instructions; +}; + +export const closeGumdrop = async ( + connection: RPCConnection, + walletKey: PublicKey, + base: Keypair, + claimMethod: string, + transferMint: string, + candyConfig: string, + candyUuid: string, + masterMint: string, +): Promise> => { + const [distributorKey, dbump] = await PublicKey.findProgramAddress( + [Buffer.from('MerkleDistributor'), base.publicKey.toBuffer()], + GUMDROP_DISTRIBUTOR_ID, + ); + + const [distributorWalletKey, wbump] = await PublicKey.findProgramAddress( + [Buffer.from('Wallet'), distributorKey.toBuffer()], + GUMDROP_DISTRIBUTOR_ID, + ); + + let extraKeys: Array; + const instructions = Array(); + + if (claimMethod === 'transfer') { + const mint = await getMintInfo(connection, transferMint); + const source = await getCreatorTokenAccount( + walletKey, + connection, + mint.key, + 0, + ); + // distributor is about to be closed anyway so this is redundant but... + instructions.push( + Token.createRevokeInstruction(TOKEN_PROGRAM_ID, source, walletKey, []), + ); + } + + if (claimMethod === 'candy') { + const configKey = await getCandyConfig(connection, candyConfig); + const [candyMachineKey] = await getCandyMachineAddress( + configKey, + candyUuid, + ); + + extraKeys = [ + { pubkey: candyMachineKey, isSigner: false, isWritable: true }, + { pubkey: CANDY_MACHINE_PROGRAM_ID, isSigner: false, isWritable: false }, + ]; + } else { + extraKeys = []; + } + + if (claimMethod === 'edition') { + let masterMintKey: PublicKey; + try { + masterMintKey = new PublicKey(masterMint); + } catch (err) { + throw new Error(`Invalid mint key ${err}`); + } + const [distributorTokenKey] = await PublicKey.findProgramAddress( + [ + distributorKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + masterMintKey.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + ); + + const [walletTokenKey] = await PublicKey.findProgramAddress( + [ + walletKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + masterMintKey.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + ); + + instructions.push( + new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: base.publicKey, isSigner: true, isWritable: false }, + { pubkey: distributorKey, isSigner: false, isWritable: false }, + { pubkey: distributorTokenKey, isSigner: false, isWritable: true }, + { pubkey: walletTokenKey, isSigner: false, isWritable: true }, + { pubkey: walletKey, isSigner: false, isWritable: true }, + { + pubkey: SystemProgram.programId, + isSigner: false, + isWritable: false, + }, + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, + ], + data: Buffer.from([ + ...Buffer.from( + sha256.digest('global:close_distributor_token_account'), + ).slice(0, 8), + ...new BN(dbump).toArray('le', 1), + ]), + }), + ); + } + + instructions.push( + new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: base.publicKey, isSigner: true, isWritable: false }, + { pubkey: distributorKey, isSigner: false, isWritable: true }, + { pubkey: distributorWalletKey, isSigner: false, isWritable: true }, + { pubkey: walletKey, isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, + ...extraKeys, + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest('global:close_distributor')).slice(0, 8), + ...new BN(dbump).toArray('le', 1), + ...new BN(wbump).toArray('le', 1), + ]), + }), + ); + + return instructions; +}; diff --git a/js/packages/cli/src/helpers/gumdrop/communication.ts b/js/packages/cli/src/helpers/gumdrop/communication.ts new file mode 100644 index 0000000000..db7a4305d5 --- /dev/null +++ b/js/packages/cli/src/helpers/gumdrop/communication.ts @@ -0,0 +1,219 @@ +import log from 'loglevel'; +import { SESv2Client, SendEmailCommand } from "@aws-sdk/client-sesv2" +import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"; + +import { + ClaimantInfo, + Claimants, +} from "./claimant" + +export type AuthKeys = { [key: string] : string } +export type Response = { [key: string] : any } + +export type DropInfo = { + type : string, + meta : string, +}; + +export const formatDropMessage = ( + info : ClaimantInfo, + drop : DropInfo, + html : boolean, +) => { + const wrap = (url, text) => { + if (html) { + return `${text}`; + } else { + return `${text} ${url}`; + } + } + if (drop.type === "Token") { + return { + subject: "Gumdrop Token Drop", + message: `You received ${info.amount} token(s) ` + + `(click ${wrap(drop.meta, "here")} to view more information about the token mint). ` + + wrap(info.url, "Click here to claim them!"), + }; + } else if (drop.type === "Candy") { + return { + subject: "Gumdrop NFT Drop", + message: `You received ${info.amount} Candy Machine pre-sale mint(s) ` + + `(click ${wrap(drop.meta, "here")} to view the candy machine configuration on explorer). ` + + wrap(info.url, "Click here to claim them!"), + }; + } else if (drop.type === "Edition") { + return { + subject: "Gumdrop NFT Drop", + message: `You received ${info.amount} limited-edition print(s) ` + + `(click ${wrap(drop.meta, "here")} to view the master edition mint on explorer). ` + + wrap(info.url, "Click here to claim them!"), + }; + } else { + throw new Error(`Internal Error: Unknown drop type ${drop.type}`); + } +}; + +export const distributeAwsSns = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + if (!auth.accessKeyId || !auth.secretAccessKey) { + throw new Error("AWS SES auth keys not supplied"); + } + if (claimants.length === 0) return []; + + log.debug("SES auth", auth); + const client = new SNSClient({ + region: "us-east-2", + credentials: { + accessKeyId: auth.accessKeyId, + secretAccessKey: auth.secretAccessKey, + }, + }); + + const single = async ( + info : ClaimantInfo, + drop : DropInfo, + ) => { + const formatted = formatDropMessage(info, drop, true); + const message = { + Message: formatted.message, + PhoneNumber: info.handle, + }; + + try { + const response = await client.send(new PublishCommand(message)); + return { + status: "success", + handle: info.handle, + messageId: response.MessageId, + }; + } catch (err) { + return { + status: "error", + handle: info.handle, + error: err, + }; + } + }; + + const responses = Array(); + for (const c of claimants) { + responses.push(await single(c, drop)); + } + return responses; +} + +export const distributeAwsSes = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + if (!auth.accessKeyId || !auth.secretAccessKey) { + throw new Error("AWS SES auth keys not supplied"); + } + if (claimants.length === 0) return []; + + log.debug("SES auth", auth); + const client = new SESv2Client({ + region: "us-east-2", + credentials: { + accessKeyId: auth.accessKeyId, + secretAccessKey: auth.secretAccessKey, + }, + }); + + // TODO: move to template + bulk message? + const single = async ( + info : ClaimantInfo, + drop : DropInfo, + ) => { + const formatted = formatDropMessage(info, drop, true); + const message = { + Destination: { + ToAddresses: [ + info.handle, + ] + }, + Content: { + Simple: { + Subject: { + Data: formatted.subject, + Charset: "utf-8", + }, + Body: { + Html: { + Data: formatted.message + + "

" + + "
" + + "If you would like to unsubscribe from new Gumdrops, " + + "change your subscription preferences here: " + + "AWS subscription preferences" + + "
", + Charset: "utf-8", + }, + }, + }, + }, + FromEmailAddress: source, + ListManagementOptions: { + ContactListName: "Gumdrop", + TopicName: drop.type, + }, + }; + + try { + const response = await client.send(new SendEmailCommand(message)); + return { + status: "success", + handle: info.handle, + messageId: response.MessageId, + }; + } catch (err) { + return { + status: "error", + handle: info.handle, + error: err, + }; + } + }; + + const responses = Array(); + for (const c of claimants) { + responses.push(await single(c, drop)); + } + return responses; +} + +/* eslint-disable @typescript-eslint/no-unused-vars */ +export const distributeManual = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + return Array(); +} + +export const distributeWallet = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + return Array(); +} +/* eslint-enable @typescript-eslint/no-unused-vars */ + +export const urlAndHandleFor = (claimants : Array) => { + return claimants.map(info => { + return { + handle: info.handle, + amount: info.amount, + url: info.url, + }; + }); +} diff --git a/js/packages/cli/src/helpers/gumdrop/merkleTree.ts b/js/packages/cli/src/helpers/gumdrop/merkleTree.ts new file mode 100644 index 0000000000..248892ab16 --- /dev/null +++ b/js/packages/cli/src/helpers/gumdrop/merkleTree.ts @@ -0,0 +1,95 @@ +import { keccak_256 } from "js-sha3"; + +export class MerkleTree { + leafs: Array; + layers: Array>; + + constructor(leafs : Array) { + this.leafs = leafs.slice(); + this.layers = []; + + let hashes = this.leafs.map(MerkleTree.nodeHash); + while (hashes.length > 0) { + console.log("Hashes", this.layers.length, hashes); + this.layers.push(hashes.slice()); + if (hashes.length === 1) break; + hashes = hashes.reduce((acc, cur, idx, arr) => { + if (idx % 2 === 0) { + const nxt = arr[idx + 1]; + acc.push(MerkleTree.internalHash(cur, nxt)); + } + return acc; + }, Array()); + } + } + + static nodeHash( + data : Buffer, + ) : Buffer { + return Buffer.from(keccak_256.digest([0x00, ...data])); + } + + + static internalHash( + first : Buffer, + second : Buffer | undefined, + ) : Buffer { + if (!second) return first; + const [fst, snd] = [first, second].sort(Buffer.compare) + return Buffer.from( + keccak_256.digest([0x01, ...fst, ...snd]) + ); + } + + getRoot() : Buffer { + return this.layers[this.layers.length - 1][0]; + } + + getProof(idx : number) : Buffer[] { + return this.layers.reduce((proof, layer) => { + const sibling = idx ^ 1; + if (sibling < layer.length) { + proof.push(layer[sibling]); + } + + idx = Math.floor(idx / 2); + + return proof; + }, []); + } + + getHexRoot(): string { + return this.getRoot().toString("hex"); + } + + getHexProof(idx : number) : string[] { + return this.getProof(idx).map((el) => el.toString("hex")); + } + + verifyProof( + idx : number, + proof : Buffer[], + root : Buffer + ): boolean { + let pair = MerkleTree.nodeHash(this.leafs[idx]); + for (const item of proof) { + pair = MerkleTree.internalHash(pair, item); + } + + return pair.equals(root); + } + + static verifyClaim( + leaf : Buffer, + proof : Buffer[], + root : Buffer + ): boolean { + let pair = MerkleTree.nodeHash(leaf); + for (const item of proof) { + pair = MerkleTree.internalHash(pair, item); + } + + return pair.equals(root); + } + +} diff --git a/js/packages/gumdrop/README.md b/js/packages/gumdrop/README.md new file mode 100644 index 0000000000..f76b6cc843 --- /dev/null +++ b/js/packages/gumdrop/README.md @@ -0,0 +1,3 @@ +# Gumdrop + +See the [About page](https://lwus.github.io/gumdrop/) for more information. diff --git a/js/packages/gumdrop/aws/README.md b/js/packages/gumdrop/aws/README.md new file mode 100644 index 0000000000..2233d6a114 --- /dev/null +++ b/js/packages/gumdrop/aws/README.md @@ -0,0 +1,36 @@ +## AWS Configuration + +WIP AWS configuration placeholders that can be used as a starting point to +build a separate instance for gumdrop distribution and OTP verification. Any +instances of {PLACEHOLDER-*} should be replaced with the appropriate values +after construction (and `us-east-2` replaced with an appropriate region if +necessary). + +### OTP +The main driver is `aws/index.js` that needs to be added to a lambda function. +Roughly, this depends on a service role that gives it the policy permissions to +do + +``` +{ + "Effect": "Allow", + "Action": [ + "ses:SendEmail", + "dynamodb:Get*", + "dynamodb:PutItem" + ], + "Resource": "*" +} +``` + +The lambda will also require environment variables: + +- `DISCORD_BOT_TOKEN` from discord +- `MA_OTP_SECRET` which is used as the hmac key (can just be a + `Keypair.generate().secretKey`) +- `MA_SIGNER` which is the corresponding private key of the temporal signer + specified on gumdrop creation + +In addition, an API gateway should be configured roughly as in +`aws/api-gateway-conf.json` to allow for OPTIONS and POST and pass all of the +requests to the lambda (which will populate CORS headers itself) diff --git a/js/packages/gumdrop/aws/api-gateway-conf.json b/js/packages/gumdrop/aws/api-gateway-conf.json new file mode 100644 index 0000000000..ddb5a6608d --- /dev/null +++ b/js/packages/gumdrop/aws/api-gateway-conf.json @@ -0,0 +1,41 @@ +{ + "openapi" : "3.0.1", + "info" : { + "title" : "send-OTP", + "version" : "2021-11-02 02:20:54UTC" + }, + "servers" : [ { + "url" : "https://{PLACEHOLDER-API-ID}.execute-api.us-east-2.amazonaws.com/{basePath}", + "variables" : { + "basePath" : { + "default" : "" + } + } + } ], + "paths" : { + "/send-OTP" : { + "x-amazon-apigateway-any-method" : { + "responses" : { + "default" : { + "description" : "Default response for ANY /send-OTP" + } + }, + "x-amazon-apigateway-integration" : { + "payloadFormatVersion" : "2.0", + "type" : "aws_proxy", + "httpMethod" : "POST", + "uri" : "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:{PLACEHOLDER-ACCOUNT-ID}:function:send-OTP/invocations", + "connectionType" : "INTERNET" + } + } + } + }, + "x-amazon-apigateway-cors" : { + "allowMethods" : [ "OPTIONS", "POST" ], + "allowHeaders" : [ "*" ], + "maxAge" : 0, + "allowCredentials" : false, + "allowOrigins" : [ "*" ] + }, + "x-amazon-apigateway-importexport-version" : "1.0" +} \ No newline at end of file diff --git a/js/packages/gumdrop/aws/gumdrop-contact-list.json b/js/packages/gumdrop/aws/gumdrop-contact-list.json new file mode 100644 index 0000000000..4df6c7c9d8 --- /dev/null +++ b/js/packages/gumdrop/aws/gumdrop-contact-list.json @@ -0,0 +1,24 @@ +{ + "ContactListName": "Gumdrop", + "Description": "Metaplex gumdrops", + "Topics": [ + { + "TopicName": "Token", + "DisplayName": "Token Gumdrop", + "Description": "Hear about new token-airdrop gumdrops that you receive.", + "DefaultSubscriptionStatus": "OPT_IN" + }, + { + "TopicName": "Candy", + "DisplayName": "Candy Gumdrop", + "Description": "Hear about new candy-machine mint gumdrops that you receive.", + "DefaultSubscriptionStatus": "OPT_IN" + }, + { + "TopicName": "Edition", + "DisplayName": "Limited Edition Print Gumdrop", + "Description": "Hear about new limited-edition print gumdrops that you receive.", + "DefaultSubscriptionStatus": "OPT_IN" + } + ] +} diff --git a/js/packages/gumdrop/aws/index.js b/js/packages/gumdrop/aws/index.js new file mode 100644 index 0000000000..0ad24be036 --- /dev/null +++ b/js/packages/gumdrop/aws/index.js @@ -0,0 +1,217 @@ +const { sha256 } = require("js-sha256"); +const { Keypair, Message, PublicKey, Transaction } = require("@solana/web3.js"); +const BN = require("bn.js"); +const bs58 = require("bs58"); +const nacl = require("tweetnacl"); +const discord = require("discord.js"); + +const MERKLE_DISTRIBUTOR_ID = new PublicKey(process.env.MA_DISTRIBUTOR_ID); +const CLAIM_INSTR = Buffer.from(sha256.digest("global:claim")).slice(0, 8); +const CANDY_INSTR = Buffer.from(sha256.digest("global:claim_candy")).slice(0, 8); +const EDITION_INSTR = Buffer.from(sha256.digest("global:claim_edition")).slice(0, 8); +const SIGNER = Keypair.fromSecretKey(Buffer.from(JSON.parse(process.env.MA_SIGNER))); + +const OTP_SECRET = Buffer.from(JSON.parse(process.env.MA_OTP_SECRET)); +const OTP_TABLE_NAME = process.env.MA_OTP_TABLE_NAME; + +const AWS = require("aws-sdk"); +const ddb = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10', region: 'us-east-2' }); + +// time in MS (normally Date.now()) +const OTP_X = Number(process.env.MA_OTP_X); +const generateTOTP = (key, time, digits) => { + const T0 = 0; + + const T = (new BN(time).sub(new BN(T0))).div(new BN(OTP_X)); + const msg = T.toBuffer(); + // should be OK to truncate... + const hash = Buffer.from(sha256.hmac(key, msg)).slice(0, 20); + const offset = hash[hash.length - 1] & 0xf; + const bytes = hash.slice(offset, offset + 4); + + const binary = new BN(bytes); + const otp = binary.umod(new BN(10).pow(new BN(digits))); + return otp.toNumber(); +}; + +const queryDB = async (handle) => { + const params = { + TableName: OTP_TABLE_NAME, + Key: { + "HANDLE": handle + } + }; + const result = await ddb.get(params).promise(); + return result.Item; +}; + +const logDB = async (handle, otp, txn) => { + const params = { + TableName: OTP_TABLE_NAME, + Item: { + "HANDLE": handle, + "OTP": otp, + "TXN": txn, + }, + }; + await ddb.put(params).promise(); +}; + +const chunk = (arr, len) => { + let chunks = [], + i = 0, + n = arr.length; + + while (i < n) { + chunks.push(arr.slice(i, i += len)); + } + + return chunks; +} + +const sendOTP = async (event) => { + if (!event.transaction) { + throw new Error("No transaction found"); + } + if (!event.seeds) { + throw new Error("No PDA seeds found"); + } + if (event.seeds.length !== 3) { + throw new Error("Expected exactly 3 seeds. [mint, handle, pin]"); + } + + const serializedBuffer = bs58.decode(event.transaction); + const transaction = Transaction.populate(Message.from(serializedBuffer)); + + const instrs = transaction.instructions; + const claim = instrs[instrs.length - 1]; + if (!claim.programId.equals(MERKLE_DISTRIBUTOR_ID)) { + throw new Error("Claim programId does not match"); + } + + let pda; + if (Buffer.from(claim.data.slice(0, 8)).equals(CLAIM_INSTR)) { + pda = claim.data.slice(25, 25 + 32); + } else if (Buffer.from(claim.data.slice(0, 8)).equals(CANDY_INSTR)) { + pda = claim.data.slice(26, 26 + 32); + } else if (Buffer.from(claim.data.slice(0, 8)).equals(EDITION_INSTR)) { + pda = claim.data.slice(33, 33+ 32); + } else { + throw new Error("Claim instruction does not match"); + } + + const [claimantPda, ] = await PublicKey.findProgramAddress( + [ + event.seeds[0].data, + ...chunk(event.seeds[1].data, 32), + event.seeds[2].data, + ], + MERKLE_DISTRIBUTOR_ID + ); + + if (!claimantPda.toBuffer().equals(Buffer.from(pda))) { + throw new Error("Claim PDA does not match provided seeds"); + } + + const handle = Buffer.from(event.seeds[1].data).toString(); + + // OTP shouldn't be returned as part of response... don't log here? + const time = Date.now(); + const otp = generateTOTP(OTP_SECRET, time, 8); + + const previous = await queryDB(handle); + if (previous) { + if (previous.OTP === otp) { + throw new Error("Wait for new OTP cycle"); + } + } + + // TODO: there seems to be some race condition here... the 'secret' pin + // should actually help in this case? + await logDB(handle, time, serializedBuffer); + + const otpMessage = `Your gumdrop OTP is ${String(otp).padStart(8, "0")}`; + if (event.discordGuild) { + const client = new discord.Client(); + await client.login(process.env.DISCORD_BOT_TOKEN); + + const guild = await client.guilds.fetch(event.discordGuild); + + const user = await guild.members.fetch(handle); + if (!user) { + throw new Error(`Could not find discord user ${handle}`); + } + return await user.send(otpMessage); + } else { + const params = { + Destination: { + ToAddresses: [handle], + }, + Message: { + Body: { + Text: { Data: otpMessage }, + }, + + Subject: { Data: "Gumdrop OTP" }, + }, + Source: "santa@aws.metaplex.com", + }; + + const ses = new AWS.SES({ region: "us-east-2" }); + return ses.sendEmail(params).promise(); + } +}; + +const verifyOTP = async (event) => { + if (!event.handle) { + throw new Error("No handle found"); + } + if (!event.otp) { + throw new Error("No OTP found"); + } + + const stored = await queryDB(event.handle); + if (!stored) { + throw new Error("No DB entry found"); + } + + const time = Date.now(); + const expectedOTP = generateTOTP(OTP_SECRET, time, 8); + const delayedOTP = generateTOTP(OTP_SECRET, time - OTP_X, 8); + + if (event.otp !== expectedOTP && event.otp !== delayedOTP) { + throw new Error("OTP does not match expected"); + } + + const response = { + statusCode: 200, + body: JSON.stringify(bs58.encode(nacl.sign.detached(stored.TXN, SIGNER.secretKey))), + }; + return response; +}; + +exports.handler = async (request) => { + // we need to populate these for pre-flight options requests or something... + // not sure why we need both this AND to set CORS in the API gateway but OK... + const amazing = { + headers: { + "Access-Control-Allow-Origin": '*', + "Access-Control-Allow-Methods": 'POST,OPTIONS', + "Access-Control-Allow-Headers" : "Content-Type", + } + } + if (request.requestContext.http.method === "OPTIONS") { + return { + statusCode: 200, + ...amazing, + } + } + const event = JSON.parse(request.body); + if (event.method === "send") { + return await sendOTP(event); + } else if (event.method === "verify") { + return await verifyOTP(event); + } else { + throw new Error("Could not find method"); + } +} diff --git a/js/packages/gumdrop/aws/nodejs/package.json b/js/packages/gumdrop/aws/nodejs/package.json new file mode 100644 index 0000000000..66da67514e --- /dev/null +++ b/js/packages/gumdrop/aws/nodejs/package.json @@ -0,0 +1,19 @@ +{ + "name": "send-top", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@solana/web3.js": "^1.30.1", + "bn": "^1.0.5", + "bs58": "^4.0.1", + "discord.js": "12.5.3", + "js-sha256": "^0.9.0", + "tweetnacl": "^1.0.3" + } +} diff --git a/js/packages/gumdrop/aws/send-OTP.yaml b/js/packages/gumdrop/aws/send-OTP.yaml new file mode 100644 index 0000000000..26383ea548 --- /dev/null +++ b/js/packages/gumdrop/aws/send-OTP.yaml @@ -0,0 +1,27 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: 'AWS::Serverless-2016-10-31' +Description: An AWS Serverless Specification template describing your function. +Resources: + sendOTP: + Type: 'AWS::Serverless::Function' + Properties: + Handler: index.handler + Runtime: nodejs14.x + CodeUri: . + Description: '' + MemorySize: 128 + Timeout: 8 + Role: 'arn:aws:iam::{PLACEHOLDER-ACCOUNT-ID}:role/service-role/send-OTP-role-3wa21hc0' + Events: + Api1: + Type: Api + Properties: + Path: /send-OTP + Method: ANY + Environment: + Variables: + MA_DISTRIBUTOR_ID: gdrpGjVffourzkdDRrQmySw4aTHr8a3xmQzzxSwFD1a + MA_OTP_TABLE_NAME: otp-table + MA_OTP_X: '60000' + Layers: + - 'arn:aws:lambda:us-east-2:{PLACEHOLDER-ACCOUNT-ID}:layer:sol-runtime:3' diff --git a/js/packages/gumdrop/package.json b/js/packages/gumdrop/package.json new file mode 100644 index 0000000000..774c4626b9 --- /dev/null +++ b/js/packages/gumdrop/package.json @@ -0,0 +1,99 @@ +{ + "name": "gumdrop", + "version": "0.1.0", + "private": true, + "homepage": "https://lwus.github.io/gumdrop/", + "dependencies": { + "@aws-sdk/client-lambda": "^3.38.0", + "@aws-sdk/client-sesv2": "^3.38.0", + "@aws-sdk/client-sns": "^3.40.0", + "@emotion/react": "^11", + "@emotion/styled": "^11", + "@fontsource/open-sans": "^4.5.0", + "@fontsource/roboto": "^4.5.0", + "@fontsource/sora": "^4.5.0", + "@ledgerhq/hw-transport": "^6.3.0", + "@ledgerhq/hw-transport-webusb": "^6.3.0", + "@mailchimp/mailchimp_transactional": "^1.0.46", + "@mui/icons-material": "^5.0.1", + "@mui/material": "^5.0.2", + "@oyster/common": "0.0.2", + "@progress/kendo-react-common": "^4.9.0", + "@progress/kendo-react-grid": "^4.9.0", + "@progress/kendo-react-inputs": "^4.9.0", + "@project-serum/serum": "^0.13.52", + "@project-serum/sol-wallet-adapter": "^0.2.5", + "@reduxjs/toolkit": "^1.6.1", + "@solana/spl-token": "^0.1.8", + "@solana/spl-token-registry": "0.2.202", + "@solana/wallet-adapter-base": "0.4.1", + "@solana/wallet-adapter-react": "^0.7.1", + "@solana/wallet-adapter-wallets": "^0.6.1", + "@solana/web3.js": "^1.24.1", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "@types/bs58": "^4.0.1", + "@types/chart.js": "^2.9.29", + "@types/echarts": "^4.9.0", + "@types/react-router-dom": "^5.1.6", + "@welldone-software/why-did-you-render": "^6.0.5", + "antd": "^4.16.12", + "arweave-deploy": "^1.9.1", + "bignumber.js": "^9.0.1", + "bn.js": "^5.1.3", + "borsh": "^0.4.0", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "canvas-confetti": "^1.4.0", + "commander": "^8.3.0", + "crypto-hash": "^1.3.0", + "customize-cra": "^1.0.0", + "discord.js": "12.5.3", + "eventemitter3": "^4.0.7", + "events": "^3.3.0", + "framer-motion": "^4", + "identicon.js": "^2.3.3", + "jazzicon": "^1.5.0", + "lodash": "^4.17.20", + "loglevel": "^1.7.1", + "material-components-web": "^13.0.0", + "material-ui": "^0.20.2", + "moment": "^2.29.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-redux": "^7.2.4", + "react-router-dom": "^5.2.0", + "react-slider": "^1.3.1", + "react-table": "^7.7.0", + "react-tradingview-embed": "^2.2.6", + "redux-observable": "^2.0.0", + "rxjs": "^7.3.0", + "typescript": "4.1.3", + "use-wallet": "^0.8.1", + "web-vitals": "^1.0.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "predeploy": "npm run build", + "deploy": "gh-pages -d build" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "gh-pages": "^3.2.3" + } +} diff --git a/js/packages/gumdrop/public/404.html b/js/packages/gumdrop/public/404.html new file mode 100644 index 0000000000..47c4a1d7cd --- /dev/null +++ b/js/packages/gumdrop/public/404.html @@ -0,0 +1,40 @@ + + + + + Single Page Apps for GitHub Pages + + + + + diff --git a/js/packages/gumdrop/public/favicon-384x384.png b/js/packages/gumdrop/public/favicon-384x384.png new file mode 100644 index 0000000000..35673987c6 Binary files /dev/null and b/js/packages/gumdrop/public/favicon-384x384.png differ diff --git a/js/packages/gumdrop/public/favicon-96x96.png b/js/packages/gumdrop/public/favicon-96x96.png new file mode 100644 index 0000000000..13a669a1a9 Binary files /dev/null and b/js/packages/gumdrop/public/favicon-96x96.png differ diff --git a/js/packages/gumdrop/public/index.html b/js/packages/gumdrop/public/index.html new file mode 100644 index 0000000000..5deac3bc64 --- /dev/null +++ b/js/packages/gumdrop/public/index.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + Gumdrop + + + + + + + +
+ + + diff --git a/js/packages/gumdrop/public/manifest.json b/js/packages/gumdrop/public/manifest.json new file mode 100644 index 0000000000..58fb0051af --- /dev/null +++ b/js/packages/gumdrop/public/manifest.json @@ -0,0 +1,16 @@ +{ + "name": "Gumdrop", + "short_name": "Gumdrop", + "icons": [ + { + "src": "/favicon-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "/favicon-384x384.png", + "sizes": "384x384", + "type": "image/png" + } + ] +} diff --git a/js/packages/gumdrop/public/robots.txt b/js/packages/gumdrop/public/robots.txt new file mode 100644 index 0000000000..e9e57dc4d4 --- /dev/null +++ b/js/packages/gumdrop/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/js/packages/gumdrop/src/App.css b/js/packages/gumdrop/src/App.css new file mode 100644 index 0000000000..74b5e05345 --- /dev/null +++ b/js/packages/gumdrop/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/js/packages/gumdrop/src/App.test.tsx b/js/packages/gumdrop/src/App.test.tsx new file mode 100644 index 0000000000..2a68616d98 --- /dev/null +++ b/js/packages/gumdrop/src/App.test.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/js/packages/gumdrop/src/App.tsx b/js/packages/gumdrop/src/App.tsx new file mode 100644 index 0000000000..cb2c0bdd6d --- /dev/null +++ b/js/packages/gumdrop/src/App.tsx @@ -0,0 +1,254 @@ +import React from "react"; +import { + BrowserRouter, + Link, + Route, + Switch, +} from "react-router-dom"; + +import { createTheme, ThemeProvider } from "@mui/material/styles"; +import CssBaseline from "@mui/material/CssBaseline"; +import { + Box, + Link as HyperLink, + Stack, +} from "@mui/material"; + +import "./App.css"; +import { + useColorMode, +} from "./contexts"; +import { Header } from "./components/Header/Header"; +import { Claim } from "./components/Claim"; +import { Close } from "./components/Close"; +import { Create } from "./components/Create"; + +const WHITESPACE = "\u00A0"; + +const About = () => { + const summary = ( + +
+ The Gumdrop program leverages the Solana blockchain and merkle trees to + facilitate airdrops to a large number of whitelisted users at a low cost + to creators. +
+ +
+ In the Solana ecosystem, the cost of token airdrops is currently largely + due to rent costs being{WHITESPACE} + + "fixed at the genesis" + + . With the large increase in SOLUSD since genesis, rent costs when + creating accounts for thousands of users have duly skyrocketed. +
+ +
+ Simultaneously, NFT projects often have a presale to early project + followers and contributors. However, the candy-machine doesn't have the + ability to grant early minting to a whitelisted subset of wallets while + also using the same asset configuration for open launch. +
+ +
+ Gumdrop (originally pioneered for token airdrops by{" "} + + Uniswap + + {" "}and ported to Solana by{WHITESPACE} + + Saber + ) solves both these issues by building a space-efficient hash + structure (the merkle tree) such that an on-chain program can validate + whether the user is part of a whitelist. Moreover, Gumdrop + allows creators to directly send whitelisted users an airdrop reclamation + link by building the tree with off-chain handles (e.g email, discord, + etc) and allowing the user to redeem into any wallet. +
+
+ ); + + const create= ( + + + CREATION + + +
+ Creation builds a whitelist of users that can claim either existing + fungible tokens or directly mint from a pre-sale candy-machine. +
+ +
+ Creators must choose a mint or a candy-machine config and UUID, an + off-chain notification method (based on the handles supplied below, e.g + email, discord, etc), and supply a list of recipients and balances with + the following JSON schema{WHITESPACE} + + (Click here for an example) + +
+ +
{`
+[
+  {
+    "handle": ""
+    "amount": <#-TOKENS-OR-CANDY-MINTS>
+  },
+  ...
+]`}
+ +
+ NB: When a candy-machine is supplied, update authority for the + candy-machine will be transferred to the Gumdrop state. This can + be reclaimed by closing the Gumdrop. +
+
+ ); + + const claim = ( + + + CLAIMS + + +
+ Claims are redeemed through a URL with query parameters holding + claim-specific keys. Claimants will need to verify ownership of the + specified handle by answering a OTP challenge and pay the rent and + minting fees if applicable. +
+
+ ); + + const close = ( + + + CLOSING + + +
+ Closing the Gumdrop cleans up the on-chain state and allows + creators to recycle any lamports held for rent-exemption after the + airdrop is complete. +
+ +
+ When closing a candy-machine-integrated distributor, update authority + will be transferred back to the wallet owner. +
+
+ ); + + const steps = [ + { name: "summary" , inner: summary } , + { name: "create" , inner: create } , + { name: "claim" , inner: claim } , + { name: "close" , inner: close } , + ]; + return ( + + {steps.map((s, idx) =>
{s.inner}
)} +
+ ); +}; + +const getWindowDimensions = () => { + const { innerWidth: width, innerHeight: height } = window; + return { + width, + height, + }; +}; + +// eslint-disable-next-line +const useWindowDimensions = () => { + const [windowDimensions, setWindowDimensions] = React.useState( + getWindowDimensions() + ); + + React.useEffect(() => { + const handleResize = () => { + setWindowDimensions(getWindowDimensions()); + } + + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); + + return windowDimensions; +}; + +function App() { + const colorModeCtx = useColorMode(); + + React.useEffect(() => {}, [colorModeCtx.mode]); + + const theme = React.useMemo( + () => { + let mode; + if (colorModeCtx.mode === "dark" || !colorModeCtx.mode) { + mode = "dark"; + } else { + mode = "light"; + } + + return createTheme({ + palette: { + mode, + }, + }) + }, + [colorModeCtx.mode] + ); + + const { width } = useWindowDimensions(); + + return ( +
+ + + +
+ + + + + + + + + + + + +
+ ); +} + +export default App; diff --git a/js/packages/gumdrop/src/components/Centered.tsx b/js/packages/gumdrop/src/components/Centered.tsx new file mode 100644 index 0000000000..b84993a892 --- /dev/null +++ b/js/packages/gumdrop/src/components/Centered.tsx @@ -0,0 +1,44 @@ +import React from "react"; + +export type CenteredProps = { + children : React.ReactNode, + height : string, + width : string, +} + +export const Centered = ( + props : CenteredProps +) => { + return ( +
+
+
+ {props.children} +
+
+
+ ); +}; + +export default Centered; diff --git a/js/packages/gumdrop/src/components/Claim.tsx b/js/packages/gumdrop/src/components/Claim.tsx new file mode 100644 index 0000000000..ab4eadfc45 --- /dev/null +++ b/js/packages/gumdrop/src/components/Claim.tsx @@ -0,0 +1,1212 @@ +import React from "react"; +import { RouteComponentProps, } from "react-router-dom"; +import queryString from 'query-string'; + +import { + Box, + Button, + CircularProgress, + FormControl, + Link as HyperLink, + InputLabel, + MenuItem, + Select, + Stack, + Step, + StepLabel, + Stepper, + TextField, +} from "@mui/material"; + +import { + useWallet, +} from "@solana/wallet-adapter-react"; +import { + Connection as RPCConnection, + Keypair, + PublicKey, + SystemProgram, + SYSVAR_RENT_PUBKEY, + SYSVAR_CLOCK_PUBKEY, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import { + AccountLayout, + MintLayout, + Token, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { + notify, +} from "@oyster/common"; +import { sha256 } from "js-sha256"; +import BN from 'bn.js'; +import * as bs58 from "bs58"; + +import { + useConnection, +} from "../contexts"; +import { + CANDY_MACHINE_ID, + GUMDROP_DISTRIBUTOR_ID, + GUMDROP_TEMPORAL_SIGNER, + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_METADATA_PROGRAM_ID, +} from "../utils/ids"; +import { + getCandyMachine, + getCandyMachineAddress, + getEdition, + getEditionMarkerPda, + getMetadata, +} from "../utils/accounts"; +import { MerkleTree } from "../utils/merkleTree"; +import { + explorerLinkFor, + sendSignedTransaction, +} from "../utils/transactions"; +import { + chunk, +} from "../utils/claimant"; +import { coder } from "../utils/merkleDistributor"; + +const walletKeyOrPda = async ( + walletKey : PublicKey, + handle : string, + pin : BN | null, + seed : PublicKey, +) : Promise<[PublicKey, Array]> => { + if (pin === null) { + try { + const key = new PublicKey(handle); + if (!key.equals(walletKey)) { + throw new Error("Claimant wallet handle does not match connected wallet"); + } + return [key, []]; + } catch (err) { + throw new Error(`Invalid claimant wallet handle ${err}`); + } + } else { + const seeds = [ + seed.toBuffer(), + Buffer.from(handle), + Buffer.from(pin.toArray("le", 4)), + ]; + + const [claimantPda, ] = await PublicKey.findProgramAddress( + [ + seeds[0], + ...chunk(seeds[1], 32), + seeds[2], + ], + GUMDROP_DISTRIBUTOR_ID + ); + return [claimantPda, seeds]; + } +} + + +const buildMintClaim = async ( + connection : RPCConnection, + walletKey : PublicKey, + distributorKey : PublicKey, + distributorInfo : any, + tokenAcc : string, + proof : Array, + handle : string, + amount : number, + index : number, + pin : BN | null, +) : Promise<[Array, Array, Array]> => { + let tokenAccKey: PublicKey; + try { + tokenAccKey = new PublicKey(tokenAcc); + } catch (err) { + throw new Error(`Invalid tokenAcc key ${err}`); + } + const distTokenAccount = await connection.getAccountInfo(tokenAccKey); + if (distTokenAccount === null) { + throw new Error(`Could not fetch distributor token account`); + } + + const tokenAccountInfo = AccountLayout.decode(distTokenAccount.data); + const mint = new PublicKey(tokenAccountInfo.mint); + + console.log(mint.toBase58()); + + const [secret, pdaSeeds] = await walletKeyOrPda(walletKey, handle, pin, mint); + + // TODO: since it's in the PDA do we need it to be in the leaf? + const leaf = Buffer.from( + [...new BN(index).toArray("le", 8), + ...secret.toBuffer(), + ...mint.toBuffer(), + ...new BN(amount).toArray("le", 8), + ] + ); + + const matches = MerkleTree.verifyClaim( + leaf, proof, Buffer.from(distributorInfo.root) + ); + + if (!matches) { + throw new Error("Gumdrop merkle proof does not match"); + } + + const [claimStatus, cbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("ClaimStatus"), + Buffer.from(new BN(index).toArray("le", 8)), + distributorKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + + const [walletTokenKey, ] = await PublicKey.findProgramAddress( + [ + walletKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + + const setup : Array = []; + + if (await connection.getAccountInfo(walletTokenKey) === null) { + setup.push(Token.createAssociatedTokenAccountInstruction( + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_PROGRAM_ID, + mint, + walletTokenKey, + walletKey, + walletKey + )); + } + + const temporalSigner = distributorInfo.temporal.equals(PublicKey.default) || secret.equals(walletKey) + ? walletKey : distributorInfo.temporal; + + const claimAirdrop = new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: distributorKey , isSigner: false , isWritable: true } , + { pubkey: claimStatus , isSigner: false , isWritable: true } , + { pubkey: tokenAccKey , isSigner: false , isWritable: true } , + { pubkey: walletTokenKey , isSigner: false , isWritable: true } , + { pubkey: temporalSigner , isSigner: true , isWritable: false } , + { pubkey: walletKey , isSigner: true , isWritable: false } , // payer + { pubkey: SystemProgram.programId , isSigner: false , isWritable: false } , + { pubkey: TOKEN_PROGRAM_ID , isSigner: false , isWritable: false } , + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:claim")).slice(0, 8), + ...new BN(cbump).toArray("le", 1), + ...new BN(index).toArray("le", 8), + ...new BN(amount).toArray("le", 8), + ...secret.toBuffer(), + ...new BN(proof.length).toArray("le", 4), + ...Buffer.concat(proof), + ]) + }) + + return [[...setup, claimAirdrop], pdaSeeds, []]; +} + +const buildCandyClaim = async ( + connection : RPCConnection, + walletKey : PublicKey, + distributorKey : PublicKey, + distributorInfo : any, + candyConfig : string, + candyUUID : string, + proof : Array, + handle : string, + amount : number, + index : number, + pin : BN | null, +) : Promise<[Array, Array, Array]> => { + + let configKey : PublicKey; + try { + configKey = new PublicKey(candyConfig); + } catch (err) { + throw new Error(`Invalid candy config key ${err}`); + } + + const [secret, pdaSeeds] = await walletKeyOrPda(walletKey, handle, pin, configKey); + + // TODO: since it's in the PDA do we need it to be in the leaf? + const leaf = Buffer.from( + [...new BN(index).toArray("le", 8), + ...secret.toBuffer(), + ...configKey.toBuffer(), + ...new BN(amount).toArray("le", 8), + ] + ); + + const matches = MerkleTree.verifyClaim( + leaf, proof, Buffer.from(distributorInfo.root) + ); + + if (!matches) { + throw new Error("Gumdrop merkle proof does not match"); + } + + const [claimCount, cbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("ClaimCount"), + Buffer.from(new BN(index).toArray("le", 8)), + distributorKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + + const [distributorWalletKey, wbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("Wallet"), + distributorKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + + // atm the contract has a special case for when the temporal key is defaulted + // (aka always passes temporal check) + // TODO: more flexible + let temporalSigner = distributorInfo.temporal.equals(PublicKey.default) || secret.equals(walletKey) + ? walletKey : distributorInfo.temporal; + + const setup : Array = []; + + const claimCountAccount = await connection.getAccountInfo(claimCount); + let nftsAlreadyMinted = 0; + if (claimCountAccount === null) { + // nothing claimed yet + } else { + // TODO: subtract already minted?... + const claimAccountInfo = coder.accounts.decode( + "ClaimCount", claimCountAccount.data); + nftsAlreadyMinted = claimAccountInfo.count; + if (claimAccountInfo.claimant.equals(walletKey)) { + // we already proved this claim and verified the OTP once, contract knows + // that this wallet is OK + temporalSigner = walletKey; + } else { + // need to claim with the first wallet... + const claimantStr = claimAccountInfo.claimant.toBase58(); + throw new Error(`This wallet does not match existing claimant ${claimantStr}`); + } + } + + const nftsAvailable = amount; + if (nftsAlreadyMinted >= nftsAvailable) { + throw new Error(`Cannot mint another NFT. ${nftsAvailable} NFT(s) were originally allocated` + + (nftsAlreadyMinted > 0 ? ` and ${nftsAlreadyMinted} NFT(s) were already minted` : "")); + } + + + const [candyMachineKey, ] = await getCandyMachineAddress(configKey, candyUUID); + const candyMachine = await getCandyMachine(connection, candyMachineKey); + console.log("Candy Machine", candyMachine); + + const candyMachineMints : Array = []; + + const [instrs, mint] = await buildSingleCandyMint( + connection, + walletKey, + distributorKey, + distributorWalletKey, + claimCount, + temporalSigner, + configKey, + candyMachineKey, + candyMachine.wallet, + Buffer.from([ + ...new BN(wbump).toArray("le", 1), + ...new BN(cbump).toArray("le", 1), + ...new BN(index).toArray("le", 8), + ...new BN(amount).toArray("le", 8), + ...secret.toBuffer(), + ...new BN(proof.length).toArray("le", 4), + ...Buffer.concat(proof), + ]), + ); + candyMachineMints.push(mint); + setup.push(...instrs); + + return [setup, pdaSeeds, candyMachineMints]; +} + +const buildSingleCandyMint = async ( + connection : RPCConnection, + walletKey : PublicKey, + distributorKey : PublicKey, + distributorWalletKey : PublicKey, + claimCount : PublicKey, + temporalSigner : PublicKey, + configKey : PublicKey, + candyMachineKey : PublicKey, + candyMachineWallet : PublicKey, + data : Buffer, +) : Promise<[Array, Keypair]> => { + const candyMachineMint = Keypair.generate(); + const candyMachineMetadata = await getMetadata(candyMachineMint.publicKey); + const candyMachineMaster = await getEdition(candyMachineMint.publicKey); + + const setup : Array = []; + await createMintAndAccount(connection, walletKey, candyMachineMint.publicKey, setup); + setup.push(new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: distributorKey , isSigner: false , isWritable: true } , + { pubkey: distributorWalletKey , isSigner: false , isWritable: true } , + { pubkey: claimCount , isSigner: false , isWritable: true } , + { pubkey: temporalSigner , isSigner: true , isWritable: false } , + { pubkey: walletKey , isSigner: true , isWritable: false } , // payer + + { pubkey: configKey , isSigner: false , isWritable: true } , + { pubkey: candyMachineKey , isSigner: false , isWritable: true } , + { pubkey: candyMachineWallet , isSigner: false , isWritable: true } , + { pubkey: candyMachineMint.publicKey, isSigner: false , isWritable: true } , + { pubkey: candyMachineMetadata , isSigner: false , isWritable: true } , + { pubkey: candyMachineMaster , isSigner: false , isWritable: true } , + + { pubkey: SystemProgram.programId , isSigner: false , isWritable: false } , + { pubkey: TOKEN_PROGRAM_ID , isSigner: false , isWritable: false } , + { pubkey: TOKEN_METADATA_PROGRAM_ID , isSigner: false , isWritable: false } , + { pubkey: CANDY_MACHINE_ID , isSigner: false , isWritable: false } , + { pubkey: SYSVAR_RENT_PUBKEY , isSigner: false , isWritable: false } , + { pubkey: SYSVAR_CLOCK_PUBKEY , isSigner: false , isWritable: false } , + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:claim_candy")).slice(0, 8), + ...data, + ]) + })); + + return [setup, candyMachineMint]; +} + +const createMintAndAccount = async ( + connection : RPCConnection, + walletKey : PublicKey, + mint : PublicKey, + setup : Array, +) => { + const [walletTokenKey, ] = await PublicKey.findProgramAddress( + [ + walletKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + + setup.push(SystemProgram.createAccount({ + fromPubkey: walletKey, + newAccountPubkey: mint, + space: MintLayout.span, + lamports: + await connection.getMinimumBalanceForRentExemption( + MintLayout.span, + ), + programId: TOKEN_PROGRAM_ID, + })); + + setup.push(Token.createInitMintInstruction( + TOKEN_PROGRAM_ID, + mint, + 0, + walletKey, + walletKey, + )); + + setup.push(Token.createAssociatedTokenAccountInstruction( + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_PROGRAM_ID, + mint, + walletTokenKey, + walletKey, + walletKey + )); + + setup.push(Token.createMintToInstruction( + TOKEN_PROGRAM_ID, + mint, + walletTokenKey, + walletKey, + [], + 1, + )); + +} + +const buildEditionClaim = async ( + connection : RPCConnection, + walletKey : PublicKey, + distributorKey : PublicKey, + distributorInfo : any, + masterMint : string, + edition : number, + proof : Array, + handle : string, + amount : number, + index : number, + pin : BN | null, +) : Promise<[Array, Array, Array]> => { + + let masterMintKey : PublicKey; + try { + masterMintKey = new PublicKey(masterMint); + } catch (err) { + throw new Error(`Invalid master mint key ${err}`); + } + + const [secret, pdaSeeds] = await walletKeyOrPda(walletKey, handle, pin, masterMintKey); + + // should we assert that the amount is 1? + const leaf = Buffer.from( + [...new BN(index).toArray("le", 8), + ...secret.toBuffer(), + ...masterMintKey.toBuffer(), + ...new BN(amount).toArray("le", 8), + ...new BN(edition).toArray("le", 8), + ] + ); + + const matches = MerkleTree.verifyClaim( + leaf, proof, Buffer.from(distributorInfo.root) + ); + + if (!matches) { + throw new Error("Gumdrop merkle proof does not match"); + } + + const [claimCount, cbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("ClaimCount"), + Buffer.from(new BN(index).toArray("le", 8)), + distributorKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + + // atm the contract has a special case for when the temporal key is defaulted + // (aka always passes temporal check) + // TODO: more flexible + const temporalSigner = distributorInfo.temporal.equals(PublicKey.default) || secret.equals(walletKey) + ? walletKey : distributorInfo.temporal; + + const claimCountAccount = await connection.getAccountInfo(claimCount); + if (claimCountAccount !== null) { + throw new Error(`This edition was already claimed`); + } + + const setup : Array = []; + + const newMint = Keypair.generate(); + const newMetadataKey = await getMetadata(newMint.publicKey); + const masterMetadataKey = await getMetadata(masterMintKey); + const newEdition = await getEdition(newMint.publicKey); + const masterEdition = await getEdition(masterMintKey); + + await createMintAndAccount(connection, walletKey, newMint.publicKey, setup); + + const [distributorTokenKey, ] = await PublicKey.findProgramAddress( + [ + distributorKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + masterMintKey.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + + const editionMarkKey = await getEditionMarkerPda(masterMintKey, new BN(edition)); + + setup.push(new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: distributorKey , isSigner: false , isWritable: true } , + { pubkey: claimCount , isSigner: false , isWritable: true } , + { pubkey: temporalSigner , isSigner: true , isWritable: false } , + { pubkey: walletKey , isSigner: true , isWritable: false } , // payer + + { pubkey: newMetadataKey , isSigner: false , isWritable: true } , + { pubkey: newEdition , isSigner: false , isWritable: true } , + { pubkey: masterEdition , isSigner: false , isWritable: true } , + { pubkey: newMint.publicKey , isSigner: false , isWritable: true } , + { pubkey: editionMarkKey , isSigner: false , isWritable: true } , + { pubkey: walletKey , isSigner: true , isWritable: false } , // `newMint` auth + { pubkey: distributorTokenKey , isSigner: false , isWritable: false } , + { pubkey: walletKey , isSigner: false , isWritable: false } , // new update auth + { pubkey: masterMetadataKey , isSigner: false , isWritable: false } , + { pubkey: masterMintKey , isSigner: false , isWritable: false } , + + { pubkey: SystemProgram.programId , isSigner: false , isWritable: false } , + { pubkey: TOKEN_PROGRAM_ID , isSigner: false , isWritable: false } , + { pubkey: TOKEN_METADATA_PROGRAM_ID , isSigner: false , isWritable: false } , + { pubkey: SYSVAR_RENT_PUBKEY , isSigner: false , isWritable: false } , + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:claim_edition")).slice(0, 8), + ...new BN(cbump).toArray("le", 1), + ...new BN(index).toArray("le", 8), + ...new BN(amount).toArray("le", 8), + ...new BN(edition).toArray("le", 8), + ...secret.toBuffer(), + ...new BN(proof.length).toArray("le", 4), + ...Buffer.concat(proof), + ]) + })); + + return [setup, pdaSeeds, [newMint]]; +} + +const fetchDistributor = async ( + connection : RPCConnection, + distributorStr : string, +) => { + let key; + try { + key = new PublicKey(distributorStr); + } catch (err) { + throw new Error(`Invalid distributor key ${err}`); + } + const account = await connection.getAccountInfo(key); + if (account === null) { + throw new Error(`Could not fetch distributor ${distributorStr}`); + } + if (!account.owner.equals(GUMDROP_DISTRIBUTOR_ID)) { + const ownerStr = account.owner.toBase58(); + throw new Error(`Invalid distributor owner ${ownerStr}`); + } + const info = coder.accounts.decode("MerkleDistributor", account.data); + return [key, info]; +}; + +const fetchNeedsTemporalSigner = async ( + connection : RPCConnection, + distributorStr : string, + indexStr : string, + claimMethod : string, +) => { + const [key, info] = await fetchDistributor(connection, distributorStr); + if (!info.temporal.equals(GUMDROP_TEMPORAL_SIGNER)) { + // default pubkey or program itself (distribution through wallets) + return false; + } else if (claimMethod === "candy") { + const [claimCount, ] = await PublicKey.findProgramAddress( + [ + Buffer.from("ClaimCount"), + Buffer.from(new BN(Number(indexStr)).toArray("le", 8)), + key.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + // if someone (maybe us) has already claimed this, the contract will + // not check the existing temporal signer anymore since presumably + // they have already verified the OTP. So we need to fetch the temporal + // signer if it is null + const claimCountAccount = await connection.getAccountInfo(claimCount); + return claimCountAccount === null; + } else { + // default to need one + return true; + } +}; + +export type ClaimProps = {}; + +export const Claim = ( + props : RouteComponentProps, +) => { + const connection = useConnection(); + const wallet = useWallet(); + + let query = props.location.search; + if (query && query.length > 0) { + localStorage.setItem("claimQuery", query); + } else { + const stored = localStorage.getItem("claimQuery"); + if (stored) + query = stored; + } + + const params = queryString.parse(query); + const [distributor, setDistributor] = React.useState(params.distributor as string || ""); + const [claimMethod, setClaimMethod] = React.useState( + params.tokenAcc ? "transfer" + : params.config ? "candy" + : params.master ? "edition" + : ""); + const [tokenAcc, setTokenAcc] = React.useState(params.tokenAcc as string || ""); + const [candyConfig, setCandyConfig] = React.useState(params.config as string || ""); + const [candyUUID, setCandyUUID] = React.useState(params.uuid as string || ""); + const [masterMint, setMasterMint] = React.useState(params.master as string || ""); + const [editionStr, setEditionStr] = React.useState(params.edition as string || ""); + const [handle, setHandle] = React.useState(params.handle as string || ""); + const [amountStr, setAmount] = React.useState(params.amount as string || ""); + const [indexStr, setIndex] = React.useState(params.index as string || ""); + const [pinStr, setPin] = React.useState(params.pin as string || ""); + const [proofStr, setProof] = React.useState(params.proof as string || ""); + + const discordGuild = params.guild; + + const allFieldsPopulated = + distributor.length > 0 + && ( claimMethod === "transfer" ? tokenAcc.length > 0 + : claimMethod === "candy" ? candyConfig.length > 0 && candyUUID.length > 0 + : claimMethod === "edition" ? masterMint.length > 0 && editionStr.length > 0 + : false + ) + && handle.length > 0 + && amountStr.length > 0 + && indexStr.length > 0; + // NB: pin can be empty if handle is a public-key and we are claiming through wallets + // NB: proof can be empty! + + const [editable, setEditable] = React.useState(!allFieldsPopulated); + + // temporal verification + const [transaction, setTransaction] = React.useState(null); + const [OTPStr, setOTPStr] = React.useState(""); + + // async computed + const [asyncNeedsTemporalSigner, setNeedsTemporalSigner] = React.useState(true); + + React.useEffect(() => { + const wrap = async () => { + try { + setNeedsTemporalSigner(await fetchNeedsTemporalSigner( + connection, distributor, indexStr, claimMethod)); + } catch { + // TODO: log? + } + }; + wrap(); + }, [connection, distributor, indexStr, claimMethod]); + + const lambdaAPIEndpoint = "https://{PLACEHOLDER-API-ID}.execute-api.us-east-2.amazonaws.com/send-OTP"; + + const skipAWSWorkflow = false; + + const sendOTP = async (e : React.SyntheticEvent) => { + e.preventDefault(); + + if (!wallet.connected || wallet.publicKey === null) { + throw new Error(`Wallet not connected`); + } + + const index = Number(indexStr); + const amount = Number(amountStr); + let pin : BN | null = null; + + if (isNaN(amount)) { + throw new Error(`Could not parse amount ${amountStr}`); + } + if (isNaN(index)) { + throw new Error(`Could not parse index ${indexStr}`); + } + if (params.pin !== "NA") { + try { + pin = new BN(pinStr); + } catch (err) { + throw new Error(`Could not parse pin ${pinStr}: ${err}`); + } + } + + // TODO: use cached? + const [distributorKey, distributorInfo] = + await fetchDistributor(connection, distributor); + + console.log("Distributor", distributorInfo); + + const proof = proofStr === "" ? [] : proofStr.split(",").map(b => { + const ret = Buffer.from(bs58.decode(b)) + if (ret.length !== 32) + throw new Error(`Invalid proof hash length`); + return ret; + }); + + let instructions, pdaSeeds, extraSigners; + if (claimMethod === "candy") { + console.log("Building candy claim"); + [instructions, pdaSeeds, extraSigners] = await buildCandyClaim( + connection, wallet.publicKey, distributorKey, distributorInfo, + candyConfig, candyUUID, + proof, handle, amount, index, pin + ); + } else if (claimMethod === "transfer") { + [instructions, pdaSeeds, extraSigners] = await buildMintClaim( + connection, wallet.publicKey, distributorKey, distributorInfo, + tokenAcc, + proof, handle, amount, index, pin + ); + } else if (claimMethod === "edition") { + const edition = Number(editionStr); + if (isNaN(edition)) { + throw new Error(`Could not parse edition ${editionStr}`); + } + [instructions, pdaSeeds, extraSigners] = await buildEditionClaim( + connection, wallet.publicKey, distributorKey, distributorInfo, + masterMint, edition, + proof, handle, amount, index, pin + ); + } else { + throw new Error(`Unknown claim method ${claimMethod}`); + } + + // NB: if we're claiming through wallets then pdaSeeds should be empty + // since the secret is the wallet key (which is also a signer) + if (pin === null && pdaSeeds.length > 0) { + throw new Error(`Internal error: PDA generated when distributing to wallet directly`); + } + + const transaction = new Transaction({ + feePayer: wallet.publicKey, + recentBlockhash: (await connection.getRecentBlockhash("singleGossip")).blockhash, + }); + + const signers = new Set(); + for (const instr of instructions) { + transaction.add(instr); + for (const key of instr.keys) + if (key.isSigner) + signers.add(key.pubkey); + } + console.log(`Expecting the following signers: ${[...signers].map(s => s.toBase58())}`); + transaction.setSigners(...signers); + + if (extraSigners.length > 0) { + transaction.partialSign(...extraSigners); + } + + const txnNeedsTemporalSigner = + transaction.signatures.some(s => s.publicKey.equals(GUMDROP_TEMPORAL_SIGNER)); + if (txnNeedsTemporalSigner && !skipAWSWorkflow) { + const otpQuery : { [key: string] : any } = { + method: "send", + transaction: bs58.encode(transaction.serializeMessage()), + seeds: pdaSeeds, + }; + if (discordGuild) { + otpQuery.discordGuild = discordGuild; + } + const params = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(otpQuery), + }; + + const response = await fetch(lambdaAPIEndpoint, params); + console.log(response); + + if (response.status !== 200) { + throw new Error(`Failed to send AWS OTP`); + } + + let data; + try { + data = await response.json(); + } catch { + throw new Error(`Could not parse AWS OTP response`); + } + + console.log("AWS OTP response data:", data); + + let succeeded, toCheck; + if (discordGuild) { + succeeded = !!data.id; + toCheck = "discord"; + } else { + succeeded = !!data.MessageId; + toCheck = "email"; + } + + if (!succeeded) { + throw new Error(`Failed to send AWS OTP`); + } + + notify({ + message: "OTP sent", + description: `Please check your ${toCheck} (${handle}) for an OTP`, + }); + } + + return transaction; + }; + + const verifyOTP = async ( + e : React.SyntheticEvent, + transaction : Transaction | null, + ) => { + e.preventDefault(); + + if (!transaction) { + throw new Error(`Transaction not available for OTP verification`); + } + + if (!wallet.connected || wallet.publicKey === null) { + throw new Error(`Wallet not connected`); + } + + const txnNeedsTemporalSigner = + transaction.signatures.some(s => s.publicKey.equals(GUMDROP_TEMPORAL_SIGNER)); + if (txnNeedsTemporalSigner && !skipAWSWorkflow) { + // TODO: distinguish between OTP failure and transaction-error. We can try + // again on the former but not the latter + const OTP = Number(OTPStr); + if (isNaN(OTP) || OTPStr.length === 0) { + throw new Error(`Could not parse OTP ${OTPStr}`); + } + + const params = { + method: "POST", + headers: { "Content-Type": "application/json" }, + FunctionName: "send-OTP", + body: JSON.stringify({ + method: "verify", + otp: OTP, + handle: handle, // TODO? + }), + }; + + const response = await fetch(lambdaAPIEndpoint, params); + console.log(response); + + if (response.status !== 200) { + const blob = JSON.stringify(response); + throw new Error(`Failed to verify AWS OTP. ${blob}`); + } + + let data; + try { + data = await response.json(); + } catch { + throw new Error(`Could not parse AWS OTP verification response`); + } + + console.log("AWS verify response data:", data); + + let sig; + try { + sig = bs58.decode(data); + } catch { + throw new Error(`Could not decode transaction signature ${data.body}`); + } + + transaction.addSignature(GUMDROP_TEMPORAL_SIGNER, sig); + } + + let fullySigned; + try { + fullySigned = await wallet.signTransaction(transaction); + } catch { + throw new Error("Failed to sign transaction"); + } + + const claimResult = await sendSignedTransaction({ + connection, + signedTransaction: fullySigned, + }); + + console.log(claimResult); + notify({ + message: "Claim succeeded", + description: ( + + View transaction on explorer + + ), + }); + setTransaction(null); + try { + setNeedsTemporalSigner(await fetchNeedsTemporalSigner( + connection, distributor, indexStr, claimMethod)); + } catch { + // TODO: log? + } + }; + + const [loading, setLoading] = React.useState(false); + const loadingProgress = () => ( + + ); + + const verifyOTPC = (onClick) => ( + + setOTPStr(e.target.value)} + /> + + + + + {loading && loadingProgress()} + + + ); + + const claimData = (claimMethod) => { + if (claimMethod === "candy") { + return ( + + setCandyConfig(e.target.value)} + disabled={!editable} + /> + setCandyUUID(e.target.value)} + disabled={!editable} + /> + + ); + } else if (claimMethod === "transfer") { + return ( + + setTokenAcc(e.target.value)} + disabled={!editable} + /> + + ); + } else if (claimMethod === "edition") { + return ( + + setMasterMint(e.target.value)} + disabled={!editable} + /> + setEditionStr(e.target.value)} + disabled={!editable} + /> + + ); + } + }; + + const populateClaimC = (onClick) => ( + + setDistributor(e.target.value)} + disabled={!editable} + /> + + + Claim Method + + + + {claimMethod !== "" && claimData(claimMethod)} + {claimMethod !== "edition" && setAmount(e.target.value)} + disabled={!editable} + />} + setHandle(e.target.value)} + disabled={!editable} + /> + setIndex(e.target.value)} + disabled={!editable} + /> + {params.pin !== "NA" && setPin(e.target.value)} + disabled={!editable} + />} + setProof(e.target.value)} + disabled={!editable} + /> + + + + + + {loading && loadingProgress()} + + + ); + + const steps = [ + { name: "Populate Claim", inner: populateClaimC }, + ]; + if (asyncNeedsTemporalSigner) { + steps.push( + { name: "Verify OTP" , inner: verifyOTPC } + ); + } + + // TODO: better interaction between setting `asyncNeedsTemporalSigner` and + // the stepper... this is pretty jank + const [activeStep, setActiveStep] = React.useState(0); + const stepToUse = Math.min(activeStep, steps.length - 1); + + const handleNext = () => { + // return to start if going past the end (claim succeeded) + setActiveStep(prev => { + if (prev === steps.length - 1) { + return 0; + } else { + return prev + 1; + } + }); + }; + const handleBack = () => { + setActiveStep(prev => prev - 1); + }; + + const stepper = ( + + + {steps.map(s => { + return ( + + {s.name} + + ); + })} + + + + ); + + return ( + + {asyncNeedsTemporalSigner && stepper} + {steps[stepToUse].inner(handleNext)} + {stepToUse > 0 && ( + + )} + + ); +}; + diff --git a/js/packages/gumdrop/src/components/Close.tsx b/js/packages/gumdrop/src/components/Close.tsx new file mode 100644 index 0000000000..9d1695612f --- /dev/null +++ b/js/packages/gumdrop/src/components/Close.tsx @@ -0,0 +1,205 @@ +import React from "react"; + +import { + Box, + Button, + CircularProgress, + FormControl, + InputLabel, + Link as HyperLink, + MenuItem, + Stack, + Select, + TextField, +} from "@mui/material"; + +import { + useWallet, +} from "@solana/wallet-adapter-react"; +import { + Keypair, +} from "@solana/web3.js"; +import { + notify, +} from "@oyster/common"; + +import { + useConnection, + Connection, +} from "../contexts"; +import { + closeGumdrop, +} from "../utils/claimant"; +import { + explorerLinkFor, +} from "../utils/transactions"; + +export const Close = () => { + const connection = useConnection(); + const wallet = useWallet(); + + const [baseKey, setBaseKey] = React.useState(""); + const [claimMethod, setClaimMethod] = React.useState(localStorage.getItem("claimMethod") || "transfer"); + const [mint, setMint] = React.useState(localStorage.getItem("mint") || ""); + const [candyConfig, setCandyConfig] = React.useState(localStorage.getItem("candyConfig") || ""); + const [candyUUID, setCandyUUID] = React.useState(localStorage.getItem("candyUUID") || ""); + const [masterMint, setMasterMint] = React.useState(localStorage.getItem("masterMint") || ""); + + const submit = async (e : React.SyntheticEvent) => { + e.preventDefault(); + + if (!wallet.connected || wallet.publicKey === null) { + throw new Error(`Wallet not connected`); + } + + const base = Keypair.fromSecretKey( + new Uint8Array(JSON.parse(baseKey))); + + const instructions = await closeGumdrop( + connection, + wallet.publicKey, + base, + claimMethod, + mint, + candyConfig, + candyUUID, + masterMint, + ); + + const closeResult = await Connection.sendTransactionWithRetry( + connection, + wallet, + instructions, + [base] + ); + + console.log(closeResult); + if (typeof closeResult === "string") { + notify({ + message: "Close failed", + description: closeResult, + }); + } else { + notify({ + message: "Close succeeded", + description: ( + + View transaction on explorer + + ), + }); + } + }; + + const claimData = (claimMethod) => { + if (claimMethod === "candy") { + return ( + + setCandyConfig(e.target.value)} + /> + setCandyUUID(e.target.value)} + /> + + ); + } else if (claimMethod === "transfer") { + return ( + + setMint(e.target.value)} + /> + + ); + } else if (claimMethod === "edition") { + return ( + + setMasterMint(e.target.value)} + /> + + ); + } + }; + + const [loading, setLoading] = React.useState(false); + const loadingProgress = () => ( + + ); + return ( + + setBaseKey(e.target.value)} + /> + + Claim Method + + + {claimMethod !== "" && claimData(claimMethod)} + + + {loading && loadingProgress()} + + + ); +}; diff --git a/js/packages/gumdrop/src/components/Create.tsx b/js/packages/gumdrop/src/components/Create.tsx new file mode 100644 index 0000000000..f8d6b291e2 --- /dev/null +++ b/js/packages/gumdrop/src/components/Create.tsx @@ -0,0 +1,835 @@ +import React from "react"; +import ReactDOM from "react-dom"; + +import { + Box, + Button, + CircularProgress, + FormControl, + Link as HyperLink, + InputLabel, + MenuItem, + Stack, + Select, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, +} from "@mui/material"; +import FilePresentIcon from '@mui/icons-material/FilePresent'; + +import { + useWallet, +} from "@solana/wallet-adapter-react"; +import { + Keypair, + PublicKey, +} from "@solana/web3.js"; +import { + MintInfo, +} from "@solana/spl-token"; +import { + notify, + shortenAddress, +} from "@oyster/common"; +import BN from 'bn.js'; + +import { + useConnection, + Connection, +} from "../contexts"; +import { + GUMDROP_DISTRIBUTOR_ID, + GUMDROP_TEMPORAL_SIGNER, +} from "../utils/ids"; +import { + ClaimantInfo, + Claimants, + buildGumdrop, + dropInfoFor, + parseClaimants, + validateTransferClaims, + validateCandyClaims, + validateEditionClaims, +} from "../utils/claimant"; +import { + AuthKeys, + DropInfo, + Response as DResponse, + distributeAwsSes, + distributeManual, + distributeWallet, + urlAndHandleFor, +} from "../utils/communication"; +import { + envFor, + explorerLinkFor, +} from "../utils/transactions"; +import { DragAndDrop } from "./DragAndDrop"; +import { DefaultModal } from "./DefaultModal"; + +// NB: assumes no overflow +const randomBytes = () : Uint8Array => { + // TODO: some predictable seed? sha256? + const buf = new Uint8Array(4); + window.crypto.getRandomValues(buf); + return buf; +} + +const WHITESPACE = "\u00A0"; + +const distribute = ( + method : string, + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + if (method === "AWS SES") { + return distributeAwsSes(auth, source, claimants, drop); + } else if (method === "Manual") { + return distributeManual(auth, source, claimants, drop); + } else if (method === "Wallets") { + return distributeWallet(auth, source, claimants, drop); + } else { + throw new Error(`Unrecognized claim distribution method ${method}`); + } +} + +const reactModal = (renderModal) => { + const container = document.createElement('div'); + document.body.appendChild(container); + + const displayModal = ({ onSubmit, onDismiss }) => { + ReactDOM.render(renderModal({ onSubmit, onDismiss, show: true }), container); + }; + + const hideModal = ({ onSubmit, onDismiss }, callback) => { + ReactDOM.render(renderModal({ onSubmit, onDismiss, show: false }), container, callback); + }; + + const destroyModal = () => { + ReactDOM.unmountComponentAtNode(container); + document.body.removeChild(container); + }; + + const confirmation = new Promise((resolve) => { + const onSubmit = (value) => resolve(value); + const onDismiss = () => resolve(undefined); + displayModal({ onSubmit, onDismiss }); + }); + + return confirmation.finally(() => { + const onSubmit = () => {}; + const onDismiss = () => {}; + hideModal({ onSubmit, onDismiss }, destroyModal); + }); +}; + +const resendOnlyRender = ({ show, onSubmit, onDismiss }) => { + const options = [ + { click: () => onSubmit("create"), name: "Create and Send" }, + { click: () => onSubmit("send") , name: "Send only" }, + ]; + return ( + +

+ Uploaded distribution list has URLs for all claimants. + Skip creation of airdrop and only re-send links? +

+
+ + {options.map((opt) => { + return ( + + ); + })} + +
+ ); +}; + +const displayMintTokens = (amount : number, mintInfo : MintInfo) : string => { + // TODO: better decimal rounding + return String(amount / Math.pow(10, mintInfo.decimals)); +}; + +const hyperLinkData = (data) => { + const encoded = encodeURIComponent(JSON.stringify(data)); + return `data:text/plain;charset=utf-8,${encoded}`; +}; + +const shouldSendRender = (claimants, needsPin, claimMethod, claimInfo, baseKey) => { + const limit = 1000; + // eslint-disable-next-line react/prop-types + return function ClaimPreviewC({ show, onSubmit, onDismiss }) { + return ( + +

+ Claim Distribution Preview{claimants.length > limit ? ` (First ${limit})` : ""} +

+

+ Approving will save the keypair authority generated for gumdrop + state. This keypair is necessary to close the gumdrop later! +

+ + + + + Handle + + {claimMethod === "edition" + ? "Edition" + : "Tokens" + } + + {needsPin && Pin} + + + + {claimants.slice(0, limit).map((c, idx) => ( + + {c.handle} + + { claimMethod === "transfer" ? displayMintTokens(c.amount, claimInfo.mint.info) + : claimMethod === "candy" ? c.amount + : /* === "edition" */ c.edition + } + + {needsPin && {c.pin.toNumber()}} + + ))} + +
+
+ + + + + + + +
+ ); + } +}; + +export const Create = () => { + const connection = useConnection(); + const wallet = useWallet(); + + // claim state + const [claimMethod, setClaimMethod] = React.useState(localStorage.getItem("claimMethod") || ""); + const [candyConfig, setCandyConfig] = React.useState(localStorage.getItem("candyConfig") || ""); + const [candyUUID, setCandyUUID] = React.useState(localStorage.getItem("candyUUID") || ""); + const [mint, setMint] = React.useState(localStorage.getItem("mint") || ""); + const [masterMint, setMasterMint] = React.useState(localStorage.getItem("masterMint") || ""); + const [filename, setFilename] = React.useState(""); + const [text, setText] = React.useState(""); + + // response state + const [claimURLs, setClaimURLs] = React.useState>([]); + const [responses, setResponses] = React.useState>([]); + + // auth state + const [otpAuth, setOtpAuth] = React.useState(localStorage.getItem("otpAuth") || "default"); + const [commMethod, setCommMethod] = React.useState(localStorage.getItem("commMethod") || ""); + const [commAuth, setCommAuth] = React.useState({}); + const [commSource, setCommSource] = React.useState(localStorage.getItem("commSource") || ""); + const [awsAccessKeyId, setAwsAccessKeyId] = React.useState(""); + const [awsSecretKey, setAwsSecretKey] = React.useState(""); + + const explorerUrlFor = (key : PublicKey) => { + return `https://explorer.solana.com/address/${key.toBase58()}?cluster=${envFor(connection)}`; + } + + const distributeClaims = async (claimants, drop) => { + const responses = await distribute( + commMethod, commAuth, commSource, claimants, drop); + + console.log("Responses", responses); + setResponses(responses); + + // notify if the above routine is actually supposed to do anything + // (manual and wallet do nothing atm) + if (commMethod === "AWS SES") { + notify({ + message: "Gumdrop email distribution completed", + }); + } + } + + const submit = async (e : React.SyntheticEvent) => { + e.preventDefault(); + + setClaimURLs([]); + setResponses([]); + + if (!wallet.connected || wallet.publicKey === null) { + throw new Error(`Wallet not connected`); + } + + const claimants = parseClaimants(text, filename, commMethod); + if (claimants.length === 0) { + throw new Error(`No claimants provided`); + } + + const dropInfo = dropInfoFor(envFor(connection), claimMethod, mint, candyConfig, masterMint); + // check that auth is correct... + await distribute( + commMethod, commAuth, commSource, [], dropInfo); + + const mightHaveExisting = (info : ClaimantInfo) => { + return info.url !== undefined && info.url !== null; + }; + if (claimants.reduce((acc, c) => acc && mightHaveExisting(c), true)) { + const resendOnly = await reactModal(resendOnlyRender); + console.log("Resend only", resendOnly); + if (resendOnly === "send") { + setClaimURLs(urlAndHandleFor(claimants)); + await distributeClaims(claimants, dropInfo); + return; + } else if (resendOnly === "create") { + // fallthrough to full create + } else { + // dismissed. don't use exceptions for control flow? + throw new Error("Dismissed"); + } + } + + + let claimInfo; + switch (claimMethod) { + case "transfer": { + claimInfo = await validateTransferClaims( + connection, + wallet.publicKey, + claimants, + mint, + ); + break; + } + case "candy": { + claimInfo = await validateCandyClaims( + connection, + wallet.publicKey, + claimants, + candyConfig, + candyUUID, + ); + break; + } + case "edition": { + claimInfo = await validateEditionClaims( + connection, + wallet.publicKey, + claimants, + masterMint, + ); + break; + } + default: + throw new Error(`Unknown claim method ${claimMethod}`); + } + console.log("Claims info", claimInfo); + + claimants.forEach(c => { + c.pin = new BN(randomBytes()); + c.seed = claimMethod === "transfer" ? claimInfo.mint.key + : claimMethod === "candy" ? claimInfo.config + : /* === edition */ claimInfo.masterMint.key; + }); + + // temporal auth is the AWS signer by 'default' and a no-op key otherwise + let temporalSigner; + if (commMethod === "Wallets") { + // TODO: this is a bit jank. There should be no form option to set the + // OTP auth if we are using a wallet but there's still a defaulted value + // atm... + // NB: We also need this to not be 'none' since there is a special check + // for claimant_secret==accounts.temporal + temporalSigner = GUMDROP_DISTRIBUTOR_ID; + } else if (otpAuth === "default") { + temporalSigner = GUMDROP_TEMPORAL_SIGNER; + } else if (otpAuth === "none") { + temporalSigner = PublicKey.default; + } else { + throw new Error(`Unknown OTP authorization type ${otpAuth}`); + } + + console.log(`Temporal signer: ${temporalSigner.toBase58()}`); + + const base = Keypair.generate(); + console.log(`Base ${base.publicKey.toBase58()}`); + + const needsPin = commMethod !== "Wallets"; + const instructions = await buildGumdrop( + connection, + wallet.publicKey, + needsPin, + claimMethod, + `${window.location.origin}/gumdrop`, + base.publicKey, + temporalSigner, + claimants, + claimInfo + ); + + const shouldSend = await reactModal( + shouldSendRender(claimants, needsPin, claimMethod, claimInfo, base) + ) as boolean | undefined; + if (shouldSend !== true) { + // dismissed. don't use exceptions for control flow? + throw new Error("Claim distribution preview not approved"); + } + + + setClaimURLs(urlAndHandleFor(claimants)); + + const createResult = await Connection.sendTransactionWithRetry( + connection, + wallet, + instructions, + [base] + ); + + console.log(createResult); + if (typeof createResult === "string") { + throw new Error(createResult); + } else { + notify({ + message: "Gumdrop creation succeeded", + description: ( + + View transaction on explorer + + ), + }); + } + + console.log("Distributing claim URLs"); + await distributeClaims(claimants, dropInfo); + }; + + const handleFiles = (files : FileList | null) => { + if (files === null || files.length !== 1) { + notify({ + message: "File upload failed", + description: `Received ${files?.length} files`, + }); + return; + } + + const file = files[0]; + const reader = new FileReader(); + reader.onload = (e) => { + if (e !== null && e.target !== null) { + if (typeof e.target.result === "string") { + try { + parseClaimants(e.target.result, file.name, commMethod); + } catch { + notify({ + message: `File upload failed for: ${file.name}`, + description: ( + + Could not parse uploaded file.{WHITESPACE} + + Does it follow the JSON scheme? + + + ), + }); + setFilename(""); + setText(""); + return; + } + setFilename(file.name); + setText(e.target.result); + } else { + notify({ + message: `File upload failed for: ${file.name}`, + description: "Could not read uploaded file", + }); + } + } + }; + reader.readAsText(file); + }; + + const claimData = (claimMethod) => { + if (claimMethod === "candy") { + return ( + + { + setCandyConfig(e.target.value); + localStorage.setItem("candyConfig", e.target.value); + }} + /> + { + setCandyUUID(e.target.value); + localStorage.setItem("candyUUID", e.target.value); + }} + /> + + ); + } else if (claimMethod === "transfer") { + return ( + { + localStorage.setItem("mint", e.target.value); + setMint(e.target.value); + }} + /> + ); + } else if (claimMethod === "edition") { + // transfers master mint token from this account to the distributor + // wallet ATA + return ( + { + localStorage.setItem("masterMint", e.target.value); + setMasterMint(e.target.value); + }} + /> + ); + } + }; + + const commAuthorization = (commMethod) => { + if (commMethod === "AWS SES") { + return ( + + { + setCommAuth(prev => ({...prev, accessKeyId: e.target.value})); + setAwsAccessKeyId(e.target.value) + }} + /> + { + setCommAuth(prev => ({...prev, secretAccessKey: e.target.value})); + setAwsSecretKey(e.target.value) + }} + /> + { + localStorage.setItem("commSource", e.target.value); + setCommSource(e.target.value) + }} + /> + + ); + } + + // commMethod === "Manual" || commMethod === "Wallets" + return null; + }; + + const fileUpload = ( + + + + + {WHITESPACE} + {/*For display alignment...*/} + + + + {filename !== "" + ? ( + ) + : ()} + + ); + + const [loading, setLoading] = React.useState(false); + const loadingProgress = () => ( + + ); + const createAirdrop = ( + + + {loading && loadingProgress()} + + ); + + const otpAuthC = ( + + + OTP Authorization + + + + ); + + return ( + + + Claim Method + + + {claimMethod !== "" && claimData(claimMethod)} + + Distribution Method + + + {commMethod !== "" && commAuthorization(commMethod)} + {commMethod !== "" && commMethod !== "Wallets" && otpAuthC} + {commMethod !== "" && fileUpload} + {createAirdrop} + {claimURLs.length > 0 && ( + + + + )} + {responses.length > 0 && ( + + + + )} + + ); +}; diff --git a/js/packages/gumdrop/src/components/DefaultModal/index.css b/js/packages/gumdrop/src/components/DefaultModal/index.css new file mode 100644 index 0000000000..72d16f7ad4 --- /dev/null +++ b/js/packages/gumdrop/src/components/DefaultModal/index.css @@ -0,0 +1,17 @@ +.ant-scrolling-effect #root > .ant-layout { + filter: blur(10px) brightness(0.5); +} +.ant-modal-content { + border-radius: 16px !important; +} +.ant-modal-body { + border-radius: 10px; +} + +.ant-modal-close-x { + color: white; +} + +.ant-btn { + border-radius: 5px !important; +} diff --git a/js/packages/gumdrop/src/components/DefaultModal/index.less b/js/packages/gumdrop/src/components/DefaultModal/index.less new file mode 100644 index 0000000000..13f8a9034b --- /dev/null +++ b/js/packages/gumdrop/src/components/DefaultModal/index.less @@ -0,0 +1,9 @@ +.ant-scrolling-effect { + #root>.ant-layout { + filter: blur(10px) brightness(0.5); + } +} + +.ant-modal-content { + border-radius: 16px; +} diff --git a/js/packages/gumdrop/src/components/DefaultModal/index.tsx b/js/packages/gumdrop/src/components/DefaultModal/index.tsx new file mode 100644 index 0000000000..43ee3ab9d0 --- /dev/null +++ b/js/packages/gumdrop/src/components/DefaultModal/index.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import { Modal } from "antd"; + +import "./index.css"; + +export const DefaultModal = (props: any) => { + const { children, bodyStyle, width, ...rest } = props; + + return ( + + {children} + + ); +}; diff --git a/js/packages/gumdrop/src/components/DragAndDrop.tsx b/js/packages/gumdrop/src/components/DragAndDrop.tsx new file mode 100644 index 0000000000..4d16b4557e --- /dev/null +++ b/js/packages/gumdrop/src/components/DragAndDrop.tsx @@ -0,0 +1,84 @@ +import React from "react" +import { + useColorMode, +} from "../contexts/ColorModeContext"; + +export const DragAndDrop = ( + props : { + handleDrop : (files : FileList) => void, + children : React.ReactNode, + }, +) => { + const dropRef = React.useRef(null); + const [dragCounter, setDragCounter] = React.useState(0); + const [dragging, setDragging] = React.useState(false); + + const handleDrag = (e) => { + e.preventDefault() + e.stopPropagation() + }; + + const handleDragIn = (e) => { + e.preventDefault() + e.stopPropagation() + + setDragCounter(dragCounter + 1); + if (e.dataTransfer.items && e.dataTransfer.items.length > 0) { + setDragging(true); + } + }; + + const handleDragOut = (e) => { + e.preventDefault() + e.stopPropagation() + + const remainingDrags = dragCounter - 1; + setDragCounter(remainingDrags); + if (remainingDrags === 0) { + setDragging(false); + } + }; + + const handleDrop = (e) => { + e.preventDefault() + e.stopPropagation() + + setDragging(false); + if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { + props.handleDrop(e.dataTransfer.files); + e.dataTransfer.clearData(); + setDragCounter(0); + } + }; + + React.useEffect(() => { + const node = dropRef.current; + if (node === null) return; + node.addEventListener("dragenter" , handleDragIn); + node.addEventListener("dragleave" , handleDragOut); + node.addEventListener("dragover" , handleDrag); + node.addEventListener("drop" , handleDrop); + + return () => { + node.removeEventListener("dragenter" , handleDragIn); + node.removeEventListener("dragleave" , handleDragOut); + node.removeEventListener("dragover" , handleDrag); + node.removeEventListener("drop" , handleDrop); + }; + }); + + const colorModeCtx = useColorMode(); + const shade = colorModeCtx.mode === 'dark' ? "rgba(255,255,255,.1)" : "rgba(0, 0, 0,.1)"; + + return ( +
+ {props.children} +
+ ); +}; + + +export default DragAndDrop; diff --git a/js/packages/gumdrop/src/components/Header/Header.tsx b/js/packages/gumdrop/src/components/Header/Header.tsx new file mode 100644 index 0000000000..04bc0f00d8 --- /dev/null +++ b/js/packages/gumdrop/src/components/Header/Header.tsx @@ -0,0 +1,130 @@ +import React from "react"; +import { + Link, +} from "react-router-dom"; +import { + Box, + Button, + Divider, + Drawer, + List, + ListItem, + ListItemButton, + ListItemText, + Stack, +} from "@mui/material"; +import HomeIcon from '@mui/icons-material/Home'; +import MenuIcon from '@mui/icons-material/Menu'; + +import { Settings } from "../Settings"; + +export const Header = ({ narrow } : { narrow : boolean }) => { + const navs = [ + { + href: `/gumdrop/`, + innerNarrow: "About", + inner: , + }, + { + href: `/gumdrop/create`, + inner: "Create", + }, + { + href: `/gumdrop/claim`, + inner: "Claim", + }, + { + href: `/gumdrop/close`, + inner: "Close", + }, + ]; + + const [drawerOpen, setDrawerOpen] = React.useState(false); + + const toggleDrawer = (open) => (event) => { + if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) { + return; + } + + setDrawerOpen(open); + }; + + return ( + + {narrow + ? ( + + + + + + + + + + {navs.map((nav, idx) => { + return ( + + + {nav.innerNarrow || nav.inner} + + + ); + })} + + + + + ) + : ( + + {navs.map((nav, idx) => { + return ( + + + + ); + })} + + ) + } + + + + ); +}; diff --git a/js/packages/gumdrop/src/components/Settings/index.tsx b/js/packages/gumdrop/src/components/Settings/index.tsx new file mode 100644 index 0000000000..5be1d144f2 --- /dev/null +++ b/js/packages/gumdrop/src/components/Settings/index.tsx @@ -0,0 +1,250 @@ +import React from "react"; +import { useWallet } from "@solana/wallet-adapter-react"; +import { ENDPOINTS, useColorMode, useConnectionConfig } from "../../contexts"; +import { notify, shortenAddress } from "@oyster/common"; +import { CopyOutlined } from "@ant-design/icons"; +import { ModalEnum, useModal, useWalletModal } from "../../contexts"; +import { + Box, + Button, + Collapse, + Divider, + Drawer, + FormControl, + Link, + List, + ListItem, + ListItemText, + ListItemButton, + MenuItem, + Select, + Stack, +} from "@mui/material"; +import { useTheme } from "@mui/material/styles"; + +import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; +import Brightness4Icon from "@mui/icons-material/Brightness4"; +import Brightness7Icon from "@mui/icons-material/Brightness7"; +import ExpandLess from '@mui/icons-material/ExpandLess'; +import ExpandMore from '@mui/icons-material/ExpandMore'; + +export const Settings = ({ narrow } : { narrow : boolean }) => { + const { disconnect, publicKey } = useWallet(); + const { setEndpoint, env, endpoint } = useConnectionConfig(); + const { setVisible } = useWalletModal(); + const open = React.useCallback(() => setVisible(true), [setVisible]); + const { setModal } = useModal(); + const theme = useTheme(); + const colorModeCtx = useColorMode(); + + const handleConnect = React.useCallback(() => { + setModal(ModalEnum.WALLET); + setVisible(true); + }, [setModal, setVisible]); + + const connectedActions = [ + { + click: async () => { + if (publicKey) { + await navigator.clipboard.writeText(publicKey.toBase58()); + notify({ + message: "Wallet update", + description: "Address copied to clipboard", + }); + } + }, + innerNarrow: () => ( + `Copy Address (${publicKey && shortenAddress(publicKey.toBase58())})` + ), + inner: function ConnectedWalletCopyC() { + return ( + + + {publicKey && shortenAddress(publicKey.toBase58())} + + ); + }, + }, + { + click: open, + inner: () => "Change\u00A0Wallet", + }, + { + click: () => disconnect().catch(), + inner: () => `Disconnect\u00A0(${env})`, + expandedExtra: { // these are interepreted as props. TODO: specific types + color: "error" as any, + variant: "contained" as any, + } + }, + ]; + + const [drawerOpen, setDrawerOpen] = React.useState(false); + const [envCollapseOpen, setEnvCollapseOpen] = React.useState(false); + + const hackySkipSet = "hackySkipSet"; + const toggleDrawer = (open) => (event) => { + if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) { + return; + } + + if (event.target.classList.contains(hackySkipSet)) { + return; + } + + setDrawerOpen(open); + }; + + const drawerC = (inner) => { + return ( + + + + + {inner} + + + + ); + }; + + const themeSwitch = ( + + ); + + if (narrow) { + const listHead = ( + + + + ); + return ( + + {!publicKey && drawerC( + + {listHead} + + setEnvCollapseOpen(!envCollapseOpen)} + className={hackySkipSet} + > + Change Network + {envCollapseOpen ? : } + + + + {ENDPOINTS.map(p => ( + setEndpoint(p.endpoint)} + key={p.name} + sx={{ pl: 4 }} + className={hackySkipSet} + > + {p.name} + + ))} + + + + Connect + + + )} + {publicKey && drawerC( + + {listHead} + + {connectedActions.map((a, idx) => { + return ( + + {(a.innerNarrow && a.innerNarrow()) || a.inner()} + + ); + })} + + )} + {themeSwitch} + + ); + } else { + return ( + + {!publicKey && ( + + + + + + + + + )} + {publicKey && connectedActions.map((a, idx) => { + return ( + + ); + }) + } + {themeSwitch} + + ); + } +}; diff --git a/js/packages/gumdrop/src/components/index.ts b/js/packages/gumdrop/src/components/index.ts new file mode 100644 index 0000000000..ce41610cf5 --- /dev/null +++ b/js/packages/gumdrop/src/components/index.ts @@ -0,0 +1,2 @@ +export { DefaultModal } from './DefaultModal'; +export * from './Settings'; diff --git a/js/packages/gumdrop/src/contexts/AccountContext.tsx b/js/packages/gumdrop/src/contexts/AccountContext.tsx new file mode 100644 index 0000000000..c797e58e42 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/AccountContext.tsx @@ -0,0 +1,665 @@ +import React, { + useCallback, + useContext, + useEffect, + useState, +} from 'react'; +import { useConnection } from './ConnectionContext'; +import { useWallet } from '@solana/wallet-adapter-react'; +import { AccountInfo, Connection, PublicKey } from '@solana/web3.js'; +import { AccountLayout, MintInfo, MintLayout, u64 } from '@solana/spl-token'; +import { EventEmitter, programIds, chunks, StringPublicKey, WRAPPED_SOL_MINT } from '@oyster/common'; + +import { TokenAccount } from '../models'; + +const AccountsContext = React.createContext(null); + +const pendingCalls = new Map>(); +const genericCache = new Map(); +const pendingMintCalls = new Map>(); +const mintCache = new Map(); + +export interface ParsedAccountBase { + pubkey: StringPublicKey; + account: AccountInfo; + info: any; // TODO: change to unknown +} + +export type AccountParser = ( + pubkey: StringPublicKey, + data: AccountInfo, +) => ParsedAccountBase | undefined; + +export interface ParsedAccount extends ParsedAccountBase { + info: T; +} + +const getMintInfo = async (connection: Connection, pubKey: PublicKey) => { + const info = await connection.getAccountInfo(pubKey); + if (info === null) { + throw new Error('Failed to find mint account'); + } + + const data = Buffer.from(info.data); + + return deserializeMint(data); +}; + +export const MintParser = (pubKey: string, info: AccountInfo) => { + const buffer = Buffer.from(info.data); + + const data = deserializeMint(buffer); + + const details = { + pubkey: pubKey, + account: { + ...info, + }, + info: data, + } as ParsedAccountBase; + + return details; +}; + +export const TokenAccountParser = ( + pubKey: string, + info: AccountInfo, +) => { + // Sometimes a wrapped sol account gets closed, goes to 0 length, + // triggers an update over wss which triggers this guy to get called + // since your UI already logged that pubkey as a token account. Check for length. + if (info.data.length > 0) { + const buffer = Buffer.from(info.data); + const data = deserializeAccount(buffer); + + const details = { + pubkey: pubKey, + account: { + ...info, + }, + info: data, + } as TokenAccount; + + return details; + } +}; + +export const GenericAccountParser = ( + pubKey: string, + info: AccountInfo, +) => { + const buffer = Buffer.from(info.data); + + const details = { + pubkey: pubKey, + account: { + ...info, + }, + info: buffer, + } as ParsedAccountBase; + + return details; +}; + +export const keyToAccountParser = new Map(); + +export const cache = { + emitter: new EventEmitter(), + query: async ( + connection: Connection, + pubKey: string | PublicKey, + parser?: AccountParser, + ) => { + let id: PublicKey; + if (typeof pubKey === 'string') { + id = new PublicKey(pubKey); + } else { + id = pubKey; + } + + const address = id.toBase58(); + + const account = genericCache.get(address); + if (account) { + return account; + } + + let query = pendingCalls.get(address); + if (query) { + return query; + } + + // TODO: refactor to use multiple accounts query with flush like behavior + query = connection.getAccountInfo(id).then(data => { + if (!data) { + throw new Error('Account not found'); + } + + return cache.add(id, data, parser); + }) as Promise; + pendingCalls.set(address, query as any); + + return query; + }, + add: ( + id: PublicKey | string, + obj: AccountInfo, + parser?: AccountParser, + isActive?: boolean | undefined | ((parsed: any) => boolean), + ) => { + const address = typeof id === 'string' ? id : id?.toBase58(); + const deserialize = parser ? parser : keyToAccountParser.get(address); + if (!deserialize) { + throw new Error( + 'Deserializer needs to be registered or passed as a parameter', + ); + } + + cache.registerParser(id, deserialize); + pendingCalls.delete(address); + const account = deserialize(address, obj); + if (!account) { + return; + } + + if (isActive === undefined) isActive = true; + else if (isActive instanceof Function) isActive = isActive(account); + + const isNew = !genericCache.has(address); + + genericCache.set(address, account); + cache.emitter.raiseCacheUpdated(address, isNew, deserialize, isActive); + return account; + }, + get: (pubKey: string | PublicKey) => { + let key: string; + if (typeof pubKey !== 'string') { + key = pubKey.toBase58(); + } else { + key = pubKey; + } + + return genericCache.get(key); + }, + delete: (pubKey: string | PublicKey) => { + let key: string; + if (typeof pubKey !== 'string') { + key = pubKey.toBase58(); + } else { + key = pubKey; + } + + if (genericCache.get(key)) { + genericCache.delete(key); + cache.emitter.raiseCacheDeleted(key); + return true; + } + return false; + }, + + byParser: (parser: AccountParser) => { + const result: string[] = []; + for (const id of keyToAccountParser.keys()) { + if (keyToAccountParser.get(id) === parser) { + result.push(id); + } + } + + return result; + }, + registerParser: (pubkey: PublicKey | string, parser: AccountParser) => { + if (pubkey) { + const address = typeof pubkey === 'string' ? pubkey : pubkey?.toBase58(); + keyToAccountParser.set(address, parser); + } + + return pubkey; + }, + queryMint: async (connection: Connection, pubKey: string | PublicKey) => { + let id: PublicKey; + if (typeof pubKey === 'string') { + id = new PublicKey(pubKey); + } else { + id = pubKey; + } + + const address = id.toBase58(); + const mint = mintCache.get(address); + if (mint) { + return mint; + } + + let query = pendingMintCalls.get(address); + if (query) { + return query; + } + + query = getMintInfo(connection, id).then(data => { + pendingMintCalls.delete(address); + + mintCache.set(address, data); + return data; + }) as Promise; + pendingMintCalls.set(address, query as any); + + return query; + }, + getMint: (pubKey: string | PublicKey) => { + let key: string; + if (typeof pubKey !== 'string') { + key = pubKey.toBase58(); + } else { + key = pubKey; + } + + return mintCache.get(key); + }, + addMint: (pubKey: PublicKey, obj: AccountInfo) => { + const mint = deserializeMint(obj.data); + const id = pubKey.toBase58(); + mintCache.set(id, mint); + return mint; + }, +}; + +export const useAccountsContext = () => { + const context = useContext(AccountsContext); + + return context; +}; + +function wrapNativeAccount( + pubkey: string, + account?: AccountInfo, +): TokenAccount | undefined { + if (!account) { + return undefined; + } + + const key = new PublicKey(pubkey); + + return { + pubkey: pubkey, + account, + info: { + address: key, + mint: WRAPPED_SOL_MINT, + owner: key, + amount: new u64(account.lamports), + delegate: null, + delegatedAmount: new u64(0), + isInitialized: true, + isFrozen: false, + isNative: true, + rentExemptReserve: null, + closeAuthority: null, + }, + }; +} + +export const getCachedAccount = ( + predicate: (account: TokenAccount) => boolean, +) => { + for (const account of genericCache.values()) { + if (predicate(account)) { + return account as TokenAccount; + } + } +}; + +const UseNativeAccount = () => { + const connection = useConnection(); + const { publicKey } = useWallet(); + + const [nativeAccount, setNativeAccount] = useState>(); + + const updateCache = useCallback( + account => { + if (publicKey) { + const wrapped = wrapNativeAccount(publicKey.toBase58(), account); + if (wrapped !== undefined) { + const id = publicKey.toBase58(); + cache.registerParser(id, TokenAccountParser); + genericCache.set(id, wrapped as TokenAccount); + cache.emitter.raiseCacheUpdated(id, false, TokenAccountParser, true); + } + } + }, + [publicKey], + ); + + useEffect(() => { + let subId = 0; + const updateAccount = (account: AccountInfo | null) => { + if (account) { + updateCache(account); + setNativeAccount(account); + } + }; + + (async () => { + if (!connection || !publicKey) { + return; + } + + try { + const account = await connection.getAccountInfo(publicKey); + updateAccount(account); + } catch { + return; + } + + subId = connection.onAccountChange(publicKey, updateAccount); + })(); + + return () => { + if (subId) { + connection.removeAccountChangeListener(subId); + } + }; + }, [setNativeAccount, publicKey, connection, updateCache]); + + return { nativeAccount }; +}; + +const PRECACHED_OWNERS = new Set(); +const precacheUserTokenAccounts = async ( + connection: Connection, + owner?: PublicKey, +) => { + if (!owner) { + return; + } + + // used for filtering account updates over websocket + PRECACHED_OWNERS.add(owner.toBase58()); + + // user accounts are updated via ws subscription + const accounts = await connection.getTokenAccountsByOwner(owner, { + programId: programIds().token, + }); + + accounts.value.forEach(info => { + cache.add(info.pubkey.toBase58(), info.account, TokenAccountParser); + }); +}; + +export function AccountsProvider({ children = undefined } : { children : React.ReactNode }) { + const connection = useConnection(); + const { publicKey } = useWallet(); + const [tokenAccounts, setTokenAccounts] = useState([]); + const [userAccounts, setUserAccounts] = useState([]); + const { nativeAccount } = UseNativeAccount(); + const walletKey = publicKey?.toBase58(); + + const selectUserAccounts = useCallback(() => { + return cache + .byParser(TokenAccountParser) + .map(id => cache.get(id)) + .filter(a => a && a.info.owner.toBase58() === walletKey) + .map(a => a as TokenAccount); + }, [walletKey]); + + useEffect(() => { + const accounts = selectUserAccounts().filter( + a => a !== undefined, + ) as TokenAccount[]; + setUserAccounts(accounts); + }, [nativeAccount, tokenAccounts, selectUserAccounts]); + + useEffect(() => { + const subs: number[] = []; + cache.emitter.onCache(args => { + if (args.isNew && args.isActive) { + const id = args.id; + const deserialize = args.parser; + connection.onAccountChange(new PublicKey(id), info => { + cache.add(id, info, deserialize); + }); + } + }); + + return () => { + subs.forEach(id => connection.removeAccountChangeListener(id)); + }; + }, [connection]); + + useEffect(() => { + if (!connection || !publicKey) { + setTokenAccounts([]); + } else { + precacheUserTokenAccounts(connection, publicKey).then(() => { + setTokenAccounts(selectUserAccounts()); + }); + + // This can return different types of accounts: token-account, mint, multisig + // TODO: web3.js expose ability to filter. + // this should use only filter syntax to only get accounts that are owned by user + const tokenSubID = connection.onProgramAccountChange( + programIds().token, + info => { + // TODO: fix type in web3.js + const id = info.accountId as unknown as string; + // TODO: do we need a better way to identify layout (maybe a enum identifing type?) + if (info.accountInfo.data.length === AccountLayout.span) { + const data = deserializeAccount(info.accountInfo.data); + + if (PRECACHED_OWNERS.has(data.owner.toBase58())) { + cache.add(id, info.accountInfo, TokenAccountParser); + setTokenAccounts(selectUserAccounts()); + } + } + }, + 'singleGossip', + ); + + return () => { + connection.removeProgramAccountChangeListener(tokenSubID); + }; + } + }, [connection, publicKey, selectUserAccounts]); + + return ( + + {children} + + ); +} + +export function useNativeAccount() { + const context = useContext(AccountsContext); + return { + account: context.nativeAccount as AccountInfo, + }; +} + +export const getMultipleAccounts = async ( + connection: any, + keys: string[], + commitment: string, +) => { + const result = await Promise.all( + chunks(keys, 99).map(chunk => + getMultipleAccountsCore(connection, chunk, commitment), + ), + ); + + const array = result + .map( + a => + a.array.map(acc => { + if (!acc) { + return undefined; + } + + const { data, ...rest } = acc; + const obj = { + ...rest, + data: Buffer.from(data[0], 'base64'), + } as AccountInfo; + return obj; + }) as AccountInfo[], + ) + .flat(); + return { keys, array }; +}; + +const getMultipleAccountsCore = async ( + connection: any, + keys: string[], + commitment: string, +) => { + const args = connection._buildArgs([keys], commitment, 'base64'); + + const unsafeRes = await connection._rpcRequest('getMultipleAccounts', args); + if (unsafeRes.error) { + throw new Error( + 'failed to get info about account ' + unsafeRes.error.message, + ); + } + + if (unsafeRes.result.value) { + const array = unsafeRes.result.value as AccountInfo[]; + return { keys, array }; + } + + // TODO: fix + throw new Error(); +}; + +export function useMint(key?: string | PublicKey) { + const connection = useConnection(); + const [mint, setMint] = useState(); + + const id = typeof key === 'string' ? key : key?.toBase58(); + + useEffect(() => { + if (!id) { + return; + } + + cache + .query(connection, id, MintParser) + .then(acc => setMint(acc.info as any)) + .catch(err => console.log(err)); + + const dispose = cache.emitter.onCache(e => { + const event = e; + if (event.id === id) { + cache + .query(connection, id, MintParser) + .then(mint => setMint(mint.info as any)); + } + }); + return () => { + dispose(); + }; + }, [connection, id]); + + return mint; +} + +export function useAccount(pubKey?: PublicKey) { + const connection = useConnection(); + const [account, setAccount] = useState(); + + const key = pubKey?.toBase58(); + useEffect(() => { + const query = async () => { + try { + if (!key) { + return; + } + + const acc = await cache + .query(connection, key, TokenAccountParser) + .catch(err => console.log(err)); + if (acc) { + setAccount(acc); + } + } catch (err) { + console.error(err); + } + }; + + query(); + + const dispose = cache.emitter.onCache(e => { + const event = e; + if (event.id === key) { + query(); + } + }); + return () => { + dispose(); + }; + }, [connection, key]); + + return account; +} + +// TODO: expose in spl package +export const deserializeAccount = (data: Buffer) => { + const accountInfo = AccountLayout.decode(data); + accountInfo.mint = new PublicKey(accountInfo.mint); + accountInfo.owner = new PublicKey(accountInfo.owner); + accountInfo.amount = u64.fromBuffer(accountInfo.amount); + + if (accountInfo.delegateOption === 0) { + accountInfo.delegate = null; + accountInfo.delegatedAmount = new u64(0); + } else { + accountInfo.delegate = new PublicKey(accountInfo.delegate); + accountInfo.delegatedAmount = u64.fromBuffer(accountInfo.delegatedAmount); + } + + accountInfo.isInitialized = accountInfo.state !== 0; + accountInfo.isFrozen = accountInfo.state === 2; + + if (accountInfo.isNativeOption === 1) { + accountInfo.rentExemptReserve = u64.fromBuffer(accountInfo.isNative); + accountInfo.isNative = true; + } else { + accountInfo.rentExemptReserve = null; + accountInfo.isNative = false; + } + + if (accountInfo.closeAuthorityOption === 0) { + accountInfo.closeAuthority = null; + } else { + accountInfo.closeAuthority = new PublicKey(accountInfo.closeAuthority); + } + + return accountInfo; +}; + +// TODO: expose in spl package +export const deserializeMint = (data: Buffer) => { + if (data.length !== MintLayout.span) { + throw new Error('Not a valid Mint'); + } + + const mintInfo = MintLayout.decode(data); + + if (mintInfo.mintAuthorityOption === 0) { + mintInfo.mintAuthority = null; + } else { + mintInfo.mintAuthority = new PublicKey(mintInfo.mintAuthority); + } + + mintInfo.supply = u64.fromBuffer(mintInfo.supply); + mintInfo.isInitialized = mintInfo.isInitialized !== 0; + + if (mintInfo.freezeAuthorityOption === 0) { + mintInfo.freezeAuthority = null; + } else { + mintInfo.freezeAuthority = new PublicKey(mintInfo.freezeAuthority); + } + + return mintInfo as MintInfo; +}; diff --git a/js/packages/gumdrop/src/contexts/ColorModeContext.tsx b/js/packages/gumdrop/src/contexts/ColorModeContext.tsx new file mode 100644 index 0000000000..3ffc9ca332 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/ColorModeContext.tsx @@ -0,0 +1,28 @@ +import { useTheme } from "@mui/material"; +import React, { useContext } from "react"; + +export const ColorModeContext = React.createContext({}); + +export const ColorModeContextProvider = ({ children = undefined } : { children : React.ReactNode }) => { + const [mode, setMode] = React.useState<'light' | 'dark'>('dark'); + const theme = useTheme(); + const toggleColorMode = () => { + setMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light')); + } + return ( + + {children} + + ); +}; + +export const useColorMode = (): any => { + const context = useContext(ColorModeContext); + return context; +}; diff --git a/js/packages/gumdrop/src/contexts/ConnectionContext.tsx b/js/packages/gumdrop/src/contexts/ConnectionContext.tsx new file mode 100644 index 0000000000..216d2e7196 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/ConnectionContext.tsx @@ -0,0 +1,243 @@ +import { useLocalStorageState } from "@oyster/common"; +import { + Keypair, + Commitment, + Connection, + Transaction, + TransactionInstruction, + Blockhash, + FeeCalculator, +} from "@solana/web3.js"; +import React, { useContext, useEffect, useMemo, useState } from "react"; +import { + sendSignedTransaction, +} from "../utils/transactions"; +import { + TokenInfo, + TokenListProvider, + ENV as ChainId, +} from "@solana/spl-token-registry"; +import { WalletSigner } from "./WalletContext/WalletContext"; +import { WalletNotConnectedError } from "@solana/wallet-adapter-base"; + +interface BlockhashAndFeeCalculator { + blockhash: Blockhash; + feeCalculator: FeeCalculator; +} + +export type ENV = "mainnet-beta" | "testnet" | "devnet" | "localnet"; + +export const ENDPOINTS = [ + { + name: "mainnet-beta" as ENV, + endpoint: "https://api.mainnet-beta.solana.com", + ChainId: ChainId.MainnetBeta, + }, + { + name: "devnet" as ENV, + endpoint: "https://api.devnet.solana.com", + ChainId: ChainId.Devnet, + }, +]; + +const DEFAULT = ENDPOINTS[0].endpoint; + +interface ConnectionConfig { + connection: Connection; + endpoint: string; + env: ENV; + setEndpoint: (val: string) => void; + tokens: TokenInfo[]; + tokenMap: Map; +} + +const ConnectionContext = React.createContext({ + endpoint: DEFAULT, + setEndpoint: () => {}, + connection: new Connection(DEFAULT, "recent"), + env: ENDPOINTS[0].name, + tokens: [], + tokenMap: new Map(), +}); + +export function ConnectionProvider({ children = undefined } : { children : React.ReactNode }) { + const [endpoint, setEndpoint] = useLocalStorageState( + "connectionEndpoint", + ENDPOINTS[0].endpoint + ); + + const connection = useMemo( + () => new Connection(endpoint, "recent"), + [endpoint] + ); + + const env = + ENDPOINTS.find((end) => end.endpoint === endpoint)?.name || + ENDPOINTS[0].name; + + const [tokens, setTokens] = useState([]); + const [tokenMap, setTokenMap] = useState>(new Map()); + useEffect(() => { + // fetch token files + new TokenListProvider().resolve().then((container) => { + const list = container + .excludeByTag("nft") + .filterByChainId( + ENDPOINTS.find((end) => end.endpoint === endpoint)?.ChainId || + ChainId.MainnetBeta + ) + .getList(); + + const knownMints = [...list].reduce((map, item) => { + map.set(item.address, item); + return map; + }, new Map()); + + setTokenMap(knownMints); + setTokens(list); + }); + }, [env, endpoint]); + + // The websocket library solana/web3.js uses closes its websocket connection when the subscription list + // is empty after opening its first time, preventing subsequent subscriptions from receiving responses. + // This is a hack to prevent the list from every getting empty + useEffect(() => { + const id = connection.onAccountChange( + Keypair.generate().publicKey, + () => {} + ); + return () => { + connection.removeAccountChangeListener(id); + }; + }, [connection]); + + useEffect(() => { + const id = connection.onSlotChange(() => null); + return () => { + connection.removeSlotChangeListener(id); + }; + }, [connection]); + + return ( + + {children} + + ); +} + +export function useConnection() { + return useContext(ConnectionContext).connection as Connection; +} + +export function useConnectionConfig() { + const context = useContext(ConnectionContext); + return { + endpoint: context.endpoint, + setEndpoint: context.setEndpoint, + env: context.env, + tokens: context.tokens, + tokenMap: context.tokenMap, + }; +} + +export const getErrorForTransaction = async ( + connection: Connection, + txid: string +) => { + // wait for all confirmation before geting transaction + await connection.confirmTransaction(txid, "max"); + + const tx = await connection.getParsedConfirmedTransaction(txid); + + const errors: string[] = []; + if (tx?.meta && tx.meta.logMessages) { + tx.meta.logMessages.forEach((log) => { + const regex = /Error: (.*)/gm; + let m; + while ((m = regex.exec(log)) !== null) { + // This is necessary to avoid infinite loops with zero-width matches + if (m.index === regex.lastIndex) { + regex.lastIndex++; + } + + if (m.length > 1) { + errors.push(m[1]); + } + } + }); + } + + return errors; +}; + +export enum SequenceType { + Sequential, + Parallel, + StopOnFailure, +} + +export const sendTransactionWithRetry = async ( + connection: Connection, + wallet: WalletSigner, + instructions: TransactionInstruction[], + signers: Keypair[], + commitment: Commitment = "singleGossip", + includesFeePayer: boolean = false, + block?: BlockhashAndFeeCalculator, + beforeSend?: () => void +) : Promise => { + if (!wallet.publicKey) throw new WalletNotConnectedError(); + + 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); + } + if (!includesFeePayer) { + try { + transaction = await wallet.signTransaction(transaction); + } catch { + return "Failed to sign transaction"; + } + } + + if (beforeSend) { + beforeSend(); + } + console.log("About to send"); + try { + const { txid, slot } = await sendSignedTransaction({ + connection, + signedTransaction: transaction, + }); + + return { txid, slot }; + } catch (error) { + console.error(error); + return "See console logs"; + } +}; + diff --git a/js/packages/gumdrop/src/contexts/ModalContext.tsx b/js/packages/gumdrop/src/contexts/ModalContext.tsx new file mode 100644 index 0000000000..dd789042b9 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/ModalContext.tsx @@ -0,0 +1,45 @@ +import React, { useState, useContext, useCallback } from 'react'; + +import { WalletModal } from './WalletContext/WalletContext'; + +export enum ModalEnum { + WALLET = 'wallet', +} + +type ModalContextProps = { + setModal: (modal: ModalEnum | undefined) => void; + removeModal: () => void; +}; + +export const ModalContext = React.createContext({ + setModal: () => null, + removeModal: () => null, +}); + +export const ModalProvider: React.FC = ({ children }) => { + const [modal, setModal] = useState(undefined); + + const removeModal = useCallback(() => { + setModal(undefined); + }, [setModal]); + + return ( + + {children} + {modal === ModalEnum.WALLET && } + + ); +}; + +export const useModal = (): ModalContextProps => { + const context = useContext(ModalContext); + if (context === undefined) { + throw new Error('useModal must be used within a ModalProvider'); + } + return context; +}; diff --git a/js/packages/gumdrop/src/contexts/WalletContext/WalletContext.tsx b/js/packages/gumdrop/src/contexts/WalletContext/WalletContext.tsx new file mode 100644 index 0000000000..892668dff0 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/WalletContext/WalletContext.tsx @@ -0,0 +1,207 @@ +import { WalletAdapter, WalletError } from "@solana/wallet-adapter-base"; +import { + useWallet, + WalletProvider as BaseWalletProvider, +} from "@solana/wallet-adapter-react"; +import { + getLedgerWallet, + getMathWallet, + getPhantomWallet, + getSolflareWallet, + getSolletWallet, + getSolongWallet, + getTorusWallet, +} from "@solana/wallet-adapter-wallets"; +import { Button } from "antd"; +import React, { + createContext, + FC, + ReactNode, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from "react"; +import { notify } from "@oyster/common"; +import { DefaultModal } from "../../components"; + +import "./wallet.less"; + +export interface WalletModalContextState { + visible: boolean; + setVisible: (open: boolean) => void; +} + +export const WalletModalContext = createContext( + {} as WalletModalContextState +); + +export function useWalletModal(): WalletModalContextState { + return useContext(WalletModalContext); +} + +export const WalletModal: FC = () => { + const { wallets, wallet: selected, select } = useWallet(); + const { visible, setVisible } = useWalletModal(); + const [ , setShowWallets] = useState(false); + const close = useCallback(() => { + setVisible(false); + setShowWallets(false); + }, [setVisible, setShowWallets]); + + return ( + +
+

+ {selected ? "Change provider" : ""} +

+

+ {selected + ? "Choose from the following options:" + : "Please sign into your wallet"} +

+ +
+ {wallets.map((wallet) => { + return ( + + ); + })} +
+ ); +}; + +export const WalletModalProvider: FC<{ children: ReactNode }> = ({ + children, +}) => { + const { publicKey } = useWallet(); + const [connected, setConnected] = useState(!!publicKey); + const [visible, setVisible] = useState(false); + + useEffect(() => { + if (publicKey) { + const base58 = publicKey.toBase58(); + const keyToDisplay = + base58.length > 20 + ? `${base58.substring(0, 7)}.....${base58.substring( + base58.length - 7, + base58.length + )}` + : base58; + + notify({ + message: "Wallet update", + description: "Connected to wallet " + keyToDisplay, + }); + } + }, [publicKey]); + + useEffect(() => { + if (!publicKey && connected) { + notify({ + message: "Wallet update", + description: "Disconnected from wallet", + }); + } + setConnected(!!publicKey); + }, [publicKey, connected, setConnected]); + + return ( + + {children} + + + ); +}; + +export const WalletProvider: FC<{ children: ReactNode }> = ({ children }) => { + const wallets = useMemo( + () => [ + getPhantomWallet(), + getSolflareWallet(), + getTorusWallet({ + options: { + clientId: + "BEB_D44HovHuXH0Ace97QVqSu1ahCKndjpGhzhVcMy_9XmDTbHyqTbzQTufcyaN0kFwtlVbfPzJwpJXg94gWJqE", + uxMode: "redirect", + }, + }), + getLedgerWallet(), + getSolongWallet(), + getMathWallet(), + getSolletWallet(), + ], + [] + ); + + const onError = useCallback((error: WalletError) => { + console.error(error); + notify({ + message: "Wallet error", + description: error.message, + }); + }, []); + + return ( + + {children} + + ); +}; + +export type WalletSigner = Pick< + WalletAdapter, + "publicKey" | "signTransaction" | "signAllTransactions" +>; diff --git a/js/packages/gumdrop/src/contexts/WalletContext/wallet.less b/js/packages/gumdrop/src/contexts/WalletContext/wallet.less new file mode 100644 index 0000000000..cd085414d2 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/WalletContext/wallet.less @@ -0,0 +1,6 @@ +p { + color: #6d6d6d; + font-family: Inter, sans-serif; + font-style: normal; + font-size: 0.9rem; +} diff --git a/js/packages/gumdrop/src/contexts/index.tsx b/js/packages/gumdrop/src/contexts/index.tsx new file mode 100644 index 0000000000..6cb4fe05e5 --- /dev/null +++ b/js/packages/gumdrop/src/contexts/index.tsx @@ -0,0 +1,7 @@ +export * from './AccountContext'; +export * as Connection from './ConnectionContext'; +export * from './ConnectionContext'; +export * as Wallet from './WalletContext/WalletContext'; +export * from './WalletContext/WalletContext'; +export * from './ModalContext'; +export * from './ColorModeContext'; diff --git a/js/packages/gumdrop/src/example.json b/js/packages/gumdrop/src/example.json new file mode 100644 index 0000000000..4de2734879 --- /dev/null +++ b/js/packages/gumdrop/src/example.json @@ -0,0 +1,12 @@ +[ + { + "handle": "alice@solana.com", + "mint": "58iV1fAXFvXoPk28xpB2ihedEnM9HSRkiPHXXm1r4V8z", + "amount": 1500000000 + }, + { + "handle": "bob@solana.com", + "mint": "58iV1fAXFvXoPk28xpB2ihedEnM9HSRkiPHXXm1r4V8z", + "amount": 1500000000 + } +] diff --git a/js/packages/gumdrop/src/index.css b/js/packages/gumdrop/src/index.css new file mode 100644 index 0000000000..ec2585e8c0 --- /dev/null +++ b/js/packages/gumdrop/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/js/packages/gumdrop/src/index.tsx b/js/packages/gumdrop/src/index.tsx new file mode 100644 index 0000000000..31aad67eaf --- /dev/null +++ b/js/packages/gumdrop/src/index.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import ReactDOM from "react-dom"; + +import { + AccountsProvider, + WalletProvider, + ConnectionProvider, + ColorModeContextProvider, +} from "./contexts"; + +import "antd/dist/antd.css"; +import "@fontsource/open-sans"; +import "@fontsource/roboto"; +import "@fontsource/sora"; + +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; + +import "./index.css"; + +ReactDOM.render( + + + + + + + + + + + , + document.getElementById("root") +); + +reportWebVitals(); diff --git a/js/packages/gumdrop/src/models/account.ts b/js/packages/gumdrop/src/models/account.ts new file mode 100644 index 0000000000..4959541756 --- /dev/null +++ b/js/packages/gumdrop/src/models/account.ts @@ -0,0 +1,87 @@ +import { + AccountInfo, + Keypair, + PublicKey, + TransactionInstruction, +} from '@solana/web3.js'; + +import { + AccountInfo as TokenAccountInfo, + Token, + TOKEN_PROGRAM_ID, +} from '@solana/spl-token'; +const BufferLayout = require('buffer-layout'); + +export interface TokenAccount { + pubkey: string; + account: AccountInfo; + info: TokenAccountInfo; +} + +export interface ParsedDataAccount { + amount: number; + rawAmount: string; + parsedAssetAddress: string; + parsedAccount: any; + assetDecimals: number; + assetIcon: any; + name: string; + symbol: string; + sourceAddress: string; + targetAddress: string; +} + +export const ParsedDataLayout = BufferLayout.struct([ + BufferLayout.blob(32, 'amount'), + BufferLayout.u8('toChain'), + BufferLayout.blob(32, 'sourceAddress'), + BufferLayout.blob(32, 'targetAddress'), + BufferLayout.blob(32, 'assetAddress'), + BufferLayout.u8('assetChain'), + BufferLayout.u8('assetDecimals'), + BufferLayout.seq(BufferLayout.u8(), 1), // 4 byte alignment because a u32 is following + BufferLayout.u32('nonce'), + BufferLayout.blob(1001, 'vaa'), + BufferLayout.seq(BufferLayout.u8(), 3), // 4 byte alignment because a u32 is following + BufferLayout.u32('vaaTime'), + BufferLayout.u32('lockupTime'), + BufferLayout.u8('pokeCounter'), + BufferLayout.blob(32, 'signatureAccount'), + BufferLayout.u8('initialized'), +]); + +export function approve( + instructions: TransactionInstruction[], + cleanupInstructions: TransactionInstruction[], + account: PublicKey, + owner: PublicKey, + amount: number, + autoRevoke = true, + + // if delegate is not passed ephemeral transfer authority is used + delegate?: PublicKey, + existingTransferAuthority?: Keypair, +): Keypair { + const tokenProgram = TOKEN_PROGRAM_ID; + + const transferAuthority = existingTransferAuthority || Keypair.generate(); + + instructions.push( + Token.createApproveInstruction( + tokenProgram, + account, + delegate ?? transferAuthority.publicKey, + owner, + [], + amount, + ), + ); + + if (autoRevoke) { + cleanupInstructions.push( + Token.createRevokeInstruction(tokenProgram, account, owner, []), + ); + } + + return transferAuthority; +} diff --git a/js/packages/gumdrop/src/models/index.ts b/js/packages/gumdrop/src/models/index.ts new file mode 100644 index 0000000000..362a768e53 --- /dev/null +++ b/js/packages/gumdrop/src/models/index.ts @@ -0,0 +1 @@ +export * from './account'; diff --git a/js/packages/gumdrop/src/reportWebVitals.ts b/js/packages/gumdrop/src/reportWebVitals.ts new file mode 100644 index 0000000000..49a2a16e0f --- /dev/null +++ b/js/packages/gumdrop/src/reportWebVitals.ts @@ -0,0 +1,15 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/js/packages/gumdrop/src/setupTests.ts b/js/packages/gumdrop/src/setupTests.ts new file mode 100644 index 0000000000..8f2609b7b3 --- /dev/null +++ b/js/packages/gumdrop/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/js/packages/gumdrop/src/utils/accounts.ts b/js/packages/gumdrop/src/utils/accounts.ts new file mode 100644 index 0000000000..dee0b03291 --- /dev/null +++ b/js/packages/gumdrop/src/utils/accounts.ts @@ -0,0 +1,179 @@ +import * as anchor from '@project-serum/anchor'; +import { Connection, PublicKey } from '@solana/web3.js'; +import { + AccountLayout, + MintInfo, + MintLayout, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import BN from 'bn.js'; + +import { + CANDY_MACHINE_ID, + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_METADATA_PROGRAM_ID, +} from "./ids"; + +export const getMintInfo = async ( + connection : Connection, + mint : string +) : Promise<{ key: PublicKey, info: MintInfo }> => { + let mintKey : PublicKey; + try { + mintKey = new PublicKey(mint); + } catch (err) { + throw new Error(`Invalid mint key ${err}`); + } + const mintAccount = await connection.getAccountInfo(mintKey); + if (mintAccount === null) { + throw new Error(`Could not fetch mint`); + } + if (!mintAccount.owner.equals(TOKEN_PROGRAM_ID)) { + const mintOwner = mintAccount.owner.toBase58(); + throw new Error(`Invalid mint owner ${mintOwner}`); + } + if (mintAccount.data.length !== MintLayout.span) { + throw new Error(`Invalid mint size ${mintAccount.data.length}`); + } + const mintInfo = MintLayout.decode(Buffer.from(mintAccount.data)); + return { + key: mintKey, + info: mintInfo, + }; +}; + +export const getCreatorTokenAccount = async ( + walletKey : PublicKey, + connection : Connection, + mintKey : PublicKey, + totalClaim : number, +) => { + const [creatorTokenKey, ] = await PublicKey.findProgramAddress( + [ + walletKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + mintKey.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + const creatorTokenAccount = await connection.getAccountInfo(creatorTokenKey); + if (creatorTokenAccount === null) { + throw new Error(`Could not fetch creator token account`); + } + if (creatorTokenAccount.data.length !== AccountLayout.span) { + throw new Error(`Invalid token account size ${creatorTokenAccount.data.length}`); + } + const creatorTokenInfo = AccountLayout.decode(Buffer.from(creatorTokenAccount.data)); + if (new BN(creatorTokenInfo.amount, 8, "le").toNumber() < totalClaim) { + throw new Error(`Creator token account does not have enough tokens`); + } + return creatorTokenKey; +}; + +export const fetchCoder = async ( + address : anchor.Address, + connection : Connection, +) : Promise => { + return new anchor.Coder(await anchor.Program.fetchIdl( + address, { connection: connection } as anchor.Provider)); +} + +export const getCandyConfig = async ( + connection : Connection, + config : string +) : Promise => { + let configKey : PublicKey; + try { + configKey = new PublicKey(config); + } catch (err) { + throw new Error(`Invalid config key ${err}`); + } + const configAccount = await connection.getAccountInfo(configKey); + if (configAccount === null) { + throw new Error(`Could not fetch config`); + } + if (!configAccount.owner.equals(CANDY_MACHINE_ID)) { + throw new Error(`Invalid config owner ${configAccount.owner.toBase58()}`); + } + return configKey; +}; + +export const getCandyMachineAddress = async ( + config: PublicKey, + uuid: string, +) => { + return await PublicKey.findProgramAddress( + [Buffer.from("candy_machine"), config.toBuffer(), Buffer.from(uuid)], + CANDY_MACHINE_ID, + ); +}; + +export const getCandyMachine = async ( + connection : Connection, + candyMachineKey : PublicKey, +) => { + const candyMachineCoder = await fetchCoder(CANDY_MACHINE_ID, connection); + if (candyMachineCoder === null) { + throw new Error(`Could not fetch candy machine IDL`); + } + const candyMachineAccount = await connection.getAccountInfo(candyMachineKey); + if (candyMachineAccount === null) { + throw new Error(`Could not fetch candy machine`); + } + return candyMachineCoder.accounts.decode( + "CandyMachine", candyMachineAccount.data); +} + +export const getMetadata = async ( + mint: PublicKey, +): Promise => { + return ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + ], + TOKEN_METADATA_PROGRAM_ID, + ) + )[0]; +}; + +export const getEdition = async ( + mint: PublicKey, +): Promise => { + return ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + Buffer.from('edition'), + ], + TOKEN_METADATA_PROGRAM_ID, + ) + )[0]; +}; + +export const getEditionMarkerPda = async ( + mint: PublicKey, + edition: BN, +) : Promise => { + // editions are divided into pages of 31-bytes (248-bits) for more efficient + // packing to check if an edition is occupied. The offset is determined from + // the edition passed in through data + const editionPageNumber = edition.div(new BN(248)).toNumber(); + + return ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + Buffer.from('edition'), + Buffer.from(String(editionPageNumber)), + ], + TOKEN_METADATA_PROGRAM_ID, + ) + )[0]; +} diff --git a/js/packages/gumdrop/src/utils/claimant.ts b/js/packages/gumdrop/src/utils/claimant.ts new file mode 100644 index 0000000000..bafbb1d602 --- /dev/null +++ b/js/packages/gumdrop/src/utils/claimant.ts @@ -0,0 +1,653 @@ +import { + AccountMeta, + Connection as RPCConnection, + Keypair, + PublicKey, + SystemProgram, + TransactionInstruction, +} from "@solana/web3.js"; +import { + Token, +} from "@solana/spl-token"; +import { + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_PROGRAM_ID, +} from "@oyster/common"; +import { sha256 } from "js-sha256"; +import BN from 'bn.js'; +import * as bs58 from "bs58"; + +import { + getCandyConfig, + getCandyMachineAddress, + getCandyMachine, + getCreatorTokenAccount, + getEdition, + getEditionMarkerPda, + getMintInfo, +} from "./accounts"; +import { + CANDY_MACHINE_ID, + GUMDROP_DISTRIBUTOR_ID, +} from "./ids"; +import { + MerkleTree, +} from "./merkleTree"; + +export type ClaimantInfo = { + handle : string, + amount : number, + edition : number, + + pin : BN, + url : string, + + seed : PublicKey, + secret : PublicKey, +}; + +const csvStringToArray = (strData : any) => { + const objPattern = new RegExp(("(\\,|\\r?\\n|\\r|^)(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|([^\\,\\r\\n]*))"),"gi"); + let arrMatches : RegExpExecArray | null = null; + const arrData : Array> = [[]]; + while ((arrMatches = objPattern.exec(strData))) { + if (arrMatches[1].length && arrMatches[1] !== ",") + arrData.push([]); + arrData[arrData.length - 1].push( + arrMatches[2] + ? arrMatches[2].replace(new RegExp( "\"\"", "g" ), "\"") + : arrMatches[3]); + } + return arrData; +} + +export type Claimants = Array; +export const parseClaimants = ( + input : string, + filename : string, + method : string, +) : Claimants => { + const extension = filename.match(/\.[0-9a-z]+$/i); + if (extension === null) { + throw new Error(`Could not parse file extension from ${filename}`); + } + switch (extension[0]) { + case ".csv": { + const arr = csvStringToArray(input); + // TODO: more robust + let search : string; + if (method === "aws-sms") { + search = "phone number"; + } else if (method === "aws-email") { + search = "email"; + } else { + throw new Error(`Cannot parse csv for ${method}`); + } + const foundIdx = arr[0].findIndex(s => s.includes(search)); + if (foundIdx === -1) + throw new Error(`Could not find ${search} index`); + + const numbers = new Set( + arr.slice(1) + .filter(arr => arr[foundIdx].length > 0) + .map(arr => arr[foundIdx]) + ); + + return [...numbers].map((n, idx) => { + return { + handle : n, + amount : 1, + edition : idx, + } as any; + }); + } + case ".json": { + const json = JSON.parse(input); + return json.map((obj : any) => { + return { + handle : obj.handle, + amount : obj.amount, + edition: obj.edition, + url : obj.url, + }; + }); + } + default: { + throw new Error(`Cannot parse file format ${extension} from ${filename}`); + } + } +}; + +const explorerUrlFor = (env : string, key : string) => { + return `https://explorer.solana.com/address/${key}?cluster=${env}`; +} + +export type ClaimInfo = { [key: string]: any }; + +export const dropInfoFor = ( + env : string, + integration : string, + tokenMint : string, + candyConfig : string, + masterMint : string, +) => { + switch (integration) { + case "transfer": + return { type: "Token", meta: explorerUrlFor(env, tokenMint) }; + case "candy": + return { type: "Candy", meta: explorerUrlFor(env, candyConfig) }; + case "edition": + return { type: "Edition", meta: explorerUrlFor(env, masterMint) }; + default: + throw new Error(`Unknown claim integration method ${integration}`); + } +} + +export const validateTransferClaims = async ( + connection : RPCConnection, + walletKey : PublicKey, + claimants : Claimants, + mintStr : string, +) : Promise => { + claimants.forEach((c, idx) => { + if (!c.handle) throw new Error(`Claimant ${idx} doesn't have handle`); + if (!c.amount) throw new Error(`Claimant ${idx} doesn't have amount`); + if (c.amount === 0) throw new Error(`Claimant ${idx} amount is 0`); + }); + + const total = claimants.reduce((acc, c) => acc + c.amount, 0); + const mint = await getMintInfo(connection, mintStr); + const source = await getCreatorTokenAccount( + walletKey, + connection, + mint.key, + total + ); + + return { + total: total, + mint: mint, + source: source, + }; +} + +export const validateCandyClaims = async ( + connection : RPCConnection, + walletKey : PublicKey, + claimants : Claimants, + candyConfig : string, + candyUuid : string, +) : Promise => { + claimants.forEach((c, idx) => { + if (!c.handle) throw new Error(`Claimant ${idx} doesn't have handle`); + if (!c.amount) throw new Error(`Claimant ${idx} doesn't have amount`); + if (c.amount === 0) throw new Error(`Claimant ${idx} amount is 0`); + }); + + const total = claimants.reduce((acc, c) => acc + c.amount, 0); + const configKey = await getCandyConfig(connection, candyConfig); + const [candyMachineKey, ] = await getCandyMachineAddress(configKey, candyUuid); + + const candyMachine = await getCandyMachine(connection, candyMachineKey); + + const remaining = candyMachine.data.itemsAvailable.toNumber() - candyMachine.itemsRedeemed.toNumber(); + if (isNaN(remaining)) { + // TODO: should this have an override? + throw new Error(`Could not calculate how many candy machine items are remaining`); + } + if (remaining < total) { + throw new Error(`Distributor is allocated more mints (${total}) ` + + `than the candy machine has remaining (${remaining})`); + } + if (!candyMachine.authority.equals(walletKey)) { + throw new Error(`Candy machine authority does not match wallet public key`); + } + + return { + total: total, + config: configKey, + uuid: candyUuid, + candyMachineKey: candyMachineKey, + }; +} + +const getOffsetFromStart = (edition: BN) => { + return edition.mod(new BN(31 * 8)); +}; + +const getIndex = (offsetFromStart: BN) => { + return offsetFromStart.div(new BN(8)); +}; + +const getOffsetFromRight = (offsetFromStart: BN) => { + return new BN(7).sub(offsetFromStart.mod(new BN(8))); +}; + +const getIndexAndMask = (edition: BN) => { + const offsetFromStart = getOffsetFromStart(edition); + return { + index: getIndex(offsetFromStart).toNumber(), + mask: new BN(1).shln(getOffsetFromRight(offsetFromStart).toNumber()).toNumber(), + }; +}; + +const editionTaken = (marker : Array, edition : BN) : boolean => { + const m = getIndexAndMask(edition); + return (marker[m.index] & m.mask) !== 0; +} + +const setEditionTaken = (marker : Array, edition : BN) => { + const m = getIndexAndMask(edition); + marker[m.index] = marker[m.index] | m.mask; +} + +export const validateEditionClaims = async ( + connection : RPCConnection, + walletKey : PublicKey, + claimants : Claimants, + masterMintStr : string, +) : Promise => { + claimants.forEach((c, idx) => { + if (!c.handle) throw new Error(`Claimant ${idx} doesn't have handle`); + if (c.amount !== 1) { + throw new Error(`Claimant ${idx} has amount ${c.amount}. Expected 1 for edition gumdrop`); + } + }); + + const total = claimants.reduce((acc, c) => acc + c.amount, 0); + const masterMint = await getMintInfo(connection, masterMintStr); + const masterTokenAccount = await getCreatorTokenAccount( + walletKey, + connection, + masterMint.key, + 1 // just check that the creator has the master mint + ); + + const masterEditionKey = await getEdition(masterMint.key); + const masterEdition = await connection.getAccountInfo(masterEditionKey); + if (masterEdition === null) { + throw new Error(`Could not fetch master edition`); + } + console.log("Master edition", masterEdition); + + // maxSupply is an option, 9 bytes, first is 0 means is none + const currentSupply = new BN(masterEdition.data.slice(1, 1+8), 8, "le").toNumber(); + let maxSupply; + if (masterEdition.data[9] === 0) { + maxSupply = null; + } else { + maxSupply = new BN(masterEdition.data.slice(10, 10+8), 8, "le").toNumber(); + } + console.log("Max supply", maxSupply); + console.log("Current supply", currentSupply); + + if (maxSupply !== null && maxSupply < total) { + throw new Error(`Distributor is allocated more editions (${total}) ` + + `than the master has total (${maxSupply})`); + } + + // Whether an edition has been claimed is a single bit in a paginated account + // (pda off of master mint). The following code does some sanity checks + // around max supply and internally whether the distribution list has + // duplicate editions, and also checks if the editions were already taken on + // chain. + // + // There is a race condition since the authority to mint is still currently + // the wallet but it seems like a user error to have other editions being + // minted while a gumdrop is being created + const editions : { [key: number]: number } = {}; + const editionMarkers : Array<[PublicKey, Array]> = []; + for (let idx = 0; idx < claimants.length; ++idx ) { + const c = claimants[idx]; + if (c.edition === undefined) throw new Error(`Claimant ${idx} doesn't have edition`); + if (c.edition <= 0) { + throw new Error(`Claimant ${idx} assigned invalid edition ${c.edition}`); + } + if (maxSupply !== null && c.edition > maxSupply) { + throw new Error(`Claimant ${idx} assigned edition ${c.edition} which is beyond the max supply`); + } + if (c.edition in editions) { + throw new Error(`Claimant ${idx} and ${editions[c.edition]} are both assigned to edition ${c.edition}`); + } + const edition = new BN(c.edition); + const markerKey = await getEditionMarkerPda(masterMint.key, edition); + let markerData = editionMarkers.find(pm => pm[0].equals(markerKey)); + if (markerData === undefined) { + const markerAcc = await connection.getAccountInfo(markerKey); + if (markerAcc === null) { + editionMarkers.push([markerKey, Array(31)]); + } else { + editionMarkers.push([markerKey, [...markerAcc.data.slice(1, 32)]]); + } + markerData = editionMarkers[editionMarkers.length - 1]; + } + + if (markerData === undefined) { + throw new Error(`Internal Error: Edition marker info still undefined ${c.edition}`); + } + + if (editionTaken(markerData[1], edition)) { + throw new Error(`Claimant ${idx} is assigned to edition ${c.edition} which is already taken`); + } + + setEditionTaken(markerData[1], edition); + + editions[c.edition] = idx; + } + + return { + total: total, + masterMint: masterMint, + masterTokenAccount: masterTokenAccount, + }; +} + +export const chunk = ( + arr : Buffer, + len : number, +) : Array => { + const chunks : Array = []; + const n = arr.length; + let i = 0; + + while (i < n) { + chunks.push(arr.slice(i, i += len)); + } + + return chunks; +} + +export const buildGumdrop = async ( + connection : RPCConnection, + walletKey : PublicKey, + needsPin : boolean, + claimIntegration : string, + host : string, + baseKey : PublicKey, + temporalSigner : PublicKey, + claimants : Claimants, + claimInfo : ClaimInfo, + extraParams : Array = [], +) : Promise> => { + + const leafs : Array = []; + for (let idx = 0; idx < claimants.length; ++idx ) { + const claimant = claimants[idx]; + if (!needsPin) { + try { + claimant.secret = new PublicKey(claimant.handle); + } catch (err) { + throw new Error(`Invalid claimant wallet handle ${err}`); + } + } else { + const seeds = [ + claimant.seed.toBuffer(), + ...chunk(Buffer.from(claimant.handle), 32), + Buffer.from(claimant.pin.toArray("le", 4)), + ]; + const [claimantPda, ] = await PublicKey.findProgramAddress( + seeds.map(s => s.slice(0, 32)), GUMDROP_DISTRIBUTOR_ID); + claimant.secret = claimantPda; + } + // TODO: get this clarified with jordan... we can either just assign some + // range of editions to a user or give them an amount and just keep a + // counter on the distributor... the latter is much less work but we lose + // the ability to use gumdrop for auction house winnings and such? + const extra = claimIntegration === "edition" + ? [...new BN(claimant.edition).toArray("le", 8)] + : [] + leafs.push(Buffer.from( + [...new BN(idx).toArray("le", 8), + ...claimant.secret.toBuffer(), + ...claimant.seed.toBuffer(), + ...new BN(claimant.amount).toArray("le", 8), + ...extra + ] + )); + } + + const tree = new MerkleTree(leafs); + const root = tree.getRoot(); + + const [distributor, dbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("MerkleDistributor"), + baseKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID); + + for (let idx = 0; idx < claimants.length; ++idx) { + const proof = tree.getProof(idx); + const verified = tree.verifyProof(idx, proof, root); + + if (!verified) { + throw new Error("Gumdrop merkle tree verification failed"); + } + + const claimant = claimants[idx]; + const params = [ + `distributor=${distributor}`, + `handle=${encodeURIComponent(claimant.handle)}`, + `amount=${claimant.amount}`, + `index=${idx}`, + `proof=${proof.map(b => bs58.encode(b))}`, + ...extraParams, + ]; + if (needsPin) { + params.push(`pin=${claimant.pin.toNumber()}`); + } else { + params.push(`pin=NA`); + } + if (claimIntegration === "transfer") { + params.push(`tokenAcc=${claimInfo.source}`); + } else if (claimIntegration === "candy") { + params.push(`config=${claimInfo.config}`); + params.push(`uuid=${claimInfo.uuid}`); + } else { + params.push(`master=${claimInfo.masterMint.key}`); + params.push(`edition=${claimant.edition}`); + } + const query = params.join("&"); + + claimant.url = `${host}/claim?${query}`; + } + + // initial merkle-distributor state + const instructions = Array(); + instructions.push(new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: baseKey , isSigner: true , isWritable: false } , + { pubkey: distributor , isSigner: false , isWritable: true } , + { pubkey: walletKey , isSigner: true , isWritable: false } , + { pubkey: SystemProgram.programId , isSigner: false , isWritable: false } , + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:new_distributor")).slice(0, 8), + ...new BN(dbump).toArray("le", 1), + ...root, + ...temporalSigner.toBuffer(), + ]) + })); + + if (claimIntegration === "transfer") { + instructions.push(Token.createApproveInstruction( + TOKEN_PROGRAM_ID, + claimInfo.source, + distributor, + walletKey, + [], + claimInfo.total + )); + } else if (claimIntegration === "candy") { + const [distributorWalletKey, ] = await PublicKey.findProgramAddress( + [ + Buffer.from("Wallet"), + distributor.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + + instructions.push(new TransactionInstruction({ + programId: CANDY_MACHINE_ID, + keys: [ + { pubkey: claimInfo.candyMachineKey,isSigner: false , isWritable: true } , + { pubkey: walletKey , isSigner: true , isWritable: false } , + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:update_authority")).slice(0, 8), + ...new BN(1).toArray("le", 1), // optional exists... + ...distributorWalletKey.toBuffer(), + ]) + })); + } else if (claimIntegration === "edition") { + // transfer master edition to distributor + const [distributorTokenKey, ] = await PublicKey.findProgramAddress( + [ + distributor.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + claimInfo.masterMint.key.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + + instructions.push(Token.createAssociatedTokenAccountInstruction( + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + TOKEN_PROGRAM_ID, + claimInfo.masterMint.key, + distributorTokenKey, + distributor, + walletKey, + )); + + instructions.push(Token.createTransferInstruction( + TOKEN_PROGRAM_ID, + claimInfo.masterTokenAccount, + distributorTokenKey, + walletKey, + [], + 1 + )); + } + + return instructions; +} + +export const closeGumdrop = async ( + connection : RPCConnection, + walletKey : PublicKey, + base : Keypair, + claimMethod : string, + transferMint : string, + candyConfig : string, + candyUuid : string, + masterMint : string, +) : Promise> => { + const [distributorKey, dbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("MerkleDistributor"), + base.publicKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID); + + const [distributorWalletKey, wbump] = await PublicKey.findProgramAddress( + [ + Buffer.from("Wallet"), + distributorKey.toBuffer(), + ], + GUMDROP_DISTRIBUTOR_ID + ); + + let extraKeys : Array; + const instructions = Array(); + + if (claimMethod === "transfer") { + const mint = await getMintInfo(connection, transferMint); + const source = await getCreatorTokenAccount( + walletKey, connection, mint.key, 0 + ); + // distributor is about to be closed anyway so this is redundant but... + instructions.push(Token.createRevokeInstruction( + TOKEN_PROGRAM_ID, + source, + walletKey, + [], + )); + } + + if (claimMethod === "candy") { + const configKey = await getCandyConfig(connection, candyConfig); + const [candyMachineKey, ] = await getCandyMachineAddress( + configKey, candyUuid); + + extraKeys = [ + { pubkey: candyMachineKey , isSigner: false , isWritable: true } , + { pubkey: CANDY_MACHINE_ID , isSigner: false , isWritable: false } , + ]; + } else { + extraKeys = []; + } + + if (claimMethod === "edition") { + let masterMintKey: PublicKey; + try { + masterMintKey = new PublicKey(masterMint); + } catch (err) { + throw new Error(`Invalid mint key ${err}`); + } + const [distributorTokenKey, ] = await PublicKey.findProgramAddress( + [ + distributorKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + masterMintKey.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + + const [walletTokenKey, ] = await PublicKey.findProgramAddress( + [ + walletKey.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + masterMintKey.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + + instructions.push(new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: base.publicKey , isSigner: true , isWritable: false } , + { pubkey: distributorKey , isSigner: false , isWritable: false } , + { pubkey: distributorTokenKey , isSigner: false , isWritable: true } , + { pubkey: walletTokenKey , isSigner: false , isWritable: true } , + { pubkey: walletKey , isSigner: false , isWritable: true } , + { pubkey: SystemProgram.programId , isSigner: false , isWritable: false } , + { pubkey: TOKEN_PROGRAM_ID , isSigner: false , isWritable: false } , + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:close_distributor_token_account")).slice(0, 8), + ...new BN(dbump).toArray("le", 1), + ]) + })); + } + + instructions.push(new TransactionInstruction({ + programId: GUMDROP_DISTRIBUTOR_ID, + keys: [ + { pubkey: base.publicKey , isSigner: true , isWritable: false } , + { pubkey: distributorKey , isSigner: false , isWritable: true } , + { pubkey: distributorWalletKey , isSigner: false , isWritable: true } , + { pubkey: walletKey , isSigner: true , isWritable: true } , + { pubkey: SystemProgram.programId , isSigner: false , isWritable: false } , + { pubkey: TOKEN_PROGRAM_ID , isSigner: false , isWritable: false } , + ...extraKeys, + ], + data: Buffer.from([ + ...Buffer.from(sha256.digest("global:close_distributor")).slice(0, 8), + ...new BN(dbump).toArray("le", 1), + ...new BN(wbump).toArray("le", 1), + ]) + })); + + return instructions; +} diff --git a/js/packages/gumdrop/src/utils/communication.ts b/js/packages/gumdrop/src/utils/communication.ts new file mode 100644 index 0000000000..db7a4305d5 --- /dev/null +++ b/js/packages/gumdrop/src/utils/communication.ts @@ -0,0 +1,219 @@ +import log from 'loglevel'; +import { SESv2Client, SendEmailCommand } from "@aws-sdk/client-sesv2" +import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"; + +import { + ClaimantInfo, + Claimants, +} from "./claimant" + +export type AuthKeys = { [key: string] : string } +export type Response = { [key: string] : any } + +export type DropInfo = { + type : string, + meta : string, +}; + +export const formatDropMessage = ( + info : ClaimantInfo, + drop : DropInfo, + html : boolean, +) => { + const wrap = (url, text) => { + if (html) { + return `${text}`; + } else { + return `${text} ${url}`; + } + } + if (drop.type === "Token") { + return { + subject: "Gumdrop Token Drop", + message: `You received ${info.amount} token(s) ` + + `(click ${wrap(drop.meta, "here")} to view more information about the token mint). ` + + wrap(info.url, "Click here to claim them!"), + }; + } else if (drop.type === "Candy") { + return { + subject: "Gumdrop NFT Drop", + message: `You received ${info.amount} Candy Machine pre-sale mint(s) ` + + `(click ${wrap(drop.meta, "here")} to view the candy machine configuration on explorer). ` + + wrap(info.url, "Click here to claim them!"), + }; + } else if (drop.type === "Edition") { + return { + subject: "Gumdrop NFT Drop", + message: `You received ${info.amount} limited-edition print(s) ` + + `(click ${wrap(drop.meta, "here")} to view the master edition mint on explorer). ` + + wrap(info.url, "Click here to claim them!"), + }; + } else { + throw new Error(`Internal Error: Unknown drop type ${drop.type}`); + } +}; + +export const distributeAwsSns = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + if (!auth.accessKeyId || !auth.secretAccessKey) { + throw new Error("AWS SES auth keys not supplied"); + } + if (claimants.length === 0) return []; + + log.debug("SES auth", auth); + const client = new SNSClient({ + region: "us-east-2", + credentials: { + accessKeyId: auth.accessKeyId, + secretAccessKey: auth.secretAccessKey, + }, + }); + + const single = async ( + info : ClaimantInfo, + drop : DropInfo, + ) => { + const formatted = formatDropMessage(info, drop, true); + const message = { + Message: formatted.message, + PhoneNumber: info.handle, + }; + + try { + const response = await client.send(new PublishCommand(message)); + return { + status: "success", + handle: info.handle, + messageId: response.MessageId, + }; + } catch (err) { + return { + status: "error", + handle: info.handle, + error: err, + }; + } + }; + + const responses = Array(); + for (const c of claimants) { + responses.push(await single(c, drop)); + } + return responses; +} + +export const distributeAwsSes = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + if (!auth.accessKeyId || !auth.secretAccessKey) { + throw new Error("AWS SES auth keys not supplied"); + } + if (claimants.length === 0) return []; + + log.debug("SES auth", auth); + const client = new SESv2Client({ + region: "us-east-2", + credentials: { + accessKeyId: auth.accessKeyId, + secretAccessKey: auth.secretAccessKey, + }, + }); + + // TODO: move to template + bulk message? + const single = async ( + info : ClaimantInfo, + drop : DropInfo, + ) => { + const formatted = formatDropMessage(info, drop, true); + const message = { + Destination: { + ToAddresses: [ + info.handle, + ] + }, + Content: { + Simple: { + Subject: { + Data: formatted.subject, + Charset: "utf-8", + }, + Body: { + Html: { + Data: formatted.message + + "

" + + "
" + + "If you would like to unsubscribe from new Gumdrops, " + + "change your subscription preferences here: " + + "AWS subscription preferences" + + "
", + Charset: "utf-8", + }, + }, + }, + }, + FromEmailAddress: source, + ListManagementOptions: { + ContactListName: "Gumdrop", + TopicName: drop.type, + }, + }; + + try { + const response = await client.send(new SendEmailCommand(message)); + return { + status: "success", + handle: info.handle, + messageId: response.MessageId, + }; + } catch (err) { + return { + status: "error", + handle: info.handle, + error: err, + }; + } + }; + + const responses = Array(); + for (const c of claimants) { + responses.push(await single(c, drop)); + } + return responses; +} + +/* eslint-disable @typescript-eslint/no-unused-vars */ +export const distributeManual = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + return Array(); +} + +export const distributeWallet = async ( + auth : AuthKeys, + source : string, + claimants : Claimants, + drop : DropInfo, +) => { + return Array(); +} +/* eslint-enable @typescript-eslint/no-unused-vars */ + +export const urlAndHandleFor = (claimants : Array) => { + return claimants.map(info => { + return { + handle: info.handle, + amount: info.amount, + url: info.url, + }; + }); +} diff --git a/js/packages/gumdrop/src/utils/ids.ts b/js/packages/gumdrop/src/utils/ids.ts new file mode 100644 index 0000000000..8411f6c9aa --- /dev/null +++ b/js/packages/gumdrop/src/utils/ids.ts @@ -0,0 +1,21 @@ +import { PublicKey } from '@solana/web3.js'; + +export const CANDY_MACHINE_ID = new PublicKey( + 'cndyAnrLdpjq1Ssp1z8xxDsB8dxe7u4HL5Nxi2K5WXZ', +); + +export const GUMDROP_DISTRIBUTOR_ID = new PublicKey( + 'gdrpGjVffourzkdDRrQmySw4aTHr8a3xmQzzxSwFD1a' +); + +export const GUMDROP_TEMPORAL_SIGNER = new PublicKey( + 'MSv9H2sMceAzccBganUXwGq3GXgqYAstmZAbFDZYbAV' +); + +export const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey( + 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL', +); + +export const TOKEN_METADATA_PROGRAM_ID = new PublicKey( + 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', +); diff --git a/js/packages/gumdrop/src/utils/merkleDistributor.ts b/js/packages/gumdrop/src/utils/merkleDistributor.ts new file mode 100644 index 0000000000..d1abf79c12 --- /dev/null +++ b/js/packages/gumdrop/src/utils/merkleDistributor.ts @@ -0,0 +1,7 @@ +import { + Coder, +} from "@project-serum/anchor" + +const idl = require("./merkle_distributor.json"); +export const coder = new Coder(idl); + diff --git a/js/packages/gumdrop/src/utils/merkleTree.ts b/js/packages/gumdrop/src/utils/merkleTree.ts new file mode 100644 index 0000000000..248892ab16 --- /dev/null +++ b/js/packages/gumdrop/src/utils/merkleTree.ts @@ -0,0 +1,95 @@ +import { keccak_256 } from "js-sha3"; + +export class MerkleTree { + leafs: Array; + layers: Array>; + + constructor(leafs : Array) { + this.leafs = leafs.slice(); + this.layers = []; + + let hashes = this.leafs.map(MerkleTree.nodeHash); + while (hashes.length > 0) { + console.log("Hashes", this.layers.length, hashes); + this.layers.push(hashes.slice()); + if (hashes.length === 1) break; + hashes = hashes.reduce((acc, cur, idx, arr) => { + if (idx % 2 === 0) { + const nxt = arr[idx + 1]; + acc.push(MerkleTree.internalHash(cur, nxt)); + } + return acc; + }, Array()); + } + } + + static nodeHash( + data : Buffer, + ) : Buffer { + return Buffer.from(keccak_256.digest([0x00, ...data])); + } + + + static internalHash( + first : Buffer, + second : Buffer | undefined, + ) : Buffer { + if (!second) return first; + const [fst, snd] = [first, second].sort(Buffer.compare) + return Buffer.from( + keccak_256.digest([0x01, ...fst, ...snd]) + ); + } + + getRoot() : Buffer { + return this.layers[this.layers.length - 1][0]; + } + + getProof(idx : number) : Buffer[] { + return this.layers.reduce((proof, layer) => { + const sibling = idx ^ 1; + if (sibling < layer.length) { + proof.push(layer[sibling]); + } + + idx = Math.floor(idx / 2); + + return proof; + }, []); + } + + getHexRoot(): string { + return this.getRoot().toString("hex"); + } + + getHexProof(idx : number) : string[] { + return this.getProof(idx).map((el) => el.toString("hex")); + } + + verifyProof( + idx : number, + proof : Buffer[], + root : Buffer + ): boolean { + let pair = MerkleTree.nodeHash(this.leafs[idx]); + for (const item of proof) { + pair = MerkleTree.internalHash(pair, item); + } + + return pair.equals(root); + } + + static verifyClaim( + leaf : Buffer, + proof : Buffer[], + root : Buffer + ): boolean { + let pair = MerkleTree.nodeHash(leaf); + for (const item of proof) { + pair = MerkleTree.internalHash(pair, item); + } + + return pair.equals(root); + } + +} diff --git a/js/packages/gumdrop/src/utils/merkle_distributor.json b/js/packages/gumdrop/src/utils/merkle_distributor.json new file mode 100644 index 0000000000..1339de195c --- /dev/null +++ b/js/packages/gumdrop/src/utils/merkle_distributor.json @@ -0,0 +1,480 @@ +{ + "version": "0.0.0", + "name": "merkle_distributor", + "instructions": [ + { + "name": "newDistributor", + "accounts": [ + { + "name": "base", + "isMut": false, + "isSigner": true + }, + { + "name": "distributor", + "isMut": true, + "isSigner": false + }, + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "root", + "type": { + "array": [ + "u8", + 32 + ] + } + }, + { + "name": "temporal", + "type": "publicKey" + } + ] + }, + { + "name": "closeDistributor", + "accounts": [ + { + "name": "base", + "isMut": false, + "isSigner": true + }, + { + "name": "distributor", + "isMut": true, + "isSigner": false + }, + { + "name": "distributorWallet", + "isMut": true, + "isSigner": false + }, + { + "name": "receiver", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "walletBump", + "type": "u8" + } + ] + }, + { + "name": "claim", + "accounts": [ + { + "name": "distributor", + "isMut": true, + "isSigner": false + }, + { + "name": "claimStatus", + "isMut": true, + "isSigner": false + }, + { + "name": "from", + "isMut": true, + "isSigner": false + }, + { + "name": "to", + "isMut": true, + "isSigner": false + }, + { + "name": "temporal", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "index", + "type": "u64" + }, + { + "name": "amount", + "type": "u64" + }, + { + "name": "claimantSecret", + "type": "publicKey" + }, + { + "name": "proof", + "type": { + "vec": { + "array": [ + "u8", + 32 + ] + } + } + } + ] + }, + { + "name": "claimCandy", + "accounts": [ + { + "name": "distributor", + "isMut": true, + "isSigner": false + }, + { + "name": "distributorWallet", + "isMut": true, + "isSigner": false + }, + { + "name": "claimCount", + "isMut": true, + "isSigner": false + }, + { + "name": "temporal", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "candyMachineConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "candyMachine", + "isMut": true, + "isSigner": false + }, + { + "name": "candyMachineWallet", + "isMut": true, + "isSigner": false + }, + { + "name": "candyMachineMint", + "isMut": true, + "isSigner": false + }, + { + "name": "candyMachineMetadata", + "isMut": true, + "isSigner": false + }, + { + "name": "candyMachineMasterEdition", + "isMut": true, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMetadataProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "candyMachineProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "clock", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "walletBump", + "type": "u8" + }, + { + "name": "claimBump", + "type": "u8" + }, + { + "name": "index", + "type": "u64" + }, + { + "name": "amount", + "type": "u64" + }, + { + "name": "claimantSecret", + "type": "publicKey" + }, + { + "name": "proof", + "type": { + "vec": { + "array": [ + "u8", + 32 + ] + } + } + } + ] + } + ], + "accounts": [ + { + "name": "MerkleDistributor", + "type": { + "kind": "struct", + "fields": [ + { + "name": "base", + "type": "publicKey" + }, + { + "name": "bump", + "type": "u8" + }, + { + "name": "root", + "type": { + "array": [ + "u8", + 32 + ] + } + }, + { + "name": "temporal", + "type": "publicKey" + } + ] + } + }, + { + "name": "ClaimStatus", + "type": { + "kind": "struct", + "fields": [ + { + "name": "isClaimed", + "type": "bool" + }, + { + "name": "claimant", + "type": "publicKey" + }, + { + "name": "claimedAt", + "type": "i64" + }, + { + "name": "amount", + "type": "u64" + } + ] + } + }, + { + "name": "ClaimCount", + "type": { + "kind": "struct", + "fields": [ + { + "name": "count", + "type": "u64" + }, + { + "name": "claimant", + "type": "publicKey" + } + ] + } + }, + { + "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" + } + ] + } + } + ], + "types": [ + { + "name": "CandyMachineData", + "type": { + "kind": "struct", + "fields": [ + { + "name": "uuid", + "type": "string" + }, + { + "name": "price", + "type": "u64" + }, + { + "name": "itemsAvailable", + "type": "u64" + }, + { + "name": "goLiveDate", + "type": { + "option": "i64" + } + } + ] + } + } + ], + "events": [ + { + "name": "ClaimedEvent", + "fields": [ + { + "name": "index", + "type": "u64", + "index": false + }, + { + "name": "claimant", + "type": "publicKey", + "index": false + }, + { + "name": "amount", + "type": "u64", + "index": false + } + ] + } + ], + "errors": [ + { + "code": 300, + "name": "InvalidProof", + "msg": "Invalid Merkle proof." + }, + { + "code": 301, + "name": "DropAlreadyClaimed", + "msg": "Drop already claimed." + }, + { + "code": 302, + "name": "Unauthorized", + "msg": "Account is not authorized to execute this instruction" + }, + { + "code": 303, + "name": "OwnerMismatch", + "msg": "Token account owner did not match intended owner" + }, + { + "code": 304, + "name": "TemporalMismatch", + "msg": "Temporal signer did not match distributor" + } + ] +} \ No newline at end of file diff --git a/js/packages/gumdrop/src/utils/transactions.ts b/js/packages/gumdrop/src/utils/transactions.ts new file mode 100644 index 0000000000..8c8df6e730 --- /dev/null +++ b/js/packages/gumdrop/src/utils/transactions.ts @@ -0,0 +1,291 @@ +import { + Blockhash, + Commitment, + Connection, + FeeCalculator, + Keypair, + RpcResponseAndContext, + SignatureStatus, + SimulatedTransactionResponse, + Transaction, + TransactionInstruction, + TransactionSignature, +} from '@solana/web3.js'; +import { sleep } from "@oyster/common"; +import log from 'loglevel'; + +interface BlockhashAndFeeCalculator { + blockhash: Blockhash; + feeCalculator: FeeCalculator; +} + +export const DEFAULT_TIMEOUT = 15000; + +export const getUnixTs = () => { + return new Date().getTime() / 1000; +}; + +export const envFor = ( + connection: Connection +) : string => { + const endpoint = (connection as any)._rpcEndpoint; + const regex = /https:\/\/api.([^.]*).solana.com/; + const match = endpoint.match(regex); + if (match[1]) { + return match[1]; + } + return "mainnet-beta"; +} + +export const explorerLinkFor = ( + txid: TransactionSignature, + connection: Connection +) : string => { + return `https://explorer.solana.com/tx/${txid}?cluster=${envFor(connection)}`; +} + +export const sendTransactionWithRetryWithKeypair = async ( + connection: Connection, + wallet: Keypair, + instructions: TransactionInstruction[], + signers: Keypair[], + commitment: Commitment = 'singleGossip', + includesFeePayer: boolean = false, + block?: BlockhashAndFeeCalculator, + beforeSend?: () => void, +) => { + const 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.sign(...[wallet, ...signers]); + } else { + transaction.sign(wallet); + } + + if (beforeSend) { + beforeSend(); + } + + const { txid, slot } = await sendSignedTransaction({ + connection, + signedTransaction: transaction, + }); + + return { txid, slot }; +}; + +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, + }, + ); + + log.debug('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, + 'confirmed', + true, + ); + + if (!confirmation) + throw new Error('Timed out awaiting confirmation on transaction'); + + if (confirmation.err) { + log.error(confirmation.err); + throw new Error('Transaction failed: Custom instruction error'); + } + + slot = confirmation?.slot || 0; + } catch (err) { + log.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) { + log.error('Simulate Transaction error', 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; + } + + log.debug('Latency (ms)', 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; +} + +export 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; + // eslint-disable-next-line no-async-promise-executor + status = await new Promise(async (resolve, reject) => { + setTimeout(() => { + if (done) { + return; + } + done = true; + log.warn('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) { + log.warn('Rejected via websocket', result.err); + reject(status); + } else { + log.debug('Resolved via websocket', result); + resolve(status); + } + }, + commitment, + ); + } catch (e) { + done = true; + log.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]; + console.log(explorerLinkFor(txid, connection)); + if (!done) { + if (!status) { + log.debug('REST null result for', txid, status); + } else if (status.err) { + log.error('REST error for', txid, status); + done = true; + reject(status.err); + } else if (!status.confirmations) { + log.error('REST no confirmations for', txid, status); + } else { + log.debug('REST confirmation for', txid, status); + done = true; + resolve(status); + } + } + } catch (e) { + if (!done) { + log.error('REST connection error: txid', txid, e); + } + } + })(); + await sleep(2000); + } + }); + + //@ts-ignore + if (connection._signatureSubscriptions[subId]) + connection.removeSignatureListener(subId); + done = true; + log.debug('Returning status', status); + return status; +} diff --git a/js/packages/gumdrop/tsconfig.json b/js/packages/gumdrop/tsconfig.json new file mode 100644 index 0000000000..7af70ab9d5 --- /dev/null +++ b/js/packages/gumdrop/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": [ + "dom", + "dom.iterable", + "es2020" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "noImplicitAny": false, + "resolveJsonModule": true, + "isolatedModules": true, + "downlevelIteration": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "exclude": [ + "node_modules" + ], + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.d.ts" + ] +} diff --git a/js/packages/web/src/actions/cancelBid.ts b/js/packages/web/src/actions/cancelBid.ts index 163b60086f..f8cd205c24 100644 --- a/js/packages/web/src/actions/cancelBid.ts +++ b/js/packages/web/src/actions/cancelBid.ts @@ -12,18 +12,11 @@ import { StringPublicKey, WalletSigner, toPublicKey, - createAssociatedTokenAccountInstruction, - programIds, pubkeyToString, WRAPPED_SOL_MINT, } from '@oyster/common'; import { AccountLayout } from '@solana/spl-token'; -import { - TransactionInstruction, - Keypair, - Connection, - PublicKey, -} from '@solana/web3.js'; +import { TransactionInstruction, Keypair, Connection } from '@solana/web3.js'; import { AuctionView } from '../hooks'; import { BidRedemptionTicket, @@ -145,7 +138,7 @@ export async function setupCancelBid( cancelSigners, ); } else { - receivingSolAccountOrAta = await findAta(auctionView, wallet, connection) + receivingSolAccountOrAta = await findAta(auctionView, wallet, connection); } await cancelBid( diff --git a/js/packages/web/src/actions/sendRedeemBid.ts b/js/packages/web/src/actions/sendRedeemBid.ts index cc1d28f732..6f179d6e44 100644 --- a/js/packages/web/src/actions/sendRedeemBid.ts +++ b/js/packages/web/src/actions/sendRedeemBid.ts @@ -1,9 +1,4 @@ -import { - Keypair, - Connection, - TransactionInstruction, - PublicKey, -} from '@solana/web3.js'; +import { Keypair, Connection, TransactionInstruction } from '@solana/web3.js'; import { ParsedAccount, programIds, @@ -28,7 +23,6 @@ import { StringPublicKey, toPublicKey, WalletSigner, - createAssociatedTokenAccountInstruction, pubkeyToString, WRAPPED_SOL_MINT, } from '@oyster/common'; diff --git a/js/yarn.lock b/js/yarn.lock index cbfe837a32..6e3c917e2c 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -56,6 +56,15 @@ lodash "^4.17.21" resize-observer-polyfill "^1.5.0" +"@aragon/provided-connector@^6.0.7": + version "6.0.8" + resolved "https://registry.yarnpkg.com/@aragon/provided-connector/-/provided-connector-6.0.8.tgz#5d22ccb2a0ff599fbe6c23fdf96cb06d59ff2716" + integrity sha512-O7dPXPPwOulkF5Nc04nTEBQPtDmySRPtZW0SYQlX0CwjSAntfdyLjFr6T3bNFFqLCBKfDoW6Hc02fN+rClQGIg== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-warning "^1.0.3" + "@aws-crypto/crc32@^1.0.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-1.2.1.tgz#c019f8c4bd6a55baec0c5692722d4fcb27809e6b" @@ -72,6 +81,27 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/ie11-detection@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz#bb6c2facf8f03457e949dcf0921477397ffa4c6e" + integrity sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz#741c9024df55ec59b51e5b1f5d806a4852699fb5" + integrity sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A== + dependencies: + "@aws-crypto/ie11-detection" "^2.0.0" + "@aws-crypto/sha256-js" "^2.0.0" + "@aws-crypto/supports-web-crypto" "^2.0.0" + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + "@aws-crypto/sha256-browser@^1.0.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-1.2.1.tgz#b75b89a63039f97667e61ac92c9c4ee04f35fec0" @@ -85,6 +115,15 @@ "@aws-sdk/util-locate-window" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/sha256-js@2.0.0", "@aws-crypto/sha256-js@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz#f1f936039bdebd0b9e2dd834d65afdc2aac4efcb" + integrity sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig== + dependencies: + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + "@aws-crypto/sha256-js@^1.0.0", "@aws-crypto/sha256-js@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.1.tgz#88c6c0cfff7f269b21740c71157987837da502df" @@ -101,6 +140,13 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/supports-web-crypto@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz#fd6cde30b88f77d5a4f57b2c37c560d918014f9e" + integrity sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA== + dependencies: + tslib "^1.11.1" + "@aws-crypto/util@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.1.tgz#9bd31a37843aca63829a8fcae6b897283bf6ff12" @@ -110,6 +156,15 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/util@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-2.0.0.tgz#17ba6f83c7e447b70fc24b84c5f6714d1e329f4a" + integrity sha512-YDooyH83m2P5A3h6lNH7hm6mIP93sU/dtzRmXIgtO4BCB7SvtX8ysVKQAE8tVky2DQ3HHxPCjNTuUe7YoAMrNQ== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + "@aws-sdk/abort-controller@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.36.0.tgz#173b18123e99c87b70bc2474b3244cda4bc7d2e5" @@ -118,6 +173,14 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/abort-controller@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.40.0.tgz#e17299776782483835439d9b1b5300add24adc3f" + integrity sha512-S7LzLvNuwuf0q7r4q7zqGzxd/W2xYsn8cpZ90MMb3ObolhbkLySrikUJujmXae8k+2/KFCOr+FVC0YLrATSUgQ== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/chunked-blob-reader-native@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.36.0.tgz#3c1623d53fc357aeda730bc77101eff9785d1706" @@ -133,6 +196,44 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/client-lambda@^3.38.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.40.0.tgz#ded8b6223fc811a115f8c5e93cc74aa464e17b81" + integrity sha512-ZCTwMQwWa21dqLg8Wsxr+T9yz1L2x2tgysePjEqixvvqgyS85ODSoXuH6RQCXQcVhevY7Kn7/xzSNUl8iWPXaQ== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/client-sts" "3.40.0" + "@aws-sdk/config-resolver" "3.40.0" + "@aws-sdk/credential-provider-node" "3.40.0" + "@aws-sdk/fetch-http-handler" "3.40.0" + "@aws-sdk/hash-node" "3.40.0" + "@aws-sdk/invalid-dependency" "3.40.0" + "@aws-sdk/middleware-content-length" "3.40.0" + "@aws-sdk/middleware-host-header" "3.40.0" + "@aws-sdk/middleware-logger" "3.40.0" + "@aws-sdk/middleware-retry" "3.40.0" + "@aws-sdk/middleware-serde" "3.40.0" + "@aws-sdk/middleware-signing" "3.40.0" + "@aws-sdk/middleware-stack" "3.40.0" + "@aws-sdk/middleware-user-agent" "3.40.0" + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/node-http-handler" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/smithy-client" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/url-parser" "3.40.0" + "@aws-sdk/util-base64-browser" "3.37.0" + "@aws-sdk/util-base64-node" "3.37.0" + "@aws-sdk/util-body-length-browser" "3.37.0" + "@aws-sdk/util-body-length-node" "3.37.0" + "@aws-sdk/util-user-agent-browser" "3.40.0" + "@aws-sdk/util-user-agent-node" "3.40.0" + "@aws-sdk/util-utf8-browser" "3.37.0" + "@aws-sdk/util-utf8-node" "3.37.0" + "@aws-sdk/util-waiter" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/client-s3@^3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.36.0.tgz#382000eba1b8b8674fa7fad927f408283bc9981b" @@ -186,6 +287,82 @@ fast-xml-parser "3.19.0" tslib "^2.3.0" +"@aws-sdk/client-sesv2@^3.38.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sesv2/-/client-sesv2-3.40.0.tgz#c2a270722106711bee37eba330f28c9321c8aafc" + integrity sha512-v07tO146FblSMy2LJdhZvlGPy4CEdLNz0ABIka/fgilfMoO/xPBrq2zfTRFIb/VD3SLhOUS5pkPWf0Lrevw2qQ== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/client-sts" "3.40.0" + "@aws-sdk/config-resolver" "3.40.0" + "@aws-sdk/credential-provider-node" "3.40.0" + "@aws-sdk/fetch-http-handler" "3.40.0" + "@aws-sdk/hash-node" "3.40.0" + "@aws-sdk/invalid-dependency" "3.40.0" + "@aws-sdk/middleware-content-length" "3.40.0" + "@aws-sdk/middleware-host-header" "3.40.0" + "@aws-sdk/middleware-logger" "3.40.0" + "@aws-sdk/middleware-retry" "3.40.0" + "@aws-sdk/middleware-serde" "3.40.0" + "@aws-sdk/middleware-signing" "3.40.0" + "@aws-sdk/middleware-stack" "3.40.0" + "@aws-sdk/middleware-user-agent" "3.40.0" + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/node-http-handler" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/smithy-client" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/url-parser" "3.40.0" + "@aws-sdk/util-base64-browser" "3.37.0" + "@aws-sdk/util-base64-node" "3.37.0" + "@aws-sdk/util-body-length-browser" "3.37.0" + "@aws-sdk/util-body-length-node" "3.37.0" + "@aws-sdk/util-user-agent-browser" "3.40.0" + "@aws-sdk/util-user-agent-node" "3.40.0" + "@aws-sdk/util-utf8-browser" "3.37.0" + "@aws-sdk/util-utf8-node" "3.37.0" + tslib "^2.3.0" + +"@aws-sdk/client-sns@^3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sns/-/client-sns-3.40.0.tgz#dc580432482515acbd0909fc7bd407b65b906418" + integrity sha512-WjL8A/n+FQMEA0d1r4VEZN2b6F8uLwbZ5XlDwZZdJpCigiUABVvAcke2mn3QG0tIxc6RI/S3v+HoGP63O1jmFg== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/client-sts" "3.40.0" + "@aws-sdk/config-resolver" "3.40.0" + "@aws-sdk/credential-provider-node" "3.40.0" + "@aws-sdk/fetch-http-handler" "3.40.0" + "@aws-sdk/hash-node" "3.40.0" + "@aws-sdk/invalid-dependency" "3.40.0" + "@aws-sdk/middleware-content-length" "3.40.0" + "@aws-sdk/middleware-host-header" "3.40.0" + "@aws-sdk/middleware-logger" "3.40.0" + "@aws-sdk/middleware-retry" "3.40.0" + "@aws-sdk/middleware-serde" "3.40.0" + "@aws-sdk/middleware-signing" "3.40.0" + "@aws-sdk/middleware-stack" "3.40.0" + "@aws-sdk/middleware-user-agent" "3.40.0" + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/node-http-handler" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/smithy-client" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/url-parser" "3.40.0" + "@aws-sdk/util-base64-browser" "3.37.0" + "@aws-sdk/util-base64-node" "3.37.0" + "@aws-sdk/util-body-length-browser" "3.37.0" + "@aws-sdk/util-body-length-node" "3.37.0" + "@aws-sdk/util-user-agent-browser" "3.40.0" + "@aws-sdk/util-user-agent-node" "3.40.0" + "@aws-sdk/util-utf8-browser" "3.37.0" + "@aws-sdk/util-utf8-node" "3.37.0" + entities "2.2.0" + fast-xml-parser "3.19.0" + tslib "^2.3.0" + "@aws-sdk/client-sso@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.36.0.tgz#3f0b69d9f8ca9aeff34b63b9431e439642e96451" @@ -220,6 +397,40 @@ "@aws-sdk/util-utf8-node" "3.36.0" tslib "^2.3.0" +"@aws-sdk/client-sso@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.40.0.tgz#aaa68fc6b0c509ced0c4291d3b85c075f0b16222" + integrity sha512-eFQ4yFg8RlPaldv/ja2K3pUUyXauGbo4GJPlbPKYoquwW785au8qECKSl3iqBmUklj6WmdW1rmtlQk2OUcyYSw== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/config-resolver" "3.40.0" + "@aws-sdk/fetch-http-handler" "3.40.0" + "@aws-sdk/hash-node" "3.40.0" + "@aws-sdk/invalid-dependency" "3.40.0" + "@aws-sdk/middleware-content-length" "3.40.0" + "@aws-sdk/middleware-host-header" "3.40.0" + "@aws-sdk/middleware-logger" "3.40.0" + "@aws-sdk/middleware-retry" "3.40.0" + "@aws-sdk/middleware-serde" "3.40.0" + "@aws-sdk/middleware-stack" "3.40.0" + "@aws-sdk/middleware-user-agent" "3.40.0" + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/node-http-handler" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/smithy-client" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/url-parser" "3.40.0" + "@aws-sdk/util-base64-browser" "3.37.0" + "@aws-sdk/util-base64-node" "3.37.0" + "@aws-sdk/util-body-length-browser" "3.37.0" + "@aws-sdk/util-body-length-node" "3.37.0" + "@aws-sdk/util-user-agent-browser" "3.40.0" + "@aws-sdk/util-user-agent-node" "3.40.0" + "@aws-sdk/util-utf8-browser" "3.37.0" + "@aws-sdk/util-utf8-node" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/client-sts@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.36.0.tgz#78df5113194d04a9ca2b82d81c8def4057e08483" @@ -259,6 +470,45 @@ fast-xml-parser "3.19.0" tslib "^2.3.0" +"@aws-sdk/client-sts@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.40.0.tgz#bcc5c7fb59afc88d2123e18166747ac25f71ccba" + integrity sha512-7jBlb1uyq2c0bFqi4ZVnEMNzLTodvIZKoxjh1LYA8OZISbMsDjTxFOYOmuyOhuPy0fLfLL3KRLtengJ23zs3QQ== + dependencies: + "@aws-crypto/sha256-browser" "2.0.0" + "@aws-crypto/sha256-js" "2.0.0" + "@aws-sdk/config-resolver" "3.40.0" + "@aws-sdk/credential-provider-node" "3.40.0" + "@aws-sdk/fetch-http-handler" "3.40.0" + "@aws-sdk/hash-node" "3.40.0" + "@aws-sdk/invalid-dependency" "3.40.0" + "@aws-sdk/middleware-content-length" "3.40.0" + "@aws-sdk/middleware-host-header" "3.40.0" + "@aws-sdk/middleware-logger" "3.40.0" + "@aws-sdk/middleware-retry" "3.40.0" + "@aws-sdk/middleware-sdk-sts" "3.40.0" + "@aws-sdk/middleware-serde" "3.40.0" + "@aws-sdk/middleware-signing" "3.40.0" + "@aws-sdk/middleware-stack" "3.40.0" + "@aws-sdk/middleware-user-agent" "3.40.0" + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/node-http-handler" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/smithy-client" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/url-parser" "3.40.0" + "@aws-sdk/util-base64-browser" "3.37.0" + "@aws-sdk/util-base64-node" "3.37.0" + "@aws-sdk/util-body-length-browser" "3.37.0" + "@aws-sdk/util-body-length-node" "3.37.0" + "@aws-sdk/util-user-agent-browser" "3.40.0" + "@aws-sdk/util-user-agent-node" "3.40.0" + "@aws-sdk/util-utf8-browser" "3.37.0" + "@aws-sdk/util-utf8-node" "3.37.0" + entities "2.2.0" + fast-xml-parser "3.19.0" + tslib "^2.3.0" + "@aws-sdk/config-resolver@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.36.0.tgz#83d1ff8cbdea893be7bb82828ead9f0764a188bf" @@ -268,6 +518,16 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/config-resolver@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.40.0.tgz#d7bd3180aebced797800661a2ed778a5db8ac7e5" + integrity sha512-QYy6J2k31QL6J74hPBfptnLW1kQYdN+xjwH4UQ1mv7EUhRoJN9ZY2soStJowFy4at6IIOOVWbyG5dyqvrbEovg== + dependencies: + "@aws-sdk/signature-v4" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-config-provider" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-env@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.36.0.tgz#7ac0735f4896252542860063bf4c6f3daf22fcba" @@ -277,6 +537,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-env@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.40.0.tgz#0ca7611f13520dd6654e8eac7fa3e767d027ede6" + integrity sha512-qHZdf2vxhzZkSygjw2I4SEYFL2dMZxxYvO4QlkqQouKY81OVxs/j69oiNCjPasQzGz5jaZZKI8xEAIfkSyr1lg== + dependencies: + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-imds@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.36.0.tgz#f9b30f3b71f0f6f330338e70704c800fd5dc33f5" @@ -288,6 +557,17 @@ "@aws-sdk/url-parser" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-imds@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.40.0.tgz#7c324eff731f85d4d40763c484e78673aa5dedfb" + integrity sha512-Ty/wVa+BQrCFrP06AGl5S1CeLifDt68YrlYXUnkRn603SX4DvxBgVO7XFeDH58G8ziDCiqxfmVl4yjbncPPeSw== + dependencies: + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/url-parser" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-ini@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.36.0.tgz#68531a3bfd810c94261e78d153de07728634e5f8" @@ -303,6 +583,21 @@ "@aws-sdk/util-credentials" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-ini@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.40.0.tgz#dc4c5a523d8b7ede67dd11833fbaf977dda1f120" + integrity sha512-lyTlgItJ+wPWIkcnkpmZTG+ApCwZBDjLzCPzhFOG1vT1wb0pF3KyJGmjWaW9C6s84rvWwGv1bY3/KBo92KtcjA== + dependencies: + "@aws-sdk/credential-provider-env" "3.40.0" + "@aws-sdk/credential-provider-imds" "3.40.0" + "@aws-sdk/credential-provider-sso" "3.40.0" + "@aws-sdk/credential-provider-web-identity" "3.40.0" + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/shared-ini-file-loader" "3.37.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-credentials" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-node@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.36.0.tgz#54c6e0b5c0ff3e2fb52dd7df0de6f04b858639b7" @@ -320,6 +615,23 @@ "@aws-sdk/util-credentials" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-node@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.40.0.tgz#850a17965d6b475883923c162a9d77a501566415" + integrity sha512-TANFmUqZwXd2ytA4Ji8IJDC8g42EnogjeIX+ypea/sImY5L7sQpd/sxQlcpIOJlr/6cGL3VhLGh2EGHXEJQEYA== + dependencies: + "@aws-sdk/credential-provider-env" "3.40.0" + "@aws-sdk/credential-provider-imds" "3.40.0" + "@aws-sdk/credential-provider-ini" "3.40.0" + "@aws-sdk/credential-provider-process" "3.40.0" + "@aws-sdk/credential-provider-sso" "3.40.0" + "@aws-sdk/credential-provider-web-identity" "3.40.0" + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/shared-ini-file-loader" "3.37.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-credentials" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-process@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.36.0.tgz#1677866493d111364666972ef3c2766f9df31bee" @@ -331,6 +643,17 @@ "@aws-sdk/util-credentials" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-process@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.40.0.tgz#b4f16e43ca9c855002e833ac9dc8e409b3c7ca23" + integrity sha512-qsaNCDesW2GasDbzpeOA371gxugi05JWxt3EKonLbUfkGKBK7kmmL6EgLIxZuNm2/Ve4RS07PKp8yBGm4xIx9w== + dependencies: + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/shared-ini-file-loader" "3.37.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-credentials" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-sso@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.36.0.tgz#8651374f78998250143b140335cbf21d8bd91530" @@ -343,6 +666,18 @@ "@aws-sdk/util-credentials" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-sso@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.40.0.tgz#bf838696257d93a85e8370f4df0e3e928e33d25d" + integrity sha512-8XOz1cDsRvmb6UyLKersi+kLx2Bo4nXpsLZDbTuobEqMwtzIIZKW3C8n8icKpiqq1xhJ6hyT80on+HJ8ykrFKA== + dependencies: + "@aws-sdk/client-sso" "3.40.0" + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/shared-ini-file-loader" "3.37.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-credentials" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/credential-provider-web-identity@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.36.0.tgz#bd296390119c217d98407ed0c8adeee221f954a0" @@ -352,6 +687,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/credential-provider-web-identity@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.40.0.tgz#fb237b38c4c33ef9cbe7bf3c5f5d45e38969cbb7" + integrity sha512-A1KT6Ft3k5B6bU2I2jXS4fSoWbWftEysrxT3zyuzhMbsstsHBJ/J9mEsQ4lgZyr6DXEqn7HD3MbdEoaBN2b3sg== + dependencies: + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/eventstream-marshaller@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.36.0.tgz#edf80785f7c571daa09e8c557917e3d4d7d9c15d" @@ -410,6 +754,17 @@ "@aws-sdk/util-base64-browser" "3.36.0" tslib "^2.3.0" +"@aws-sdk/fetch-http-handler@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.40.0.tgz#5e6ecfb7fe1f32a5709e4e9c13b0536073477737" + integrity sha512-w1HiZromoU+/bbEo89uO81l6UO/M+c2uOMnXntZqe6t3ZHUUUo3AbvhKh0QGVFqRQa+Oi0+95KqWmTHa72/9Iw== + dependencies: + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/querystring-builder" "3.40.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-base64-browser" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/hash-blob-browser@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.36.0.tgz#a310ca38a034ed9740a0142d388d9f668e510c29" @@ -429,6 +784,15 @@ "@aws-sdk/util-buffer-from" "3.36.0" tslib "^2.3.0" +"@aws-sdk/hash-node@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.40.0.tgz#bf4d31a41652cbc3c937055087c80096cfab67ae" + integrity sha512-yOXXK85DdGDktdnQtXgMdaVKii4wtMjEhJ1mrvx2A9nMFNaPhxvERkVVIUKSWlJRa9ZujOw5jWOx8d2R51/Kjg== + dependencies: + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-buffer-from" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/hash-stream-node@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.36.0.tgz#ba40e841451093c15a19c2985e23ad58bdf53fa8" @@ -445,6 +809,14 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/invalid-dependency@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.40.0.tgz#023e37abfb2882676c3cef02da630342634aa429" + integrity sha512-axIWtDwCBDDqEgAJipX1FB1ZNpWYXquVwKDMo+7G+ftPBZ4FEq4M1ELhXJL3hhNJ9ZmCQzv+4F6Wnt8dwuzUaQ== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/is-array-buffer@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.36.0.tgz#47cc3a58a6afd7e35ad1358dd38a30d6ff62c7de" @@ -452,6 +824,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/is-array-buffer@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.37.0.tgz#aa87619f8172b1a2a7ac8d573032025d98ae6c50" + integrity sha512-XLjA/a6AuGnCvcJZLsMTy2jxF2upgGhqCCkoIJgLlzzXHSihur13KcmPvW/zcaGnCRj0SvKWXiJHl4vDlW75VQ== + dependencies: + tslib "^2.3.0" + "@aws-sdk/md5-js@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.36.0.tgz#f3244736da1fe3f6c0cb9a14a3a868140c0656db" @@ -491,6 +870,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-content-length@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.40.0.tgz#affe235fc0eb43c7b8e21189f85a238fdd0b4c3f" + integrity sha512-sybAJb8v7I/vvL08R3+TI/XDAg9gybQTZ2treC24Ap4+jAOz4QBTHJPMKaUlEeFlMUcq4rj6/u2897ebYH6opw== + dependencies: + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/middleware-expect-continue@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.36.0.tgz#86d2875633993a0e2f53539bc257e4081dd09ad5" @@ -519,6 +907,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-host-header@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.40.0.tgz#a6a1d52ab0da7f8e65a199c27d71750f8329eccc" + integrity sha512-/wocR7JFOLM7/+BQM1DgAd6KCFYcdxYu1P7AhI451GlVNuYa5f89zh7p0gt3SRC6monI5lXgpL7RudhDm8fTrA== + dependencies: + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/middleware-location-constraint@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.36.0.tgz#434eb2fb12e8c61bdc98b84d1acc67f8cbc00e9a" @@ -535,6 +932,14 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-logger@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.40.0.tgz#29d9616bd39dafa1493cef333a32363e4df2c607" + integrity sha512-19kx0Xg5ymVRKoupmhdmfTBkROcv3DZj508agpyG2YAo0abOObMlIP4Jltg0VD4PhNjGzNh0jFGJnvhjdwv4/A== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/middleware-retry@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.36.0.tgz#e04b75d63262004a85932c799446a620a79c6254" @@ -546,6 +951,17 @@ tslib "^2.3.0" uuid "^8.3.2" +"@aws-sdk/middleware-retry@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.40.0.tgz#5cffe046b1fd208a62a09495de6659be48ef86f3" + integrity sha512-SMUJrukugLL7YJE5X8B2ToukxMWMPwnf7jAFr84ptycCe8bdWv8x8klQ3EtVWpyqochtNlbTi6J/tTQBniUX7A== + dependencies: + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/service-error-classification" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + uuid "^8.3.2" + "@aws-sdk/middleware-sdk-s3@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.36.0.tgz#dcc606f40a040ffd7f25f3c699425a067652d2b0" @@ -569,6 +985,18 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-sdk-sts@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.40.0.tgz#3efefc29176d5078915b61d17105f8bbee86ff5e" + integrity sha512-TcrbCvj1PkabFZiNczT3yePZtuEm2fAIw1OVnQyLcF2KW+p62Hv5YkK4MPOfx3LA/0lzjOUO1RNl2x7gzV443Q== + dependencies: + "@aws-sdk/middleware-signing" "3.40.0" + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/signature-v4" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/middleware-serde@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.36.0.tgz#4ff2d15040b9ab42e075bd246d62894604f0b0e8" @@ -577,6 +1005,14 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-serde@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.40.0.tgz#90124ff60a7f23963bbcd00a5cc95862b29dddd9" + integrity sha512-uOWfZjlAoBy6xPqp0d4ka83WNNbEVCWn9WwfqBUXThyoTdTooYSpXe5y2YzN0BJa8b+tEZTyWpgamnBpFLp47g== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/middleware-signing@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.36.0.tgz#3c632ff0c1aa4b057174f66f23d3c5429eab883c" @@ -588,6 +1024,17 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-signing@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.40.0.tgz#bcbf5558a91db85a87918d5861ce98f306e40a88" + integrity sha512-RqK5nPbfma0qInMvjtpVkDYY/KkFS6EKlOv3DWTdxbXJ4YuOxgKiuUromhmBUoyjFag0JO7LUWod07H+/DawoA== + dependencies: + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/signature-v4" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/middleware-ssec@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.36.0.tgz#da5f4fe22d938d87a3b449c2e4aeffb9528224a7" @@ -603,6 +1050,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/middleware-stack@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.40.0.tgz#5aa614e49a4fc76cc63986fb45302f7afab6db87" + integrity sha512-hby9HvESUYJxpdALX+6Dn2LPmS5jtMVurGB/+j3MWOvIcDYB4bcSXgVRvXzYnTKwbSupIdbX9zOE2ZAx2SJpUQ== + dependencies: + tslib "^2.3.0" + "@aws-sdk/middleware-user-agent@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.36.0.tgz#9365536432119aab25731a7e214fe1e56afb4483" @@ -612,6 +1066,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/middleware-user-agent@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.40.0.tgz#bf03d2deddc00689c85e7eadd9b4e02f24b61c08" + integrity sha512-dzC2fxWnanetFJ1oYgil8df3N36bR1yc/OCOpbdfQNiUk1FrXiCXqH5rHNO8zCvnwJAj8GHFwpFGd9a2Qube2w== + dependencies: + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/node-config-provider@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.36.0.tgz#7db3f842adbc52fb0dc4e68269f37feffa2d65a4" @@ -622,6 +1085,16 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/node-config-provider@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.40.0.tgz#54a8abc4f6d78503093b270e6dff3d6174c59f95" + integrity sha512-AmokjgUDECG8osoMfdRsPNweqI+L1pn4bYGk5iTLmzbBi0o4ot0U1FdX8Rf0qJZZwS4t1TXc3s8/PDVknmPxKg== + dependencies: + "@aws-sdk/property-provider" "3.40.0" + "@aws-sdk/shared-ini-file-loader" "3.37.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/node-http-handler@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.36.0.tgz#3fc18270e078ee261808a0ee385d21d05ef86bd3" @@ -633,6 +1106,17 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/node-http-handler@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.40.0.tgz#26491f11dabbd673c6318376d06af154adc123df" + integrity sha512-qjda6IbxDhbYr8NHmrMurKkbjgLUkfTMVgagDErDK24Nm3Dn5VaO6J4n6c0Q4OLHlmFaRcUfZSTrOo5DAubqCw== + dependencies: + "@aws-sdk/abort-controller" "3.40.0" + "@aws-sdk/protocol-http" "3.40.0" + "@aws-sdk/querystring-builder" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/property-provider@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.36.0.tgz#c6f02521c9c61ae6012ee4459dded0f238bbcf04" @@ -641,6 +1125,14 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/property-provider@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.40.0.tgz#243cb1e87e36b1123ddc66d40d344e7580f80470" + integrity sha512-Mx4lkShjsYRwW9ujHA1pcnuubrWQ4kF5/DXWNfUiXuSIO/0Lojp1qTLheyBm4vzkJIlx5umyP6NvRAUkEHSN4Q== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/protocol-http@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.36.0.tgz#b65e2ff9d12361fd27d140c0166128be0f30a3d0" @@ -649,6 +1141,14 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/protocol-http@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.40.0.tgz#ce6c7170a59e0a0eb63df5cd7cec87fe05bae680" + integrity sha512-f4ea7/HZkjpvGBrnRIuzc/bhrExWrgDv7eulj4htPukZGHdTqSJD3Jk8lEXWvFuX2vUKQDGhEhCDsqup7YWJQQ== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/querystring-builder@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.36.0.tgz#8ae864e960f2a7cbf5185d94c5daa964b359d152" @@ -658,6 +1158,15 @@ "@aws-sdk/util-uri-escape" "3.36.0" tslib "^2.3.0" +"@aws-sdk/querystring-builder@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.40.0.tgz#f57212e60519d2d79ce6173cbe00fbe17a69bc0d" + integrity sha512-gO24oipnNaxJRBXB7lhLfa96vIMOd8gtMBqJTjelTjS2e1ZP1YY12CNKKTWwafSk8Ge021erZAG/YTOaXGpv+g== + dependencies: + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-uri-escape" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/querystring-parser@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.36.0.tgz#f9b922527ef0adec29000960eae7ac951edb99eb" @@ -666,11 +1175,24 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/querystring-parser@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.40.0.tgz#5a5ba9c095ad3125a0daf37c33ed1cc8a600d53e" + integrity sha512-XZIyaKQIiZAM6zelCBcsLHhVDOLafi7XIOd3jy6SymGN8ajj3HqUJ/vdQ5G6ISTk18OrqgqcCOI9oNzv+nrBcA== + dependencies: + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/service-error-classification@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.36.0.tgz#0874b80d82e3c03e5f9800feda45dcfb7b8f9b2e" integrity sha512-y3m/Gc1kSZBX1Dvg3lnu3TxteW2WqjFGc5Y1XBqjOdmQ5JmE1GZz+s9inGfP6N/5v56qQfhTeVCABh1Anq+jEw== +"@aws-sdk/service-error-classification@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.40.0.tgz#c98cbb781bd50e5d90649742ff954d754201c44d" + integrity sha512-c8btKmkvjXczWudXubGdbO3JgmjySBUVC/gCrZDNfwNGsG8RYJJQYYcnmt1gWjelUZsgMDl/2PIzxTlxVF91rA== + "@aws-sdk/shared-ini-file-loader@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.36.0.tgz#4949ceaf4f608da2efed03f005513a51c1668431" @@ -678,6 +1200,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/shared-ini-file-loader@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.37.0.tgz#ca595d9745150f46805f68be6a6c1607d618ad94" + integrity sha512-+vRBSlfa48R9KL7DpQt3dsu5/+5atjRgoCISblWo3SLpjrx41pKcjKneo7a1u0aP1Xc2oG2TfIyqTWZuOXsmEQ== + dependencies: + tslib "^2.3.0" + "@aws-sdk/signature-v4@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.36.0.tgz#177acc6658c50923d2b1a811ffefe1c94ece0387" @@ -689,6 +1218,17 @@ "@aws-sdk/util-uri-escape" "3.36.0" tslib "^2.3.0" +"@aws-sdk/signature-v4@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.40.0.tgz#9de1b4e1130f68394df3232882805896c2d20e45" + integrity sha512-Q1GNZJRCS3W2qsRtDsX/b6EOSfMXfr6TW46N3LnLTGYZ3KAN2SOSJ1DsW59AuGpEZyRmOhJ9L/Q5U403+bZMXQ== + dependencies: + "@aws-sdk/is-array-buffer" "3.37.0" + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-hex-encoding" "3.37.0" + "@aws-sdk/util-uri-escape" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/smithy-client@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.36.0.tgz#3cff850c793fec0f125442eaf76384990dff5de4" @@ -698,11 +1238,25 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/smithy-client@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.40.0.tgz#3f6e3d5d8f7f1e44d68d2bf85dc2d7e35e6ef73d" + integrity sha512-6x6uvmfhFpkCiT1O/SsFWRyyqs3ZHMB1hVypn9XfT1/XSrfVLhcbBtnX1/UGPkQvA1GJGo5Pkxv3odQfUw7rUg== + dependencies: + "@aws-sdk/middleware-stack" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/types@3.36.0", "@aws-sdk/types@^3.1.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.36.0.tgz#6d561df1070f039f29b2259affdd1201f3d06472" integrity sha512-OeaTDZqo4OfGahgsZF2viOWxSSNColEUf8RbKAWNlke3nkMu3JW8kkft1Qte6jvoQxZ3jOQWi33Z4LUxix/V7A== +"@aws-sdk/types@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.40.0.tgz#a9d7926fcb9b699bc46be975033559d2293e60d1" + integrity sha512-KpILcfvRaL88TLvo3SY4OuCCg90SvcNLPyjDwUuBqiOyWODjrKShHtAPJzej4CLp92lofh+ul0UnBfV9Jb/5PA== + "@aws-sdk/url-parser@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.36.0.tgz#72f594e0fa969122313bcdfcbefe41c28bd23900" @@ -712,6 +1266,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/url-parser@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.40.0.tgz#9ccd00a2026605d5eaef630e94b6632cc9598ec3" + integrity sha512-HwNV+HX7bHgLk5FzTOgdXANsC0SeVz5PMC4Nh+TLz2IoeQnrw4H8dsA4YNonncjern5oC5veKRjQeOoCL5SlSQ== + dependencies: + "@aws-sdk/querystring-parser" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/util-arn-parser@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.36.0.tgz#782c0261301d38564bb89b54a33057f5db695ca3" @@ -726,6 +1289,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/util-base64-browser@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.37.0.tgz#4bf105de91e5e17ded644557dac6851c30e992d2" + integrity sha512-o4s/rHVm5k8eC/T7grJQINyYA/mKfDmEWKMA9wk5iBroXlI2rUm7x649TBk5hzoddufk/mffEeNz/1wM7yTmlg== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-base64-node@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-3.36.0.tgz#54b0b401d14b0ef64f992dbf7e2bfcb257578f45" @@ -734,6 +1304,14 @@ "@aws-sdk/util-buffer-from" "3.36.0" tslib "^2.3.0" +"@aws-sdk/util-base64-node@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-3.37.0.tgz#81ff164d227db8faeb910af33ff5f861269d6d67" + integrity sha512-1UPxly1GPrGZtlIWvbNCDIAund4Oyp8cFi9neA43TeNACvrmEQu/nG01pDbOoo0ENoVSVJrNAVBeqKEpqjH2GA== + dependencies: + "@aws-sdk/util-buffer-from" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/util-body-length-browser@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.36.0.tgz#d2ab83216a2da8c015865dea47657cbd0e4d6633" @@ -741,6 +1319,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/util-body-length-browser@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.37.0.tgz#2e3a375ac191a9bacd40a6b3479ee402dcb5769d" + integrity sha512-tClmH1uYelqWT43xxmnOsVFbCQJiIwizp6y4E109G2LIof07inxrO0L8nbwBpjhugVplx6NZr9IaqTFqbdM1gA== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-body-length-node@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.36.0.tgz#be3f78e0dd9429735c6d9d587ecb7cd37b478180" @@ -748,6 +1333,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/util-body-length-node@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.37.0.tgz#d6170dafd351799687d583f818a4a3924b61cbec" + integrity sha512-aY3mXdbEajruRi9CHgq/heM89R+Gectj/Xrs1naewmamaN8NJrvjDm3s+cw//lqqSOW903LYHXDgm7wvCzUnFA== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-buffer-from@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.36.0.tgz#ab9230fc30c37c5262198e389da0ff42ed89da63" @@ -756,6 +1348,21 @@ "@aws-sdk/is-array-buffer" "3.36.0" tslib "^2.3.0" +"@aws-sdk/util-buffer-from@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.37.0.tgz#298d4a925b9f0ca23f99617648cd9fb3896b573c" + integrity sha512-aa3SBwjLwImuJoE4+hxDIWQ9REz3UFb3p7KFPe9qopdXb/yB12RTcbrXVb4whUux4i4mO6KRij0ZNjFZrjrKPg== + dependencies: + "@aws-sdk/is-array-buffer" "3.37.0" + tslib "^2.3.0" + +"@aws-sdk/util-config-provider@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.40.0.tgz#acefff264d6650450a1f8b056a63830a454b756d" + integrity sha512-NjZGrA4mqhpr6gkVCAUweurP0Z9d3vFyXJCtulC0BFbpKAnKCf/crSK56NwUaNhAEMCkSuBvjRFzkbfT+HO8bA== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-credentials@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-credentials/-/util-credentials-3.36.0.tgz#5485289f23a5f26cd736131b0221dff2677c3685" @@ -764,6 +1371,14 @@ "@aws-sdk/shared-ini-file-loader" "3.36.0" tslib "^2.3.0" +"@aws-sdk/util-credentials@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-credentials/-/util-credentials-3.37.0.tgz#76261c3d7c20bee5d28e5c17741adf19558b3b67" + integrity sha512-zcLhSZDKgBLhUjSU5HoQpuQiP3v8oE86NmV/tiZVPEaO6YVULEAB2Cfj1hpM/b/JXWzjSHfT06KXT7QUODKS+A== + dependencies: + "@aws-sdk/shared-ini-file-loader" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/util-hex-encoding@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.36.0.tgz#1617e32ab42639a92a29690a4ee75fadaa008e8b" @@ -771,6 +1386,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/util-hex-encoding@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.37.0.tgz#40ce21b5ff682e811e98ac7476692ee55ae61493" + integrity sha512-tn5UpfaeM+rZWqynoNqB8lwtcAXil5YYO3HLGH9himpWAdft/2Z7LK6bsYDpctaAI1WHgMDcL0bw3Id04ZUbhA== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-locate-window@^3.0.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.36.0.tgz#8cf066f2bea665ba5352ce293844e9f6276e29d8" @@ -785,6 +1407,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/util-uri-escape@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.37.0.tgz#42b8393a51dcc04f228e70d1c94c2fe38a738994" + integrity sha512-8pKf4YJTELP5lm/CEgYw2atyJBB1RWWqFa0sZx6YJmTlOtLF5G6raUdAi4iDa2hldGt2B6IAdIIyuusT8zeU8Q== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-user-agent-browser@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.36.0.tgz#0de8c041abb4a6f64f97f8bed52353d4470e9e9d" @@ -794,6 +1423,15 @@ bowser "^2.11.0" tslib "^2.3.0" +"@aws-sdk/util-user-agent-browser@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.40.0.tgz#d9f4f49af35895df260598a333a8b792b56e9f76" + integrity sha512-C69sTI26bV2EprTv3DTXu9XP7kD9Wu4YVPBzqztOYArd2GDYw3w+jS8SEg3XRbjAKY/mOPZ2Thw4StjpZlWZiA== + dependencies: + "@aws-sdk/types" "3.40.0" + bowser "^2.11.0" + tslib "^2.3.0" + "@aws-sdk/util-user-agent-node@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.36.0.tgz#c8c5af9165af82f8e31afd371ca913b3caafb510" @@ -803,6 +1441,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/util-user-agent-node@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.40.0.tgz#76240a4ee05e409ad1267854761c53e746e9bcdf" + integrity sha512-cjIzd0hRZFTTh7iLJD6Bciu++Em1iaM1clyG02xRl0JD5DEtDSR1zO02uu+AeM7GSLGOxIvwOkK2j8ySPAOmBA== + dependencies: + "@aws-sdk/node-config-provider" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/util-utf8-browser@3.36.0", "@aws-sdk/util-utf8-browser@^3.0.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.36.0.tgz#f80218f44d90bb39bf1bf9a902599ad1b7c4e6a8" @@ -810,6 +1457,13 @@ dependencies: tslib "^2.3.0" +"@aws-sdk/util-utf8-browser@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.37.0.tgz#d896899f4c475ceeaf8b77c5d7cdc453e5fe6b83" + integrity sha512-tuiOxzfqet1kKGYzlgpMGfhr64AHJnYsFx2jZiH/O6Yq8XQg43ryjQlbJlim/K/XHGNzY0R+nabeJg34q3Ua1g== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-utf8-node@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.36.0.tgz#6404710e4714ed9dcdd954882212151d7a0125b3" @@ -818,6 +1472,14 @@ "@aws-sdk/util-buffer-from" "3.36.0" tslib "^2.3.0" +"@aws-sdk/util-utf8-node@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.37.0.tgz#300912cce55d72c18213190237d6ab943e17b5bf" + integrity sha512-fUAgd7UTCULL36j9/vnXHxVhxvswnq23mYgTCIT8NQ7wHN30q2a89ym1e9DwGeQkJEBOkOcKLn6nsMsN7YQMDQ== + dependencies: + "@aws-sdk/util-buffer-from" "3.37.0" + tslib "^2.3.0" + "@aws-sdk/util-waiter@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.36.0.tgz#8b1437b45c153635803867b569051e072bbbc308" @@ -827,6 +1489,15 @@ "@aws-sdk/types" "3.36.0" tslib "^2.3.0" +"@aws-sdk/util-waiter@3.40.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.40.0.tgz#91c537efc9d0129fb24d9bdab86acbfd797ddf1f" + integrity sha512-jdxwNEZdID49ZvyAnxaeNm5w2moIfMLOwj/q6TxKlxYoXMs16FQWkhyfGue0vEASzchS49ewbyt+KBqpT31Ebg== + dependencies: + "@aws-sdk/abort-controller" "3.40.0" + "@aws-sdk/types" "3.40.0" + tslib "^2.3.0" + "@aws-sdk/xml-builder@3.36.0": version "3.36.0" resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.36.0.tgz#4da2134d9490f07795e86a000251de2508286287" @@ -1042,6 +1713,20 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10" + integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-explode-assignable-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" @@ -1116,6 +1801,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226" @@ -1572,6 +2264,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" @@ -1925,6 +2624,18 @@ resolve "^1.8.1" semver "^5.5.1" +"@babel/plugin-transform-runtime@^7.5.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz#3fe0da36c2f0834bef7c4d3e7f2b2db0ee0c8909" + integrity sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.3" + babel-plugin-polyfill-corejs3 "^0.3.0" + babel-plugin-polyfill-regenerator "^0.2.3" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" @@ -2229,6 +2940,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" @@ -2236,6 +2954,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.0", "@babel/runtime@^7.2.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.8.3", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" @@ -2324,6 +3049,14 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@babel/types@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -2498,33 +3231,138 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== +"@discordjs/collection@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" + integrity sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== + +"@discordjs/form-data@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@discordjs/form-data/-/form-data-3.0.1.tgz#5c9e6be992e2e57d0dfa0e39979a850225fb4697" + integrity sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +"@emotion/babel-plugin@^11.3.0": + version "11.3.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.3.0.tgz#3a16850ba04d8d9651f07f3fb674b3436a4fb9d7" + integrity sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/runtime" "^7.13.10" + "@emotion/hash" "^0.8.0" + "@emotion/memoize" "^0.7.5" + "@emotion/serialize" "^1.0.2" + babel-plugin-macros "^2.6.1" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "^4.0.3" + +"@emotion/cache@^11.5.0": + version "11.5.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.5.0.tgz#a5eb78cbef8163939ee345e3ddf0af217b845e62" + integrity sha512-mAZ5QRpLriBtaj/k2qyrXwck6yeoz1V5lMt/jfj6igWU35yYlNKs2LziXVgvH81gnJZ+9QQNGelSsnuoAy6uIw== + dependencies: + "@emotion/memoize" "^0.7.4" + "@emotion/sheet" "^1.0.3" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + stylis "^4.0.10" + "@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/is-prop-valid@^0.8.8": +"@emotion/is-prop-valid@^0.8.2", "@emotion/is-prop-valid@^0.8.8": version "0.8.8" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" +"@emotion/is-prop-valid@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.0.tgz#29ef6be1e946fb4739f9707def860f316f668cde" + integrity sha512-9RkilvXAufQHsSsjQ3PIzSns+pxuX4EW8EbGeSPjZMHuMx6z/MOzb9LpqNieQX4F3mre3NWS2+X3JNRHTQztUQ== + dependencies: + "@emotion/memoize" "^0.7.4" + "@emotion/memoize@0.7.4": version "0.7.4" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" + integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== + +"@emotion/react@^11": + version "11.5.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.5.0.tgz#19b5771bbfbda5e8517e948a2d9064810f0022bd" + integrity sha512-MYq/bzp3rYbee4EMBORCn4duPQfgpiEB5XzrZEBnUZAL80Qdfr7CEv/T80jwaTl/dnZmt9SnTa8NkTrwFNpLlw== + dependencies: + "@babel/runtime" "^7.13.10" + "@emotion/cache" "^11.5.0" + "@emotion/serialize" "^1.0.2" + "@emotion/sheet" "^1.0.3" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" + integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== + dependencies: + "@emotion/hash" "^0.8.0" + "@emotion/memoize" "^0.7.4" + "@emotion/unitless" "^0.7.5" + "@emotion/utils" "^1.0.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.3.tgz#00c326cd7985c5ccb8fe2c1b592886579dcfab8f" + integrity sha512-YoX5GyQ4db7LpbmXHMuc8kebtBGP6nZfRC5Z13OKJMixBEwdZrJ914D6yJv/P+ZH/YY3F5s89NYX2hlZAf3SRQ== + +"@emotion/styled@^11": + version "11.3.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.3.0.tgz#d63ee00537dfb6ff612e31b0e915c5cf9925a207" + integrity sha512-fUoLcN3BfMiLlRhJ8CuPUMEyKkLEoM+n+UyAbnqGEsCd5IzKQ7VQFLtzpJOaCD2/VR2+1hXQTnSZXVJeiTNltA== + dependencies: + "@babel/runtime" "^7.13.10" + "@emotion/babel-plugin" "^11.3.0" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/serialize" "^1.0.2" + "@emotion/utils" "^1.0.0" + "@emotion/stylis@^0.8.4": version "0.8.5" resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== -"@emotion/unitless@^0.7.4": +"@emotion/unitless@^0.7.4", "@emotion/unitless@^0.7.5": version "0.7.5" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== +"@emotion/utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" + integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== + +"@emotion/weak-memoize@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -2548,6 +3386,56 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.1" +"@ethersproject/abi@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" + integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/hash" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + +"@ethersproject/abstract-provider@^5.5.0": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" + integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/networks" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/web" "^5.5.0" + +"@ethersproject/abstract-signer@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" + integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== + dependencies: + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + +"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" + integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ethersproject/address@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" @@ -2559,6 +3447,22 @@ "@ethersproject/logger" "^5.4.0" "@ethersproject/rlp" "^5.4.0" +"@ethersproject/base64@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" + integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + +"@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" + integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + bn.js "^4.11.9" + "@ethersproject/bignumber@^5.4.0": version "5.4.2" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" @@ -2568,6 +3472,13 @@ "@ethersproject/logger" "^5.4.0" bn.js "^4.11.9" +"@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + "@ethersproject/bytes@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" @@ -2575,6 +3486,13 @@ dependencies: "@ethersproject/logger" "^5.4.0" +"@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" + integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/constants@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" @@ -2582,6 +3500,28 @@ dependencies: "@ethersproject/bignumber" "^5.4.0" +"@ethersproject/hash@^5.0.4": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" + integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/keccak256@^5.0.0-beta.130", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" + integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + js-sha3 "0.8.0" + "@ethersproject/keccak256@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" @@ -2590,11 +3530,30 @@ "@ethersproject/bytes" "^5.4.0" js-sha3 "0.5.7" +"@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + "@ethersproject/logger@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== +"@ethersproject/networks@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.0.tgz#babec47cab892c51f8dd652ce7f2e3e14283981a" + integrity sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" + integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== + dependencies: + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" @@ -2610,6 +3569,14 @@ "@ethersproject/bytes" "^5.4.0" "@ethersproject/logger" "^5.4.0" +"@ethersproject/rlp@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" + integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/signing-key@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" @@ -2622,6 +3589,27 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/signing-key@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" + integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" + integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/transactions@^5.0.0-beta.135": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" @@ -2637,6 +3625,32 @@ "@ethersproject/rlp" "^5.4.0" "@ethersproject/signing-key" "^5.4.0" +"@ethersproject/transactions@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" + integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== + dependencies: + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + +"@ethersproject/web@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.0.tgz#0e5bb21a2b58fb4960a705bfc6522a6acf461e28" + integrity sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA== + dependencies: + "@ethersproject/base64" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" @@ -2711,6 +3725,21 @@ unique-filename "^1.1.1" which "^1.3.1" +"@fontsource/open-sans@^4.5.0": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.5.2.tgz#6953650035d5b42be645013b1465544d0af49d7d" + integrity sha512-aDQrW8s0KslG2aKb9nM5R6fiQR9iPomqWXf6iZCC30qv/UFlSY14SppodA3rE//+w37EqsJjyUq3BSEYzLdisg== + +"@fontsource/roboto@^4.5.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-4.5.1.tgz#63f7b783f755d8f6727eb60198627e7e1be3ac20" + integrity sha512-3mhfL+eNPG/woMNqwD/OHaW5qMpeGEBsDwzmhFmjB1yUV+M+M9P0NhP/AyHvnGz3DrqkvZ7CPzNMa+UkVLeELg== + +"@fontsource/sora@^4.5.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@fontsource/sora/-/sora-4.5.0.tgz#bfd505c063fbfd77b42b1a8a05025aac52d4ea5f" + integrity sha512-bXr7HZPHh/dtfcp9UfEIrYhiMzmcsGvooz9kkmxi5iYwuqs4O1YWfkNbbPSMoRH/cucrMtlGUuC9eRbFx4Yn5Q== + "@gar/promisify@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" @@ -3280,6 +4309,16 @@ "@json-rpc-tools/types" "^1.7.6" "@pedrouid/environment" "^1.0.1" +"@ledgerhq/devices@^6.11.2": + version "6.11.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.11.2.tgz#a0413b087f7c07adf2a91d23f84a4580cdbb36fe" + integrity sha512-j2SoG0Ifm7khsPKC2UFhJIoi1oCDCvJemmO+pz7Oc9jx8JRhIGtCfqEIUhL+ZIl0TrIYuApPLaSqJjiFi7VGCQ== + dependencies: + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/logs" "^6.10.0" + rxjs "6" + semver "^7.3.5" + "@ledgerhq/devices@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.3.0.tgz#7ee59614198882311d1805912e368451527d05b2" @@ -3290,6 +4329,11 @@ rxjs "6" semver "^7.3.5" +"@ledgerhq/errors@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.10.0.tgz#dda9127b65f653fbb2f74a55e8f0e550d69de6e4" + integrity sha512-fQFnl2VIXh9Yd41lGjReCeK+Q2hwxQJvLZfqHnKqWapTz68NHOv5QcI0OHuZVNEbv0xhgdLhi5b65kgYeQSUVg== + "@ledgerhq/errors@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.2.0.tgz#7dc2b3bf6bdedccdaa1b97dccacfa912c4fc22f8" @@ -3305,6 +4349,25 @@ "@ledgerhq/hw-transport" "^6.3.0" "@ledgerhq/logs" "^6.2.0" +"@ledgerhq/hw-transport-webusb@^6.3.0": + version "6.11.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.11.2.tgz#d190709881e50f8c271efe956705b05e46b4649d" + integrity sha512-ReiYoypXybLQi1ekA+YQqsvbSj0wwTFH7Lg690eUkqZydjDd4lMjpZk7lDczsXp3wxTjE/mdAQ0bpNwZWmPTJw== + dependencies: + "@ledgerhq/devices" "^6.11.2" + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/hw-transport" "^6.11.2" + "@ledgerhq/logs" "^6.10.0" + +"@ledgerhq/hw-transport@^6.11.2": + version "6.11.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.11.2.tgz#247d0297f96db9d255672a453a1e621ade92096f" + integrity sha512-VZbGfyQ8iFl2W6TUkVmQ3rz8kyOXMbOdFiht3VNlglMe3KBGJWOjW9s/5LhOR348NJs797B1gl4V0Zqmn11kUg== + dependencies: + "@ledgerhq/devices" "^6.11.2" + "@ledgerhq/errors" "^6.10.0" + events "^3.3.0" + "@ledgerhq/hw-transport@^6.2.0", "@ledgerhq/hw-transport@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.3.0.tgz#4fc966b1a68c991c0a6b5384841f99c4f8304ce9" @@ -3314,6 +4377,11 @@ "@ledgerhq/errors" "^6.2.0" events "^3.3.0" +"@ledgerhq/logs@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1" + integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw== + "@ledgerhq/logs@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.2.0.tgz#9fb2d6f1811316697f7b3cc14607f6c608912419" @@ -4032,6 +5100,13 @@ dependencies: tslib "^2.0.3" +"@mailchimp/mailchimp_transactional@^1.0.46": + version "1.0.46" + resolved "https://registry.yarnpkg.com/@mailchimp/mailchimp_transactional/-/mailchimp_transactional-1.0.46.tgz#ddc9efb12d0ee13e788d47d1ffeea4fe50bad3cf" + integrity sha512-qS+aIciHeMjeKfSsHvlF0PEp/lKiBIhrwLJLTORkNmky/4Sz2NwWnKEvME2ziZ9+2ztCH/KlanUVvMrVerc9jQ== + dependencies: + axios "^0.21.1" + "@mapbox/node-pre-gyp@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz#2a0b32fcb416fb3f2250fd24cb2a81421a4f5950" @@ -4138,6 +5213,681 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" +"@material/animation@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-13.0.0.tgz#42ec7aee6548ba27edb49063c7a7ae431e4ef450" + integrity sha512-YR0/u4u56qXDjKYolQ7F+IvlPkaSBhMl/dZv8DK0FbD6PH4ckOPd3bEXNRndXtprsxwknQQP2pttjPImylkl0g== + dependencies: + tslib "^2.1.0" + +"@material/auto-init@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-13.0.0.tgz#892e4856ab630a5c9fea3a5fe3fb7205861a4d52" + integrity sha512-9ayedaqg7dixjRjmLZWZgQmB1RDtxCUTPjnttdgdZQ0/sUKtmqvTzEW4ZNjJsr42XaXR4atlkjjvMIT5LCnw6g== + dependencies: + "@material/base" "^13.0.0" + tslib "^2.1.0" + +"@material/banner@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/banner/-/banner-13.0.0.tgz#853e01977433ca7f0d991d198bc91e1b54adedac" + integrity sha512-59M85ezhwRaa+BqguYCCaRS57fV5KQe3Ff2cU6LcQNw0UPMFW1ap0dZ+iZBv/sj+7/QcqBBShL9uu8dWKtI4Gg== + dependencies: + "@material/base" "^13.0.0" + "@material/button" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/base@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-13.0.0.tgz#18f7f5ac112bf67e66c1ade6ab543ea9df9d3836" + integrity sha512-vFx0JryRfcvUNX3cZ2u32wUMvxzd+c/YW0LFOXNgqCDWlubHcMm0Y6Wz371LhfQo80/NE69u+/4Joo99yKnVeg== + dependencies: + tslib "^2.1.0" + +"@material/button@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-13.0.0.tgz#0870da4069fb92dd5c3dbbaf1b58bcb62bb9dbed" + integrity sha512-lYorht6fcEd4P+dsLVp2BGtaY5cGYNp71LMajuDe71GZX3dZPoKeVvb+Ie1S7vcB+o+WLTeaisMk9/vA4gfi8A== + dependencies: + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/card@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/card/-/card-13.0.0.tgz#875d60b398898b6f3a6ff115717f0c144b681bf3" + integrity sha512-ooJUOt1Viv99Dyz4rhz9ZZbfa996eHh3RUuXkPRkT66Btd5TzpdqsQWKwOVc5bgbgWqzhDWQ6A/aQdYqH97ccg== + dependencies: + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/checkbox@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-13.0.0.tgz#ee7ca7930586102a748998239672f62724a90ad9" + integrity sha512-tRC6n9Jq7GgdU0d1F8NOvUy6WiRZR58tUgL1QqoiQK9PGKSt0dAF3Aa48uubO7/Lt9K4NqgwV6/OeHv8pHaM/w== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/touch-target" "^13.0.0" + tslib "^2.1.0" + +"@material/chips@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-13.0.0.tgz#0681beaf61636805ddfd98b45bf7bf3b81dcb238" + integrity sha512-Ov4runDbrROUpMqKyCi3lpknfrLzGwtV+/rfYIgTYUkEVpCHXHddxXxcjP4zqh3QLXnE6ma92PLGcxCb/zzogQ== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/checkbox" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/circular-progress@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-13.0.0.tgz#ad90b88d1e88d522f7492ded4eaaac56376ce2aa" + integrity sha512-jSbr0ywY2N6s05tyqTXl/cG339C+qU3ck3FwXUq5SJup8CWT0AoJ8EG/CD10CEhNH8nH9Iwstve95oNgIt8G4g== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/progress-indicator" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/data-table@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-13.0.0.tgz#b305cdb31eec7722df6a94a78ea3a838b0f0389b" + integrity sha512-Z3yEq1T6Om/A3ntPw0bd40dqtOR4H3++pvchgW35kq+V9xDLL0hfzmuiy0QH4plA2ZsFYJxjt02k/SRvnkjKPQ== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/checkbox" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/icon-button" "^13.0.0" + "@material/linear-progress" "^13.0.0" + "@material/list" "^13.0.0" + "@material/menu" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/select" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/density@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-13.0.0.tgz#5ae2fdec0418775014fed24e7ccdd5ba5d005d54" + integrity sha512-ppJTzOsuhjQam5GvHaq/XZocZNUr+41XQ2sd5nONAmQ0wwzXgqG0FaxtF1EXqK3uZFadz+vAu6enagre9DXhTA== + dependencies: + tslib "^2.1.0" + +"@material/dialog@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-13.0.0.tgz#59b8b7295bfdfea9ea72af9afa7c99efb7744d55" + integrity sha512-1Ggo9Bid94F1ttZJKSjIcgMvkVQtKsqwbqLs5cWlleaiwtAcwUE12XA2B1MNj8xM9ajU3BJm4GigupBOK1jGHQ== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/button" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/icon-button" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/dom@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-13.0.0.tgz#3f3cc935f6e59fa99e3dafe118d3e48091118c0e" + integrity sha512-M9HLAYBZtkTUvf66FL+jAEvUOdhji1HkGA1mV6oyE+HY9gkCkmso+mngvzlLd5+uaAVE9I3WQFhSb9gp0cpXnw== + dependencies: + "@material/feature-targeting" "^13.0.0" + tslib "^2.1.0" + +"@material/drawer@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-13.0.0.tgz#35bb370f44ac860ca38ce722144869edc86da9f9" + integrity sha512-TIV/K9MED3ymngmKrdLwOMhUF44BzoR6HuTVsZAM4bgy0sfSv+jzgaGUqJsvjEhTXk+Q9OTEge+TsU/ETzQCbg== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/list" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/elevation@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-13.0.0.tgz#ae3eabc20e864240144fdf5c16b09a1e7a52852c" + integrity sha512-hzdblgamVRbC0UwKafcvUVDvKzMiOSveDiwGgFk+EAg/tZRdwMlQPyf/9I6Lr8Cw/pNGnEOPhmCDOYPOHimr0w== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/fab@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-13.0.0.tgz#fa8cf548b7c90a592760569385aff3a816c59d2d" + integrity sha512-qOi+XWEZWUR5T961UjSorgqm5VaanuZtRN3nsrKqHH1p0L8fYRc3qkGIChlaY9p7BcOYMCynXJzT+MfELVrcwA== + dependencies: + "@material/animation" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/feature-targeting@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-13.0.0.tgz#7bc7840b40930b6831101a22882acdd0329591c0" + integrity sha512-QJClfeaA4EMyAxKJy9WR0Nx+/VwSZCkhGLUVBG9NhxqYGfl/LtaeaidrNm32vYEoNZAofN92VD2RwQTRwp/dMQ== + dependencies: + tslib "^2.1.0" + +"@material/floating-label@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-13.0.0.tgz#d441461591101de7821a06c595cbc2ca0ede2be2" + integrity sha512-imAPamD97QrizVCOpxjr3UfQJyDBpEEhDBSbEbKLrCpqG3jQx4/My5rNKKVGWjxUiBYgBA1dhkn98RRX5tGBtQ== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/form-field@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-13.0.0.tgz#59f50b342bc20562fa2c78c17ac4385236f89c99" + integrity sha512-cXs5uYA89KgrXrU1UYkl52JizeIK3Mx9LjBw4ZYiyQJzFaBTPYsYWGSJMad1HZhWlRiigGTyN1M9ePIxtBpi0Q== + dependencies: + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/icon-button@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-13.0.0.tgz#e2d3fb5dcd2b944883f8241420b82f0f3ce2ebf2" + integrity sha512-SdxFytWvbfN0fj7jHFq3DqK5/Zoms+Ipuv6fI8AzwgDFe7mXJ2euPahN+3XcmJ3BaSMyfYsdbcYdCWs8bgHW1w== + dependencies: + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/touch-target" "^13.0.0" + tslib "^2.1.0" + +"@material/image-list@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-13.0.0.tgz#8a1da68ebd53ff0123f071c49691ffde4c369fca" + integrity sha512-D78QKpK5JmO6zrbsSYt1YfRlkqzzduDTe6BstS0efUFS1CA11hrqwQFoMaR1L1dw2U3CQ/CP22bBMSZVV9aU6A== + dependencies: + "@material/feature-targeting" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/layout-grid@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-13.0.0.tgz#8c7534b1c1b78978cd2beabee32a9e2e37dc9522" + integrity sha512-9L1BVLRIyetm/AOC+59+yca6R0OO2AJKHiUMdZrxgUVjqVblqWXEMeONZqslFRGHBiSIaYdrDIhn4ZTYY6tKUA== + dependencies: + tslib "^2.1.0" + +"@material/line-ripple@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-13.0.0.tgz#9754af8f80eac582d6a9b2ec704852d394266c31" + integrity sha512-5djBRXrd1+SiMVUTWr4rD6xv+/qTaGGmgUS5GytBE5mczvnEwcPmM4PzF+HNj2TS+wvNvIfRjRmUzWO2Z6w2lA== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/linear-progress@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-13.0.0.tgz#a1c12140c2074018029425365d121013a70f3ec6" + integrity sha512-FJpP6flSME5QRPfkB616uA5bk9aMKJBqkklrHk6dSMZaTKbiHRmc6faxMIZ4w9W49JFMXaSwzC39y96tQTiRQg== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/progress-indicator" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/list@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-13.0.0.tgz#57a77aeff4d177da76f9d849f9e1db0d17027c9c" + integrity sha512-poq4WNDEfW6Z3YPAn3wdBX4RSkj3A83Pht6984MmG8YJZMlq34ftHECw37VcdmFJIyRPdpZqywJo/i7CxsSAgQ== + dependencies: + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/menu-surface@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-13.0.0.tgz#b4c6c799e714cba6465513dbf1020ba2fcaee588" + integrity sha512-Irfnk0l8AO7z8ucilbBzZI8izbFV/aK1GbiPpT1SmZuKkL1z+04rB2HpB+OqwaBixdLTDq70AyawcnQ0MACeXQ== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/menu@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-13.0.0.tgz#60fdca3f3a8457dfee83938adaf6288789ad0ac1" + integrity sha512-RY9R2ubYU6a7WRJW3nWr/AoSzdrxwUGqkfJSx0U9M/wK1vbXYYcJ7eCXFzSpa5VrstE7of7PbyYtQ8V61tILEQ== + dependencies: + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/list" "^13.0.0" + "@material/menu-surface" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/notched-outline@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-13.0.0.tgz#0a043cb87fc9aa19b00a1a9b7c010eab8250b820" + integrity sha512-BHdxr1x2AN4oqycTNg0FGisG3rMHf50z3MuyUoQsJJ3WGjxBMWKd0yK/xl4m38nFKPg1vQnzyHIYTJdRpCaE7A== + dependencies: + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/floating-label" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/progress-indicator@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-13.0.0.tgz#8097208c5fa3dd6753d8b7bf141c28beb0938c23" + integrity sha512-IfhAMn03gWg/Rl0Bg26Q1g+DrMnaULllz+ZJeIY7BXZC5qFYq1fLq4+RiQmfPGlJfURUjrWNLcI1VDVyXUHHzg== + dependencies: + tslib "^2.1.0" + +"@material/radio@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-13.0.0.tgz#4f3f4c3c56ed3686d7bf69b9a611249cfa6db71c" + integrity sha512-6jeZ+dKSzBB/j2IZ7RjFl5mrB+EWnpv/x+U9w6ENLCdueM4+LKUqBAc2fC2WMycsqgoFnlB0xsO/sG+kN0J6fw== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/touch-target" "^13.0.0" + tslib "^2.1.0" + +"@material/ripple@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-13.0.0.tgz#fc6a56ccd33c1edf3f049d9e79294f496c2d72df" + integrity sha512-hx4B40hB2rRfsGwf1jwo2GGlYDq0yUQjcMcMmXfQipPJNpQhy8ylmXKc1DBjmWf7EQ/MgbfCSYwPrYXrbGP31w== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/rtl@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-13.0.0.tgz#c8dbdc2b63d122450ff456572d08a9f5639704ab" + integrity sha512-nFGy3iQg7k+xLs67eb86mRFVLwa0yi7MusqRK4OM8DXcLO5yoVfUTPKpdSykcbRryp9imVHsxutox2tZawR4og== + dependencies: + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/segmented-button@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-13.0.0.tgz#92ca6541087a2b45a32aec8e4dfe7f2881341629" + integrity sha512-cbjSzkGms+MB6e7ZF6Toc0kpIor4qFm3ueY8KGRIbpvPoJuHfDy6wqIUhwpfAibSpcaDSnCKg1m+hEtyplZPkQ== + dependencies: + "@material/base" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/select@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/select/-/select-13.0.0.tgz#0bd1933c983ec86440bd5a5540e25aeba3918868" + integrity sha512-wVprsSMicU/l+LAqXdOU+qdzzdHupLXpWWQo2Rsk8G6AxL1Zna+/+ETnRlDdr2wHHK/KNDXSBdmuCcoEIRshcA== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/floating-label" "^13.0.0" + "@material/line-ripple" "^13.0.0" + "@material/list" "^13.0.0" + "@material/menu" "^13.0.0" + "@material/menu-surface" "^13.0.0" + "@material/notched-outline" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/shape@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-13.0.0.tgz#42751ceb4c709c87026f14340aed1831106fdfda" + integrity sha512-exk96+iCjzCujk3aSrvIMhmW773s1Tc0h+MbQKbt6Iv3nHJCyLSiRbxclCHXWHrVwG/9KZRkrt/g2qk7P3VRBg== + dependencies: + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/slider@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/slider/-/slider-13.0.0.tgz#21575e99bc9700b56d44bb5ee1b63b4a0545e412" + integrity sha512-PW+3X9MiOoWmXhirYo/Mk2UYW00Tnsihrx5YJQ4+IxwbrUI75/8yUsO8kVr7YC+Eqhldz8oXzhIXglQFtbpolQ== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/snackbar@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-13.0.0.tgz#63798b832c6931ecb99350c9ef99ac23a7e47f18" + integrity sha512-z59aYCeMWWEbsUU04QDZN4CxzCCOp3OIc5tzrdqnY3qRq4wwApxncf7RKKKSU2K6WTEWfdHHOc7aNX8kqlDmUg== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/button" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/icon-button" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/switch@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-13.0.0.tgz#9f25a6fc2a45344ecdc86f6545e95359f5f0c770" + integrity sha512-zbdo6nKEOAx24ILCBobZlQqU2WZ+KuPgdAc1VTI1q1BCKN3rDIfm9RnsCuYiZa9iaq4UUgdYuhH8KVEYGP7Lrw== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + tslib "^2.1.0" + +"@material/tab-bar@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-13.0.0.tgz#e0ba597b507a5b62aac91837d96458dd250cee14" + integrity sha512-GLODDvwKiN867weT+WiSR/4Oum2hw0Ipl1vcJxtZeE6C3PmGWBE316j8a5DLYvf9bjIPLYLNLUzLU3QnJB6T5w== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/tab" "^13.0.0" + "@material/tab-indicator" "^13.0.0" + "@material/tab-scroller" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/tab-indicator@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-13.0.0.tgz#e79d06b888ac8c625dabc6c9288eb3ced70adaa5" + integrity sha512-T6Q4zCdl374rQgNLrAIc8+sy8ax6fbNTZRb+oJgShzjVz4wH9OLk6LX1RREHEeWiZt69nTqeR4yU6/6xFX+Kjw== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@material/tab-scroller@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-13.0.0.tgz#0bbe9e77cebb3a0d6607e86216de69df2e7fddc7" + integrity sha512-SHdNXTLrNA47RbTNOQa67DbQjw0qrf1h0OuoESXHMU/B7QQvhAOqnHpU32/LdCP+gvc7EdZjolVQgk3WphDcQA== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/tab" "^13.0.0" + tslib "^2.1.0" + +"@material/tab@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-13.0.0.tgz#3b616e1f1679977a943f8aba81c02746299a6028" + integrity sha512-7tziMFiyiFZner39h6ue6A6rfJhz8LDyeVPYfdAMe8ZO8GT+PczDr5yuectamR8fNBE7Fk9Bj/KvIOx+LjKgDg== + dependencies: + "@material/base" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/tab-indicator" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/textfield@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-13.0.0.tgz#64cd2677ed954a0287b6e5b7b07dbdbf07328ef0" + integrity sha512-CzodrOqx8wzj2AQngMpISURJID4jVOHf4CtiPoj32LG8bWLn5ZfAAX2aA2rO6NPyDYsFm0aEnlfMhnDwQyPoYw== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/floating-label" "^13.0.0" + "@material/line-ripple" "^13.0.0" + "@material/notched-outline" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/theme@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-13.0.0.tgz#dad25ca7c3427d5d35f074343c7f7957cbc1eb8c" + integrity sha512-KAe1s0MvvfCGAwJliDVTvgAKuD3ESwhl7F7br4Iam4IPdqME2rWl8NPhKHFfaWqTG7PyCgMMngYEYuA8cLNTsA== + dependencies: + "@material/feature-targeting" "^13.0.0" + tslib "^2.1.0" + +"@material/tokens@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-13.0.0.tgz#dbd85201dca575b79fe03788479e77b913d20f9c" + integrity sha512-t55CKVeAjABdSQCKjsvYvqrA6Z4f5varLpLloai8ZQU0giSl7qbUczV1i8y2pSOzpRTswD5JKM7a19qfsl/TCA== + dependencies: + "@material/elevation" "^13.0.0" + +"@material/tooltip@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-13.0.0.tgz#2a4360b1d9b07b7573d69e2a85d5522dec00b97d" + integrity sha512-/QinwEM0sYtRUthgOy7R+V4iwLMZ8SCd8A3PyGyTr27BUGWykwAUFdXyzT4rxLhDNcnDOYH14N+Z3Bom+UwO9Q== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/top-app-bar@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-13.0.0.tgz#c4f8af665ed25b5db35083bf5253bb6bd161cae5" + integrity sha512-NTbIbBmoo4wfbBwW+9XMmjYQJ3e7NJ9P/ahTszYuzYDyWNcc3m8G/A0zM+1LBmoze3rP/QTxcaJUH/A5/3ufXA== + dependencies: + "@material/animation" "^13.0.0" + "@material/base" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/typography" "^13.0.0" + tslib "^2.1.0" + +"@material/touch-target@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-13.0.0.tgz#330d0b03988f65916cce3a97f38c5b9d74104a27" + integrity sha512-2BMjj+nwKIYG7cZZGcNuRSKo53knqDu9ksv9wLidxjLgzqXBd1v9gdXsqMRQXepoOqftWGmYMaRYI0xMnxt6lA== + dependencies: + "@material/base" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/rtl" "^13.0.0" + tslib "^2.1.0" + +"@material/typography@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-13.0.0.tgz#da40615bddea8c56496a89b3a6f8f71c1fccce96" + integrity sha512-UfaK4vT3LmGiiySf2RVIrf7fJZa6EJadFwo4YUMJx9bvUMRlBm1oI8Vo9fYpKdLfuSTeA+2BlgbwYVObj3laFw== + dependencies: + "@material/feature-targeting" "^13.0.0" + "@material/theme" "^13.0.0" + tslib "^2.1.0" + +"@metamask/obs-store@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@metamask/obs-store/-/obs-store-7.0.0.tgz#6cae5f28306bb3e83a381bc9ae22682316095bd3" + integrity sha512-Tr61Uu9CGXkCg5CZwOYRMQERd+y6fbtrtLd/PzDTPHO5UJpmSbU+7MPcQK7d1DwZCOCeCIvhmZSUCvYliC8uGw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + through2 "^2.0.3" + +"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== + "@metaplex/arweave-cost@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@metaplex/arweave-cost/-/arweave-cost-1.0.4.tgz#35d5d10dfc855463fc7fe18594e175506a4a35d4" @@ -4154,6 +5904,92 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@mui/core@5.0.0-alpha.54": + version "5.0.0-alpha.54" + resolved "https://registry.yarnpkg.com/@mui/core/-/core-5.0.0-alpha.54.tgz#2c04163552ac536e2026778cc7f7435ce004ba1b" + integrity sha512-8TxdHqDdSb6wjhsnpE5n7qtkFKDG3PUSlVY0gR3VcdsHXscUY13l3VbMQW1brI4D/R9zx5VYmxIHWaHFgw4RtA== + dependencies: + "@babel/runtime" "^7.16.0" + "@emotion/is-prop-valid" "^1.1.0" + "@mui/utils" "^5.1.0" + "@popperjs/core" "^2.4.4" + clsx "^1.1.1" + prop-types "^15.7.2" + react-is "^17.0.2" + +"@mui/icons-material@^5.0.1": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.1.0.tgz#f733c9505422398b9b56ec9ed04e53db5985e5e0" + integrity sha512-GD2cNZ2XTqoxX6DMUg+tos1fDUVg6kXWxwo9UuBiRIhK8N+B7CG7vjRDf28LLmewcqIjxqy+T2SEVqDLy1FOYQ== + dependencies: + "@babel/runtime" "^7.16.0" + +"@mui/material@^5.0.2": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.1.0.tgz#43382d51957b82bb0d102f1c3c1947246ecbc29c" + integrity sha512-K76v7zRhpJToInSI8sRcEmTwpVFBZ223VIusjZRKXN8JzX+PuErG7skfa1yUuhc3f4VEqcYYUw0LvI+DJJ05eg== + dependencies: + "@babel/runtime" "^7.16.0" + "@mui/core" "5.0.0-alpha.54" + "@mui/system" "^5.1.0" + "@mui/types" "^7.1.0" + "@mui/utils" "^5.1.0" + "@types/react-transition-group" "^4.4.4" + clsx "^1.1.1" + csstype "^3.0.9" + hoist-non-react-statics "^3.3.2" + prop-types "^15.7.2" + react-is "^17.0.2" + react-transition-group "^4.4.2" + +"@mui/private-theming@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.1.0.tgz#44d6a8b75d76c6067b7996993c23b985a457788d" + integrity sha512-RWzpvwZTNoCUlWFtf7uMDY4QkNL6pI3V2Ac4MZeVzJr3DLluQrt0JjUdsy8CVS7HCTp1YGiyZsJ7H8PfR9jIOw== + dependencies: + "@babel/runtime" "^7.16.0" + "@mui/utils" "^5.1.0" + prop-types "^15.7.2" + +"@mui/styled-engine@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.1.0.tgz#9f25606505c94e7364bdc9e5d5520cbac1daef2a" + integrity sha512-Z27hexqYL21z+iVat47n1E/Tj4r83JK6hXaOFj2rYMYz0lJQ6YGLF+c2B3NNJoglL76Vo0w4yKC63FsO+015kw== + dependencies: + "@babel/runtime" "^7.16.0" + "@emotion/cache" "^11.5.0" + prop-types "^15.7.2" + +"@mui/system@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.1.0.tgz#7fef622486fa17755e4352f16fbae0d7a72150a3" + integrity sha512-1h+YDnPGfTWZkf7lgeNV+vw6altxXGLclXLdxs9GPzEMNYXX7xveUjmndYpO1p/yx7GNG2gLWWkFZ1TYCeo4+Q== + dependencies: + "@babel/runtime" "^7.16.0" + "@mui/private-theming" "^5.1.0" + "@mui/styled-engine" "^5.1.0" + "@mui/types" "^7.1.0" + "@mui/utils" "^5.1.0" + clsx "^1.1.1" + csstype "^3.0.9" + prop-types "^15.7.2" + +"@mui/types@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.0.tgz#5ed928c5a41cfbf9a4be82ea3bbdc47bcc9610d5" + integrity sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ== + +"@mui/utils@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.1.0.tgz#876951933b77828925ad9502a16070497664aae6" + integrity sha512-TbAa3DZBGE6xjrVsQ6e0Iw0jwgGZqPg/48aZJJWXJJjU8NU5OhBRutYhrk/kbdDRmsIArHNdpJayBSi7yETYvg== + dependencies: + "@babel/runtime" "^7.16.0" + "@types/prop-types" "^15.7.4" + "@types/react-is" "^16.7.1 || ^17.0.0" + prop-types "^15.7.2" + react-is "^17.0.2" + "@next/env@11.0.1": version "11.0.1" resolved "https://registry.yarnpkg.com/@next/env/-/env-11.0.1.tgz#6dc96ac76f1663ab747340e907e8933f190cc8fd" @@ -4350,12 +6186,103 @@ resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== dependencies: - ansi-html "^0.0.7" - error-stack-parser "^2.0.6" - html-entities "^1.2.1" - native-url "^0.2.6" - schema-utils "^2.6.5" - source-map "^0.7.3" + ansi-html "^0.0.7" + error-stack-parser "^2.0.6" + html-entities "^1.2.1" + native-url "^0.2.6" + schema-utils "^2.6.5" + source-map "^0.7.3" + +"@popperjs/core@^2.4.4": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590" + integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== + +"@portis/web3-provider-engine@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@portis/web3-provider-engine/-/web3-provider-engine-1.1.2.tgz#97f383156ea6b70fba69ae93a945fdd94159b1ba" + integrity sha512-NiiF0UPfngf4ulo32ybEDAMaad4i7h44HJaN8ea8HHt/vaFiUcPtINjC2o21jhWaLANerW4ZbOrNs1iCLH4p6A== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.2.0" + eth-json-rpc-filters "^4.0.2" + eth-json-rpc-infura "^3.1.0" + eth-json-rpc-middleware "^5.0.2" + eth-sig-util "2.5.3" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +"@portis/web3@^2.0.0-beta.54": + version "2.0.0-beta.59" + resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-2.0.0-beta.59.tgz#2e5292d8e1daf6070aa3b4a8cb33c1a9e0315011" + integrity sha512-QdIdrI3uK+TyT+dxRK5bEYOi2PBlUDJ7vszR2uu0bT49wy7O52B9td6fL/5gsfk0VpCsmrYov3x3gEQYwGUyvQ== + dependencies: + "@portis/web3-provider-engine" "1.1.2" + ethereumjs-util "5.2.0" + penpal "3.0.7" + pocket-js-core "0.0.3" + +"@progress/kendo-popup-common@^1.2.2": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@progress/kendo-popup-common/-/kendo-popup-common-1.8.0.tgz#02ec32974762f30bdb2bb968e3c5b73c76c82c33" + integrity sha512-/cu0nV+3tHKPEE/bUbJTJHv6t8BMYpwI3uVOYENASYy+ZK1dlOfuRhdpSGH85glAH6NMtr/5pYOPojuXFFz/8A== + +"@progress/kendo-react-common@4.10.0", "@progress/kendo-react-common@^4.9.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@progress/kendo-react-common/-/kendo-react-common-4.10.0.tgz#ef62da76f645553c96082996cf63f1a8e1c8937f" + integrity sha512-EJrBveeeBURypt3j4qcxp6oWIJf5cDNwkNtblSHuy8y7VjQLYxUZdv4GDxS0k/qbzDbJw2CCXkJdFcDdsarePg== + dependencies: + "@telerik/kendo-draggable" "^2.2.1" + prop-types "^15.6.0" + +"@progress/kendo-react-grid@^4.9.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@progress/kendo-react-grid/-/kendo-react-grid-4.10.0.tgz#d6112e011e8a41d0299d56de500c692b2db593cd" + integrity sha512-oDHBYnUbMtEPP1zTY+lWuVsvPyP5DNuDlAB8wY4R5+RxyR52JI0Mg6KrkFSi5clprPaWPP804KmsMgzvTmIpRQ== + dependencies: + "@progress/kendo-react-common" "4.10.0" + prop-types "^15.6.0" + +"@progress/kendo-react-inputs@^4.9.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@progress/kendo-react-inputs/-/kendo-react-inputs-4.10.0.tgz#093aac031431703a066d408b02f5b2710551800c" + integrity sha512-jBGuSiGqKRlJkxWISt0Ez5o6dVeqRYygHKpkyqr7wdffELkuP1ODU50J0YY5GlmlPzASmDn1kgo3woSHd4hbAA== + dependencies: + "@progress/kendo-react-common" "4.10.0" + "@progress/kendo-react-labels" "4.10.0" + "@progress/kendo-react-popup" "4.10.0" + prop-types "^15.6.0" + +"@progress/kendo-react-labels@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@progress/kendo-react-labels/-/kendo-react-labels-4.10.0.tgz#973348c18016b15a1fee7d3f52d9fe1190b3a34d" + integrity sha512-EbgOo0NF5YIbsO2y07Fhh92EcJZ8YtCUIl0kJ9NC1n/OIDOQvm17KLFUvEh+KiAlamZz1rs7CusyhMUiGSeUbA== + dependencies: + "@progress/kendo-react-common" "4.10.0" + prop-types "^15.6.0" + +"@progress/kendo-react-popup@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@progress/kendo-react-popup/-/kendo-react-popup-4.10.0.tgz#9167599116ac34dbdee2c7ae8edfa4370a2f59a4" + integrity sha512-985QnOFPxvrTmtoruVB/m217wt0CTkRckyi+stFFunPgopeLDfqowVGOtl+y9avy2cZikFnaq4jx1cZP9fWiZw== + dependencies: + "@progress/kendo-popup-common" "^1.2.2" + "@progress/kendo-react-common" "4.10.0" + prop-types "^15.6.0" "@project-serum/anchor@^0.11.1": version "0.11.1" @@ -4497,6 +6424,16 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= +"@reduxjs/toolkit@^1.6.1": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.6.2.tgz#2f2b5365df77dd6697da28fdf44f33501ed9ba37" + integrity sha512-HbfI/hOVrAcMGAYsMWxw3UJyIoAS9JTdwddsjlr5w3S50tXhWb+EMyhIw+IAvCVCLETkzdjgH91RjDSYZekVBA== + dependencies: + immer "^9.0.6" + redux "^4.1.0" + redux-thunk "^2.3.0" + reselect "^4.0.0" + "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" @@ -4613,7 +6550,7 @@ buffer-layout "^1.2.0" dotenv "10.0.0" -"@solana/wallet-adapter-base@^0.4.1": +"@solana/wallet-adapter-base@0.4.1", "@solana/wallet-adapter-base@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.4.1.tgz#3264220c7eef5abaf7eca0e77cc51403f4f0fcf6" integrity sha512-VkMB0g89FNnfBY3PSrZh6gULWvLcvAUrQtAzKpojYdkSxL/Cm2sH9JsLylXXhT0r1vOvEc72aR/otwrX5YHm2g== @@ -4957,6 +6894,11 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" +"@telerik/kendo-draggable@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@telerik/kendo-draggable/-/kendo-draggable-2.2.1.tgz#27d86fd5b3273676b744bd82dbcebfffd911ad5c" + integrity sha512-qmuRJnjByOIjSKi0BKYK7fJ/+ITgL0aumc4IRIEwiYAQgDJWumuSpAOp2p8ctIWzP0JfEUmITs6ziJaoyKIYwQ== + "@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" @@ -5014,7 +6956,22 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@*", "@testing-library/react@^11.1.0": +"@testing-library/jest-dom@^5.14.1": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.15.0.tgz#4f5295dbc476a14aec3b07176434b3d51aae5da7" + integrity sha512-lOMuQidnL1tWHLEWIhL6UvSZC1Qt3OkNe1khvi2h6xFiqpe5O8arYs46OU0qyUGq0cSTbroQyMktYNXu3a7sAA== + dependencies: + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^4.2.2" + chalk "^3.0.0" + css "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@*", "@testing-library/react@^11.1.0", "@testing-library/react@^11.2.7": version "11.2.7" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== @@ -5038,6 +6995,13 @@ dependencies: "@babel/runtime" "^7.12.5" +"@testing-library/user-event@^13.1.9": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" + integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/user-event@^7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" @@ -5060,6 +7024,14 @@ optionalDependencies: secp256k1 "^3.8.0" +"@toruslabs/fetch-node-details@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/fetch-node-details/-/fetch-node-details-4.0.0.tgz#f4dda8c4aa1a45c78cadf72563c715642fe8409c" + integrity sha512-hyuHa3CZGBcuneGQ/CPRaU4AR0ZokqOIw1lls+ntN9brT2mFbv2yV+inIAKWkUp9MnQ+S6KxSkF2f73rAsew7A== + dependencies: + web3-eth-contract "^1.6.0" + web3-utils "^1.6.0" + "@toruslabs/http-helpers@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-1.4.0.tgz#6d2d4129d1126876b0616b7dffec3f4b339739b5" @@ -5103,6 +7075,19 @@ once "^1.4.0" pump "^3.0.0" +"@toruslabs/openlogin-jrpc@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-1.0.2.tgz#ec29f1a45eaf0dcbdb0e1ebd5d0543f987198a8a" + integrity sha512-UcnAO3QZ7uUBxvEscBYpQYkZYwuP/CXQTI9zD9dGXyJk6YdZXQCN715kCQVangJFG7koH0re1/qnnMWWok8upQ== + dependencies: + "@toruslabs/openlogin-utils" "^1.0.2" + end-of-stream "^1.4.4" + events "^3.3.0" + fast-safe-stringify "^2.1.1" + once "^1.4.0" + pump "^3.0.0" + readable-stream "^3.6.0" + "@toruslabs/openlogin-utils@^0.10.2": version "0.10.2" resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-0.10.2.tgz#0e9cea953955cb0f48db047642d6624f64da7acc" @@ -5121,6 +7106,15 @@ keccak "^3.0.1" randombytes "^2.1.0" +"@toruslabs/openlogin-utils@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-1.0.2.tgz#09e10956c55729d4615a98d506d7345f3b4adb9e" + integrity sha512-f9NrKBiLvlyttUT8y6VNyc2Byd89cdmpHQKaS3B6dG2JdPID30p0rPHswVonh9r/zImFQqoywukgKnZJXWK/ig== + dependencies: + base64url "^3.0.1" + keccak "^3.0.2" + randombytes "^2.1.0" + "@toruslabs/openlogin@^0.10.1": version "0.10.2" resolved "https://registry.yarnpkg.com/@toruslabs/openlogin/-/openlogin-0.10.2.tgz#aeaf6031d6fc2f902721a88bbfabe28914926889" @@ -5145,6 +7139,41 @@ lodash.merge "^4.6.2" pump "^3.0.0" +"@toruslabs/torus-embed@^1.8.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.14.0.tgz#4207dbff41910e0b591f933444417e4fec1c292a" + integrity sha512-XADRBt5xgQ/y9Ip7tO4YkLJxjrWhoydOreRuR83OE5/w9EIJ3hjGi8HhpzDhsG9ZJn2jm3Ozn6eYaABIMFOeaQ== + dependencies: + "@metamask/obs-store" "^7.0.0" + "@toruslabs/fetch-node-details" "^4.0.0" + "@toruslabs/http-helpers" "^1.4.0" + "@toruslabs/openlogin-jrpc" "^1.0.2" + "@toruslabs/torus.js" "^4.1.0" + create-hash "^1.2.0" + end-of-stream "^1.4.4" + eth-rpc-errors "^4.0.3" + events "^3.3.0" + fast-deep-equal "^3.1.3" + is-stream "^3.0.0" + lodash.merge "^4.6.2" + loglevel "^1.7.1" + once "^1.4.0" + pump "^3.0.0" + +"@toruslabs/torus.js@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-4.1.0.tgz#4dddbfe57ace5bb67ab1940fba0f1ffcc0b96167" + integrity sha512-cmJaXhXU2oHY0oY9WbqElBUSh+UDwz5ETp2jXFam/QuKTOZfKsBS3gSuC0h3JT6ZfScMP8DRx/BgbV4JKa2pUA== + dependencies: + "@toruslabs/eccrypto" "^1.1.7" + "@toruslabs/http-helpers" "^1.4.0" + bn.js "^5.2.0" + elliptic "^6.5.4" + json-stable-stringify "^1.0.1" + loglevel "^1.7.1" + memory-cache "^0.2.0" + web3-utils "^1.6.0" + "@toruslabs/tweetnacl-js@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@toruslabs/tweetnacl-js/-/tweetnacl-js-1.0.3.tgz#52abbcd2a6b77959ef6a98afedce77764d87226d" @@ -5216,7 +7245,7 @@ dependencies: "@babel/types" "^7.3.0" -"@types/bn.js@^4.11.5": +"@types/bn.js@^4.11.3", "@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== @@ -5310,7 +7339,7 @@ resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== -"@types/hoist-non-react-statics@*": +"@types/hoist-non-react-statics@*", "@types/hoist-non-react-statics@^3.3.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -5370,7 +7399,7 @@ dependencies: jest-diff "^24.3.0" -"@types/jest@^26.0.15": +"@types/jest@^26.0.15", "@types/jest@^26.0.23": version "26.0.24" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== @@ -5455,6 +7484,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.27.tgz#4141fcad57c332a120591de883e26fe4bb14aaea" integrity sha512-qZdePUDSLAZRXXV234bLBEUM0nAQjoxbcSwp1rqSMUe1rZ47mwU6OjciR/JvF1Oo8mc0ys6GE0ks0HGgqAZoGg== +"@types/node@^15.12.2": + version "15.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -5482,6 +7516,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== +"@types/prop-types@^15.7.4": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + "@types/q@^1.5.1": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" @@ -5511,6 +7550,30 @@ dependencies: "@types/react" "*" +"@types/react-dom@^17.0.7": + version "17.0.11" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466" + integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q== + dependencies: + "@types/react" "*" + +"@types/react-is@^16.7.1 || ^17.0.0": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" + integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== + dependencies: + "@types/react" "*" + +"@types/react-redux@^7.1.20": + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.20.tgz#42f0e61ababb621e12c66c96dda94c58423bd7df" + integrity sha512-q42es4c8iIeTgcnB+yJgRTTzftv3eYYvCZOh1Ckn2eX/3o5TdsQYKUWpLoLuGlcY/p+VAhV9IOEZJcWk/vfkXw== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + "@types/react-router-dom@^5.1.6": version "5.1.7" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.7.tgz#a126d9ea76079ffbbdb0d9225073eb5797ab7271" @@ -5535,7 +7598,14 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.0", "@types/react@^17.0.16": +"@types/react-transition-group@^4.4.4": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" + integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^17.0.0", "@types/react@^17.0.11", "@types/react@^17.0.16": version "17.0.21" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.21.tgz#069c43177cd419afaab5ce26bb4e9056549f7ea6" integrity sha512-GzzXCpOthOjXvrAUFQwU/svyxu658cwu00Q9ugujS4qc1zXgLFaO0kS2SLOaMWLt2Jik781yuHCWB7UcYdGAeQ== @@ -5874,6 +7944,306 @@ "@typescript-eslint/types" "4.31.1" eslint-visitor-keys "^2.0.0" +"@walletconnect/browser-utils@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.6.6.tgz#a985b48c99c65a986a051d66a4910010a10a0c56" + integrity sha512-E29xSHU7Akd4jaPehWVGx7ct+SsUzZbxcGc0fz+Pw6/j4Gh5tlfYZ9XuVixuYI4WPdQ2CmOraj8RrVOu5vba4w== + dependencies: + "@walletconnect/safe-json" "1.0.0" + "@walletconnect/types" "^1.6.6" + "@walletconnect/window-getters" "1.0.0" + "@walletconnect/window-metadata" "1.0.0" + detect-browser "5.2.0" + +"@walletconnect/client@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.6.6.tgz#ec64575b245bfce25cc0d9150a3c2e919a8a2632" + integrity sha512-DDOrxagSmXCciIEr16hTf4gWZ7PG7GXribYTfOOsjtODLtPEODEEYj/AsmEALjh3ZBG4bN35Vj0F/ZA1D+90GQ== + dependencies: + "@walletconnect/core" "^1.6.6" + "@walletconnect/iso-crypto" "^1.6.6" + "@walletconnect/types" "^1.6.6" + "@walletconnect/utils" "^1.6.6" + +"@walletconnect/core@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.6.6.tgz#0a35a9b0f91da8958bec27be801a510818f4e142" + integrity sha512-pSftIVPY6mYz2koZPBEYmeFeAjVf2MSnRHOM6+vx+iAsUEcfMZHkgeXX6GtM6Fjza+zSZu1qnmdgURVXpmKwtQ== + dependencies: + "@walletconnect/socket-transport" "^1.6.6" + "@walletconnect/types" "^1.6.6" + "@walletconnect/utils" "^1.6.6" + +"@walletconnect/crypto@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.1.tgz#d4c1b1cd5dd1be88fe9a82dfc54cadbbb3f9d325" + integrity sha512-IgUReNrycIFxkGgq8YT9HsosCkhutakWD9Q411PR0aJfxpEa/VKJeaLRtoz6DvJpztWStwhIHnAbBoOVR72a6g== + dependencies: + "@walletconnect/encoding" "^1.0.0" + "@walletconnect/environment" "^1.0.0" + "@walletconnect/randombytes" "^1.0.1" + aes-js "^3.1.2" + hash.js "^1.1.7" + +"@walletconnect/encoding@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.0.tgz#e24190cb5e803526f9dfd7191fb0e4dc53c6d864" + integrity sha512-4nkJFnS0QF5JdieG/3VPD1/iEWkLSZ14EBInLZ00RWxmC6EMZrzAeHNAWIgm+xP3NK0lqz+7lEsmWGtcl5gYnQ== + dependencies: + is-typedarray "1.0.0" + typedarray-to-buffer "3.1.5" + +"@walletconnect/environment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" + integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== + +"@walletconnect/ethereum-provider@^1.6.0": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.6.6.tgz#74c1ed9d47e08f11f401b9a118ce76b82226bf95" + integrity sha512-ftTbvTWj2MY+S45DT4F6DDCqQyJseAenNqR2luTxvS2e17YOXO3R+fxLHW0U6GKtA95ui7N+gBY8Rxe4hK232g== + dependencies: + "@walletconnect/client" "^1.6.6" + "@walletconnect/jsonrpc-http-connection" "^1.0.0" + "@walletconnect/jsonrpc-provider" "^1.0.0" + "@walletconnect/signer-connection" "^1.6.6" + "@walletconnect/types" "^1.6.6" + "@walletconnect/utils" "^1.6.6" + eip1193-provider "1.0.1" + eventemitter3 "4.0.7" + +"@walletconnect/iso-crypto@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.6.6.tgz#19848bdcd54e9945961bab8a996cbca8a00d7cf1" + integrity sha512-wRYgKvd8K3A9FVLn2c0cDh4+9OUHkqibKtwQJTJsz+ibPGgd+n5j1/FjnzDDRGb9T1+TtlwYF3ZswKyys3diVQ== + dependencies: + "@walletconnect/crypto" "^1.0.1" + "@walletconnect/types" "^1.6.6" + "@walletconnect/utils" "^1.6.6" + +"@walletconnect/jsonrpc-http-connection@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.0.tgz#5bbdfbaf6d6519b3c08e492a6badb7460ab5ecd0" + integrity sha512-fmBTox7Zo9Tb8wzKpnOgYl5cYPu+2xXifNMDYMRGkWDAygXBzRzmfdhk7OowCkSXeh8aDhE5eFtMk+u8MOmntg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/safe-json" "^1.0.0" + cross-fetch "^3.1.4" + +"@walletconnect/jsonrpc-provider@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.0.tgz#066ee5a8a8554c55ea68f9ebf6fe8f96cdb66e7e" + integrity sha512-ZVe23tYT0LdykZ/denBdkKCjBC13fnpj8MiKFuvUl0idBv1PiYKYJR3LVJHy8+7zk0lBbDH3hBNrbMt/K4kjcw== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/safe-json" "^1.0.0" + +"@walletconnect/jsonrpc-types@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.0.tgz#fa75ad5e8f106a2e33287b1e6833e22ed0225055" + integrity sha512-11QXNq5H1PKZk7bP8SxgmCw3HRaDuPOVE+wObqEvmhc7OWYUZqfuaaMb+OXGRSOHL3sbC+XHfdeCxFTMXSFyng== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@walletconnect/jsonrpc-utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.0.tgz#1a2f668d606e8f0b6e7d8fdebae86001bd037a3f" + integrity sha512-qUHbKUK6sHeHn67qtHZoLoYk5hS6x1arTPjKDRkY93/6Fx+ZmNIpdm1owX3l6aYueyegJ7mz43FpvYHUqJ8xcw== + dependencies: + "@walletconnect/environment" "^1.0.0" + "@walletconnect/jsonrpc-types" "^1.0.0" + +"@walletconnect/mobile-registry@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" + integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== + +"@walletconnect/qrcode-modal@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.6.6.tgz#d95d790a4f0eaee4e8bb024b92ed111a0ee716bd" + integrity sha512-wZorjpOIm6OhXKNvyH1YtpxfCUVcnuJxS8YbUeKWckGjS3tDPqUTbXWPlzFdMpNBrpY3j0B2XjLgVVQ2aUDX0w== + dependencies: + "@walletconnect/browser-utils" "^1.6.6" + "@walletconnect/mobile-registry" "^1.4.0" + "@walletconnect/types" "^1.6.6" + copy-to-clipboard "^3.3.1" + preact "10.4.1" + qrcode "1.4.4" + +"@walletconnect/randombytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.1.tgz#87f0f02d9206704ce1c9e23f07d3b28898c48385" + integrity sha512-YJTyq69i0PtxVg7osEpKfvjTaWuAsR49QEcqGKZRKVQWMbGXBZ65fovemK/SRgtiFRv0V8PwsrlKSheqzfPNcg== + dependencies: + "@walletconnect/encoding" "^1.0.0" + "@walletconnect/environment" "^1.0.0" + randombytes "^2.1.0" + +"@walletconnect/safe-json@1.0.0", "@walletconnect/safe-json@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" + integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== + +"@walletconnect/signer-connection@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/signer-connection/-/signer-connection-1.6.6.tgz#9232fbad365417d89b9dc7ee96120de20e5fd1b1" + integrity sha512-xogBZ3h2TWW5n74nM2Iz40Vy95Ehx6VPYVNBeagasiSrC05CrDaBZ/VVcPQvTmQvB10TfDswRweX8sqpjzgoyA== + dependencies: + "@walletconnect/client" "^1.6.6" + "@walletconnect/jsonrpc-types" "^1.0.0" + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/qrcode-modal" "^1.6.6" + "@walletconnect/types" "^1.6.6" + eventemitter3 "4.0.7" + +"@walletconnect/socket-transport@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.6.6.tgz#b80974fe3e2a2f93ba1f6b40df5a0ea492b94086" + integrity sha512-mugCEoeKTx75ogb5ROg/+LA3yGTsuRNcrYgrApceo7WNU9Z4dG8l6ycMPqrrFcODcrasq3NmXVWUYDv/CvrzSw== + dependencies: + "@walletconnect/types" "^1.6.6" + "@walletconnect/utils" "^1.6.6" + ws "7.5.3" + +"@walletconnect/types@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.6.6.tgz#8d644e2a390e494e40424c60272e91b4820bf0d4" + integrity sha512-op77cxexOmQQN36XB1sYouNTlBRV0Rup/2NYK8A1ffdwXa3a6HLHHdhBM7I/I9BVmRXoZ4+XoOnPKGGrYtlS3g== + +"@walletconnect/utils@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.6.6.tgz#e8e49a5f2c35e4a5f9153b09ad076655f38d8c96" + integrity sha512-s2X/cVXiMDSEoWV6i7HPMbP1obXlzP7KLMrBo9OMabiJKnQEh6HSZ39WLswB2PHnl8Hp1Sr4BdRvhM5kCcYWRw== + dependencies: + "@walletconnect/browser-utils" "^1.6.6" + "@walletconnect/encoding" "^1.0.0" + "@walletconnect/jsonrpc-utils" "^1.0.0" + "@walletconnect/types" "^1.6.6" + bn.js "4.11.8" + js-sha3 "0.8.0" + query-string "6.13.5" + +"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" + integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== + +"@walletconnect/window-metadata@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" + integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== + dependencies: + "@walletconnect/window-getters" "^1.0.0" + +"@web3-react/abstract-connector@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.7.tgz#401b3c045f1e0fab04256311be49d5144e9badc6" + integrity sha512-RhQasA4Ox8CxUC0OENc1AJJm8UTybu/oOCM61Zjg6y0iF7Z0sqv1Ai1VdhC33hrQpA8qSBgoXN9PaP8jKmtdqg== + dependencies: + "@web3-react/types" "^6.0.7" + +"@web3-react/authereum-connector@^6.1.1": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@web3-react/authereum-connector/-/authereum-connector-6.2.0.tgz#d3e7379e4d6fc52add4bdd8dfdce1a2747ac23f0" + integrity sha512-we4DJwUrGbDd1gJ+cPMEGXq9+fsIEleJkFc+S+NEKyDoHoNGrPX8h4QqKRS3rgi6oCliPbtSPIf7g9DBjDFDTA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + authereum "^0.1.14" + +"@web3-react/core@^6.1.1": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-6.1.9.tgz#5f5daa0545a8ea07770a699580ced552583afc97" + integrity sha512-P877DslsbAkWIlMANpWiK7pCvNwlz0kJC0EGckuVh0wlA23J4UnFxq6xyOaxkxaDCu14rA/tAO0NbwjcXTQgSA== + dependencies: + "@ethersproject/keccak256" "^5.0.0-beta.130" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + tiny-warning "^1.0.3" + +"@web3-react/fortmatic-connector@^6.0.9": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/fortmatic-connector/-/fortmatic-connector-6.1.6.tgz#99836c4ff4428432e34ed859b55c5842b02726a5" + integrity sha512-AKiEVvKlZPpRj5pADXyucl2FBt3ymf7PSsRhraHeI8hJCfCEACQ2+bq7okvJq9sNqaeUKukzwUYJmgBYn0qkYQ== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + fortmatic "^1.0.0" + tiny-invariant "^1.0.6" + +"@web3-react/frame-connector@^6.0.9": + version "6.0.9" + resolved "https://registry.yarnpkg.com/@web3-react/frame-connector/-/frame-connector-6.0.9.tgz#9e7659480a554944e0ecf08f00fe0c946a565d35" + integrity sha512-SyEveo8XckEw+aIhT7A58OFtUgAVWM85PmJegoIaTAWBVTVlvXClTAnOUrDzH2Nu6nCoj2swNKHS2dePnux9Pw== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + eth-provider "^0.2.5" + tiny-invariant "^1.0.6" + +"@web3-react/injected-connector@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/injected-connector/-/injected-connector-6.0.7.tgz#1e0be23f51fa07fe6547fe986768a46b74c3a426" + integrity sha512-Y7aJSz6pg+MWKtvdyuqyy6LWuH+4Tqtph1LWfiyVms9II9ar/9B/de4R8wh4wjg91wmHkU+D75yP09E/Soh2RA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-warning "^1.0.3" + +"@web3-react/portis-connector@^6.1.1": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@web3-react/portis-connector/-/portis-connector-6.1.9.tgz#33216ce320d2c6d6e75d0c42c6e977b7a157ad4a" + integrity sha512-dYP1b6a1Y91t9xEu1NrlGvLwuAqYEuVfAerZtVkVf3JZ3O5TiQyVt7O7KWPPg4WsqQ8JEqOrZcE/2bmozP47mA== + dependencies: + "@portis/web3" "^2.0.0-beta.54" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + +"@web3-react/squarelink-connector@^6.1.1": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@web3-react/squarelink-connector/-/squarelink-connector-6.1.9.tgz#e0d29ff7163a02bb7f92b878f153fd8838311087" + integrity sha512-HhhlKmB5twOh2ECPlbx7f/J+wFssU5b04nTj40QuXMNvphMD93nqLplgTgGHzFjeFIzZpnFLN5XbDiJeGApMYA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + squarelink "^1.1.4" + tiny-invariant "^1.0.6" + +"@web3-react/torus-connector@^6.1.1": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@web3-react/torus-connector/-/torus-connector-6.1.9.tgz#5a3b7c262b145c293c74a56f457ee932930e6da8" + integrity sha512-HOEGbs1XMWncUs/KKBf+8OQaWHxlI3vXRMpXU7UJF404WvawgklEK5yljmFBA0YjwFUwanx0uL36HRYgijVfwA== + dependencies: + "@toruslabs/torus-embed" "^1.8.0" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + +"@web3-react/types@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.7.tgz#34a6204224467eedc6123abaf55fbb6baeb2809f" + integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A== + +"@web3-react/walletconnect-connector@^6.1.4": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-6.2.8.tgz#069d27df226464775de25248e71e8c407c374cc7" + integrity sha512-HENFuGw+inlYHPdZc1vKKVVYzJ/h/JJIXZVzXC2UPQ+c14cX1t0WSnQ7ywUYHkgRqYWMsngTDZTKRMU2+4O1Tg== + dependencies: + "@walletconnect/ethereum-provider" "^1.6.0" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + +"@web3-react/walletlink-connector@^6.1.1": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@web3-react/walletlink-connector/-/walletlink-connector-6.2.8.tgz#aaf7f413229f58d8087a15e0d049bbcbe5e0bd49" + integrity sha512-pSGufPz5JntSUvy88XcOrn5VN3qmX+ZVQ2lXAeWWb7YS2wTlAStPghZbln8t1li7jr1NUJ0w/gMDVpAwjwq4ZA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + walletlink "^2.2.6" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -6070,6 +8440,20 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +abstract-leveldown@~2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -6147,6 +8531,16 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -6584,7 +8978,7 @@ arweave@^1.10.13, arweave@^1.10.16: base64-js "^1.3.1" bignumber.js "^9.0.1" -asap@^2.0.0, asap@~2.0.6: +asap@^2.0.0, asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -6666,11 +9060,25 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@~1.0.0: +async-eventemitter@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + async-sema@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/async-sema/-/async-sema-3.1.1.tgz#e527c08758a0f8f6f9f15f799a173ff3c40ea808" @@ -6681,7 +9089,17 @@ async-validator@^3.0.3: resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500" integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ== -async@^2.6.1, async@^2.6.2: +async@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -6708,6 +9126,26 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +authereum@^0.1.14: + version "0.1.14" + resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.1.14.tgz#5655e543b296d899136e350d09f9cfe4c12fbc38" + integrity sha512-o1lsXXGg+oYDAEutZ8Ak1Qn2Dnk+qSyQ2ZokyLHRSYGJj6HpEHaSlQA6W3VTHD5r68Q+W0JD/BN9hDSF2xyshQ== + dependencies: + async "3.2.0" + bn.js "5.1.2" + ethereum-private-key-to-address "0.0.3" + ethers "4.0.47" + eventemitter3 "4.0.0" + is-buffer "2.0.4" + penpal "4.1.1" + pify "4.0.1" + querystring "0.2.0" + store "2.0.12" + to-hex "0.0.11" + uuidv4 "6.0.6" + web3-provider-engine "15.0.4" + web3-utils "1.2.1" + autoprefixer@^9.6.1: version "9.8.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" @@ -6741,6 +9179,14 @@ axe-core@^4.0.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== +axios@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + axios@^0.21.0: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -6767,6 +9213,40 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.14, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" @@ -6786,6 +9266,133 @@ babel-extract-comments@^1.0.0: dependencies: babylon "^6.18.0" +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" @@ -6838,6 +9445,20 @@ babel-loader@8.1.0: pify "^4.0.1" schema-utils "^2.6.5" +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -6893,7 +9514,7 @@ babel-plugin-jest-hoist@^27.2.0: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@2.8.0: +babel-plugin-macros@2.8.0, babel-plugin-macros@^2.6.1: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== @@ -6916,6 +9537,15 @@ babel-plugin-polyfill-corejs2@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f" + integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.4" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" @@ -6924,6 +9554,14 @@ babel-plugin-polyfill-corejs3@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.14.0" +babel-plugin-polyfill-corejs3@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz#fa7ca3d1ee9ddc6193600ffb632c9785d54918af" + integrity sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.4" + core-js-compat "^3.18.0" + babel-plugin-polyfill-regenerator@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" @@ -6931,6 +9569,13 @@ babel-plugin-polyfill-regenerator@^0.2.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" +babel-plugin-polyfill-regenerator@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d" + integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.4" + "babel-plugin-styled-components@>= 1.12.0": version "1.13.2" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" @@ -6941,6 +9586,16 @@ babel-plugin-polyfill-regenerator@^0.2.2: babel-plugin-syntax-jsx "^6.18.0" lodash "^4.17.11" +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" @@ -6951,6 +9606,219 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" @@ -6964,6 +9832,21 @@ babel-plugin-transform-react-remove-prop-types@0.4.24: resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-polyfill@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" @@ -6991,6 +9874,42 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-preset-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" @@ -7036,19 +9955,83 @@ babel-preset-react-app@^10.0.0: babel-plugin-macros "2.8.0" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@^6.23.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babelify@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" + babel-core "^6.0.14" + object-assign "^4.0.0" babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + dependencies: + precond "0.2" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -7179,7 +10162,12 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.3.0, bindings@^1.5.0: +bind-decorator@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" + integrity sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8= + +bindings@^1.2.1, bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -7245,12 +10233,22 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@4.11.8: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +bn.js@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: 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.1, bn.js@^5.1.2, bn.js@^5.1.3: +bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== @@ -7298,6 +10296,11 @@ borsh@^0.4.0: bs58 "^4.0.0" text-encoding-utf-8 "^1.0.2" +bowser@^1.7.3: + version "1.9.4" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" + integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== + bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -7438,6 +10441,14 @@ browserslist@4.16.6, browserslist@^4.16.6: escalade "^3.1.1" node-releases "^1.1.71" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.0, browserslist@^4.6.2, browserslist@^4.6.4: version "4.17.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" @@ -7449,6 +10460,17 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.0, browserslist@^4 escalade "^3.1.1" node-releases "^1.1.75" +browserslist@^4.17.6: + version "4.17.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" + integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw== + dependencies: + caniuse-lite "^1.0.30001274" + electron-to-chromium "^1.3.886" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -7484,6 +10506,11 @@ btoa-lite@^1.0.0: resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -7512,6 +10539,11 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-from@^1.1.1: + 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-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" @@ -7522,6 +10554,11 @@ buffer-layout@^1.2.0: resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.1.tgz#17b6db7abea303cab35eebd77919b89de026297d" integrity sha512-RUTGEYG1vX0Zp1dStQFl8yeU/LEBPXVtHwzzDbPWkE5zq+Prt9fkFLKNiwmaeHg6BBiRMcQAgj4cynazO6eekw== +buffer-layout@^1.2.2: + 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-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" @@ -7565,7 +10602,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1, buffer@^5.5.0: +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== @@ -7688,7 +10725,7 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -7799,6 +10836,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz#b604eed80cc54a578e4bf5a02ae3ed49f869d252" integrity sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA== +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001274: + version "1.0.30001279" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz#eb06818da481ef5096a3b3760f43e5382ed6b0ce" + integrity sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ== + caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001228: version "1.0.30001242" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001242.tgz#04201627abcd60dc89211f22cbe2347306cda46b" @@ -7855,6 +10897,11 @@ cborg@^1.2.1: resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.5.0.tgz#3a661fcf759e8deeec3834a144e6d87d82d97787" integrity sha512-3t1+s45x5LiACi39HDiSubPZiKXU2rCreu0oi5A1nccQNDHnprCh9ZQKN1Za3eookOmL03e9oKEZ+LJs0iTE8A== +chain-function@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" + integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== + chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -7872,7 +10919,7 @@ chalk@4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.0.0: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -7899,6 +10946,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-emitter@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -7919,6 +10971,13 @@ check-types@^11.1.1: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== +checkpoint-store@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= + dependencies: + functional-red-black-tree "^1.0.1" + chokidar@3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" @@ -8137,7 +11196,12 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.0.4: +clone@^2.0.0, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +clsx@^1.0.4, clsx@^1.1.0, clsx@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== @@ -8290,6 +11354,11 @@ commander@^8.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" integrity sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -8368,7 +11437,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.5.1: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -8550,7 +11619,7 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= -convert-source-map@^1.6.0: +convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0: 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== @@ -8596,7 +11665,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-to-clipboard@^3.2.0: +copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== @@ -8611,11 +11680,24 @@ core-js-compat@^3.14.0, core-js-compat@^3.16.0, core-js-compat@^3.6.2: browserslist "^4.17.0" semver "7.0.0" +core-js-compat@^3.18.0: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476" + integrity sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g== + dependencies: + browserslist "^4.17.6" + semver "7.0.0" + core-js-pure@^3.0.0: version "3.13.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.1.tgz#5d139d346780f015f67225f45ee2362a6bed6ba1" integrity sha512-wVlh0IAi2t1iOEh16y4u1TRk6ubd4KvLE8dlMi+3QUI6SfKphQUh7tAwihGGSQ8affxEXpVIPpOdf9kjR4v4Pw== +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" @@ -8721,6 +11803,14 @@ cross-fetch@3.0.6: dependencies: node-fetch "2.6.1" +cross-fetch@^2.1.0, cross-fetch@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.5.tgz#afaf5729f3b6c78d89c9296115c9f142541a5705" + integrity sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w== + dependencies: + node-fetch "2.6.1" + whatwg-fetch "2.0.4" + cross-fetch@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" @@ -8829,6 +11919,14 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + css-loader@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" @@ -9085,6 +12183,11 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== +csstype@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -9092,6 +12195,13 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +customize-cra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/customize-cra/-/customize-cra-1.0.0.tgz#73286563631aa08127ad4d30a2e3c89cf4e93c8d" + integrity sha512-DbtaLuy59224U+xCiukkxSq8clq++MOtJ1Et7LED1fLszWe88EoblEYFBJ895sB1mC6B4uu3xPT/IjClELhMbA== + dependencies: + lodash.flow "^3.5.0" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -9162,14 +12272,14 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0: +debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -9304,7 +12414,7 @@ deep-eql@^0.1.3: dependencies: type-detect "0.1.1" -deep-equal@^1.0.1: +deep-equal@^1.0.1, deep-equal@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -9356,6 +12466,13 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +deferred-leveldown@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== + dependencies: + abstract-leveldown "~2.6.0" + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -9385,6 +12502,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -9431,6 +12553,18 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-browser@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" + integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -9501,6 +12635,11 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -9515,6 +12654,20 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discord.js@12.5.3: + version "12.5.3" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.3.tgz#56820d473c24320871df9ea0bbc6b462f21cf85c" + integrity sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== + dependencies: + "@discordjs/collection" "^0.1.6" + "@discordjs/form-data" "^3.0.1" + abort-controller "^3.0.0" + node-fetch "^2.6.1" + prism-media "^1.2.9" + setimmediate "^1.0.5" + tweetnacl "^1.0.3" + ws "^7.4.4" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -9585,6 +12738,13 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" +dom-helpers@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + dom-helpers@^5.0.1, dom-helpers@^5.1.3: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -9717,6 +12877,13 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + download@^6.2.2: version "6.2.5" resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" @@ -9794,7 +12961,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -eip1193-provider@^1.0.1: +eip1193-provider@1.0.1, eip1193-provider@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/eip1193-provider/-/eip1193-provider-1.0.1.tgz#420d29cf4f6c443e3f32e718fb16fafb250637c3" integrity sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g== @@ -9813,6 +12980,11 @@ electron-fetch@^1.7.2: dependencies: encoding "^0.1.13" +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.886: + version "1.3.894" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.894.tgz#54554ecb40d40ddac7241c4a42887e86180015d8" + integrity sha512-WY8pA4irAZ4cm/Pr7YFPtPLVqj3nU6d0SbfoHF6M7HZNONfPdAnYAarumqQ75go2LuN72uO9wGuCEqnfya/ytg== + electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.830: version "1.3.843" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.843.tgz#671489bd2f59fd49b76adddc1aa02c88cd38a5c0" @@ -9823,6 +12995,19 @@ electron-to-chromium@^1.3.723: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.743.tgz#fcec24d6d647cb84fd796b42caa1b4039a180894" integrity sha512-K2wXfo9iZQzNJNx67+Pld0DRF+9bYinj62gXCdgPhcu1vidwVuLPHQPPFnCdO55njWigXXpfBiT90jGUPbw8Zg== +elliptic@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -9936,7 +13121,7 @@ err-code@^3.0.1: resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: +errno@^0.1.1, errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== @@ -10003,6 +13188,32 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -10374,6 +13585,142 @@ etag@1.8.1, etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +eth-block-tracker@4.4.3, eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, eth-block-tracker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-errors@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" + integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-json-rpc-filters@4.2.2, eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4.1.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + async-mutex "^0.2.6" + eth-json-rpc-middleware "^6.0.0" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + +eth-json-rpc-infura@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" + integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== + dependencies: + cross-fetch "^2.1.1" + eth-json-rpc-middleware "^1.5.0" + json-rpc-engine "^3.4.0" + json-rpc-error "^2.0.0" + +eth-json-rpc-infura@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-4.1.0.tgz#623478375ba65e4304dea529ed69e8bd7938270d" + integrity sha512-DFYitKovzVlCdUulEccdm4g6k/vnvyByuw7rd5OoWDBSIiaeinI8Z/SntLjSIs2c+YvE20DGwk/GLwZGCWDN1Q== + dependencies: + eth-json-rpc-middleware "^4.4.0" + eth-rpc-errors "^3.0.0" + json-rpc-engine "^5.1.3" + node-fetch "^2.6.0" + +eth-json-rpc-middleware@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== + dependencies: + async "^2.5.0" + eth-query "^2.1.2" + eth-tx-summary "^3.1.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.3" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.1.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^3.6.0" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + tape "^4.6.3" + +eth-json-rpc-middleware@^4.1.1, eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228" + integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-json-rpc-errors "^1.0.1" + eth-query "^2.1.2" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.7" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.6.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^5.1.3" + json-stable-stringify "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-middleware@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-5.1.0.tgz#affc63ddb31205e4b2f2c451571902031dad70fc" + integrity sha512-0uq8nWgHWLKA0sMhVqViue3vSEBVuQXyk2yzjhe8GSo/dGpJUtmYN1DvDF1LQtEhHI4N/G6MKPbiR/aWSRkPmg== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.7" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.6.0" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-middleware@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-util "^5.1.2" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-lib@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" + integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + eth-lib@0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" @@ -10383,33 +13730,287 @@ eth-lib@0.2.8: elliptic "^6.4.0" xhr-request-promise "^0.1.2" -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== +eth-provider@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/eth-provider/-/eth-provider-0.2.5.tgz#2c06b8c190bb76c83f0f5002773a7d516a9aac68" + integrity sha512-brZFNAYY5Js8yBeyk/ukOJQpClvOXrWFI2A+4HJrBu7rPuUIGHiQ7zmbyhYaRg5Xvkkyi9vw5Fvlt/8I6xvHDQ== + dependencies: + ethereum-provider "0.0.6" + oboe "2.1.4" + uuid "3.3.2" + ws "7.1.2" + xhr2-cookies "1.1.0" + +eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" + integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-sig-util@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" + integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== + dependencies: + buffer "^5.2.1" + elliptic "^6.4.0" + ethereumjs-abi "0.6.5" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.0" + tweetnacl-util "^0.15.0" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +eth-tx-summary@^3.1.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== + dependencies: + async "^2.1.2" + clone "^2.0.0" + concat-stream "^1.5.1" + end-of-stream "^1.1.0" + eth-query "^2.0.2" + ethereumjs-block "^1.4.1" + ethereumjs-tx "^1.1.1" + ethereumjs-util "^5.0.1" + ethereumjs-vm "^2.6.0" + through2 "^2.0.3" + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-checksum-address@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz#46fcb2d962dacd1ed49d7b464408ec26fd183209" + integrity sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ== + dependencies: + keccak256 "^1.0.0" + meow "^5.0.0" + +ethereum-common@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== + +ethereum-common@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-private-key-to-address@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz#1f1dccaefd1198c2dcde55501f331a846bd0aad0" + integrity sha512-P+z9eFlgOezxogEpY1sQR155U4xFmQUWVxKzIJa5BL05Gs7zL0sYuyQuSAme8LBYGQ6p6AwconiMDauf4LbqyA== + dependencies: + ethereum-private-key-to-public-key "0.0.2" + ethereum-public-key-to-address "0.0.1" + meow "^5.0.0" + +ethereum-private-key-to-public-key@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ethereum-private-key-to-public-key/-/ethereum-private-key-to-public-key-0.0.2.tgz#bb5803aad43df2692e0d7b4c9eaa224eec2a39cb" + integrity sha512-WKwFspLS5IdpV1rBUmWSG2xtIDV7YMpAG/uSjtV9kDzBU6hpSzoqg6R/e1iEfHkOr/eae+NtDTpwzXRtSMDvhw== + dependencies: + meow "^5.0.0" + secp256k1 "^3.7.1" + +ethereum-provider@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/ethereum-provider/-/ethereum-provider-0.0.6.tgz#6f5a0427c34872339667d9904a8692e8992e6bf5" + integrity sha512-DqtdXNHGi/QtOjEovNOegVVQTd8/NnH9rP27R5SU3j2LKECZbcLGIZ3Z9Ln1SDaeUC5YJGJFYQCUUjfIi7NNyQ== + +ethereum-public-key-to-address@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.1.tgz#3f0237687d9c2217234dc5683f3eb580abf3f6ce" + integrity sha512-X78x/VBluHUdrYpZunoXJ48luXTaUiUK4ImPjTjI+XiS24+jUR5WFCpm9wCNbLYP6/ZCJ+lwuYormXSjt8rrbw== + dependencies: + ethereum-checksum-address "0.0.2" + keccak256 "^1.0.0" + meow "^5.0.0" + secp256k1 "^3.7.1" + +ethereumjs-abi@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= + dependencies: + bn.js "^4.10.0" + ethereumjs-util "^4.3.0" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== + dependencies: + ethereumjs-util "^5.0.0" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-block@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== + dependencies: + async "^2.0.1" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.1" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== + +ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== + dependencies: + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" + +ethereumjs-tx@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + dependencies: + ethereumjs-common "^1.5.0" + ethereumjs-util "^6.0.0" + +ethereumjs-util@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" + integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + ethjs-util "^0.1.3" + keccak "^1.0.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" + +ethereumjs-util@^4.3.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" + integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== + dependencies: + bn.js "^4.8.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + rlp "^2.0.0" + +ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: - js-sha3 "^0.8.0" + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" -ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== +ethereumjs-util@^7.1.0: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" ethereumjs-util@^7.1.1: version "7.1.1" @@ -10423,6 +14024,38 @@ ethereumjs-util@^7.1.1: ethjs-util "0.1.6" rlp "^2.2.4" +ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + ethereumjs-account "^2.0.3" + ethereumjs-block "~2.2.0" + ethereumjs-common "^1.1.0" + ethereumjs-util "^6.0.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + +ethers@4.0.47: + version "4.0.47" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85" + integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== + dependencies: + aes-js "3.0.0" + bn.js "^4.4.0" + elliptic "6.5.2" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -10431,7 +14064,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6: +ethjs-util@0.1.6, ethjs-util@^0.1.3: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -10457,21 +14090,26 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter3@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== +eventemitter3@4.0.7, eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - events@^3.0.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -10740,6 +14378,13 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= +fake-merkle-patricia-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= + dependencies: + checkpoint-store "^1.1.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -10795,6 +14440,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fast-safe-stringify@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f" @@ -10833,6 +14483,19 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs@^0.8.1: + version "0.8.18" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" + integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -10840,6 +14503,13 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fetch-ponyfill@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" + integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= + dependencies: + node-fetch "~1.7.1" + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -10946,6 +14616,15 @@ filenamify@^2.0.0: strip-outer "^1.0.0" trim-repeated "^1.0.0" +filenamify@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + filesize@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" @@ -11004,6 +14683,11 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -11089,6 +14773,13 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.0.0: version "1.14.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" @@ -11118,7 +14809,7 @@ for-each-property@0.0.4: dependencies: get-prototype-chain "^1.0.1" -for-each@^0.3.3: +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" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -11180,6 +14871,13 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +fortmatic@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-1.1.3.tgz#eaeb8b65677aaa245a67ff5f1b8b7f79380a9b23" + integrity sha512-70gPiTuwfqEQNg4fFK5MVf3gRAW+mo2tHdiMSEt2OLKcoHWrAn63e/r245dPJAw4Qvz7PhkYF/bTx6ga50zWog== + dependencies: + "@babel/runtime" "7.3.4" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -11192,6 +14890,26 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +framer-motion@^4: + version "4.1.17" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-4.1.17.tgz#4029469252a62ea599902e5a92b537120cc89721" + integrity sha512-thx1wvKzblzbs0XaK2X0G1JuwIdARcoNOW7VVwjO8BUltzXPyONGAElLu6CiCScsOQRI7FIk/45YTFtJw5Yozw== + dependencies: + framesync "5.3.0" + hey-listen "^1.0.8" + popmotion "9.3.6" + style-value-types "4.1.4" + tslib "^2.1.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/framesync/-/framesync-5.3.0.tgz#0ecfc955e8f5a6ddc8fdb0cc024070947e1a0d9b" + integrity sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA== + dependencies: + tslib "^2.1.0" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -11484,6 +15202,19 @@ gh-pages@^3.1.0: fs-extra "^8.1.0" globby "^6.1.0" +gh-pages@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-3.2.3.tgz#897e5f15e111f42af57d21d430b83e5cdf29472c" + integrity sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg== + dependencies: + async "^2.6.1" + commander "^2.18.0" + email-addresses "^3.0.1" + filenamify "^4.3.0" + find-cache-dir "^3.3.1" + fs-extra "^8.1.0" + globby "^6.1.0" + git-raw-commits@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" @@ -11574,7 +15305,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, 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== @@ -11629,6 +15360,11 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + globby@11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" @@ -11880,7 +15616,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.3: +has@^1.0.0, has@^1.0.3, 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== @@ -11896,6 +15632,14 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash.js@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -11914,6 +15658,11 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -11926,7 +15675,7 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -hmac-drbg@^1.0.1: +hmac-drbg@^1.0.0, 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= @@ -11935,13 +15684,26 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -12200,7 +15962,7 @@ husky@^4.3.0: slash "^3.0.0" which-pm-runs "^1.0.0" -hyphenate-style-name@^1.0.3: +hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== @@ -12311,6 +16073,11 @@ imagemin@^7.0.1: p-pipe "^3.0.0" replace-ext "^1.0.0" +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -12321,6 +16088,11 @@ immer@8.0.1: resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== +immer@^9.0.6: + version "9.0.6" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" + integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -12446,6 +16218,14 @@ init-package-json@^1.10.3: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" +inline-style-prefixer@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534" + integrity sha1-hVG45bTVcyROZqNLBPfTIHaitTQ= + dependencies: + bowser "^1.7.3" + css-in-js-utils "^2.0.0" + inquirer@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" @@ -12581,7 +16361,7 @@ into-stream@^6.0.0: from2 "^2.3.0" p-is-promise "^3.0.0" -invariant@^2.2.4: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -12763,11 +16543,21 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.2" +is-buffer@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -12902,6 +16692,11 @@ is-finite@^1.0.0: resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== +is-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -13079,7 +16874,7 @@ is-regex@^1.0.4, is-regex@^1.1.3: call-bind "^1.0.2" has-symbols "^1.0.2" -is-regex@^1.1.4: +is-regex@^1.1.4, is-regex@~1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -13107,6 +16902,11 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-ssh@^1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" @@ -13114,7 +16914,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -13124,6 +16924,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" @@ -13161,7 +16966,7 @@ is-typed-array@^1.1.3: foreach "^2.0.5" has-symbols "^1.0.1" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -13176,6 +16981,13 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + is-what@^3.12.0: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -13208,6 +17020,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +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== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -13230,6 +17047,14 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isomorphic-fetch@^2.1.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-unfetch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" @@ -14529,7 +18354,7 @@ jest@^27.2.0: import-local "^3.0.2" jest-cli "^27.2.0" -js-sha256@^0.9.0: +js-sha256@0.9.0, 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== @@ -14539,7 +18364,7 @@ js-sha3@0.5.7: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= -js-sha3@^0.8.0: +js-sha3@0.8.0, 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== @@ -14549,6 +18374,11 @@ js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -14557,6 +18387,11 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbi@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" + integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -14627,6 +18462,11 @@ jsdom@^16.4.0, jsdom@^16.6.0: ws "^7.4.6" xml-name-validator "^3.0.0" +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -14652,6 +18492,46 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + +json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== + dependencies: + async "^2.0.1" + babel-preset-env "^1.7.0" + babelify "^7.3.0" + json-rpc-error "^2.0.0" + promise-to-callback "^1.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-engine@^5.1.3, json-rpc-engine@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= + dependencies: + inherits "^2.0.1" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -14672,6 +18552,13 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + json-stringify-safe@^5.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" @@ -14696,6 +18583,11 @@ json5@2.x, json5@^2.1.2: dependencies: minimist "^1.2.5" +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -14726,6 +18618,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -14829,6 +18726,24 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== +keccak256@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.3.tgz#0a9c0383a9cda753a7351811cf69eaa607043366" + integrity sha512-EkF/4twuPm1V/gn75nejOUrKfDUJn87RMLzDWosXF3pXuOvesiSgX35GcmbqzdImCASEkE/WaklWGWSa+Ha5bQ== + dependencies: + bn.js "^4.11.8" + keccak "^3.0.1" + +keccak@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" + integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== + dependencies: + bindings "^1.2.1" + inherits "^2.0.3" + nan "^2.2.1" + safe-buffer "^5.1.0" + keccak@^3.0.0, keccak@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -14846,6 +18761,11 @@ keccak@^3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +keycode@^2.1.8: + version "2.2.0" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" + integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= + keypather@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614" @@ -15013,6 +18933,56 @@ less@^4.1.1: needle "^2.5.2" source-map "~0.6.0" +level-codec@~7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== + +level-errors@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== + dependencies: + errno "~0.1.1" + +level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= + dependencies: + inherits "^2.0.1" + level-errors "^1.0.3" + readable-stream "^1.0.33" + xtend "^4.0.0" + +level-ws@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= + dependencies: + readable-stream "~1.0.15" + xtend "~2.1.1" + +levelup@^1.2.1: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -15209,6 +19179,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.flow@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -15224,7 +19199,7 @@ lodash.memoize@4.x, lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.6.2: +lodash.merge@^4.6.0, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -15259,6 +19234,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -15274,7 +19254,7 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -"lodash@>=3.5 <5", lodash@^4, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.7.0: +"lodash@>=3.5 <5", lodash@^4, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -15384,6 +19364,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -15514,6 +19499,77 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +material-components-web@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/material-components-web/-/material-components-web-13.0.0.tgz#186e563667e404c25dfe66695a0b3a6ec4de7345" + integrity sha512-Cp3pDGDwhbbJQEDgPZc9Uu8drr98RGf5J4toJ/INQkNN9QNwTjHKGCPVcHcA0wUTeJQd5NOWYdCAewUdKTCXfw== + dependencies: + "@material/animation" "^13.0.0" + "@material/auto-init" "^13.0.0" + "@material/banner" "^13.0.0" + "@material/base" "^13.0.0" + "@material/button" "^13.0.0" + "@material/card" "^13.0.0" + "@material/checkbox" "^13.0.0" + "@material/chips" "^13.0.0" + "@material/circular-progress" "^13.0.0" + "@material/data-table" "^13.0.0" + "@material/density" "^13.0.0" + "@material/dialog" "^13.0.0" + "@material/dom" "^13.0.0" + "@material/drawer" "^13.0.0" + "@material/elevation" "^13.0.0" + "@material/fab" "^13.0.0" + "@material/feature-targeting" "^13.0.0" + "@material/floating-label" "^13.0.0" + "@material/form-field" "^13.0.0" + "@material/icon-button" "^13.0.0" + "@material/image-list" "^13.0.0" + "@material/layout-grid" "^13.0.0" + "@material/line-ripple" "^13.0.0" + "@material/linear-progress" "^13.0.0" + "@material/list" "^13.0.0" + "@material/menu" "^13.0.0" + "@material/menu-surface" "^13.0.0" + "@material/notched-outline" "^13.0.0" + "@material/radio" "^13.0.0" + "@material/ripple" "^13.0.0" + "@material/rtl" "^13.0.0" + "@material/segmented-button" "^13.0.0" + "@material/select" "^13.0.0" + "@material/shape" "^13.0.0" + "@material/slider" "^13.0.0" + "@material/snackbar" "^13.0.0" + "@material/switch" "^13.0.0" + "@material/tab" "^13.0.0" + "@material/tab-bar" "^13.0.0" + "@material/tab-indicator" "^13.0.0" + "@material/tab-scroller" "^13.0.0" + "@material/textfield" "^13.0.0" + "@material/theme" "^13.0.0" + "@material/tokens" "^13.0.0" + "@material/tooltip" "^13.0.0" + "@material/top-app-bar" "^13.0.0" + "@material/touch-target" "^13.0.0" + "@material/typography" "^13.0.0" + +material-ui@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.20.2.tgz#5fc9b4b62b691d3b16c89d8e54597a0412b52c7d" + integrity sha512-VeqgQkdvtK193w+FFvXDEwlVxI4rWk83eWbpYLeOIHDPWr3rbB9B075JRnJt/8IsI2X8q5Aia5W3+7m4KkleDg== + dependencies: + babel-runtime "^6.23.0" + inline-style-prefixer "^3.0.8" + keycode "^2.1.8" + lodash.merge "^4.6.0" + lodash.throttle "^4.1.1" + prop-types "^15.5.7" + react-event-listener "^0.6.2" + react-transition-group "^1.2.1" + recompose "^0.26.0" + simple-assign "^0.1.0" + warning "^3.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -15538,6 +19594,23 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memdown@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= + dependencies: + abstract-leveldown "~2.7.1" + functional-red-black-tree "^1.0.1" + immediate "^3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.1.1" + +memory-cache@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a" + integrity sha1-eJCwHVLADI68nVM+H46xfjA0hxo= + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -15559,7 +19632,7 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@5.0.0: +meow@5.0.0, meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== @@ -15649,6 +19722,20 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== + dependencies: + async "^1.4.2" + ethereumjs-util "^5.0.0" + level-ws "0.0.0" + levelup "^1.2.1" + memdown "^1.0.0" + readable-stream "^2.0.0" + rlp "^2.0.0" + semaphore ">=1.0.1" + mersenne-twister@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" @@ -15793,7 +19880,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^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: +minimalistic-crypto-utils@^1.0.0, 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= @@ -15822,7 +19909,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.3, 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== @@ -15931,7 +20018,7 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@^2.10.2, moment@^2.24.0, moment@^2.25.3: +moment@^2.10.2, moment@^2.24.0, moment@^2.25.3, moment@^2.29.1: version "2.29.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== @@ -16047,7 +20134,7 @@ nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nan@^2.14.2: +nan@^2.14.2, nan@^2.2.1: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== @@ -16249,6 +20336,21 @@ node-fetch@2.6.1, node-fetch@^2.5.0, node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^1.0.1, node-fetch@~1.7.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.0: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== + dependencies: + whatwg-url "^5.0.0" + "node-fetch@https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz": version "2.6.7" resolved "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz#1b5d62978f2ed07b99444f64f0df39f960a6d34d" @@ -16348,6 +20450,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== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" @@ -16368,6 +20475,13 @@ nopt@^5.0.0: dependencies: abbrev "1" +normalize-hex@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/normalize-hex/-/normalize-hex-0.0.2.tgz#5491c43759db2f06b7168d8419f4925c271ab27e" + integrity sha512-E2dx7XJQnjsm6SkS4G6GGvIXRHaLeWAZE2D2N3aia+OpIif2UT8y4S0KCjrX3WmFDSeFnlNOp0FSHFjLeJ4SJw== + dependencies: + bn.js "^4.11.8" + normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -16580,7 +20694,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -16599,7 +20713,7 @@ object-inspect@^1.10.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== -object-inspect@^1.11.0: +object-inspect@^1.11.0, object-inspect@~1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== @@ -16617,6 +20731,11 @@ object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + object-to-arguments@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/object-to-arguments/-/object-to-arguments-0.0.8.tgz#cf4b1f8afc6873d341622b7cb0811d8d0ace5886" @@ -16697,6 +20816,13 @@ object.values@^1.1.0, object.values@^1.1.4: define-properties "^1.1.3" es-abstract "^1.18.2" +oboe@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" + integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= + dependencies: + http-https "^1.0.0" + oboe@2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" @@ -16831,7 +20957,7 @@ os-name@^3.1.0: macos-release "^2.2.0" windows-release "^3.1.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -17206,7 +21332,7 @@ path-exists@^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: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -17280,11 +21406,26 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +penpal@3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/penpal/-/penpal-3.0.7.tgz#d252711ed93b30f1d867eb82342785b3a95f5f75" + integrity sha512-WSXiq5HnEvzvY05SHhaXcsviUmCvh4Ze8AiIZzvmdzaaYAAx4rx8c6Xq6+MaVDG/Nfve3VmGD8HyRP3CkPvPbQ== + +penpal@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/penpal/-/penpal-4.1.1.tgz#c96ccfdac441682acf617f6dcbc177a614e8302b" + integrity sha512-6d1f8khVLyBz3DnhLztbfjJ7+ANxdXRM2l6awpnCdEtbrmse4AGTsELOvGuNY0SU7xZw7heGbP6IikVvaVTOWw== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -17295,6 +21436,11 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== +pify@4.0.1, pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -17305,10 +21451,10 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== pinkie-promise@^2.0.0: version "2.0.1" @@ -17427,6 +21573,11 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + pngquant-bin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-6.0.0.tgz#aff0d7e61095feb96ced379ad8c7294ad3dd1712" @@ -17444,6 +21595,23 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" +pocket-js-core@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/pocket-js-core/-/pocket-js-core-0.0.3.tgz#1ab278b9a6a5775e2bdc3c2c2e218057774061e4" + integrity sha512-OUTEvEVutdjLT6YyldvAlSebpBueUUWg2XKxGNt5u3QqrmLpBOOBmdDnGMNJ+lEwXtko+JqgwFq+HTi4g1QDVg== + dependencies: + axios "^0.18.0" + +popmotion@9.3.6: + version "9.3.6" + resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-9.3.6.tgz#b5236fa28f242aff3871b9e23721f093133248d1" + integrity sha512-ZTbXiu6zIggXzIliMi8LGxXBF5ST+wkpXGEjeTUDUOCdSQ356hij/xjeUdv0F8zCQNeqB1+PR5/BB+gC+QLAPw== + dependencies: + framesync "5.3.0" + hey-listen "^1.0.8" + style-value-types "4.1.4" + tslib "^2.1.0" + popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" @@ -18130,6 +22298,16 @@ postcss@^8.1.0: nanoid "^3.1.23" source-map-js "^0.6.2" +preact@10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== + +preact@^10.5.9: + version "10.5.15" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.15.tgz#6df94d8afecf3f9e10a742fd8c362ddab464225f" + integrity sha512-5chK29n6QcJc3m1lVrKQSQ+V7K1Gb8HeQY6FViQ5AxCAEGu3DaHffWNDkC9+miZgsLvbvU9rxbV1qinGHMHzqA== + prebuild-install@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.0.1.tgz#5902172f7a40eb67305b96c2a695db32636ee26d" @@ -18151,6 +22329,11 @@ prebuild-install@6.0.1: 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" + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -18234,6 +22417,16 @@ printj@~1.1.0: resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== +prism-media@^1.2.9: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.2.tgz#a1f04423ec15d22f3d62b1987b6a25dc49aad13b" + integrity sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g== + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + 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" @@ -18262,6 +22455,21 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" +promise-to-callback@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + dependencies: + is-fn "^1.0.0" + set-immediate-shim "^1.0.1" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promise@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -18292,7 +22500,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@15.7.2, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -18417,6 +22625,19 @@ q@^1.1.2, q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qrcode@1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== + dependencies: + buffer "^5.4.3" + buffer-alloc "^1.2.0" + buffer-from "^1.1.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^13.2.4" + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -18434,6 +22655,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@6.13.5: + version "6.13.5" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -18525,6 +22755,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +randomhex@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" + integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -19019,12 +23254,21 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== +react-event-listener@^0.6.2: + version "0.6.6" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" + integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== + dependencies: + "@babel/runtime" "^7.2.0" + prop-types "^15.6.0" + warning "^4.0.1" + react-intersection-observer@^8.32.0: version "8.32.0" resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.32.0.tgz#47249332e12e8bb99ed35a10bb7dd10446445a7b" integrity sha512-RlC6FvS3MFShxTn4FHAy904bVjX5Nn4/eTjUkurW0fHK+M/fyQdXuyCy9+L7yjA+YMGogzzSJNc7M4UtfSKvtw== -react-is@17.0.2, "react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1: +react-is@17.0.2, "react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -19051,6 +23295,18 @@ react-native-fetch-api@^2.0.0: dependencies: p-defer "^3.0.0" +react-redux@^7.2.4: + version "7.2.6" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.6.tgz#49633a24fe552b5f9caf58feb8a138936ddfe9aa" + integrity sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ== + dependencies: + "@babel/runtime" "^7.15.4" + "@types/react-redux" "^7.1.20" + hoist-non-react-statics "^3.3.2" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^17.0.2" + react-refresh@0.8.3, react-refresh@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" @@ -19151,7 +23407,46 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" -react-transition-group@^4.4.0: +react-slider@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-1.3.1.tgz#41dd88f7c67520811a4114d6f8f49d186268d9da" + integrity sha512-bD8hHJJUgAHI8g1F6PY6432l+Dmcs2fqzUwDhd+0HWDdvfjwNoXRNC2cL9OWyGTjYlJM92A8nF/w1X4pyHfytQ== + +react-table@^7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.7.0.tgz#e2ce14d7fe3a559f7444e9ecfe8231ea8373f912" + integrity sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA== + +react-tradingview-embed@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/react-tradingview-embed/-/react-tradingview-embed-2.2.6.tgz#1f571b883f19c15ecae630a64221eba4cd7f38a1" + integrity sha512-wwFV7ib7MDxLUJGsTNLBG7QlX6q5ZTSSQTGwTl4GSoMxcgBKy6l+T5KK4cNz4JzbSvubCuADlx8oBE5JjYBiLw== + dependencies: + "@testing-library/jest-dom" "^5.14.1" + "@testing-library/react" "^11.2.7" + "@testing-library/user-event" "^13.1.9" + "@types/jest" "^26.0.23" + "@types/node" "^15.12.2" + "@types/react" "^17.0.11" + "@types/react-dom" "^17.0.7" + react "^17.0.2" + react-dom "^17.0.2" + react-scripts "4.0.3" + typescript "^4.3.2" + web-vitals "^2.0.1" + +react-transition-group@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" + integrity sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q== + dependencies: + chain-function "^1.0.0" + dom-helpers "^3.2.0" + loose-envify "^1.3.1" + prop-types "^15.5.6" + warning "^3.0.0" + +react-transition-group@^4.4.0, react-transition-group@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== @@ -19275,7 +23570,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, 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== @@ -19297,6 +23592,26 @@ read@1, read@~1.0.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~1.0.15: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -19351,6 +23666,16 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +recompose@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" + integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog== + dependencies: + change-emitter "^0.1.2" + fbjs "^0.8.1" + hoist-non-react-statics "^2.3.1" + symbol-observable "^1.0.4" + recursive-readdir@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -19387,6 +23712,26 @@ reduce-flatten@^1.0.1: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" integrity sha1-JYx479FT3fk8tWEjf2EYTzaW4yc= +redux-observable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-2.0.0.tgz#4358bef2e924723a8b1ad0e835ccebb1612a6b9a" + integrity sha512-FJz4rLXX+VmDDwZS/LpvQsKnSanDOe8UVjiLryx1g3seZiS69iLpMrcvXD5oFO7rtkPyRdo/FmTqldnT3X3m+w== + dependencies: + rxjs "^7.0.0" + tslib "~2.1.0" + +redux-thunk@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.0.tgz#ac89e1d6b9bdb9ee49ce69a69071be41bbd82d67" + integrity sha512-/y6ZKQNU/0u8Bm7ROLq9Pt/7lU93cT0IucYMrubo89ENjxPa7i8pqLKu6V4X7/TvYovQ6x01unTeyeZ9lgXiTA== + +redux@^4.0.0, redux@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" + integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== + dependencies: + "@babel/runtime" "^7.9.2" + regenerate-unicode-properties@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" @@ -19394,7 +23739,7 @@ regenerate-unicode-properties@^9.0.0: dependencies: regenerate "^1.4.2" -regenerate@^1.4.2: +regenerate@^1.2.1, regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== @@ -19414,6 +23759,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -19424,6 +23774,15 @@ regenerator-runtime@^0.13.7: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regenerator-transform@^0.14.2: version "0.14.5" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" @@ -19457,6 +23816,15 @@ regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^4.7.1: version "4.8.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" @@ -19469,11 +23837,23 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + regjsparser@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" @@ -19540,7 +23920,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.87.0, request@^2.88.0: +request@^2.85.0, request@^2.87.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -19586,6 +23966,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reselect@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.2.tgz#7bf642992d143d4f3b0f2dca8aa52018808a1d51" + integrity sha512-wg60ebcPOtxcptIUfrr7Jt3h4BR86cCW3R7y4qt65lnNb4yz4QgrXcbSioVsIOYguyz42+XTHIyJ5TEruzkFgQ== + resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -19666,7 +24051,7 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -19705,6 +24090,13 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -19775,6 +24167,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rlp@^2.0.0, rlp@^2.2.3: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + rlp@^2.2.4: version "2.2.6" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" @@ -19856,13 +24255,25 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@6, rxjs@^6.4.0, rxjs@^6.6.7: +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@6, rxjs@^6.4.0, rxjs@^6.6.3, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" +rxjs@^7.0.0, rxjs@^7.3.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -19873,6 +24284,13 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + safe-json-utils@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" @@ -19975,12 +24393,17 @@ scroll-into-view-if-needed@^2.2.25: dependencies: compute-scroll-into-view "^1.0.17" +scrypt-js@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== + scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@^3.8.0: +secp256k1@^3.0.1, secp256k1@^3.7.1, secp256k1@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== @@ -20022,6 +24445,11 @@ selfsigned@^1.10.7, selfsigned@^1.10.8: dependencies: node-forge "^0.10.0" +semaphore@>=1.0.1, semaphore@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -20071,6 +24499,11 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@~5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -20132,6 +24565,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -20142,6 +24580,11 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" +setimmediate@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" + integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= + setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -20239,6 +24682,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== +simple-assign@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/simple-assign/-/simple-assign-0.1.0.tgz#17fd3066a5f3d7738f50321bb0f14ca281cc4baa" + integrity sha1-F/0wZqXz13OPUDIbsPFMooHMS6o= + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -20274,6 +24722,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -20458,6 +24911,13 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + source-map-support@^0.5.17, 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" @@ -20496,7 +24956,7 @@ source-map@0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -20603,6 +25063,42 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +squarelink-provider-engine@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/squarelink-provider-engine/-/squarelink-provider-engine-15.0.5.tgz#93a440c5daec517b1b494424d1c279f195cd781c" + integrity sha512-rl9586BLpN/ldujibbMsCfq+lEyY/YMkmWqYcbmKs6VUvB56fsIG23HvVFl1mPRUu7XIq4dOt+V+4G6+GcKTtQ== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.1" + eth-json-rpc-filters "^4.0.2" + eth-json-rpc-infura "^3.1.0" + eth-json-rpc-middleware "^4.1.1" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +squarelink@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/squarelink/-/squarelink-1.1.4.tgz#5303abf1f4a2765accf0b0de7d8b45ba19c270f8" + integrity sha512-VOLwNWhz/QgrGg5INvd7y/TddKDdS6/6FfjqtMys6nLVJA8h+h05WW5/YJLidHCSD0A+2VnPuL8m/lkP1bUk2g== + dependencies: + bignumber.js "^9.0.0" + squarelink-provider-engine "^15.0.5" + squeak@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" @@ -20690,7 +25186,12 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-browserify@3.0.0: +store@2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" + integrity sha1-jFNOKguDH3K3X8XxEZhXxE711ZM= + +stream-browserify@3.0.0, stream-browserify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== @@ -20857,6 +25358,15 @@ string.prototype.padend@^3.0.0: define-properties "^1.1.3" es-abstract "^1.18.0-next.2" +string.prototype.trim@~1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" + integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -20880,6 +25390,11 @@ string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -21010,7 +25525,7 @@ strip-json-comments@~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: +strip-outer@^1.0.0, strip-outer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== @@ -21039,6 +25554,14 @@ style-loader@1.3.0: loader-utils "^2.0.0" schema-utils "^2.7.0" +style-value-types@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-4.1.4.tgz#80f37cb4fb024d6394087403dfb275e8bb627e75" + integrity sha512-LCJL6tB+vPSUoxgUBt9juXIlNJHtBMy8jkXzUJSBzeHWdBu6lhzHqCvLVkXFGsFIlNa2ln1sQHya/gzaFmB2Lg== + dependencies: + hey-listen "^1.0.8" + tslib "^2.1.0" + styled-components@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.1.tgz#8a86dcd31bff7049c2ed408bae36fa23f03f071a" @@ -21088,6 +25611,11 @@ stylis@3.5.4: resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== +stylis@^4.0.10, stylis@^4.0.3: + version "4.0.10" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" + integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== + superstruct@^0.14.2: version "0.14.2" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" @@ -21158,6 +25686,11 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-observable@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -21191,6 +25724,27 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tape@^4.6.3: + version "4.14.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.14.0.tgz#e4d46097e129817175b90925f2385f6b1bcfa826" + integrity sha512-z0+WrUUJuG6wIdWrl4W3rTte2CR26G6qcPOj3w1hfRdcmhF3kHBhOBW9VHsPVAkz08ZmGzp7phVpDupbLzrYKQ== + dependencies: + call-bind "~1.0.2" + deep-equal "~1.1.1" + defined "~1.0.0" + dotignore "~0.1.2" + for-each "~0.3.3" + glob "~7.1.7" + has "~1.0.3" + inherits "~2.0.4" + is-regex "~1.1.3" + minimist "~1.2.5" + object-inspect "~1.11.0" + resolve "~1.20.0" + resumer "~0.0.0" + string.prototype.trim "~1.2.4" + 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" @@ -21408,7 +25962,7 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0, through2@^2.0.2, 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== @@ -21431,7 +25985,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -21476,6 +26030,11 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== +tiny-invariant@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + tiny-secp256k1@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" @@ -21514,11 +26073,23 @@ to-buffer@^1.1.1: resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-hex@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/to-hex/-/to-hex-0.0.11.tgz#22355e09e5b56f5ae2b32502c493320f021171ac" + integrity sha512-3FSU8sfjrVc9fWowwP9xrdhxbp5Wco8uVZLhMhfsNuCFo9Fu8ecD2MgJV/2iAw+755W3AcGSQYVZGOpBmJtNcA== + dependencies: + normalize-hex "0.0.2" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -21597,6 +26168,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + traverse-chain@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" @@ -21629,6 +26205,11 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -21677,7 +26258,7 @@ tsconfig-paths@^3.11.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@2.1.0: +tslib@2.1.0, tslib@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== @@ -21687,16 +26268,16 @@ tslib@^1.10.0, tslib@^1.11.1, tslib@^1.6.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tslib@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -tslib@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -21721,6 +26302,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -21813,7 +26399,7 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== -typedarray-to-buffer@^3.1.5: +typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -21830,6 +26416,11 @@ typeforce@^1.11.5: resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== +typescript@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== + typescript@^4.1.2: version "4.4.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" @@ -21840,6 +26431,11 @@ typescript@^4.1.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== +typescript@^4.3.2: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + typescript@^4.3.5: version "4.3.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" @@ -21850,6 +26446,11 @@ typical@^2.6.1: resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + uglify-js@^3.1.4: version "3.13.8" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.8.tgz#7c2f9f2553f611f3ff592bdc19c6fb208dc60afb" @@ -21890,6 +26491,11 @@ unbzip2-stream@^1.0.9: buffer "^5.2.1" through "^2.3.8" +underscore@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -22082,6 +26688,24 @@ use-subscription@1.5.1: dependencies: object-assign "^4.1.1" +use-wallet@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/use-wallet/-/use-wallet-0.8.1.tgz#2532b02c9a44bdb65c4a5be4f653f0957954c820" + integrity sha512-V0Y6oMnLXWBhl8+DYdouf3VZtjKJppLEBRpdQP95bGQn0s70ODWJQmqYmB1E7zWy04YYPkBofLQbMVzPyArGAA== + dependencies: + "@aragon/provided-connector" "^6.0.7" + "@web3-react/authereum-connector" "^6.1.1" + "@web3-react/core" "^6.1.1" + "@web3-react/fortmatic-connector" "^6.0.9" + "@web3-react/frame-connector" "^6.0.9" + "@web3-react/injected-connector" "^6.0.7" + "@web3-react/portis-connector" "^6.1.1" + "@web3-react/squarelink-connector" "^6.1.1" + "@web3-react/torus-connector" "^6.1.1" + "@web3-react/walletconnect-connector" "^6.1.4" + "@web3-react/walletlink-connector" "^6.1.1" + jsbi "^3.1.1" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -22166,7 +26790,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.0: +util@^0.12.0, util@^0.12.4: version "0.12.4" resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== @@ -22188,6 +26812,21 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" + integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" + integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== + uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -22198,6 +26837,13 @@ uuid@^8.3.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuidv4@6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.0.6.tgz#6966e8dd15760528a0f954843d24fdfdfda5a329" + integrity sha512-10YcruyGJtsG5SJnPG+8atr8toJa7xAOrcO7B7plYYiwpH1mQ8UZHjNSa2MrwGi6KWuyVrXGHr+Rce22F9UAiw== + dependencies: + uuid "7.0.2" + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -22296,6 +26942,34 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +walletlink@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.2.6.tgz#cfea3ba94e5ea33e87b0a2f31151a77ee1a59d72" + integrity sha512-4TF1kkpo9aq1QlfKv6jTCEsV8Rc+1RIuXn2EtsTJt9/H02fG3oy7k49sqB4gXZ9CWN48yoXnmSwq1GdkvfYGjw== + dependencies: + "@metamask/safe-event-emitter" "2.0.0" + bind-decorator "^1.0.11" + bn.js "^5.1.1" + buffer "^6.0.3" + clsx "^1.1.0" + eth-block-tracker "4.4.3" + eth-json-rpc-filters "4.2.2" + eth-rpc-errors "4.0.2" + js-sha256 "0.9.0" + json-rpc-engine "6.1.0" + keccak "^3.0.1" + preact "^10.5.9" + rxjs "^6.6.3" + stream-browserify "^3.0.0" + util "^0.12.4" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + warning@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -22348,6 +27022,11 @@ web-vitals@^1.0.1: resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-1.1.2.tgz#06535308168986096239aa84716e68b4c6ae6d1c" integrity sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig== +web-vitals@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.2.tgz#3a6c8faebf9097a6ccd17f5f45c9485d8d62dab1" + integrity sha512-nZnEH8dj+vJFqCRYdvYv0a59iLXsb8jJkt+xvXfwgnkyPdsSLtKNlYmtTDiHmTNGXeSXtpjTTUcNvFtrAk6VMQ== + web3-core-helpers@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.2.tgz#b6bd5071ca099ba3f92dfafb552eed2b70af2795" @@ -22356,6 +27035,14 @@ web3-core-helpers@1.5.2: web3-eth-iban "1.5.2" web3-utils "1.5.2" +web3-core-helpers@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.6.0.tgz#77e161b6ba930a4008a0df804ab379e0aa7e1e7f" + integrity sha512-H/IAH/0mrgvad/oxVKiAMC7qDzMrPPe/nRKmJOoIsupRg9/frvL62kZZiHhqVD1HMyyswbQFC69QRl7JqWzvxg== + dependencies: + web3-eth-iban "1.6.0" + web3-utils "1.6.0" + web3-core-method@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.2.tgz#d1d602657be1000a29d11e3ca3bf7bc778dea9a5" @@ -22368,6 +27055,18 @@ web3-core-method@1.5.2: web3-core-subscriptions "1.5.2" web3-utils "1.5.2" +web3-core-method@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.6.0.tgz#ebe4ea51f5a4fa809bb68185576186359d3982e9" + integrity sha512-cHekyEil4mtcCOk6Q1Zh4y+2o5pTwsLIxP6Bpt4BRtZgdsyPiadYJpkLAVT/quch5xN7Qs5ZwG5AvRCS3VwD2g== + dependencies: + "@ethereumjs/common" "^2.4.0" + "@ethersproject/transactions" "^5.0.0-beta.135" + web3-core-helpers "1.6.0" + web3-core-promievent "1.6.0" + web3-core-subscriptions "1.6.0" + web3-utils "1.6.0" + web3-core-promievent@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.2.tgz#2dc9fe0e5bbeb7c360fc1aac5f12b32d9949a59b" @@ -22375,6 +27074,13 @@ web3-core-promievent@1.5.2: dependencies: eventemitter3 "4.0.4" +web3-core-promievent@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.6.0.tgz#8b6053ae83cb47164540167fc361469fc604d2dd" + integrity sha512-ZzsevjMXWkhqW9dnVfTfb1OUcK7jKcKPvPIbQ4boJccNgvNZPZKlo8xB4pkAX38n4c59O5mC7Lt/z2QL/M5CeQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-requestmanager@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.2.tgz#43ccc00779394c941b28e6e07e217350fd1ded71" @@ -22386,6 +27092,17 @@ web3-core-requestmanager@1.5.2: web3-providers-ipc "1.5.2" web3-providers-ws "1.5.2" +web3-core-requestmanager@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.6.0.tgz#8ef3a3b89cd08983bd94574f9c5893f70a8a6aea" + integrity sha512-CY5paPdiDXKTXPWaEUZekDfUXSuoE2vPxolwqzsvKwFWH5+H1NaXgrc+D5HpufgSvTXawTw0fy7IAicg8+PWqA== + dependencies: + util "^0.12.0" + web3-core-helpers "1.6.0" + web3-providers-http "1.6.0" + web3-providers-ipc "1.6.0" + web3-providers-ws "1.6.0" + web3-core-subscriptions@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.2.tgz#8eaebde44f81fc13c45b555c4422fe79393da9cf" @@ -22394,6 +27111,14 @@ web3-core-subscriptions@1.5.2: eventemitter3 "4.0.4" web3-core-helpers "1.5.2" +web3-core-subscriptions@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.6.0.tgz#8c23b15b434a7c9f937652ecca45d7108e2c54df" + integrity sha512-kY9WZUY/m1URSOv3uTLshoZD9ZDiFKReIzHuPUkxFpD5oYNmr1/aPQNPCrrMxKODR7UVX/D90FxWwCYqHhLaxQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.6.0" + web3-core@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.2.tgz#ca2b9b1ed3cf84d48b31c9bb91f7628f97cfdcd5" @@ -22407,6 +27132,41 @@ web3-core@1.5.2: web3-core-requestmanager "1.5.2" web3-utils "1.5.2" +web3-core@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.6.0.tgz#144eb00f651c9812faf7176abd7ee99d5f45e212" + integrity sha512-o0WsLrJ2yD+HAAc29lGMWJef/MutTyuzpJC0UzLJtIAQJqtpDalzWINEu4j8XYXGk34N/V6vudtzRPo23QEE6g== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.6.0" + web3-core-method "1.6.0" + web3-core-requestmanager "1.6.0" + web3-utils "1.6.0" + +web3-eth-abi@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.6.0.tgz#4225608f61ebb0607d80849bb2b20f910780253d" + integrity sha512-fImomGE9McuTMJLwK8Tp0lTUzXqCkWeMm00qPVIwpJ/h7lCw9UFYV9+4m29wSqW6FF+FIZKwc6UBEf9dlx3orA== + dependencies: + "@ethersproject/abi" "5.0.7" + web3-utils "1.6.0" + +web3-eth-contract@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.6.0.tgz#deb946867ad86d32bcbba899d733b681b25ea674" + integrity sha512-ZUtO77zFnxuFtrc+D+iJ3AzNgFXAVcKnhEYN7f1PNz/mFjbtE6dJ+ujO0mvMbxIZF02t9IZv0CIXRpK0rDvZAw== + dependencies: + "@types/bn.js" "^4.11.5" + web3-core "1.6.0" + web3-core-helpers "1.6.0" + web3-core-method "1.6.0" + web3-core-promievent "1.6.0" + web3-core-subscriptions "1.6.0" + web3-eth-abi "1.6.0" + web3-utils "1.6.0" + web3-eth-iban@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.2.tgz#f390ad244ef8a6c94de7c58736b0b80a484abc8e" @@ -22415,6 +27175,42 @@ web3-eth-iban@1.5.2: bn.js "^4.11.9" web3-utils "1.5.2" +web3-eth-iban@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.6.0.tgz#edbe46cedc5b148d53fa455edea6b4eef53b2be7" + integrity sha512-HM/bKBS/e8qg0+Eh7B8C/JVG+GkR4AJty17DKRuwMtrh78YsonPj7GKt99zS4n5sDLFww1Imu/ZIk3+K5uJCjw== + dependencies: + bn.js "^4.11.9" + web3-utils "1.6.0" + +web3-provider-engine@15.0.4: + version "15.0.4" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz#5c336bcad2274dff5218bc8db003fa4e9e464c24" + integrity sha512-Ob9oK0TUZfVC7NXkB7CQSWAiCdCD/Xnlh2zTnV8NdJR8LCrMAy2i6JedU70JHaxw59y7mM4GnsYOTTGkquFnNQ== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-errors "^1.0.1" + eth-json-rpc-filters "^4.1.1" + eth-json-rpc-infura "^4.0.1" + eth-json-rpc-middleware "^4.1.5" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + web3-providers-http@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.2.tgz#94f95fe5572ca54aa2c2ffd42c63956436c9eb0a" @@ -22423,6 +27219,14 @@ web3-providers-http@1.5.2: web3-core-helpers "1.5.2" xhr2-cookies "1.1.0" +web3-providers-http@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.6.0.tgz#8db4e589abf7197f5d65b12af1bf9726c45f4160" + integrity sha512-sNxHFNv3lnxpmULt34AS6M36IYB/Hzm2Et4yPNzdP1XE644D8sQBZQZaJQdTaza5HfrlwoqU6AOK935armqGuA== + dependencies: + web3-core-helpers "1.6.0" + xhr2-cookies "1.1.0" + web3-providers-ipc@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.2.tgz#68a516883c998eeddf60df4cead77baca4fb4aaa" @@ -22431,6 +27235,14 @@ web3-providers-ipc@1.5.2: oboe "2.1.5" web3-core-helpers "1.5.2" +web3-providers-ipc@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.6.0.tgz#6a3410fd47a67c4a36719fb97f99534ae12aac98" + integrity sha512-ETYdfhpGiGoWpmmSJnONvnPfd3TPivHEGjXyuX+L5FUsbMOVZj9MFLNIS19Cx/YGL8UWJ/8alLJoTcWSIdz/aA== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.6.0" + web3-providers-ws@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.2.tgz#d336a93ed608b40cdcadfadd1f1bc8d32ea046e0" @@ -22440,6 +27252,28 @@ web3-providers-ws@1.5.2: web3-core-helpers "1.5.2" websocket "^1.0.32" +web3-providers-ws@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.6.0.tgz#dc15dc18c30089efda992015fd5254bd2b77af5f" + integrity sha512-eNRmlhOPCpuVYwBrKBBQRLGPFb4U1Uo44r9EWV69Cpo4gP6XeBTl6nkawhLz6DS0fq79apyPfItJVuSfAy77pA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.6.0" + websocket "^1.0.32" + +web3-utils@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" + integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== + dependencies: + bn.js "4.11.8" + eth-lib "0.2.7" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randomhex "0.1.5" + underscore "1.9.1" + utf8 "3.0.0" + web3-utils@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.2.tgz#150982dcb1918ffc54eba87528e28f009ebc03aa" @@ -22453,6 +27287,24 @@ web3-utils@1.5.2: randombytes "^2.1.0" utf8 "3.0.0" +web3-utils@1.6.0, web3-utils@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.0.tgz#1975c5ee5b7db8a0836eb7004848a7cd962d1ddc" + integrity sha512-bgCAWAeQnJF035YTFxrcHJ5mGEfTi/McsjqldZiXRwlHK7L1PyOqvXiQLE053dlzvy1kdAxWl/sSSfLMyNUAXg== + dependencies: + bn.js "^4.11.9" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -22696,7 +27548,12 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.4.1: +whatwg-fetch@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== @@ -22706,6 +27563,14 @@ whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" @@ -23079,6 +27944,25 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" +ws@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.1.2.tgz#c672d1629de8bb27a9699eb599be47aeeedd8f73" + integrity sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg== + dependencies: + async-limiter "^1.0.0" + +ws@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@^5.1.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -23093,7 +27977,7 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.4.0, ws@^7.4.6: +ws@^7.4.0, ws@^7.4.4, ws@^7.4.6: version "7.5.5" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== @@ -23130,7 +28014,7 @@ xhr2-cookies@1.1.0: dependencies: cookiejar "^2.1.1" -xhr@^2.0.4: +xhr@^2.0.4, xhr@^2.2.0: version "2.6.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== @@ -23150,11 +28034,23 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: +xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, 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== +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -23238,7 +28134,7 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" -yargs@^13.3.0, yargs@^13.3.2: +yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== diff --git a/rust/Anchor.toml b/rust/Anchor.toml index 25183f2adc..446d417970 100644 --- a/rust/Anchor.toml +++ b/rust/Anchor.toml @@ -8,6 +8,7 @@ wallet = "~/.config/solana/id.json" [programs.mainnet] nft_candy_machine = "cndyAnrLdpjq1Ssp1z8xxDsB8dxe7u4HL5Nxi2K5WXZ" fair_launch = "faircnAB9k59Y4TXmLabBULeuTLgV7TkGMGNkjnA15j" +gumdrop = "gdrpGjVffourzkdDRrQmySw4aTHr8a3xmQzzxSwFD1a" [scripts] test = "ts-mocha -p ./tsconfig.json -t 1000000 test/*.ts" diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 976ec404e4..d6e99009c1 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1314,6 +1314,17 @@ dependencies = [ "scroll", ] +[[package]] +name = "gumdrop" +version = "0.0.1" +dependencies = [ + "anchor-lang", + "anchor-spl", + "metaplex-token-metadata 0.0.1", + "solana-program", + "spl-associated-token-account", +] + [[package]] name = "h2" version = "0.3.7" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index bfed8645d5..5487a7949c 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -11,6 +11,7 @@ members = [ "metaplex/test", "token-vault/test", "token-metadata/test", + "gumdrop/", ] exclude = [ ] diff --git a/rust/gumdrop/Cargo.toml b/rust/gumdrop/Cargo.toml new file mode 100644 index 0000000000..c568cb29a6 --- /dev/null +++ b/rust/gumdrop/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "gumdrop" +version = "0.0.1" +description = "A Solana program for distributing tokens and NFTs according to a Merkle root." +authors = [ + "Lawrence Wu ", +] +keywords = ["solana"] +edition = "2018" + +[lib] +crate-type = ["cdylib", "lib"] +name = "gumdrop" + +[features] +no-entrypoint = [] +no-idl = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = "0.17.0" +anchor-spl = "0.17.0" +solana-program = "1.7.11" +spl-associated-token-account = { version = "1.0.3", features = [ + "no-entrypoint" +] } +metaplex-token-metadata = { path = "../token-metadata/program", features = [ + "no-entrypoint" +] } diff --git a/rust/gumdrop/Xargo.toml b/rust/gumdrop/Xargo.toml new file mode 100644 index 0000000000..475fb71ed1 --- /dev/null +++ b/rust/gumdrop/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/rust/gumdrop/src/lib.rs b/rust/gumdrop/src/lib.rs new file mode 100644 index 0000000000..b9414911d3 --- /dev/null +++ b/rust/gumdrop/src/lib.rs @@ -0,0 +1,925 @@ +//! Program for distributing tokens efficiently via uploading a Merkle root. + +use anchor_lang::prelude::*; +use anchor_spl::token::{self, Token, TokenAccount}; +use solana_program::{ + instruction::{AccountMeta, Instruction}, + program::{invoke, invoke_signed}, + sysvar::{self}, + system_instruction::self, +}; +use metaplex_token_metadata::{self}; +use std::io::Write; + +pub mod merkle_proof; + +declare_id!("gdrpGjVffourzkdDRrQmySw4aTHr8a3xmQzzxSwFD1a"); + +fn get_or_create_claim_count<'a>( + distributor : &Account<'a, MerkleDistributor>, + claim_count : &AccountInfo<'a>, + temporal : &Signer<'a>, + payer : &Signer<'a>, + system_program : &Program<'a, System>, + _claim_bump : u8, + index : u64, + claimant_secret : Pubkey, +) -> core::result::Result, ProgramError> { + let rent = &Rent::get()?; + let space = 8 + ClaimCount::default().try_to_vec().unwrap().len(); + let create_claim_state = claim_count.lamports() == 0; // TODO: support initial lamports? + if create_claim_state { + let lamports = rent.minimum_balance(space); + let claim_count_seeds = [ + b"ClaimCount".as_ref(), + &index.to_le_bytes(), + &distributor.key().to_bytes(), + &[_claim_bump], + ]; + + invoke_signed( + &system_instruction::create_account( + &payer.key(), + claim_count.key, + lamports, + space as u64, + &ID), + &[ + payer.to_account_info().clone(), + claim_count.clone(), + system_program.to_account_info().clone(), + ], + &[&claim_count_seeds], + )?; + + let mut data = claim_count.try_borrow_mut_data()?; + let dst: &mut [u8] = &mut data; + let mut cursor = std::io::Cursor::new(dst); + cursor.write_all(&::discriminator()).unwrap(); + } + + // anchor_lang::Account::try_from(&claim_count)?; + let mut pa: anchor_lang::Account = + anchor_lang::Account::try_from(&claim_count)?; + + if create_claim_state { + require!( + temporal.key() == distributor.temporal + || temporal.key() == claimant_secret + || distributor.temporal == Pubkey::default() + , + TemporalMismatch + ); + pa.claimant = payer.key(); + } else { + require!( + pa.claimant == payer.key(), + OwnerMismatch, + ); + } + + Ok(pa) +} + +/// The [merkle_distributor] program. +#[program] +pub mod merkle_distributor { + use super::*; + + /// Creates a new [MerkleDistributor]. + /// After creating this [MerkleDistributor], the account should be seeded with tokens via + /// delegates + pub fn new_distributor( + ctx: Context, + bump: u8, + root: [u8; 32], + temporal: Pubkey, + ) -> ProgramResult { + let distributor = &mut ctx.accounts.distributor; + + distributor.base = ctx.accounts.base.key(); + distributor.bump = bump; + + distributor.root = root; + distributor.temporal = temporal; + + Ok(()) + } + + /// Closes distributor-owned token accounts. Normal tokens should just use a delegate but we + /// need to transfer ownership for edition minting ATM. + pub fn close_distributor_token_account( + ctx: Context, + _bump: u8, + ) -> ProgramResult { + let distributor = &ctx.accounts.distributor; + + // should be implicit in the PDA + require!(distributor.base == ctx.accounts.base.key(), Unauthorized); + + let seeds = [ + b"MerkleDistributor".as_ref(), + &distributor.base.to_bytes(), + &[ctx.accounts.distributor.bump], + ]; + + token::transfer( + CpiContext::new( + ctx.accounts.token_program.to_account_info(), + token::Transfer { + from: ctx.accounts.from.to_account_info(), + to: ctx.accounts.to.to_account_info(), + authority: ctx.accounts.distributor.to_account_info(), + }, + ) + .with_signer(&[&seeds[..]]), + ctx.accounts.from.amount, + )?; + + token::close_account( + CpiContext::new( + ctx.accounts.token_program.to_account_info(), + token::CloseAccount { + account: ctx.accounts.from.to_account_info(), + destination: ctx.accounts.receiver.to_account_info(), + authority: ctx.accounts.distributor.to_account_info(), + }, + ) + .with_signer(&[&seeds[..]]), + )?; + + Ok(()) + } + + /// Closes an existing [MerkleDistributor]. + /// Moves all tokens from the [MerkleDistributor] to the specified account and closes + /// distributor accounts. + /// Must `close_distributor_token_account` first + pub fn close_distributor<'info>( + ctx: Context<'_, '_, '_, 'info, CloseDistributor<'info>>, + _bump: u8, + _wallet_bump: u8, + ) -> ProgramResult { + let distributor = &ctx.accounts.distributor; + + // should be implicit in the PDA + require!(distributor.base == ctx.accounts.base.key(), Unauthorized); + + let wallet_seeds = [ + b"Wallet".as_ref(), + &distributor.key().to_bytes(), + &[_wallet_bump], + ]; + + if !ctx.remaining_accounts.is_empty() { + // transfer authority out + let candy_machine_info = &ctx.remaining_accounts[0]; + let candy_machine_program_info = &ctx.remaining_accounts[1]; + + // TODO. global::update_authority instruction... + let mut data = vec![ + 0x20, 0x2e, 0x40, 0x1c, 0x95, 0x4b, 0xf3, 0x58, + ]; + + data.push(0x01); + data.extend_from_slice(&ctx.accounts.receiver.key.to_bytes()); + + invoke_signed( + &Instruction { + program_id: *candy_machine_program_info.key, + accounts: vec![ + AccountMeta::new(*candy_machine_info.key, false), + AccountMeta::new(*ctx.accounts.distributor_wallet.key, true), + ], + data: data, + }, + &[ + candy_machine_info.clone(), + ctx.accounts.distributor_wallet.clone(), + ], + &[&wallet_seeds], + )?; + } + + invoke_signed( + &system_instruction::transfer( + ctx.accounts.distributor_wallet.key, + ctx.accounts.receiver.key, + ctx.accounts.distributor_wallet.lamports(), + ), + &[ + ctx.accounts.distributor_wallet.clone(), + ctx.accounts.receiver.clone(), + ctx.accounts.system_program.to_account_info().clone(), + ], + &[&wallet_seeds], + )?; + + Ok(()) + } + + /// Claims tokens from the [MerkleDistributor]. + pub fn claim( + ctx: Context, + _bump: u8, + index: u64, + amount: u64, + claimant_secret: Pubkey, + proof: Vec<[u8; 32]>, + ) -> ProgramResult { + let claim_status = &mut ctx.accounts.claim_status; + require!( + *claim_status.to_account_info().owner == ID, + OwnerMismatch + ); + require!( + // This check is redudant, we should not be able to initialize a claim status account at the same key. + !claim_status.is_claimed && claim_status.claimed_at == 0, + DropAlreadyClaimed + ); + + let distributor = &ctx.accounts.distributor; + let mint = ctx.accounts.from.mint; + + // Verify the merkle proof. + let node = solana_program::keccak::hashv(&[ + &[0x00], + &index.to_le_bytes(), + &claimant_secret.to_bytes(), + &mint.to_bytes(), + &amount.to_le_bytes(), + ]); + require!( + merkle_proof::verify(proof, distributor.root, node.0), + InvalidProof + ); + + // Mark it claimed and send the tokens. + claim_status.amount = amount; + claim_status.is_claimed = true; + let clock = Clock::get()?; + claim_status.claimed_at = clock.unix_timestamp; + claim_status.claimant = ctx.accounts.payer.key(); + + let seeds = [ + b"MerkleDistributor".as_ref(), + &distributor.base.to_bytes(), + &[ctx.accounts.distributor.bump], + ]; + + require!( + ctx.accounts.temporal.key() == distributor.temporal + || ctx.accounts.temporal.key() == claimant_secret + || distributor.temporal == Pubkey::default() + , + TemporalMismatch + ); + token::transfer( + CpiContext::new( + ctx.accounts.token_program.to_account_info(), + token::Transfer { + from: ctx.accounts.from.to_account_info(), + to: ctx.accounts.to.to_account_info(), + authority: ctx.accounts.distributor.to_account_info(), + }, + ) + .with_signer(&[&seeds[..]]), + amount, + )?; + + emit!(ClaimedEvent { + index, + claimant: ctx.accounts.payer.key(), + amount + }); + Ok(()) + } + + /// Claims NFTs directly from the candy machine through the [MerkleDistributor]. + pub fn claim_candy( + ctx: Context, + _wallet_bump: u8, + _claim_bump: u8, + index: u64, + amount: u64, + claimant_secret: Pubkey, + proof: Vec<[u8; 32]>, + ) -> ProgramResult { + let distributor = &ctx.accounts.distributor; + let mut claim_count = get_or_create_claim_count( + &ctx.accounts.distributor, + &ctx.accounts.claim_count, + &ctx.accounts.temporal, + &ctx.accounts.payer, + &ctx.accounts.system_program, + _claim_bump, + index, + claimant_secret, + )?; + require!( + *claim_count.to_account_info().owner == ID, + OwnerMismatch + ); + + // TODO: this is a bit weird but we verify elsewhere that the candy_machine_config is + // actually a config thing and not a mint + // Verify the merkle proof. + let node = solana_program::keccak::hashv(&[ + &[0x00], + &index.to_le_bytes(), + &claimant_secret.to_bytes(), + &ctx.accounts.candy_machine_config.key.to_bytes(), + &amount.to_le_bytes(), + ]); + require!( + merkle_proof::verify(proof, distributor.root, node.0), + InvalidProof + ); + + // This user is whitelisted to mint at most `amount` NFTs from the candy machine + require!( + claim_count.count < amount, + DropAlreadyClaimed + ); + + // Mark it claimed + claim_count.count += 1; + + // Transfer the required SOL from the payer + let required_lamports; + { + let rent = &Rent::get()?; + let mut candy_machine_data: &[u8] = &ctx.accounts.candy_machine.try_borrow_data()?; + required_lamports = CandyMachine::try_deserialize(&mut candy_machine_data)?.data.price + + rent.minimum_balance(metaplex_token_metadata::state::MAX_METADATA_LEN) + + rent.minimum_balance(metaplex_token_metadata::state::MAX_MASTER_EDITION_LEN); + } + msg!( + "Transferring {} lamports to distributor wallet for candy machine mint", + required_lamports, + ); + invoke( + &system_instruction::transfer( + ctx.accounts.payer.key, + ctx.accounts.distributor_wallet.key, + required_lamports, + ), + &[ + ctx.accounts.payer.to_account_info().clone(), + ctx.accounts.distributor_wallet.clone(), + ctx.accounts.system_program.to_account_info().clone(), + ], + )?; + + let wallet_seeds = [ + b"Wallet".as_ref(), + &distributor.key().to_bytes(), + &[_wallet_bump], + ]; + + let candy_machine_infos = [ + ctx.accounts.candy_machine_config.clone(), + ctx.accounts.candy_machine.to_account_info().clone(), + ctx.accounts.distributor_wallet.clone(), + ctx.accounts.candy_machine_wallet.clone(), + ctx.accounts.candy_machine_metadata.clone(), + ctx.accounts.candy_machine_mint.clone(), + ctx.accounts.payer.to_account_info().clone(), + ctx.accounts.candy_machine_master_edition.clone(), + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.token_program.to_account_info().clone(), + ctx.accounts.system_program.to_account_info().clone(), + ctx.accounts.rent.to_account_info().clone(), + ctx.accounts.clock.to_account_info().clone(), + ]; + + invoke_signed( + &Instruction { + program_id: *ctx.accounts.candy_machine_program.key, + accounts: vec![ + AccountMeta::new_readonly(*ctx.accounts.candy_machine_config.key, false), + AccountMeta::new(ctx.accounts.candy_machine.key(), false), + AccountMeta::new(*ctx.accounts.distributor_wallet.key, true), + AccountMeta::new(*ctx.accounts.candy_machine_wallet.key, false), + AccountMeta::new(*ctx.accounts.candy_machine_metadata.key, false), + AccountMeta::new(*ctx.accounts.candy_machine_mint.key, false), + AccountMeta::new_readonly(*ctx.accounts.payer.key, true), + AccountMeta::new_readonly(*ctx.accounts.payer.key, true), + AccountMeta::new(*ctx.accounts.candy_machine_master_edition.key, false), + AccountMeta::new_readonly(*ctx.accounts.token_metadata_program.key, false), + AccountMeta::new_readonly(*ctx.accounts.token_program.key, false), + AccountMeta::new_readonly(*ctx.accounts.system_program.key, false), + AccountMeta::new_readonly(sysvar::rent::id(), false), + AccountMeta::new_readonly(sysvar::clock::id(), false), + ], + // TODO. global::mint_nft instruction... + data: vec![0xd3, 0x39, 0x06, 0xa7, 0x0f, 0xdb, 0x23, 0xfb], + }, + &candy_machine_infos, + &[&wallet_seeds], + )?; + + // reserialize claim_count + { + let mut claim_count_data: &mut [u8] = &mut ctx.accounts.claim_count.try_borrow_mut_data()?; + claim_count.try_serialize(&mut claim_count_data)?; + } + + Ok(()) + } + + /// Claims NFTs by calling MintNewEditionFromMasterEditionViaToken + pub fn claim_edition( + ctx: Context, + _claim_bump: u8, + index: u64, + amount: u64, + edition: u64, + claimant_secret: Pubkey, + proof: Vec<[u8; 32]>, + ) -> ProgramResult { + let distributor = &ctx.accounts.distributor; + let mut claim_count = get_or_create_claim_count( + &ctx.accounts.distributor, + &ctx.accounts.claim_count, + &ctx.accounts.temporal, + &ctx.accounts.payer, + &ctx.accounts.system_program, + _claim_bump, + index, + claimant_secret, + )?; + require!( + *claim_count.to_account_info().owner == ID, + OwnerMismatch + ); + + // TODO: master_edition or something else? should we has the edition here also? + let node = solana_program::keccak::hashv(&[ + &[0x00], + &index.to_le_bytes(), + &claimant_secret.to_bytes(), + &ctx.accounts.metadata_master_mint.key.to_bytes(), + &amount.to_le_bytes(), + &edition.to_le_bytes(), + ]); + require!( + merkle_proof::verify(proof, distributor.root, node.0), + InvalidProof + ); + + // This user is whitelisted to mint at most `amount` NFTs from the candy machine + require!( + claim_count.count < amount, + DropAlreadyClaimed + ); + + // Mark it claimed + claim_count.count += 1; + + let seeds = [ + b"MerkleDistributor".as_ref(), + &distributor.base.to_bytes(), + &[ctx.accounts.distributor.bump], + ]; + + let metadata_infos = [ + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.metadata_new_metadata.clone(), + ctx.accounts.metadata_new_edition.clone(), + ctx.accounts.metadata_master_edition.clone(), + ctx.accounts.metadata_new_mint.clone(), + ctx.accounts.metadata_edition_mark_pda.clone(), + ctx.accounts.metadata_new_mint_authority.to_account_info().clone(), + ctx.accounts.payer.to_account_info().clone(), + ctx.accounts.distributor.to_account_info().clone(), + ctx.accounts.metadata_master_token_account.clone(), + ctx.accounts.metadata_new_update_authority.clone(), + ctx.accounts.metadata_master_metadata.clone(), + ctx.accounts.metadata_master_mint.clone(), + ctx.accounts.rent.to_account_info().clone(), + ]; + + invoke_signed( + &metaplex_token_metadata::instruction::mint_new_edition_from_master_edition_via_token( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.metadata_new_metadata.key, + *ctx.accounts.metadata_new_edition.key, + *ctx.accounts.metadata_master_edition.key, + *ctx.accounts.metadata_new_mint.key, + *ctx.accounts.metadata_new_mint_authority.key, + *ctx.accounts.payer.key, + ctx.accounts.distributor.key(), + *ctx.accounts.metadata_master_token_account.key, + *ctx.accounts.metadata_new_update_authority.key, + *ctx.accounts.metadata_master_metadata.key, + *ctx.accounts.metadata_master_mint.key, + edition, + ), + &metadata_infos, + &[&seeds], + )?; + + // reserialize claim_count + { + let mut claim_count_data: &mut [u8] = &mut ctx.accounts.claim_count.try_borrow_mut_data()?; + claim_count.try_serialize(&mut claim_count_data)?; + } + + Ok(()) + } +} + +/// Accounts for [merkle_distributor::new_distributor]. +#[derive(Accounts)] +#[instruction(bump: u8)] +pub struct NewDistributor<'info> { + /// Base key of the distributor. + pub base: Signer<'info>, + + /// [MerkleDistributor]. + #[account( + init, + seeds = [ + b"MerkleDistributor".as_ref(), + base.key().to_bytes().as_ref() + ], + bump = bump, + payer = payer + )] + pub distributor: Account<'info, MerkleDistributor>, + + /// Payer to create the distributor. + pub payer: Signer<'info>, + + /// The [System] program. + pub system_program: Program<'info, System>, +} + +/// [merkle_distributor::close_distributor_token_acconut] accounts. +#[derive(Accounts)] +#[instruction(_bump: u8)] +pub struct CloseDistributorTokenAccount<'info> { + /// Base key of the distributor. + pub base: Signer<'info>, + + /// [MerkleDistributor]. + #[account( + seeds = [ + b"MerkleDistributor".as_ref(), + base.key().to_bytes().as_ref() + ], + bump = _bump, + )] + pub distributor: Account<'info, MerkleDistributor>, + + /// Distributor containing the tokens to distribute. + #[account(mut)] + pub from: Account<'info, TokenAccount>, + + /// Account to send the claimed tokens to. + #[account(mut)] + pub to: Account<'info, TokenAccount>, + + /// Who is receiving the remaining rent allocation. + #[account(mut)] + pub receiver: AccountInfo<'info>, + + /// The [System] program. + pub system_program: Program<'info, System>, + + /// SPL [Token] program. + pub token_program: Program<'info, Token>, +} + +/// [merkle_distributor::close_distributor] accounts. +#[derive(Accounts)] +#[instruction(_bump: u8, _wallet_bump: u8)] +pub struct CloseDistributor<'info> { + /// Base key of the distributor. + pub base: Signer<'info>, + + /// [MerkleDistributor]. + #[account( + seeds = [ + b"MerkleDistributor".as_ref(), + base.key().to_bytes().as_ref() + ], + bump = _bump, + mut, + close = receiver, + )] + pub distributor: Account<'info, MerkleDistributor>, + + #[account( + seeds = [ + b"Wallet".as_ref(), + distributor.key().to_bytes().as_ref() + ], + bump = _wallet_bump, + mut, + )] + pub distributor_wallet: AccountInfo<'info>, + + /// Who is receiving the remaining tokens and rent allocations. + pub receiver: AccountInfo<'info>, + + /// The [System] program. + pub system_program: Program<'info, System>, + + /// SPL [Token] program. + pub token_program: Program<'info, Token>, +} + +/// [merkle_distributor::claim] accounts. +#[derive(Accounts)] +#[instruction(_bump: u8, index: u64)] +pub struct Claim<'info> { + /// The [MerkleDistributor]. + #[account(mut)] + pub distributor: Account<'info, MerkleDistributor>, + + /// Status of the claim. + #[account( + init, + seeds = [ + b"ClaimStatus".as_ref(), + index.to_le_bytes().as_ref(), + distributor.key().to_bytes().as_ref() + ], + bump = _bump, + payer = payer + )] + pub claim_status: Account<'info, ClaimStatus>, + + /// Distributor containing the tokens to distribute. + #[account(mut)] + pub from: Account<'info, TokenAccount>, + + /// Account to send the claimed tokens to. + #[account(mut)] + pub to: Account<'info, TokenAccount>, + + /// Extra signer expected for claims + pub temporal: Signer<'info>, + + /// Payer of the claim. + pub payer: Signer<'info>, + + /// The [System] program. + pub system_program: Program<'info, System>, + + /// SPL [Token] program. + pub token_program: Program<'info, Token>, +} + +/// [merkle_distributor::claim_candy] accounts. +#[derive(Accounts)] +#[instruction(_wallet_bump: u8, _claim_bump: u8,index: u64)] +pub struct ClaimCandy<'info> { + /// The [MerkleDistributor]. + #[account(mut)] + pub distributor: Account<'info, MerkleDistributor>, + + /// The [MerkleDistributor] wallet + #[account( + seeds = [ + b"Wallet".as_ref(), + distributor.key().to_bytes().as_ref() + ], + bump = _wallet_bump, + mut + )] + pub distributor_wallet: AccountInfo<'info>, + + /// Status of the claim. Created on first invocation of this function + #[account( + seeds = [ + b"ClaimCount".as_ref(), + index.to_le_bytes().as_ref(), + distributor.key().to_bytes().as_ref() + ], + bump = _claim_bump, + mut, + )] + // #[account(mut)] + pub claim_count: AccountInfo<'info>, + + /// Extra signer expected for claims + pub temporal: Signer<'info>, + + /// Payer of the claim. Should be `mint_authority` for `candy_machine_mint` and will be + /// `update_authority` for `candy_machine_metadata` + pub payer: Signer<'info>, + + + /// Candy-machine Config + pub candy_machine_config: AccountInfo<'info>, + + /// Candy-Machine. Verified through CPI + #[account(mut)] + pub candy_machine: AccountInfo<'info>, + + /// Candy-Machine-Wallet. Verified through CPI + #[account(mut)] + pub candy_machine_wallet: AccountInfo<'info>, + + /// Generated mint + #[account(mut)] + pub candy_machine_mint: AccountInfo<'info>, + + /// PDA of `candy_machine_mint` + #[account(mut)] + pub candy_machine_metadata: AccountInfo<'info>, + + /// PDA of `candy_machine_mint` + #[account(mut)] + pub candy_machine_master_edition: AccountInfo<'info>, + + /// The [System] program. + pub system_program: Program<'info, System>, + + /// SPL [Token] program. + pub token_program: Program<'info, Token>, + + /// SPL [TokenMetadata] program. + // #[account(address = metaplex_token_metadata::id())] + pub token_metadata_program: AccountInfo<'info>, + + /// SPL [CandyMachine] program. + // TODO: specific address? + pub candy_machine_program: AccountInfo<'info>, + + rent: Sysvar<'info, Rent>, + clock: Sysvar<'info, Clock>, +} + +/// [merkle_distributor::claim_edition] accounts. Wrapper around +/// MintNewEditionFromMasterEditionViaToken +#[derive(Accounts)] +#[instruction(_claim_bump: u8,index: u64)] +pub struct ClaimEdition<'info> { + /// Given a token account containing the master edition token to prove authority, and a brand new non-metadata-ed mint with one token + /// make a new Metadata + Edition that is a child of the master edition denoted by this authority token. + /// 4. `[writable]` Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master metadata mint id, 'edition', edition_number]) + /// where edition_number is NOT the edition number you pass in args but actually edition_number = floor(edition/EDITION_MARKER_BIT_SIZE). + /// 8. `[]` token account containing token from master metadata mint + + /// The [MerkleDistributor]. + #[account(mut)] + pub distributor: Account<'info, MerkleDistributor>, + + /// Status of the claim. Created on first invocation of this function + #[account( + seeds = [ + b"ClaimCount".as_ref(), + index.to_le_bytes().as_ref(), + distributor.key().to_bytes().as_ref() + ], + bump = _claim_bump, + mut, + )] + // #[account(mut)] + pub claim_count: AccountInfo<'info>, + + /// Extra signer expected for claims + pub temporal: Signer<'info>, + + /// Payer of the claim. Should be `mint_authority` for `candy_machine_mint` and will be + /// `update_authority` for `candy_machine_metadata` + pub payer: Signer<'info>, + + /// PDA of `metadata_new_mint` + #[account(mut)] + pub metadata_new_metadata: AccountInfo<'info>, + + /// PDA of `metadata_new_mint` + #[account(mut)] + pub metadata_new_edition: AccountInfo<'info>, + + /// PDA of `metadata_master_mint` + #[account(mut)] + pub metadata_master_edition: AccountInfo<'info>, + + /// Generated mint + #[account(mut)] + pub metadata_new_mint: AccountInfo<'info>, + + /// PDA of `metadata_master_mint` and edition number + #[account(mut)] + pub metadata_edition_mark_pda: AccountInfo<'info>, + + /// Mint authority for `metadata_new_mint` + pub metadata_new_mint_authority: Signer<'info>, + + /// Owner of token account containing master token (#8) + /// distributor + + /// Token account + pub metadata_master_token_account: AccountInfo<'info>, + + /// Update authority for new metadata + pub metadata_new_update_authority: AccountInfo<'info>, + + /// Master record metadata account + pub metadata_master_metadata: AccountInfo<'info>, + + /// Master metadata mint account + pub metadata_master_mint: AccountInfo<'info>, + + /// The [System] program. + pub system_program: Program<'info, System>, + + /// SPL [Token] program. + pub token_program: Program<'info, Token>, + + /// SPL [TokenMetadata] program. + // #[account(address = metaplex_token_metadata::id())] + pub token_metadata_program: AccountInfo<'info>, + + rent: Sysvar<'info, Rent>, +} + +/// State for the account which distributes tokens. +#[account] +#[derive(Default)] +pub struct MerkleDistributor { + /// Base key used to generate the PDA. + pub base: Pubkey, + /// Bump seed. + pub bump: u8, + + /// The 256-bit merkle root. + pub root: [u8; 32], + + /// Third-party signer expected on claims. Verified by OTP with off-chain distribution method + pub temporal: Pubkey, +} + +#[account] +#[derive(Default)] +pub struct ClaimStatus { + /// If true, the tokens have been claimed. + pub is_claimed: bool, + /// Authority that claimed the tokens. + pub claimant: Pubkey, + /// When the tokens were claimed. + pub claimed_at: i64, + /// Amount of tokens claimed. + pub amount: u64, +} + +#[account] +#[derive(Default)] +pub struct ClaimCount { + /// Number of NFTs claimed. Compared versus `amount` in merkle tree data / proof + pub count: u64, + /// Authority that claimed the tokens. + pub claimant: Pubkey, +} + +/// Emitted when tokens are claimed. +#[event] +pub struct ClaimedEvent { + /// Index of the claim. + pub index: u64, + /// User that claimed. + pub claimant: Pubkey, + /// Amount of tokens to distribute. + pub amount: u64, +} + +// TODO: from cargo package... +#[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, +} + +#[error] +pub enum ErrorCode { + #[msg("Invalid Merkle proof.")] + InvalidProof, + #[msg("Drop already claimed.")] + DropAlreadyClaimed, + #[msg("Account is not authorized to execute this instruction")] + Unauthorized, + #[msg("Token account owner did not match intended owner")] + OwnerMismatch, + #[msg("Temporal signer did not match distributor")] + TemporalMismatch, +} diff --git a/rust/gumdrop/src/merkle_proof.rs b/rust/gumdrop/src/merkle_proof.rs new file mode 100644 index 0000000000..92bf39df51 --- /dev/null +++ b/rust/gumdrop/src/merkle_proof.rs @@ -0,0 +1,21 @@ +//! These functions deal with verification of Merkle trees (hash trees). +//! Direct port of https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/cryptography/MerkleProof.sol + +/// Returns true if a `leaf` can be proved to be a part of a Merkle tree +/// defined by `root`. For this, a `proof` must be provided, containing +/// sibling hashes on the branch from the leaf to the root of the tree. Each +/// pair of leaves and each pair of pre-images are assumed to be sorted. +pub fn verify(proof: Vec<[u8; 32]>, root: [u8; 32], leaf: [u8; 32]) -> bool { + let mut computed_hash = leaf; + for proof_element in proof.into_iter() { + if computed_hash <= proof_element { + // Hash(current computed hash + current element of the proof) + computed_hash = solana_program::keccak::hashv(&[&[0x01], &computed_hash, &proof_element]).0; + } else { + // Hash(current element of the proof + current computed hash) + computed_hash = solana_program::keccak::hashv(&[&[0x01], &proof_element, &computed_hash]).0; + } + } + // Check if the computed hash (root) is equal to the provided root + computed_hash == root +}