diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..6b64c5b0 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@cerc-io:registry=https://git.vdb.to/api/packages/cerc-io/npm/ diff --git a/README.md b/README.md index 829bcb71..c6fc65c0 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,48 @@ -# watcher-ts +# uniswap-watcher-ts ## Setup This project uses [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/). -Install packages (Node.JS v16.13.1): - -```bash -yarn - -yarn build -``` +- Install packages (Node.JS v16.15.1): + + ```bash + yarn + ``` + +- Link [@cerc-io/watcher-ts](https://github.com/cerc-io/watcher-ts) packages: + + - In `@cerc-io/watcher-ts` repo, build and link the packages to use from uniswap-watcher-ts + + ```bash + # Build packages + yarn && yarn build + + # Link packages + cd packages/util && yarn link && cd ../.. + cd packages/ipld-eth-client && yarn link && cd ../.. + cd packages/solidity-mapper && yarn link && cd ../.. + # Workaround for typeorm dependency issue when using yarn link + cd node_modules/typeorm && yarn link && cd ../.. + ``` + + - In `uniswap-watcher-ts`: + + ```bash + yarn link "@cerc-io/util" + yarn link "@cerc-io/ipld-eth-client" + yarn link "@cerc-io/solidity-mapper" + yarn link "typeorm" + ``` + +- Build packages: + + ```bash + yarn build + + # For running tests + yarn build:contracts + ``` ### Services diff --git a/packages/erc20-watcher/package.json b/packages/erc20-watcher/package.json index 4b77a7c3..40a8795d 100644 --- a/packages/erc20-watcher/package.json +++ b/packages/erc20-watcher/package.json @@ -46,7 +46,6 @@ "@types/lodash": "^4.14.168", "@vulcanize/cache": "^0.1.0", "@vulcanize/ipld-eth-client": "^0.1.0", - "@vulcanize/solidity-mapper": "^0.1.0", "@vulcanize/util": "^0.1.0", "apollo-server-express": "^2.25.0", "apollo-type-bigint": "^0.1.3", diff --git a/packages/erc20-watcher/src/cli/reset-cmds/state.ts b/packages/erc20-watcher/src/cli/reset-cmds/state.ts index 2dad30a7..60c35b8a 100644 --- a/packages/erc20-watcher/src/cli/reset-cmds/state.ts +++ b/packages/erc20-watcher/src/cli/reset-cmds/state.ts @@ -44,7 +44,7 @@ export const handler = async (argv: any): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue, serverConfig.mode); + const indexer = new Indexer(serverConfig, db, ethClient, ethProvider, jobQueue); const syncStatus = await indexer.getSyncStatus(); assert(syncStatus, 'Missing syncStatus'); diff --git a/packages/erc20-watcher/src/cli/watch-contract.ts b/packages/erc20-watcher/src/cli/watch-contract.ts index 445fdfc2..c1248b18 100644 --- a/packages/erc20-watcher/src/cli/watch-contract.ts +++ b/packages/erc20-watcher/src/cli/watch-contract.ts @@ -9,7 +9,7 @@ import 'reflect-metadata'; import { Config, DEFAULT_CONFIG_PATH, getConfig, getResetConfig, JobQueue } from '@vulcanize/util'; import { Database } from '../database'; -import { Indexer } from '../indexer'; +import { CONTRACT_KIND, Indexer } from '../indexer'; (async () => { const argv = await yargs.parserConfiguration({ @@ -29,6 +29,12 @@ import { Indexer } from '../indexer'; demandOption: true, describe: 'Address of the deployed contract' }, + checkpoint: { + type: 'boolean', + require: true, + demandOption: true, + describe: 'Turn checkpointing on' + }, startingBlock: { type: 'number', default: 1, @@ -37,7 +43,7 @@ import { Indexer } from '../indexer'; }).argv; const config: Config = await getConfig(argv.configFile); - const { database: dbConfig, server: { mode }, jobQueue: jobQueueConfig } = config; + const { database: dbConfig, jobQueue: jobQueueConfig } = config; const { ethClient, ethProvider } = await getResetConfig(config); assert(dbConfig); @@ -53,9 +59,9 @@ import { Indexer } from '../indexer'; const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); - await indexer.watchContract(argv.address, argv.startingBlock); + await indexer.watchContract(argv.address, CONTRACT_KIND, argv.checkpoint, argv.startingBlock); await db.close(); await jobQueue.stop(); diff --git a/packages/erc20-watcher/src/database.ts b/packages/erc20-watcher/src/database.ts index ff503cda..f5945954 100644 --- a/packages/erc20-watcher/src/database.ts +++ b/packages/erc20-watcher/src/database.ts @@ -6,7 +6,7 @@ import assert from 'assert'; import { Connection, ConnectionOptions, DeepPartial, FindConditions, FindManyOptions, QueryRunner } from 'typeorm'; import path from 'path'; -import { Database as BaseDatabase, QueryOptions, Where } from '@vulcanize/util'; +import { Database as BaseDatabase, DatabaseInterface, StateKind, QueryOptions, Where } from '@cerc-io/util'; import { Allowance } from './entity/Allowance'; import { Balance } from './entity/Balance'; @@ -17,8 +17,10 @@ import { Contract } from './entity/Contract'; import { Event } from './entity/Event'; import { SyncStatus } from './entity/SyncStatus'; import { BlockProgress } from './entity/BlockProgress'; +import { IPLDBlock } from './entity/IPLDBlock'; +import { IpldStatus } from './entity/IpldStatus'; -export class Database { +export class Database implements DatabaseInterface { _config: ConnectionOptions _conn!: Connection _baseDatabase: BaseDatabase; @@ -42,6 +44,47 @@ export class Database { return this._baseDatabase.close(); } + getNewIPLDBlock (): IPLDBlock { + return new IPLDBlock(); + } + + async getIPLDBlocks (where: FindConditions): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getIPLDBlocks(repo, where); + } + + async getLatestIPLDBlock (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getLatestIPLDBlock(repo, contractAddress, kind, blockNumber); + } + + // Fetch all diff IPLDBlocks after the specified block number. + async getDiffIPLDBlocksInRange (contractAddress: string, startblock: number, endBlock: number): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getDiffIPLDBlocksInRange(repo, contractAddress, startblock, endBlock); + } + + async saveOrUpdateIPLDBlock (dbTx: QueryRunner, ipldBlock: IPLDBlock): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + return this._baseDatabase.saveOrUpdateIPLDBlock(repo, ipldBlock); + } + + async removeIPLDBlocks (dbTx: QueryRunner, blockNumber: number, kind: string): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + await this._baseDatabase.removeIPLDBlocks(repo, blockNumber, kind); + } + + async getIPLDStatus (): Promise { + const repo = this._conn.getRepository(IpldStatus); + + return this._baseDatabase.getIPLDStatus(repo); + } + async getBalance ({ blockHash, token, owner }: { blockHash: string, token: string, owner: string }): Promise { return this._conn.getRepository(Balance) .createQueryBuilder('balance') @@ -154,16 +197,23 @@ export class Database { return this._baseDatabase.getBlockEvents(repo, blockHash, where, queryOptions); } + async saveBlockWithEvents (queryRunner: QueryRunner, block: DeepPartial, events: DeepPartial[]): Promise { + const blockRepo = queryRunner.manager.getRepository(BlockProgress); + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveBlockWithEvents(blockRepo, eventRepo, block, events); + } + async saveEvents (queryRunner: QueryRunner, events: Event[]): Promise { const eventRepo = queryRunner.manager.getRepository(Event); return this._baseDatabase.saveEvents(eventRepo, events); } - async saveContract (queryRunner: QueryRunner, address: string, kind: string, startingBlock: number): Promise { + async saveContract (queryRunner: QueryRunner, address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { const repo = queryRunner.manager.getRepository(Contract); - return this._baseDatabase.saveContract(repo, address, startingBlock, kind); + return this._baseDatabase.saveContract(repo, address, kind, checkpoint, startingBlock); } async updateSyncStatusIndexedBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { diff --git a/packages/erc20-watcher/src/entity/BlockProgress.ts b/packages/erc20-watcher/src/entity/BlockProgress.ts index a28f3297..a0f93553 100644 --- a/packages/erc20-watcher/src/entity/BlockProgress.ts +++ b/packages/erc20-watcher/src/entity/BlockProgress.ts @@ -14,6 +14,9 @@ export class BlockProgress implements BlockProgressInterface { @PrimaryGeneratedColumn() id!: number; + @Column('varchar') + cid!: string; + @Column('varchar', { length: 66 }) blockHash!: string; diff --git a/packages/erc20-watcher/src/entity/Contract.ts b/packages/erc20-watcher/src/entity/Contract.ts index 83c99dcb..79ab0c29 100644 --- a/packages/erc20-watcher/src/entity/Contract.ts +++ b/packages/erc20-watcher/src/entity/Contract.ts @@ -16,6 +16,9 @@ export class Contract { @Column('varchar', { length: 8 }) kind!: string; + @Column('boolean', { default: false }) + checkpoint!: boolean; + @Column('integer') startingBlock!: number; } diff --git a/packages/erc20-watcher/src/entity/IPLDBlock.ts b/packages/erc20-watcher/src/entity/IPLDBlock.ts new file mode 100644 index 00000000..bff1118c --- /dev/null +++ b/packages/erc20-watcher/src/entity/IPLDBlock.ts @@ -0,0 +1,36 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; + +import { StateKind } from '@cerc-io/util'; + +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['cid'], { unique: true }) +@Index(['block', 'contractAddress']) +@Index(['block', 'contractAddress', 'kind'], { unique: true }) +export class IPLDBlock { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + cid!: string; + + @Column({ + type: 'enum', + enum: StateKind + }) + kind!: StateKind; + + @Column('bytea') + data!: Buffer; +} diff --git a/packages/erc20-watcher/src/entity/IpldStatus.ts b/packages/erc20-watcher/src/entity/IpldStatus.ts new file mode 100644 index 00000000..fb81069e --- /dev/null +++ b/packages/erc20-watcher/src/entity/IpldStatus.ts @@ -0,0 +1,20 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; + +@Entity() +export class IpldStatus { + @PrimaryGeneratedColumn() + id!: number; + + @Column('integer') + latestHooksBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestCheckpointBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestIPFSBlockNumber!: number; +} diff --git a/packages/erc20-watcher/src/entity/SyncStatus.ts b/packages/erc20-watcher/src/entity/SyncStatus.ts index e5a52802..56bd3a2a 100644 --- a/packages/erc20-watcher/src/entity/SyncStatus.ts +++ b/packages/erc20-watcher/src/entity/SyncStatus.ts @@ -34,4 +34,10 @@ export class SyncStatus implements SyncStatusInterface { @Column('integer') latestCanonicalBlockNumber!: number; + + @Column('varchar', { length: 66 }) + initialIndexedBlockHash!: string; + + @Column('integer') + initialIndexedBlockNumber!: number; } diff --git a/packages/erc20-watcher/src/fill.ts b/packages/erc20-watcher/src/fill.ts index 0a53faa2..718898a3 100644 --- a/packages/erc20-watcher/src/fill.ts +++ b/packages/erc20-watcher/src/fill.ts @@ -10,8 +10,8 @@ import debug from 'debug'; import { PubSub } from 'apollo-server-express'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { getConfig, fillBlocks, JobQueue, DEFAULT_CONFIG_PATH, getCustomProvider } from '@vulcanize/util'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import { Database } from './database'; import { Indexer } from './indexer'; @@ -54,6 +54,11 @@ export const main = async (): Promise => { type: 'number', default: 10, describe: 'Number of blocks prefetched in batch' + }, + blockCid: { + type: 'boolean', + default: false, + describe: 'Only fetch and update block CIDs' } }).argv; @@ -61,7 +66,7 @@ export const main = async (): Promise => { assert(config.server, 'Missing server config'); - const { upstream, database: dbConfig, jobQueue: jobQueueConfig, server: { mode } } = config; + const { upstream, database: dbConfig, jobQueue: jobQueueConfig } = config; assert(dbConfig, 'Missing database config'); @@ -89,7 +94,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); const eventWatcher = new EventWatcher(upstream, ethClient, indexer, pubsub, jobQueue); diff --git a/packages/erc20-watcher/src/indexer.ts b/packages/erc20-watcher/src/indexer.ts index 5b98eea6..f1f34d17 100644 --- a/packages/erc20-watcher/src/indexer.ts +++ b/packages/erc20-watcher/src/indexer.ts @@ -8,11 +8,11 @@ import { JsonFragment } from '@ethersproject/abi'; import { DeepPartial, FindConditions, FindManyOptions } from 'typeorm'; import JSONbig from 'json-bigint'; import { ethers } from 'ethers'; -import { BaseProvider } from '@ethersproject/providers'; -import { EthClient } from '@vulcanize/ipld-eth-client'; -import { StorageLayout } from '@vulcanize/solidity-mapper'; -import { Indexer as BaseIndexer, ValueResult, UNKNOWN_EVENT_NAME, JobQueue, Where, QueryOptions } from '@vulcanize/util'; +import { UNKNOWN_EVENT_NAME, JobQueue, IndexerInterface } from '@vulcanize/util'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { Indexer as BaseIndexer, IPFSClient, ServerConfig, IpldStatus as IpldStatusInterface, ValueResult, Where, QueryOptions } from '@cerc-io/util'; +import { StorageLayout, MappingKey } from '@cerc-io/solidity-mapper'; import { Database } from './database'; import { Event } from './entity/Event'; @@ -21,6 +21,7 @@ import { SyncStatus } from './entity/SyncStatus'; import artifacts from './artifacts/ERC20.json'; import { BlockProgress } from './entity/BlockProgress'; import { Contract } from './entity/Contract'; +import { IPLDBlock } from './entity/IPLDBlock'; const log = debug('vulcanize:indexer'); @@ -29,7 +30,7 @@ const ETH_CALL_MODE = 'eth_call'; const TRANSFER_EVENT = 'Transfer'; const APPROVAL_EVENT = 'Approval'; -const CONTRACT_KIND = 'token'; +export const CONTRACT_KIND = 'token'; interface EventResult { event: { @@ -43,26 +44,30 @@ interface EventResult { proof?: string; } -export class Indexer { +export class Indexer implements IndexerInterface { _db: Database _ethClient: EthClient - _ethProvider: BaseProvider + _ethProvider: ethers.providers.BaseProvider _baseIndexer: BaseIndexer + _serverConfig: ServerConfig + _storageLayoutMap: Map = new Map() _abi: JsonFragment[] _storageLayout: StorageLayout _contract: ethers.utils.Interface _serverMode: string - constructor (db: Database, ethClient: EthClient, ethProvider: BaseProvider, jobQueue: JobQueue, serverMode: string) { + constructor (serverConfig: ServerConfig, db: Database, ethClient: EthClient, ethProvider: ethers.providers.BaseProvider, jobQueue: JobQueue) { assert(db); assert(ethClient); this._db = db; this._ethClient = ethClient; this._ethProvider = ethProvider; - this._serverMode = serverMode; - this._baseIndexer = new BaseIndexer(this._db, this._ethClient, this._ethProvider, jobQueue); + this._serverConfig = serverConfig; + this._serverMode = this._serverConfig.mode; + const ipfsClient = new IPFSClient(serverConfig.ipfsApiAddr); + this._baseIndexer = new BaseIndexer(serverConfig, this._db, this._ethClient, this._ethProvider, jobQueue, ipfsClient); const { abi, storageLayout } = artifacts; @@ -75,6 +80,14 @@ export class Indexer { this._contract = new ethers.utils.Interface(this._abi); } + get serverConfig (): ServerConfig { + return this._serverConfig; + } + + get storageLayoutMap (): Map { + return this._storageLayoutMap; + } + getResultEvent (event: Event): EventResult { const eventFields = JSON.parse(event.eventInfo); @@ -88,6 +101,20 @@ export class Indexer { }; } + async getStorageValue (storageLayout: StorageLayout, blockHash: string, contractAddress: string, variable: string, ...mappingKeys: MappingKey[]): Promise { + return this._baseIndexer.getStorageValue( + storageLayout, + blockHash, + contractAddress, + variable, + ...mappingKeys + ); + } + + getIPLDData (ipldBlock: IPLDBlock): any { + return this._baseIndexer.getIPLDData(ipldBlock); + } + async totalSupply (blockHash: string, token: string): Promise { let result: ValueResult; @@ -335,7 +362,7 @@ export class Indexer { return { eventName, eventInfo }; } - async getEventsByFilter (blockHash: string, contract: string, name: string | null): Promise> { + async getEventsByFilter (blockHash: string, contract: string, name?: string): Promise> { return this._baseIndexer.getEventsByFilter(blockHash, contract, name); } @@ -343,8 +370,12 @@ export class Indexer { return this._baseIndexer.isWatchedContract(address); } - async watchContract (address: string, startingBlock: number): Promise { - return this._baseIndexer.watchContract(address, CONTRACT_KIND, startingBlock); + async watchContract (address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { + return this._baseIndexer.watchContract(address, CONTRACT_KIND, checkpoint, startingBlock); + } + + async updateIPLDStatusMap (address: string, ipldStatus: IpldStatusInterface): Promise { + await this._baseIndexer.updateIPLDStatusMap(address, ipldStatus); } async saveEventEntity (dbEvent: Event): Promise { @@ -406,6 +437,11 @@ export class Indexer { ); } + async fetchBlockWithEvents (block: DeepPartial): Promise { + // Method not used in uni-info-watcher but required for indexer interface. + return new BlockProgress(); + } + async saveBlockProgress (block: DeepPartial): Promise { return this._baseIndexer.saveBlockProgress(block); } diff --git a/packages/erc20-watcher/src/job-runner.ts b/packages/erc20-watcher/src/job-runner.ts index 1ecbee0d..3e7cf706 100644 --- a/packages/erc20-watcher/src/job-runner.ts +++ b/packages/erc20-watcher/src/job-runner.ts @@ -8,18 +8,17 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { JobQueueConfig, startMetricsServer } from '@cerc-io/util'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { getConfig, JobQueue, JobRunner as BaseJobRunner, QUEUE_BLOCK_PROCESSING, QUEUE_EVENT_PROCESSING, - JobQueueConfig, DEFAULT_CONFIG_PATH, - getCustomProvider, - startMetricsServer + getCustomProvider } from '@vulcanize/util'; import { Indexer } from './indexer'; @@ -100,7 +99,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); const jobRunner = new JobRunner(jobQueueConfig, indexer, jobQueue); await jobRunner.start(); diff --git a/packages/erc20-watcher/src/resolvers.ts b/packages/erc20-watcher/src/resolvers.ts index 05348ff5..5c6e0571 100644 --- a/packages/erc20-watcher/src/resolvers.ts +++ b/packages/erc20-watcher/src/resolvers.ts @@ -6,9 +6,10 @@ import assert from 'assert'; import BigInt from 'apollo-type-bigint'; import debug from 'debug'; -import { ValueResult, gqlTotalQueryCount, gqlQueryCount } from '@vulcanize/util'; +import { gqlTotalQueryCount, gqlQueryCount } from '@vulcanize/util'; +import { ValueResult } from '@cerc-io/util'; -import { Indexer } from './indexer'; +import { CONTRACT_KIND, Indexer } from './indexer'; import { EventWatcher } from './events'; const log = debug('vulcanize:resolver'); @@ -34,9 +35,9 @@ export const createResolvers = async (indexer: Indexer, eventWatcher: EventWatch }, Mutation: { - watchToken: async (_: any, { token, startingBlock = 1 }: { token: string, startingBlock: number }): Promise => { - log('watchToken', token, startingBlock); - await indexer.watchContract(token, startingBlock); + watchToken: async (_: any, { token, checkpoint = false, startingBlock = 1 }: { token: string, checkpoint: boolean, startingBlock: number }): Promise => { + log('watchToken', token, checkpoint, startingBlock); + await indexer.watchContract(token, CONTRACT_KIND, checkpoint, startingBlock); return true; } diff --git a/packages/erc20-watcher/src/schema.ts b/packages/erc20-watcher/src/schema.ts index c3f02326..6ff3a4a6 100644 --- a/packages/erc20-watcher/src/schema.ts +++ b/packages/erc20-watcher/src/schema.ts @@ -158,6 +158,7 @@ type Mutation { # Actively watch and index data for the token. watchToken( token: String! + checkpoint: Boolean startingBlock: Int ): Boolean! } diff --git a/packages/erc20-watcher/src/server.ts b/packages/erc20-watcher/src/server.ts index 58194fda..a48053eb 100644 --- a/packages/erc20-watcher/src/server.ts +++ b/packages/erc20-watcher/src/server.ts @@ -13,8 +13,8 @@ import 'graphql-import-node'; import { createServer } from 'http'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { DEFAULT_CONFIG_PATH, getConfig, getCustomProvider, JobQueue, KIND_ACTIVE, startGQLMetricsServer } from '@vulcanize/util'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import typeDefs from './schema'; @@ -41,7 +41,7 @@ export const main = async (): Promise => { assert(config.server, 'Missing server config'); - const { host, port, mode, kind: watcherKind } = config.server; + const { host, port, kind: watcherKind } = config.server; const { upstream, database: dbConfig, jobQueue: jobQueueConfig } = config; @@ -73,7 +73,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); const eventWatcher = new EventWatcher(upstream, ethClient, indexer, pubsub, jobQueue); diff --git a/packages/erc20-watcher/src/utils/index.ts b/packages/erc20-watcher/src/utils/index.ts index 2e2887c5..7a77f5d3 100644 --- a/packages/erc20-watcher/src/utils/index.ts +++ b/packages/erc20-watcher/src/utils/index.ts @@ -2,15 +2,14 @@ // Copyright 2021 Vulcanize, Inc. // -import { Contract, utils } from 'ethers'; -import { BaseProvider } from '@ethersproject/providers'; +import { Contract, utils, providers } from 'ethers'; import { abi } from '../artifacts/ERC20.json'; import ERC20SymbolBytesABI from '../artifacts/ERC20SymbolBytes.json'; import ERC20NameBytesABI from '../artifacts/ERC20NameBytes.json'; import { StaticTokenDefinition } from './static-token-definition'; -export const fetchTokenSymbol = async (ethProvider: BaseProvider, blockHash: string, tokenAddress: string): Promise => { +export const fetchTokenSymbol = async (ethProvider: providers.BaseProvider, blockHash: string, tokenAddress: string): Promise => { const contract = new Contract(tokenAddress, abi, ethProvider); const contractSymbolBytes = new Contract(tokenAddress, ERC20SymbolBytesABI, ethProvider); let symbolValue = 'unknown'; @@ -42,7 +41,7 @@ export const fetchTokenSymbol = async (ethProvider: BaseProvider, blockHash: str return symbolValue; }; -export const fetchTokenName = async (ethProvider: BaseProvider, blockHash: string, tokenAddress: string): Promise => { +export const fetchTokenName = async (ethProvider: providers.BaseProvider, blockHash: string, tokenAddress: string): Promise => { const contract = new Contract(tokenAddress, abi, ethProvider); const contractNameBytes = new Contract(tokenAddress, ERC20NameBytesABI, ethProvider); let nameValue = 'unknown'; @@ -74,7 +73,7 @@ export const fetchTokenName = async (ethProvider: BaseProvider, blockHash: strin return nameValue; }; -export const fetchTokenTotalSupply = async (ethProvider: BaseProvider, blockHash: string, tokenAddress: string): Promise => { +export const fetchTokenTotalSupply = async (ethProvider: providers.BaseProvider, blockHash: string, tokenAddress: string): Promise => { const contract = new Contract(tokenAddress, abi, ethProvider); let totalSupplyValue = null; @@ -88,7 +87,7 @@ export const fetchTokenTotalSupply = async (ethProvider: BaseProvider, blockHash return BigInt(totalSupplyValue); }; -export const fetchTokenDecimals = async (ethProvider: BaseProvider, blockHash: string, tokenAddress: string): Promise => { +export const fetchTokenDecimals = async (ethProvider: providers.BaseProvider, blockHash: string, tokenAddress: string): Promise => { const contract = new Contract(tokenAddress, abi, ethProvider); // Try types uint8 for decimals. diff --git a/packages/ipld-eth-client/package.json b/packages/ipld-eth-client/package.json index 368b8dda..fa7b1206 100644 --- a/packages/ipld-eth-client/package.json +++ b/packages/ipld-eth-client/package.json @@ -23,12 +23,12 @@ "@apollo/client": "^3.3.19", "@vulcanize/cache": "^0.1.0", "cross-fetch": "^3.1.4", + "debug": "^4.3.1", "ethers": "^5.2.0", "left-pad": "^1.3.0", - "subscriptions-transport-ws": "^0.9.19", - "ws": "^7.4.6", "lodash": "^4.17.21", - "debug": "^4.3.1" + "subscriptions-transport-ws": "^0.9.19", + "ws": "^7.4.6" }, "devDependencies": { "@types/ws": "^7.4.4", diff --git a/packages/solidity-mapper/.env.example b/packages/solidity-mapper/.env.example deleted file mode 100644 index 2c4bf229..00000000 --- a/packages/solidity-mapper/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -ETH_RPC_URL=http://127.0.0.1:8545 - -GQL_ENDPOINT=http://127.0.0.1:8083/graphql diff --git a/packages/solidity-mapper/.eslintignore b/packages/solidity-mapper/.eslintignore deleted file mode 100644 index 653874b5..00000000 --- a/packages/solidity-mapper/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -# Don't lint node_modules. -node_modules - -# Don't lint build output. -dist diff --git a/packages/solidity-mapper/.eslintrc.json b/packages/solidity-mapper/.eslintrc.json deleted file mode 100644 index 86f7a209..00000000 --- a/packages/solidity-mapper/.eslintrc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "semistandard", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - } -} diff --git a/packages/solidity-mapper/.gitignore b/packages/solidity-mapper/.gitignore deleted file mode 100644 index c7b0dfe8..00000000 --- a/packages/solidity-mapper/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules - -#Hardhat files -cache -artifacts - -#yarn -yarn-error.log - -#Environment variables -.env diff --git a/packages/solidity-mapper/README.md b/packages/solidity-mapper/README.md deleted file mode 100644 index d17f980b..00000000 --- a/packages/solidity-mapper/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# solidity-mapper - -Get value of state variable from storage for a solidity contract. - -## Pre-requisites - -* NodeJS and NPM - - https://nodejs.org/en/ or use https://github.com/nvm-sh/nvm - -## Instructions - -* Create environment variable file - ```bash - $ cp .env.example .env - ``` - -* Run the tests using the following command - ```bash - $ yarn test - - # For testing on private network using RPC getStorageAt. - # Set ETH_RPC_URL in .env - $ yarn test:geth-rpc - - # For testing on private network using ipld-eth-client getStorageAt. - # Set GQL_ENDPOINT in .env - $ yarn test:ipld-gql - ``` - -## Different Types - -* [ ] Value Types - * [x] Booleans - * [x] Integers - * [ ] Fixed Point Numbers - * [x] Address - * [x] Contract Types - * [x] Fixed-size byte arrays - * [x] Enums - * [ ] Function Types -* [ ] Reference Types - * [x] Arrays - * [x] Get all elements in array - * [x] Get element in array by index - * [x] Fixed size arrays - * [x] Integer Type - * [x] Boolean Type - * [x] Address Type - * [x] Fixed-size byte arrays - * [x] Enum type - * [x] Dynamically-sized byte array - * [x] Struct Type - * [x] Mapping Type - * [x] Dynamically-sized arrays - * [x] Integer Type - * [x] Boolean Type - * [x] Address Type - * [x] Fixed-size byte arrays - * [x] Enum Type - * [x] Dynamically-sized byte array - * [x] Struct Type - * [x] Mapping Type - * [x] Nested Arrays - * [x] Fixed size arrays - * [x] Dynamically-sized arrays - * [x] Dynamically-sized byte array - * [x] Bytes - * [x] String - * [x] Structs - * [x] Get struct value with all members - * [x] Value Types - * [x] Get value of a single member in struct - * [x] Reference Types - * [x] Struct type members (nested) - * [x] Fixed size Array members - * [x] Dynamically sized Array members - * [x] Bytes and string type members - * [x] Mapping type members - * [ ] Mapping Types - * [x] Value Type keys - * [ ] Fixed-size byte array keys - * [x] Dynamically-sized byte array keys - * [x] Reference Type Mapping values - * [x] Struct type values - * [x] Array type values - * [x] Dynamically sized Bytes and string type values - * [x] Nested Mapping - -## Observations - -* The storage layouts are formed according to the rules in https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html#layout-of-state-variables-in-storage - -* Structs can occupy multiple slots depending on the size required by its members. - -* Fixed arrays can occupy multiple slots according to the size of the array and the type of array. diff --git a/packages/solidity-mapper/hardhat.config.ts b/packages/solidity-mapper/hardhat.config.ts deleted file mode 100644 index 2455b3ab..00000000 --- a/packages/solidity-mapper/hardhat.config.ts +++ /dev/null @@ -1,50 +0,0 @@ -import 'dotenv/config'; -import { task, HardhatUserConfig } from 'hardhat/config'; -import '@nomiclabs/hardhat-waffle'; - -// This is a sample Hardhat task. To learn how to create your own go to -// https://hardhat.org/guides/create-task.html -task('accounts', 'Prints the list of accounts', async (args, hre) => { - const accounts = await hre.ethers.getSigners(); - - for (const account of accounts) { - console.log(account.address); - } -}); - -// You need to export an object to set up your config -// Go to https://hardhat.org/config/ to learn more - -const config: HardhatUserConfig = { - solidity: { - version: '0.7.6', - settings: { - outputSelection: { - '*': { - '*': [ - 'abi', 'storageLayout', - 'metadata', 'evm.bytecode', // Enable the metadata and bytecode outputs of every single contract. - 'evm.bytecode.sourceMap' // Enable the source map output of every single contract. - ], - '': [ - 'ast' // Enable the AST output of every single file. - ] - } - } - } - }, - paths: { - sources: './test/contracts', - tests: './src' - }, - networks: { - private: { - url: process.env.ETH_RPC_URL - } - }, - mocha: { - timeout: 50000 - } -}; - -export default config; diff --git a/packages/solidity-mapper/package.json b/packages/solidity-mapper/package.json deleted file mode 100644 index b07f564f..00000000 --- a/packages/solidity-mapper/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@vulcanize/solidity-mapper", - "version": "0.1.0", - "main": "dist/index.js", - "license": "AGPL-3.0", - "devDependencies": { - "@ethersproject/abi": "^5.3.0", - "@ethersproject/contracts": "^5.3.0", - "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-waffle": "^2.0.1", - "@types/chai": "^4.2.18", - "@types/mocha": "^8.2.2", - "@typescript-eslint/eslint-plugin": "^4.25.0", - "@typescript-eslint/parser": "^4.25.0", - "@vulcanize/ipld-eth-client": "^0.1.0", - "chai": "^4.3.4", - "eslint": "^7.27.0", - "eslint-config-semistandard": "^15.0.1", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.23.3", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.0", - "eslint-plugin-standard": "^5.0.0", - "ethereum-waffle": "^3.3.0", - "ethers": "^5.2.0", - "hardhat": "^2.3.0", - "typescript": "^4.3.2", - "lodash": "^4.17.21" - }, - "scripts": { - "lint": "eslint .", - "test": "hardhat test", - "build": "tsc", - "test:geth-rpc": "hardhat --network private test", - "test:ipld-gql": "IPLD_GQL=true hardhat --network private test" - }, - "dependencies": { - "dotenv": "^10.0.0" - } -} diff --git a/packages/solidity-mapper/src/index.ts b/packages/solidity-mapper/src/index.ts deleted file mode 100644 index e725f3f8..00000000 --- a/packages/solidity-mapper/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -export { getStorageValue, getStorageInfo, getValueByType, StorageLayout, GetStorageAt } from './storage'; - -export { getEventNameTopics } from './logs'; diff --git a/packages/solidity-mapper/src/logs.test.ts b/packages/solidity-mapper/src/logs.test.ts deleted file mode 100644 index 414e6e10..00000000 --- a/packages/solidity-mapper/src/logs.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -import { expect } from 'chai'; -import '@nomiclabs/hardhat-ethers'; -import { artifacts } from 'hardhat'; - -import { getEventNameTopics } from './logs'; - -const TEST_DATA = [ - { - name: 'TestIntegers', - output: {} - }, - { - name: 'TestEvents', - output: { - // Signature of event is a keccak256 hash of event name and input argument types. - // keccak256('Event1(string,string)') - Event1: '0xead5fc99a8133dbf3f4e87d1ada4e5a4cf65170fad6445d34042e643f6a30b79' - } - } -]; - -it('get event name topics', async () => { - const testPromises = TEST_DATA.map(async ({ name, output }) => { - const { abi } = await artifacts.readArtifact(name); - - const eventNameTopics = getEventNameTopics(abi); - expect(eventNameTopics).to.eql(output); - }); - - await Promise.all(testPromises); -}); diff --git a/packages/solidity-mapper/src/logs.ts b/packages/solidity-mapper/src/logs.ts deleted file mode 100644 index 915df7b8..00000000 --- a/packages/solidity-mapper/src/logs.ts +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -import { JsonFragment } from '@ethersproject/abi'; -import { utils } from 'ethers'; - -interface EventNameTopics { - [eventName: string]: string -} - -/** - * Function to get event name topics from abi. - * @param abi - */ -export const getEventNameTopics = (abi: JsonFragment[]): EventNameTopics => { - const eventFragments = abi.filter(({ type }) => type === 'event'); - - return eventFragments.reduce((acc: EventNameTopics, { name, inputs }) => { - if (inputs && name) { - const inputParamsString = inputs.map(({ type }) => type) - .join(','); - - const signature = utils.keccak256(utils.toUtf8Bytes(`${name}(${inputParamsString})`)); - acc[name] = signature; - } - - return acc; - }, {}); -}; diff --git a/packages/solidity-mapper/src/storage.test.ts b/packages/solidity-mapper/src/storage.test.ts deleted file mode 100644 index 93c23776..00000000 --- a/packages/solidity-mapper/src/storage.test.ts +++ /dev/null @@ -1,2035 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { Contract } from '@ethersproject/contracts'; -import { expect } from 'chai'; -import '@nomiclabs/hardhat-ethers'; -import { ethers } from 'hardhat'; -import { ContractTransaction } from 'ethers'; - -import { EthClient } from '@vulcanize/ipld-eth-client'; - -import { getStorageInfo, getStorageValue, StorageLayout } from './storage'; -import { getStorageLayout, getStorageAt as rpcGetStorageAt, generateDummyAddresses, getBlockHash, assertProofData, assertProofArray, assertProofStruct } from '../test/utils'; - -const CONTRACTS = [ - 'TestIntegers', - 'TestUnsignedIntegers', - 'TestBooleans', - 'TestAddress', - 'TestContractTypes', - 'TestBytes', - 'TestEnums', - 'TestStrings', - 'TestFixedArrays', - 'TestDynamicArrays', - 'TestNestedArrays', - 'TestValueStructs', - 'TestReferenceStructs', - 'TestBasicMapping', - 'TestNestedMapping' -]; - -const TEST_DATA = [ - { - name: 'TestBooleans', - variable: 'bool1', - output: { - label: 'bool1', - offset: 0, - slot: '0x00', - type: 't_bool' - } - }, - { - name: 'TestIntegers', - variable: 'int2', - output: { - slot: '0x00', - offset: 1, - type: 't_int16', - label: 'int2' - } - }, - { - name: 'TestUnsignedIntegers', - variable: 'uint3', - output: { - label: 'uint3', - offset: 0, - slot: '0x01', - type: 't_uint256' - } - }, - { - name: 'TestAddress', - variable: 'address1', - output: { - label: 'address1', - offset: 0, - slot: '0x00', - type: 't_address' - } - }, - { - name: 'TestStrings', - variable: 'string2', - output: { - label: 'string2', - offset: 0, - slot: '0x01', - type: 't_string_storage' - } - } -]; - -const isIpldGql = process.env.IPLD_GQL === 'true'; - -type Contracts = {[key: string]: { contract: Contract, storageLayout: StorageLayout }} - -describe('Get value from storage', () => { - let getStorageAt = rpcGetStorageAt; - - // Check if running test against ipld graphql endpoint. - if (isIpldGql) { - // Set ipld-eth-client. - const ethClient = new EthClient({ - gqlEndpoint: process.env.GQL_ENDPOINT || '', - gqlSubscriptionEndpoint: process.env.GQL_ENDPOINT || '', - cache: undefined - }); - - // Use ipld graphql endpoint to get storage value. - getStorageAt = ethClient.getStorageAt.bind(ethClient); - } - - let contracts: Contracts, blockHash: string; - let testBooleans: Contract, testAddress: Contract, testContractTypes: Contract, testEnums: Contract; - - const bool1Value = true; - const bool2Value = false; - const [address1Value] = generateDummyAddresses(1); - const enumValue = 1; - - before(async () => { - const contractPromises = CONTRACTS.map(async name => { - const Contract = await ethers.getContractFactory(name); - const contract = await Contract.deploy(); - await contract.deployed(); - const storageLayout = await getStorageLayout(name); - - return { contract, storageLayout, name }; - }); - - const contractData = await Promise.all(contractPromises); - - contracts = contractData.reduce((acc: Contracts, contract) => { - const { name, ...data } = contract; - acc[name] = data; - return acc; - }, {}); - - ({ - TestBooleans: { contract: testBooleans }, - TestAddress: { contract: testAddress }, - TestContractTypes: { contract: testContractTypes }, - TestEnums: { contract: testEnums } - } = contracts); - - const transactions = await Promise.all([ - testBooleans.setBool1(bool1Value), - testBooleans.setBool2(bool2Value), - testAddress.setAddress1(address1Value), - testContractTypes.setAddressContract1(testAddress.address), - testEnums.setChoicesEnum1(enumValue) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - it('get storage information', async () => { - const testPromises = TEST_DATA.map(async ({ name, variable, output }) => { - const storageLayout = await getStorageLayout(name); - - const storageInfo = getStorageInfo(storageLayout, variable); - expect(storageInfo).to.include(output); - }); - - await Promise.all(testPromises); - }); - - it('get value for boolean type', async () => { - const { storageLayout } = contracts.TestBooleans; - let { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBooleans.address, 'bool1'); - expect(value).to.equal(bool1Value); - - if (isIpldGql) { - assertProofData(blockHash, testBooleans.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBooleans.address, 'bool2')); - expect(value).to.equal(bool2Value); - - if (isIpldGql) { - assertProofData(blockHash, testBooleans.address, JSON.parse(proofData)); - } - }); - - it('get value for address type', async () => { - const { storageLayout } = contracts.TestAddress; - const { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testAddress.address, 'address1'); - expect(value).to.be.a('string'); - expect(value).to.equal(address1Value); - - if (isIpldGql) { - assertProofData(blockHash, testAddress.address, JSON.parse(proofData)); - } - }); - - it('get value for contract type', async () => { - const { storageLayout } = contracts.TestContractTypes; - const { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testContractTypes.address, 'addressContract1'); - expect(value).to.equal(testAddress.address.toLowerCase()); - - if (isIpldGql) { - assertProofData(blockHash, testContractTypes.address, JSON.parse(proofData)); - } - }); - - it('get value for enum types', async () => { - const { storageLayout } = contracts.TestEnums; - const { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testEnums.address, 'choicesEnum1'); - expect(value).to.equal(BigInt(enumValue)); - - if (isIpldGql) { - assertProofData(blockHash, testEnums.address, JSON.parse(proofData)); - } - }); - - describe('signed integer type', () => { - let integers: Contract, storageLayout: StorageLayout, blockHash: string; - const int1Value = 12; - const int2Value = -34; - const int3Value = 123; - const int4Value = -12; - const int5Value = -123; - const int6Value = -456; - const int7Value = -789; - const int9Value = -1234; - const int10Value = -4567; - const int11Value = -12345; - const int12Value = -67890; - const int13Value = -123456; - - before(async () => { - ({ contract: integers, storageLayout } = contracts.TestIntegers); - - const transactions = await Promise.all([ - integers.setInt1(int1Value), - integers.setInt2(int2Value), - integers.setInt3(int3Value), - integers.setInt4(int4Value), - integers.setInt5(int5Value), - integers.setInt6(int6Value), - integers.setInt7(int7Value), - integers.setInt9(int9Value), - integers.setInt10(int10Value), - integers.setInt11(int11Value), - integers.setInt12(int12Value), - integers.setInt13(int13Value) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - it('get value for integer type variables packed together', async () => { - let { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int1'); - expect(value).to.equal(BigInt(int1Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int2')); - expect(value).to.equal(BigInt(int2Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - }); - - it('get value for integer type variables using single slot', async () => { - const { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int3'); - expect(value).to.equal(BigInt(int3Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - }); - - it('get value for integer type variables with negative values', async () => { - let { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int4'); - expect(value).to.equal(BigInt(int4Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int5')); - expect(value).to.equal(BigInt(int5Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int6')); - expect(value).to.equal(BigInt(int6Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int7')); - expect(value).to.equal(BigInt(int7Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int9')); - expect(value).to.equal(BigInt(int9Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int10')); - expect(value).to.equal(BigInt(int10Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int11')); - expect(value).to.equal(BigInt(int11Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int12')); - expect(value).to.equal(BigInt(int12Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, integers.address, 'int13')); - expect(value).to.equal(BigInt(int13Value)); - - if (isIpldGql) { - assertProofData(blockHash, integers.address, JSON.parse(proofData)); - } - }); - }); - - describe('unsigned integer type', () => { - let unsignedIntegers: Contract, storageLayout: StorageLayout, blockHash: string; - const uint1Value = 12; - const uint2Value = 34; - const uint3Value = 123; - - before(async () => { - ({ contract: unsignedIntegers, storageLayout } = contracts.TestUnsignedIntegers); - - const transactions = await Promise.all([ - unsignedIntegers.setUint1(uint1Value), - unsignedIntegers.setUint2(uint2Value), - unsignedIntegers.setUint3(uint3Value) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - it('get value for unsigned integer type variables packed together', async () => { - let { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, unsignedIntegers.address, 'uint1'); - expect(value).to.equal(BigInt(uint1Value)); - - if (isIpldGql) { - assertProofData(blockHash, unsignedIntegers.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, unsignedIntegers.address, 'uint2')); - expect(value).to.equal(BigInt(uint2Value)); - - if (isIpldGql) { - assertProofData(blockHash, unsignedIntegers.address, JSON.parse(proofData)); - } - }); - - it('get value for unsigned integer type variables using single slot', async () => { - const { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, unsignedIntegers.address, 'uint3'); - expect(value).to.equal(BigInt(uint3Value)); - - if (isIpldGql) { - assertProofData(blockHash, unsignedIntegers.address, JSON.parse(proofData)); - } - }); - }); - - describe('byte array', () => { - let testBytes: Contract, storageLayout: StorageLayout, blockHash: string; - const bytesTenValue = ethers.utils.hexlify(ethers.utils.randomBytes(10)); - const bytesTwentyValue = ethers.utils.hexlify(ethers.utils.randomBytes(20)); - const bytesThirtyValue = ethers.utils.hexlify(ethers.utils.randomBytes(30)); - const bytesArray1 = ethers.utils.hexlify(ethers.utils.randomBytes(24)); - const bytesArray2 = ethers.utils.hexlify(ethers.utils.randomBytes(100)); - - before(async () => { - ({ contract: testBytes, storageLayout } = contracts.TestBytes); - - const transactions = await Promise.all([ - testBytes.setBytesTen(bytesTenValue), - testBytes.setBytesTwenty(bytesTwentyValue), - testBytes.setBytesThirty(bytesThirtyValue), - testBytes.setBytesArray1(bytesArray1), - testBytes.setBytesArray2(bytesArray2) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - it('get value for fixed size byte arrays packed together', async () => { - let { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBytes.address, 'bytesTen'); - expect(value).to.equal(bytesTenValue); - - if (isIpldGql) { - assertProofData(blockHash, testBytes.address, JSON.parse(proofData)); - } - - ({ value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBytes.address, 'bytesTwenty')); - expect(value).to.equal(bytesTwentyValue); - - if (isIpldGql) { - assertProofData(blockHash, testBytes.address, JSON.parse(proofData)); - } - }); - - it('get value for fixed size byte arrays using single slot', async () => { - const { value, proof: { data: proofData } } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBytes.address, 'bytesThirty'); - expect(value).to.equal(bytesThirtyValue); - - if (isIpldGql) { - assertProofData(blockHash, testBytes.address, JSON.parse(proofData)); - } - }); - - // Dynamically sized byte array. - it('get value for dynamic byte array of length less than 32 bytes', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBytes.address, 'bytesArray1'); - expect(value).to.equal(bytesArray1); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(1); - - if (isIpldGql) { - assertProofArray(blockHash, testBytes.address, proofData); - } - }); - - it('get value for dynamic byte array of length more than 32 bytes', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testBytes.address, 'bytesArray2'); - expect(value).to.equal(bytesArray2); - const proofData = JSON.parse(proof.data); - - // Length is equal to slots required by the data plus the initial slot used to calculate the actual slots holding the data. - const proofDataLength = (Math.ceil(ethers.utils.hexDataLength(bytesArray2) / 32)) + 1; - expect(proofData.length).to.equal(proofDataLength); - - if (isIpldGql) { - assertProofArray(blockHash, testBytes.address, proofData); - } - }); - }); - - describe('string type', () => { - let strings: Contract, storageLayout: StorageLayout, blockHash: string; - const string1Value = 'Hello world.'; - const string2Value = 'This sentence is more than 32 bytes long.'; - - before(async () => { - ({ contract: strings, storageLayout } = contracts.TestStrings); - - const transactions = await Promise.all([ - strings.setString1(string1Value), - strings.setString2(string2Value) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Test for string of size less than 32 bytes which use only one slot. - it('get value for string length less than 32 bytes', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, strings.address, 'string1'); - expect(value).to.equal(string1Value); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(1); - - if (isIpldGql) { - assertProofArray(blockHash, strings.address, proofData); - } - }); - - // Test for string of size 32 bytes or more which use multiple slots. - it('get value for string length more than 32 bytes', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, strings.address, 'string2'); - expect(value).to.equal(string2Value); - const proofData = JSON.parse(proof.data); - - // Length is equal to slots required by the data plus the initial slot used to calculate the actual slots holding the data. - const stringBytes = ethers.utils.toUtf8Bytes(string2Value); - const proofDataLength = (Math.ceil(stringBytes.length / 32)) + 1; - expect(proofData.length).to.equal(proofDataLength); - - if (isIpldGql) { - assertProofArray(blockHash, strings.address, proofData); - } - }); - }); - - describe('fixed size arrays', () => { - let testFixedArrays: Contract, storageLayout: StorageLayout, blockHash: string; - const int128Array = [100, 200, 300, 400, 500]; - const uint16Array = [10, 20, 30, 40, 50]; - const boolArray = [true, false]; - const enumArray = [1, 0, 2, 1, 3, 2]; - const stringArray = ['abcde', 'fg', 'hijklmn']; - - const bytesArray = Array.from({ length: 4 }, () => { - const bytesLength = Math.floor(Math.random() * 64); - return ethers.utils.hexlify(ethers.utils.randomBytes(bytesLength)); - }); - - const addressArray = generateDummyAddresses(4); - - const mapArray = addressArray.slice(0, 3) - .map((address, index) => { - const map = new Map(); - map.set(address, BigInt(index * 10)); - return map; - }); - - const fixedBytesArray = Array.from({ length: 5 }, () => ethers.utils.hexlify(ethers.utils.randomBytes(10))); - - const structArray: Array<{[key: string]: any}> = []; - - for (let i = 0; i < 5; i++) { - const structElement = { - int1: BigInt(i + 1), - uint1: BigInt(i + 2), - bool1: Boolean(i % 2) - }; - - structArray[i] = structElement; - } - - before(async () => { - ({ contract: testFixedArrays, storageLayout } = contracts.TestFixedArrays); - - const structArrayTransactions = structArray.map(async (structElement, index) => testFixedArrays.setStructArray(structElement, index)); - - const mapArrayTransactions = mapArray.map(async (map, index) => { - const [key, value] = map.entries().next().value; - return testFixedArrays.setMapArray(key, value, index); - }); - - const transactions = await Promise.all([ - testFixedArrays.setBoolArray(boolArray), - testFixedArrays.setUint16Array(uint16Array), - testFixedArrays.setInt128Array(int128Array), - testFixedArrays.setUintArray(uint16Array), - testFixedArrays.setAddressArray(addressArray), - testFixedArrays.setFixedBytesArray(fixedBytesArray), - testFixedArrays.setEnumArray(enumArray), - testFixedArrays.setBytesArray(bytesArray), - testFixedArrays.setStringArray(stringArray), - ...structArrayTransactions, - ...mapArrayTransactions - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Get all elements of array. - // Test for array variables which are 32 bytes or less and packed into a single slot. - it('get value for fixed size arrays using single slot', async () => { - // Test for variable boolArray. - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'boolArray'); - expect(value).to.eql(boolArray); - let proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(boolArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - - // Test for variable uint16Array. - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'uint16Array')); - expect(value).to.eql(uint16Array.map(el => BigInt(el))); - proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(uint16Array.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - // Test for array variables which are more than 32 bytes and use multiple slots. - it('get value for fixed size arrays using multiple slots', async () => { - // Test for variable int128Array. - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'int128Array'); - expect(value).to.eql(int128Array.map(el => BigInt(el))); - let proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(int128Array.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - - // Test for variable uintArray. - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'uintArray')); - expect(value).to.eql(uint16Array.map(el => BigInt(el))); - proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(uint16Array.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - it('get value for fixed size arrays of address type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'addressArray'); - expect(value).to.eql(addressArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(addressArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - it('get value for fixed size arrays of fixed size bytes type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'fixedBytesArray'); - expect(value).to.eql(fixedBytesArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(fixedBytesArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - it('get value for fixed size arrays of enum type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'enumArray'); - expect(value).to.eql(enumArray.map(el => BigInt(el))); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(enumArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - it('get value for fixed size arrays of dynamic byte array type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'bytesArray'); - expect(value).to.eql(bytesArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(bytesArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - it('get value for fixed size arrays of string type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'stringArray'); - expect(value).to.eql(stringArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(stringArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - it('get value for fixed size array of struct type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'structArray'); - expect(value).to.eql(structArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(structArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, proofData); - } - }); - - // Get element of array by index. - it('get value of signed integer type array by index', async () => { - const arrayIndex = 2; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'int128Array', arrayIndex); - expect(value).to.equal(BigInt(int128Array[arrayIndex])); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of unsigned integer type array by index', async () => { - const arrayIndex = 3; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'uint16Array', arrayIndex); - expect(value).to.equal(BigInt(uint16Array[arrayIndex])); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of boolean type array by index', async () => { - const arrayIndex = 0; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'boolArray', arrayIndex); - expect(value).to.equal(boolArray[arrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of address type array by index', async () => { - const arrayIndex = 1; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'addressArray', arrayIndex); - expect(value).to.equal(addressArray[arrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of enum type array by index', async () => { - const arrayIndex = 3; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'enumArray', arrayIndex); - expect(value).to.eql(BigInt(enumArray[arrayIndex])); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of struct type array by index', async () => { - const arrayIndex = 2; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'structArray', arrayIndex); - expect(value).to.eql(structArray[arrayIndex]); - - if (isIpldGql) { - assertProofStruct(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - - // Get value of specified struct member in array element. - const structMember = 'uint1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'structArray', arrayIndex, structMember)); - expect(value).to.eql(structArray[arrayIndex][structMember]); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of dynamic bytes type array by index', async () => { - const arrayIndex = 2; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'bytesArray', arrayIndex); - expect(value).to.eql(bytesArray[arrayIndex]); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of string type array by index', async () => { - const arrayIndex = 1; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'stringArray', arrayIndex); - expect(value).to.eql(stringArray[arrayIndex]); - - if (isIpldGql) { - assertProofArray(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of map type array by index', async () => { - const arrayIndex = 2; - const [mapKey, expectedValue] = mapArray[arrayIndex].entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testFixedArrays.address, 'mapArray', arrayIndex, mapKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testFixedArrays.address, JSON.parse(proof.data)); - } - }); - }); - - describe('dynamic sized arrays', () => { - let testDynamicArrays: Contract, storageLayout: StorageLayout, blockHash: string; - const boolArray = [true, false, false, true, false]; - const uint128Array = [100, 200, 300, 400, 500]; - const intArray = [10, 20, 30, 40, 50]; - const addressArray = generateDummyAddresses(9); - - const mapArray = addressArray.slice(0, 5) - .map((address, index) => { - const map = new Map(); - map.set(address, BigInt(index * 10)); - return map; - }); - - const fixedBytesArray = Array.from({ length: 4 }, () => ethers.utils.hexlify(ethers.utils.randomBytes(10))); - const enumArray = [0, 1, 2, 3]; - const stringArray = ['abc', 'defgh', 'ij', 'k']; - - const bytesArray = Array.from({ length: 4 }, () => { - const bytesLength = Math.floor(Math.random() * 64); - return ethers.utils.hexlify(ethers.utils.randomBytes(bytesLength)); - }); - - before(async () => { - ({ contract: testDynamicArrays, storageLayout } = contracts.TestDynamicArrays); - - const transactions = await Promise.all([ - testDynamicArrays.setBoolArray(boolArray), - testDynamicArrays.setUintArray(uint128Array), - testDynamicArrays.setIntArray(intArray), - testDynamicArrays.setAddressArray(addressArray), - testDynamicArrays.setFixedBytesArray(fixedBytesArray), - testDynamicArrays.setEnumArray(enumArray), - testDynamicArrays.setBytesArray(bytesArray), - testDynamicArrays.setStringArray(stringArray) - ]); - - for (const map of mapArray) { - const [key, value] = map.entries().next().value; - transactions.push(await testDynamicArrays.addMapArrayElement(key, value)); - } - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Get all elements of array. - it('get value for dynamic sized array of boolean type', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'boolArray'); - expect(value).to.eql(boolArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(boolArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 2; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'boolArray', arrayIndex)); - expect(value).to.equal(boolArray[arrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of unsigned integer type', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'uintArray'); - expect(value).to.eql(uint128Array.map(el => BigInt(el))); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(uint128Array.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 3; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'uintArray', arrayIndex)); - expect(value).to.equal(BigInt(uint128Array[arrayIndex])); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of signed integer type', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'intArray'); - expect(value).to.eql(intArray.map(el => BigInt(el))); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(intArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 1; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'intArray', arrayIndex)); - expect(value).to.equal(BigInt(intArray[arrayIndex])); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of address type', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'addressArray'); - expect(value).to.eql(addressArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(addressArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 4; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'addressArray', arrayIndex)); - expect(value).to.equal(addressArray[arrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of fixed size byte array', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'fixedBytesArray'); - expect(value).to.eql(fixedBytesArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(fixedBytesArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 2; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'fixedBytesArray', arrayIndex)); - expect(value).to.equal(fixedBytesArray[arrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of enum type', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'enumArray'); - expect(value).to.eql(enumArray.map(el => BigInt(el))); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(enumArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 2; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'enumArray', arrayIndex)); - expect(value).to.equal(BigInt(enumArray[arrayIndex])); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of bytes', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'bytesArray'); - expect(value).to.eql(bytesArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(bytesArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 2; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'bytesArray', arrayIndex)); - expect(value).to.equal(bytesArray[arrayIndex]); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value for dynamic sized array of string type', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'stringArray'); - expect(value).to.eql(stringArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(stringArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - - // Get value by index. - const arrayIndex = 1; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'stringArray', arrayIndex)); - expect(value).to.equal(stringArray[arrayIndex]); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - describe('get value for dynamic sized array of struct type', async () => { - const structArray: Array<{[key: string]: any}> = []; - let blockHash: string; - const transactions: Array = []; - - before(async () => { - for (let i = 0; i < 5; i++) { - const structElement = { - int1: BigInt(i + 1), - uint1: BigInt(i + 2), - bool1: Boolean(i % 2) - }; - - structArray[i] = structElement; - transactions.push(await testDynamicArrays.addStructArrayElement(structElement)); - } - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - it('get whole array', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'structArray'); - expect(value).to.eql(structArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(structArray.length); - - if (isIpldGql) { - assertProofArray(blockHash, testDynamicArrays.address, proofData); - } - }); - - it('get array element by index', async () => { - const arrayIndex = 3; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'structArray', arrayIndex); - expect(value).to.eql(structArray[arrayIndex]); - - if (isIpldGql) { - assertProofStruct(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - - it('get struct member value from array element', async () => { - const arrayIndex = 2; - const structMember = 'uint1'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'structArray', arrayIndex, structMember); - expect(value).to.eql(structArray[arrayIndex][structMember]); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - }); - - it('get value for dynamic sized array of mapping type', async () => { - const arrayIndex = 2; - const [mapKey, expectedValue] = mapArray[arrayIndex].entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testDynamicArrays.address, 'mapArray', arrayIndex, mapKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testDynamicArrays.address, JSON.parse(proof.data)); - } - }); - }); - - describe('nested arrays', () => { - let testNestedArrays: Contract, storageLayout: StorageLayout, blockHash: string; - const nestedStructArray: Array> = []; - const nestedAddressArray: Array> = []; - - const nestedFixedDynamicArray = [ - [1, 2, 3].map(BigInt), - [4, 5, 6].map(BigInt) - ]; - - const nestedDynamicArray = [ - [1, 2, 3, 4].map(BigInt), - [5, 6].map(BigInt), - [7, 8, 9, 10, 11, 12].map(BigInt), - [13, 14, 15].map(BigInt) - ]; - - before(async () => { - ({ contract: testNestedArrays, storageLayout } = contracts.TestNestedArrays); - const transactions = []; - - const addresses = generateDummyAddresses(7); - const transactionPromises = []; - - // Set value for nestedStructArray. - for (let i = 0; i < 5; i++) { - nestedStructArray[i] = []; - - for (let j = 0; j < 3; j++) { - const value = { - uint1: BigInt((i + j + 1) * 100), - address1: addresses[(i + j) % 5] - }; - - nestedStructArray[i][j] = value; - - // Set value in contract. - transactionPromises.push(testNestedArrays.setNestedStructArray(i, j, value)); - } - } - - transactions.push(...await Promise.all(transactionPromises)); - - // Set value for nestedAddressArray. - for (let i = 0; i < 3; i++) { - nestedAddressArray[i] = addresses.slice(i, i + 4); - } - - transactions.push(await testNestedArrays.setNestedAddressArray(nestedAddressArray)); - - // Set value for nested dynamic arrays - transactions.push(await testNestedArrays.setNestedFixedDynamicArray(nestedFixedDynamicArray)); - transactions.push(await testNestedArrays.setNestedDynamicFixedArray(nestedDynamicArray)); - transactions.push(await testNestedArrays.setNestedDynamicArray(nestedDynamicArray)); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Get all elements of array. - it('get value for fixed size nested array of struct type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedStructArray'); - expect(value).to.eql(nestedStructArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(nestedStructArray.length); - expect(proofData[0].length).to.equal(nestedStructArray[0].length); - expect(proofData[0]).to.have.all.keys(Object.keys(nestedStructArray[0])); - - if (isIpldGql) { - assertProofArray(blockHash, testNestedArrays.address, proofData); - } - }); - - it('get value for fixed size nested array of address type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedAddressArray'); - expect(value).to.eql(nestedAddressArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(nestedAddressArray.length); - expect(proofData[0].length).to.equal(nestedAddressArray[0].length); - - if (isIpldGql) { - assertProofArray(blockHash, testNestedArrays.address, proofData); - } - }); - - it('get value for nested fixed dynamic array of integer type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedFixedDynamicArray'); - expect(value).to.eql(nestedFixedDynamicArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(nestedFixedDynamicArray.length); - expect(proofData[0].length).to.equal(nestedFixedDynamicArray[0].length); - - if (isIpldGql) { - assertProofArray(blockHash, testNestedArrays.address, proofData); - } - }); - - it('get value for nested dynamic fixed array of integer type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedDynamicFixedArray'); - expect(value).to.eql(nestedDynamicArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(nestedDynamicArray.length); - expect(proofData[0].length).to.equal(nestedDynamicArray[0].length); - - if (isIpldGql) { - assertProofArray(blockHash, testNestedArrays.address, proofData); - } - }); - - it('get value for nested dynamic array of integer type', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedDynamicArray'); - expect(value).to.eql(nestedDynamicArray); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(nestedDynamicArray.length); - expect(proofData[0].length).to.equal(nestedDynamicArray[0].length); - - if (isIpldGql) { - assertProofArray(blockHash, testNestedArrays.address, proofData); - } - }); - - // Get element of array by index. - it('get value of fixed size struct type nested array by index', async () => { - const arrayIndex = 2; - const nestedArrayIndex = 1; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedStructArray', arrayIndex, nestedArrayIndex); - expect(value).to.eql(nestedStructArray[arrayIndex][nestedArrayIndex]); - - if (isIpldGql) { - assertProofStruct(blockHash, testNestedArrays.address, JSON.parse(proof.data)); - } - - const structMember = 'address1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedStructArray', arrayIndex, nestedArrayIndex, structMember)); - expect(value).to.equal(nestedStructArray[arrayIndex][nestedArrayIndex][structMember]); - - if (isIpldGql) { - assertProofData(blockHash, testNestedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of fixed size address type nested array by index', async () => { - const arrayIndex = 2; - const nestedArrayIndex = 1; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedAddressArray', arrayIndex, nestedArrayIndex); - expect(value).to.eql(nestedAddressArray[arrayIndex][nestedArrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testNestedArrays.address, JSON.parse(proof.data)); - } - }); - - it('get value of dynamically sized nested array by index', async () => { - // Test for variable nestedFixedDynamicArray. - let arrayIndex = 1; - let nestedArrayIndex = 2; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedFixedDynamicArray', arrayIndex, nestedArrayIndex); - expect(value).to.eql(nestedFixedDynamicArray[arrayIndex][nestedArrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testNestedArrays.address, JSON.parse(proof.data)); - } - - // Test for variable nestedDynamicFixedArray. - arrayIndex = 2; - nestedArrayIndex = 3; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedDynamicFixedArray', arrayIndex, nestedArrayIndex)); - expect(value).to.eql(nestedDynamicArray[arrayIndex][nestedArrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testNestedArrays.address, JSON.parse(proof.data)); - } - - // Test for variable nestedDynamicArray. - arrayIndex = 3; - nestedArrayIndex = 2; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedArrays.address, 'nestedDynamicArray', arrayIndex, nestedArrayIndex)); - expect(value).to.eql(nestedDynamicArray[arrayIndex][nestedArrayIndex]); - - if (isIpldGql) { - assertProofData(blockHash, testNestedArrays.address, JSON.parse(proof.data)); - } - }); - }); - - describe('structs with value type members', () => { - let testValueStructs: Contract, storageLayout: StorageLayout, blockHash: string; - let addressStruct: { [key: string]: any }, contractStruct: { [key: string]: any }; - - const singleSlotStruct = { - int1: BigInt(123), - uint1: BigInt(4) - }; - - const multipleSlotStruct: { [key: string]: any } = { - uint1: BigInt(123), - bool1: false, - int1: BigInt(456) - }; - - const fixedBytesStruct = { - uint1: BigInt(123), - bytesTen: ethers.utils.hexlify(ethers.utils.randomBytes(10)), - bytesTwenty: ethers.utils.hexlify(ethers.utils.randomBytes(20)) - }; - - const enumStruct = { - uint1: BigInt(123), - choice1: BigInt(2), - choice2: BigInt(3) - }; - - before(async () => { - ({ contract: testValueStructs, storageLayout } = contracts.TestValueStructs); - - const [address1, address2] = generateDummyAddresses(2); - - addressStruct = { - int1: BigInt(123), - address1, - address2, - uint1: BigInt(456) - }; - - const { contract } = contracts.TestContractTypes; - - contractStruct = { - uint1: BigInt(123), - testContract: contract.address.toLowerCase() - }; - - const transactions = await Promise.all([ - testValueStructs.setSingleSlotStruct(singleSlotStruct.int1, singleSlotStruct.uint1), - testValueStructs.setMultipleSlotStruct(multipleSlotStruct.uint1, multipleSlotStruct.bool1, multipleSlotStruct.int1), - testValueStructs.setAddressStruct(addressStruct), - testValueStructs.setContractStruct(contractStruct.uint1, contractStruct.testContract), - testValueStructs.setFixedBytesStruct(fixedBytesStruct.uint1, fixedBytesStruct.bytesTen, fixedBytesStruct.bytesTwenty), - testValueStructs.setEnumStruct(enumStruct.uint1, enumStruct.choice1, enumStruct.choice2), - testValueStructs.setSingleSlotStruct(singleSlotStruct.int1, singleSlotStruct.uint1) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Get all members of a struct. - it('get value for struct using a single slot', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'singleSlotStruct'); - expect(value).to.eql(singleSlotStruct); - const proofData = JSON.parse(proof.data); - expect(proofData).to.have.all.keys('int1', 'uint1'); - - if (isIpldGql) { - assertProofStruct(blockHash, testValueStructs.address, proofData); - } - }); - - it('get value for struct using multiple slots', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'multipleSlotStruct'); - expect(value).to.eql(multipleSlotStruct); - const proofData = JSON.parse(proof.data); - expect(proofData).to.have.all.keys(Object.keys(multipleSlotStruct)); - - if (isIpldGql) { - assertProofStruct(blockHash, testValueStructs.address, proofData); - } - }); - - it('get value for struct with address type members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'addressStruct'); - expect(value).to.eql(addressStruct); - const proofData = JSON.parse(proof.data); - expect(proofData).to.have.all.keys(Object.keys(addressStruct)); - - if (isIpldGql) { - assertProofStruct(blockHash, testValueStructs.address, proofData); - } - }); - - it('get value for struct with contract type members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'contractStruct'); - expect(value).to.eql(contractStruct); - const proofData = JSON.parse(proof.data); - expect(proofData).to.have.all.keys(Object.keys(contractStruct)); - - if (isIpldGql) { - assertProofStruct(blockHash, testValueStructs.address, proofData); - } - }); - - it('get value for struct with fixed-sized byte array members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'fixedBytesStruct'); - expect(value).to.eql(fixedBytesStruct); - const proofData = JSON.parse(proof.data); - expect(proofData).to.have.all.keys('uint1', 'bytesTen', 'bytesTwenty'); - - if (isIpldGql) { - assertProofStruct(blockHash, testValueStructs.address, proofData); - } - }); - - it('get value for struct with enum type members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'enumStruct'); - expect(value).to.eql(enumStruct); - const proofData = JSON.parse(proof.data); - expect(proofData).to.have.all.keys('uint1', 'choice1', 'choice2'); - - if (isIpldGql) { - assertProofStruct(blockHash, testValueStructs.address, proofData); - } - }); - - // Get value of a member in a struct - it('get value of signed integer type member in a struct', async () => { - const member = 'int1'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'singleSlotStruct', member); - expect(value).to.equal(singleSlotStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of unsigned integer type member in a struct', async () => { - const member = 'uint1'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'singleSlotStruct', member); - expect(value).to.equal(singleSlotStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of boolean type member in a struct', async () => { - let member = 'bool1'; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'multipleSlotStruct', member); - expect(value).to.equal(multipleSlotStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - - member = 'int1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'multipleSlotStruct', member)); - expect(value).to.equal(multipleSlotStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - - member = 'uint1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'multipleSlotStruct', member)); - expect(value).to.equal(multipleSlotStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of address type member in a struct', async () => { - let member = 'address1'; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'addressStruct', member); - expect(value).to.equal(addressStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - - member = 'uint1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'addressStruct', member)); - expect(value).to.equal(addressStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of contract type member in a struct', async () => { - const member = 'testContract'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'contractStruct', member); - expect(value).to.equal(contractStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of fixed byte array member in a struct', async () => { - const member = 'bytesTen'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'fixedBytesStruct', member); - expect(value).to.equal(fixedBytesStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of enum type member in a struct', async () => { - const member = 'choice2'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testValueStructs.address, 'enumStruct', member); - expect(value).to.equal(enumStruct[member]); - - if (isIpldGql) { - assertProofData(blockHash, testValueStructs.address, JSON.parse(proof.data)); - } - }); - }); - - describe('structs with reference type members', () => { - let testReferenceStructs: Contract, storageLayout: StorageLayout, blockHash: string; - const addresses = generateDummyAddresses(5); - - const fixedArrayStruct = { - int1: BigInt(123), - uintArray: [1, 2, 3, 4].map(el => BigInt(el)), - addressArray: addresses.slice(0, 3) - }; - - const bytesStruct = { - byteArray: ethers.utils.hexlify(ethers.utils.randomBytes(40)), - address1: addresses[1], - uint1: BigInt(1234) - }; - - const stringStruct = { - string1: 'string1', - int1: BigInt(123), - uint1: BigInt(456), - string2: 'string2', - address1: addresses[2], - bool1: false - }; - - const nestedStruct: {[key: string]: any} = { - bytesStruct, - address1: addresses[3] - }; - - const dynamicArrayStruct = { - address1: addresses[4], - uintArray: [1, 2, 3, 4, 5].map(BigInt) - }; - - const valueMappingStruct: { [key: string]: any } = { - uintAddressMap: new Map(), - uint1: 123, - addressIntMap: new Map() - }; - - const referenceMappingStruct: { [key: string]: any } = { - bytesAddressMap: new Map(), - stringUintMap: new Map() - }; - - before(async () => { - ({ contract: testReferenceStructs, storageLayout } = contracts.TestReferenceStructs); - - // Set map values for valueMappingStruct. - const addressKey = addresses[2]; - const mappingKey = 456; - valueMappingStruct.uintAddressMap.set(mappingKey, addresses[3]); - valueMappingStruct.addressIntMap.set(addressKey, 789); - - // Set map values for referenceMappingStruct. - const bytesKey = ethers.utils.hexlify(ethers.utils.randomBytes(40)); - const stringKey = 'abc'; - referenceMappingStruct.bytesAddressMap.set(bytesKey, addresses[1]); - referenceMappingStruct.stringUintMap.set(stringKey, BigInt(123)); - - const transactions = await Promise.all([ - testReferenceStructs.setFixedArrayStruct(fixedArrayStruct.int1, fixedArrayStruct.uintArray, fixedArrayStruct.addressArray), - testReferenceStructs.setBytesStruct(bytesStruct), - testReferenceStructs.setStringStruct(stringStruct), - testReferenceStructs.setDynamicArrayStruct(dynamicArrayStruct), - testReferenceStructs.setNestedStruct(nestedStruct), - testReferenceStructs.setValueMappingStruct(mappingKey, valueMappingStruct.uintAddressMap.get(mappingKey), valueMappingStruct.uint1, addressKey, valueMappingStruct.addressIntMap.get(addressKey)), - testReferenceStructs.setReferenceMappingStruct(bytesKey, referenceMappingStruct.bytesAddressMap.get(bytesKey), stringKey, referenceMappingStruct.stringUintMap.get(stringKey)) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Get all members of a struct. - it('get value for struct with fixed-size array members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'fixedArrayStruct'); - expect(value).to.eql(fixedArrayStruct); - - if (isIpldGql) { - assertProofStruct(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value for struct with dynamically sized byte members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'bytesStruct'); - expect(value).to.eql(bytesStruct); - - if (isIpldGql) { - assertProofStruct(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value for struct with string type members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'stringStruct'); - expect(value).to.eql(stringStruct); - - if (isIpldGql) { - assertProofStruct(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value for struct with dynamic array members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'dynamicArrayStruct'); - expect(value).to.eql(dynamicArrayStruct); - - if (isIpldGql) { - assertProofStruct(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value for nested struct with struct type members', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'nestedStruct'); - expect(value).to.eql(nestedStruct); - - if (isIpldGql) { - assertProofStruct(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - // Get value of a member in a struct - it('get value of fixed-size array member in a struct', async () => { - const member = 'uintArray'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'fixedArrayStruct', member); - expect(value).to.eql(fixedArrayStruct[member]); - - if (isIpldGql) { - assertProofArray(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of bytes member in a struct', async () => { - const member = 'byteArray'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'bytesStruct', member); - expect(value).to.equal(bytesStruct[member]); - - if (isIpldGql) { - assertProofArray(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of string member in a struct', async () => { - const member = 'string2'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'stringStruct', member); - expect(value).to.eql(stringStruct[member]); - - if (isIpldGql) { - assertProofArray(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of dynamic array member in a struct', async () => { - const member = 'uintArray'; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'dynamicArrayStruct', member); - expect(value).to.eql(dynamicArrayStruct[member]); - - if (isIpldGql) { - assertProofArray(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of mapping type member in a struct', async () => { - // Get value for structs with mapping of value type keys. - let member = 'uintAddressMap'; - let [mappingKey, expectedValue] = valueMappingStruct[member].entries().next().value; - - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'valueMappingStruct', member, mappingKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - - // Get value for structs with mapping of reference type keys. - member = 'stringUintMap'; - [mappingKey, expectedValue] = referenceMappingStruct[member].entries().next().value; - - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'referenceMappingStruct', member, mappingKey)); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - - it('get value of nested struct member', async () => { - const member = 'bytesStruct'; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'nestedStruct', member); - expect(value).to.eql(nestedStruct[member]); - - if (isIpldGql) { - assertProofStruct(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - - // Get value inside the nested struct member. - let nestedMember = 'address1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'nestedStruct', member, nestedMember)); - expect(value).to.eql(nestedStruct[member][nestedMember]); - - if (isIpldGql) { - assertProofData(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - - nestedMember = 'byteArray'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testReferenceStructs.address, 'nestedStruct', member, nestedMember)); - expect(value).to.eql(nestedStruct[member][nestedMember]); - - if (isIpldGql) { - assertProofArray(blockHash, testReferenceStructs.address, JSON.parse(proof.data)); - } - }); - }); - - describe('basic mapping type', () => { - let testMappingTypes: Contract, storageLayout: StorageLayout, blockHash: string; - const addressArray = generateDummyAddresses(3); - const [address1, address2] = addressArray; - const addressUintMap = new Map(); - const boolIntMap = new Map([[true, 123]]); - const intAddressMap = new Map([[123, address1]]); - const uintBytesMap = new Map([[123, ethers.utils.hexlify(ethers.utils.randomBytes(16))]]); - const enumIntMap = new Map([[1, 123]]); - const stringIntMap = new Map([['abc', 123]]); - - const bytesAddressMap = new Map(); - const bytesAddressMapKey = ethers.utils.hexlify(ethers.utils.randomBytes(8)); - bytesAddressMap.set(bytesAddressMapKey, address1); - - const bytesUintMap = new Map(); - const bytesUintMapKey = ethers.utils.hexlify(ethers.utils.randomBytes(64)); - bytesUintMap.set(bytesUintMapKey, 123); - - const structMapValue: {[key: string]: any} = { - uint1: BigInt(123), - int1: BigInt(456), - bool1: true, - address1: address2 - }; - - const intStructMap = new Map([[123, structMapValue]]); - const fixedBytesStructKey = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const addressStructMapKey = address1; - const uintFixedArrayMap = new Map([[123, addressArray]]); - const intDynamicArrayMap = new Map([[123, [1, 2, 3, 4, 5, 6, 7, 8]]]); - const addressBytesMap = new Map([[address1, ethers.utils.hexlify(ethers.utils.randomBytes(42))]]); - - const bytesStringMapKey = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const bytesStringMap = new Map([[bytesStringMapKey, 'Hello World.']]); - - before(async () => { - const [signer1] = await ethers.getSigners(); - ({ contract: testMappingTypes, storageLayout } = contracts.TestBasicMapping); - - addressUintMap.set(signer1.address, 123); - - const transactions = await Promise.all([ - testMappingTypes.connect(signer1).setAddressUintMap(addressUintMap.get(signer1.address)), - testMappingTypes.setBoolIntMap(true, boolIntMap.get(true)), - testMappingTypes.setIntAddressMap(123, intAddressMap.get(123)), - testMappingTypes.setUintBytesMap(123, uintBytesMap.get(123)), - testMappingTypes.setBytesAddressMap(bytesAddressMapKey, bytesAddressMap.get(bytesAddressMapKey)), - testMappingTypes.setEnumIntMap(1, enumIntMap.get(1)), - testMappingTypes.setStringIntMap('abc', stringIntMap.get('abc')), - testMappingTypes.setBytesUintMap(bytesUintMapKey, bytesUintMap.get(bytesUintMapKey)), - testMappingTypes.setIntStructMap(123, structMapValue), - testMappingTypes.setFixedBytesStructMap(fixedBytesStructKey, structMapValue), - testMappingTypes.setAddressStructMap(addressStructMapKey, structMapValue), - testMappingTypes.setUintFixedArrayMap(123, uintFixedArrayMap.get(123)), - testMappingTypes.setIntDynamicArrayMap(123, intDynamicArrayMap.get(123)), - testMappingTypes.setAddressBytesMap(address1, addressBytesMap.get(address1)), - testMappingTypes.setBytesStringMap(bytesStringMapKey, bytesStringMap.get(bytesStringMapKey)) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - // Tests for value type keys. - it('get value for mapping with address type keys', async () => { - const [mapKey, expectedValue] = addressUintMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'addressUintMap', mapKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping with boolean type keys', async () => { - const [mapKey, expectedValue] = boolIntMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'boolIntMap', mapKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping with signed integer type keys', async () => { - const [mapKey, expectedValue] = intAddressMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'intAddressMap', mapKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping with unsigned integer type keys', async () => { - const [mapKey, expectedValue] = uintBytesMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'uintBytesMap', mapKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - // TODO: Fix getting value for mapping with keys as fixed-size byte array - // Zero value is returned if using fixed-sized byte array keys of length less than 32 bytes - // Type Bytes32 works whereas types like bytes16, bytes24 do not work. - it.skip('get value for mapping with fixed-size byte array keys', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'bytesAddressMap', bytesAddressMapKey); - expect(value).to.equal(bytesAddressMap.get(bytesAddressMapKey)); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping with enum type keys', async () => { - const [mapKey, expectedValue] = enumIntMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'enumIntMap', mapKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - // Tests for reference type keys. - it('get value for mapping with string type keys', async () => { - const [mapKey, expectedValue] = stringIntMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'stringIntMap', mapKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping with dynamically-sized byte array as keys', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'bytesUintMap', bytesUintMapKey); - expect(value).to.equal(BigInt(bytesUintMap.get(bytesUintMapKey))); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - // Tests for reference type values. - it('get value for mapping with struct type values', async () => { - const mapKey = intStructMap.keys().next().value; - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'intStructMap', mapKey); - expect(value).to.eql(structMapValue); - - if (isIpldGql) { - assertProofStruct(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - - // Get value of specified struct member in mapping. - let structMember = 'bool1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'intStructMap', mapKey, structMember)); - expect(value).to.equal(structMapValue[structMember]); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - - structMember = 'address1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'intStructMap', mapKey, structMember)); - expect(value).to.equal(structMapValue[structMember]); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping of fixed size bytes keys and struct type values', async () => { - let { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'fixedBytesStructMap', fixedBytesStructKey); - expect(value).to.eql(structMapValue); - - if (isIpldGql) { - assertProofStruct(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - - // Get value of specified struct member in mapping. - const structMember = 'int1'; - ({ value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'fixedBytesStructMap', fixedBytesStructKey, structMember)); - expect(value).to.equal(structMapValue[structMember]); - - if (isIpldGql) { - assertProofData(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping of address type keys and struct type values', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'addressStructMap', addressStructMapKey); - expect(value).to.eql(structMapValue); - - if (isIpldGql) { - assertProofStruct(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping of unsigned integer keys and fixed-size array values', async () => { - const [mapKey, expectedValue] = uintFixedArrayMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'uintFixedArrayMap', mapKey); - expect(value).to.eql(expectedValue); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(expectedValue.length); - - if (isIpldGql) { - assertProofArray(blockHash, testMappingTypes.address, proofData); - } - }); - - it('get value for mapping of signed integer keys and dynamically-sized array values', async () => { - const [mapKey, expectedValue] = intDynamicArrayMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'intDynamicArrayMap', mapKey); - expect(value).to.eql(expectedValue.map(BigInt)); - const proofData = JSON.parse(proof.data); - expect(proofData.length).to.equal(expectedValue.length); - - if (isIpldGql) { - assertProofArray(blockHash, testMappingTypes.address, proofData); - } - }); - - it('get value for mapping of address keys and dynamic byte array values', async () => { - const [mapKey, expectedValue] = addressBytesMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'addressBytesMap', mapKey); - expect(value).to.eql(expectedValue); - - if (isIpldGql) { - assertProofArray(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - - it('get value for mapping of fixed size byte array keys and string type values', async () => { - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testMappingTypes.address, 'bytesStringMap', bytesStringMapKey); - expect(value).to.eql(bytesStringMap.get(bytesStringMapKey)); - - if (isIpldGql) { - assertProofArray(blockHash, testMappingTypes.address, JSON.parse(proof.data)); - } - }); - }); - - describe('nested mapping type', () => { - let testNestedMapping: Contract, storageLayout: StorageLayout, blockHash: string; - const [address1, address2, address3] = generateDummyAddresses(3); - const nestedAddressUintMap = new Map(); - - const intAddressBoolMap = new Map([[123, new Map()]]); - intAddressBoolMap.get(123)?.set(address1, true); - - const uintStringIntMap = new Map([[456, new Map()]]); - uintStringIntMap.get(456)?.set('abc', 123); - - const bytesIntAddressMapKey = ethers.utils.hexlify(ethers.utils.randomBytes(64)); - const bytesIntAddressMap = new Map([[bytesIntAddressMapKey, new Map()]]); - bytesIntAddressMap.get(bytesIntAddressMapKey)?.set(123, address1); - - const stringAddressIntMap = new Map([['abc', new Map()]]); - stringAddressIntMap.get('abc')?.set(address1, 123); - - const doubleNestedAddressMap = new Map([[address1, new Map()]]); - doubleNestedAddressMap.get(address1)?.set(address2, new Map()); - doubleNestedAddressMap.get(address1)?.get(address2)?.set(123, address3); - - before(async () => { - const [signer1] = await ethers.getSigners(); - ({ contract: testNestedMapping, storageLayout } = contracts.TestNestedMapping); - - nestedAddressUintMap.set(signer1.address, new Map()); - nestedAddressUintMap.get(signer1.address).set(address1, 123); - - const transactions = await Promise.all([ - testNestedMapping.connect(signer1).setNestedAddressUintMap(address1, nestedAddressUintMap.get(signer1.address).get(address1)), - testNestedMapping.setIntAddressBoolMap(123, address1, intAddressBoolMap.get(123)?.get(address1)), - testNestedMapping.setUintStringIntMap(456, 'abc', uintStringIntMap.get(456)?.get('abc')), - testNestedMapping.setBytesIntAddressMap(bytesIntAddressMapKey, 123, bytesIntAddressMap.get(bytesIntAddressMapKey)?.get(123)), - testNestedMapping.setStringAddressIntMap('abc', address1, stringAddressIntMap.get('abc')?.get(address1)), - testNestedMapping.setDoubleNestedAddressMap(address1, address2, 123, doubleNestedAddressMap.get(address1)?.get(address2)?.get(123)) - ]); - - await Promise.all(transactions.map(transaction => transaction.wait())); - blockHash = await getBlockHash(); - }); - - it('get value for nested mapping with address type keys', async () => { - const [mapKey, nestedMap] = nestedAddressUintMap.entries().next().value; - const [nestedKey, expectedValue] = nestedMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedMapping.address, 'nestedAddressUintMap', mapKey, nestedKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testNestedMapping.address, JSON.parse(proof.data)); - } - }); - - it('get value for nested mapping with signed integer type keys', async () => { - const [mapKey, nestedMap] = intAddressBoolMap.entries().next().value; - const [nestedKey, expectedValue] = nestedMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedMapping.address, 'intAddressBoolMap', mapKey, nestedKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testNestedMapping.address, JSON.parse(proof.data)); - } - }); - - it('get value for nested mapping with unsigned integer type keys', async () => { - const [mapKey, nestedMap] = uintStringIntMap.entries().next().value; - const [nestedKey, expectedValue] = nestedMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedMapping.address, 'uintStringIntMap', mapKey, nestedKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testNestedMapping.address, JSON.parse(proof.data)); - } - }); - - it('get value for nested mapping with dynamically-sized byte array as keys', async () => { - const [mapKey, nestedMap] = bytesIntAddressMap.entries().next().value; - const [nestedKey, expectedValue] = nestedMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedMapping.address, 'bytesIntAddressMap', mapKey, nestedKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testNestedMapping.address, JSON.parse(proof.data)); - } - }); - - it('get value for nested mapping with string type keys', async () => { - const [mapKey, nestedMap] = stringAddressIntMap.entries().next().value; - const [nestedKey, expectedValue] = nestedMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedMapping.address, 'stringAddressIntMap', mapKey, nestedKey); - expect(value).to.equal(BigInt(expectedValue)); - - if (isIpldGql) { - assertProofData(blockHash, testNestedMapping.address, JSON.parse(proof.data)); - } - }); - - it('get value for double nested mapping with address type keys', async () => { - const [mapKey, nestedMap] = doubleNestedAddressMap.entries().next().value; - const [nestedKey, doubleNestedMap] = nestedMap.entries().next().value; - const [doubleNestedKey, expectedValue] = doubleNestedMap.entries().next().value; - const { value, proof } = await getStorageValue(storageLayout, getStorageAt, blockHash, testNestedMapping.address, 'doubleNestedAddressMap', mapKey, nestedKey, doubleNestedKey); - expect(value).to.equal(expectedValue); - - if (isIpldGql) { - assertProofData(blockHash, testNestedMapping.address, JSON.parse(proof.data)); - } - }); - }); -}); diff --git a/packages/solidity-mapper/src/storage.ts b/packages/solidity-mapper/src/storage.ts deleted file mode 100644 index 31115862..00000000 --- a/packages/solidity-mapper/src/storage.ts +++ /dev/null @@ -1,406 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -import { utils, BigNumber } from 'ethers'; - -interface Storage { - slot: string; - offset: number; - type: string; - label: string; -} - -interface Types { - [type: string]: { - encoding: string; - numberOfBytes: string; - label: string; - base?: string; - value?: string; - key?: string; - members?: Storage[]; - }; -} - -type MappingKey = string | boolean | number; - -export interface StorageLayout { - storage: Storage[]; - types: Types -} - -export interface StorageInfo extends Storage { - types: Types -} - -export type GetStorageAt = (param: { blockHash: string, contract: string, slot: string }) => Promise<{ value: string, proof: { data: string } }> - -/** - * Function to get storage information of variable from storage layout. - * @param storageLayout - * @param variableName - */ -export const getStorageInfo = (storageLayout: StorageLayout, variableName: string): StorageInfo => { - const { storage, types } = storageLayout; - const targetState = storage.find((state) => state.label === variableName); - - // Throw if state variable could not be found in storage layout. - if (!targetState) { - throw new Error('Variable not present in storage layout.'); - } - - return { - ...targetState, - slot: utils.hexlify(BigNumber.from(targetState.slot)), - types - }; -}; - -/** - * Function to get the value from storage for a contract variable. - * @param storageLayout - * @param getStorageAt - * @param blockHash - * @param address - * @param variableName - */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -export const getStorageValue = async (storageLayout: StorageLayout, getStorageAt: GetStorageAt, blockHash: string, address: string, variableName: string, ...mappingKeys: Array): Promise<{ value: any, proof: { data: string } }> => { - const { slot, offset, type, types } = getStorageInfo(storageLayout, variableName); - - return getDecodedValue(getStorageAt, blockHash, address, types, { slot, offset, type }, mappingKeys); -}; - -/** - * Get value according to type described by the label. - * @param storageValue - * @param typeLabel - */ -export const getValueByType = (storageValue: string, typeLabel: string): bigint | string | boolean => { - // Parse value for boolean type. - if (typeLabel === 'bool') { - return !BigNumber.from(storageValue).isZero(); - } - - const [isIntegerOrEnum, isInteger, isUnsigned, integerSize] = typeLabel.match(/^enum|((u?)int([0-9]+))/) || [false]; - - // Parse value for uint/int type or enum type. - if (isIntegerOrEnum) { - let bigNumber = BigNumber.from(storageValue); - - if (Boolean(isInteger) && !isUnsigned) { - bigNumber = bigNumber.fromTwos(Number(integerSize)); - } - - return BigInt(bigNumber.toString()); - } - - // Parse value for string type. - if (typeLabel.includes('string')) { - return utils.toUtf8String(storageValue); - } - - if (typeLabel.startsWith('address')) { - return utils.getAddress(storageValue); - } - - return storageValue; -}; - -/** - * Function to get decoded value according to type and encoding. - * @param getStorageAt - * @param blockHash - * @param address - * @param types - * @param storageInfo - */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -const getDecodedValue = async (getStorageAt: GetStorageAt, blockHash: string, address: string, types: Types, storageInfo: { slot: string, offset: number, type: string }, mappingKeys: Array): Promise<{ value: any, proof: { data: string } }> => { - const { slot, offset, type } = storageInfo; - const { encoding, numberOfBytes, label: typeLabel, base, value: mappingValueType, key: mappingKeyType, members } = types[type]; - - let value: string, proof: { data: string }; - const [isArray, arraySize] = typeLabel.match(/\[([0-9]+)\]$/) || [false]; - - // If variable is array type. - if (Boolean(isArray) && base) { - return getArrayValue(getStorageAt, blockHash, address, types, mappingKeys, slot, base, Number(arraySize)); - } - - const isStruct = /^struct .+/.test(typeLabel); - - // If variable is struct type. - if (isStruct && members) { - return getStructureValue(getStorageAt, blockHash, address, types, mappingKeys, slot, members); - } - - // Get value according to encoding i.e. how the data is encoded in storage. - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#json-output - switch (encoding) { - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#layout-of-state-variables-in-storage - case 'inplace': - ({ value, proof } = await getInplaceValue(getStorageAt, blockHash, address, slot, offset, numberOfBytes)); - break; - - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#bytes-and-string - case 'bytes': - ({ value, proof } = await getBytesValue(getStorageAt, blockHash, address, slot)); - break; - - case 'mapping': { - if (mappingValueType && mappingKeyType) { - const mappingSlot = getMappingSlot(types, slot, mappingKeyType, mappingKeys[0]); - - return getDecodedValue(getStorageAt, blockHash, address, types, { slot: mappingSlot, offset: 0, type: mappingValueType }, mappingKeys.slice(1)); - } else { - throw new Error(`Mapping value type not specified for ${mappingKeys[0]}`); - } - - break; - } - - case 'dynamic_array': { - if (base) { - const { slot: dynamicArraySlot, size } = await getDynamicArrayInfo(getStorageAt, blockHash, address, slot, offset, numberOfBytes); - - return getArrayValue(getStorageAt, blockHash, address, types, mappingKeys, dynamicArraySlot, base, size); - } else { - throw new Error('Missing base type for dynamic array.'); - } - - break; - } - - default: - throw new Error(`Encoding ${encoding} not implemented.`); - } - - return { - value: getValueByType(value, typeLabel), - proof - }; -}; - -/** - * Function to get slot for mapping types. - * @param mappingSlot - * @param key - */ -export const getMappingSlot = (types: Types, mappingSlot: string, keyType: string, key: MappingKey): string => { - const { encoding, label: typeLabel } = types[keyType]; - - // If key is boolean type convert to 1 or 0 which is the way value is stored in memory. - if (typeLabel === 'bool') { - key = key ? 1 : 0; - } - - // If key is string convert to hex string representation. - if (typeLabel === 'string' && typeof key === 'string') { - key = utils.hexlify(utils.toUtf8Bytes(key)); - } - - // If key is still boolean type the argument passed as key is invalid. - if (typeof key === 'boolean') { - throw new Error('Invalid key.'); - } - - // https://github.com/ethers-io/ethers.js/issues/1079#issuecomment-703056242 - const mappingSlotPadded = utils.hexZeroPad(mappingSlot, 32); - - const keyPadded = encoding === 'bytes' - ? utils.hexlify(key) - : utils.hexZeroPad(utils.hexlify(key), 32); - - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#mappings-and-dynamic-arrays - const fullKey = utils.concat([ - keyPadded, - mappingSlotPadded - ]); - - const slot = utils.keccak256(fullKey); - return slot; -}; - -const getDynamicArrayInfo = async (getStorageAt: GetStorageAt, blockHash: string, address: string, slot: string, offset: number, numberOfBytes: string) => { - const { value } = await getInplaceValue(getStorageAt, blockHash, address, slot, offset, numberOfBytes); - const size = Number(getValueByType(value, 'uint')); - const paddedSlot = utils.hexZeroPad(slot, 32); - slot = utils.keccak256(paddedSlot); - - return { size, slot }; -}; - -const getArrayValue = async (getStorageAt: GetStorageAt, blockHash: string, address: string, types: Types, mappingKeys: MappingKey[], slot: string, base: string, arraySize: number) => { - const resultArray = []; - const proofs = []; - const { numberOfBytes: baseNumberOfBytes } = types[base]; - - const getArrayElement = async (mappingKeys: MappingKey[], index: number) => { - let arraySlotOffset = 0; - let slotIndex; - - if (Number(baseNumberOfBytes) <= 32) { - const elementsInSlot = Math.floor(32 / Number(baseNumberOfBytes)); - slotIndex = Math.floor(index / elementsInSlot); - arraySlotOffset = (index % elementsInSlot) * Number(baseNumberOfBytes); - } else { - const slotsUsedByElement = Math.ceil(Number(baseNumberOfBytes) / 32); - slotIndex = slotsUsedByElement * index; - } - - const arraySlot = BigNumber.from(slot).add(slotIndex).toHexString(); - - return getDecodedValue(getStorageAt, blockHash, address, types, { slot: arraySlot, offset: arraySlotOffset, type: base }, mappingKeys); - }; - - const [arrayIndex, ...remainingKeys] = mappingKeys; - - if (typeof arrayIndex === 'number') { - return getArrayElement(remainingKeys, arrayIndex); - } - - // Loop over elements of array and get value. - for (let i = 0; i < arraySize; i++) { - const { value, proof } = await getArrayElement(mappingKeys, i); - resultArray.push(value); - - // Each element in array gets its own proof even if it is packed. - proofs.push(JSON.parse(proof.data)); - } - - return { - value: resultArray, - proof: { - data: JSON.stringify(proofs) - } - }; -}; - -const getStructureValue = async (getStorageAt: GetStorageAt, blockHash: string, address: string, types: Types, mappingKeys: MappingKey[], slot: string, members: Storage[]) => { - // Get value of specified member in struct. - const getStructMember = async (mappingKeys: MappingKey[], member: Storage) => { - const structSlot = BigNumber.from(slot).add(member.slot).toHexString(); - - return getDecodedValue(getStorageAt, blockHash, address, types, { slot: structSlot, offset: member.offset, type: member.type }, mappingKeys); - }; - - const [memberName, ...remainingKeys] = mappingKeys; - const member = members.find(member => member.label === memberName); - - // If member name passed in argument is present. - if (member) { - return getStructMember(remainingKeys, member); - } - - // TODO: Get values in single call and parse according to type. - // Get member values specified for the struct in storage layout. - const resultPromises = members.map(async member => { - return getStructMember(mappingKeys, member); - }); - - const results = await Promise.all(resultPromises); - - const initialValue: { - value: {[key: string]: any}, - proof: { data: string } - } = { - value: {}, - proof: { data: JSON.stringify({}) } - }; - - // Return struct type value as an object with keys as the struct member labels. - return members.reduce((acc, member, index) => { - acc.value[member.label] = results[index].value; - const proofData = JSON.parse(acc.proof.data); - proofData[member.label] = JSON.parse(results[index].proof.data); - acc.proof.data = JSON.stringify(proofData); - return acc; - }, initialValue); -}; - -/** - * Function to get value for inplace encoding. - * @param address - * @param slot - * @param offset - * @param numberOfBytes - * @param getStorageAt - */ -const getInplaceValue = async (getStorageAt: GetStorageAt, blockHash: string, address: string, slot: string, offset: number, numberOfBytes: string) => { - // TODO: Memoize getStorageAt function for duplicate multiple calls. - const { value, proof } = await getStorageAt({ blockHash, contract: address, slot }); - const valueLength = utils.hexDataLength(value); - - // Get value according to offset. - const start = valueLength - (offset + Number(numberOfBytes)); - const end = valueLength - offset; - - return { - value: utils.hexDataSlice(value, start, end), - proof - }; -}; - -/** - * Function to get value for bytes encoding. - * @param address - * @param slot - * @param getStorageAt - */ -const getBytesValue = async (getStorageAt: GetStorageAt, blockHash: string, address: string, slot: string) => { - const { value, proof } = await getStorageAt({ blockHash, contract: address, slot }); - let length = 0; - const proofs = [JSON.parse(proof.data)]; - - // Get length of bytes stored. - if (BigNumber.from(utils.hexDataSlice(value, 0, 1)).isZero()) { - // If first byte is not set, get length directly from the zero padded byte array. - const slotValue = BigNumber.from(value); - length = slotValue.sub(1).div(2).toNumber(); - } else { - // If first byte is set the length is lesser than 32 bytes. - // Length of the value can be computed from the last byte. - const lastByteHex = utils.hexDataSlice(value, 31, 32); - length = BigNumber.from(lastByteHex).div(2).toNumber(); - } - - // Get value from the byte array directly if length is less than 32. - if (length < 32) { - return { - value: utils.hexDataSlice(value, 0, length), - proof: { - data: JSON.stringify(proofs) - } - }; - } - - // Array to hold multiple bytes32 data. - const hexStringArray = []; - - // Compute zero padded hexstring to calculate hashed position of storage. - // https://github.com/ethers-io/ethers.js/issues/1079#issuecomment-703056242 - const paddedSlotHex = utils.hexZeroPad(slot, 32); - const position = utils.keccak256(paddedSlotHex); - - // Get value from consecutive storage slots for longer data. - for (let i = 0; i < length / 32; i++) { - const { value, proof } = await getStorageAt({ - blockHash, - contract: address, - slot: BigNumber.from(position).add(i).toHexString() - }); - - hexStringArray.push(value); - proofs.push(JSON.parse(proof.data)); - } - - // Slice trailing bytes according to length of value. - return { - value: utils.hexDataSlice(utils.hexConcat(hexStringArray), 0, length), - proof: { - data: JSON.stringify(proofs) - } - }; -}; diff --git a/packages/solidity-mapper/test/contracts/TestAddress.sol b/packages/solidity-mapper/test/contracts/TestAddress.sol deleted file mode 100644 index e53e80b7..00000000 --- a/packages/solidity-mapper/test/contracts/TestAddress.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestAddress { - // Address type need 20 bytes for storage. - address address1; - - // Address type uses the next slot as there is not enough space in previous slot. - address payable address2; - - // Set variable address1. - function setAddress1(address value) external { - address1 = value; - } - - // Set variable address2. - function setAddress2(address payable value) external { - address2 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestBasicMapping.sol b/packages/solidity-mapper/test/contracts/TestBasicMapping.sol deleted file mode 100644 index aed93ba6..00000000 --- a/packages/solidity-mapper/test/contracts/TestBasicMapping.sol +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.6; - -// https://docs.soliditylang.org/en/v0.8.5/layout-of-source-files.html#abi-coder-pragma -pragma abicoder v2; - -contract TestBasicMapping { - // Mapping type variable occupies one single slot but the actual elements are stored at a different storage slot that is computed using a Keccak-256 hash. - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#mappings-and-dynamic-arrays - mapping(address => uint) public addressUintMap; - - // Mapping type variable occupies the next single slot. - mapping(bool => int) public boolIntMap; - - // Mapping with int128 keys and contract type values. - mapping(int128 => address) public intAddressMap; - - // Mapping with uint32 keys and fixed-size byte array values. - mapping(uint32 => bytes16) public uintBytesMap; - - // Mapping with fixed-size byte array keys and address type values. - mapping(bytes8 => address) public bytesAddressMap; - - // Enum declaration. - enum Choices { Choice0, Choice1, Choice2, Choice3 } - - // Mapping with enum type keys and integer type values. - mapping(Choices => int) public enumIntMap; - - // Mapping with string type keys and integer type values. - mapping(string => int) public stringIntMap; - - // Mapping with dynamically-sized byte array as keys and unsigned integer type values. - mapping(bytes => uint) public bytesUintMap; - - struct TestStruct { - uint128 uint1; - int56 int1; - bool bool1; - address address1; - } - - // Mapping with signed integer as keys and struct type values. - mapping(int24 => TestStruct) public intStructMap; - - // Mapping with signed integer as keys and struct type values. - mapping(bytes32 => TestStruct) public fixedBytesStructMap; - - // Mapping with address as keys and struct type values. - mapping(address => TestStruct) public addressStructMap; - - mapping(uint24 => address[3]) public uintFixedArrayMap; - - mapping(int16 => uint128[]) public intDynamicArrayMap; - - mapping(address => bytes) public addressBytesMap; - - mapping(bytes32 => string) public bytesStringMap; - - // Set variable addressUintMap. - function setAddressUintMap(uint value) external { - addressUintMap[msg.sender] = value; - } - - // Set variable boolIntMap. - function setBoolIntMap(bool key, int value) external { - boolIntMap[key] = value; - } - - // Set variable intAddressMap. - function setIntAddressMap(int128 key, address value) external { - intAddressMap[key] = value; - } - - // Set variable uintBytesMap. - function setUintBytesMap(uint32 key, bytes16 value) external { - uintBytesMap[key] = value; - } - - // Set variable bytesAddressMap. - function setBytesAddressMap(bytes8 key, address value) external { - bytesAddressMap[key] = value; - } - - // Set variable enumIntMap. - function setEnumIntMap(Choices key, int value) external { - enumIntMap[key] = value; - } - - // Set variable stringIntMap. - function setStringIntMap(string calldata key, int value) external { - stringIntMap[key] = value; - } - - // Set variable bytesUintMap. - function setBytesUintMap(bytes calldata key, uint value) external { - bytesUintMap[key] = value; - } - - // Set variable intStruct. - function setIntStructMap(int24 key, TestStruct calldata value) external { - intStructMap[key] = value; - } - - // Set variable fixedBytesStructMap. - function setFixedBytesStructMap(bytes32 key, TestStruct calldata value) external { - fixedBytesStructMap[key] = value; - } - - // Set variable fixedBytesStructMap. - function setAddressStructMap(address key, TestStruct calldata value) external { - addressStructMap[key] = value; - } - - // Set variable uintFixedArrayMap. - function setUintFixedArrayMap(uint24 key, address[3] calldata value) external { - uintFixedArrayMap[key] = value; - } - - // Set variable intDynamicArrayMap. - function setIntDynamicArrayMap(int16 key, uint128[] calldata value) external { - intDynamicArrayMap[key] = value; - } - - // Set variable addressBytesMap. - function setAddressBytesMap(address key, bytes calldata value) external { - addressBytesMap[key] = value; - } - - // Set variable bytesStringMap. - function setBytesStringMap(bytes32 key, string calldata value) external { - bytesStringMap[key] = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestBooleans.sol b/packages/solidity-mapper/test/contracts/TestBooleans.sol deleted file mode 100644 index fffa8d49..00000000 --- a/packages/solidity-mapper/test/contracts/TestBooleans.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestBooleans { - // Boolean type variables are packed together in a slot as they occupy less than 32 bytes together. - bool bool1; - bool bool2; - - // Set variable bool1. - function setBool1(bool value) external { - bool1 = value; - } - - // Set variable bool2. - function setBool2(bool value) external { - bool2 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestBytes.sol b/packages/solidity-mapper/test/contracts/TestBytes.sol deleted file mode 100644 index 802c13fb..00000000 --- a/packages/solidity-mapper/test/contracts/TestBytes.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestBytes { - // Byte array variables are packed together in a slot as they occupy less than 32 bytes together. - bytes10 bytesTen; - bytes20 bytesTwenty; - - // Byte array variable is stored in the next slot as there is not enough space for it in the previous slot. - bytes30 bytesThirty; - - // Dynamically sized byte arrays will take the next single slot. - // If data is 32 or more bytes, the main slot stores the value length * 2 + 1 and the data is stored in keccak256(slot). - // Else the main slot stores the data and value length * 2. - // https://docs.soliditylang.org/en/v0.7.4/internals/layout_in_storage.html#bytes-and-string - bytes bytesArray1; - bytes bytesArray2; - - // Set variable bytesTen. - function setBytesTen(bytes10 value) external { - bytesTen = value; - } - - // Set variable bytesTwenty. - function setBytesTwenty(bytes20 value) external { - bytesTwenty = value; - } - - // Set variable bytesThirty. - function setBytesThirty(bytes30 value) external { - bytesThirty = value; - } - - // Set variable bytesArray1. - function setBytesArray1(bytes calldata value) external { - bytesArray1 = value; - } - - // Set variable bytesArray2. - function setBytesArray2(bytes calldata value) external { - bytesArray2 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestContractTypes.sol b/packages/solidity-mapper/test/contracts/TestContractTypes.sol deleted file mode 100644 index c9d961a8..00000000 --- a/packages/solidity-mapper/test/contracts/TestContractTypes.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -import "./TestAddress.sol"; - -contract TestContractTypes { - // Contract types like address type need 20 bytes for storage. - TestAddress addressContract1; - - // Contract type variable uses the next slot as there is not enough space in previous slot. - TestAddress addressContract2; - - // Set variable addressContract1. - function setAddressContract1 (TestAddress value) external { - addressContract1 = value; - } - - // Set variable addressContract2. - function setAddressContract2 (TestAddress value) external { - addressContract2 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestDynamicArrays.sol b/packages/solidity-mapper/test/contracts/TestDynamicArrays.sol deleted file mode 100644 index 588e5ae2..00000000 --- a/packages/solidity-mapper/test/contracts/TestDynamicArrays.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.6; - -// https://docs.soliditylang.org/en/v0.8.5/layout-of-source-files.html#abi-coder-pragma -pragma abicoder v2; - -contract TestDynamicArrays { - // Dynamic sized array variable will use 1 single slot which contains number of array elements. - int[] intArray; - - // Dynamic sized array always uses the next consecutive single slot. - uint128[] uintArray; - - bool[] boolArray; - - address[] addressArray; - - bytes10[] fixedBytesArray; - - enum Choices { Choice0, Choice1, Choice2, Choice3 } - - Choices[] enumArray; - - bytes[] bytesArray; - - string[] stringArray; - - struct TestStruct { - uint32 uint1; - int56 int1; - bool bool1; - } - - TestStruct[] structArray; - - mapping(address => uint)[] mapArray; - - // Set variable intArray. - function setIntArray(int[] calldata value) external { - intArray = value; - } - - // Set variable uintArray. - function setUintArray(uint128[] calldata value) external { - uintArray = value; - } - - // Set variable boolArray. - function setBoolArray(bool[] calldata value) external { - boolArray = value; - } - - // Set variable addressArray. - function setAddressArray(address[] calldata value) external { - addressArray = value; - } - - // Set variable fixedBytesArray. - function setFixedBytesArray(bytes10[] calldata value) external { - fixedBytesArray = value; - } - - // Set variable enumArray. - function setEnumArray(Choices[] calldata value) external { - enumArray = value; - } - - // Set variable bytesArray. - function setBytesArray(bytes[] memory value) external { - bytesArray = value; - } - - // Set variable stringArray. - function setStringArray(string[] memory value) external { - stringArray = value; - } - - // Set variable structArray. - function addStructArrayElement(TestStruct calldata value) external { - structArray.push(value); - } - - // Set variable structArray. - function addMapArrayElement(address key, uint value) external { - mapping(address => uint256) storage element = mapArray.push(); - element[key] = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestEnums.sol b/packages/solidity-mapper/test/contracts/TestEnums.sol deleted file mode 100644 index bf4bc53f..00000000 --- a/packages/solidity-mapper/test/contracts/TestEnums.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestEnums { - // Variables of this enum type will need 1 byte for storage. - enum Choices { Choice0, Choice1, Choice2, Choice3 } - - // Enum type variables are packed together in a slot as they occupy less than 32 bytes together. - Choices choicesEnum1; - Choices choicesEnum2; - - // Set variable choicesEnum1. - function setChoicesEnum1(Choices value) external { - choicesEnum1 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestEvents.sol b/packages/solidity-mapper/test/contracts/TestEvents.sol deleted file mode 100644 index c7f76c33..00000000 --- a/packages/solidity-mapper/test/contracts/TestEvents.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestEvents { - event Event1(address address1, string string1, string strin2); - - // Function to emit event. - function emitEvent(string calldata string1, string calldata string2) external { - emit Event1(msg.sender, string1, string2); - } -} diff --git a/packages/solidity-mapper/test/contracts/TestFixedArrays.sol b/packages/solidity-mapper/test/contracts/TestFixedArrays.sol deleted file mode 100644 index 7b26cc26..00000000 --- a/packages/solidity-mapper/test/contracts/TestFixedArrays.sol +++ /dev/null @@ -1,97 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.6; - -// https://docs.soliditylang.org/en/v0.8.5/layout-of-source-files.html#abi-coder-pragma -pragma abicoder v2; - -contract TestFixedArrays { - // Fixed size array variable will use 5 consecutive slots as size of 1 element is 32 bytes. - uint[5] uintArray; - - // Fixed size array variable will use 3 slots as size of 1 element is 16 bytes. - int128[5] int128Array; - - // Fixed size array variable will use 1 slot as size of one element is 1 byte. - bool[2] boolArray; - - // Fixed size array variable will use the next slot as it is of array type. - // https://docs.soliditylang.org/en/v0.7.4/internals/layout_in_storage.html#layout-of-state-variables-in-storage - uint16[5] uint16Array; - - address[4] addressArray; - - bytes10[5] fixedBytesArray; - - enum Choices { Choice0, Choice1, Choice2, Choice3 } - - Choices[6] enumArray; - - bytes[4] bytesArray; - - string[3] stringArray; - - struct TestStruct { - uint32 uint1; - int56 int1; - bool bool1; - } - - TestStruct[5] structArray; - - mapping(address => uint)[3] mapArray; - - // Set variable boolArray. - function setBoolArray(bool[2] calldata value) external { - boolArray = value; - } - - // Set variable uintArray. - function setUintArray(uint[5] calldata value) external { - uintArray = value; - } - - // Set variable uint16Array. - function setUint16Array(uint16[5] calldata value) external { - uint16Array = value; - } - - // Set variable int128Array. - function setInt128Array(int128[5] calldata value) external { - int128Array = value; - } - - // Set variable addressArray. - function setAddressArray(address[4] calldata value) external { - addressArray = value; - } - - // Set variable fixedBytesArray. - function setFixedBytesArray(bytes10[5] calldata value) external { - fixedBytesArray = value; - } - - // Set variable structArray. - function setStructArray(TestStruct calldata value, uint index) external { - structArray[index] = value; - } - - // Set variable enumArray. - function setEnumArray(Choices[6] calldata value) external { - enumArray = value; - } - - // Set variable bytesArray. - function setBytesArray(bytes[4] memory value) external { - bytesArray = value; - } - - // Set variable stringArray. - function setStringArray(string[3] memory value) external { - stringArray = value; - } - - // Set variable mapArray. - function setMapArray(address key, uint value, uint index) external { - mapArray[index][key] = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestIntegers.sol b/packages/solidity-mapper/test/contracts/TestIntegers.sol deleted file mode 100644 index 0f037abb..00000000 --- a/packages/solidity-mapper/test/contracts/TestIntegers.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestIntegers { - // Following integer type variables are packed together in a single slot since the combined size is less than 32 bytes. - int8 int1; - int16 int2; - - // Integer type variable is stored in the next slot as it needs 32 bytes of storage. - int256 int3; - - // Integer type variable is stored in the next slot as there is not enough space for it in the previous slot. - int24 int4; - - int32 int5; - int64 int6; - int72 int7; - int96 int9; - int128 int10; - int200 int11; - int232 int12; - int256 int13; - - // Set variable int1. - function setInt1(int8 value) external { - int1 = value; - } - - // Set variable int2. - function setInt2(int16 value) external { - int2 = value; - } - - // Set variable int3. - function setInt3(int256 value) external { - int3 = value; - } - - // Set variable int4. - function setInt4(int24 value) external { - int4 = value; - } - - // Set variable int5. - function setInt5(int32 value) external { - int5 = value; - } - - // Set variable int6. - function setInt6(int64 value) external { - int6 = value; - } - - // Set variable int7. - function setInt7(int72 value) external { - int7 = value; - } - - // Set variable int9. - function setInt9(int96 value) external { - int9 = value; - } - - // Set variable int10. - function setInt10(int128 value) external { - int10 = value; - } - - // Set variable int11. - function setInt11(int200 value) external { - int11 = value; - } - - // Set variable int12. - function setInt12(int232 value) external { - int12 = value; - } - - // Set variable int13. - function setInt13(int256 value) external { - int13 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestNestedArrays.sol b/packages/solidity-mapper/test/contracts/TestNestedArrays.sol deleted file mode 100644 index 027c2918..00000000 --- a/packages/solidity-mapper/test/contracts/TestNestedArrays.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.6; - -// https://docs.soliditylang.org/en/v0.8.5/layout-of-source-files.html#abi-coder-pragma -pragma abicoder v2; - -contract TestNestedArrays { - address[4][3] nestedAddressArray; - - struct TestStruct { - uint256 uint1; - address address1; - } - - TestStruct[3][5] nestedStructArray; - - int128[3][] nestedFixedDynamicArray; - - uint32[][4] nestedDynamicFixedArray; - - int64[][] nestedDynamicArray; - - // Set variable nestedStructArray. - function setNestedStructArray(uint index, uint nestedIndex, TestStruct calldata value) external { - nestedStructArray[index][nestedIndex] = value; - } - - // Set variable nestedAddressArray. - function setNestedAddressArray(address[4][3] calldata value) external { - nestedAddressArray = value; - } - - // Set variable nestedFixedDynamicArray. - function setNestedFixedDynamicArray(int128[3][] calldata value) external { - nestedFixedDynamicArray = value; - } - - // Set variable nestedDynamicFixedArray. - function setNestedDynamicFixedArray(uint32[][4] memory value) external { - nestedDynamicFixedArray = value; - } - - // Set variable nestedDynamicArray. - function setNestedDynamicArray(int64[][] memory value) external { - nestedDynamicArray = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestNestedMapping.sol b/packages/solidity-mapper/test/contracts/TestNestedMapping.sol deleted file mode 100644 index e7e7cfee..00000000 --- a/packages/solidity-mapper/test/contracts/TestNestedMapping.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestNestedMapping { - // Mapping type variable occupies one single slot but the actual elements are stored at a different storage slot that is computed using a Keccak-256 hash. - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#mappings-and-dynamic-arrays - mapping (address => mapping (address => uint)) private nestedAddressUintMap; - - mapping (int => mapping (address => bool)) private intAddressBoolMap; - - mapping (uint => mapping (string => int)) private uintStringIntMap; - - mapping (bytes => mapping (int => address)) private bytesIntAddressMap; - - mapping (string => mapping (address => int)) private stringAddressIntMap; - - mapping (address => mapping (address => mapping (uint24 => address))) public doubleNestedAddressMap; - - // Set variable nestedAddressUintMap. - function setNestedAddressUintMap(address nestedKey, uint value) external { - nestedAddressUintMap[msg.sender][nestedKey] = value; - } - - // Set variable intAddressBoolMap. - function setIntAddressBoolMap(int key, address nestedKey, bool value) external { - intAddressBoolMap[key][nestedKey] = value; - } - - // Set variable uintStringIntMap. - function setUintStringIntMap(uint key, string calldata nestedKey, int value) external { - uintStringIntMap[key][nestedKey] = value; - } - - // Set variable bytesIntAddressMap. - function setBytesIntAddressMap(bytes calldata key, int nestedKey, address value) external { - bytesIntAddressMap[key][nestedKey] = value; - } - - // Set variable stringAddressIntMap. - function setStringAddressIntMap(string calldata key, address nestedKey, int value) external { - stringAddressIntMap[key][nestedKey] = value; - } - - // Set variable doubleNestedAddressMap. - function setDoubleNestedAddressMap(address key, address nestedKey, uint24 doubleNestedKey, address value) external { - doubleNestedAddressMap[key][nestedKey][doubleNestedKey] = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestReferenceStructs.sol b/packages/solidity-mapper/test/contracts/TestReferenceStructs.sol deleted file mode 100644 index 27b44dc7..00000000 --- a/packages/solidity-mapper/test/contracts/TestReferenceStructs.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.6; - -// https://docs.soliditylang.org/en/v0.8.5/layout-of-source-files.html#abi-coder-pragma -pragma abicoder v2; - -contract TestReferenceStructs { - struct FixedArrayStruct { - int8 int1; - uint16[4] uintArray; - address[3] addressArray; - } - - FixedArrayStruct fixedArrayStruct; - - struct BytesStruct { - bytes byteArray; - address address1; - uint256 uint1; - } - - BytesStruct bytesStruct; - - struct StringStruct { - string string1; - uint24 uint1; - string string2; - address address1; - bool bool1; - int24 int1; - } - - StringStruct stringStruct; - - struct DynamicArrayStruct { - address address1; - uint160[] uintArray; - } - - DynamicArrayStruct dynamicArrayStruct; - - struct ValueMappingStruct { - mapping(uint => address) uintAddressMap; - uint32 uint1; - mapping(address => int) addressIntMap; - } - - ValueMappingStruct public valueMappingStruct; - - struct ReferenceMappingStruct { - mapping(bytes => address) bytesAddressMap; - mapping(string => uint) stringUintMap; - } - - ReferenceMappingStruct referenceMappingStruct; - - struct NestedStruct { - BytesStruct bytesStruct; - address address1; - } - - NestedStruct nestedStruct; - - // Set variable fixedArrayStruct. - function setFixedArrayStruct(int8 int1Value, uint16[4] calldata uintArrayValue, address[3] calldata addressArrayValue) external { - fixedArrayStruct.int1 = int1Value; - fixedArrayStruct.uintArray = uintArrayValue; - fixedArrayStruct.addressArray = addressArrayValue; - } - - // Set variable bytesStruct. - function setBytesStruct(BytesStruct calldata value) external { - bytesStruct = value; - } - - // Set variable stringStruct. - function setStringStruct(StringStruct calldata value) external { - stringStruct = value; - } - - // Set variable valueMappingStruct. - function setValueMappingStruct(uint uintAddressKey, address uintAddressValue, uint32 uint1Value, address addressIntKey, int addressIntValue) external { - valueMappingStruct.uintAddressMap[uintAddressKey] = uintAddressValue; - valueMappingStruct.uint1 = uint1Value; - valueMappingStruct.addressIntMap[addressIntKey] = addressIntValue; - } - - // Set variable referenceMappingStruct. - function setReferenceMappingStruct(bytes calldata bytesAddressKey, address bytesAddressValue, string calldata stringUintKey, uint stringUintValue) external { - referenceMappingStruct.bytesAddressMap[bytesAddressKey] = bytesAddressValue; - referenceMappingStruct.stringUintMap[stringUintKey] = stringUintValue; - } - - // Set variable nestedStruct. - function setNestedStruct(NestedStruct calldata value) external { - nestedStruct = value; - } - - // Set variable dynamicArrayStruct. - function setDynamicArrayStruct(DynamicArrayStruct calldata value) external { - dynamicArrayStruct = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestStrings.sol b/packages/solidity-mapper/test/contracts/TestStrings.sol deleted file mode 100644 index 2b20a0ee..00000000 --- a/packages/solidity-mapper/test/contracts/TestStrings.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestStrings { - string string1; - - // String type variable takes the next single slot. - // If data is 32 or more bytes, the main slot stores the value length * 2 + 1 and the data is stored in keccak256(slot). - // Else the main slot stores the data and value length * 2. - // https://docs.soliditylang.org/en/v0.7.4/internals/layout_in_storage.html#bytes-and-string - string string2; - - // Set variable string1. - function setString1(string memory value) external { - string1 = value; - } - - // Set variable string2. - function setString2(string memory value) external { - string2 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestUnsignedIntegers.sol b/packages/solidity-mapper/test/contracts/TestUnsignedIntegers.sol deleted file mode 100644 index 8ea4f373..00000000 --- a/packages/solidity-mapper/test/contracts/TestUnsignedIntegers.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.0; - -contract TestUnsignedIntegers { - // Following unsigned integer variables are packed together in a single slot since the combined size is less than 32 bytes. - uint8 uint1; - uint16 uint2; - - // Unsigned integer variable is stored in the next slot as it needs 32 bytes of storage. - uint256 uint3; - - // Unsigned integer variable is stored in the next slot as there is not enough space for it in the previous slot. - uint32 uint4; - - // Set variable uint1. - function setUint1(uint8 value) external { - uint1 = value; - } - - // Set variable uint2. - function setUint2(uint16 value) external { - uint2 = value; - } - - // Set variable uint3. - function setUint3(uint256 value) external { - uint3 = value; - } - - // Set variable uint4. - function setUint4(uint32 value) external { - uint4 = value; - } -} diff --git a/packages/solidity-mapper/test/contracts/TestValueStructs.sol b/packages/solidity-mapper/test/contracts/TestValueStructs.sol deleted file mode 100644 index dc14efbb..00000000 --- a/packages/solidity-mapper/test/contracts/TestValueStructs.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.7.6; - -// https://docs.soliditylang.org/en/v0.8.5/layout-of-source-files.html#abi-coder-pragma -pragma abicoder v2; - -import "./TestContractTypes.sol"; - -contract TestValueStructs { - struct SingleSlotStruct { - int16 int1; - uint8 uint1; - } - - // Struct variable will use one single slot as size of the members is less than 32 bytes. - SingleSlotStruct singleSlotStruct; - - struct MultipleSlotStruct { - uint128 uint1; - bool bool1; - int192 int1; - } - - // Struct variable will use multiple slots as size of the members is more than 32 bytes. - MultipleSlotStruct multipleSlotStruct; - - struct AddressStruct { - int8 int1; - address address1; - address address2; - uint16 uint1; - } - - AddressStruct addressStruct; - - struct ContractStruct { - uint16 uint1; - TestContractTypes testContract; - } - - ContractStruct contractStruct; - - struct FixedBytesStruct { - uint8 uint1; - bytes10 bytesTen; - bytes20 bytesTwenty; - } - - FixedBytesStruct fixedBytesStruct; - - enum Choices { Choice0, Choice1, Choice2, Choice3 } - - struct EnumStruct { - uint32 uint1; - Choices choice1; - Choices choice2; - } - - EnumStruct enumStruct; - - // Set variable singleSlotStruct. - function setSingleSlotStruct(int16 int1Value, uint8 uint1Value) external { - singleSlotStruct.int1 = int1Value; - singleSlotStruct.uint1 = uint1Value; - } - - // Set variable multipleSlotStruct. - function setMultipleSlotStruct(uint128 uint1Value, bool bool1Value, int192 int1Value) external { - multipleSlotStruct.uint1 = uint1Value; - multipleSlotStruct.bool1 = bool1Value; - multipleSlotStruct.int1 = int1Value; - } - - // Set variable addressStruct. - function setAddressStruct(AddressStruct calldata value) external { - addressStruct = value; - } - - // Set variable contractStruct. - function setContractStruct(uint16 uint1Value, TestContractTypes contractValue) external { - contractStruct.uint1 = uint1Value; - contractStruct.testContract = contractValue; - } - - // Set variable fixedBytesStruct. - function setFixedBytesStruct(uint8 uint1Value, bytes10 bytesTenValue, bytes20 bytesTwentyValue) external { - fixedBytesStruct.uint1 = uint1Value; - fixedBytesStruct.bytesTen = bytesTenValue; - fixedBytesStruct.bytesTwenty = bytesTwentyValue; - } - - // Set variable enumStruct. - function setEnumStruct(uint32 uint1Value, Choices choice1Value, Choices choice2Value) external { - enumStruct.uint1 = uint1Value; - enumStruct.choice1 = choice1Value; - enumStruct.choice2 = choice2Value; - } -} diff --git a/packages/solidity-mapper/test/utils.ts b/packages/solidity-mapper/test/utils.ts deleted file mode 100644 index 287ef11d..00000000 --- a/packages/solidity-mapper/test/utils.ts +++ /dev/null @@ -1,174 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -/* eslint-disable no-unused-expressions */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { ContractInterface } from '@ethersproject/contracts'; -import '@nomiclabs/hardhat-ethers'; -import { artifacts, ethers } from 'hardhat'; -import { CompilerOutput, CompilerOutputBytecode } from 'hardhat/types'; -import { expect } from 'chai'; -import isArray from 'lodash/isArray'; - -import { StorageLayout, GetStorageAt } from '../src'; - -// storageLayout doesnt exist in type CompilerOutput doesnt. -// Extending CompilerOutput type to include storageLayout property. -interface StorageCompilerOutput extends CompilerOutput { - contracts: { - [sourceName: string]: { - [contractName: string]: { - abi: ContractInterface; - evm: { - bytecode: CompilerOutputBytecode; - deployedBytecode: CompilerOutputBytecode; - methodIdentifiers: { - [methodSignature: string]: string; - }; - }; - storageLayout?: StorageLayout; - } - }; - }; -} - -interface ProofData { - blockHash: string; - account: { - address: string; - storage: { - ipldBlock: string; - cid: string; - } - } -} - -/** - * Get storage layout of specified contract. - * @param contractName - */ -export const getStorageLayout = async (contractName: string): Promise => { - const artifact = await artifacts.readArtifact(contractName); - const buildInfo = await artifacts.getBuildInfo(`${artifact.sourceName}:${artifact.contractName}`); - - if (!buildInfo) { - throw new Error('storageLayout not present in compiler output.'); - } - - const output: StorageCompilerOutput = buildInfo.output; - const { storageLayout } = output.contracts[artifact.sourceName][artifact.contractName]; - - if (!storageLayout) { - throw new Error('Contract hasn\'t been compiled.'); - } - - return storageLayout; -}; - -/** - * Get storage value in hardhat environment using ethers. - * @param address - * @param position - */ -export const getStorageAt: GetStorageAt = async ({ blockHash, contract, slot }) => { - // TODO: Fix use of blockHash as hex string in getStorageAt. - // Using blockHash in getStorageAt throws error. - // https://github.com/ethers-io/ethers.js/pull/1550#issuecomment-841746994 - // Using latest tag for temporary fix in test scenario. - blockHash = 'latest'; - const value = await ethers.provider.getStorageAt(contract, slot, blockHash); - - return { - value, - proof: { - // Returning null value as proof, since ethers library getStorageAt method doesnt return proof. - // This function is used in tests to mock the getStorageAt method of ipld-eth-client which returns proof along with value. - data: JSON.stringify(null) - } - }; -}; - -/** - * Generate array of dummy addresses of specified length. - * @param length - */ -export const generateDummyAddresses = (length: number): Array => { - return Array.from({ length }, () => { - return ethers.utils.getAddress(ethers.utils.hexlify(ethers.utils.randomBytes(20))); - }); -}; - -/** - * Get latest blockHash. - */ -export const getBlockHash = async (): Promise => { - const blockNumber = await ethers.provider.getBlockNumber(); - const { hash } = await ethers.provider.getBlock(blockNumber); - return hash; -}; - -/** - * Assert proof data returned from ipld graphql server. - * @param blockHash - * @param address - * @param proofData - */ -export const assertProofData = (blockHash: string, address: string, proofData: ProofData): void => { - const { - blockHash: proofBlockHash, - account: { - address: proofAddress, - storage - } - } = proofData; - - expect(proofBlockHash).to.equal(blockHash); - expect(proofAddress).to.equal(address); - expect(storage.cid).to.not.be.empty; - expect(storage.ipldBlock).to.not.be.empty; -}; - -/** - * Assert array of proof data. - * @param blockHash - * @param address - * @param proofArray - */ -export const assertProofArray = (blockHash: string, address: string, proofArray: Array): void => { - proofArray.forEach(proofData => { - if (isArray(proofData)) { - assertProofArray(blockHash, address, proofData); - return; - } - - if (['blockHash', 'account'].every(key => key in proofData)) { - assertProofData(blockHash, address, proofData); - return; - } - - assertProofStruct(blockHash, address, proofData); - }); -}; - -/** - * Assert array of proof data from structure type. - * @param blockHash - * @param address - * @param proofStruct - */ -export const assertProofStruct = (blockHash: string, address: string, proofStruct: {[key: string]: any}): void => { - Object.values(proofStruct).forEach(proofData => { - if (isArray(proofData)) { - assertProofArray(blockHash, address, proofData); - return; - } - - if (['blockHash', 'account'].every(key => key in proofData)) { - assertProofData(blockHash, address, proofData); - return; - } - - assertProofStruct(blockHash, address, proofData); - }); -}; diff --git a/packages/solidity-mapper/tsconfig.json b/packages/solidity-mapper/tsconfig.json deleted file mode 100644 index f75d2206..00000000 --- a/packages/solidity-mapper/tsconfig.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": [ "ES2020" ], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ - - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - }, - "include": ["src/**/*"], - "exclude": ["src/**/*.test.ts"] -} diff --git a/packages/uni-info-watcher/environments/local.toml b/packages/uni-info-watcher/environments/local.toml index 01ad44c4..dc842709 100644 --- a/packages/uni-info-watcher/environments/local.toml +++ b/packages/uni-info-watcher/environments/local.toml @@ -5,6 +5,19 @@ # Mode demo whitelists all tokens so that entity values get updated. mode = "prod" + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # IPFS API address (can be taken from the output on running the IPFS daemon). + # ipfsApiAddr = "/ip4/127.0.0.1/tcp/5001" + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + [metrics] host = "127.0.0.1" port = 9004 diff --git a/packages/uni-info-watcher/package.json b/packages/uni-info-watcher/package.json index 89c2a0a2..8d11ba32 100644 --- a/packages/uni-info-watcher/package.json +++ b/packages/uni-info-watcher/package.json @@ -6,6 +6,7 @@ "private": true, "dependencies": { "@apollo/client": "^3.3.19", + "@ipld/dag-cbor": "^6.0.12", "@vulcanize/cache": "^0.1.0", "@vulcanize/erc20-watcher": "^0.1.0", "@vulcanize/ipld-eth-client": "^0.1.0", @@ -44,8 +45,10 @@ "generate:schema": "get-graphql-schema https://api.thegraph.com/subgraphs/name/ianlapham/uniswap-v3-alt > docs/analysis/schema/full-schema.graphql", "generate:health-schema": "get-graphql-schema https://api.thegraph.com/index-node/graphql > docs/analysis/schema/health-schema.graphql", "lint:schema": "graphql-schema-linter", + "watch:contract": "DEBUG=vulcanize:* ts-node src/cli/watch-contract.ts", "reset": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/reset.js", - "reset:dev": "DEBUG=vulcanize:* ts-node src/cli/reset.ts" + "reset:dev": "DEBUG=vulcanize:* ts-node src/cli/reset.ts", + "inspect-cid": "DEBUG=vulcanize:* ts-node src/cli/inspect-cid.ts" }, "devDependencies": { "@types/chance": "^1.1.2", diff --git a/packages/uni-info-watcher/src/cli/fill-state.ts b/packages/uni-info-watcher/src/cli/fill-state.ts new file mode 100644 index 00000000..8147ae57 --- /dev/null +++ b/packages/uni-info-watcher/src/cli/fill-state.ts @@ -0,0 +1,127 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; +import { Between } from 'typeorm'; + +import { Indexer } from '../indexer'; +import { Database } from '../database'; +import { FACTORY_ADDRESS } from '../utils/constants'; +import { prepareEntityState } from '../utils/state'; + +const log = debug('vulcanize:fill-state'); + +const ENTITY_NAMES = ['Bundle', 'Burn', 'Factory', 'Mint', 'Pool', 'PoolDayData', 'PoolHourData', 'Position', 'PositionSnapshot', 'Swap', 'Tick', 'TickDayData', 'Token', 'TokenDayData', 'TokenHourData', 'Transaction', 'UniswapDayData']; + +export const fillState = async ( + indexer: Indexer, + db: Database, + argv: { + startBlock: number, + endBlock: number + } +): Promise => { + const { startBlock, endBlock } = argv; + if (startBlock > endBlock) { + log('endBlock should be greater than or equal to startBlock'); + process.exit(1); + } + + // NOTE: Assuming all blocks in the given range are in the pruned region + log(`Filling state for subgraph entities in range: [${startBlock}, ${endBlock}]`); + + // Check that there are no existing diffs in this range + const existingStates = await indexer.getIPLDBlocks({ block: { blockNumber: Between(startBlock, endBlock) } }); + if (existingStates.length > 0) { + log('found existing state(s) in the given range'); + process.exit(1); + } + + // Map: contractAddress -> entity names + // Using Factory contract to store state for all entities. + const contractEntitiesMap: Map = new Map([ + [ + FACTORY_ADDRESS, + ENTITY_NAMES + ] + ]); + + console.time('time:fill-state'); + + // Fill state for blocks in the given range + for (let blockNumber = startBlock; blockNumber <= endBlock; blockNumber++) { + console.time(`time:fill-state-${blockNumber}`); + + // Get the canonical block hash at current height + const blocks = await indexer.getBlocksAtHeight(blockNumber, false); + + if (blocks.length === 0) { + log(`block not found at height ${blockNumber}`); + process.exit(1); + } else if (blocks.length > 1) { + log(`found more than one non-pruned block at height ${blockNumber}`); + process.exit(1); + } + + const blockHash = blocks[0].blockHash; + + // Create initial state for contracts + await indexer.createInit(blockHash, blockNumber); + + // Fill state for each contract in contractEntitiesMap + const contractStatePromises = Array.from(contractEntitiesMap.entries()) + .map(async ([contractAddress, entities]): Promise => { + // Get all the updated entities at this block + const updatedEntitiesListPromises = entities.map(async (entity): Promise => { + return indexer.getEntitiesForBlock(blockHash, entity); + }); + const updatedEntitiesList = await Promise.all(updatedEntitiesListPromises); + + // Populate state with all the updated entities of each entity type + updatedEntitiesList.forEach((updatedEntities, index) => { + const entityName = entities[index]; + + updatedEntities.forEach((updatedEntity) => { + // Prepare diff data for the entity update + const diffData = prepareEntityState(updatedEntity, entityName, db.relationsMap); + + // Update the in-memory subgraph state + indexer.updateEntityState(contractAddress, diffData); + }); + }); + }); + + await Promise.all(contractStatePromises); + + // Persist subgraph state to the DB + await indexer.dumpSubgraphState(blockHash, true); + await indexer.updateIPLDStatusHooksBlock(blockNumber); + + // Create checkpoints + await indexer.processCheckpoint(blockHash); + await indexer.updateIPLDStatusCheckpointBlock(blockNumber); + + // TODO: Push state to IPFS in separate process. + if (indexer.isIPFSConfigured()) { + // Get IPLDBlocks for the given blocHash. + const ipldBlocks = await indexer.getIPLDBlocksByHash(blockHash); + + // Push all the IPLDBlocks to IPFS. + for (const ipldBlock of ipldBlocks) { + const data = indexer.getIPLDData(ipldBlock); + await indexer.pushToIPFS(data); + } + + // Update the IPLD status. + await indexer.updateIPLDStatusIPFSBlock(blockNumber); + } + + console.timeEnd(`time:fill-state-${blockNumber}`); + } + + console.timeEnd('time:fill-state'); + + log(`Filled state for subgraph entities in range: [${startBlock}, ${endBlock}]`); +}; diff --git a/packages/uni-info-watcher/src/cli/inspect-cid.ts b/packages/uni-info-watcher/src/cli/inspect-cid.ts new file mode 100644 index 00000000..e60c75f7 --- /dev/null +++ b/packages/uni-info-watcher/src/cli/inspect-cid.ts @@ -0,0 +1,78 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import assert from 'assert'; +import yargs from 'yargs'; +import 'reflect-metadata'; +import debug from 'debug'; +import util from 'util'; + +import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; +import { Client as UniClient } from '@vulcanize/uni-watcher'; +import { DEFAULT_CONFIG_PATH, Config, getConfig, getResetConfig, JobQueue } from '@vulcanize/util'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:inspect-cid'); + +const main = async (): Promise => { + const argv = await yargs.parserConfiguration({ + 'parse-numbers': false + }).options({ + configFile: { + alias: 'f', + type: 'string', + require: true, + demandOption: true, + describe: 'Configuration file path (toml)', + default: DEFAULT_CONFIG_PATH + }, + cid: { + alias: 'c', + type: 'string', + demandOption: true, + describe: 'CID to be inspected' + } + }).argv; + + const config: Config = await getConfig(argv.configFile); + const { ethClient, ethProvider } = await getResetConfig(config); + + const db = new Database(config.database); + await db.init(); + + const jobQueueConfig = config.jobQueue; + assert(jobQueueConfig, 'Missing job queue config'); + + const { dbConnectionString, maxCompletionLagInSecs } = jobQueueConfig; + assert(dbConnectionString, 'Missing job queue db connection string'); + + const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); + await jobQueue.start(); + + const { + uniWatcher, + tokenWatcher + } = config.upstream; + + const uniClient = new UniClient(uniWatcher); + const erc20Client = new ERC20Client(tokenWatcher); + + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); + await indexer.init(); + + const ipldBlock = await indexer.getIPLDBlockByCid(argv.cid); + assert(ipldBlock, 'IPLDBlock for the provided CID doesn\'t exist.'); + + const ipldData = await indexer.getIPLDData(ipldBlock); + + log(util.inspect(ipldData, false, null)); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/packages/uni-info-watcher/src/cli/reset-cmds/ipld-state.ts b/packages/uni-info-watcher/src/cli/reset-cmds/ipld-state.ts new file mode 100644 index 00000000..78f2a86e --- /dev/null +++ b/packages/uni-info-watcher/src/cli/reset-cmds/ipld-state.ts @@ -0,0 +1,66 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import debug from 'debug'; + +import { getConfig } from '@cerc-io/util'; + +import { Database } from '../../database'; + +const log = debug('vulcanize:reset-ipld-state'); + +export const command = 'ipld-state'; + +export const desc = 'Reset IPLD state in the given range'; + +export const builder = { + blockNumber: { + type: 'number' + } +}; + +export const handler = async (argv: any): Promise => { + const { blockNumber } = argv; + const config = await getConfig(argv.configFile); + + // Initialize database + const db = new Database(config.database); + await db.init(); + + // Create a DB transaction + const dbTx = await db.createTransactionRunner(); + + console.time('time:reset-ipld-state'); + try { + // Delete all IPLDBlock entries in the given range + await db.removeStateAfterBlock(dbTx, blockNumber); + + // Reset the IPLD status. + const ipldStatus = await db.getIPLDStatus(); + + if (ipldStatus) { + if (ipldStatus.latestHooksBlockNumber > blockNumber) { + await db.updateIPLDStatusHooksBlock(dbTx, blockNumber, true); + } + + if (ipldStatus.latestCheckpointBlockNumber > blockNumber) { + await db.updateIPLDStatusCheckpointBlock(dbTx, blockNumber, true); + } + + if (ipldStatus.latestIPFSBlockNumber > blockNumber) { + await db.updateIPLDStatusIPFSBlock(dbTx, blockNumber, true); + } + } + + dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + console.timeEnd('time:reset-ipld-state'); + + log(`Reset ipld-state successfully to block ${blockNumber}`); +}; diff --git a/packages/uni-info-watcher/src/cli/reset-cmds/state.ts b/packages/uni-info-watcher/src/cli/reset-cmds/state.ts index 335225a3..73aa8d02 100644 --- a/packages/uni-info-watcher/src/cli/reset-cmds/state.ts +++ b/packages/uni-info-watcher/src/cli/reset-cmds/state.ts @@ -70,7 +70,7 @@ export const handler = async (argv: any): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, uniClient, erc20Client, ethClient, ethProvider, jobQueue, serverConfig.mode); + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); const syncStatus = await indexer.getSyncStatus(); assert(syncStatus, 'Missing syncStatus'); @@ -103,11 +103,11 @@ export const handler = async (argv: any): Promise => { Transaction, UniswapDayData ].map(async entityClass => { - return db.removeEntities(dbTx, entityClass, { blockNumber: MoreThan(argv.blockNumber) }); + return db.deleteEntitiesByConditions(dbTx, entityClass, { blockNumber: MoreThan(argv.blockNumber) }); }); await Promise.all(removeEntitiesPromise); - await db.removeEntities(dbTx, Contract, { startingBlock: MoreThan(argv.blockNumber) }); + await db.deleteEntitiesByConditions(dbTx, Contract, { startingBlock: MoreThan(argv.blockNumber) }); if (syncStatus.latestIndexedBlockNumber > blockProgress.blockNumber) { await indexer.updateSyncStatusIndexedBlock(blockProgress.blockHash, blockProgress.blockNumber, true); diff --git a/packages/uni-info-watcher/src/cli/watch-contract.ts b/packages/uni-info-watcher/src/cli/watch-contract.ts new file mode 100644 index 00000000..ea393b11 --- /dev/null +++ b/packages/uni-info-watcher/src/cli/watch-contract.ts @@ -0,0 +1,86 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import assert from 'assert'; +import yargs from 'yargs'; +import 'reflect-metadata'; + +import { Config, DEFAULT_CONFIG_PATH, getConfig, getResetConfig, JobQueue } from '@vulcanize/util'; +import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; +import { Client as UniClient } from '@vulcanize/uni-watcher'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; + +(async () => { + const argv = await yargs.parserConfiguration({ + 'parse-numbers': false + }).options({ + configFile: { + alias: 'f', + type: 'string', + require: true, + demandOption: true, + describe: 'configuration file path (toml)', + default: DEFAULT_CONFIG_PATH + }, + address: { + type: 'string', + require: true, + demandOption: true, + describe: 'Address of the deployed contract' + }, + kind: { + type: 'string', + require: true, + demandOption: true, + describe: 'Kind of contract (factory|pool|nfpm)' + }, + checkpoint: { + type: 'boolean', + require: true, + demandOption: true, + describe: 'Turn checkpointing on' + }, + startingBlock: { + type: 'number', + default: 1, + describe: 'Starting block' + } + }).argv; + + const config: Config = await getConfig(argv.configFile); + const { database: dbConfig, jobQueue: jobQueueConfig } = config; + const { ethClient, ethProvider } = await getResetConfig(config); + + assert(dbConfig); + + const db = new Database(dbConfig); + await db.init(); + + assert(jobQueueConfig, 'Missing job queue config'); + + const { dbConnectionString, maxCompletionLagInSecs } = jobQueueConfig; + assert(dbConnectionString, 'Missing job queue db connection string'); + + const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); + await jobQueue.start(); + + const { + uniWatcher, + tokenWatcher + } = config.upstream; + + const uniClient = new UniClient(uniWatcher); + const erc20Client = new ERC20Client(tokenWatcher); + + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); + await indexer.init(); + + await indexer.watchContract(argv.address, argv.kind, argv.checkpoint, argv.startingBlock); + + await db.close(); + await jobQueue.stop(); + process.exit(); +})(); diff --git a/packages/uni-info-watcher/src/client.ts b/packages/uni-info-watcher/src/client.ts index cd52b765..66d920b3 100644 --- a/packages/uni-info-watcher/src/client.ts +++ b/packages/uni-info-watcher/src/client.ts @@ -4,7 +4,7 @@ import { gql } from '@apollo/client/core'; import { GraphQLClient, GraphQLConfig } from '@vulcanize/ipld-eth-client'; -import { BlockHeight, OrderDirection } from '@vulcanize/util'; +import { BlockHeight, OrderDirection } from '@cerc-io/util'; import { queryBundles, diff --git a/packages/uni-info-watcher/src/database.ts b/packages/uni-info-watcher/src/database.ts index 03fc6894..caecbe53 100644 --- a/packages/uni-info-watcher/src/database.ts +++ b/packages/uni-info-watcher/src/database.ts @@ -4,25 +4,34 @@ import assert from 'assert'; import { + Brackets, Connection, ConnectionOptions, DeepPartial, FindConditions, FindManyOptions, LessThanOrEqual, - QueryRunner + QueryRunner, + Repository, + SelectQueryBuilder } from 'typeorm'; +import { RawSqlResultsToEntityTransformer } from 'typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer'; import path from 'path'; import { SelectionNode } from 'graphql'; +import debug from 'debug'; +import _ from 'lodash'; import { + eventProcessingLoadEntityCacheHitCount, + eventProcessingLoadEntityCount, + eventProcessingLoadEntityDBQueryDuration, + StateKind, Database as BaseDatabase, DatabaseInterface, BlockHeight, QueryOptions, - Where, - ENTITY_QUERY_TYPE -} from '@vulcanize/util'; + Where +} from '@cerc-io/util'; import { Factory } from './entity/Factory'; import { Pool } from './entity/Pool'; @@ -46,6 +55,31 @@ import { Block } from './events'; import { SyncStatus } from './entity/SyncStatus'; import { TickDayData } from './entity/TickDayData'; import { Contract } from './entity/Contract'; +import { IPLDBlock } from './entity/IPLDBlock'; +import { IpldStatus } from './entity/IpldStatus'; + +const log = debug('vulcanize:database'); + +export const DEFAULT_LIMIT = 100; + +export enum ENTITY_QUERY_TYPE { + SINGULAR, + DISTINCT_ON, + GROUP_BY +} + +// Cache for updated entities used in job-runner event processing. +export interface CachedEntities { + frothyBlocks: Map< + string, + { + blockNumber: number; + parentHash: string; + entities: Map>; + } + >; + latestPrunedEntities: Map>; +} // Map: Entity to suitable query type. const ENTITY_QUERY_TYPE_MAP = new Map any, number>([ @@ -74,6 +108,11 @@ export class Database implements DatabaseInterface { _baseDatabase: BaseDatabase _relationsMap: Map + _cachedEntities: CachedEntities = { + frothyBlocks: new Map(), + latestPrunedEntities: new Map() + } + constructor (config: ConnectionOptions) { assert(config); @@ -87,8 +126,12 @@ export class Database implements DatabaseInterface { this._populateRelationsMap(); } + get relationsMap () { + return this._relationsMap; + } + get cachedEntities () { - return this._baseDatabase.cachedEntities; + return this._cachedEntities; } async init (): Promise { @@ -99,6 +142,77 @@ export class Database implements DatabaseInterface { return this._baseDatabase.close(); } + getNewIPLDBlock (): IPLDBlock { + return new IPLDBlock(); + } + + async getIPLDBlocks (where: FindConditions): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getIPLDBlocks(repo, where); + } + + async getLatestIPLDBlock (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getLatestIPLDBlock(repo, contractAddress, kind, blockNumber); + } + + async getPrevIPLDBlock (blockHash: string, contractAddress: string, kind?: string): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getPrevIPLDBlock(repo, blockHash, contractAddress, kind); + } + + // Fetch all diff IPLDBlocks after the specified block number. + async getDiffIPLDBlocksInRange (contractAddress: string, startblock: number, endBlock: number): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getDiffIPLDBlocksInRange(repo, contractAddress, startblock, endBlock); + } + + async saveOrUpdateIPLDBlock (dbTx: QueryRunner, ipldBlock: IPLDBlock): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + return this._baseDatabase.saveOrUpdateIPLDBlock(repo, ipldBlock); + } + + async removeIPLDBlocks (dbTx: QueryRunner, blockNumber: number, kind: string): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + await this._baseDatabase.removeIPLDBlocks(repo, blockNumber, kind); + } + + async removeStateAfterBlock (dbTx: QueryRunner, blockNumber: number): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + await this._baseDatabase.removeIPLDBlocksAfterBlock(repo, blockNumber); + } + + async getIPLDStatus (): Promise { + const repo = this._conn.getRepository(IpldStatus); + + return this._baseDatabase.getIPLDStatus(repo); + } + + async updateIPLDStatusHooksBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(IpldStatus); + + return this._baseDatabase.updateIPLDStatusHooksBlock(repo, blockNumber, force); + } + + async updateIPLDStatusCheckpointBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(IpldStatus); + + return this._baseDatabase.updateIPLDStatusCheckpointBlock(repo, blockNumber, force); + } + + async updateIPLDStatusIPFSBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(IpldStatus); + + return this._baseDatabase.updateIPLDStatusIPFSBlock(repo, blockNumber, force); + } + async getFactory (queryRunner: QueryRunner, { id, blockHash }: DeepPartial): Promise { const repo = queryRunner.manager.getRepository(Factory); const whereOptions: FindConditions = { id }; @@ -107,7 +221,7 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - return this._baseDatabase.getModelEntity(repo, whereOptions); + return this.getModelEntity(repo, whereOptions); } async getBundle (queryRunner: QueryRunner, { id, blockHash, blockNumber }: DeepPartial): Promise { @@ -122,7 +236,7 @@ export class Database implements DatabaseInterface { whereOptions.blockNumber = LessThanOrEqual(blockNumber); } - return this._baseDatabase.getModelEntity(repo, whereOptions); + return this.getModelEntity(repo, whereOptions); } async getToken ( @@ -142,14 +256,13 @@ export class Database implements DatabaseInterface { whereOptions.blockNumber = LessThanOrEqual(blockNumber); } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash, number: blockNumber }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, Token, [entity], selections @@ -190,14 +303,13 @@ export class Database implements DatabaseInterface { whereOptions.blockNumber = LessThanOrEqual(blockNumber); } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash, number: blockNumber }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, Pool, [entity], selections @@ -234,14 +346,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, Position, [entity] ); @@ -261,14 +372,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, Tick, [entity] ); @@ -299,14 +409,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, PoolDayData, [entity] ); @@ -323,14 +432,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, PoolHourData, [entity] ); @@ -347,7 +455,7 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - const entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + const entity = await this.getModelEntity(repo, whereOptions); return entity; } @@ -360,14 +468,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, TokenDayData, [entity] ); @@ -384,14 +491,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, TokenHourData, [entity] ); @@ -408,14 +514,13 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - let entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + let entity = await this.getModelEntity(repo, whereOptions); if (loadRelations && entity) { - [entity] = await this._baseDatabase.loadRelations( + [entity] = await this.loadRelations( queryRunner, { hash: blockHash }, this._relationsMap, - ENTITY_QUERY_TYPE_MAP, TickDayData, [entity] ); @@ -432,16 +537,69 @@ export class Database implements DatabaseInterface { whereOptions.blockHash = blockHash; } - const entity = await this._baseDatabase.getModelEntity(repo, whereOptions); + const entity = await this.getModelEntity(repo, whereOptions); return entity; } - async getModelEntities (queryRunner: QueryRunner, entity: new () => Entity, block: BlockHeight, where: Where = {}, queryOptions: QueryOptions = {}, selections: ReadonlyArray = []): Promise { - return this._baseDatabase.getModelEntities(queryRunner, this._relationsMap, ENTITY_QUERY_TYPE_MAP, entity, block, where, queryOptions, selections); + async getEntitiesForBlock (blockHash: string, tableName: string): Promise { + const repo = this._conn.getRepository(tableName); + + const entities = await repo.find({ + where: { + blockHash + } + }); + + return entities; } - async getModelEntitiesNoTx (entity: new () => Entity, block: BlockHeight, where: Where = {}, queryOptions: QueryOptions = {}, selections: ReadonlyArray = []): Promise { + async getModelEntities ( + queryRunner: QueryRunner, + entity: new () => Entity, + block: BlockHeight, + where: Where = {}, + queryOptions: QueryOptions = {}, + selections: ReadonlyArray = [] + ): Promise { + let entities: Entity[]; + + // Use different suitable query patterns based on entities. + switch (ENTITY_QUERY_TYPE_MAP.get(entity)) { + case ENTITY_QUERY_TYPE.SINGULAR: + entities = await this.getModelEntitiesSingular(queryRunner, entity, block, where); + break; + + case ENTITY_QUERY_TYPE.DISTINCT_ON: + entities = await this.getModelEntitiesDistinctOn(queryRunner, entity, block, where, queryOptions); + break; + + case ENTITY_QUERY_TYPE.GROUP_BY: + entities = await this.getModelEntitiesGroupBy(queryRunner, entity, block, where, queryOptions); + break; + + default: + log(`Invalid entity query type for entity ${entity}`); + entities = []; + break; + } + + if (!entities.length) { + return []; + } + + entities = await this.loadRelations(queryRunner, block, this._relationsMap, entity, entities, selections); + + return entities; + } + + async getModelEntitiesNoTx ( + entity: new () => Entity, + block: BlockHeight, + where: Where = {}, + queryOptions: QueryOptions = {}, + selections: ReadonlyArray = [] + ): Promise { const queryRunner = this._conn.createQueryRunner(); let res; @@ -455,12 +613,407 @@ export class Database implements DatabaseInterface { return res; } + async getModelEntitiesGroupBy ( + queryRunner: QueryRunner, + entity: new () => Entity, + block: BlockHeight, + where: Where = {}, + queryOptions: QueryOptions = {} + ): Promise { + const repo = queryRunner.manager.getRepository(entity); + const { tableName } = repo.metadata; + + let subQuery = repo.createQueryBuilder('subTable') + .select('subTable.id', 'id') + .addSelect('MAX(subTable.block_number)', 'block_number') + .addFrom('block_progress', 'blockProgress') + .where('subTable.block_hash = blockProgress.block_hash') + .andWhere('blockProgress.is_pruned = :isPruned', { isPruned: false }) + .groupBy('subTable.id'); + + if (block.hash) { + const { canonicalBlockNumber, blockHashes } = await this._baseDatabase.getFrothyRegion(queryRunner, block.hash); + + subQuery = subQuery + .andWhere(new Brackets(qb => { + qb.where('subTable.block_hash IN (:...blockHashes)', { blockHashes }) + .orWhere('subTable.block_number <= :canonicalBlockNumber', { canonicalBlockNumber }); + })); + } + + if (block.number) { + subQuery = subQuery.andWhere('subTable.block_number <= :blockNumber', { blockNumber: block.number }); + } + + let selectQueryBuilder = repo.createQueryBuilder(tableName) + .innerJoin( + `(${subQuery.getQuery()})`, + 'latestEntities', + `${tableName}.id = "latestEntities"."id" AND ${tableName}.block_number = "latestEntities"."block_number"` + ) + .setParameters(subQuery.getParameters()); + + selectQueryBuilder = this._baseDatabase.buildQuery(repo, selectQueryBuilder, where); + + if (queryOptions.orderBy) { + selectQueryBuilder = this._baseDatabase.orderQuery(repo, selectQueryBuilder, queryOptions); + } + + selectQueryBuilder = this._baseDatabase.orderQuery(repo, selectQueryBuilder, { ...queryOptions, orderBy: 'id' }); + + if (queryOptions.skip) { + selectQueryBuilder = selectQueryBuilder.offset(queryOptions.skip); + } + + if (queryOptions.limit) { + selectQueryBuilder = selectQueryBuilder.limit(queryOptions.limit); + } + + const entities = await selectQueryBuilder.getMany(); + + return entities; + } + + async getModelEntitiesDistinctOn ( + queryRunner: QueryRunner, + entity: new () => Entity, + block: BlockHeight, + where: Where = {}, + queryOptions: QueryOptions = {} + ): Promise { + const repo = queryRunner.manager.getRepository(entity); + + let subQuery = repo.createQueryBuilder('subTable') + .distinctOn(['subTable.id']) + .addFrom('block_progress', 'blockProgress') + .where('subTable.block_hash = blockProgress.block_hash') + .andWhere('blockProgress.is_pruned = :isPruned', { isPruned: false }) + .addOrderBy('subTable.id', 'ASC') + .addOrderBy('subTable.block_number', 'DESC'); + + if (block.hash) { + const { canonicalBlockNumber, blockHashes } = await this._baseDatabase.getFrothyRegion(queryRunner, block.hash); + + subQuery = subQuery + .andWhere(new Brackets(qb => { + qb.where('subTable.block_hash IN (:...blockHashes)', { blockHashes }) + .orWhere('subTable.block_number <= :canonicalBlockNumber', { canonicalBlockNumber }); + })); + } + + if (block.number) { + subQuery = subQuery.andWhere('subTable.block_number <= :blockNumber', { blockNumber: block.number }); + } + + subQuery = this._baseDatabase.buildQuery(repo, subQuery, where); + + let selectQueryBuilder = queryRunner.manager.createQueryBuilder() + .from( + `(${subQuery.getQuery()})`, + 'latestEntities' + ) + .setParameters(subQuery.getParameters()); + + if (queryOptions.orderBy) { + selectQueryBuilder = this._baseDatabase.orderQuery(repo, selectQueryBuilder, queryOptions, 'subTable_'); + if (queryOptions.orderBy !== 'id') { + selectQueryBuilder = this._baseDatabase.orderQuery(repo, selectQueryBuilder, { ...queryOptions, orderBy: 'id' }, 'subTable_'); + } + } + + if (queryOptions.skip) { + selectQueryBuilder = selectQueryBuilder.offset(queryOptions.skip); + } + + if (queryOptions.limit) { + selectQueryBuilder = selectQueryBuilder.limit(queryOptions.limit); + } + + let entities = await selectQueryBuilder.getRawMany(); + entities = await this._transformResults(queryRunner, repo.createQueryBuilder('subTable'), entities); + + return entities as Entity[]; + } + + async getModelEntitiesSingular ( + queryRunner: QueryRunner, + entity: new () => Entity, + block: BlockHeight, + where: Where = {} + ): Promise { + const repo = queryRunner.manager.getRepository(entity); + const { tableName } = repo.metadata; + + let selectQueryBuilder = repo.createQueryBuilder(tableName) + .addFrom('block_progress', 'blockProgress') + .where(`${tableName}.block_hash = blockProgress.block_hash`) + .andWhere('blockProgress.is_pruned = :isPruned', { isPruned: false }) + .addOrderBy(`${tableName}.block_number`, 'DESC') + .limit(1); + + if (block.hash) { + const { canonicalBlockNumber, blockHashes } = await this._baseDatabase.getFrothyRegion(queryRunner, block.hash); + + selectQueryBuilder = selectQueryBuilder + .andWhere(new Brackets(qb => { + qb.where(`${tableName}.block_hash IN (:...blockHashes)`, { blockHashes }) + .orWhere(`${tableName}.block_number <= :canonicalBlockNumber`, { canonicalBlockNumber }); + })); + } + + if (block.number) { + selectQueryBuilder = selectQueryBuilder.andWhere(`${tableName}.block_number <= :blockNumber`, { blockNumber: block.number }); + } + + selectQueryBuilder = this._baseDatabase.buildQuery(repo, selectQueryBuilder, where); + + const entities = await selectQueryBuilder.getMany(); + + return entities as Entity[]; + } + + async getModelEntity (repo: Repository, whereOptions: any): Promise { + eventProcessingLoadEntityCount.inc(); + + const findOptions = { + where: whereOptions, + order: { + blockNumber: 'DESC' + } + }; + + if (findOptions.where.blockHash) { + // Check cache only if latestPrunedEntities is updated. + // latestPrunedEntities is updated when frothyBlocks is filled till canonical block height. + if (this._cachedEntities.latestPrunedEntities.size > 0) { + let frothyBlock = this._cachedEntities.frothyBlocks.get(findOptions.where.blockHash); + let canonicalBlockNumber = -1; + + // Loop through frothy region until latest entity is found. + while (frothyBlock) { + const entity = frothyBlock.entities + .get(repo.metadata.tableName) + ?.get(findOptions.where.id); + + if (entity) { + eventProcessingLoadEntityCacheHitCount.inc(); + return _.cloneDeep(entity) as Entity; + } + + canonicalBlockNumber = frothyBlock.blockNumber + 1; + frothyBlock = this._cachedEntities.frothyBlocks.get(frothyBlock.parentHash); + } + + // Canonical block number is not assigned if blockHash does not exist in frothy region. + // Get latest pruned entity from cache only if blockHash exists in frothy region. + // i.e. Latest entity in cache is the version before frothy region. + if (canonicalBlockNumber > -1) { + // If entity not found in frothy region get latest entity in the pruned region. + // Check if latest entity is cached in pruned region. + const entity = this._cachedEntities.latestPrunedEntities + .get(repo.metadata.tableName) + ?.get(findOptions.where.id); + + if (entity) { + eventProcessingLoadEntityCacheHitCount.inc(); + return _.cloneDeep(entity) as Entity; + } + + // Get latest pruned entity from DB if not found in cache. + const endTimer = eventProcessingLoadEntityDBQueryDuration.startTimer(); + const dbEntity = await this._baseDatabase.getLatestPrunedEntity(repo, findOptions.where.id, canonicalBlockNumber); + endTimer(); + + if (dbEntity) { + // Update latest pruned entity in cache. + this.cacheUpdatedEntity(repo, dbEntity, true); + } + + return dbEntity; + } + } + + const endTimer = eventProcessingLoadEntityDBQueryDuration.startTimer(); + const dbEntity = await this._baseDatabase.getPrevEntityVersion(repo.queryRunner!, repo, findOptions); + endTimer(); + + return dbEntity; + } + + return repo.findOne(findOptions); + } + + async loadRelations ( + queryRunner: QueryRunner, + block: BlockHeight, + relationsMap: Map, + entity: new () => Entity, + entities: Entity[], + selections: ReadonlyArray = [] + ): Promise { + const relations = relationsMap.get(entity); + + if (!relations) { + return entities; + } + + // Filter selections from GQL query which are relations. + const relationPromises = selections.filter((selection) => selection.kind === 'Field' && Boolean(relations[selection.name.value])) + .map(async (selection) => { + assert(selection.kind === 'Field'); + const field = selection.name.value; + const { entity: relationEntity, type, foreignKey } = relations[field]; + let childSelections = selection.selectionSet?.selections || []; + + // Filter out __typename field in GQL for loading relations. + childSelections = childSelections.filter(selection => !(selection.kind === 'Field' && selection.name.value === '__typename')); + + switch (type) { + case 'one-to-many': { + assert(foreignKey); + + const where: Where = { + [foreignKey]: [{ + value: entities.map((entity: any) => entity.id), + not: false, + operator: 'in' + }] + }; + + const relatedEntities = await this.getModelEntities( + queryRunner, + relationEntity, + block, + where, + {}, + childSelections + ); + + const relatedEntitiesMap = relatedEntities.reduce((acc: {[key:string]: any[]}, entity: any) => { + // Related entity might be loaded with data. + const parentEntityId = entity[foreignKey].id ?? entity[foreignKey]; + + if (!acc[parentEntityId]) { + acc[parentEntityId] = []; + } + + if (acc[parentEntityId].length < DEFAULT_LIMIT) { + acc[parentEntityId].push(entity); + } + + return acc; + }, {}); + + entities.forEach((entity: any) => { + if (relatedEntitiesMap[entity.id]) { + entity[field] = relatedEntitiesMap[entity.id]; + } else { + entity[field] = []; + } + }); + + break; + } + + case 'many-to-many': { + const relatedIds = entities.reduce((acc, entity: any) => { + entity[field].forEach((relatedEntityId: any) => acc.add(relatedEntityId)); + + return acc; + }, new Set()); + + const where: Where = { + id: [{ + value: Array.from(relatedIds), + not: false, + operator: 'in' + }] + }; + + const relatedEntities = await this.getModelEntities( + queryRunner, + relationEntity, + block, + where, + {}, + childSelections + ); + + entities.forEach((entity: any) => { + const relatedEntityIds: Set = entity[field].reduce((acc: Set, id: string) => { + acc.add(id); + + return acc; + }, new Set()); + + entity[field] = []; + + relatedEntities.forEach((relatedEntity: any) => { + if (relatedEntityIds.has(relatedEntity.id) && entity[field].length < DEFAULT_LIMIT) { + entity[field].push(relatedEntity); + } + }); + }); + + break; + } + + default: { + // For one-to-one/many-to-one relations. + if (childSelections.length === 1 && childSelections[0].kind === 'Field' && childSelections[0].name.value === 'id') { + // Avoid loading relation if selections only has id field. + entities.forEach((entity: any) => { + entity[field] = { id: entity[field] }; + }); + + break; + } + + const where: Where = { + id: [{ + value: entities.map((entity: any) => entity[field]), + not: false, + operator: 'in' + }] + }; + + const relatedEntities = await this.getModelEntities( + queryRunner, + relationEntity, + block, + where, + {}, + childSelections + ); + + const relatedEntitiesMap = relatedEntities.reduce((acc: {[key:string]: any}, entity: any) => { + acc[entity.id] = entity; + + return acc; + }, {}); + + entities.forEach((entity: any) => { + if (relatedEntitiesMap[entity[field]]) { + entity[field] = relatedEntitiesMap[entity[field]]; + } + }); + + break; + } + } + }); + + await Promise.all(relationPromises); + + return entities; + } + async saveFactory (queryRunner: QueryRunner, factory: Factory, block: Block): Promise { const repo = queryRunner.manager.getRepository(Factory); factory.blockNumber = block.number; factory.blockHash = block.hash; const data = await repo.save(factory); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -470,7 +1023,7 @@ export class Database implements DatabaseInterface { bundle.blockNumber = block.number; bundle.blockHash = block.hash; const data = await repo.save(bundle); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -480,7 +1033,7 @@ export class Database implements DatabaseInterface { pool.blockNumber = block.number; pool.blockHash = block.hash; const data = await repo.save(pool); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -490,7 +1043,7 @@ export class Database implements DatabaseInterface { poolDayData.blockNumber = block.number; poolDayData.blockHash = block.hash; const data = await repo.save(poolDayData); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -500,7 +1053,7 @@ export class Database implements DatabaseInterface { poolHourData.blockNumber = block.number; poolHourData.blockHash = block.hash; const data = await repo.save(poolHourData); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -510,7 +1063,7 @@ export class Database implements DatabaseInterface { token.blockNumber = block.number; token.blockHash = block.hash; const data = await repo.save(token); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -520,7 +1073,7 @@ export class Database implements DatabaseInterface { transaction.blockNumber = block.number; transaction.blockHash = block.hash; const data = await repo.save(transaction); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -530,7 +1083,7 @@ export class Database implements DatabaseInterface { uniswapDayData.blockNumber = block.number; uniswapDayData.blockHash = block.hash; const data = await repo.save(uniswapDayData); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -540,7 +1093,7 @@ export class Database implements DatabaseInterface { tokenDayData.blockNumber = block.number; tokenDayData.blockHash = block.hash; const data = await repo.save(tokenDayData); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -550,7 +1103,7 @@ export class Database implements DatabaseInterface { tokenHourData.blockNumber = block.number; tokenHourData.blockHash = block.hash; const data = await repo.save(tokenHourData); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -560,7 +1113,7 @@ export class Database implements DatabaseInterface { tick.blockNumber = block.number; tick.blockHash = block.hash; const data = await repo.save(tick); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -570,7 +1123,7 @@ export class Database implements DatabaseInterface { tickDayData.blockNumber = block.number; tickDayData.blockHash = block.hash; const data = await repo.save(tickDayData); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -580,7 +1133,7 @@ export class Database implements DatabaseInterface { position.blockNumber = block.number; position.blockHash = block.hash; const data = await repo.save(position); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -590,7 +1143,7 @@ export class Database implements DatabaseInterface { positionSnapshot.blockNumber = block.number; positionSnapshot.blockHash = block.hash; const data = await repo.save(positionSnapshot); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -600,7 +1153,7 @@ export class Database implements DatabaseInterface { mint.blockNumber = block.number; mint.blockHash = block.hash; const data = await repo.save(mint); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -610,7 +1163,7 @@ export class Database implements DatabaseInterface { burn.blockNumber = block.number; burn.blockHash = block.hash; const data = await repo.save(burn); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -620,7 +1173,7 @@ export class Database implements DatabaseInterface { swap.blockNumber = block.number; swap.blockHash = block.hash; const data = await repo.save(swap); - this._baseDatabase.cacheUpdatedEntity(repo, data); + this.cacheUpdatedEntity(repo, data); return data; } @@ -631,10 +1184,10 @@ export class Database implements DatabaseInterface { return this._baseDatabase.getContracts(repo); } - async saveContract (queryRunner: QueryRunner, address: string, kind: string, startingBlock: number): Promise { + async saveContract (queryRunner: QueryRunner, address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { const repo = queryRunner.manager.getRepository(Contract); - return this._baseDatabase.saveContract(repo, address, startingBlock, kind); + return this._baseDatabase.saveContract(repo, address, kind, checkpoint, startingBlock); } async createTransactionRunner (): Promise { @@ -664,6 +1217,13 @@ export class Database implements DatabaseInterface { return this._baseDatabase.getBlockEvents(repo, blockHash, where, queryOptions); } + async saveBlockWithEvents (queryRunner: QueryRunner, block: DeepPartial, events: DeepPartial[]): Promise { + const blockRepo = queryRunner.manager.getRepository(BlockProgress); + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveBlockWithEvents(blockRepo, eventRepo, block, events); + } + async saveEvents (queryRunner: QueryRunner, events: Event[]): Promise { const eventRepo = queryRunner.manager.getRepository(Event); @@ -743,6 +1303,10 @@ export class Database implements DatabaseInterface { return this._baseDatabase.removeEntities(queryRunner, entity, findConditions); } + async deleteEntitiesByConditions (queryRunner: QueryRunner, entity: new () => Entity, findConditions: FindConditions): Promise { + await this._baseDatabase.deleteEntitiesByConditions(queryRunner, entity, findConditions); + } + async isEntityEmpty (entity: new () => Entity): Promise { return this._baseDatabase.isEntityEmpty(entity); } @@ -751,6 +1315,42 @@ export class Database implements DatabaseInterface { return this._baseDatabase.getAncestorAtDepth(blockHash, depth); } + cacheUpdatedEntity (repo: Repository, entity: any, pruned = false): void { + const tableName = repo.metadata.tableName; + if (pruned) { + let entityIdMap = this._cachedEntities.latestPrunedEntities.get(tableName); + if (!entityIdMap) { + entityIdMap = new Map(); + } + entityIdMap.set(entity.id, _.cloneDeep(entity)); + this._cachedEntities.latestPrunedEntities.set(tableName, entityIdMap); + return; + } + const frothyBlock = this._cachedEntities.frothyBlocks.get(entity.blockHash); + // Update frothyBlock only if already present in cache. + // Might not be present when event processing starts without block processing on job retry. + if (frothyBlock) { + let entityIdMap = frothyBlock.entities.get(tableName); + if (!entityIdMap) { + entityIdMap = new Map(); + } + entityIdMap.set(entity.id, _.cloneDeep(entity)); + frothyBlock.entities.set(tableName, entityIdMap); + } + } + + async _transformResults (queryRunner: QueryRunner, qb: SelectQueryBuilder, rawResults: any[]): Promise { + const transformer = new RawSqlResultsToEntityTransformer( + qb.expressionMap, + queryRunner.manager.connection.driver, + [], + [], + queryRunner + ); + assert(qb.expressionMap.mainAlias); + return transformer.transform(rawResults, qb.expressionMap.mainAlias); + } + _populateRelationsMap (): void { // Needs to be generated by codegen. this._relationsMap.set(Pool, { @@ -783,6 +1383,14 @@ export class Database implements DatabaseInterface { transaction: { entity: Transaction, type: 'one-to-one' + }, + token0: { + entity: Token, + type: 'one-to-one' + }, + token1: { + entity: Token, + type: 'one-to-one' } }); @@ -794,6 +1402,14 @@ export class Database implements DatabaseInterface { transaction: { entity: Transaction, type: 'one-to-one' + }, + token0: { + entity: Token, + type: 'one-to-one' + }, + token1: { + entity: Token, + type: 'one-to-one' } }); @@ -848,5 +1464,26 @@ export class Database implements DatabaseInterface { type: 'one-to-one' } }); + + this._relationsMap.set(PoolDayData, { + pool: { + entity: Pool, + type: 'one-to-one' + } + }); + + this._relationsMap.set(TokenDayData, { + token: { + entity: Token, + type: 'one-to-one' + } + }); + + this._relationsMap.set(TokenHourData, { + token: { + entity: Token, + type: 'one-to-one' + } + }); } } diff --git a/packages/uni-info-watcher/src/entity/BlockProgress.ts b/packages/uni-info-watcher/src/entity/BlockProgress.ts index ee13c6a1..b68824ac 100644 --- a/packages/uni-info-watcher/src/entity/BlockProgress.ts +++ b/packages/uni-info-watcher/src/entity/BlockProgress.ts @@ -15,6 +15,9 @@ export class BlockProgress implements BlockProgressInterface { @PrimaryGeneratedColumn() id!: number; + @Column('varchar') + cid!: string; + @Column('varchar', { length: 66 }) blockHash!: string; diff --git a/packages/uni-info-watcher/src/entity/Contract.ts b/packages/uni-info-watcher/src/entity/Contract.ts index 66a521e6..6c81c8e1 100644 --- a/packages/uni-info-watcher/src/entity/Contract.ts +++ b/packages/uni-info-watcher/src/entity/Contract.ts @@ -20,6 +20,9 @@ export class Contract { @Column('varchar', { length: 8 }) kind!: string; + @Column('boolean', { default: false }) + checkpoint!: boolean; + @Column('integer') startingBlock!: number; } diff --git a/packages/uni-info-watcher/src/entity/IPLDBlock.ts b/packages/uni-info-watcher/src/entity/IPLDBlock.ts new file mode 100644 index 00000000..bff1118c --- /dev/null +++ b/packages/uni-info-watcher/src/entity/IPLDBlock.ts @@ -0,0 +1,36 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; + +import { StateKind } from '@cerc-io/util'; + +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['cid'], { unique: true }) +@Index(['block', 'contractAddress']) +@Index(['block', 'contractAddress', 'kind'], { unique: true }) +export class IPLDBlock { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + cid!: string; + + @Column({ + type: 'enum', + enum: StateKind + }) + kind!: StateKind; + + @Column('bytea') + data!: Buffer; +} diff --git a/packages/uni-info-watcher/src/entity/IpldStatus.ts b/packages/uni-info-watcher/src/entity/IpldStatus.ts new file mode 100644 index 00000000..fb81069e --- /dev/null +++ b/packages/uni-info-watcher/src/entity/IpldStatus.ts @@ -0,0 +1,20 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; + +@Entity() +export class IpldStatus { + @PrimaryGeneratedColumn() + id!: number; + + @Column('integer') + latestHooksBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestCheckpointBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestIPFSBlockNumber!: number; +} diff --git a/packages/uni-info-watcher/src/entity/SyncStatus.ts b/packages/uni-info-watcher/src/entity/SyncStatus.ts index e5a52802..56bd3a2a 100644 --- a/packages/uni-info-watcher/src/entity/SyncStatus.ts +++ b/packages/uni-info-watcher/src/entity/SyncStatus.ts @@ -34,4 +34,10 @@ export class SyncStatus implements SyncStatusInterface { @Column('integer') latestCanonicalBlockNumber!: number; + + @Column('varchar', { length: 66 }) + initialIndexedBlockHash!: string; + + @Column('integer') + initialIndexedBlockNumber!: number; } diff --git a/packages/uni-info-watcher/src/entity/Transaction.ts b/packages/uni-info-watcher/src/entity/Transaction.ts index d4a82c81..db3ca301 100644 --- a/packages/uni-info-watcher/src/entity/Transaction.ts +++ b/packages/uni-info-watcher/src/entity/Transaction.ts @@ -18,9 +18,6 @@ export class Transaction { @Column('integer') blockNumber!: number; - @Column('numeric', { default: 0, transformer: graphDecimalTransformer }) - ethPriceUSD!: GraphDecimal - @Column('numeric', { transformer: bigintTransformer }) timestamp!: bigint; } diff --git a/packages/uni-info-watcher/src/fill.ts b/packages/uni-info-watcher/src/fill.ts index 0bf97b19..a64a688a 100644 --- a/packages/uni-info-watcher/src/fill.ts +++ b/packages/uni-info-watcher/src/fill.ts @@ -9,15 +9,16 @@ import { hideBin } from 'yargs/helpers'; import debug from 'debug'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { getConfig, fillBlocks, JobQueue, DEFAULT_CONFIG_PATH, getCustomProvider } from '@vulcanize/util'; import { Client as UniClient } from '@vulcanize/uni-watcher'; import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import { Database } from './database'; import { PubSub } from 'apollo-server-express'; import { Indexer } from './indexer'; import { EventWatcher } from './events'; +import { fillState } from './cli/fill-state'; const log = debug('vulcanize:server'); @@ -56,6 +57,16 @@ export const main = async (): Promise => { type: 'number', default: 10, describe: 'Number of blocks prefetched in batch' + }, + state: { + type: 'boolean', + default: false, + describe: 'Fill state for subgraph entities' + }, + blockCid: { + type: 'boolean', + default: false, + describe: 'Only fetch and update block CIDs' } }).argv; @@ -95,7 +106,13 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, uniClient, erc20Client, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); + await indexer.init(); + + if (argv.state) { + await fillState(indexer, db, argv); + return; + } const eventWatcher = new EventWatcher(upstream, ethClient, indexer, pubsub, jobQueue); diff --git a/packages/uni-info-watcher/src/hooks.ts b/packages/uni-info-watcher/src/hooks.ts new file mode 100644 index 00000000..60d05482 --- /dev/null +++ b/packages/uni-info-watcher/src/hooks.ts @@ -0,0 +1,71 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import assert from 'assert'; +import _ from 'lodash'; + +import { Indexer } from './indexer'; +import { ResultEvent } from './events'; + +/** + * Hook function to store an initial state. + * @param indexer Indexer instance. + * @param blockHash Hash of the concerned block. + * @param contractAddress Address of the concerned contract. + * @returns Data block to be stored. + */ +export async function createInitialState (indexer: Indexer, contractAddress: string, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + assert(contractAddress); + + // Store an empty state in an IPLDBlock. + const ipldBlockData: any = { + state: {} + }; + + // Return initial state data to be saved. + return ipldBlockData; +} + +/** + * Hook function to create state diff. + * @param indexer Indexer instance that contains methods to fetch the contract varaiable values. + * @param blockHash Block hash of the concerned block. + */ +export async function createStateDiff (indexer: Indexer, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + + // Use indexer.createDiff() method to save custom state diff(s). +} + +/** + * Hook function to create state checkpoint + * @param indexer Indexer instance. + * @param contractAddress Address of the concerned contract. + * @param blockHash Block hash of the concerned block. + * @returns Whether to disable default checkpoint. If false, the state from this hook is updated with that from default checkpoint. + */ +export async function createStateCheckpoint (indexer: Indexer, contractAddress: string, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + assert(contractAddress); + + // Use indexer.createStateCheckpoint() method to create a custom checkpoint. + + // Return false to update the state created by this hook by auto-generated checkpoint state. + // Return true to disable update of the state created by this hook by auto-generated checkpoint state. + return false; +} + +/** + * Event hook function. + * @param indexer Indexer instance that contains methods to fetch and update the contract values in the database. + * @param eventData ResultEvent object containing event information. + */ +export async function handleEvent (indexer: Indexer, eventData: ResultEvent): Promise { + assert(indexer); + assert(eventData); +} diff --git a/packages/uni-info-watcher/src/indexer.ts b/packages/uni-info-watcher/src/indexer.ts index a758fcf4..579569e1 100644 --- a/packages/uni-info-watcher/src/indexer.ts +++ b/packages/uni-info-watcher/src/indexer.ts @@ -7,12 +7,16 @@ import debug from 'debug'; import { DeepPartial, FindConditions, FindManyOptions, FindOneOptions, LessThan, MoreThan, QueryRunner } from 'typeorm'; import JSONbig from 'json-bigint'; import { providers, utils, BigNumber } from 'ethers'; +import { SelectionNode } from 'graphql'; +import _ from 'lodash'; +import * as codec from '@ipld/dag-cbor'; import { Client as UniClient } from '@vulcanize/uni-watcher'; import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; -import { EthClient } from '@vulcanize/ipld-eth-client'; -import { IndexerInterface, Indexer as BaseIndexer, QueryOptions, OrderDirection, BlockHeight, GraphDecimal, JobQueue, Where, DEFAULT_LIMIT, eventProcessingEthCallDuration } from '@vulcanize/util'; -import { SelectionNode } from 'graphql'; +import { GraphDecimal, JobQueue } from '@vulcanize/util'; +import { ServerConfig, IPFSClient, IpldStatus as IpldStatusInterface, ValueResult, Indexer as BaseIndexer, IndexerInterface, QueryOptions, OrderDirection, BlockHeight, Where, ResultIPLDBlock, eventProcessingEthCallDuration } from '@cerc-io/util'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { StorageLayout, MappingKey } from '@cerc-io/solidity-mapper'; import { findEthPerToken, getEthPriceInUSD, getTrackedAmountUSD, sqrtPriceX96ToTokenPrices, WHITELIST_TOKENS } from './utils/pricing'; import { updatePoolDayData, updatePoolHourData, updateTickDayData, updateTokenDayData, updateTokenHourData, updateUniswapDayData } from './utils/interval-updates'; @@ -21,7 +25,7 @@ import { convertTokenToDecimal, loadFactory, loadTransaction, safeDiv } from './ import { createTick, feeTierToTickSpacing } from './utils/tick'; import { FACTORY_ADDRESS, WATCHED_CONTRACTS } from './utils/constants'; import { Position } from './entity/Position'; -import { Database } from './database'; +import { Database, DEFAULT_LIMIT } from './database'; import { Event } from './entity/Event'; import { ResultEvent, Block, Transaction, PoolCreatedEvent, InitializeEvent, MintEvent, BurnEvent, SwapEvent, IncreaseLiquidityEvent, DecreaseLiquidityEvent, CollectEvent, TransferEvent } from './events'; import { Factory } from './entity/Factory'; @@ -35,6 +39,9 @@ import { SyncStatus } from './entity/SyncStatus'; import { BlockProgress } from './entity/BlockProgress'; import { Tick } from './entity/Tick'; import { Contract, KIND_POOL } from './entity/Contract'; +import { IPLDBlock } from './entity/IPLDBlock'; +import { IpldStatus } from './entity/IpldStatus'; +import { createInitialState, createStateCheckpoint } from './hooks'; const SYNC_DELTA = 5; @@ -48,9 +55,12 @@ export class Indexer implements IndexerInterface { _erc20Client: ERC20Client _ethClient: EthClient _baseIndexer: BaseIndexer + _serverConfig: ServerConfig _isDemo: boolean + _storageLayoutMap: Map = new Map() + _subgraphStateMap: Map = new Map() - constructor (db: Database, uniClient: UniClient, erc20Client: ERC20Client, ethClient: EthClient, ethProvider: providers.BaseProvider, jobQueue: JobQueue, mode: string) { + constructor (serverConfig: ServerConfig, db: Database, uniClient: UniClient, erc20Client: ERC20Client, ethClient: EthClient, ethProvider: providers.BaseProvider, jobQueue: JobQueue) { assert(db); assert(uniClient); assert(erc20Client); @@ -59,12 +69,23 @@ export class Indexer implements IndexerInterface { this._uniClient = uniClient; this._erc20Client = erc20Client; this._ethClient = ethClient; - this._baseIndexer = new BaseIndexer(this._db, this._ethClient, ethProvider, jobQueue); - this._isDemo = mode === 'demo'; + this._serverConfig = serverConfig; + const ipfsClient = new IPFSClient(this._serverConfig.ipfsApiAddr); + this._baseIndexer = new BaseIndexer(this._serverConfig, this._db, this._ethClient, ethProvider, jobQueue, ipfsClient); + this._isDemo = this._serverConfig.mode === 'demo'; + } + + get serverConfig (): ServerConfig { + return this._serverConfig; + } + + get storageLayoutMap (): Map { + return this._storageLayoutMap; } async init (): Promise { await this._baseIndexer.fetchContracts(); + await this._baseIndexer.fetchIPLDStatus(); } getResultEvent (event: Event): ResultEvent { @@ -93,6 +114,109 @@ export class Indexer implements IndexerInterface { }; } + getResultIPLDBlock (ipldBlock: IPLDBlock): ResultIPLDBlock { + const block = ipldBlock.block; + + const data = codec.decode(Buffer.from(ipldBlock.data)) as any; + + return { + block: { + cid: block.cid, + hash: block.blockHash, + number: block.blockNumber, + timestamp: block.blockTimestamp, + parentHash: block.parentHash + }, + contractAddress: ipldBlock.contractAddress, + cid: ipldBlock.cid, + kind: ipldBlock.kind, + data: JSON.stringify(data) + }; + } + + async getStorageValue (storageLayout: StorageLayout, blockHash: string, contractAddress: string, variable: string, ...mappingKeys: MappingKey[]): Promise { + return this._baseIndexer.getStorageValue( + storageLayout, + blockHash, + contractAddress, + variable, + ...mappingKeys + ); + } + + async pushToIPFS (data: any): Promise { + await this._baseIndexer.pushToIPFS(data); + } + + async processInitialState (contractAddress: string, blockHash: string): Promise { + // Call initial state hook. + return createInitialState(this, contractAddress, blockHash); + } + + async processStateCheckpoint (contractAddress: string, blockHash: string): Promise { + // Call checkpoint hook. + return createStateCheckpoint(this, contractAddress, blockHash); + } + + async processCheckpoint (blockHash: string): Promise { + // Return if checkpointInterval is <= 0. + const checkpointInterval = this._serverConfig.checkpointInterval; + if (checkpointInterval <= 0) return; + + console.time('time:indexer#processCheckpoint-checkpoint'); + + await this._baseIndexer.processCheckpoint(this, blockHash, checkpointInterval); + + console.timeEnd('time:indexer#processCheckpoint-checkpoint'); + } + + async getPrevIPLDBlock (blockHash: string, contractAddress: string, kind?: string): Promise { + return this._db.getPrevIPLDBlock(blockHash, contractAddress, kind); + } + + async getIPLDBlocksByHash (blockHash: string): Promise { + return this._baseIndexer.getIPLDBlocksByHash(blockHash); + } + + async getIPLDBlocks (where: FindConditions): Promise { + return this._db.getIPLDBlocks(where); + } + + async getIPLDBlockByCid (cid: string): Promise { + return this._baseIndexer.getIPLDBlockByCid(cid); + } + + getIPLDData (ipldBlock: IPLDBlock): any { + return this._baseIndexer.getIPLDData(ipldBlock); + } + + isIPFSConfigured (): boolean { + return this._baseIndexer.isIPFSConfigured(); + } + + // Method used to create auto diffs (diff_staged). + async createDiffStaged (contractAddress: string, blockHash: string, data: any): Promise { + console.time('time:indexer#createDiffStaged-auto_diff'); + + await this._baseIndexer.createDiffStaged(contractAddress, blockHash, data); + + console.timeEnd('time:indexer#createDiffStaged-auto_diff'); + } + + // Method to be used by createStateDiff hook. + async createDiff (contractAddress: string, blockHash: string, data: any): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + await this._baseIndexer.createDiff(contractAddress, block, data); + } + + // Method to be used by fill-state CLI. + async createInit (blockHash: string, blockNumber: number): Promise { + // Create initial state for contracts. + await this._baseIndexer.createInit(this, blockHash, blockNumber); + } + async processEvent (dbEvent: Event): Promise { console.time('time:indexer#processEvent-mapping_code'); const resultEvent = this.getResultEvent(dbEvent); @@ -172,6 +296,57 @@ export class Indexer implements IndexerInterface { } } + async updateIPLDStatusHooksBlock (blockNumber: number, force?: boolean): Promise { + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateIPLDStatusHooksBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + + async updateIPLDStatusCheckpointBlock (blockNumber: number, force?: boolean): Promise { + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateIPLDStatusCheckpointBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + + async updateIPLDStatusIPFSBlock (blockNumber: number, force?: boolean): Promise { + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateIPLDStatusIPFSBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + async getBlockEntities (where: { [key: string]: any } = {}, queryOptions: QueryOptions): Promise { if (where.timestamp_gt) { where.blockTimestamp = MoreThan(where.timestamp_gt); @@ -328,6 +503,10 @@ export class Indexer implements IndexerInterface { return res; } + async getEntitiesForBlock (blockHash: string, tableName: string): Promise { + return this._db.getEntitiesForBlock(blockHash, tableName); + } + async addContracts (): Promise { // Watching the contract(s) if not watched already. for (const contract of WATCHED_CONTRACTS) { @@ -335,7 +514,7 @@ export class Indexer implements IndexerInterface { const watchedContract = this.isWatchedContract(address); if (!watchedContract) { - await this.watchContract(address, kind, startingBlock); + await this.watchContract(address, kind, true, startingBlock); } } } @@ -344,8 +523,12 @@ export class Indexer implements IndexerInterface { return this._baseIndexer.isWatchedContract(address); } - async watchContract (address: string, kind: string, startingBlock: number): Promise { - return this._baseIndexer.watchContract(address, kind, startingBlock); + async watchContract (address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { + return this._baseIndexer.watchContract(address, kind, checkpoint, startingBlock); + } + + async updateIPLDStatusMap (address: string, ipldStatus: IpldStatusInterface): Promise { + await this._baseIndexer.updateIPLDStatusMap(address, ipldStatus); } cacheContract (contract: Contract): void { @@ -375,6 +558,11 @@ export class Indexer implements IndexerInterface { ); } + async fetchBlockWithEvents (block: DeepPartial): Promise { + // Method not used in uni-info-watcher but required for indexer interface. + return new BlockProgress(); + } + async saveBlockProgress (block: DeepPartial): Promise { return this._baseIndexer.saveBlockProgress(block); } @@ -430,6 +618,30 @@ export class Indexer implements IndexerInterface { return this._baseIndexer.updateBlockProgress(block, lastProcessedEventIndex); } + async dumpSubgraphState (blockHash: string, isStateFinalized = false): Promise { + // Create a diff for each contract in the subgraph state map. + const createDiffPromises = Array.from(this._subgraphStateMap.entries()) + .map(([contractAddress, data]): Promise => { + if (isStateFinalized) { + return this.createDiff(contractAddress, blockHash, data); + } + + return this.createDiffStaged(contractAddress, blockHash, data); + }); + + await Promise.all(createDiffPromises); + + // Reset the subgraph state map. + this._subgraphStateMap.clear(); + } + + updateEntityState (contractAddress: string, data: any): void { + // Update the subgraph state for a given contract. + const oldData = this._subgraphStateMap.get(contractAddress); + const updatedData = _.merge(oldData, data); + this._subgraphStateMap.set(contractAddress, updatedData); + } + _updateCachedEntitiesFrothyBlocks (canonicalBlockHash: string, canonicalBlockNumber: number) { const canonicalBlock = this._db.cachedEntities.frothyBlocks.get(canonicalBlockHash); @@ -587,7 +799,7 @@ export class Indexer implements IndexerInterface { await dbTx.release(); } - await this.watchContract(poolCreatedEvent.pool, KIND_POOL, block.number); + await this.watchContract(poolCreatedEvent.pool, KIND_POOL, true, block.number); } /** diff --git a/packages/uni-info-watcher/src/job-runner.ts b/packages/uni-info-watcher/src/job-runner.ts index 462e9bfa..2091a96b 100644 --- a/packages/uni-info-watcher/src/job-runner.ts +++ b/packages/uni-info-watcher/src/job-runner.ts @@ -11,18 +11,17 @@ import debug from 'debug'; import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; import { Client as UniClient } from '@vulcanize/uni-watcher'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { getConfig, JobQueue, QUEUE_BLOCK_PROCESSING, QUEUE_EVENT_PROCESSING, JobRunner as BaseJobRunner, - JobQueueConfig, DEFAULT_CONFIG_PATH, - getCustomProvider, - startMetricsServer + getCustomProvider } from '@vulcanize/util'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { JobQueueConfig, startMetricsServer } from '@cerc-io/util'; import { Indexer } from './indexer'; import { Database } from './database'; @@ -124,7 +123,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, uniClient, erc20Client, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); await indexer.init(); if (mode !== 'demo') { diff --git a/packages/uni-info-watcher/src/mock/resolvers.ts b/packages/uni-info-watcher/src/mock/resolvers.ts index 415db74c..6a739aed 100644 --- a/packages/uni-info-watcher/src/mock/resolvers.ts +++ b/packages/uni-info-watcher/src/mock/resolvers.ts @@ -6,7 +6,7 @@ import debug from 'debug'; import BigInt from 'apollo-type-bigint'; -import { BlockHeight, OrderDirection } from '@vulcanize/util'; +import { BlockHeight, OrderDirection } from '@cerc-io/util'; import { Data, Entity, NO_OF_BLOCKS } from './data'; diff --git a/packages/uni-info-watcher/src/resolvers.ts b/packages/uni-info-watcher/src/resolvers.ts index 898c45c5..0b492d28 100644 --- a/packages/uni-info-watcher/src/resolvers.ts +++ b/packages/uni-info-watcher/src/resolvers.ts @@ -7,7 +7,8 @@ import BigInt from 'apollo-type-bigint'; import debug from 'debug'; import { GraphQLResolveInfo, GraphQLScalarType } from 'graphql'; -import { BlockHeight, gqlQueryCount, gqlTotalQueryCount, GraphDecimal, OrderDirection } from '@vulcanize/util'; +import { gqlQueryCount, gqlTotalQueryCount, GraphDecimal } from '@vulcanize/util'; +import { BlockHeight, OrderDirection } from '@cerc-io/util'; import { Indexer } from './indexer'; import { Burn } from './entity/Burn'; @@ -159,12 +160,24 @@ export const createResolvers = async (indexer: Indexer, eventWatcher: EventWatch return indexer.getPool(id, block, info.fieldNodes[0].selectionSet.selections); }, - poolDayDatas: async (_: any, { block = {}, first, skip, orderBy, orderDirection, where }: { block: BlockHeight, first: number, skip: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } }) => { + poolDayDatas: async ( + _: any, + { block = {}, first, skip, orderBy, orderDirection, where }: { block: BlockHeight, first: number, skip: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } }, + __: any, + info: GraphQLResolveInfo + ) => { log('poolDayDatas', first, skip, orderBy, orderDirection, where); gqlTotalQueryCount.inc(1); gqlQueryCount.labels('poolDayDatas').inc(1); + assert(info.fieldNodes[0].selectionSet); - return indexer.getEntities(PoolDayData, block, where, { limit: first, skip, orderBy, orderDirection }); + return indexer.getEntities( + PoolDayData, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info.fieldNodes[0].selectionSet.selections + ); }, pools: async ( @@ -254,24 +267,42 @@ export const createResolvers = async (indexer: Indexer, eventWatcher: EventWatch tokenDayDatas: async ( _: any, - { block = {}, first, skip, orderBy, orderDirection, where }: { block: BlockHeight, first: number, skip: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } } + { block = {}, first, skip, orderBy, orderDirection, where }: { block: BlockHeight, first: number, skip: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } }, + __: any, + info: GraphQLResolveInfo ) => { log('tokenDayDatas', first, skip, orderBy, orderDirection, where); gqlTotalQueryCount.inc(1); gqlQueryCount.labels('tokenDayDatas').inc(1); + assert(info.fieldNodes[0].selectionSet); - return indexer.getEntities(TokenDayData, block, where, { limit: first, skip, orderBy, orderDirection }); + return indexer.getEntities( + TokenDayData, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info.fieldNodes[0].selectionSet.selections + ); }, tokenHourDatas: async ( _: any, - { block = {}, first, skip, orderBy, orderDirection, where }: { block: BlockHeight, first: number, skip: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } } + { block = {}, first, skip, orderBy, orderDirection, where }: { block: BlockHeight, first: number, skip: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } }, + __: any, + info: GraphQLResolveInfo ) => { log('tokenHourDatas', first, skip, orderBy, orderDirection, where); gqlTotalQueryCount.inc(1); gqlQueryCount.labels('tokenHourDatas').inc(1); + assert(info.fieldNodes[0].selectionSet); - return indexer.getEntities(TokenHourData, block, where, { limit: first, skip, orderBy, orderDirection }); + return indexer.getEntities( + TokenHourData, + block, + where, + { limit: first, skip, orderBy, orderDirection }, + info.fieldNodes[0].selectionSet.selections + ); }, transactions: async ( @@ -339,6 +370,16 @@ export const createResolvers = async (indexer: Indexer, eventWatcher: EventWatch gqlQueryCount.labels('indexingStatusForCurrentVersion').inc(1); return indexer.getIndexingStatus(); + }, + + getState: async (_: any, { blockHash, contractAddress, kind }: { blockHash: string, contractAddress: string, kind: string }) => { + log('getState', blockHash, contractAddress, kind); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getState').inc(1); + + const ipldBlock = await indexer.getPrevIPLDBlock(blockHash, contractAddress, kind); + + return ipldBlock && ipldBlock.block.isComplete ? indexer.getResultIPLDBlock(ipldBlock) : undefined; } } }; diff --git a/packages/uni-info-watcher/src/schema.ts b/packages/uni-info-watcher/src/schema.ts index 69efe318..2b552210 100644 --- a/packages/uni-info-watcher/src/schema.ts +++ b/packages/uni-info-watcher/src/schema.ts @@ -42,6 +42,21 @@ type Pool { totalValueLockedUSD: BigDecimal! txCount: BigInt! volumeUSD: BigDecimal! + createdAtTimestamp: BigInt! + createdAtBlockNumber: BigInt! + feeGrowthGlobal0X128: BigInt! + feeGrowthGlobal1X128: BigInt! + observationIndex: BigInt! + volumeToken0: BigDecimal! + volumeToken1: BigDecimal! + untrackedVolumeUSD: BigDecimal! + feesUSD: BigDecimal! + collectedFeesToken0: BigDecimal! + collectedFeesToken1: BigDecimal! + collectedFeesUSD: BigDecimal! + totalValueLockedETH: BigDecimal! + totalValueLockedUSDUntracked: BigDecimal! + liquidityProviderCount: BigInt! } type PoolDayData { @@ -50,6 +65,21 @@ type PoolDayData { tvlUSD: BigDecimal! volumeUSD: BigDecimal! feesUSD: BigDecimal! + pool: Pool! + liquidity: BigInt! + sqrtPrice: BigInt! + token0Price: BigDecimal! + token1Price: BigDecimal! + tick: BigInt + feeGrowthGlobal0X128: BigInt! + feeGrowthGlobal1X128: BigInt! + volumeToken0: BigDecimal! + volumeToken1: BigDecimal! + txCount: BigInt! + open: BigDecimal! + high: BigDecimal! + low: BigDecimal! + close: BigDecimal! } type Tick { @@ -72,6 +102,11 @@ type Mint { sender: Bytes timestamp: BigInt! transaction: Transaction! + token0: Token! + token1: Token! + amount: BigInt! + tickLower: BigInt! + tickUpper: BigInt! } type Swap { @@ -83,6 +118,12 @@ type Swap { pool: Pool! timestamp: BigInt! transaction: Transaction! + token0: Token! + token1: Token! + sender: Bytes! + recipient: Bytes! + sqrtPriceX96: BigInt! + tick: BigInt! } type Burn { @@ -102,6 +143,10 @@ type UniswapDayData { id: ID! tvlUSD: BigDecimal! volumeUSD: BigDecimal! + volumeETH: BigDecimal! + volumeUSDUntracked: BigDecimal! + feesUSD: BigDecimal! + txCount: BigInt! } type Factory { @@ -110,6 +155,14 @@ type Factory { totalValueLockedUSD: BigDecimal! totalVolumeUSD: BigDecimal! txCount: BigInt! + poolCount: BigInt! + totalVolumeETH: BigDecimal! + totalFeesETH: BigDecimal! + untrackedVolumeUSD: BigDecimal! + totalValueLockedETH: BigDecimal! + totalValueLockedUSDUntracked: BigDecimal! + totalValueLockedETHUntracked: BigDecimal! + owner: ID! } type Transaction { @@ -133,6 +186,8 @@ type Token { volume: BigDecimal! volumeUSD: BigDecimal! whitelistPools: [Pool] + totalSupply: BigInt! + untrackedVolumeUSD: BigDecimal! } type TokenDayData { @@ -140,6 +195,16 @@ type TokenDayData { id: ID! totalValueLockedUSD: BigDecimal! volumeUSD: BigDecimal! + token: Token! + volume: BigDecimal! + untrackedVolumeUSD: BigDecimal! + totalValueLocked: BigDecimal! + priceUSD: BigDecimal! + feesUSD: BigDecimal! + open: BigDecimal! + high: BigDecimal! + low: BigDecimal! + close: BigDecimal! } type Bundle { @@ -154,6 +219,14 @@ type TokenHourData { low: BigDecimal! open: BigDecimal! periodStartUnix: Int! + token: Token! + volume: BigDecimal! + volumeUSD: BigDecimal! + untrackedVolumeUSD: BigDecimal! + totalValueLocked: BigDecimal! + totalValueLockedUSD: BigDecimal! + priceUSD: BigDecimal! + feesUSD: BigDecimal! } type Position { @@ -172,6 +245,8 @@ type Position { owner: Bytes! feeGrowthInside0LastX128: BigInt! feeGrowthInside1LastX128: BigInt! + withdrawnToken0: BigDecimal! + withdrawnToken1: BigDecimal! } type Block { @@ -337,6 +412,22 @@ type SubgraphIndexingStatus { chains: [ChainIndexingStatus!]! } +type _Block_ { + cid: String + hash: String! + number: Int! + timestamp: Int! + parentHash: String! +} + +type ResultIPLDBlock { + block: _Block_! + contractAddress: String! + cid: String + kind: String! + data: String! +} + type Query { bundle( id: ID! @@ -532,6 +623,8 @@ type Query { indexingStatusForCurrentVersion( subgraphName: String! ): SubgraphIndexingStatus + + getState(blockHash: String!, contractAddress: String!, kind: String): ResultIPLDBlock } # diff --git a/packages/uni-info-watcher/src/server.ts b/packages/uni-info-watcher/src/server.ts index 287c0c7c..fd8f38bd 100644 --- a/packages/uni-info-watcher/src/server.ts +++ b/packages/uni-info-watcher/src/server.ts @@ -14,9 +14,9 @@ import { createServer } from 'http'; import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; import { Client as UniClient } from '@vulcanize/uni-watcher'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { DEFAULT_CONFIG_PATH, getConfig, getCustomProvider, JobQueue, startGQLMetricsServer } from '@vulcanize/util'; import { getCache } from '@vulcanize/cache'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import typeDefs from './schema'; @@ -83,7 +83,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, uniClient, erc20Client, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); const pubSub = new PubSub(); const eventWatcher = new EventWatcher(upstream, ethClient, indexer, pubSub, jobQueue); diff --git a/packages/uni-info-watcher/src/smoke.test.ts b/packages/uni-info-watcher/src/smoke.test.ts index cf27089c..1bab0ee0 100644 --- a/packages/uni-info-watcher/src/smoke.test.ts +++ b/packages/uni-info-watcher/src/smoke.test.ts @@ -7,11 +7,11 @@ import { ethers, Contract, Signer, constants, utils } from 'ethers'; import 'mocha'; import _ from 'lodash'; +import { OrderDirection } from '@cerc-io/util'; import { Config, getConfig, - wait, - OrderDirection + wait } from '@vulcanize/util'; import { deployTokens, diff --git a/packages/uni-info-watcher/src/utils/state.ts b/packages/uni-info-watcher/src/utils/state.ts new file mode 100644 index 00000000..dc31138a --- /dev/null +++ b/packages/uni-info-watcher/src/utils/state.ts @@ -0,0 +1,74 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { jsonBigIntStringReplacer } from '@cerc-io/util'; + +export const prepareEntityState = (updatedEntity: any, entityName: string, relationsMap: Map): any => { + // Resolve any field name conflicts in the dbData for auto-diff. + updatedEntity = resolveEntityFieldConflicts(updatedEntity); + + // Prepare the diff data. + const diffData: any = { state: {} }; + + const result = Array.from(relationsMap.entries()) + .find(([key]) => key.name === entityName); + + if (result) { + // Update entity data if relations exist. + const [_, relations] = result; + + // Update relation fields for diff data to be similar to GQL query entities. + Object.entries(relations).forEach(([relation, { type, foreignKey }]) => { + if (foreignKey || !updatedEntity[relation]) { + // Field is not present in dbData for derived relations + return; + } + + switch (type) { + case 'many-to-many': + updatedEntity[relation] = updatedEntity[relation].map((id: string) => ({ id })); + break; + + case 'one-to-one': + updatedEntity[relation] = { id: updatedEntity[relation] }; + break; + + default: + } + }); + } + + // JSON stringify and parse data for handling unknown types when encoding. + // For example, decimal.js values are converted to string in the diff data. + diffData.state[entityName] = { + // Using custom replacer to store bigints as string values to be encoded by IPLD dag-cbor. + // TODO: Parse and store as native bigint by using Type encoders in IPLD dag-cbor encode. + // https://github.com/rvagg/cborg#type-encoders + [updatedEntity.id]: JSON.parse(JSON.stringify(updatedEntity, jsonBigIntStringReplacer)) + }; + + return diffData; +}; + +const resolveEntityFieldConflicts = (entity: any): any => { + if (entity) { + // Remove fields blockHash and blockNumber from the entity. + delete entity.blockHash; + delete entity.blockNumber; + + // Rename _blockHash -> blockHash. + if ('_blockHash' in entity) { + entity.blockHash = entity._blockHash; + delete entity._blockHash; + } + + // Rename _blockNumber -> blockNumber. + if ('_blockNumber' in entity) { + entity.blockNumber = entity._blockNumber; + delete entity._blockNumber; + } + } + + return entity; +}; diff --git a/packages/uni-info-watcher/test/init.ts b/packages/uni-info-watcher/test/init.ts index 1d8a3cd7..f57eaba1 100644 --- a/packages/uni-info-watcher/test/init.ts +++ b/packages/uni-info-watcher/test/init.ts @@ -21,7 +21,7 @@ const watchContract = async (indexer: Indexer, address: string, kind: string): P const watchedContract = indexer.isWatchedContract(address); if (!watchedContract) { - await indexer.watchContract(address, kind, 100); + await indexer.watchContract(address, kind, true, 100); } }; @@ -29,7 +29,7 @@ const main = async () => { // Get config. const config = await getConfig(CONFIG_FILE); - const { upstream, database: dbConfig, jobQueue: jobQueueConfig, server: { mode } } = config; + const { upstream, database: dbConfig, jobQueue: jobQueueConfig } = config; assert(dbConfig, 'Missing dbConfig.'); // Initialize database. @@ -55,7 +55,7 @@ const main = async () => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, uniClient, erc20Client, ethClient, ethProvider, jobQueue, mode); + const indexer = new Indexer(config.server, db, uniClient, erc20Client, ethClient, ethProvider, jobQueue); await indexer.init(); // Get the factory contract address. diff --git a/packages/uni-info-watcher/test/queries/factories.gql b/packages/uni-info-watcher/test/queries/factories.gql index 1c2ce6bf..c132c477 100644 --- a/packages/uni-info-watcher/test/queries/factories.gql +++ b/packages/uni-info-watcher/test/queries/factories.gql @@ -5,5 +5,10 @@ query factories($block: Block_height){ totalValueLockedUSD totalVolumeUSD txCount + poolCount + totalFeesETH + totalVolumeETH + untrackedVolumeUSD + totalValueLockedETH } } diff --git a/packages/uni-info-watcher/test/queries/mints.gql b/packages/uni-info-watcher/test/queries/mints.gql index bede28da..e7fc947f 100644 --- a/packages/uni-info-watcher/test/queries/mints.gql +++ b/packages/uni-info-watcher/test/queries/mints.gql @@ -14,5 +14,14 @@ query mints($block: Block_height){ pool{ id } + amount + token0{ + id + } + token1{ + id + } + tickLower + tickUpper } } diff --git a/packages/uni-info-watcher/test/queries/poolDayDatas.gql b/packages/uni-info-watcher/test/queries/poolDayDatas.gql index 8f92d82e..8c425140 100644 --- a/packages/uni-info-watcher/test/queries/poolDayDatas.gql +++ b/packages/uni-info-watcher/test/queries/poolDayDatas.gql @@ -4,5 +4,23 @@ query poolDayDatas($block: Block_height){ id tvlUSD volumeUSD + low + high + open + pool{ + id + } + tick + close + feesUSD + txCount + liquidity + sqrtPrice + token0Price + token1Price + volumeToken0 + volumeToken1 + feeGrowthGlobal0X128 + feeGrowthGlobal1X128 } } diff --git a/packages/uni-info-watcher/test/queries/pools.gql b/packages/uni-info-watcher/test/queries/pools.gql index 518432f4..41708e35 100644 --- a/packages/uni-info-watcher/test/queries/pools.gql +++ b/packages/uni-info-watcher/test/queries/pools.gql @@ -18,5 +18,12 @@ query pools($block: Block_height){ token1{ id } + feesUSD + volumeToken0 + volumeToken1 + untrackedVolumeUSD + totalValueLockedETH + feeGrowthGlobal0X128 + feeGrowthGlobal1X128 } } diff --git a/packages/uni-info-watcher/test/queries/positions.gql b/packages/uni-info-watcher/test/queries/positions.gql index 0694c62e..7f53443a 100644 --- a/packages/uni-info-watcher/test/queries/positions.gql +++ b/packages/uni-info-watcher/test/queries/positions.gql @@ -27,5 +27,7 @@ query positions($block: Block_height){ transaction{ id } + withdrawnToken0 + withdrawnToken1 } } diff --git a/packages/uni-info-watcher/test/queries/swaps.gql b/packages/uni-info-watcher/test/queries/swaps.gql index ff8b4eee..7bf48831 100644 --- a/packages/uni-info-watcher/test/queries/swaps.gql +++ b/packages/uni-info-watcher/test/queries/swaps.gql @@ -12,5 +12,15 @@ query swaps($block: Block_height){ transaction { id } + token0 { + id + } + token1 { + id + } + sender + recipient + sqrtPriceX96 + tick } } diff --git a/packages/uni-info-watcher/test/queries/tokenDayDatas.gql b/packages/uni-info-watcher/test/queries/tokenDayDatas.gql index 7dd5a6ab..afc2cf0d 100644 --- a/packages/uni-info-watcher/test/queries/tokenDayDatas.gql +++ b/packages/uni-info-watcher/test/queries/tokenDayDatas.gql @@ -4,5 +4,17 @@ query tokenDayDatas($block: Block_height){ id totalValueLockedUSD volumeUSD + low + high + open + close + token{ + id + } + volume + feesUSD + priceUSD + totalValueLocked + untrackedVolumeUSD } } diff --git a/packages/uni-info-watcher/test/queries/tokenHourDatas.gql b/packages/uni-info-watcher/test/queries/tokenHourDatas.gql index a108ee62..8c04e637 100644 --- a/packages/uni-info-watcher/test/queries/tokenHourDatas.gql +++ b/packages/uni-info-watcher/test/queries/tokenHourDatas.gql @@ -6,5 +6,15 @@ query tokenHourDatas($block: Block_height){ low open periodStartUnix + token{ + id + } + volume + feesUSD + priceUSD + volumeUSD + totalValueLocked + untrackedVolumeUSD + totalValueLockedUSD } } diff --git a/packages/uni-info-watcher/test/queries/tokens.gql b/packages/uni-info-watcher/test/queries/tokens.gql index bf20d7a0..be970545 100644 --- a/packages/uni-info-watcher/test/queries/tokens.gql +++ b/packages/uni-info-watcher/test/queries/tokens.gql @@ -14,5 +14,6 @@ query tokens($block: Block_height){ whitelistPools { id } + untrackedVolumeUSD } } diff --git a/packages/uni-info-watcher/test/queries/uniswapDayDatas.gql b/packages/uni-info-watcher/test/queries/uniswapDayDatas.gql index 14ee9b9a..d1b98296 100644 --- a/packages/uni-info-watcher/test/queries/uniswapDayDatas.gql +++ b/packages/uni-info-watcher/test/queries/uniswapDayDatas.gql @@ -4,5 +4,8 @@ query uniswapDayDatas($block: Block_height){ id tvlUSD volumeUSD + feesUSD + txCount + volumeETH } } diff --git a/packages/uni-info-watcher/test/utils.ts b/packages/uni-info-watcher/test/utils.ts index ae80bdee..4434384a 100644 --- a/packages/uni-info-watcher/test/utils.ts +++ b/packages/uni-info-watcher/test/utils.ts @@ -6,7 +6,8 @@ import { expect } from 'chai'; import { ethers } from 'ethers'; import _ from 'lodash'; -import { OrderDirection, GraphDecimal } from '@vulcanize/util'; +import { OrderDirection } from '@cerc-io/util'; +import { GraphDecimal } from '@vulcanize/util'; import { insertNDummyBlocks } from '@vulcanize/util/test'; import { Database } from '../src/database'; diff --git a/packages/uni-watcher/src/chain-pruning.test.ts b/packages/uni-watcher/src/chain-pruning.test.ts index 2c600069..4d9582fb 100644 --- a/packages/uni-watcher/src/chain-pruning.test.ts +++ b/packages/uni-watcher/src/chain-pruning.test.ts @@ -9,8 +9,8 @@ import _ from 'lodash'; import { getConfig, getCustomProvider, JobQueue, JobRunner, JOB_KIND_PRUNE } from '@vulcanize/util'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { insertNDummyBlocks, removeEntities } from '@vulcanize/util/test'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import { Indexer } from './indexer'; import { Database } from './database'; @@ -61,7 +61,7 @@ describe('chain pruning', () => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); - indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); assert(indexer, 'Could not create indexer object.'); jobRunner = new JobRunner(jobQueueConfig, indexer, jobQueue); diff --git a/packages/uni-watcher/src/cli/reset-cmds/state.ts b/packages/uni-watcher/src/cli/reset-cmds/state.ts index e43b09b6..a5745caf 100644 --- a/packages/uni-watcher/src/cli/reset-cmds/state.ts +++ b/packages/uni-watcher/src/cli/reset-cmds/state.ts @@ -42,7 +42,7 @@ export const handler = async (argv: any): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); const syncStatus = await indexer.getSyncStatus(); assert(syncStatus, 'Missing syncStatus'); @@ -55,8 +55,8 @@ export const handler = async (argv: any): Promise => { const dbTx = await db.createTransactionRunner(); try { - await db.removeEntities(dbTx, BlockProgress, { blockNumber: MoreThan(blockProgress.blockNumber) }); - await db.removeEntities(dbTx, Contract, { startingBlock: MoreThan(argv.blockNumber) }); + await db.deleteEntitiesByConditions(dbTx, BlockProgress, { blockNumber: MoreThan(blockProgress.blockNumber) }); + await db.deleteEntitiesByConditions(dbTx, Contract, { startingBlock: MoreThan(argv.blockNumber) }); if (syncStatus.latestIndexedBlockNumber > blockProgress.blockNumber) { await indexer.updateSyncStatusIndexedBlock(blockProgress.blockHash, blockProgress.blockNumber, true); diff --git a/packages/uni-watcher/src/cli/watch-contract.ts b/packages/uni-watcher/src/cli/watch-contract.ts index 26733743..c7a3157b 100644 --- a/packages/uni-watcher/src/cli/watch-contract.ts +++ b/packages/uni-watcher/src/cli/watch-contract.ts @@ -35,6 +35,12 @@ import { Indexer } from '../indexer'; demandOption: true, describe: 'Kind of contract (factory|pool|nfpm)' }, + checkpoint: { + type: 'boolean', + require: true, + demandOption: true, + describe: 'Turn checkpointing on' + }, startingBlock: { type: 'number', default: 1, @@ -59,10 +65,10 @@ import { Indexer } from '../indexer'; const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); await indexer.init(); - await indexer.watchContract(argv.address, argv.kind, argv.startingBlock); + await indexer.watchContract(argv.address, argv.kind, argv.checkpoint, argv.startingBlock); await db.close(); await jobQueue.stop(); diff --git a/packages/uni-watcher/src/database.ts b/packages/uni-watcher/src/database.ts index ef296d36..5a6a6cd0 100644 --- a/packages/uni-watcher/src/database.ts +++ b/packages/uni-watcher/src/database.ts @@ -6,12 +6,14 @@ import assert from 'assert'; import { Connection, ConnectionOptions, DeepPartial, QueryRunner, FindConditions, FindManyOptions } from 'typeorm'; import path from 'path'; -import { Database as BaseDatabase, DatabaseInterface, QueryOptions, Where } from '@vulcanize/util'; +import { Database as BaseDatabase, DatabaseInterface, StateKind, QueryOptions, Where } from '@cerc-io/util'; import { Event } from './entity/Event'; import { Contract } from './entity/Contract'; import { BlockProgress } from './entity/BlockProgress'; import { SyncStatus } from './entity/SyncStatus'; +import { IPLDBlock } from './entity/IPLDBlock'; +import { IpldStatus } from './entity/IpldStatus'; export class Database implements DatabaseInterface { _config: ConnectionOptions @@ -37,6 +39,47 @@ export class Database implements DatabaseInterface { return this._baseDatabase.close(); } + getNewIPLDBlock (): IPLDBlock { + return new IPLDBlock(); + } + + async getIPLDBlocks (where: FindConditions): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getIPLDBlocks(repo, where); + } + + async getLatestIPLDBlock (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getLatestIPLDBlock(repo, contractAddress, kind, blockNumber); + } + + // Fetch all diff IPLDBlocks after the specified block number. + async getDiffIPLDBlocksInRange (contractAddress: string, startblock: number, endBlock: number): Promise { + const repo = this._conn.getRepository(IPLDBlock); + + return this._baseDatabase.getDiffIPLDBlocksInRange(repo, contractAddress, startblock, endBlock); + } + + async saveOrUpdateIPLDBlock (dbTx: QueryRunner, ipldBlock: IPLDBlock): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + return this._baseDatabase.saveOrUpdateIPLDBlock(repo, ipldBlock); + } + + async removeIPLDBlocks (dbTx: QueryRunner, blockNumber: number, kind: string): Promise { + const repo = dbTx.manager.getRepository(IPLDBlock); + + await this._baseDatabase.removeIPLDBlocks(repo, blockNumber, kind); + } + + async getIPLDStatus (): Promise { + const repo = this._conn.getRepository(IpldStatus); + + return this._baseDatabase.getIPLDStatus(repo); + } + async getLatestContract (kind: string): Promise { return this._conn.getRepository(Contract) .createQueryBuilder('contract') @@ -51,10 +94,10 @@ export class Database implements DatabaseInterface { return this._baseDatabase.getContracts(repo); } - async saveContract (queryRunner: QueryRunner, address: string, kind: string, startingBlock: number): Promise { + async saveContract (queryRunner: QueryRunner, address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { const repo = queryRunner.manager.getRepository(Contract); - return this._baseDatabase.saveContract(repo, address, startingBlock, kind); + return this._baseDatabase.saveContract(repo, address, kind, checkpoint, startingBlock); } async createTransactionRunner (): Promise { @@ -84,6 +127,13 @@ export class Database implements DatabaseInterface { return this._baseDatabase.getBlockEvents(repo, blockHash, where, queryOptions); } + async saveBlockWithEvents (queryRunner: QueryRunner, block: DeepPartial, events: DeepPartial[]): Promise { + const blockRepo = queryRunner.manager.getRepository(BlockProgress); + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveBlockWithEvents(blockRepo, eventRepo, block, events); + } + async saveEvents (queryRunner: QueryRunner, events: Event[]): Promise { const eventRepo = queryRunner.manager.getRepository(Event); @@ -163,6 +213,10 @@ export class Database implements DatabaseInterface { return this._baseDatabase.removeEntities(queryRunner, entity, findConditions); } + async deleteEntitiesByConditions (queryRunner: QueryRunner, entity: new () => Entity, findConditions: FindConditions): Promise { + await this._baseDatabase.deleteEntitiesByConditions(queryRunner, entity, findConditions); + } + async isEntityEmpty (entity: new () => Entity): Promise { return this._baseDatabase.isEntityEmpty(entity); } diff --git a/packages/uni-watcher/src/entity/BlockProgress.ts b/packages/uni-watcher/src/entity/BlockProgress.ts index 90270bc2..59f1a6d4 100644 --- a/packages/uni-watcher/src/entity/BlockProgress.ts +++ b/packages/uni-watcher/src/entity/BlockProgress.ts @@ -14,6 +14,9 @@ export class BlockProgress implements BlockProgressInterface { @PrimaryGeneratedColumn() id!: number; + @Column('varchar') + cid!: string; + @Column('varchar', { length: 66 }) blockHash!: string; diff --git a/packages/uni-watcher/src/entity/Contract.ts b/packages/uni-watcher/src/entity/Contract.ts index 66a521e6..6c81c8e1 100644 --- a/packages/uni-watcher/src/entity/Contract.ts +++ b/packages/uni-watcher/src/entity/Contract.ts @@ -20,6 +20,9 @@ export class Contract { @Column('varchar', { length: 8 }) kind!: string; + @Column('boolean', { default: false }) + checkpoint!: boolean; + @Column('integer') startingBlock!: number; } diff --git a/packages/uni-watcher/src/entity/IPLDBlock.ts b/packages/uni-watcher/src/entity/IPLDBlock.ts new file mode 100644 index 00000000..bff1118c --- /dev/null +++ b/packages/uni-watcher/src/entity/IPLDBlock.ts @@ -0,0 +1,36 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; + +import { StateKind } from '@cerc-io/util'; + +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['cid'], { unique: true }) +@Index(['block', 'contractAddress']) +@Index(['block', 'contractAddress', 'kind'], { unique: true }) +export class IPLDBlock { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + cid!: string; + + @Column({ + type: 'enum', + enum: StateKind + }) + kind!: StateKind; + + @Column('bytea') + data!: Buffer; +} diff --git a/packages/uni-watcher/src/entity/IpldStatus.ts b/packages/uni-watcher/src/entity/IpldStatus.ts new file mode 100644 index 00000000..fb81069e --- /dev/null +++ b/packages/uni-watcher/src/entity/IpldStatus.ts @@ -0,0 +1,20 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; + +@Entity() +export class IpldStatus { + @PrimaryGeneratedColumn() + id!: number; + + @Column('integer') + latestHooksBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestCheckpointBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestIPFSBlockNumber!: number; +} diff --git a/packages/uni-watcher/src/entity/SyncStatus.ts b/packages/uni-watcher/src/entity/SyncStatus.ts index e5a52802..56bd3a2a 100644 --- a/packages/uni-watcher/src/entity/SyncStatus.ts +++ b/packages/uni-watcher/src/entity/SyncStatus.ts @@ -34,4 +34,10 @@ export class SyncStatus implements SyncStatusInterface { @Column('integer') latestCanonicalBlockNumber!: number; + + @Column('varchar', { length: 66 }) + initialIndexedBlockHash!: string; + + @Column('integer') + initialIndexedBlockNumber!: number; } diff --git a/packages/uni-watcher/src/fill.ts b/packages/uni-watcher/src/fill.ts index 45c9ef03..52802706 100644 --- a/packages/uni-watcher/src/fill.ts +++ b/packages/uni-watcher/src/fill.ts @@ -10,7 +10,7 @@ import debug from 'debug'; import { PubSub } from 'apollo-server-express'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import { getConfig, fillBlocks, JobQueue, DEFAULT_CONFIG_PATH, getCustomProvider } from '@vulcanize/util'; import { Database } from './database'; @@ -54,6 +54,11 @@ export const main = async (): Promise => { type: 'number', default: 10, describe: 'Number of blocks prefetched in batch' + }, + blockCid: { + type: 'boolean', + default: false, + describe: 'Only fetch and update block CIDs' } }).argv; @@ -89,7 +94,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); await indexer.init(); const eventWatcher = new EventWatcher(upstream, ethClient, indexer, pubsub, jobQueue); diff --git a/packages/uni-watcher/src/indexer.ts b/packages/uni-watcher/src/indexer.ts index 83e12a2b..1ef64864 100644 --- a/packages/uni-watcher/src/indexer.ts +++ b/packages/uni-watcher/src/indexer.ts @@ -8,8 +8,10 @@ import JSONbig from 'json-bigint'; import { ethers } from 'ethers'; import assert from 'assert'; -import { EthClient } from '@vulcanize/ipld-eth-client'; -import { IndexerInterface, Indexer as BaseIndexer, ValueResult, JobQueue, Where, QueryOptions } from '@vulcanize/util'; +import { JobQueue, IndexerInterface } from '@vulcanize/util'; +import { Indexer as BaseIndexer, IPFSClient, IpldStatus as IpldStatusInterface, ServerConfig, Where, QueryOptions, ValueResult } from '@cerc-io/util'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { StorageLayout, MappingKey } from '@cerc-io/solidity-mapper'; import { Database } from './database'; import { Event, UNKNOWN_EVENT_NAME } from './entity/Event'; @@ -20,6 +22,7 @@ import { SyncStatus } from './entity/SyncStatus'; import { abi as factoryABI, storageLayout as factoryStorageLayout } from './artifacts/factory.json'; import { abi as nfpmABI, storageLayout as nfpmStorageLayout } from './artifacts/NonfungiblePositionManager.json'; import poolABI from './artifacts/pool.json'; +import { IPLDBlock } from './entity/IPLDBlock'; const log = debug('vulcanize:indexer'); @@ -40,22 +43,34 @@ export class Indexer implements IndexerInterface { _ethClient: EthClient _baseIndexer: BaseIndexer _ethProvider: ethers.providers.BaseProvider + _serverConfig: ServerConfig + _storageLayoutMap: Map = new Map() _factoryContract: ethers.utils.Interface _poolContract: ethers.utils.Interface _nfpmContract: ethers.utils.Interface - constructor (db: Database, ethClient: EthClient, ethProvider: ethers.providers.BaseProvider, jobQueue: JobQueue) { + constructor (serverConfig: ServerConfig, db: Database, ethClient: EthClient, ethProvider: ethers.providers.BaseProvider, jobQueue: JobQueue) { this._db = db; this._ethClient = ethClient; this._ethProvider = ethProvider; - this._baseIndexer = new BaseIndexer(this._db, this._ethClient, this._ethProvider, jobQueue); + this._serverConfig = serverConfig; + const ipfsClient = new IPFSClient(this._serverConfig.ipfsApiAddr); + this._baseIndexer = new BaseIndexer(this._serverConfig, this._db, this._ethClient, this._ethProvider, jobQueue, ipfsClient); this._factoryContract = new ethers.utils.Interface(factoryABI); this._poolContract = new ethers.utils.Interface(poolABI); this._nfpmContract = new ethers.utils.Interface(nfpmABI); } + get serverConfig (): ServerConfig { + return this._serverConfig; + } + + get storageLayoutMap (): Map { + return this._storageLayoutMap; + } + async init (): Promise { await this._baseIndexer.fetchContracts(); } @@ -93,13 +108,27 @@ export class Indexer implements IndexerInterface { }; } + async getStorageValue (storageLayout: StorageLayout, blockHash: string, contractAddress: string, variable: string, ...mappingKeys: MappingKey[]): Promise { + return this._baseIndexer.getStorageValue( + storageLayout, + blockHash, + contractAddress, + variable, + ...mappingKeys + ); + } + + getIPLDData (ipldBlock: IPLDBlock): any { + return this._baseIndexer.getIPLDData(ipldBlock); + } + async triggerIndexingOnEvent (dbTx: QueryRunner, dbEvent: Event): Promise { const re = this.getResultEvent(dbEvent); switch (re.event.__typename) { case 'PoolCreatedEvent': { const poolContract = ethers.utils.getAddress(re.event.pool); - await this.watchContract(poolContract, KIND_POOL, dbEvent.block.blockNumber); + await this.watchContract(poolContract, KIND_POOL, true, dbEvent.block.blockNumber); } } } @@ -341,7 +370,7 @@ export class Indexer implements IndexerInterface { return contract; } - async getEventsByFilter (blockHash: string, contract: string, name: string | null): Promise> { + async getEventsByFilter (blockHash: string, contract: string, name?: string): Promise> { return this._baseIndexer.getEventsByFilter(blockHash, contract, name); } @@ -349,8 +378,12 @@ export class Indexer implements IndexerInterface { return this._baseIndexer.isWatchedContract(address); } - async watchContract (address: string, kind: string, startingBlock: number): Promise { - return this._baseIndexer.watchContract(address, kind, startingBlock); + async watchContract (address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { + return this._baseIndexer.watchContract(address, kind, checkpoint, startingBlock); + } + + async updateIPLDStatusMap (address: string, ipldStatus: IpldStatusInterface): Promise { + await this._baseIndexer.updateIPLDStatusMap(address, ipldStatus); } cacheContract (contract: Contract): void { @@ -381,6 +414,11 @@ export class Indexer implements IndexerInterface { ); } + async fetchBlockWithEvents (block: DeepPartial): Promise { + // Method not used in uni-info-watcher but required for indexer interface. + return new BlockProgress(); + } + async saveBlockProgress (block: DeepPartial): Promise { return this._baseIndexer.saveBlockProgress(block); } diff --git a/packages/uni-watcher/src/job-runner.ts b/packages/uni-watcher/src/job-runner.ts index 9cd25baf..1449e389 100644 --- a/packages/uni-watcher/src/job-runner.ts +++ b/packages/uni-watcher/src/job-runner.ts @@ -8,18 +8,17 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { JobQueueConfig, startMetricsServer } from '@cerc-io/util'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { getConfig, JobQueue, JobRunner as BaseJobRunner, QUEUE_BLOCK_PROCESSING, QUEUE_EVENT_PROCESSING, - JobQueueConfig, DEFAULT_CONFIG_PATH, - getCustomProvider, - startMetricsServer + getCustomProvider } from '@vulcanize/util'; import { Indexer } from './indexer'; @@ -100,7 +99,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); await indexer.init(); const jobRunner = new JobRunner(jobQueueConfig, indexer, jobQueue); diff --git a/packages/uni-watcher/src/resolvers.ts b/packages/uni-watcher/src/resolvers.ts index 06900fbf..dab1875d 100644 --- a/packages/uni-watcher/src/resolvers.ts +++ b/packages/uni-watcher/src/resolvers.ts @@ -6,9 +6,11 @@ import assert from 'assert'; import BigInt from 'apollo-type-bigint'; import debug from 'debug'; +import { gqlTotalQueryCount, gqlQueryCount } from '@vulcanize/util'; +import { ValueResult } from '@cerc-io/util'; + import { Indexer } from './indexer'; import { EventWatcher } from './events'; -import { ValueResult, gqlTotalQueryCount, gqlQueryCount } from '@vulcanize/util'; const log = debug('vulcanize:resolver'); diff --git a/packages/uni-watcher/src/server.ts b/packages/uni-watcher/src/server.ts index 32369297..30dd3abc 100644 --- a/packages/uni-watcher/src/server.ts +++ b/packages/uni-watcher/src/server.ts @@ -12,8 +12,8 @@ import debug from 'debug'; import 'graphql-import-node'; import { createServer } from 'http'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; import { DEFAULT_CONFIG_PATH, getConfig, getCustomProvider, JobQueue, startGQLMetricsServer } from '@vulcanize/util'; import typeDefs from './schema'; @@ -74,7 +74,7 @@ export const main = async (): Promise => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); await indexer.init(); const eventWatcher = new EventWatcher(upstream, ethClient, indexer, pubsub, jobQueue); diff --git a/packages/uni-watcher/src/smoke.test.ts b/packages/uni-watcher/src/smoke.test.ts index cc70a55f..210519a6 100644 --- a/packages/uni-watcher/src/smoke.test.ts +++ b/packages/uni-watcher/src/smoke.test.ts @@ -22,7 +22,7 @@ import { NFPM_ABI } from '@vulcanize/util/test'; import { getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; +import { EthClient } from '@cerc-io/ipld-eth-client'; import { abi as FACTORY_ABI } from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'; @@ -127,7 +127,7 @@ describe('uni-watcher', () => { factory = new Contract(factoryContract.address, FACTORY_ABI, signer); // Verifying with the db. - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); await indexer.init(); assert(await indexer.isWatchedContract(factory.address), 'Factory contract not added to the database.'); }); @@ -263,7 +263,7 @@ describe('uni-watcher', () => { nfpm = new Contract(nfpmContract.address, NFPM_ABI, signer); // Verifying with the db. - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); await indexer.init(); assert(await indexer.isWatchedContract(nfpm.address), 'NFPM contract not added to the database.'); }); diff --git a/packages/uni-watcher/test/init.ts b/packages/uni-watcher/test/init.ts index d278a872..bccc8826 100644 --- a/packages/uni-watcher/test/init.ts +++ b/packages/uni-watcher/test/init.ts @@ -30,7 +30,7 @@ const deployFactoryContract = async (indexer: Indexer, signer: Signer): Promise< assert(factory.address, 'Factory contract not deployed.'); // Watch factory contract. - await indexer.watchContract(factory.address, 'factory', 100); + await indexer.watchContract(factory.address, 'factory', true, 100); return factory; }; @@ -45,7 +45,7 @@ const deployNFPMContract = async (indexer: Indexer, signer: Signer, factory: Con assert(nfpm.address, 'NFPM contract not deployed.'); // Watch NFPM contract. - await indexer.watchContract(nfpm.address, 'nfpm', 100); + await indexer.watchContract(nfpm.address, 'nfpm', true, 100); }; const main = async () => { @@ -81,7 +81,7 @@ const main = async () => { const jobQueue = new JobQueue({ dbConnectionString, maxCompletionLag: maxCompletionLagInSecs }); await jobQueue.start(); - const indexer = new Indexer(db, ethClient, ethProvider, jobQueue); + const indexer = new Indexer(config.server, db, ethClient, ethProvider, jobQueue); let factory: Contract; // Checking whether factory is deployed. diff --git a/packages/util/index.ts b/packages/util/index.ts index 9d2488e0..5f59f30c 100644 --- a/packages/util/index.ts +++ b/packages/util/index.ts @@ -3,15 +3,12 @@ // export * from './src/config'; -export * from './src/database'; export * from './src/job-queue'; export * from './src/constants'; export * from './src/misc'; export * from './src/fill'; export * from './src/events'; export * from './src/types'; -export * from './src/indexer'; export * from './src/job-runner'; export * from './src/graph-decimal'; -export * from './src/metrics'; export * from './src/gql-metrics'; diff --git a/packages/util/package.json b/packages/util/package.json index 8fcf9f27..1d24b860 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -4,29 +4,29 @@ "main": "dist/index.js", "license": "AGPL-3.0", "dependencies": { - "@vulcanize/solidity-mapper": "^0.1.0", "@ethersproject/providers": "5.3.0", "csv-writer": "^1.6.0", "debug": "^4.3.1", "decimal.js": "^10.3.1", "ethers": "^5.2.0", + "express": "^4.17.1", "fs-extra": "^10.0.0", "lodash": "^4.17.21", "node-fetch": "2", "pg-boss": "^6.1.0", "prom-client": "^14.0.1", "toml": "^3.0.0", - "yargs": "^17.0.1", - "express": "^4.17.1" + "yargs": "^17.0.1" }, "devDependencies": { + "@nomiclabs/hardhat-waffle": "^2.0.1", "@types/fs-extra": "^9.0.11", + "@types/node-fetch": "2.x", "@typescript-eslint/eslint-plugin": "^4.25.0", "@typescript-eslint/parser": "^4.25.0", "@uniswap/v3-periphery": "1.0.0", "@vulcanize/cache": "^0.1.0", "@vulcanize/ipld-eth-client": "^0.1.0", - "@nomiclabs/hardhat-waffle": "^2.0.1", "apollo-server-express": "^2.25.0", "eslint": "^7.27.0", "eslint-config-semistandard": "^15.0.1", diff --git a/packages/util/src/common.ts b/packages/util/src/common.ts index 902118aa..cb8bcabb 100644 --- a/packages/util/src/common.ts +++ b/packages/util/src/common.ts @@ -68,7 +68,7 @@ export const processBlockByNumber = async ( if (blocks.length) { for (let bi = 0; bi < blocks.length; bi++) { - const { blockHash, blockNumber, parentHash, timestamp } = blocks[bi]; + const { cid, blockHash, blockNumber, parentHash, timestamp } = blocks[bi]; // Stop blocks already pushed to job queue. They are already retried after fail. if (!syncStatus || syncStatus.chainHeadBlockNumber < blockNumber) { @@ -77,6 +77,7 @@ export const processBlockByNumber = async ( { kind: JOB_KIND_INDEX, blockNumber: Number(blockNumber), + cid, blockHash, parentHash, timestamp diff --git a/packages/util/src/config.ts b/packages/util/src/config.ts index a243e77a..26570684 100644 --- a/packages/util/src/config.ts +++ b/packages/util/src/config.ts @@ -8,31 +8,16 @@ import path from 'path'; import toml from 'toml'; import debug from 'debug'; import { ConnectionOptions } from 'typeorm'; +import { providers } from 'ethers'; -import { BaseProvider } from '@ethersproject/providers'; import { Config as CacheConfig, getCache } from '@vulcanize/cache'; -import { EthClient } from '@vulcanize/ipld-eth-client'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { JobQueueConfig, ServerConfig } from '@cerc-io/util'; import { getCustomProvider } from './misc'; const log = debug('vulcanize:config'); -export interface JobQueueConfig { - dbConnectionString: string; - maxCompletionLagInSecs: number; - jobDelayInMilliSecs?: number; - eventsInBatch: number; - lazyUpdateBlockProgress?: boolean; - subgraphEventsOrder: boolean; -} - -interface ServerConfig { - host: string; - port: number; - mode: string; - kind: string; -} - export interface GQLMetricsConfig { port: number; } @@ -87,7 +72,7 @@ export const getResetConfig = async (config: Config): Promise<{ serverConfig: ServerConfig, upstreamConfig: UpstreamConfig, ethClient: EthClient, - ethProvider: BaseProvider + ethProvider: providers.BaseProvider }> => { const { database: dbConfig, upstream: upstreamConfig, server: serverConfig } = config; diff --git a/packages/util/src/database.ts b/packages/util/src/database.ts deleted file mode 100644 index 0884b41b..00000000 --- a/packages/util/src/database.ts +++ /dev/null @@ -1,1108 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -import assert from 'assert'; -import debug from 'debug'; -import { - Brackets, - Connection, - ConnectionOptions, - createConnection, - DeepPartial, - FindConditions, - FindManyOptions, - In, - Not, - QueryRunner, - Repository, - SelectQueryBuilder -} from 'typeorm'; -import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; -import { RawSqlResultsToEntityTransformer } from 'typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer'; -import _ from 'lodash'; -import { SelectionNode } from 'graphql'; - -import { BlockProgressInterface, ContractInterface, EventInterface, SyncStatusInterface } from './types'; -import { MAX_REORG_DEPTH, UNKNOWN_EVENT_NAME } from './constants'; -import { blockProgressCount, eventCount, eventProcessingLoadEntityDBQueryDuration, eventProcessingLoadEntityCacheHitCount, eventProcessingLoadEntityCount } from './metrics'; - -const OPERATOR_MAP = { - equals: '=', - gt: '>', - lt: '<', - gte: '>=', - lte: '<=', - in: 'IN', - contains: 'LIKE', - starts: 'LIKE', - ends: 'LIKE' -}; - -const INSERT_EVENTS_BATCH = 100; -export const DEFAULT_LIMIT = 100; - -const log = debug('vulcanize:database'); - -export enum ENTITY_QUERY_TYPE { - SINGULAR, - DISTINCT_ON, - GROUP_BY -} - -export interface BlockHeight { - number?: number; - hash?: string; -} - -export enum OrderDirection { - asc = 'asc', - desc = 'desc' -} - -export interface QueryOptions { - limit?: number; - skip?: number; - orderBy?: string; - orderDirection?: OrderDirection; -} - -export interface Where { - [key: string]: [{ - value: any; - not: boolean; - operator: keyof typeof OPERATOR_MAP; - }] -} - -// Cache for updated entities used in job-runner event processing. -export interface CachedEntities { - frothyBlocks: Map< - string, - { - blockNumber: number; - parentHash: string; - entities: Map>; - } - >; - latestPrunedEntities: Map>; -} - -export class Database { - _config: ConnectionOptions - _conn!: Connection - _blockCount = 0 - _eventCount = 0 - _cachedEntities: CachedEntities = { - frothyBlocks: new Map(), - latestPrunedEntities: new Map() - } - - constructor (config: ConnectionOptions) { - assert(config); - this._config = config; - } - - get cachedEntities () { - return this._cachedEntities; - } - - async init (): Promise { - assert(!this._conn); - - this._conn = await createConnection({ - ...this._config, - namingStrategy: new SnakeNamingStrategy() - }); - - await this._fetchBlockCount(); - await this._fetchEventCount(); - - return this._conn; - } - - async close (): Promise { - return this._conn.close(); - } - - async createTransactionRunner (): Promise { - const queryRunner = this._conn.createQueryRunner(); - await queryRunner.connect(); - await queryRunner.startTransaction(); - return queryRunner; - } - - async getSyncStatus (repo: Repository): Promise { - return repo.findOne(); - } - - async updateSyncStatusIndexedBlock (repo: Repository, blockHash: string, blockNumber: number, force = false): Promise { - const entity = await repo.findOne(); - assert(entity); - - if (force || blockNumber >= entity.latestIndexedBlockNumber) { - entity.latestIndexedBlockHash = blockHash; - entity.latestIndexedBlockNumber = blockNumber; - } - - return await repo.save(entity); - } - - async updateSyncStatusCanonicalBlock (repo: Repository, blockHash: string, blockNumber: number, force = false): Promise { - const entity = await repo.findOne(); - assert(entity); - - if (force || blockNumber >= entity.latestCanonicalBlockNumber) { - entity.latestCanonicalBlockHash = blockHash; - entity.latestCanonicalBlockNumber = blockNumber; - } - - return await repo.save(entity); - } - - async updateSyncStatusChainHead (repo: Repository, blockHash: string, blockNumber: number, force = false): Promise { - let entity = await repo.findOne(); - if (!entity) { - entity = repo.create({ - chainHeadBlockHash: blockHash, - chainHeadBlockNumber: blockNumber, - latestCanonicalBlockHash: blockHash, - latestCanonicalBlockNumber: blockNumber, - latestIndexedBlockHash: '', - latestIndexedBlockNumber: -1 - }); - } - - if (force || blockNumber >= entity.chainHeadBlockNumber) { - entity.chainHeadBlockHash = blockHash; - entity.chainHeadBlockNumber = blockNumber; - } - - return await repo.save(entity); - } - - async getBlockProgress (repo: Repository, blockHash: string): Promise { - return repo.findOne({ where: { blockHash } }); - } - - async getBlockProgressEntities (repo: Repository, where: FindConditions, options: FindManyOptions): Promise { - options.where = where; - - return repo.find(options); - } - - async getBlocksAtHeight (repo: Repository, height: number, isPruned: boolean): Promise { - return repo.createQueryBuilder('block_progress') - .where('block_number = :height AND is_pruned = :isPruned', { height, isPruned }) - .getMany(); - } - - async saveBlockProgress (repo: Repository, block: DeepPartial): Promise { - this._blockCount++; - blockProgressCount.set(this._blockCount); - - return await repo.save(block); - } - - async updateBlockProgress (repo: Repository, block: BlockProgressInterface, lastProcessedEventIndex: number): Promise { - if (!block.isComplete) { - if (lastProcessedEventIndex <= block.lastProcessedEventIndex) { - throw new Error(`Events processed out of order ${block.blockHash}, was ${block.lastProcessedEventIndex}, got ${lastProcessedEventIndex}`); - } - - block.lastProcessedEventIndex = lastProcessedEventIndex; - block.numProcessedEvents++; - if (block.numProcessedEvents >= block.numEvents) { - block.isComplete = true; - } - } - - const { generatedMaps } = await repo.createQueryBuilder() - .update() - .set(block) - .where('id = :id', { id: block.id }) - .whereEntity(block) - .returning('*') - .execute(); - - block = generatedMaps[0] as BlockProgressInterface; - - return block; - } - - async markBlocksAsPruned (repo: Repository, blocks: BlockProgressInterface[]): Promise { - const ids = blocks.map(({ id }) => id); - - await repo.update({ id: In(ids) }, { isPruned: true }); - } - - async getEvent (repo: Repository, id: string): Promise { - return repo.findOne(id, { relations: ['block'] }); - } - - async getBlockEvents (repo: Repository, blockHash: string, where: Where = {}, queryOptions: QueryOptions = {}): Promise { - let queryBuilder = repo.createQueryBuilder('event') - .innerJoinAndSelect('event.block', 'block') - .where('block.block_hash = :blockHash AND block.is_pruned = false', { blockHash }); - - queryBuilder = this._buildQuery(repo, queryBuilder, where); - - if (queryOptions.orderBy) { - queryBuilder = this._orderQuery(repo, queryBuilder, queryOptions); - } - - queryBuilder.addOrderBy('event.id', 'ASC'); - - if (queryOptions.skip) { - queryBuilder = queryBuilder.offset(queryOptions.skip); - } - - if (queryOptions.limit) { - queryBuilder = queryBuilder.limit(queryOptions.limit); - } - - return queryBuilder.getMany(); - } - - async saveEvents (eventRepo: Repository, events: DeepPartial[]): Promise { - // Bulk insert events. - const eventBatches = _.chunk(events, INSERT_EVENTS_BATCH); - - const insertPromises = eventBatches.map(async events => { - await eventRepo.createQueryBuilder() - .insert() - .values(events) - .updateEntity(false) - .execute(); - }); - - await Promise.all(insertPromises); - - this._eventCount += events.length; - eventCount.set(this._eventCount); - } - - async getEntities (queryRunner: QueryRunner, entity: new () => Entity, findConditions?: FindConditions): Promise { - const repo = queryRunner.manager.getRepository(entity); - - const entities = await repo.find(findConditions); - return entities; - } - - async isEntityEmpty (entity: new () => Entity): Promise { - const queryRunner = this._conn.createQueryRunner(); - - try { - await queryRunner.connect(); - const data = await this.getEntities(queryRunner, entity); - - if (data.length > 0) { - return false; - } - - return true; - } finally { - await queryRunner.release(); - } - } - - async removeEntities (queryRunner: QueryRunner, entity: new () => Entity, findConditions: FindConditions = {}): Promise { - const repo = queryRunner.manager.getRepository(entity); - - await repo.delete(findConditions); - } - - async getAncestorAtDepth (blockHash: string, depth: number): Promise { - const heirerchicalQuery = ` - WITH RECURSIVE cte_query AS - ( - SELECT - block_hash, - block_number, - parent_hash, - 0 as depth - FROM - block_progress - WHERE - block_hash = $1 - UNION ALL - SELECT - b.block_hash, - b.block_number, - b.parent_hash, - c.depth + 1 - FROM - block_progress b - INNER JOIN - cte_query c ON c.parent_hash = b.block_hash - WHERE - c.depth < $2 - ) - SELECT - block_hash, block_number - FROM - cte_query - ORDER BY block_number ASC - LIMIT 1; - `; - - // Get ancestor block hash using heirarchical query. - const [{ block_hash: ancestorBlockHash }] = await this._conn.query(heirerchicalQuery, [blockHash, depth]); - - return ancestorBlockHash; - } - - async getProcessedBlockCountForRange (repo: Repository, fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }> { - const blockNumbers = _.range(fromBlockNumber, toBlockNumber + 1); - const expected = blockNumbers.length; - - const { count: actual } = await repo - .createQueryBuilder('block_progress') - .select('COUNT(DISTINCT(block_number))', 'count') - .where('block_number IN (:...blockNumbers) AND is_complete = :isComplete', { blockNumbers, isComplete: true }) - .getRawOne(); - - return { expected, actual: parseInt(actual) }; - } - - async getEventsInRange (repo: Repository, fromBlockNumber: number, toBlockNumber: number): Promise> { - const events = repo.createQueryBuilder('event') - .innerJoinAndSelect('event.block', 'block') - .where('block_number >= :fromBlockNumber AND block_number <= :toBlockNumber AND event_name <> :eventName AND is_pruned = false', { - fromBlockNumber, - toBlockNumber, - eventName: UNKNOWN_EVENT_NAME - }) - .addOrderBy('event.id', 'ASC') - .getMany(); - - return events; - } - - async saveEventEntity (repo: Repository, entity: EventInterface): Promise { - const event = await repo.save(entity); - this._eventCount++; - eventCount.set(this._eventCount); - - return event; - } - - async getModelEntities ( - queryRunner: QueryRunner, - relationsMap: Map, - entityQueryMap: Map Entity, ENTITY_QUERY_TYPE>, - entity: new () => Entity, - block: BlockHeight, - where: Where = {}, - queryOptions: QueryOptions = {}, - selections: ReadonlyArray = [] - ): Promise { - let entities: Entity[]; - - // Use different suitable query patterns based on entities. - switch (entityQueryMap.get(entity)) { - case ENTITY_QUERY_TYPE.SINGULAR: - entities = await this.getModelEntitiesSingular(queryRunner, entity, block, where); - break; - - case ENTITY_QUERY_TYPE.DISTINCT_ON: - entities = await this.getModelEntitiesDistinctOn(queryRunner, entity, block, where, queryOptions); - break; - - case ENTITY_QUERY_TYPE.GROUP_BY: - entities = await this.getModelEntitiesGroupBy(queryRunner, entity, block, where, queryOptions); - break; - - default: - log(`Invalid entity query type for entity ${entity}`); - entities = []; - break; - } - - if (!entities.length) { - return []; - } - - entities = await this.loadRelations(queryRunner, block, relationsMap, entityQueryMap, entity, entities, selections); - - return entities; - } - - async getModelEntitiesGroupBy ( - queryRunner: QueryRunner, - entity: new () => Entity, - block: BlockHeight, - where: Where = {}, - queryOptions: QueryOptions = {} - ): Promise { - const repo = queryRunner.manager.getRepository(entity); - const { tableName } = repo.metadata; - - let subQuery = repo.createQueryBuilder('subTable') - .select('subTable.id', 'id') - .addSelect('MAX(subTable.block_number)', 'block_number') - .addFrom('block_progress', 'blockProgress') - .where('subTable.block_hash = blockProgress.block_hash') - .andWhere('blockProgress.is_pruned = :isPruned', { isPruned: false }) - .groupBy('subTable.id'); - - if (block.hash) { - const { canonicalBlockNumber, blockHashes } = await this.getFrothyRegion(queryRunner, block.hash); - - subQuery = subQuery - .andWhere(new Brackets(qb => { - qb.where('subTable.block_hash IN (:...blockHashes)', { blockHashes }) - .orWhere('subTable.block_number <= :canonicalBlockNumber', { canonicalBlockNumber }); - })); - } - - if (block.number) { - subQuery = subQuery.andWhere('subTable.block_number <= :blockNumber', { blockNumber: block.number }); - } - - let selectQueryBuilder = repo.createQueryBuilder(tableName) - .innerJoin( - `(${subQuery.getQuery()})`, - 'latestEntities', - `${tableName}.id = "latestEntities"."id" AND ${tableName}.block_number = "latestEntities"."block_number"` - ) - .setParameters(subQuery.getParameters()); - - selectQueryBuilder = this._buildQuery(repo, selectQueryBuilder, where); - - if (queryOptions.orderBy) { - selectQueryBuilder = this._orderQuery(repo, selectQueryBuilder, queryOptions); - } - - selectQueryBuilder = this._orderQuery(repo, selectQueryBuilder, { ...queryOptions, orderBy: 'id' }); - - if (queryOptions.skip) { - selectQueryBuilder = selectQueryBuilder.offset(queryOptions.skip); - } - - if (queryOptions.limit) { - selectQueryBuilder = selectQueryBuilder.limit(queryOptions.limit); - } - - const entities = await selectQueryBuilder.getMany(); - - return entities; - } - - async getModelEntitiesDistinctOn ( - queryRunner: QueryRunner, - entity: new () => Entity, - block: BlockHeight, - where: Where = {}, - queryOptions: QueryOptions = {} - ): Promise { - const repo = queryRunner.manager.getRepository(entity); - - let subQuery = repo.createQueryBuilder('subTable') - .distinctOn(['subTable.id']) - .addFrom('block_progress', 'blockProgress') - .where('subTable.block_hash = blockProgress.block_hash') - .andWhere('blockProgress.is_pruned = :isPruned', { isPruned: false }) - .addOrderBy('subTable.id', 'ASC') - .addOrderBy('subTable.block_number', 'DESC'); - - if (block.hash) { - const { canonicalBlockNumber, blockHashes } = await this.getFrothyRegion(queryRunner, block.hash); - - subQuery = subQuery - .andWhere(new Brackets(qb => { - qb.where('subTable.block_hash IN (:...blockHashes)', { blockHashes }) - .orWhere('subTable.block_number <= :canonicalBlockNumber', { canonicalBlockNumber }); - })); - } - - if (block.number) { - subQuery = subQuery.andWhere('subTable.block_number <= :blockNumber', { blockNumber: block.number }); - } - - subQuery = this._buildQuery(repo, subQuery, where); - - let selectQueryBuilder = queryRunner.manager.createQueryBuilder() - .from( - `(${subQuery.getQuery()})`, - 'latestEntities' - ) - .setParameters(subQuery.getParameters()); - - if (queryOptions.orderBy) { - selectQueryBuilder = this._orderQuery(repo, selectQueryBuilder, queryOptions, 'subTable_'); - if (queryOptions.orderBy !== 'id') { - selectQueryBuilder = this._orderQuery(repo, selectQueryBuilder, { ...queryOptions, orderBy: 'id' }, 'subTable_'); - } - } - - if (queryOptions.skip) { - selectQueryBuilder = selectQueryBuilder.offset(queryOptions.skip); - } - - if (queryOptions.limit) { - selectQueryBuilder = selectQueryBuilder.limit(queryOptions.limit); - } - - let entities = await selectQueryBuilder.getRawMany(); - entities = await this._transformResults(queryRunner, repo.createQueryBuilder('subTable'), entities); - - return entities as Entity[]; - } - - async getModelEntitiesSingular ( - queryRunner: QueryRunner, - entity: new () => Entity, - block: BlockHeight, - where: Where = {} - ): Promise { - const repo = queryRunner.manager.getRepository(entity); - const { tableName } = repo.metadata; - - let selectQueryBuilder = repo.createQueryBuilder(tableName) - .addFrom('block_progress', 'blockProgress') - .where(`${tableName}.block_hash = blockProgress.block_hash`) - .andWhere('blockProgress.is_pruned = :isPruned', { isPruned: false }) - .addOrderBy(`${tableName}.block_number`, 'DESC') - .limit(1); - - if (block.hash) { - const { canonicalBlockNumber, blockHashes } = await this.getFrothyRegion(queryRunner, block.hash); - - selectQueryBuilder = selectQueryBuilder - .andWhere(new Brackets(qb => { - qb.where(`${tableName}.block_hash IN (:...blockHashes)`, { blockHashes }) - .orWhere(`${tableName}.block_number <= :canonicalBlockNumber`, { canonicalBlockNumber }); - })); - } - - if (block.number) { - selectQueryBuilder = selectQueryBuilder.andWhere(`${tableName}.block_number <= :blockNumber`, { blockNumber: block.number }); - } - - selectQueryBuilder = this._buildQuery(repo, selectQueryBuilder, where); - - const entities = await selectQueryBuilder.getMany(); - - return entities as Entity[]; - } - - async getModelEntity (repo: Repository, whereOptions: any): Promise { - eventProcessingLoadEntityCount.inc(); - - const findOptions = { - where: whereOptions, - order: { - blockNumber: 'DESC' - } - }; - - if (findOptions.where.blockHash) { - // Check cache only if latestPrunedEntities is updated. - // latestPrunedEntities is updated when frothyBlocks is filled till canonical block height. - if (this._cachedEntities.latestPrunedEntities.size > 0) { - let frothyBlock = this._cachedEntities.frothyBlocks.get(findOptions.where.blockHash); - let canonicalBlockNumber = -1; - - // Loop through frothy region until latest entity is found. - while (frothyBlock) { - const entity = frothyBlock.entities - .get(repo.metadata.tableName) - ?.get(findOptions.where.id); - - if (entity) { - eventProcessingLoadEntityCacheHitCount.inc(); - return _.cloneDeep(entity) as Entity; - } - - canonicalBlockNumber = frothyBlock.blockNumber + 1; - frothyBlock = this._cachedEntities.frothyBlocks.get(frothyBlock.parentHash); - } - - // Canonical block number is not assigned if blockHash does not exist in frothy region. - // Get latest pruned entity from cache only if blockHash exists in frothy region. - // i.e. Latest entity in cache is the version before frothy region. - if (canonicalBlockNumber > -1) { - // If entity not found in frothy region get latest entity in the pruned region. - // Check if latest entity is cached in pruned region. - const entity = this._cachedEntities.latestPrunedEntities - .get(repo.metadata.tableName) - ?.get(findOptions.where.id); - - if (entity) { - eventProcessingLoadEntityCacheHitCount.inc(); - return _.cloneDeep(entity) as Entity; - } - - // Get latest pruned entity from DB if not found in cache. - const endTimer = eventProcessingLoadEntityDBQueryDuration.startTimer(); - const dbEntity = await this._getLatestPrunedEntity(repo, findOptions.where.id, canonicalBlockNumber); - endTimer(); - - if (dbEntity) { - // Update latest pruned entity in cache. - this.cacheUpdatedEntity(repo, dbEntity, true); - } - - return dbEntity; - } - } - - const endTimer = eventProcessingLoadEntityDBQueryDuration.startTimer(); - const dbEntity = await this.getPrevEntityVersion(repo.queryRunner!, repo, findOptions); - endTimer(); - - return dbEntity; - } - - return repo.findOne(findOptions); - } - - async loadRelations ( - queryRunner: QueryRunner, - block: BlockHeight, - relationsMap: Map, - entityQueryMap: Map Entity, ENTITY_QUERY_TYPE>, - entity: new () => Entity, - entities: Entity[], - selections: ReadonlyArray = [] - ): Promise { - const relations = relationsMap.get(entity); - - if (!relations) { - return entities; - } - - // Filter selections from GQL query which are relations. - const relationPromises = selections.filter((selection) => selection.kind === 'Field' && Boolean(relations[selection.name.value])) - .map(async (selection) => { - assert(selection.kind === 'Field'); - const field = selection.name.value; - const { entity: relationEntity, type, foreignKey } = relations[field]; - let childSelections = selection.selectionSet?.selections || []; - - // Filter out __typename field in GQL for loading relations. - childSelections = childSelections.filter(selection => !(selection.kind === 'Field' && selection.name.value === '__typename')); - - switch (type) { - case 'one-to-many': { - assert(foreignKey); - - const where: Where = { - [foreignKey]: [{ - value: entities.map((entity: any) => entity.id), - not: false, - operator: 'in' - }] - }; - - const relatedEntities = await this.getModelEntities( - queryRunner, - relationsMap, - entityQueryMap, - relationEntity, - block, - where, - {}, - childSelections - ); - - const relatedEntitiesMap = relatedEntities.reduce((acc: {[key:string]: any[]}, entity: any) => { - // Related entity might be loaded with data. - const parentEntityId = entity[foreignKey].id ?? entity[foreignKey]; - - if (!acc[parentEntityId]) { - acc[parentEntityId] = []; - } - - if (acc[parentEntityId].length < DEFAULT_LIMIT) { - acc[parentEntityId].push(entity); - } - - return acc; - }, {}); - - entities.forEach((entity: any) => { - if (relatedEntitiesMap[entity.id]) { - entity[field] = relatedEntitiesMap[entity.id]; - } else { - entity[field] = []; - } - }); - - break; - } - - case 'many-to-many': { - const relatedIds = entities.reduce((acc, entity: any) => { - entity[field].forEach((relatedEntityId: any) => acc.add(relatedEntityId)); - - return acc; - }, new Set()); - - const where: Where = { - id: [{ - value: Array.from(relatedIds), - not: false, - operator: 'in' - }] - }; - - const relatedEntities = await this.getModelEntities( - queryRunner, - relationsMap, - entityQueryMap, - relationEntity, - block, - where, - {}, - childSelections - ); - - entities.forEach((entity: any) => { - const relatedEntityIds: Set = entity[field].reduce((acc: Set, id: string) => { - acc.add(id); - - return acc; - }, new Set()); - - entity[field] = []; - - relatedEntities.forEach((relatedEntity: any) => { - if (relatedEntityIds.has(relatedEntity.id) && entity[field].length < DEFAULT_LIMIT) { - entity[field].push(relatedEntity); - } - }); - }); - - break; - } - - default: { - // For one-to-one/many-to-one relations. - if (childSelections.length === 1 && childSelections[0].kind === 'Field' && childSelections[0].name.value === 'id') { - // Avoid loading relation if selections only has id field. - entities.forEach((entity: any) => { - entity[field] = { id: entity[field] }; - }); - - break; - } - - const where: Where = { - id: [{ - value: entities.map((entity: any) => entity[field]), - not: false, - operator: 'in' - }] - }; - - const relatedEntities = await this.getModelEntities( - queryRunner, - relationsMap, - entityQueryMap, - relationEntity, - block, - where, - {}, - childSelections - ); - - const relatedEntitiesMap = relatedEntities.reduce((acc: {[key:string]: any}, entity: any) => { - acc[entity.id] = entity; - - return acc; - }, {}); - - entities.forEach((entity: any) => { - if (relatedEntitiesMap[entity[field]]) { - entity[field] = relatedEntitiesMap[entity[field]]; - } - }); - - break; - } - } - }); - - await Promise.all(relationPromises); - - return entities; - } - - async getPrevEntityVersion (queryRunner: QueryRunner, repo: Repository, findOptions: { [key: string]: any }): Promise { - // Hierarchical query for getting the entity in the frothy region. - const heirerchicalQuery = ` - WITH RECURSIVE cte_query AS - ( - SELECT - b.block_hash, - b.block_number, - b.parent_hash, - 1 as depth, - e.id - FROM - block_progress b - LEFT JOIN - ${repo.metadata.tableName} e - ON e.block_hash = b.block_hash - AND e.id = $2 - WHERE - b.block_hash = $1 - UNION ALL - SELECT - b.block_hash, - b.block_number, - b.parent_hash, - c.depth + 1, - e.id - FROM - block_progress b - LEFT JOIN - ${repo.metadata.tableName} e - ON e.block_hash = b.block_hash - AND e.id = $2 - INNER JOIN - cte_query c ON c.parent_hash = b.block_hash - WHERE - c.id IS NULL AND c.depth < $3 - ) - SELECT - block_hash, block_number, id - FROM - cte_query - ORDER BY block_number ASC - LIMIT 1; - `; - - // Fetching blockHash for previous entity in frothy region. - const [{ block_hash: blockHash, block_number: blockNumber, id }] = await queryRunner.query(heirerchicalQuery, [findOptions.where.blockHash, findOptions.where.id, MAX_REORG_DEPTH]); - - if (id) { - // Entity found in frothy region. - findOptions.where.blockHash = blockHash; - - return repo.findOne(findOptions); - } - - return this._getLatestPrunedEntity(repo, findOptions.where.id, blockNumber + 1); - } - - async _getLatestPrunedEntity (repo: Repository, id: string, canonicalBlockNumber: number): Promise { - // Filter out latest entity from pruned blocks. - const entityInPrunedRegion = await repo.createQueryBuilder('entity') - .innerJoinAndSelect('block_progress', 'block', 'block.block_hash = entity.block_hash') - .where('block.is_pruned = false') - .andWhere('entity.id = :id', { id }) - .andWhere('entity.block_number <= :canonicalBlockNumber', { canonicalBlockNumber }) - .orderBy('entity.block_number', 'DESC') - .limit(1) - .getOne(); - - return entityInPrunedRegion; - } - - async getFrothyRegion (queryRunner: QueryRunner, blockHash: string): Promise<{ canonicalBlockNumber: number, blockHashes: string[] }> { - const heirerchicalQuery = ` - WITH RECURSIVE cte_query AS - ( - SELECT - block_hash, - block_number, - parent_hash, - 1 as depth - FROM - block_progress - WHERE - block_hash = $1 - UNION ALL - SELECT - b.block_hash, - b.block_number, - b.parent_hash, - c.depth + 1 - FROM - block_progress b - INNER JOIN - cte_query c ON c.parent_hash = b.block_hash - WHERE - c.depth < $2 - ) - SELECT - block_hash, block_number - FROM - cte_query; - `; - - // Get blocks in the frothy region using heirarchical query. - const blocks = await queryRunner.query(heirerchicalQuery, [blockHash, MAX_REORG_DEPTH]); - const blockHashes = blocks.map(({ block_hash: blockHash }: any) => blockHash); - - // Canonical block is the block after the last block in frothy region. - const canonicalBlockNumber = blocks[blocks.length - 1].block_number + 1; - - return { canonicalBlockNumber, blockHashes }; - } - - async getContracts (repo: Repository): Promise { - return repo.createQueryBuilder('contract') - .getMany(); - } - - async saveContract (repo: Repository, address: string, startingBlock: number, kind?: string): Promise { - const contract = await repo - .createQueryBuilder() - .where('address = :address', { address }) - .getOne(); - - const entity = repo.create({ address, kind, startingBlock }); - - // If contract already present, overwrite fields. - if (contract) { - entity.id = contract.id; - } - - return repo.save(entity); - } - - cacheUpdatedEntity (repo: Repository, entity: any, pruned = false): void { - const tableName = repo.metadata.tableName; - - if (pruned) { - let entityIdMap = this._cachedEntities.latestPrunedEntities.get(tableName); - - if (!entityIdMap) { - entityIdMap = new Map(); - } - - entityIdMap.set(entity.id, _.cloneDeep(entity)); - this._cachedEntities.latestPrunedEntities.set(tableName, entityIdMap); - return; - } - - const frothyBlock = this._cachedEntities.frothyBlocks.get(entity.blockHash); - - // Update frothyBlock only if already present in cache. - // Might not be present when event processing starts without block processing on job retry. - if (frothyBlock) { - let entityIdMap = frothyBlock.entities.get(tableName); - - if (!entityIdMap) { - entityIdMap = new Map(); - } - - entityIdMap.set(entity.id, _.cloneDeep(entity)); - frothyBlock.entities.set(tableName, entityIdMap); - } - } - - async _fetchBlockCount (): Promise { - this._blockCount = await this._conn.getRepository('block_progress') - .count(); - - blockProgressCount.set(this._blockCount); - } - - async _fetchEventCount (): Promise { - this._eventCount = await this._conn.getRepository('event') - .count({ - where: { - eventName: Not(UNKNOWN_EVENT_NAME) - } - }); - - eventCount.set(this._eventCount); - } - - _buildQuery (repo: Repository, selectQueryBuilder: SelectQueryBuilder, where: Where = {}): SelectQueryBuilder { - Object.entries(where).forEach(([field, filters]) => { - filters.forEach((filter, index) => { - // Form the where clause. - let { not, operator, value } = filter; - const columnMetadata = repo.metadata.findColumnWithPropertyName(field); - assert(columnMetadata); - let whereClause = `"${selectQueryBuilder.alias}"."${columnMetadata.databaseName}" `; - - if (columnMetadata.relationMetadata) { - // For relation fields, use the id column. - const idColumn = columnMetadata.relationMetadata.joinColumns.find(column => column.referencedColumn?.propertyName === 'id'); - assert(idColumn); - whereClause = `"${selectQueryBuilder.alias}"."${idColumn.databaseName}" `; - } - - if (not) { - if (operator === 'equals') { - whereClause += '!'; - } else { - whereClause += 'NOT '; - } - } - - whereClause += `${OPERATOR_MAP[operator]} `; - - if (operator === 'in') { - whereClause += '(:...'; - } else { - // Convert to string type value as bigint type throws error in query. - value = value.toString(); - - whereClause += ':'; - } - - const variableName = `${field}${index}`; - whereClause += variableName; - - if (operator === 'in') { - whereClause += ')'; - - if (!value.length) { - whereClause = 'FALSE'; - } - } - - if (['contains', 'starts'].some(el => el === operator)) { - value = `%${value}`; - } - - if (['contains', 'ends'].some(el => el === operator)) { - value += '%'; - } - - selectQueryBuilder = selectQueryBuilder.andWhere(whereClause, { [variableName]: value }); - }); - }); - - return selectQueryBuilder; - } - - _orderQuery ( - repo: Repository, - selectQueryBuilder: SelectQueryBuilder, - orderOptions: { orderBy?: string, orderDirection?: string }, - columnPrefix = '' - ): SelectQueryBuilder { - const { orderBy, orderDirection } = orderOptions; - assert(orderBy); - - const columnMetadata = repo.metadata.findColumnWithPropertyName(orderBy); - assert(columnMetadata); - - return selectQueryBuilder.addOrderBy( - `"${selectQueryBuilder.alias}"."${columnPrefix}${columnMetadata.databaseName}"`, - orderDirection === 'desc' ? 'DESC' : 'ASC' - ); - } - - async _transformResults (queryRunner: QueryRunner, qb: SelectQueryBuilder, rawResults: any[]): Promise { - const transformer = new RawSqlResultsToEntityTransformer( - qb.expressionMap, - queryRunner.manager.connection.driver, - [], - [], - queryRunner - ); - - assert(qb.expressionMap.mainAlias); - return transformer.transform(rawResults, qb.expressionMap.mainAlias); - } -} diff --git a/packages/util/src/events.ts b/packages/util/src/events.ts index 8a65cd5d..d26b625e 100644 --- a/packages/util/src/events.ts +++ b/packages/util/src/events.ts @@ -7,13 +7,13 @@ import debug from 'debug'; import { PubSub } from 'apollo-server-express'; import { EthClient } from '@vulcanize/ipld-eth-client'; +import { OrderDirection } from '@cerc-io/util'; import { JobQueue } from './job-queue'; import { BlockProgressInterface, EventInterface, IndexerInterface } from './types'; import { MAX_REORG_DEPTH, JOB_KIND_PRUNE, JOB_KIND_INDEX, UNKNOWN_EVENT_NAME } from './constants'; import { createPruningJob, processBlockByNumber } from './common'; import { UpstreamConfig } from './config'; -import { OrderDirection } from './database'; const log = debug('vulcanize:events'); diff --git a/packages/util/src/fill.ts b/packages/util/src/fill.ts index 5415aae3..2ae9ee83 100644 --- a/packages/util/src/fill.ts +++ b/packages/util/src/fill.ts @@ -21,14 +21,21 @@ export const fillBlocks = async ( endBlock: number, prefetch: boolean, batchBlocks: number, + blockCid: boolean } ): Promise => { - let { startBlock, endBlock, prefetch, batchBlocks } = argv; + let { startBlock, endBlock, prefetch, batchBlocks, blockCid } = argv; if (startBlock > endBlock) { throw new Error(`endBlock ${endBlock} should be greater than or equal to startBlock ${startBlock}`); } + if (blockCid) { + // If true only fetch and updated block CID for indexed blocks. + await updateBlockCIDs(indexer, argv); + return; + } + const syncStatus = await indexer.getSyncStatus(); if (syncStatus) { @@ -120,7 +127,7 @@ const prefetchBlocks = async ( } const fetchBlockPromises = blocks.map(async block => { - const { blockHash, blockNumber, parentHash, timestamp } = block; + const { cid, blockHash, blockNumber, parentHash, timestamp } = block; const blockProgress = await indexer.getBlockProgress(blockHash); if (!blockProgress) { @@ -128,6 +135,7 @@ const prefetchBlocks = async ( // Save block progress in database. await indexer.saveBlockProgress({ + cid, blockHash, blockNumber, parentHash, @@ -150,3 +158,30 @@ const prefetchBlocks = async ( } } }; + +const updateBlockCIDs = async ( + indexer: IndexerInterface, + { startBlock, endBlock, batchBlocks }: { + startBlock: number, + endBlock: number, + batchBlocks: number, + } +) => { + for (let i = startBlock; i <= endBlock; i++) { + console.time(`time:fill#updateBlockCIDs-update-block-${i})}`); + const blocks = await indexer.getBlocks({ blockNumber: i }); + + const blockUpdatePromises = blocks.map(async (block: any) => { + const { cid, blockHash, blockNumber, parentHash, timestamp } = block; + const blockProgress = await indexer.getBlockProgress(blockHash); + + if (blockProgress) { + blockProgress.cid = cid; + await indexer.updateBlockProgress(blockProgress, blockProgress.lastProcessedEventIndex); + } + }); + + await Promise.all(blockUpdatePromises); + console.timeEnd(`time:fill#updateBlockCIDs-update-block-${i})}`); + } +}; diff --git a/packages/util/src/graph-decimal.ts b/packages/util/src/graph-decimal.ts index c3e87a79..b4c8c59e 100644 --- a/packages/util/src/graph-decimal.ts +++ b/packages/util/src/graph-decimal.ts @@ -29,6 +29,10 @@ export class GraphDecimal { return this.value.toString(); } + toJSON (): string { + return this.toString(); + } + toFixed (): string { this._checkOutOfRange(this); diff --git a/packages/util/src/indexer.ts b/packages/util/src/indexer.ts deleted file mode 100644 index c427b633..00000000 --- a/packages/util/src/indexer.ts +++ /dev/null @@ -1,381 +0,0 @@ -// -// Copyright 2021 Vulcanize, Inc. -// - -import assert from 'assert'; -import { DeepPartial, FindConditions, FindManyOptions } from 'typeorm'; -import debug from 'debug'; -import { ethers } from 'ethers'; - -import { EthClient } from '@vulcanize/ipld-eth-client'; -import { GetStorageAt, getStorageValue, StorageLayout } from '@vulcanize/solidity-mapper'; - -import { BlockProgressInterface, DatabaseInterface, EventInterface, SyncStatusInterface, ContractInterface } from './types'; -import { UNKNOWN_EVENT_NAME, JOB_KIND_CONTRACT, QUEUE_EVENT_PROCESSING } from './constants'; -import { JobQueue } from './job-queue'; -import { Where, QueryOptions } from './database'; - -const MAX_EVENTS_BLOCK_RANGE = 1000; - -const log = debug('vulcanize:indexer'); - -export interface ValueResult { - value: any; - proof?: { - data: string; - } -} - -export class Indexer { - _db: DatabaseInterface; - _ethClient: EthClient; - _getStorageAt: GetStorageAt; - _ethProvider: ethers.providers.BaseProvider; - _jobQueue: JobQueue; - - _watchedContracts: { [key: string]: ContractInterface } = {}; - - constructor (db: DatabaseInterface, ethClient: EthClient, ethProvider: ethers.providers.BaseProvider, jobQueue: JobQueue) { - this._db = db; - this._ethClient = ethClient; - this._ethProvider = ethProvider; - this._jobQueue = jobQueue; - this._getStorageAt = this._ethClient.getStorageAt.bind(this._ethClient); - } - - async fetchContracts (): Promise { - assert(this._db.getContracts); - - const contracts = await this._db.getContracts(); - - this._watchedContracts = contracts.reduce((acc: { [key: string]: ContractInterface }, contract) => { - acc[contract.address] = contract; - - return acc; - }, {}); - } - - async getSyncStatus (): Promise { - const dbTx = await this._db.createTransactionRunner(); - let res; - - try { - res = await this._db.getSyncStatus(dbTx); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - - return res; - } - - async updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force = false): Promise { - const dbTx = await this._db.createTransactionRunner(); - let res; - - try { - res = await this._db.updateSyncStatusIndexedBlock(dbTx, blockHash, blockNumber, force); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - - return res; - } - - async updateSyncStatusChainHead (blockHash: string, blockNumber: number, force = false): Promise { - const dbTx = await this._db.createTransactionRunner(); - let res; - - try { - res = await this._db.updateSyncStatusChainHead(dbTx, blockHash, blockNumber, force); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - - return res; - } - - async updateSyncStatusCanonicalBlock (blockHash: string, blockNumber: number, force = false): Promise { - const dbTx = await this._db.createTransactionRunner(); - let res; - - try { - res = await this._db.updateSyncStatusCanonicalBlock(dbTx, blockHash, blockNumber, force); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - - return res; - } - - async getBlocks (blockFilter: { blockNumber?: number, blockHash?: string }): Promise { - assert(blockFilter.blockHash || blockFilter.blockNumber); - const result = await this._ethClient.getBlocks(blockFilter); - const { allEthHeaderCids: { nodes: blocks } } = result; - - if (!blocks.length) { - try { - const blockHashOrNumber = blockFilter.blockHash || blockFilter.blockNumber as string | number; - await this._ethProvider.getBlock(blockHashOrNumber); - } catch (error: any) { - // eth_getBlockByHash will update statediff but takes some time. - // The block is not returned immediately and an error is thrown so that it is fetched in the next job retry. - if (error.code !== ethers.utils.Logger.errors.SERVER_ERROR) { - throw error; - } - - log('Block not found. Fetching block after RPC call.'); - } - } - - return blocks; - } - - async getBlockProgress (blockHash: string): Promise { - return this._db.getBlockProgress(blockHash); - } - - async getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise { - return this._db.getBlockProgressEntities(where, options); - } - - async getBlocksAtHeight (height: number, isPruned: boolean): Promise { - return this._db.getBlocksAtHeight(height, isPruned); - } - - async markBlocksAsPruned (blocks: BlockProgressInterface[]): Promise { - const dbTx = await this._db.createTransactionRunner(); - - try { - await this._db.markBlocksAsPruned(dbTx, blocks); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - } - - async updateBlockProgress (block: BlockProgressInterface, lastProcessedEventIndex: number): Promise { - const dbTx = await this._db.createTransactionRunner(); - - try { - const updatedBlock = await this._db.updateBlockProgress(dbTx, block, lastProcessedEventIndex); - await dbTx.commitTransaction(); - - return updatedBlock; - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - } - - async getEvent (id: string): Promise { - return this._db.getEvent(id); - } - - async fetchBlockEvents (block: DeepPartial, fetchEvents: (block: DeepPartial) => Promise[]>): Promise[]> { - assert(block.blockHash); - - log(`getBlockEvents: fetching from upstream server ${block.blockHash}`); - console.time('time:indexer#fetchBlockEvents-fetchAndSaveEvents'); - const events = await fetchEvents(block); - console.timeEnd('time:indexer#fetchBlockEvents-fetchAndSaveEvents'); - log(`getBlockEvents: fetched for block: ${block.blockHash} num events: ${events.length}`); - - return events; - } - - async saveBlockProgress (block: DeepPartial): Promise { - const dbTx = await this._db.createTransactionRunner(); - let res; - - try { - res = await this._db.saveBlockProgress(dbTx, block); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - - return res; - } - - async getBlockEvents (blockHash: string, where: Where, queryOptions: QueryOptions): Promise> { - return this._db.getBlockEvents(blockHash, where, queryOptions); - } - - async getEventsByFilter (blockHash: string, contract: string, name: string | null): Promise> { - if (contract) { - const watchedContract = await this.isWatchedContract(contract); - if (!watchedContract) { - throw new Error('Not a watched contract'); - } - } - - const where: Where = { - eventName: [{ - value: UNKNOWN_EVENT_NAME, - not: true, - operator: 'equals' - }] - }; - - if (contract) { - where.contract = [ - { value: contract, operator: 'equals', not: false } - ]; - } - - if (name) { - where.eventName = [ - { value: name, operator: 'equals', not: false } - ]; - } - - const events = await this._db.getBlockEvents(blockHash, where); - log(`getEvents: db hit, num events: ${events.length}`); - - return events; - } - - async removeUnknownEvents (eventEntityClass: new () => EventInterface, block: BlockProgressInterface): Promise { - const dbTx = await this._db.createTransactionRunner(); - - try { - await this._db.removeEntities( - dbTx, - eventEntityClass, - { - block: { id: block.id }, - eventName: UNKNOWN_EVENT_NAME - } - ); - - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - } - - async getAncestorAtDepth (blockHash: string, depth: number): Promise { - return this._db.getAncestorAtDepth(blockHash, depth); - } - - async saveEventEntity (dbEvent: EventInterface): Promise { - const dbTx = await this._db.createTransactionRunner(); - let res; - - try { - res = await this._db.saveEventEntity(dbTx, dbEvent); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - - return res; - } - - async saveEvents (dbEvents: EventInterface[]): Promise { - const dbTx = await this._db.createTransactionRunner(); - - try { - await this._db.saveEvents(dbTx, dbEvents); - await dbTx.commitTransaction(); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - } - - async getProcessedBlockCountForRange (fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }> { - return this._db.getProcessedBlockCountForRange(fromBlockNumber, toBlockNumber); - } - - async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise> { - if (toBlockNumber <= fromBlockNumber) { - throw new Error('toBlockNumber should be greater than fromBlockNumber'); - } - - if ((toBlockNumber - fromBlockNumber) > MAX_EVENTS_BLOCK_RANGE) { - throw new Error(`Max range (${MAX_EVENTS_BLOCK_RANGE}) exceeded`); - } - - return this._db.getEventsInRange(fromBlockNumber, toBlockNumber); - } - - isWatchedContract (address : string): ContractInterface | undefined { - return this._watchedContracts[address]; - } - - async watchContract (address: string, kind: string, startingBlock: number): Promise { - assert(this._db.saveContract); - const dbTx = await this._db.createTransactionRunner(); - - // Always use the checksum address (https://docs.ethers.io/v5/api/utils/address/#utils-getAddress). - const contractAddress = ethers.utils.getAddress(address); - - try { - const contract = await this._db.saveContract(dbTx, contractAddress, kind, startingBlock); - this.cacheContract(contract); - await dbTx.commitTransaction(); - - await this._jobQueue.pushJob( - QUEUE_EVENT_PROCESSING, - { - kind: JOB_KIND_CONTRACT, - contract - }, - { priority: 1 } - ); - } catch (error) { - await dbTx.rollbackTransaction(); - throw error; - } finally { - await dbTx.release(); - } - } - - cacheContract (contract: ContractInterface): void { - this._watchedContracts[contract.address] = contract; - } - - async getStorageValue (storageLayout: StorageLayout, blockHash: string, token: string, variable: string, ...mappingKeys: any[]): Promise { - return getStorageValue( - storageLayout, - this._getStorageAt, - blockHash, - token, - variable, - ...mappingKeys - ); - } -} diff --git a/packages/util/src/job-queue.ts b/packages/util/src/job-queue.ts index 49e373e8..aec11da2 100644 --- a/packages/util/src/job-queue.ts +++ b/packages/util/src/job-queue.ts @@ -6,7 +6,7 @@ import assert from 'assert'; import debug from 'debug'; import PgBoss from 'pg-boss'; -import { jobCount, lastJobCompletedOn } from './metrics'; +import { jobCount, lastJobCompletedOn } from '@cerc-io/util'; interface Config { dbConnectionString: string diff --git a/packages/util/src/job-runner.ts b/packages/util/src/job-runner.ts index ac34c5c1..b4c45ee2 100644 --- a/packages/util/src/job-runner.ts +++ b/packages/util/src/job-runner.ts @@ -6,13 +6,13 @@ import assert from 'assert'; import debug from 'debug'; import { DeepPartial, In } from 'typeorm'; -import { JobQueueConfig } from './config'; +import { JobQueueConfig, lastBlockNumEvents, lastBlockProcessDuration, lastProcessedBlockNumber } from '@cerc-io/util'; + import { JOB_KIND_INDEX, JOB_KIND_PRUNE, JOB_KIND_EVENTS, JOB_KIND_CONTRACT, MAX_REORG_DEPTH, QUEUE_BLOCK_PROCESSING, QUEUE_EVENT_PROCESSING, UNKNOWN_EVENT_NAME } from './constants'; import { JobQueue } from './job-queue'; import { EventInterface, IndexerInterface, SyncStatusInterface } from './types'; import { wait } from './misc'; import { createPruningJob } from './common'; -import { eventProcessingLoadEntityCacheHitCount, eventProcessingLoadEntityCount, lastBlockNumEvents, lastBlockProcessDuration, lastProcessedBlockNumber } from './metrics'; const log = debug('vulcanize:job-runner'); @@ -121,7 +121,7 @@ export class JobRunner { } async _indexBlock (job: any, syncStatus: SyncStatusInterface): Promise { - const { data: { blockHash, blockNumber, parentHash, priority, timestamp } } = job; + const { data: { cid, blockHash, blockNumber, parentHash, priority, timestamp } } = job; const indexBlockStartTime = new Date(); @@ -179,10 +179,11 @@ export class JobRunner { throw new Error(message); } - const [{ blockNumber: parentBlockNumber, parentHash: grandparentHash, timestamp: parentTimestamp }] = blocks; + const [{ cid: parentCid, blockNumber: parentBlockNumber, parentHash: grandparentHash, timestamp: parentTimestamp }] = blocks; await this._jobQueue.pushJob(QUEUE_BLOCK_PROCESSING, { kind: JOB_KIND_INDEX, + cid: parentCid, blockHash: parentHash, blockNumber: parentBlockNumber, parentHash: grandparentHash, @@ -203,6 +204,7 @@ export class JobRunner { await this._jobQueue.pushJob(QUEUE_BLOCK_PROCESSING, { kind: JOB_KIND_INDEX, + cid: parentBlock.cid, blockHash: parentHash, blockNumber: parentBlock.blockNumber, parentHash: parentBlock.parentHash, @@ -232,6 +234,7 @@ export class JobRunner { console.time('time:job-runner#_indexBlock-saveBlockProgress'); blockProgress = await this._indexer.saveBlockProgress({ + cid, blockHash, blockNumber, parentHash, @@ -341,8 +344,6 @@ export class JobRunner { dbEvent.eventInfo = JSON.stringify(eventInfo); } - eventProcessingLoadEntityCount.set(0); - eventProcessingLoadEntityCacheHitCount.set(0); await this._indexer.processEvent(dbEvent); } @@ -350,10 +351,6 @@ export class JobRunner { if (this._jobQueueConfig.lazyUpdateBlockProgress) { block.lastProcessedEventIndex = dbEvent.index; block.numProcessedEvents++; - - if (block.numProcessedEvents >= block.numEvents) { - block.isComplete = true; - } } else { block = await this._indexer.updateBlockProgress(block, dbEvent.index); } @@ -367,9 +364,6 @@ export class JobRunner { const watchedContract = this._indexer.isWatchedContract(dbEvent.contract); if (watchedContract) { - eventProcessingLoadEntityCount.set(0); - eventProcessingLoadEntityCacheHitCount.set(0); - // Events of contract added in same block might be processed multiple times. // This is because there is no check for lastProcessedEventIndex against these events. await this._indexer.processEvent(dbEvent); @@ -385,19 +379,18 @@ export class JobRunner { } console.timeEnd('time:job-runner#_processEvents-processing_events'); - - // Save events after block processing complete. - await this._indexer.saveEvents(dbEvents.filter(event => event.eventName !== UNKNOWN_EVENT_NAME)); + block.isComplete = true; + + // Save events and update block after block processing complete. + console.time('time:job-runner#_processEvents-updateBlockProgress-saveEvents'); + await Promise.all([ + this._indexer.updateBlockProgress(block, block.lastProcessedEventIndex), + this._indexer.saveEvents(dbEvents.filter(event => event.eventName !== UNKNOWN_EVENT_NAME)) + ]); + console.timeEnd('time:job-runner#_processEvents-updateBlockProgress-saveEvents'); this._blockEventsMap.delete(block.blockHash); log('size:job-runner#_processEvents-_blockEventsMap:', this._blockEventsMap.size); - if (this._jobQueueConfig.lazyUpdateBlockProgress) { - // Update in database at end of all events processing. - console.time('time:job-runner#_processEvents-updateBlockProgress'); - await this._indexer.updateBlockProgress(block, block.lastProcessedEventIndex); - console.timeEnd('time:job-runner#_processEvents-updateBlockProgress'); - } - console.timeEnd('time:job-runner#_processEvents-events'); } diff --git a/packages/util/src/metrics.ts b/packages/util/src/metrics.ts deleted file mode 100644 index 1a139043..00000000 --- a/packages/util/src/metrics.ts +++ /dev/null @@ -1,150 +0,0 @@ -import promClient, { register } from 'prom-client'; -import express, { Application } from 'express'; -import { createConnection } from 'typeorm'; -import debug from 'debug'; -import assert from 'assert'; - -import { Config } from './config'; -import { IndexerInterface } from './types'; - -const DB_SIZE_QUERY = 'SELECT pg_database_size(current_database())'; - -const log = debug('vulcanize:metrics'); - -// Create custom metrics -export const jobCount = new promClient.Gauge({ - name: 'pgboss_jobs_total', - help: 'Total entries in job table', - labelNames: ['state', 'name'] as const -}); - -export const lastJobCompletedOn = new promClient.Gauge({ - name: 'pgboss_last_job_completed_timestamp_seconds', - help: 'Last job completed timestamp', - labelNames: ['name'] as const -}); - -export const lastProcessedBlockNumber = new promClient.Gauge({ - name: 'last_processed_block_number', - help: 'Last processed block number' -}); - -export const lastBlockProcessDuration = new promClient.Gauge({ - name: 'last_block_process_duration_seconds', - help: 'Last block process duration (seconds)' -}); - -export const lastBlockNumEvents = new promClient.Gauge({ - name: 'last_block_num_events_total', - help: 'Number of events in the last block' -}); - -export const blockProgressCount = new promClient.Gauge({ - name: 'block_progress_total', - help: 'Total entries in block_progress table' -}); - -export const eventCount = new promClient.Gauge({ - name: 'event_total', - help: 'Total entries in event table' -}); - -export const eventProcessingLoadEntityCount = new promClient.Gauge({ - name: 'event_processing_load_entity_total', - help: 'Total load entities in a single event processing' -}); - -export const eventProcessingLoadEntityCacheHitCount = new promClient.Gauge({ - name: 'event_processing_load_entity_cache_hit_total', - help: 'Total load entities hitting cache in a single event processing' -}); - -export const eventProcessingLoadEntityDBQueryDuration = new promClient.Histogram({ - name: 'event_processing_load_entity_db_query_seconds', - help: 'Duration of DB query made in event processing' -}); - -export const eventProcessingEthCallDuration = new promClient.Histogram({ - name: 'event_processing_eth_call_duration_seconds', - help: 'Duration of eth_calls made in event processing' -}); - -// Export metrics on a server -const app: Application = express(); - -export async function startMetricsServer (config: Config, indexer: IndexerInterface): Promise { - if (!config.metrics) { - log('Metrics is disabled. To enable add metrics host and port.'); - return; - } - - assert(config.metrics.host, 'Missing config for metrics host'); - assert(config.metrics.port, 'Missing config for metrics port'); - - // eslint-disable-next-line no-new - new promClient.Gauge({ - name: 'sync_status_block_number', - help: 'Sync status table info', - labelNames: ['kind'] as const, - async collect () { - const syncStatus = await indexer.getSyncStatus(); - - if (syncStatus) { - this.set({ kind: 'latest_indexed' }, syncStatus.latestIndexedBlockNumber); - this.set({ kind: 'latest_canonical' }, syncStatus.latestCanonicalBlockNumber); - this.set({ kind: 'chain_head' }, syncStatus.chainHeadBlockNumber); - } - } - }); - - await registerDBSizeMetrics(config); - - // Add default metrics - promClient.collectDefaultMetrics(); - - app.get('/metrics', async (req, res) => { - res.setHeader('Content-Type', register.contentType); - - const metrics = await register.metrics(); - res.send(metrics); - }); - - app.listen(config.metrics.port, config.metrics.host, () => { - log(`Metrics exposed at http://${config.metrics.host}:${config.metrics.port}/metrics`); - }); -} - -const registerDBSizeMetrics = async ({ database, jobQueue }: Config): Promise => { - const [watcherConn, jobQueueConn] = await Promise.all([ - createConnection({ - ...database, - name: 'metrics-watcher-connection', - synchronize: false - }), - createConnection({ - type: 'postgres', - url: jobQueue.dbConnectionString, - name: 'metrics-job-queue-connection', - synchronize: false - }) - ]); - - // eslint-disable-next-line no-new - new promClient.Gauge({ - name: 'database_size_bytes', - help: 'Watcher database sizes in bytes', - labelNames: ['type'] as const, - async collect () { - const [ - [{ pg_database_size: watcherDBSize }], - [{ pg_database_size: jobQueueDBSize }] - ] = await Promise.all([ - watcherConn.query(DB_SIZE_QUERY), - jobQueueConn.query(DB_SIZE_QUERY) - ]); - - this.set({ type: 'watcher' }, Number(watcherDBSize)); - this.set({ type: 'job-queue' }, Number(jobQueueDBSize)); - } - }); -}; diff --git a/packages/util/src/types.ts b/packages/util/src/types.ts index deff0b41..2394a141 100644 --- a/packages/util/src/types.ts +++ b/packages/util/src/types.ts @@ -2,12 +2,13 @@ // Copyright 2021 Vulcanize, Inc. // -import { Connection, DeepPartial, FindConditions, FindManyOptions, QueryRunner } from 'typeorm'; +import { DeepPartial } from 'typeorm'; -import { Where, QueryOptions, CachedEntities } from './database'; +import { IndexerInterface as BaseIndexerInterface } from '@cerc-io/util'; export interface BlockProgressInterface { id: number; + cid: string; blockHash: string; parentHash: string; blockNumber: number; @@ -28,6 +29,8 @@ export interface SyncStatusInterface { latestIndexedBlockNumber: number; latestCanonicalBlockHash: string; latestCanonicalBlockNumber: number; + initialIndexedBlockHash: string; + initialIndexedBlockNumber: number; } export interface EventInterface { @@ -47,32 +50,13 @@ export interface ContractInterface { address: string; startingBlock: number; kind: string; + checkpoint: boolean; } -export interface IndexerInterface { - getBlockProgress (blockHash: string): Promise - getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise - getEvent (id: string): Promise - getSyncStatus (): Promise; - getBlocks (blockFilter: { blockHash?: string, blockNumber?: number }): Promise - getBlocksAtHeight (height: number, isPruned: boolean): Promise; - getBlockEvents (blockHash: string, where: Where, queryOptions: QueryOptions): Promise> - getAncestorAtDepth (blockHash: string, depth: number): Promise +export interface IndexerInterface extends BaseIndexerInterface { fetchBlockEvents (block: DeepPartial): Promise[]> saveBlockProgress (block: DeepPartial): Promise - removeUnknownEvents (block: BlockProgressInterface): Promise - updateBlockProgress (block: BlockProgressInterface, lastProcessedEventIndex: number): Promise - updateSyncStatusChainHead (blockHash: string, blockNumber: number, force?: boolean): Promise - updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force?: boolean): Promise - updateSyncStatusCanonicalBlock (blockHash: string, blockNumber: number, force?: boolean): Promise - markBlocksAsPruned (blocks: BlockProgressInterface[]): Promise; - saveEventEntity (dbEvent: EventInterface): Promise; saveEvents (dbEvents: EventInterface[]): Promise; - processEvent (event: EventInterface): Promise; - processBlock (blockProgress: BlockProgressInterface): Promise; - parseEventNameAndArgs?: (kind: string, logObj: any) => any; - isWatchedContract: (address: string) => ContractInterface | undefined; - cacheContract?: (contract: ContractInterface) => void; } export interface EventWatcherInterface { @@ -80,28 +64,3 @@ export interface EventWatcherInterface { initBlockProcessingOnCompleteHandler (): Promise initEventProcessingOnCompleteHandler (): Promise } - -export interface DatabaseInterface { - _conn: Connection; - createTransactionRunner(): Promise; - getBlocksAtHeight (height: number, isPruned: boolean): Promise; - getBlockProgress (blockHash: string): Promise; - getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise - getBlockEvents (blockHash: string, where?: Where, queryOptions?: QueryOptions): Promise; - getEvent (id: string): Promise - getSyncStatus (queryRunner: QueryRunner): Promise - getAncestorAtDepth (blockHash: string, depth: number): Promise - getProcessedBlockCountForRange (fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }>; - getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise>; - markBlocksAsPruned (queryRunner: QueryRunner, blocks: BlockProgressInterface[]): Promise; - saveBlockProgress (queryRunner: QueryRunner, block: DeepPartial): Promise - updateBlockProgress (queryRunner: QueryRunner, block: BlockProgressInterface, lastProcessedEventIndex: number): Promise - updateSyncStatusIndexedBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force?: boolean): Promise; - updateSyncStatusChainHead (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force?: boolean): Promise; - updateSyncStatusCanonicalBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force?: boolean): Promise; - saveEvents (queryRunner: QueryRunner, events: DeepPartial[]): Promise; - saveEventEntity (queryRunner: QueryRunner, entity: EventInterface): Promise; - removeEntities (queryRunner: QueryRunner, entity: new () => Entity, findConditions?: FindConditions): Promise; - getContracts: () => Promise - saveContract: (queryRunner: QueryRunner, contractAddress: string, kind: string, startingBlock: number) => Promise -} diff --git a/packages/util/test/actions.ts b/packages/util/test/actions.ts index 12f90e33..dde60726 100644 --- a/packages/util/test/actions.ts +++ b/packages/util/test/actions.ts @@ -5,6 +5,7 @@ import { ethers, Contract, ContractTransaction, Signer, BigNumber, utils } from 'ethers'; import assert from 'assert'; +import { DatabaseInterface } from '@cerc-io/util'; import { abi as NFTD_ABI, bytecode as NFTD_BYTECODE @@ -32,11 +33,7 @@ import { bytecode as WETH9_BYTECODE } from '../artifacts/test/contracts/WETH9.sol/WETH9.json'; -import { DatabaseInterface } from '../src/types'; - -export { abi as NFPM_ABI } from '@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json'; -export { abi as TESTERC20_ABI } from '../artifacts/test/contracts/TestERC20.sol/TestERC20.json'; - +export { NFPM_ABI, TESTERC20_ABI }; export const TICK_MIN = -887272; export const TICK_MAX = 887272; diff --git a/yarn.lock b/yarn.lock index 6c661606..53e1672b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,22 +190,6 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - "@eslint/eslintrc@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" @@ -221,59 +205,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereum-waffle/chai@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.3.1.tgz#3f20b810d0fa516f19af93c50c3be1091333fa8e" - integrity sha512-+vepCjttfOzCSnmiVEmd1bR8ctA2wYVrtWa8bDLhnTpj91BIIHotNDTwpeq7fyjrOCIBTN3Ai8ACfjNoatc4OA== - dependencies: - "@ethereum-waffle/provider" "^3.3.1" - ethers "^5.0.0" - -"@ethereum-waffle/compiler@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.3.1.tgz#946128fd565aa4347075fd716dbd0f3f38189280" - integrity sha512-X/TeQugt94AQwXEdCjIQxcXYGawNulVBYEBE7nloj4wE/RBxNolXwjoVNjcS4kuiMMbKkdO0JkL5sn6ixx8bDg== - dependencies: - "@resolver-engine/imports" "^0.3.3" - "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^2.0.0" - "@types/mkdirp" "^0.5.2" - "@types/node-fetch" "^2.5.5" - ethers "^5.0.1" - mkdirp "^0.5.1" - node-fetch "^2.6.0" - solc "^0.6.3" - ts-generator "^0.1.1" - typechain "^3.0.0" - -"@ethereum-waffle/ens@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.4.tgz#c486be4879ea7107e1ff01b24851a5e44f5946ce" - integrity sha512-lkRVPCEkk7KOwH9MqFMB+gL0X8cZNsm+MnKpP9CNbAyhFos2sCDGcY8t6BA12KBK6pdMuuRXPxYL9WfPl9bqSQ== - dependencies: - "@ensdomains/ens" "^0.4.4" - "@ensdomains/resolver" "^0.2.4" - ethers "^5.0.1" - -"@ethereum-waffle/mock-contract@^3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.2.2.tgz#5749b03cbb4850150f81cf66151c4523eb7436f0" - integrity sha512-H60Cc5C7sYNU4LuPMSKDh8YIaN9/fkwEjznY78CEbOosO+lMlFYdA+5VZjeDGDuYKfsBqsocQdkj1CRyoi1KNw== - dependencies: - "@ethersproject/abi" "^5.0.1" - ethers "^5.0.1" - -"@ethereum-waffle/provider@^3.3.0", "@ethereum-waffle/provider@^3.3.1": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.3.2.tgz#33677baf6af5cbb087c3072d84f38c152968ebb1" - integrity sha512-ilz6cXK0ylSKCmZktTMpY4gjo0CN6rb86JfN7+RZYk6tKtZA6sXoOe95skWEQkGf1fZk7G817fTzLb0CmFDp1g== - dependencies: - "@ethereum-waffle/ens" "^3.2.4" - ethers "^5.0.1" - ganache-core "^2.13.2" - patch-package "^6.2.2" - postinstall-postinstall "^2.1.0" - "@ethereumjs/block@^3.2.1", "@ethereumjs/block@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.3.0.tgz#a1b3baec831c71c0d9e7f6145f25e919cff4939c" @@ -344,425 +275,196 @@ rustbn.js "~0.2.0" util.promisify "^1.0.1" -"@ethersproject/abi@5.0.0-beta.153": - version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" - -"@ethersproject/abi@5.2.0", "@ethersproject/abi@^5.0.1": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.2.0.tgz#e2ca0b7f7e3b83e4d427ed8b38fdc1c48e2bb00f" - integrity sha512-24ExfHa0VbIOUHbB36b6lCVmWkaIVmrd9/m8MICtmSsRKzlugWqUD0B8g0zrRylXNxAOc3V6T4xKJ8jEDSvp3w== - dependencies: - "@ethersproject/address" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/constants" "^5.2.0" - "@ethersproject/hash" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - -"@ethersproject/abi@5.3.0", "@ethersproject/abi@^5.2.0", "@ethersproject/abi@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.0.tgz#00f0647d906edcd32c50b16ab9c98f83e208dcf1" - integrity sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw== - dependencies: - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/abstract-provider@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.2.0.tgz#b5c24b162f119b5d241738ded9555186013aa77d" - integrity sha512-Xi7Pt+CulRijc/vskBGIaYMEhafKjoNx8y4RNj/dnSpXHXScOJUSTtypqGBUngZddRbcwZGbHwEr6DZoKZwIZA== - dependencies: - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/networks" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/transactions" "^5.2.0" - "@ethersproject/web" "^5.2.0" - -"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.2.0", "@ethersproject/abstract-provider@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz#f4c0ae4a4cef9f204d7781de805fd44b72756c81" - integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/networks" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/web" "^5.3.0" - -"@ethersproject/abstract-signer@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.2.0.tgz#8e291fb6558b4190fb3e2fe440a9ffd092a2f459" - integrity sha512-JTXzLUrtoxpOEq1ecH86U7tstkEa9POKAGbGBb+gicbjGgzYYkLR4/LD83SX2/JNWvtYyY8t5errt5ehiy1gxQ== - dependencies: - "@ethersproject/abstract-provider" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - -"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.2.0", "@ethersproject/abstract-signer@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz#05172b653e15b535ed5854ef5f6a72f4b441052d" - integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg== - dependencies: - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - -"@ethersproject/address@5.2.0", "@ethersproject/address@>=5.0.0-beta.128": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.2.0.tgz#afcfa92db84582f54a60a9da361cea4aae450a69" - integrity sha512-2YfZlalWefOEfnr/CdqKRrgMgbKidYc+zG4/ilxSdcryZSux3eBU5/5btAT/hSiaHipUjd8UrWK8esCBHU6QNQ== - dependencies: - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/rlp" "^5.2.0" - -"@ethersproject/address@5.3.0", "@ethersproject/address@^5.2.0", "@ethersproject/address@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.3.0.tgz#e53b69eacebf332e8175de814c5e6507d6932518" - integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/rlp" "^5.3.0" - -"@ethersproject/base64@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.2.0.tgz#e01066d25e5b4e8a051545163bee5def47bd9534" - integrity sha512-D9wOvRE90QBI+yFsKMv0hnANiMzf40Xicq9JZbV9XYzh7srImmwmMcReU2wHjOs9FtEgSJo51Tt+sI1dKPYKDg== - dependencies: - "@ethersproject/bytes" "^5.2.0" - -"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.2.0", "@ethersproject/base64@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.3.0.tgz#b831fb35418b42ad24d943c557259062b8640824" - integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw== - dependencies: - "@ethersproject/bytes" "^5.3.0" - -"@ethersproject/basex@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.2.0.tgz#f921039e3bdfdab8c5a7ba8b21e81c83fc1ab98b" - integrity sha512-Oo7oX7BmaHLY/8ZsOLI5W0mrSwPBb1iboosN17jfK/4vGAtKjAInDai9I72CzN4NRJaMN5FkFLoPYywGqgGHlg== - dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - -"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.2.0", "@ethersproject/basex@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.3.0.tgz#02dea3ab8559ae625c6d548bc11773432255c916" - integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - -"@ethersproject/bignumber@5.2.0", "@ethersproject/bignumber@>=5.0.0-beta.130": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.2.0.tgz#03f91ea740c5adb6f8c6a2e91bb4ee5ffaff5503" - integrity sha512-+MNQTxwV7GEiA4NH/i51UqQ+lY36O0rxPdV+0qzjFSySiyBlJpLk6aaa4UTvKmYWlI7YKZm6vuyCENeYn7qAOw== - dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - bn.js "^4.4.0" - -"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@^5.2.0", "@ethersproject/bignumber@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db" - integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.2.0", "@ethersproject/bytes@>=5.0.0-beta.129": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.2.0.tgz#327917d5a1600f92fd2a9da4052fa6d974583132" - integrity sha512-O1CRpvJDnRTB47vvW8vyqojUZxVookb4LJv/s06TotriU3Xje5WFvlvXJu1yTchtxTz9BbvJw0lFXKpyO6Dn7w== - dependencies: - "@ethersproject/logger" "^5.2.0" - -"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@^5.2.0", "@ethersproject/bytes@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9" - integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw== - dependencies: - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/constants@5.2.0", "@ethersproject/constants@>=5.0.0-beta.128": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.2.0.tgz#ccea78ce325f78abfe7358397c03eec570518d92" - integrity sha512-p+34YG0KbHS20NGdE+Ic0M6egzd7cDvcfoO9RpaAgyAYm3V5gJVqL7UynS87yCt6O6Nlx6wRFboPiM5ctAr+jA== - dependencies: - "@ethersproject/bignumber" "^5.2.0" - -"@ethersproject/constants@5.3.0", "@ethersproject/constants@^5.2.0", "@ethersproject/constants@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77" - integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - -"@ethersproject/contracts@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.2.0.tgz#f54e12ec4a323f2bf93c338034839cc6dfc1e347" - integrity sha512-/2fg5tWPG6Z4pciEWpwGji3ggGA5j0ChVNF7NTmkOhvFrrJuWnRpzbvYA00nz8tBDNCOV3cwub5zfWRpgwYEJQ== - dependencies: - "@ethersproject/abi" "^5.2.0" - "@ethersproject/abstract-provider" "^5.2.0" - "@ethersproject/abstract-signer" "^5.2.0" - "@ethersproject/address" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/constants" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/transactions" "^5.2.0" - -"@ethersproject/contracts@5.3.0", "@ethersproject/contracts@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.3.0.tgz#ad699a3abaae30bfb6422cf31813a663b2d4099c" - integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg== - dependencies: - "@ethersproject/abi" "^5.3.0" - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - -"@ethersproject/hash@5.2.0", "@ethersproject/hash@>=5.0.0-beta.128": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.2.0.tgz#2d21901eafc5bdb738b4ad96bee364d371ec724b" - integrity sha512-wEGry2HFFSssFiNEkFWMzj1vpdFv4rQlkBp41UfL6J58zKGNycoAWimokITDMk8p7548MKr27h48QfERnNKkRw== - dependencies: - "@ethersproject/abstract-signer" "^5.2.0" - "@ethersproject/address" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - -"@ethersproject/hash@5.3.0", "@ethersproject/hash@^5.2.0", "@ethersproject/hash@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.3.0.tgz#f65e3bf3db3282df4da676db6cfa049535dd3643" - integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w== - dependencies: - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/hdnode@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.2.0.tgz#efea9b2f713e55aa5ba23cc62b4aac6d08dcfa53" - integrity sha512-ffq2JrW5AftCmfWZ8DxpdWdw/x06Yn+e9wrWHLpj8If1+w87W4LbTMRUaUmO1DUSN8H8g/6kMUKCTJPVuxsuOw== - dependencies: - "@ethersproject/abstract-signer" "^5.2.0" - "@ethersproject/basex" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/pbkdf2" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/sha2" "^5.2.0" - "@ethersproject/signing-key" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - "@ethersproject/transactions" "^5.2.0" - "@ethersproject/wordlists" "^5.2.0" - -"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.2.0", "@ethersproject/hdnode@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.3.0.tgz#26fed65ffd5c25463fddff13f5fb4e5617553c94" - integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g== - dependencies: - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/basex" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/pbkdf2" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - "@ethersproject/signing-key" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/wordlists" "^5.3.0" - -"@ethersproject/json-wallets@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.2.0.tgz#d41c7c39e4d236b586e26e2145b09ac49dc56608" - integrity sha512-iWxSm9XiugEtaehYD6w1ImmXeatjcGcrQvffZVJHH1UqV4FckDzrOYnZBRHPQRYlnhNVrGTld1+S0Cu4MB8gdw== - dependencies: - "@ethersproject/abstract-signer" "^5.2.0" - "@ethersproject/address" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/hdnode" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/pbkdf2" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/random" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - "@ethersproject/transactions" "^5.2.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.2.0", "@ethersproject/json-wallets@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz#7b1a5ff500c12aa8597ae82c8939837b0449376e" - integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw== - dependencies: - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/hdnode" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/pbkdf2" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/random" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.3.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.3.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.3.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.3.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.3.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.3.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.3.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.3.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.3.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.2.0", "@ethersproject/keccak256@>=5.0.0-beta.127": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.2.0.tgz#15257862807c23f24a3209d1016d322dca85a464" - integrity sha512-LqyxTwVANga5Y3L1yo184czW6b3PibabN8xyE/eOulQLLfXNrHHhwrOTpOhoVRWCICVCD/5SjQfwqTrczjS7jQ== - dependencies: - "@ethersproject/bytes" "^5.2.0" - js-sha3 "0.5.7" - -"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@^5.2.0", "@ethersproject/keccak256@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be" - integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ== - dependencies: - "@ethersproject/bytes" "^5.3.0" - js-sha3 "0.5.7" - -"@ethersproject/logger@5.2.0", "@ethersproject/logger@>=5.0.0-beta.129": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.2.0.tgz#accf5348251f78b6c8891af67f42490a4ea4e5ae" - integrity sha512-dPZ6/E3YiArgG8dI/spGkaRDry7YZpCntf4gm/c6SI8Mbqiihd7q3nuLN5VvDap/0K3xm3RE1AIUOcUwwh2ezQ== - -"@ethersproject/logger@5.3.0", "@ethersproject/logger@^5.2.0", "@ethersproject/logger@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0" - integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA== - -"@ethersproject/networks@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.2.0.tgz#66c23c6ac477dd703645b2c971ac842d8b8aa524" - integrity sha512-q+htMgq7wQoEnjlkdHM6t1sktKxNbEB/F6DQBPNwru7KpQ1R0n0UTIXJB8Rb7lSnvjqcAQ40X3iVqm94NJfYDw== +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: - "@ethersproject/logger" "^5.2.0" + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" -"@ethersproject/networks@5.3.0", "@ethersproject/networks@^5.2.0", "@ethersproject/networks@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.0.tgz#d8ad06eb107c69fb8651f4c81ddd0e88944fdfea" - integrity sha512-XGbD9MMgqrR7SYz8o6xVgdG+25v7YT5vQG8ZdlcLj2I7elOBM7VNeQrnxfSN7rWQNcqu2z80OM29gGbQz+4Low== - dependencies: - "@ethersproject/logger" "^5.3.0" +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.3.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/pbkdf2@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.2.0.tgz#8166a7a7238a5fd1d9bb6eb2000fea0f19fdde06" - integrity sha512-qKOoO6yir/qnAgg6OP3U4gRuZ6jl9P7xwggRu/spVfnuaR+wa490AatWLqB1WOXKf6JFjm5yOaT/T5fCICQVdQ== +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.3.0", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/sha2" "^5.2.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.2.0", "@ethersproject/pbkdf2@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz#8adbb41489c3c9f319cc44bc7d3e6095fd468dc8" - integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - -"@ethersproject/properties@5.2.0", "@ethersproject/properties@>=5.0.0-beta.131": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.2.0.tgz#8fadf367f7ac7357019d0224aa579b234c545ac1" - integrity sha512-oNFkzcoGwXXV+/Yp/MLcDLrL/2i360XIy2YN9yRZJPnIbLwjroFNLiRzLs6PyPw1D09Xs8OcPR1/nHv6xDKE2A== +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: - "@ethersproject/logger" "^5.2.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.3.0", "@ethersproject/properties@^5.2.0", "@ethersproject/properties@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.3.0.tgz#feef4c4babeb7c10a6b3449575016f4ad2c092b2" - integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw== +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.3.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/providers@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.2.0.tgz#b2f3e3b2ca4567c8372543ceb6f3c6e3a2370783" - integrity sha512-Yf/ZUqCrVr+jR0SHA9GuNZs4R1xnV9Ibnh1TlOa0ZzI6o+Qf8bEyE550k9bYI4zk2f9x9baX2RRs6BJY7Jz/WA== - dependencies: - "@ethersproject/abstract-provider" "^5.2.0" - "@ethersproject/abstract-signer" "^5.2.0" - "@ethersproject/address" "^5.2.0" - "@ethersproject/basex" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/constants" "^5.2.0" - "@ethersproject/hash" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/networks" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/random" "^5.2.0" - "@ethersproject/rlp" "^5.2.0" - "@ethersproject/sha2" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - "@ethersproject/transactions" "^5.2.0" - "@ethersproject/web" "^5.2.0" - bech32 "1.1.4" - ws "7.2.3" + "@ethersproject/logger" "^5.7.0" "@ethersproject/providers@5.3.0": version "5.3.0" @@ -789,258 +491,170 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.2.0.tgz#1d7e19f17d88eda56228a263063826829e49eebe" - integrity sha512-7Nd3qjivBGlDCGDuGYjPi8CXdtVhRZ7NeyBXoJgtnJBwn1S01ahrbMeOUVmRVWrFM0YiSEPEGo7i4xEu2gRPcg== - dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - -"@ethersproject/random@5.3.0", "@ethersproject/random@^5.2.0", "@ethersproject/random@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.3.0.tgz#7c46bf36e50cb0d0550bc8c666af8e1d4496dc1a" - integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" +"@ethersproject/providers@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" + integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" -"@ethersproject/rlp@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.2.0.tgz#bbf605183818a9d96bdc40323d734c79e26cfaca" - integrity sha512-RqGsELtPWxcFhOOhSr0lQ2hBNT9tBE08WK0tb6VQbCk97EpqkbgP8yXED9PZlWMiRGchJTw6S+ExzK62XMX/fw== +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.3.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.2.0", "@ethersproject/rlp@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.3.0.tgz#7cb93a7b5dfa69163894153c9d4b0d936f333188" - integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw== +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.3.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.2.0.tgz#ae18fa6c09c6d99fa2b564dac7276bcd513c1579" - integrity sha512-Wqqptfn0PRO2mvmpktPW1HOLrrCyGtxhVQxO1ZyePoGrcEOurhICOlIvkTogoX4Q928D3Z9XtSSCUbdOJUF2kg== +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.3.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - hash.js "1.1.3" - -"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.2.0", "@ethersproject/sha2@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366" - integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.2.0.tgz#e8eb10d3c0f4a575479db8d70c62aaf93cd384d1" - integrity sha512-9A+dVSkrVAPuhJnWqLWV/NkKi/KB4iagTKEuojfuApUfeIHEhpwQ0Jx3cBimk7qWISSSKdgiAmIqpvVtZ5FEkg== - dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - bn.js "^4.4.0" - elliptic "6.5.4" - -"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.2.0", "@ethersproject/signing-key@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.3.0.tgz#a96c88f8173e1abedfa35de32d3e5db7c48e5259" - integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ== +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - bn.js "^4.11.9" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.2.0.tgz#ac902d8f8b11bf58fd37ccf77392178cbbd0b08f" - integrity sha512-EEFlNyEnONW3CWF8UGWPcqxJUHiaIoofO7itGwO/2gvGpnwlL+WUV+GmQoHNxmn+QJeOHspnZuh6NOVrJL6H1g== - dependencies: - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/sha2" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - -"@ethersproject/solidity@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93" - integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/strings@5.2.0", "@ethersproject/strings@>=5.0.0-beta.130": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.2.0.tgz#e93d989859587191c3f64bda124d9dedbc3f5a97" - integrity sha512-RmjX800wRYKgrzo2ZCSlA8OCQYyq4+M46VgjSVDVyYkLZctBXC3epqlppDA24R7eo856KNbXqezZsMnHT+sSuA== - dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/constants" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - -"@ethersproject/strings@5.3.0", "@ethersproject/strings@^5.2.0", "@ethersproject/strings@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0" - integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/transactions@5.2.0", "@ethersproject/transactions@^5.0.0-beta.135": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.2.0.tgz#052e2ef8f8adf7037ebe4cc47aad2a61950e6491" - integrity sha512-QrGbhGYsouNNclUp3tWMbckMsuXJTOsA56kT3BuRrLlXJcUH7myIihajXdSfKcyJsvHJPrGZP+U3TKh+sLzZtg== - dependencies: - "@ethersproject/address" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/constants" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/rlp" "^5.2.0" - "@ethersproject/signing-key" "^5.2.0" - -"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.2.0", "@ethersproject/transactions@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.3.0.tgz#49b86f2bafa4d0bdf8e596578fc795ee47c50458" - integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ== - dependencies: - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/rlp" "^5.3.0" - "@ethersproject/signing-key" "^5.3.0" - -"@ethersproject/units@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.2.0.tgz#08643e5d4583ecc1a32b103c1157f7ae80803392" - integrity sha512-yrwlyomXcBBHp5oSrLxlLkyHN7dVu3PO7hMbQXc00h388zU4TF3o/PAIUhh+x695wgJ19Fa8YgUWCab3a1RDwA== - dependencies: - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/constants" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - -"@ethersproject/units@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.3.0.tgz#c4d1493532ad3d4ddf6e2bc4f8c94a2db933a8f5" - integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/wallet@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.2.0.tgz#b5a8406676067e34f633536a4cb53c2ff98c0b5c" - integrity sha512-uPdjZwUmAJLo1+ybR/G/rL9pv/NEcCqOsjn6RJFvG7RmwP2kS1v5C+F+ysgx2W/PxBIVT+2IEsfXLbBz8s/6Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.2.0" - "@ethersproject/abstract-signer" "^5.2.0" - "@ethersproject/address" "^5.2.0" - "@ethersproject/bignumber" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/hash" "^5.2.0" - "@ethersproject/hdnode" "^5.2.0" - "@ethersproject/json-wallets" "^5.2.0" - "@ethersproject/keccak256" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/random" "^5.2.0" - "@ethersproject/signing-key" "^5.2.0" - "@ethersproject/transactions" "^5.2.0" - "@ethersproject/wordlists" "^5.2.0" - -"@ethersproject/wallet@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.3.0.tgz#91946b470bd279e39ade58866f21f92749d062af" - integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg== - dependencies: - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/hdnode" "^5.3.0" - "@ethersproject/json-wallets" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/random" "^5.3.0" - "@ethersproject/signing-key" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/wordlists" "^5.3.0" - -"@ethersproject/web@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.2.0.tgz#47d8e152e7fcc07ba0aff4f99fde268fde79dd7a" - integrity sha512-mYb9qxGlOBFR2pR6t1CZczuqqX6r8RQGn7MtwrBciMex3cvA/qs+wbmcDgl+/OZY0Pco/ih6WHQRnVi+4sBeCQ== - dependencies: - "@ethersproject/base64" "^5.2.0" - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - -"@ethersproject/web@5.3.0", "@ethersproject/web@^5.2.0", "@ethersproject/web@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.3.0.tgz#7959c403f6476c61515008d8f92da51c553a8ee1" - integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ== - dependencies: - "@ethersproject/base64" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/wordlists@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.2.0.tgz#afcce0229e9ef64af1bf8a1e96571fa441e9f444" - integrity sha512-/7TG5r/Zm8Wd9WhoqQ4QnntgMkIfIZ8QVrpU81muiChLD26XLOgmyiqKPL7K058uYt7UZ0wzbXjxyCYadU3xFQ== - dependencies: - "@ethersproject/bytes" "^5.2.0" - "@ethersproject/hash" "^5.2.0" - "@ethersproject/logger" "^5.2.0" - "@ethersproject/properties" "^5.2.0" - "@ethersproject/strings" "^5.2.0" - -"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.2.0", "@ethersproject/wordlists@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.3.0.tgz#45a0205f5178c1de33d316cb2ab7ed5eac3c06c5" - integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.3.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.3.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.3.0", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" "@graphql-typed-document-node/core@^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== +"@ipld/dag-cbor@^6.0.12": + version "6.0.15" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz#aebe7a26c391cae98c32faedb681b1519e3d2372" + integrity sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + "@josephg/resolvable@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" @@ -1988,43 +1602,6 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@resolver-engine/core@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" - integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== - dependencies: - debug "^3.1.0" - is-url "^1.2.4" - request "^2.85.0" - -"@resolver-engine/fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" - integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports-fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" - integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== - dependencies: - "@resolver-engine/fs" "^0.3.3" - "@resolver-engine/imports" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" - integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - hosted-git-info "^2.6.0" - path-browserify "^1.0.0" - url "^0.11.0" - "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -2154,13 +1731,6 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== -"@typechain/ethers-v5@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810" - integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== - dependencies: - ethers "^5.0.2" - "@types/abstract-leveldown@*": version "5.0.1" resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e" @@ -2180,7 +1750,7 @@ dependencies: "@types/node" "*" -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": +"@types/bn.js@^4.11.3": 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== @@ -2405,22 +1975,15 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== -"@types/mkdirp@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - "@types/mocha@^8.2.2": version "8.2.2" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== -"@types/node-fetch@^2.5.5": - version "2.5.10" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" - integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== +"@types/node-fetch@2.x": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" @@ -2440,11 +2003,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.12.6": - version "12.20.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364" - integrity sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A== - "@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" @@ -2462,11 +2020,6 @@ dependencies: "@types/node" "*" -"@types/prettier@^2.1.1": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" - integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== - "@types/qs@*": version "6.9.6" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" @@ -2477,13 +2030,6 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/resolve@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - "@types/secp256k1@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d" @@ -2752,11 +2298,6 @@ dependencies: tslib "^2.1.0" -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2777,27 +2318,6 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abstract-leveldown@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" - integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^2.4.1, 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" - -abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6" - integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A== - dependencies: - xtend "~4.0.0" - abstract-leveldown@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" @@ -2820,13 +2340,6 @@ abstract-leveldown@^7.0.0: level-supports "^2.0.0" queue-microtask "^1.2.3" -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@~6.2.1: version "6.2.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" @@ -2869,12 +2382,7 @@ adm-zip@^0.4.16: 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.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" @@ -3204,35 +2712,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-back@^1.0.3, array-back@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= - dependencies: - typical "^2.6.0" - -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== - dependencies: - typical "^2.6.1" - array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -3269,11 +2748,6 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - array.prototype.flat@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" @@ -3298,16 +2772,6 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -3325,28 +2789,18 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +async-eventemitter@^0.2.4: 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: - 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-retry@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" @@ -3354,19 +2808,7 @@ async-retry@^1.2.1: dependencies: retry "0.12.0" -async@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - -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.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -3383,11 +2825,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3398,543 +2835,17 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -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-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-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-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-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-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-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-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.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: - 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== - backo2@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= -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" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2, base-x@^3.0.8: +base-x@^3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== @@ -3951,19 +2862,6 @@ base64-sol@1.0.1: resolved "https://registry.yarnpkg.com/base64-sol/-/base64-sol-1.0.1.tgz#91317aa341f0bc763811783c5729f1c2574600f6" integrity sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4008,43 +2906,32 @@ bintrees@1.0.1: resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= -bip39@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" - integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== - dependencies: - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - safe-buffer "^5.0.1" - unorm "^1.3.3" - blakejs@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= -bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.7.2: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@4.11.6: - version "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.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: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2: +bn.js@^5.1.2: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.0, body-parser@^1.16.0, body-parser@^1.18.3: +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.19.0, body-parser@^1.18.3: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -4082,22 +2969,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -4115,7 +2986,7 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: +browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -4127,56 +2998,6 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -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" - bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -4198,11 +3019,6 @@ 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-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" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - buffer-writer@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" @@ -4220,7 +3036,7 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4236,13 +3052,6 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bufferutil@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" - integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== - dependencies: - node-gyp-build "^4.2.0" - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -4270,21 +3079,6 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -bytewise-core@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= - dependencies: - typewise-core "^1.2" - -bytewise@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - cacache@^15.0.5, cacache@^15.2.0: version "15.2.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" @@ -4308,21 +3102,6 @@ cacache@^15.0.5, cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -4336,14 +3115,6 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cachedown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= - dependencies: - abstract-leveldown "^2.4.1" - lru-cache "^3.2.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -4398,11 +3169,6 @@ camelcase@^2.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4413,11 +3179,6 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30000844: - version "1.0.30001230" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" - integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== - canonical-json@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/canonical-json/-/canonical-json-0.0.4.tgz#6579c072c3db5c477ec41dc978fbf2b8f41074a3" @@ -4433,6 +3194,11 @@ catering@^2.0.0: resolved "https://registry.yarnpkg.com/catering/-/catering-2.0.0.tgz#15ce31bcbffafbf62855ea7677b0e5d23581233d" integrity sha512-aD/WmxhGwUGsVPrj8C80vH7C7GphJilYVSdudoV4u16XdrLF7CVyfBmENsc4tLTVsJJzCRid8GbwJ7mcPLee6Q== +cborg@^1.5.4: + version "1.9.5" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.9.5.tgz#1e3b8a8407b3665566001f8841c9d72d7a80b2d5" + integrity sha512-fLBv8wmqtlXqy1Yu+pHzevAIkW6k2K0ZtMujNzWphLsA34vzzg9BHn+5GmZqOJkSA9V7EMKsWrf6K976c1QMjQ== + chai@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" @@ -4445,7 +3211,7 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -4496,13 +3262,6 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -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.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -4563,17 +3322,6 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -4582,21 +3330,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4631,15 +3364,6 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -4674,11 +3398,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone@2.1.2, clone@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -4696,14 +3415,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -4758,15 +3469,6 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -command-line-args@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" - integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== - dependencies: - array-back "^2.0.0" - find-replace "^1.0.3" - typical "^2.6.1" - commander@3.0.2, commander@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" @@ -4785,26 +3487,11 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.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== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - concat-stream@^2.0.0: version "2.0.0" resolved "https://codeload.github.com/hugomrdias/concat-stream/tar.gz/057bc7b5d6d8df26c8cf00a3f151b6721a0a8034" @@ -4851,15 +3538,6 @@ content-disposition@0.5.3: dependencies: safe-buffer "5.1.2" -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -4950,13 +3628,6 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4972,16 +3643,6 @@ cookie@^0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -cookiejar@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - core-js-pure@^3.0.1: version "3.13.0" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.0.tgz#9d267fb47d1d7046cfbc05e7b67bb235b6735355" @@ -4992,17 +3653,12 @@ core-js-pure@^3.10.2: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.14.0.tgz#72bcfacba74a65ffce04bf94ae91d966e80ee553" integrity sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g== -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" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@^2.8.1, cors@^2.8.5: +cors@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -5039,14 +3695,6 @@ crc-32@^1.2.0: exit-on-epipe "~1.0.1" printj "~1.1.0" -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -5058,7 +3706,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -5083,14 +3731,6 @@ cron-parser@^3.3.0: is-nan "^1.3.2" luxon "^1.26.0" -cross-fetch@^2.1.0, cross-fetch@^2.1.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" - integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw== - dependencies: - node-fetch "2.1.2" - whatwg-fetch "2.0.4" - cross-fetch@^3.0.6, cross-fetch@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" @@ -5098,17 +3738,6 @@ cross-fetch@^3.0.6, cross-fetch@^3.1.4: dependencies: node-fetch "2.6.1" -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -5118,23 +3747,6 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" @@ -5162,14 +3774,6 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -5187,7 +3791,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, 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== @@ -5208,7 +3812,7 @@ debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: +debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -5235,7 +3839,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5255,7 +3859,7 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.2.0, decompress-response@^3.3.0: +decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= @@ -5274,18 +3878,6 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -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== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -5316,21 +3908,6 @@ deferred-leveldown@^6.0.0: abstract-leveldown "^7.0.0" inherits "^2.0.3" -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" - -deferred-leveldown@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20" - integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== - dependencies: - abstract-leveldown "~5.0.0" - inherits "^2.0.3" - deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -5346,33 +3923,6 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - 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= - delay@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -5437,26 +3987,11 @@ deps-regex@^0.1.4: resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" integrity sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ= -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -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" @@ -5502,15 +4037,6 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5532,11 +4058,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - dot-prop@^5.1.0, dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -5551,23 +4072,11 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -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" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -5591,12 +4100,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.47: - version "1.3.741" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.741.tgz#dc1024b19b31e27fb2c8c0a1f120cb05fc6ca695" - integrity sha512-4i3T0cwnHo1O4Mnp9JniEco8bZiXoqbm3PhW5hv7uu8YLg35iajYrRnNyKFaN8/8SSTskU2hYqVTeYVPceSpUA== - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: +elliptic@6.5.4, elliptic@^6.5.2: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -5629,17 +4133,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding-down@5.0.4, encoding-down@~5.0.0: - version "5.0.4" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" - integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== - dependencies: - abstract-leveldown "^5.0.0" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - xtend "^4.0.1" - encoding-down@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" @@ -5660,7 +4153,7 @@ encoding-down@^7.0.0: level-codec "^10.0.0" level-errors "^3.0.0" -encoding@^0.1.11, encoding@^0.1.12: +encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5748,32 +4241,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5999,105 +4466,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eth-block-tracker@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" - integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== - dependencies: - eth-query "^2.1.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.3" - ethjs-util "^0.1.3" - json-rpc-engine "^3.6.0" - pify "^2.3.0" - tape "^4.6.3" - -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -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-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-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -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-sig-util@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" - integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== - 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-sig-util@^2.5.2: version "2.5.4" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" @@ -6108,49 +4476,6 @@ eth-sig-util@^2.5.2: tweetnacl "^1.0.3" tweetnacl-util "^0.15.0" -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" - -ethashjs@~0.0.7: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" - integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== - dependencies: - async "^2.1.2" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.2" - miller-rabin "^4.0.0" - -ethereum-bloom-filters@^1.0.6: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz#4a59dead803af0c9e33834170bd7695df67061ec" - integrity sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg== - dependencies: - js-sha3 "^0.8.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.2, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -6172,25 +4497,6 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-waffle@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.3.0.tgz#166a0cc1d3b2925f117b20ef0951b3fe72e38e79" - integrity sha512-4xm3RWAPCu5LlaVxYEg0tG3L7g5ovBw1GY/UebrzZ+OTx22vcPjI+bvelFlGBpkdnO5yOIFXjH2eK59tNAe9IA== - dependencies: - "@ethereum-waffle/chai" "^3.3.0" - "@ethereum-waffle/compiler" "^3.3.0" - "@ethereum-waffle/mock-contract" "^3.2.2" - "@ethereum-waffle/provider" "^3.3.0" - ethers "^5.0.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@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" @@ -6199,96 +4505,20 @@ ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.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@3.0.0, ethereumjs-account@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" - integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== - dependencies: - ethereumjs-util "^6.0.0" - rlp "^2.2.1" - safe-buffer "^5.1.1" - -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== +ethereumjs-util@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== dependencies: - ethereumjs-util "^5.0.0" + 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-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: - 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-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-blockchain@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" - integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== - dependencies: - async "^2.6.1" - ethashjs "~0.0.7" - ethereumjs-block "~2.2.2" - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.1.0" - flow-stoplight "^1.0.0" - level-mem "^3.0.1" - lru-cache "^5.1.1" - rlp "^2.2.2" - semaphore "^1.1.0" - -ethereumjs-common@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" - integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== - -ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, 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@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: - 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-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3: - 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-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0: +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== @@ -6301,31 +4531,7 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumj ethjs-util "0.1.6" rlp "^2.2.3" -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.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: - 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@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7: +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.7: version "7.0.10" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f" integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw== @@ -6337,138 +4543,41 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7: ethjs-util "0.1.6" rlp "^2.2.4" -ethereumjs-vm@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" - integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - core-js-pure "^3.0.1" - ethereumjs-account "^3.0.0" - ethereumjs-block "^2.2.2" - ethereumjs-blockchain "^4.0.3" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^6.2.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" - util.promisify "^1.0.0" - -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" - -ethereumjs-wallet@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" - integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== - dependencies: - aes-js "^3.1.1" - bs58check "^2.1.2" - ethereum-cryptography "^0.1.3" - ethereumjs-util "^6.0.0" - randombytes "^2.0.6" - safe-buffer "^5.1.2" - scryptsy "^1.2.1" - utf8 "^3.0.0" - uuid "^3.3.2" - -ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.2.0.tgz#13452e35947ab5d77053286d1f7161ee666c85ba" - integrity sha512-HqFGU2Qab0mAg3y1eHKVMXS4i1gTObMY0/4+x4LiO72NHhJL3Z795gnqyivmwG1J8e5NLSlRSfyIR7TL0Hw3ig== - dependencies: - "@ethersproject/abi" "5.2.0" - "@ethersproject/abstract-provider" "5.2.0" - "@ethersproject/abstract-signer" "5.2.0" - "@ethersproject/address" "5.2.0" - "@ethersproject/base64" "5.2.0" - "@ethersproject/basex" "5.2.0" - "@ethersproject/bignumber" "5.2.0" - "@ethersproject/bytes" "5.2.0" - "@ethersproject/constants" "5.2.0" - "@ethersproject/contracts" "5.2.0" - "@ethersproject/hash" "5.2.0" - "@ethersproject/hdnode" "5.2.0" - "@ethersproject/json-wallets" "5.2.0" - "@ethersproject/keccak256" "5.2.0" - "@ethersproject/logger" "5.2.0" - "@ethersproject/networks" "5.2.0" - "@ethersproject/pbkdf2" "5.2.0" - "@ethersproject/properties" "5.2.0" - "@ethersproject/providers" "5.2.0" - "@ethersproject/random" "5.2.0" - "@ethersproject/rlp" "5.2.0" - "@ethersproject/sha2" "5.2.0" - "@ethersproject/signing-key" "5.2.0" - "@ethersproject/solidity" "5.2.0" - "@ethersproject/strings" "5.2.0" - "@ethersproject/transactions" "5.2.0" - "@ethersproject/units" "5.2.0" - "@ethersproject/wallet" "5.2.0" - "@ethersproject/web" "5.2.0" - "@ethersproject/wordlists" "5.2.0" - ethers@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.0.tgz#1ec14d09c461e8f2554b00cd080e94a3094e7e9d" - integrity sha512-myN+338S4sFQZvQ9trii7xit8Hu/LnUtjA0ROFOHpUreQc3fgLZEMNVqF3vM1u2D78DIIeG1TbuozVCVlXQWvQ== - dependencies: - "@ethersproject/abi" "5.3.0" - "@ethersproject/abstract-provider" "5.3.0" - "@ethersproject/abstract-signer" "5.3.0" - "@ethersproject/address" "5.3.0" - "@ethersproject/base64" "5.3.0" - "@ethersproject/basex" "5.3.0" - "@ethersproject/bignumber" "5.3.0" - "@ethersproject/bytes" "5.3.0" - "@ethersproject/constants" "5.3.0" - "@ethersproject/contracts" "5.3.0" - "@ethersproject/hash" "5.3.0" - "@ethersproject/hdnode" "5.3.0" - "@ethersproject/json-wallets" "5.3.0" - "@ethersproject/keccak256" "5.3.0" - "@ethersproject/logger" "5.3.0" - "@ethersproject/networks" "5.3.0" - "@ethersproject/pbkdf2" "5.3.0" - "@ethersproject/properties" "5.3.0" - "@ethersproject/providers" "5.3.0" - "@ethersproject/random" "5.3.0" - "@ethersproject/rlp" "5.3.0" - "@ethersproject/sha2" "5.3.0" - "@ethersproject/signing-key" "5.3.0" - "@ethersproject/solidity" "5.3.0" - "@ethersproject/strings" "5.3.0" - "@ethersproject/transactions" "5.3.0" - "@ethersproject/units" "5.3.0" - "@ethersproject/wallet" "5.3.0" - "@ethersproject/web" "5.3.0" - "@ethersproject/wordlists" "5.3.0" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" + version "5.7.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" + integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.1" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" ethjs-util@0.1.6, ethjs-util@^0.1.3: version "0.1.6" @@ -6483,11 +4592,6 @@ 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.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -6498,12 +4602,7 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -6531,20 +4630,7 @@ exit-on-epipe@~1.0.1: resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -express@^4.14.0, express@^4.17.1: +express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -6573,34 +4659,12 @@ express@^4.14.0, express@^4.17.1: range-parser "~1.2.1" safe-buffer "5.1.2" send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== - dependencies: - type "^2.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" extend@~3.0.2: version "3.0.2" @@ -6616,20 +4680,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-files@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" @@ -6645,13 +4695,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -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" @@ -6686,13 +4729,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -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" - figlet@^1.1.1: version "1.5.2" resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634" @@ -6717,16 +4753,6 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -6752,14 +4778,6 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-replace@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= - dependencies: - array-back "^1.0.4" - test-value "^2.1.0" - find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6798,21 +4816,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-yarn-workspace-root@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" - integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== - dependencies: - fs-extra "^4.0.3" - micromatch "^3.1.4" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - findit2@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/findit2/-/findit2-2.2.3.tgz#58a466697df8a6205cdfdbf395536b8bd777a5f6" @@ -6843,28 +4846,18 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== -flow-stoplight@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= - follow-redirects@^1.12.1: version "1.14.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== -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== dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -6903,13 +4896,6 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6940,16 +4926,7 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^4.0.2, fs-extra@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0, fs-extra@^7.0.1: +fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -6997,7 +4974,7 @@ fsevents@~2.3.1, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.1, function-bind@~1.1.1: +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -7007,43 +4984,6 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -ganache-core@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" - integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== - dependencies: - abstract-leveldown "3.0.0" - async "2.6.2" - bip39 "2.5.0" - cachedown "1.0.0" - clone "2.1.2" - debug "3.2.6" - encoding-down "5.0.4" - eth-sig-util "3.0.0" - ethereumjs-abi "0.6.8" - ethereumjs-account "3.0.0" - ethereumjs-block "2.2.2" - ethereumjs-common "1.5.0" - ethereumjs-tx "2.1.2" - ethereumjs-util "6.2.1" - ethereumjs-vm "4.2.0" - heap "0.2.6" - keccak "3.0.1" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.20" - lru-cache "5.1.1" - merkle-patricia-tree "3.0.0" - patch-package "6.2.2" - seedrandom "3.0.1" - source-map-support "0.5.12" - tmp "0.1.0" - web3-provider-engine "14.2.1" - websocket "1.0.32" - optionalDependencies: - ethereumjs-wallet "0.6.5" - web3 "1.2.11" - gauge@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.0.tgz#afba07aa0374a93c6219603b1fb83eaa2264d8f8" @@ -7080,11 +5020,6 @@ generic-names@^2.0.1: dependencies: loader-utils "^1.1.0" -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -7135,11 +5070,6 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -7159,11 +5089,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -7251,7 +5176,7 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -7270,14 +5195,6 @@ global-dirs@^2.0.1: dependencies: ini "1.3.7" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -7297,11 +5214,6 @@ globals@^13.6.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, globby@^11.0.2: version "11.0.3" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" @@ -7314,7 +5226,7 @@ globby@^11.0.1, globby@^11.0.2: merge2 "^1.3.0" slash "^3.0.0" -got@9.6.0, got@^9.6.0: +got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== @@ -7331,26 +5243,6 @@ got@9.6.0, got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -7541,65 +5433,22 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.3, 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== @@ -7620,14 +5469,6 @@ hash-sum@^2.0.0: resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== -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" @@ -7641,11 +5482,6 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -heap@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= - highlight.js@^10.7.1: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -7654,7 +5490,7 @@ highlight.js@^10.7.1: 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= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -7667,15 +5503,7 @@ hoist-non-react-statics@^3.3.2: 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" - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: +hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== @@ -7725,11 +5553,6 @@ http-errors@^1.7.3: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -7797,13 +5620,6 @@ icss-utils@^5.0.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -7905,7 +5721,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7963,18 +5779,13 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -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== dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -7992,27 +5803,6 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" - integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== - dependencies: - call-bind "^1.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -8037,11 +5827,6 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.2" -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.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" @@ -8066,65 +5851,16 @@ is-core-module@^2.2.0, is-core-module@^2.4.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -8135,11 +5871,6 @@ 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" @@ -8157,11 +5888,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -8210,13 +5936,6 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -8227,11 +5946,6 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - is-path-inside@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -8247,7 +5961,7 @@ is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -8259,7 +5973,7 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-regex@^1.0.4, is-regex@^1.1.3: +is-regex@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== @@ -8267,18 +5981,6 @@ is-regex@^1.0.4, is-regex@^1.1.3: call-bind "^1.0.2" has-symbols "^1.0.2" -is-regex@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - is-ssh@^1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" @@ -8286,11 +5988,6 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0, is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - is-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" @@ -8320,39 +6017,17 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - is-yarn-global@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -8362,14 +6037,7 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= @@ -8379,25 +6047,12 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -js-sha3@0.5.7, js-sha3@^0.5.7: - version "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== @@ -8407,11 +6062,6 @@ js-sha3@0.8.0, 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.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -8447,21 +6097,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -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" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - json-bigint@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" @@ -8484,30 +6124,6 @@ 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@^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-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: - 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" @@ -8528,23 +6144,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -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" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -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" @@ -8582,11 +6186,6 @@ 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, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -8602,7 +6201,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -keccak@3.0.1, keccak@^3.0.0: +keccak@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== @@ -8617,37 +6216,11 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -8662,13 +6235,6 @@ latest-version@^5.0.0: dependencies: package-json "^6.3.0" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -8712,11 +6278,6 @@ level-codec@^9.0.0: dependencies: buffer "^5.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-concat-iterator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.0.0.tgz#416ddaf0c2ed834f006aa3124ee68906eb4769d4" @@ -8727,13 +6288,6 @@ level-concat-iterator@~2.0.0: resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== -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@^2.0.0, level-errors@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" @@ -8748,22 +6302,6 @@ level-errors@^3.0.0: dependencies: errno "^1.0.0" -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@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" - integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.5" - xtend "^4.0.0" - level-iterator-stream@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz#85b3438e1b4c54ce5aa8c0eb973cfb628117df9e" @@ -8772,25 +6310,6 @@ level-iterator-stream@^5.0.0: inherits "^2.0.4" readable-stream "^3.4.0" -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-iterator-stream@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730" - integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.3.6" - xtend "^4.0.0" - level-iterator-stream@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" @@ -8810,14 +6329,6 @@ level-js@^6.0.0: inherits "^2.0.3" ltgt "^2.1.2" -level-mem@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" - integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== - dependencies: - level-packager "~4.0.0" - memdown "~3.0.0" - level-mem@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" @@ -8842,37 +6353,6 @@ level-packager@^6.0.0: encoding-down "^7.0.0" levelup "^5.0.0" -level-packager@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" - integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== - dependencies: - encoding-down "~5.0.0" - levelup "^3.0.0" - -level-post@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" - -level-sublevel@6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" - integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== - dependencies: - bytewise "~1.1.0" - level-codec "^9.0.0" - level-errors "^2.0.0" - level-iterator-stream "^2.0.3" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" - level-supports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.0.0.tgz#b0b9f63f30c4175fb2612217144f03f3b77580d9" @@ -8885,23 +6365,6 @@ level-supports@~1.0.0: dependencies: xtend "^4.0.2" -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" - -level-ws@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" - integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.8" - xtend "^4.0.1" - level-ws@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" @@ -8929,29 +6392,6 @@ leveldown@^6.0.0: napi-macros "~2.0.0" node-gyp-build "~4.2.1" -levelup@3.1.1, levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== - dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" - -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" - levelup@^4.3.2: version "4.4.0" resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" @@ -9084,11 +6524,6 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -9137,14 +6572,9 @@ lodash.templatesettings@^4.0.0: lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash@4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.11, 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.7.0: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9173,16 +6603,6 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= - loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -9208,20 +6628,13 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@5.1.1, lru-cache@^5.1.1: +lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= - dependencies: - pseudomap "^1.0.1" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -9239,11 +6652,6 @@ ltgt@^2.1.2, ltgt@~2.2.0: resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= - luxon@^1.26.0: version "1.27.0" resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.27.0.tgz#ae10c69113d85dab8f15f5e8390d0cbeddf4f00f" @@ -9319,11 +6727,6 @@ make-fetch-happen@^9.0.1: socks-proxy-agent "^5.0.0" ssri "^8.0.0" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -9334,13 +6737,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - mcl-wasm@^0.7.1: version "0.7.7" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.7.tgz#fd463dd1641a37f9f55b6ca8e5a38e95be2bc58f" @@ -9360,18 +6756,6 @@ 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" - memdown@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" @@ -9384,18 +6768,6 @@ memdown@^5.0.0: ltgt "~2.2.0" safe-buffer "~5.2.0" -memdown@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" - integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== - dependencies: - abstract-leveldown "~5.0.0" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -9456,33 +6828,6 @@ 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@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - -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" - merkle-patricia-tree@^4.1.0, merkle-patricia-tree@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1" @@ -9501,25 +6846,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -9541,7 +6867,7 @@ mime-db@1.47.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.30" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== @@ -9563,13 +6889,6 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -9583,7 +6902,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 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= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" @@ -9601,7 +6920,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -9683,14 +7002,6 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-infer-owner@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" @@ -9700,18 +7011,6 @@ mkdirp-infer-owner@^2.0.0: infer-owner "^1.0.4" mkdirp "^1.0.3" -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -9719,6 +7018,11 @@ mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "^1.2.5" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.3" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" @@ -9787,11 +7091,6 @@ mocha@^8.4.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -9817,45 +7116,10 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" +multiformats@^9.5.4: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== multimatch@^5.0.0: version "5.0.0" @@ -9887,11 +7151,6 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= - nanoid@3.1.20: version "3.1.20" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" @@ -9902,23 +7161,6 @@ nanoid@^3.1.23: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - napi-macros@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" @@ -9939,16 +7181,6 @@ neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -9969,11 +7201,6 @@ node-fetch@2: dependencies: whatwg-url "^5.0.0" -node-fetch@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" - integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= - node-fetch@2.6.1, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" @@ -9986,14 +7213,6 @@ node-fetch@^2.6.5: dependencies: whatwg-url "^5.0.0" -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-gyp-build@^4.2.0, node-gyp-build@~4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" @@ -10225,73 +7444,31 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, 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= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.10.3, object-inspect@^1.9.0: version "1.10.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== -object-inspect@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "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-path@^0.11.4: version "0.11.5" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - object.assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" @@ -10321,13 +7498,6 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1 define-properties "^1.1.3" es-abstract "^1.18.0-next.2" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - object.values@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" @@ -10342,13 +7512,6 @@ obliterator@^1.6.1: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== -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" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -10370,14 +7533,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - optimism@^0.16.0: version "0.16.1" resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" @@ -10403,14 +7558,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, 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= @@ -10423,11 +7571,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -10517,13 +7660,6 @@ p-reduce@^2.0.0, p-reduce@^2.1.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -10600,27 +7736,11 @@ parent-require@^1.0.0: resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= -parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -10688,53 +7808,6 @@ parseurl@^1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -patch-package@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" - integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^1.2.1" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -patch-package@^6.2.2: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - open "^7.4.2" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -10752,16 +7825,11 @@ 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.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -10803,7 +7871,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: +pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -10947,11 +8015,6 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -11038,11 +8101,6 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - pprof@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pprof/-/pprof-3.2.0.tgz#5a60638dc51a61128a3d57c74514e8fd99e93722" @@ -11059,51 +8117,26 @@ pprof@^3.2.0: source-map "^0.7.3" split "^1.0.1" -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" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier@^2.1.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" - integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== - printj@~1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== -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" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -11129,14 +8162,6 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.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" - promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -11195,11 +8220,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -11210,66 +8230,6 @@ pstree.remy@^1.1.7: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= - -pull-defer@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-level@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" - -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= - -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== - -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= - dependencies: - looper "^2.0.0" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -11278,16 +8238,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= - punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -11329,15 +8279,6 @@ query-ast@^1.0.3: dependencies: invariant "2.2.4" -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - query-string@^6.13.8: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -11348,11 +8289,6 @@ query-string@^6.13.8: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -11363,21 +8299,13 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -11520,7 +8448,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -11529,17 +8457,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre 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@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.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== @@ -11552,16 +8470,6 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -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" @@ -11621,55 +8529,11 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -regenerate@^1.2.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -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" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - regexpp@^3.0.0, regexpp@^3.1.0: version "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" - registry-auth-token@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" @@ -11684,28 +8548,6 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -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" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -11713,7 +8555,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.79.0, request@^2.85.0, request@^2.88.0, request@^2.88.2: +request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -11744,21 +8586,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= - require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -11791,19 +8623,14 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.17.0, resolve@~1.17.0: +resolve@1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.18.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== @@ -11826,18 +8653,6 @@ 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" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@0.12.0, retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -11870,7 +8685,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: version "2.2.6" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== @@ -11906,25 +8721,11 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-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-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -11942,18 +8743,11 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: +scrypt-js@3.0.1, 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== -scryptsy@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= - dependencies: - pbkdf2 "^3.0.3" - scss-parser@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.5.tgz#2297d688a4c300e94552f72c41fd7de092d19c4b" @@ -11970,21 +8764,11 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -seedrandom@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" - integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== - semaphore-async-await@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= -semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: - 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" @@ -11997,7 +8781,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12014,11 +8798,6 @@ semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semve 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" @@ -12055,37 +8834,11 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - set-blocking@^2.0.0, set-blocking@~2.0.0: version "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" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -12116,13 +8869,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -12130,11 +8876,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -12163,30 +8904,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -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" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -12211,36 +8928,6 @@ smart-buffer@^4.1.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - socks-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" @@ -12273,31 +8960,6 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solc@^0.6.3: - version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" - integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -12317,32 +8979,6 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.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.13, source-map-support@^0.5.17: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -12351,12 +8987,7 @@ source-map-support@^0.5.13, source-map-support@^0.5.17: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -12407,13 +9038,6 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.0.0, split2@^3.1.1: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -12462,37 +9086,16 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stream-to-pull-stream@^1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== - dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" - streamsearch@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -12547,15 +9150,6 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trim@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd" - integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - 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" @@ -12579,11 +9173,6 @@ 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" @@ -12732,23 +9321,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -12771,28 +9343,7 @@ table@^6.0.9: string-width "^4.2.0" strip-ansi "^6.0.0" -tape@^4.6.3: - version "4.13.3" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" - integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== - dependencies: - deep-equal "~1.1.1" - defined "~1.0.0" - dotignore "~0.1.2" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.6" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.0.5" - minimist "~1.2.5" - object-inspect "~1.7.0" - resolve "~1.17.0" - resumer "~0.0.0" - string.prototype.trim "~1.2.1" - through "~2.3.8" - -tar@^4.0.2, tar@^4.4.12: +tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -12857,19 +9408,6 @@ term-size@^2.1.0: resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== -test-value@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -12894,7 +9432,7 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -through2@^2.0.0, through2@^2.0.3: +through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -12909,16 +9447,11 @@ 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.4, through@~2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -12926,43 +9459,16 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - -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-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" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -12970,16 +9476,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -13032,41 +9528,11 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -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= - "true-case-path@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -ts-essentials@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== - -ts-essentials@^6.0.3: - version "6.0.7" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" - integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== - -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - ts-invariant@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" @@ -13146,7 +9612,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0, tweetnacl@^1.0.3: +tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -13206,29 +9672,6 @@ type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typechain@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" - integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== - dependencies: - command-line-args "^4.0.7" - debug "^4.1.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-essentials "^6.0.3" - ts-generator "^0.1.1" - 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" @@ -13236,11 +9679,6 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - typeorm-naming-strategies@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-2.0.0.tgz#c7c10bc768ddce2592ef9ad4d2dca55fd5fa6ad6" @@ -13274,28 +9712,6 @@ typescript@^4.3.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== -typewise-core@^1.2, typewise-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= - dependencies: - typewise-core "^1.2.0" - -typewiselite@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= - -typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= - uglify-js@^3.1.4: version "3.13.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" @@ -13306,11 +9722,6 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -13333,26 +9744,6 @@ undefsafe@^2.0.3: dependencies: debug "^2.2.0" -underscore@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" - integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== - -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== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -13389,24 +9780,11 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unorm@^1.3.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" - integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - upath@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" @@ -13438,18 +9816,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -13457,41 +9823,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -utf-8-validate@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1" - integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ== - dependencies: - node-gyp-build "^4.2.0" - -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -13520,11 +9851,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -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@^3.1.0, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -13555,11 +9881,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13581,285 +9902,6 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-core-helpers@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" - -web3-core-method@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" - -web3-core-promievent@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" - -web3-core-subscriptions@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" - -web3-eth-abi@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-accounts@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-eth-contract@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-iban@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== - dependencies: - bn.js "^4.11.9" - web3-utils "1.2.11" - -web3-eth-personal@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-provider-engine@14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" - integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - 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" - -web3-providers-http@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== - dependencies: - web3-core-helpers "1.2.11" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-providers-ws@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" - -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" - -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@^1.0.0-beta.31: - version "1.3.6" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10" - integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.12.1" - utf8 "3.0.0" - -web3@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -13870,35 +9912,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -websocket@1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" - integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -websocket@^1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -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-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -13927,17 +9940,12 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1.3.1, which@^1.2.9, which@^1.3.1: +which@1.3.1, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -13972,11 +9980,6 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= - word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -13992,14 +9995,6 @@ workerpool@6.1.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -14075,74 +10070,16 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== - ws@7.4.6, "ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.2.1, ws@^7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^5.1.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -14169,18 +10106,6 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: 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@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -14191,11 +10116,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= - yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -14233,14 +10153,6 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -14312,26 +10224,6 @@ yargs@^17.0.1: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"