From cfdbb4d7acd207823a1b14b95674096fdb449cd3 Mon Sep 17 00:00:00 2001 From: amateima <89395931+amateima@users.noreply.github.com> Date: Sun, 27 Nov 2022 12:26:53 +0200 Subject: [PATCH] feat: release 2022-11-23 (#153) --- .env.sample | 6 + ...667312452969-MerkleDistributorRecipient.ts | 29 + ...3310964-MerkleDistributorProcessedBlock.ts | 20 + migrations/1667813310965-Claim.ts | 44 + migrations/1667822226389-Deposit.ts | 13 + .../1668007817974-DepositsMaterializedView.ts | 39 + .../1668339782207-DepositReferralStat.ts | 23 + .../1668339782208-DepositsMaterializedView.ts | 54 + package.json | 4 +- .../airdrop/entry-points/http/controller.ts | 2 +- .../merkle-distributor-recipient.entity.ts | 2 +- .../model/merkle-distributor-window.entity.ts | 4 + .../airdrop/services/airdrop-service.ts | 8 +- src/modules/configuration/index.ts | 12 +- src/modules/database/database.providers.ts | 12 + .../deposit/model/DepositsMv.entity.ts | 104 + .../model/deposit-referral-stat.entity.ts | 23 + .../market-price/adapters/hmp-fixture.ts | 32 + src/modules/market-price/module.ts | 3 +- .../referral/entry-points/http/controller.ts | 34 +- src/modules/referral/entry-points/http/dto.ts | 18 +- .../model/DepositReferralStats.entity.ts | 29 + .../model/DepositsFilteredReferrals.entity.ts | 52 + src/modules/referral/module.ts | 3 +- src/modules/referral/services/cron-service.ts | 7 +- src/modules/referral/services/exceptions.ts | 13 + src/modules/referral/services/queries.ts | 16 +- src/modules/referral/services/service.ts | 191 +- .../scraper/adapter/db/claim-fixture.ts | 36 + .../adapter/messaging/BlocksEventsConsumer.ts | 2 +- .../MerkleDistributorBlocksEventsConsumer.ts | 63 + .../scraper/adapter/messaging/index.ts | 7 + .../scraper/entry-point/http/controller.ts | 23 +- .../MerkleDistributorProcessedBlock.entity.ts | 16 + src/modules/scraper/model/claim.entity.ts | 49 + src/modules/scraper/model/deposit.entity.ts | 3 + src/modules/scraper/module.ts | 11 +- src/modules/scraper/service.ts | 127 +- .../scraper/service/ScraperQueuesService.ts | 8 + .../web3/services/EthProvidersService.ts | 63 +- src/modules/web3/services/EventsQuerier.ts | 93 + .../MerkleDistributorEventsQuerier.ts | 21 + .../web3/services/SpokePoolEventsQuerier.ts | 93 +- src/utils.ts | 6 + test/referrals.e2e-spec.ts | 299 +++ yarn.lock | 1672 ++++++++++++++++- 46 files changed, 3188 insertions(+), 201 deletions(-) create mode 100644 migrations/1667312452969-MerkleDistributorRecipient.ts create mode 100644 migrations/1667813310964-MerkleDistributorProcessedBlock.ts create mode 100644 migrations/1667813310965-Claim.ts create mode 100644 migrations/1667822226389-Deposit.ts create mode 100644 migrations/1668007817974-DepositsMaterializedView.ts create mode 100644 migrations/1668339782207-DepositReferralStat.ts create mode 100644 migrations/1668339782208-DepositsMaterializedView.ts create mode 100644 src/modules/deposit/model/DepositsMv.entity.ts create mode 100644 src/modules/deposit/model/deposit-referral-stat.entity.ts create mode 100644 src/modules/market-price/adapters/hmp-fixture.ts create mode 100644 src/modules/referral/model/DepositReferralStats.entity.ts create mode 100644 src/modules/referral/model/DepositsFilteredReferrals.entity.ts create mode 100644 src/modules/referral/services/exceptions.ts create mode 100644 src/modules/scraper/adapter/db/claim-fixture.ts create mode 100644 src/modules/scraper/adapter/messaging/MerkleDistributorBlocksEventsConsumer.ts create mode 100644 src/modules/scraper/model/MerkleDistributorProcessedBlock.entity.ts create mode 100644 src/modules/scraper/model/claim.entity.ts create mode 100644 src/modules/web3/services/EventsQuerier.ts create mode 100644 src/modules/web3/services/MerkleDistributorEventsQuerier.ts create mode 100644 test/referrals.e2e-spec.ts diff --git a/.env.sample b/.env.sample index 124c7105..1c10fe2a 100644 --- a/.env.sample +++ b/.env.sample @@ -12,6 +12,7 @@ WEB3_NODE_URL_10=https://optimism-mainnet.infura.io/v3/ WEB3_NODE_URL_288=https://boba-mainnet.gateway.pokt.network/v1/lb/ WEB3_NODE_URL_42161=https://arbitrum-mainnet.infura.io/v3/ WEB3_NODE_URL_137=https://polygon-mainnet.infura.io/v3/ +WEB3_NODE_URL_5=https://goerli.infura.io/v3/ REFERRAL_DELIMITER_START_TIMESTAMP=1657290720 ENABLE_SPOKE_POOLS_EVENTS_PROCESSING=false ENABLE_REFERRALS_MATERIALIZED_VIEW_REFRESH=false @@ -27,3 +28,8 @@ DISCORD_CLIENT_ID=clientId DISCORD_CLIENT_SECRET=clientSecret # the url accessed after the Discord authorization processed is fulfilled DISCORD_REDIRECT_URI=http://localhost + +# MerkleDistributor overrides +MERKLE_DISTRIBUTOR_CHAIN_ID= +MERKLE_DISTRIBUTOR_ADDRESS= +ENABLE_MERKLE_DISTRIBUTOR_EVENTS_PROCESSING=false diff --git a/migrations/1667312452969-MerkleDistributorRecipient.ts b/migrations/1667312452969-MerkleDistributorRecipient.ts new file mode 100644 index 00000000..d72c907b --- /dev/null +++ b/migrations/1667312452969-MerkleDistributorRecipient.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MerkleDistributorRecipient1667312452969 implements MigrationInterface { + name = "MerkleDistributorRecipient1667312452969"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE "merkle_distributor_recipient" + DROP CONSTRAINT "UK_merkle_distributor_recipient_merkleDistributorWindowId_addre" + `); + await queryRunner.query(` + ALTER TABLE "merkle_distributor_recipient" + ADD CONSTRAINT "UK_merkle_distributor_recipient_windowId_address" + UNIQUE ("merkleDistributorWindowId", "address") + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE "merkle_distributor_recipient" + DROP CONSTRAINT "UK_merkle_distributor_recipient_windowId_address" + `); + await queryRunner.query(` + ALTER TABLE "merkle_distributor_recipient" + ADD CONSTRAINT "UK_merkle_distributor_recipient_merkleDistributorWindowId_addre" + UNIQUE ("merkleDistributorWindowId", "address") + `); + } +} diff --git a/migrations/1667813310964-MerkleDistributorProcessedBlock.ts b/migrations/1667813310964-MerkleDistributorProcessedBlock.ts new file mode 100644 index 00000000..aa225340 --- /dev/null +++ b/migrations/1667813310964-MerkleDistributorProcessedBlock.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MerkleDistributorProcessedBlock1667813310964 implements MigrationInterface { + name = "MerkleDistributorProcessedBlock1667813310964"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE "merkle_distributor_processed_block" ( + "id" SERIAL NOT NULL, + "chainId" integer NOT NULL, + "latestBlock" integer NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + CONSTRAINT "PK_fb2eb512abaadb453e1cfef109e" PRIMARY KEY ("id")) + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "merkle_distributor_processed_block"`); + } +} diff --git a/migrations/1667813310965-Claim.ts b/migrations/1667813310965-Claim.ts new file mode 100644 index 00000000..57325b66 --- /dev/null +++ b/migrations/1667813310965-Claim.ts @@ -0,0 +1,44 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Claim1667813310965 implements MigrationInterface { + name = "Claim1667813310965"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE "claim" ( + "id" SERIAL NOT NULL, + "caller" character varying NOT NULL, + "accountIndex" integer NOT NULL, + "windowIndex" integer NOT NULL, + "account" character varying NOT NULL, + "rewardToken" character varying NOT NULL, + "blockNumber" integer NOT NULL, + "claimedAt" TIMESTAMP NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), + "merkleDistributorWindowId" integer, + CONSTRAINT "UK_claim_windowIndex_accountIndex" UNIQUE ( + "windowIndex", + "accountIndex" + ), + CONSTRAINT "PK_466b305cc2e591047fa1ce58f81" PRIMARY KEY ("id")) + `); + await queryRunner.query(`CREATE INDEX "IX_claim_account" ON "claim" ("account")`); + await queryRunner.query(` + ALTER TABLE "claim" + ADD CONSTRAINT "FK_169ca2a2e031f01f62d81dbf1a0" + FOREIGN KEY ("merkleDistributorWindowId") + REFERENCES "merkle_distributor_window"("id") + ON DELETE NO ACTION ON UPDATE NO ACTION + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + ALTER TABLE "claim" DROP CONSTRAINT "FK_169ca2a2e031f01f62d81dbf1a0" + `); + await queryRunner.query(`DROP TABLE "merkle_distributor_processed_block"`); + await queryRunner.query(`DROP INDEX "public"."IX_claim_account"`); + await queryRunner.query(`DROP TABLE "claim"`); + } +} diff --git a/migrations/1667822226389-Deposit.ts b/migrations/1667822226389-Deposit.ts new file mode 100644 index 00000000..d7d02337 --- /dev/null +++ b/migrations/1667822226389-Deposit.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Deposit1667822226389 implements MigrationInterface { + name = "Deposit1667822226389"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "deposit" ADD "rewardsWindowIndex" integer`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "deposit" DROP COLUMN "rewardsWindowIndex"`); + } +} diff --git a/migrations/1668007817974-DepositsMaterializedView.ts b/migrations/1668007817974-DepositsMaterializedView.ts new file mode 100644 index 00000000..3ffda5fe --- /dev/null +++ b/migrations/1668007817974-DepositsMaterializedView.ts @@ -0,0 +1,39 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositsMaterializedView1668007817974 implements MigrationInterface { + name = "DepositsMaterializedView1668007817974"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP MATERIALIZED VIEW IF EXISTS "deposits_mv"`); + await queryRunner.query(`DROP VIEW IF EXISTS "deposit_referral_stats"`); + await queryRunner.query(`DROP VIEW IF EXISTS "deposits_filtered_referrals"`); + await queryRunner.query(`CREATE VIEW "deposits_filtered_referrals" AS + SELECT + d.id, + d."stickyReferralAddress", + d."depositDate", + d."priceId", + d."tokenId", + d.amount, + d."depositorAddr", + case when d."rewardsWindowIndex" = c."windowIndex" then d."rewardsWindowIndex" else -1 end as "claimedWindowIndex", + hmp."usd", + t.decimals + FROM deposit d + JOIN historic_market_price hmp on d."priceId" = hmp.id + JOIN token t on d."tokenId" = t.id + LEFT JOIN claim c on d."rewardsWindowIndex" = c."windowIndex" and d."referralAddress" = c."account" + WHERE "stickyReferralAddress" is not null + AND "depositDate" is not null + AND "tokenId" is not null + AND "priceId" is not null + AND status = 'filled'; + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP MATERIALIZED VIEW "deposits_mv"`); + await queryRunner.query(`DROP VIEW "deposit_referral_stats"`); + await queryRunner.query(`DROP VIEW "deposits_filtered_referrals"`); + } +} diff --git a/migrations/1668339782207-DepositReferralStat.ts b/migrations/1668339782207-DepositReferralStat.ts new file mode 100644 index 00000000..7bf4ba9d --- /dev/null +++ b/migrations/1668339782207-DepositReferralStat.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositReferralStat1668339782207 implements MigrationInterface { + name = "DepositReferralStat1668339782207"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "deposit_referral_stat" ( + "id" SERIAL NOT NULL, + "depositId" integer NOT NULL, + "referralCount" integer NOT NULL, + "referralVolume" numeric NOT NULL, + "createdAt" TIMESTAMP NOT NULL DEFAULT now(), + "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_74ce2ecc7d76a2e59039e94fcfc" PRIMARY KEY ("id") + )`, + ); + await queryRunner.query(`CREATE UNIQUE INDEX "UK_drs_depositId" ON deposit_referral_stat ("depositId");`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "deposit_referral_stat"`); + } +} diff --git a/migrations/1668339782208-DepositsMaterializedView.ts b/migrations/1668339782208-DepositsMaterializedView.ts new file mode 100644 index 00000000..7fd9fe62 --- /dev/null +++ b/migrations/1668339782208-DepositsMaterializedView.ts @@ -0,0 +1,54 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DepositsMaterializedView1668339782208 implements MigrationInterface { + name = "DepositsMaterializedView1668339782208"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP MATERIALIZED VIEW IF EXISTS "deposits_mv"`); + await queryRunner.query(`CREATE MATERIALIZED VIEW "deposits_mv" AS + SELECT + d.id, + d."depositId", + d."depositTxHash", + d."sourceChainId", + d."destinationChainId", + d.amount, + t.symbol, + t.decimals, + d."depositorAddr", + d."rewardsWindowIndex", + case when d."rewardsWindowIndex" = c."windowIndex" and d."depositorAddr" = c.account then d."rewardsWindowIndex" else -1 end as "depositorClaimedWindowIndex", + case when d."rewardsWindowIndex" = c."windowIndex" and d."stickyReferralAddress" = c.account then d."rewardsWindowIndex" else -1 end as "referralClaimedWindowIndex", + d."stickyReferralAddress" AS "referralAddress", + d."depositDate", + hmp.usd AS "tokenUsdPrice", + (d."realizedLpFeePctCapped" / power(10, 18)) * (d.amount / power(10, t.decimals)) * hmp.usd AS "realizedLpFeeUsd", + (d."bridgeFeePct" / power(10, 18)) * (d.amount / power(10, t.decimals)) * hmp.usd AS "bridgeFeeUsd", + CASE + WHEN d1."referralCount" >= 20 OR d1."referralVolume" >= 500000 THEN 0.8 + WHEN d1."referralCount" >= 10 OR d1."referralVolume" >= 250000 THEN 0.7 + WHEN d1."referralCount" >= 5 OR d1."referralVolume" >= 100000 THEN 0.6 + WHEN d1."referralCount" >= 3 OR d1."referralVolume" >= 50000 THEN 0.5 + ELSE 0.4 + END AS "referralRate", + CASE + WHEN d."depositDate" < '2022-07-22 17:00:00' THEN 3 + ELSE 2 + END AS multiplier + FROM deposit d + JOIN "deposit_referral_stat" d1 ON d."id" = d1."depositId" + JOIN token t ON d."tokenId" = t.id + JOIN historic_market_price hmp ON d."priceId" = hmp.id + LEFT JOIN claim c on d."rewardsWindowIndex" = c."windowIndex" and (d."stickyReferralAddress" = c."account" or c.account = d."depositorAddr") + ORDER BY d."depositDate" desc; + `); + + await queryRunner.query( + `CREATE UNIQUE INDEX "UK_deposits_mv_depositId_sourceChainId" ON deposits_mv ("depositId", "sourceChainId");`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP MATERIALIZED VIEW "deposits_mv"`); + } +} diff --git a/package.json b/package.json index 2b87727c..cee776e0 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "db:migration:run": "yarn typeorm -- migration:run -d ormconfig.ts" }, "dependencies": { - "@across-protocol/contracts-v2": "^1.0.0", + "@across-protocol/contracts-v2": "^1.0.7", "@nestjs/axios": "^0.0.8", "@nestjs/bull": "^0.5.5", "@nestjs/cli": "^8.2.4", @@ -48,6 +48,7 @@ "async": "^3.2.4", "async-retry": "^1.3.3", "bignumber.js": "^9.0.2", + "bluebird": "^3.7.2", "bull": "^4.8.4", "cache-manager": "^4.0.0", "class-transformer": "^0.5.1", @@ -76,6 +77,7 @@ "devDependencies": { "@types/async": "^3.2.13", "@types/bignumber.js": "^5.0.0", + "@types/bluebird": "^3.5.37", "@types/cron": "^2.0.0", "@types/express": "^4.17.13", "@types/jest": "^27.4.1", diff --git a/src/modules/airdrop/entry-points/http/controller.ts b/src/modules/airdrop/entry-points/http/controller.ts index 5c710e3d..d7849aa5 100644 --- a/src/modules/airdrop/entry-points/http/controller.ts +++ b/src/modules/airdrop/entry-points/http/controller.ts @@ -91,7 +91,7 @@ export class AirdropController { @UseGuards(JwtAuthGuard, RolesGuard) @UseInterceptors( FileInterceptor("file", { - limits: { fileSize: 50 * 1024 * 1024 }, + limits: { fileSize: 100 * 1024 * 1024 }, dest: "./uploads", }), ) diff --git a/src/modules/airdrop/model/merkle-distributor-recipient.entity.ts b/src/modules/airdrop/model/merkle-distributor-recipient.entity.ts index 634b1721..dc5d3772 100644 --- a/src/modules/airdrop/model/merkle-distributor-recipient.entity.ts +++ b/src/modules/airdrop/model/merkle-distributor-recipient.entity.ts @@ -13,7 +13,7 @@ export type MerkleDistributorRecipientPayload = { @Entity() // A recipient address can't appear twice for the same window -@Unique("UK_merkle_distributor_recipient_merkleDistributorWindowId_address", ["merkleDistributorWindowId", "address"]) +@Unique("UK_merkle_distributor_recipient_windowId_address", ["merkleDistributorWindowId", "address"]) export class MerkleDistributorRecipient { @PrimaryGeneratedColumn() id: number; diff --git a/src/modules/airdrop/model/merkle-distributor-window.entity.ts b/src/modules/airdrop/model/merkle-distributor-window.entity.ts index 7d6a3e6a..8a4364ca 100644 --- a/src/modules/airdrop/model/merkle-distributor-window.entity.ts +++ b/src/modules/airdrop/model/merkle-distributor-window.entity.ts @@ -1,5 +1,6 @@ import { Column, CreateDateColumn, Entity, OneToMany, PrimaryGeneratedColumn, Unique } from "typeorm"; import { MerkleDistributorRecipient } from "./merkle-distributor-recipient.entity"; +import { Claim } from "../../scraper/model/claim.entity"; @Entity() // Don't allow duplicates of the window index @@ -29,6 +30,9 @@ export class MerkleDistributorWindow { @OneToMany(() => MerkleDistributorRecipient, (recipient) => recipient.merkleDistributorWindow) recipients: MerkleDistributorRecipient; + @OneToMany(() => Claim, (claim) => claim.merkleDistributorWindow) + claims: Claim; + @CreateDateColumn() createdAt: Date; } diff --git a/src/modules/airdrop/services/airdrop-service.ts b/src/modules/airdrop/services/airdrop-service.ts index 2b59831f..69c663c5 100644 --- a/src/modules/airdrop/services/airdrop-service.ts +++ b/src/modules/airdrop/services/airdrop-service.ts @@ -345,7 +345,7 @@ export class AirdropService { } const wei = new BigNumber(10).pow(18); - communityRewards.amount = new BigNumber(amount).multipliedBy(wei).toString(); + communityRewards.amount = new BigNumber(amount).multipliedBy(wei).toFixed(); communityRewards.discordId = discordId; communityRewards.processed = true; @@ -370,9 +370,9 @@ export class AirdropService { } const wei = new BigNumber(10).pow(18); - walletRewards.earlyUserRewards = new BigNumber(earlyUserRewards).multipliedBy(wei).toString(); - walletRewards.liquidityProviderRewards = new BigNumber(liquidityProviderRewards).multipliedBy(wei).toString(); - walletRewards.welcomeTravellerRewards = new BigNumber(welcomeTravellerRewards).multipliedBy(wei).toString(); + walletRewards.earlyUserRewards = new BigNumber(earlyUserRewards).multipliedBy(wei).toFixed(); + walletRewards.liquidityProviderRewards = new BigNumber(liquidityProviderRewards).multipliedBy(wei).toFixed(); + walletRewards.welcomeTravellerRewards = new BigNumber(welcomeTravellerRewards).multipliedBy(wei).toFixed(); walletRewards.walletAddress = walletAddress; walletRewards.processed = true; diff --git a/src/modules/configuration/index.ts b/src/modules/configuration/index.ts index c2ef1dbd..6b098f26 100644 --- a/src/modules/configuration/index.ts +++ b/src/modules/configuration/index.ts @@ -39,7 +39,7 @@ export const configValues = () => ({ // 69: process.env.WEB3_NODE_URL_69, // 4: process.env.WEB3_NODE_URL_4, // 80001: process.env.WEB3_NODE_URL_80001, - // 5: process.env.WEB3_NODE_URL_5, + 5: process.env.WEB3_NODE_URL_5, }, spokePoolContracts: { [ChainIds.mainnet]: { @@ -63,9 +63,19 @@ export const configValues = () => ({ startBlockNumber: 28604263, }, }, + merkleDistributor: { + address: process.env.MERKLE_DISTRIBUTOR_ADDRESS || "0xF633b72A4C2Fb73b77A379bf72864A825aD35b6D", // TODO: replace with mainnet + chainId: Number(process.env.MERKLE_DISTRIBUTOR_CHAIN_ID || "5"), + referralsStartWindowIndex: Number(process.env.REFERRALS_START_WINDOW_INDEX || "1"), + startBlockNumber: Number(process.env.MERKLE_DISTRIBUTOR_START_BLOCK || 7884371), + }, + acx: { + address: process.env.ACX_ADDRESS || "0x40153DdFAd90C49dbE3F5c9F96f2a5B25ec67461", // TODO: replace with mainnet, + }, }, acxUsdPrice: 0.1, enableSpokePoolsEventsProcessing: process.env.ENABLE_SPOKE_POOLS_EVENTS_PROCESSING === "true", + enableMerkleDistributorEventsProcessing: process.env.ENABLE_MERKLE_DISTRIBUTOR_EVENTS_PROCESSING === "true", enableReferralsMaterializedViewRefresh: process.env.ENABLE_REFERRALS_MATERIALIZED_VIEW_REFRESH === "true", allowWalletRewardsEdit: process.env.ALLOW_WALLET_REWARDS_EDIT === "true", stickyReferralAddressesMechanism: process.env.STICKY_REFERRAL_ADDRESSES_MECHANISM diff --git a/src/modules/database/database.providers.ts b/src/modules/database/database.providers.ts index 53b9e0b3..b465599e 100644 --- a/src/modules/database/database.providers.ts +++ b/src/modules/database/database.providers.ts @@ -2,6 +2,8 @@ import { TypeOrmOptionsFactory, TypeOrmModuleOptions } from "@nestjs/typeorm"; import { Injectable } from "@nestjs/common"; import { AppConfig } from "../configuration/configuration.service"; import { ProcessedBlock } from "../scraper/model/ProcessedBlock.entity"; +import { MerkleDistributorProcessedBlock } from "../scraper/model/MerkleDistributorProcessedBlock.entity"; +import { Claim } from "../scraper/model/claim.entity"; import { Block } from "../web3/model/block.entity"; import { Deposit } from "../scraper/model/deposit.entity"; import { Token } from "../web3/model/token.entity"; @@ -13,10 +15,16 @@ import { CommunityRewards } from "../airdrop/model/community-rewards.entity"; import { UserWallet } from "../user/model/user-wallet.entity"; import { MerkleDistributorRecipient } from "../airdrop/model/merkle-distributor-recipient.entity"; import { MerkleDistributorWindow } from "../airdrop/model/merkle-distributor-window.entity"; +import { DepositReferralStats } from "../referral/model/DepositReferralStats.entity"; +import { DepositsMv } from "../deposit/model/DepositsMv.entity"; +import { DepositsFilteredReferrals } from "../referral/model/DepositsFilteredReferrals.entity"; +import { DepositReferralStat } from "../deposit/model/deposit-referral-stat.entity"; // TODO: Add db entities here const entities = [ ProcessedBlock, + MerkleDistributorProcessedBlock, + Claim, Block, Deposit, Token, @@ -28,6 +36,10 @@ const entities = [ UserWallet, MerkleDistributorWindow, MerkleDistributorRecipient, + DepositReferralStats, + DepositsMv, + DepositsFilteredReferrals, + DepositReferralStat, ]; @Injectable() diff --git a/src/modules/deposit/model/DepositsMv.entity.ts b/src/modules/deposit/model/DepositsMv.entity.ts new file mode 100644 index 00000000..162c36f6 --- /dev/null +++ b/src/modules/deposit/model/DepositsMv.entity.ts @@ -0,0 +1,104 @@ +import { ViewEntity, ViewColumn, Unique } from "typeorm"; + +import { DepositReferralStats } from "../../referral/model/DepositReferralStats.entity"; + +@ViewEntity({ + dependsOn: [DepositReferralStats], + materialized: true, + expression: ` + SELECT + d.id, + d."depositId", + d."depositTxHash", + d."sourceChainId", + d."destinationChainId", + d.amount, + t.symbol, + t.decimals, + d."depositorAddr", + d."rewardsWindowIndex", + case when d."rewardsWindowIndex" = c."windowIndex" and d."depositorAddr" = c.account then d."rewardsWindowIndex" else -1 end as "depositorClaimedWindowIndex", + case when d."rewardsWindowIndex" = c."windowIndex" and d."stickyReferralAddress" = c.account then d."rewardsWindowIndex" else -1 end as "referralClaimedWindowIndex", + d."stickyReferralAddress" AS "referralAddress", + d."depositDate", + hmp.usd AS "tokenUsdPrice", + (d."realizedLpFeePctCapped" / power(10, 18)) * (d.amount / power(10, t.decimals)) * hmp.usd AS "realizedLpFeeUsd", + (d."bridgeFeePct" / power(10, 18)) * (d.amount / power(10, t.decimals)) * hmp.usd AS "bridgeFeeUsd", + CASE + WHEN d1."referralCount" >= 20 OR d1."referralVolume" >= 500000 THEN 0.8 + WHEN d1."referralCount" >= 10 OR d1."referralVolume" >= 250000 THEN 0.7 + WHEN d1."referralCount" >= 5 OR d1."referralVolume" >= 100000 THEN 0.6 + WHEN d1."referralCount" >= 3 OR d1."referralVolume" >= 50000 THEN 0.5 + ELSE 0.4 + END AS "referralRate", + CASE + WHEN d."depositDate" < '2022-07-22 17:00:00' THEN 3 + ELSE 2 + END AS multiplier + FROM deposit d + JOIN "deposit_referral_stat" d1 ON d."id" = d1."depositId" + JOIN token t ON d."tokenId" = t.id + JOIN historic_market_price hmp ON d."priceId" = hmp.id + LEFT JOIN claim c on d."rewardsWindowIndex" = c."windowIndex" and (d."stickyReferralAddress" = c."account" or c.account = d."depositorAddr") + ORDER BY d."depositDate" desc; + `, +}) +@Unique("UK_deposits_mv_depositId_sourceChainId", ["depositId", "sourceChainId"]) +export class DepositsMv { + @ViewColumn() + id: number; + + @ViewColumn() + depositId: number; + + @ViewColumn() + depositTxHash: string; + + @ViewColumn() + sourceChainId: number; + + @ViewColumn() + destinationChainId: number; + + @ViewColumn() + amount: string; + + @ViewColumn() + symbol: string; + + @ViewColumn() + decimals: number; + + @ViewColumn() + depositorAddr: string; + + @ViewColumn() + referralAddress: string; + + @ViewColumn() + referralRate: number; + + @ViewColumn() + multiplier: number; + + @ViewColumn() + rewardsWindowIndex: number; + + @ViewColumn() + depositorClaimedWindowIndex: number; + + @ViewColumn() + referralClaimedWindowIndex: number; + + @ViewColumn() + depositDate: Date; + + @ViewColumn() + tokenUsdPrice: string; + + @ViewColumn() + realizedLpFeeUsd: string; + + @ViewColumn() + bridgeFeeUsd: string; +} diff --git a/src/modules/deposit/model/deposit-referral-stat.entity.ts b/src/modules/deposit/model/deposit-referral-stat.entity.ts new file mode 100644 index 00000000..18393212 --- /dev/null +++ b/src/modules/deposit/model/deposit-referral-stat.entity.ts @@ -0,0 +1,23 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, Unique, UpdateDateColumn } from "typeorm"; + +@Entity() +@Unique("UK_drs_depositId", ["depositId"]) +export class DepositReferralStat { + @PrimaryGeneratedColumn() + id: number; + + @Column() + depositId: number; + + @Column() + referralCount: number; + + @Column({ type: "decimal" }) + referralVolume: string; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/src/modules/market-price/adapters/hmp-fixture.ts b/src/modules/market-price/adapters/hmp-fixture.ts new file mode 100644 index 00000000..4e53a292 --- /dev/null +++ b/src/modules/market-price/adapters/hmp-fixture.ts @@ -0,0 +1,32 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; +import { HistoricMarketPrice } from "../model/historic-market-price.entity"; + +@Injectable() +export class HistoricMarketPriceFixture { + public constructor(@InjectRepository(HistoricMarketPrice) private priceRepository: Repository) {} + + public insertPrice(args: Partial) { + const price = this.priceRepository.create(this.mockPriceEntity(args)); + return this.priceRepository.save(price); + } + + public insertManyPrices(args: Partial[]) { + const createdPrices = this.priceRepository.create(args); + return this.priceRepository.save(createdPrices); + } + + public deleteAllPrices() { + return this.priceRepository.query(`truncate table "historic_market_price" restart identity cascade`); + } + + public mockPriceEntity(overrides: Partial): Partial { + return { + symbol: "TOK", + date: new Date().toISOString(), + usd: "1", + ...overrides, + }; + } +} diff --git a/src/modules/market-price/module.ts b/src/modules/market-price/module.ts index df13788c..9f1020e9 100644 --- a/src/modules/market-price/module.ts +++ b/src/modules/market-price/module.ts @@ -3,11 +3,12 @@ import { Module } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; import { Deposit } from "../scraper/model/deposit.entity"; import { CoinGeckoService } from "./adapters/coingecko"; +import { HistoricMarketPriceFixture } from "./adapters/hmp-fixture"; import { HistoricMarketPrice } from "./model/historic-market-price.entity"; import { MarketPriceService } from "./services/service"; @Module({ - providers: [MarketPriceService, CoinGeckoService], + providers: [MarketPriceService, CoinGeckoService, HistoricMarketPriceFixture], exports: [MarketPriceService], imports: [HttpModule, TypeOrmModule.forFeature([HistoricMarketPrice, Deposit])], }) diff --git a/src/modules/referral/entry-points/http/controller.ts b/src/modules/referral/entry-points/http/controller.ts index 086bff93..714aca58 100644 --- a/src/modules/referral/entry-points/http/controller.ts +++ b/src/modules/referral/entry-points/http/controller.ts @@ -1,7 +1,15 @@ -import { Controller, Get, Query } from "@nestjs/common"; -import { ApiTags } from "@nestjs/swagger"; +import { Controller, Get, Query, UseGuards, Post, Body, Delete } from "@nestjs/common"; +import { ApiTags, ApiBearerAuth } from "@nestjs/swagger"; + import { ReferralService } from "../../services/service"; -import { GetReferralsQuery, GetReferralsSummaryQuery } from "./dto"; +import { + PostReferralsMerkleDistributionBody, + GetReferralsQuery, + GetReferralsSummaryQuery, + DeleteReferralsMerkleDistributionBody, +} from "./dto"; +import { JwtAuthGuard } from "../../../auth/entry-points/http/jwt.guard"; +import { Role, Roles, RolesGuard } from "../../../auth/entry-points/http/roles"; @Controller() export class ReferralController { @@ -20,4 +28,24 @@ export class ReferralController { const offset = isNaN(parseInt(query.offset)) ? 10 : parseInt(query.offset); return this.referralService.getReferrals(query.address, limit, offset); } + + @Post("referrals/merkle-distribution") + @Roles(Role.Admin) + @UseGuards(JwtAuthGuard, RolesGuard) + @ApiBearerAuth() + @ApiTags("referrals") + postReferralsMerkleDistribution(@Body() body: PostReferralsMerkleDistributionBody) { + const { maxDepositDate, windowIndex } = body; + return this.referralService.createReferralsMerkleDistribution(parseInt(windowIndex), new Date(maxDepositDate)); + } + + @Delete("referrals/merkle-distribution") + @Roles(Role.Admin) + @UseGuards(JwtAuthGuard, RolesGuard) + @ApiBearerAuth() + @ApiTags("referrals") + deleteReferralsMerkleDistribution(@Body() body: DeleteReferralsMerkleDistributionBody) { + const { windowIndex } = body; + return this.referralService.revertReferralsMerkleDistribution(parseInt(windowIndex)); + } } diff --git a/src/modules/referral/entry-points/http/dto.ts b/src/modules/referral/entry-points/http/dto.ts index d264c90a..5fff45e7 100644 --- a/src/modules/referral/entry-points/http/dto.ts +++ b/src/modules/referral/entry-points/http/dto.ts @@ -1,5 +1,5 @@ import { ApiProperty } from "@nestjs/swagger"; -import { IsNumberString, IsString, Length } from "class-validator"; +import { IsDate, IsDateString, IsNumberString, IsString, Length } from "class-validator"; export class GetReferralsSummaryQuery { @IsString() @@ -22,3 +22,19 @@ export class GetReferralsQuery { @ApiProperty({ example: "0", required: false }) offset: string; } + +export class PostReferralsMerkleDistributionBody { + @IsDateString() + @ApiProperty({ example: "2022-11-08T11:00:00.000Z", required: true }) + maxDepositDate: string; + + @IsNumberString() + @ApiProperty({ example: "0", required: true }) + windowIndex: string; +} + +export class DeleteReferralsMerkleDistributionBody { + @IsNumberString() + @ApiProperty({ example: "0", required: true }) + windowIndex: string; +} diff --git a/src/modules/referral/model/DepositReferralStats.entity.ts b/src/modules/referral/model/DepositReferralStats.entity.ts new file mode 100644 index 00000000..0b694030 --- /dev/null +++ b/src/modules/referral/model/DepositReferralStats.entity.ts @@ -0,0 +1,29 @@ +import { ViewEntity, ViewColumn } from "typeorm"; +import { DepositsFilteredReferrals } from "./DepositsFilteredReferrals.entity"; + +@ViewEntity({ + expression: ` + SELECT + d1.id, + count(distinct d2."depositorAddr") as "referralCount", + sum((d2.amount / power(10, t.decimals)) * hmp.usd) as "referralVolume" + FROM deposits_filtered_referrals d1 + LEFT JOIN deposits_filtered_referrals d2 on d1."stickyReferralAddress" = d2."stickyReferralAddress" AND + d1."depositDate" >= d2."depositDate" AND + d1."claimedWindowIndex" = d2."claimedWindowIndex" + JOIN historic_market_price hmp on d2."priceId" = hmp.id + JOIN token t on d2."tokenId" = t.id + GROUP BY d1.id + `, + dependsOn: [DepositsFilteredReferrals], +}) +export class DepositReferralStats { + @ViewColumn() + id: number; + + @ViewColumn() + referralCount: number; + + @ViewColumn() + referralVolume: number; +} diff --git a/src/modules/referral/model/DepositsFilteredReferrals.entity.ts b/src/modules/referral/model/DepositsFilteredReferrals.entity.ts new file mode 100644 index 00000000..029a46df --- /dev/null +++ b/src/modules/referral/model/DepositsFilteredReferrals.entity.ts @@ -0,0 +1,52 @@ +import { ViewEntity, ViewColumn } from "typeorm"; + +@ViewEntity({ + expression: ` + SELECT + d.id, + d."stickyReferralAddress", + d."depositDate", + d."priceId", + d."tokenId", + d.amount, + case when d."rewardsWindowIndex" = c."windowIndex" then d."rewardsWindowIndex" else -1 end as "claimedWindowIndex" + FROM deposit d + left join claim c on d."rewardsWindowIndex" = c."windowIndex" and d."referralAddress" = c."account" + WHERE "stickyReferralAddress" is not null + AND "depositDate" is not null + AND "tokenId" is not null + AND "priceId" is not null + AND status = 'filled'; + `, +}) +export class DepositsFilteredReferrals { + @ViewColumn() + id: number; + + @ViewColumn() + stickyReferralAddress?: string; + + @ViewColumn() + tokenId?: number; + + @ViewColumn() + priceId?: number; + + @ViewColumn() + depositDate?: Date; + + @ViewColumn() + amount: string; + + @ViewColumn() + depositorAddr: string; + + @ViewColumn() + claimedWindowIndex?: number; + + @ViewColumn() + usd: string; + + @ViewColumn() + decimals: number; +} diff --git a/src/modules/referral/module.ts b/src/modules/referral/module.ts index c329b466..e81e6912 100644 --- a/src/modules/referral/module.ts +++ b/src/modules/referral/module.ts @@ -1,6 +1,7 @@ import { Module } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; import { AppConfigModule } from "../configuration/configuration.module"; +import { DepositsMv } from "../deposit/model/DepositsMv.entity"; import { Deposit } from "../scraper/model/deposit.entity"; import { ReferralController } from "./entry-points/http/controller"; import { ReferralCronService } from "./services/cron-service"; @@ -10,6 +11,6 @@ import { ReferralService } from "./services/service"; controllers: [ReferralController], exports: [ReferralService], providers: [ReferralService, ReferralCronService], - imports: [TypeOrmModule.forFeature([Deposit]), AppConfigModule], + imports: [TypeOrmModule.forFeature([Deposit, DepositsMv]), AppConfigModule], }) export class ReferralModule {} diff --git a/src/modules/referral/services/cron-service.ts b/src/modules/referral/services/cron-service.ts index ec3bc084..5049a5ac 100644 --- a/src/modules/referral/services/cron-service.ts +++ b/src/modules/referral/services/cron-service.ts @@ -3,9 +3,10 @@ import { Repository } from "typeorm"; import { InjectRepository } from "@nestjs/typeorm"; import { AppConfig } from "../../configuration/configuration.service"; import { Deposit } from "../../scraper/model/deposit.entity"; -import { EnhancedCron, wait } from "../../../utils"; +import { EnhancedCron } from "../../../utils"; import { updateStickyReferralAddressesQuery } from "../services/queries"; import { StickyReferralAddressesMechanism } from "../../configuration"; +import { ReferralService } from "./service"; @Injectable() export class ReferralCronService { @@ -15,6 +16,7 @@ export class ReferralCronService { constructor( @InjectRepository(Deposit) private depositRepository: Repository, private appConfig: AppConfig, + private referralService: ReferralService, ) {} @EnhancedCron("0 */10 * * * *") @@ -23,8 +25,6 @@ export class ReferralCronService { if (this.semaphore) return; this.semaphore = true; await this.updateStickyReferralAddresses(); - // cooldown period - await wait(30); await this.refreshMaterializedView(); this.semaphore = false; } catch (error) { @@ -39,6 +39,7 @@ export class ReferralCronService { this.logger.log(`disabled refreshMaterializedView()`); } else { try { + await this.referralService.cumputeReferralStats(); await this.depositRepository.query(`REFRESH MATERIALIZED VIEW CONCURRENTLY deposits_mv;`); } catch (error) { this.logger.error(error); diff --git a/src/modules/referral/services/exceptions.ts b/src/modules/referral/services/exceptions.ts new file mode 100644 index 00000000..3dfdff4d --- /dev/null +++ b/src/modules/referral/services/exceptions.ts @@ -0,0 +1,13 @@ +import { HttpException, HttpStatus } from "@nestjs/common"; + +export class WindowAlreadySetException extends HttpException { + constructor() { + super( + { + error: WindowAlreadySetException.name, + message: "Window is already set", + }, + HttpStatus.BAD_REQUEST, + ); + } +} diff --git a/src/modules/referral/services/queries.ts b/src/modules/referral/services/queries.ts index aa36ecc7..83e365a3 100644 --- a/src/modules/referral/services/queries.ts +++ b/src/modules/referral/services/queries.ts @@ -40,8 +40,7 @@ export const getTotalReferralRewardsQuery = () => { end ) as "acxRewards" from deposits_mv as d - where d."referralAddress" = $1 or - (d."depositorAddr" = $1 and d."referralAddress" is not null); + where (d."referralAddress" = $1 and d."referralClaimedWindowIndex" = -1) or (d."depositorAddr" = $1 and d."depositorClaimedWindowIndex" = -1); `; }; @@ -49,21 +48,21 @@ export const getReferreeWalletsQuery = () => { return `select count(*) from ( select distinct on (d."depositorAddr") d."depositorAddr" from deposits_mv as d - where d."referralAddress" = $1 + where d."referralAddress" = $1 and d."referralClaimedWindowIndex" = -1 ) t`; }; export const getReferralTransfersQuery = () => { return `select count(*) from deposits_mv as d - where d."referralAddress" = $1`; + where d."referralAddress" = $1 and d."referralClaimedWindowIndex" = -1`; }; export const getReferralVolumeQuery = () => { return ` - select sum(d.amount / power(10, d.decimals) * d."tokenUsdPrice") as volume + select coalesce(sum(d.amount / power(10, d.decimals) * d."tokenUsdPrice"), 0) as volume from deposits_mv as d - where d."referralAddress" = $1`; + where d."referralAddress" = $1 and d."referralClaimedWindowIndex" = -1`; }; export const getActiveRefereesCountQuery = () => { @@ -72,6 +71,7 @@ export const getActiveRefereesCountQuery = () => { from ( select d."depositorAddr", d."depositDate", d."referralAddress", row_number() over (partition by d."depositorAddr" order by d."depositDate" desc) r from deposits_mv as d + where d."referralClaimedWindowIndex" = -1 ) temp where temp.r = 1 and temp."referralAddress" = $1; `; @@ -122,3 +122,7 @@ export const updateStickyReferralAddressesForDepositor = () => { where deposit.id = d4.id; `; }; + +export const getRefreshMaterializedView = () => { + return `REFRESH MATERIALIZED VIEW deposits_mv`; +}; diff --git a/src/modules/referral/services/service.ts b/src/modules/referral/services/service.ts index 17c5ac0c..00bce435 100644 --- a/src/modules/referral/services/service.ts +++ b/src/modules/referral/services/service.ts @@ -1,6 +1,11 @@ -import { Injectable } from "@nestjs/common"; +import { Injectable, Logger } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; -import { Repository } from "typeorm"; +import { DataSource, EntityManager, In, Repository } from "typeorm"; +import BigNumber from "bignumber.js"; +import { performance } from "perf_hooks"; +import Bluebird from "bluebird"; +import { ethers } from "ethers"; + import { Deposit } from "../../scraper/model/deposit.entity"; import { getActiveRefereesCountQuery, @@ -10,17 +15,26 @@ import { getReferralVolumeQuery, getReferreeWalletsQuery, getTotalReferralRewardsQuery, + getRefreshMaterializedView, } from "./queries"; -import { ethers } from "ethers"; import { AppConfig } from "../../configuration/configuration.service"; +import { DepositsMv } from "../../deposit/model/DepositsMv.entity"; +import { WindowAlreadySetException } from "./exceptions"; +import { DepositsFilteredReferrals } from "../model/DepositsFilteredReferrals.entity"; +import { DepositReferralStat } from "../../deposit/model/deposit-referral-stat.entity"; +import { splitArrayInChunks } from "../../../utils"; const REFERRAL_ADDRESS_DELIMITER = "d00dfeeddeadbeef"; @Injectable() export class ReferralService { + private logger = new Logger(ReferralService.name); + constructor( @InjectRepository(Deposit) private depositRepository: Repository, + @InjectRepository(DepositsMv) private depositsMvRepository: Repository, private appConfig: AppConfig, + private dataSource: DataSource, ) {} public async getReferralSummary(address: string) { @@ -80,6 +94,48 @@ export class ReferralService { }; } + public async createReferralsMerkleDistribution(windowIndex: number, maxDepositDate: Date) { + return this.dataSource.transaction("REPEATABLE READ", async (entityManager) => { + const depositWithSameWindowIndex = await entityManager + .createQueryBuilder(Deposit, "d") + .where("d.rewardsWindowIndex = :windowIndex", { windowIndex }) + .getOne(); + + if (Boolean(depositWithSameWindowIndex)) { + throw new WindowAlreadySetException(); + } + + const deposits = await entityManager + .createQueryBuilder(DepositsMv, "deposit") + .where("deposit.rewardsWindowIndex IS NULL") + .andWhere("deposit.depositDate <= :maxDepositDate", { maxDepositDate }) + .getMany(); + console.log(`found ${deposits.length} deposits`); + const { recipients, rewardsToDeposit } = this.calculateReferralRewards(deposits); + + for (const depositsChunk of splitArrayInChunks(deposits, 100)) { + await this.dataSource + .createQueryBuilder() + .update(Deposit) + .set({ rewardsWindowIndex: windowIndex }) + .where({ id: In(depositsChunk.map((d) => d.id)) }) + .execute(); + } + + return { + chainId: this.appConfig.values.web3.merkleDistributor.chainId, + rewardToken: this.appConfig.values.web3.acx.address, + windowIndex, + rewardsToDeposit, + recipients, + }; + }); + } + + public async revertReferralsMerkleDistribution(windowIndex: number) { + await this.depositRepository.update({ rewardsWindowIndex: windowIndex }, { rewardsWindowIndex: null }); + } + private getTierLevelAndBonus(transfersCount: number, transfersVolumeUsd: number) { if (transfersCount >= 20 || transfersVolumeUsd >= 500000) { return { referralRate: 0.8, tier: 5 }; @@ -139,4 +195,133 @@ export class ReferralService { } return undefined; } + + public refreshMaterializedView() { + return this.depositRepository.query(getRefreshMaterializedView()); + } + + public calculateReferralRewards(deposits: DepositsMv[]) { + // Map an address to considered deposits for referral rewards + const addressToDepositsMap = deposits.reduce((acc: Record, d) => { + if (d.referralAddress) { + acc[d.referralAddress] = [...(acc[d.referralAddress] || []), d]; + if (d.depositorAddr !== d.referralAddress) { + acc[d.depositorAddr] = [...(acc[d.depositorAddr] || []), d]; + } + } + return acc; + }, {}); + + let rewardsToDeposit: BigNumber = new BigNumber(0); + const recipients: { + account: string; + amount: string; + metadata: { + amountBreakdown: { + referralRewards: string; + }; + }; + }[] = []; + + for (const [address, deposits] of Object.entries(addressToDepositsMap)) { + const acxRewards = deposits.reduce((sum, d) => { + const feePct = + d.depositorAddr === address && d.referralAddress === address ? 1 : d.depositorAddr === address ? 0.25 : 0.75; + const rewards = new BigNumber(d.bridgeFeeUsd) + .multipliedBy(d.referralRate) + .multipliedBy(feePct) + .multipliedBy(d.multiplier) + .multipliedBy(new BigNumber(10).pow(18)) + .dividedBy(this.appConfig.values.acxUsdPrice) + .toFixed(0); + return sum.plus(rewards); + }, new BigNumber(0)); + + rewardsToDeposit = rewardsToDeposit.plus(acxRewards); + recipients.push({ + account: address, + amount: acxRewards.toFixed(), + metadata: { + amountBreakdown: { + referralRewards: acxRewards.toFixed(), + }, + }, + }); + } + + return { rewardsToDeposit: rewardsToDeposit.toFixed(), recipients }; + } + + public cumputeReferralStats() { + return this.dataSource.transaction("REPEATABLE READ", async (entityManager) => { + this.logger.log(`start cumputeReferralStats()`); + const t1 = performance.now(); + const window = -1; + + const deposits = await entityManager + .createQueryBuilder(DepositsFilteredReferrals, "d") + .select("d.stickyReferralAddress") + .where("d.claimedWindowIndex = :claimedWindowIndex", { claimedWindowIndex: window }) + .groupBy("d.stickyReferralAddress") + .getMany(); + const referralAddresses = deposits.map((deposit) => deposit.stickyReferralAddress); + this.logger.log(`window ${window}: ${referralAddresses.length} referralAddresses`); + await Bluebird.Promise.map( + referralAddresses, + (address) => { + return this.computeStatsForReferralAddress(entityManager, window, address); + }, + { concurrency: 10 }, + ); + + const t2 = performance.now(); + this.logger.log(`cumputeReferralStats() took ${(t2 - t1) / 1000} seconds`); + }); + } + + private async computeStatsForReferralAddress(entityManager: EntityManager, window: number, referralAddress: string) { + const depositsResult = await entityManager + .createQueryBuilder(DepositsFilteredReferrals, "d") + .where("d.claimedWindowIndex = :claimedWindowIndex", { claimedWindowIndex: window }) + .andWhere("d.stickyReferralAddress = :referralAddress", { referralAddress }) + .getMany(); + const depositorAddrCounts = {}; + const depositCounts = {}; + const depositVolume = {}; + let totalVolume = new BigNumber(0); + + let currentCount = 0; + const sortedDeposits = depositsResult.sort((d1, d2) => (d1.depositDate < d2.depositDate ? -1 : 0)); + + for (const deposit of sortedDeposits) { + const prevCount = depositorAddrCounts[deposit.depositorAddr]; + + if (!prevCount) { + depositCounts[deposit.id] = ++currentCount; + depositorAddrCounts[deposit.depositorAddr] = currentCount; + } else { + depositCounts[deposit.id] = currentCount; + } + + const volume = new BigNumber(deposit.amount) + .multipliedBy(deposit.usd) + .dividedBy(new BigNumber(10).pow(deposit.decimals)); + totalVolume = totalVolume.plus(volume); + depositVolume[deposit.id] = totalVolume; + } + + for (const depositsChunk of splitArrayInChunks(sortedDeposits, 100)) { + const values = depositsChunk.map((d) => ({ + depositId: d.id, + referralCount: depositCounts[d.id], + referralVolume: depositVolume[d.id].toFixed(), + })); + await entityManager + .createQueryBuilder(DepositReferralStat, "d") + .insert() + .values(values) + .orUpdate({ conflict_target: ["depositId"], overwrite: ["referralCount", "referralVolume"] }) + .execute(); + } + } } diff --git a/src/modules/scraper/adapter/db/claim-fixture.ts b/src/modules/scraper/adapter/db/claim-fixture.ts new file mode 100644 index 00000000..6e30f13c --- /dev/null +++ b/src/modules/scraper/adapter/db/claim-fixture.ts @@ -0,0 +1,36 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; +import { Claim } from "../../model/claim.entity"; + +@Injectable() +export class ClaimFixture { + public constructor(@InjectRepository(Claim) private claimRepository: Repository) {} + + public insertClaim(depositArgs: Partial) { + const Claim = this.claimRepository.create(this.mockClaimEntity(depositArgs)); + return this.claimRepository.save(Claim); + } + + public insertManyClaims(args: Partial[]) { + const createdDeposits = this.claimRepository.create(args); + return this.claimRepository.save(createdDeposits); + } + + public deleteAllClaims() { + return this.claimRepository.query(`truncate table claim restart identity cascade`); + } + + public mockClaimEntity(overrides: Partial): Partial { + return { + caller: "0x", + accountIndex: 0, + windowIndex: 1, + account: "0x", + rewardToken: "0x", + blockNumber: 1, + claimedAt: new Date(), + ...overrides, + }; + } +} diff --git a/src/modules/scraper/adapter/messaging/BlocksEventsConsumer.ts b/src/modules/scraper/adapter/messaging/BlocksEventsConsumer.ts index 9095f2a4..4d88559f 100644 --- a/src/modules/scraper/adapter/messaging/BlocksEventsConsumer.ts +++ b/src/modules/scraper/adapter/messaging/BlocksEventsConsumer.ts @@ -20,7 +20,7 @@ export class BlocksEventsConsumer { private scraperQueuesService: ScraperQueuesService, ) {} - @Process({ concurrency: 5 }) + @Process() private async process(job: Job) { const { chainId, from, to } = job.data; const depositEvents: FundsDepositedEvent[] = await this.providers diff --git a/src/modules/scraper/adapter/messaging/MerkleDistributorBlocksEventsConsumer.ts b/src/modules/scraper/adapter/messaging/MerkleDistributorBlocksEventsConsumer.ts new file mode 100644 index 00000000..ec6405ad --- /dev/null +++ b/src/modules/scraper/adapter/messaging/MerkleDistributorBlocksEventsConsumer.ts @@ -0,0 +1,63 @@ +import { OnQueueFailed, Process, Processor } from "@nestjs/bull"; +import { Logger } from "@nestjs/common"; +import { Job } from "bull"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository, QueryFailedError } from "typeorm"; + +import { EthProvidersService } from "../../../web3/services/EthProvidersService"; +import { MerkleDistributorBlocksEventsQueueMessage, ScraperQueue } from "."; +import { ClaimedEvent } from "@across-protocol/contracts-v2/dist/typechain/MerkleDistributor"; +import { Claim } from "../../model/claim.entity"; +import { utils } from "ethers"; + +@Processor(ScraperQueue.MerkleDistributorBlocksEvents) +export class MerkleDistributorBlocksEventsConsumer { + private logger = new Logger(MerkleDistributorBlocksEventsConsumer.name); + + constructor( + private providers: EthProvidersService, + @InjectRepository(Claim) private claimRepository: Repository, + ) {} + + @Process({ concurrency: 1 }) + private async process(job: Job) { + const { chainId, from, to } = job.data; + const claimedEvents: ClaimedEvent[] = await this.providers.getMerkleDistributorQuerier().getClaimedEvents(from, to); + this.logger.log(`(${from}, ${to}) - chainId ${chainId} - found ${claimedEvents.length} ClaimedEvent`); + + for (const event of claimedEvents) { + try { + const claim = await this.fromClaimedEventToClaim(event, chainId); + await this.claimRepository.insert(claim); + } catch (error) { + if (error instanceof QueryFailedError && error.driverError?.code === "23505") { + // Ignore duplicate key value violates unique constraint error. + this.logger.warn(error); + } else { + throw error; + } + } + } + } + + private async fromClaimedEventToClaim(event: ClaimedEvent, chainId: number) { + const { blockNumber } = event; + const { caller, accountIndex, windowIndex, account, rewardToken } = event.args; + const blockTimestamp = (await this.providers.getCachedBlock(chainId, blockNumber)).date; + + return this.claimRepository.create({ + caller, + accountIndex: accountIndex.toNumber(), + windowIndex: windowIndex.toNumber(), + account: utils.getAddress(account), + rewardToken: utils.getAddress(rewardToken), + blockNumber: blockNumber, + claimedAt: blockTimestamp, + }); + } + + @OnQueueFailed() + private onQueueFailed(job: Job, error: Error) { + this.logger.error(`${ScraperQueue.MerkleDistributorBlocksEvents} ${JSON.stringify(job.data)} failed: ${error}`); + } +} diff --git a/src/modules/scraper/adapter/messaging/index.ts b/src/modules/scraper/adapter/messaging/index.ts index fe7de48f..b2580843 100644 --- a/src/modules/scraper/adapter/messaging/index.ts +++ b/src/modules/scraper/adapter/messaging/index.ts @@ -6,6 +6,7 @@ export enum ScraperQueue { DepositReferral = "DepositReferral", TokenPrice = "TokenPrice", DepositFilledDate = "DepositFilledDate", + MerkleDistributorBlocksEvents = "MerkleDistributorBlocksEvents", } export type BlocksEventsQueueMessage = { @@ -14,6 +15,12 @@ export type BlocksEventsQueueMessage = { to: number; }; +export type MerkleDistributorBlocksEventsQueueMessage = { + chainId: number; + from: number; + to: number; +}; + export type FillEventsQueueMessage = { realizedLpFeePct: string; originChainId: number; diff --git a/src/modules/scraper/entry-point/http/controller.ts b/src/modules/scraper/entry-point/http/controller.ts index 2795c597..5ad49ff7 100644 --- a/src/modules/scraper/entry-point/http/controller.ts +++ b/src/modules/scraper/entry-point/http/controller.ts @@ -6,12 +6,14 @@ import { Role, Roles, RolesGuard } from "../../../auth/entry-points/http/roles"; import { BlockNumberQueueMessage, BlocksEventsQueueMessage, + MerkleDistributorBlocksEventsQueueMessage, DepositFilledDateQueueMessage, DepositReferralQueueMessage, ScraperQueue, - TokenDetailsQueueMessage, TokenPriceQueueMessage, + TokenDetailsQueueMessage, } from "../../adapter/messaging"; +import { ScraperService } from "../../service"; import { ScraperQueuesService } from "../../service/ScraperQueuesService"; import { SubmitReferralAddressJobBody, @@ -23,7 +25,7 @@ import { @Controller() export class ScraperController { - constructor(private scraperQueuesService: ScraperQueuesService) {} + constructor(private scraperQueuesService: ScraperQueuesService, private scraperService: ScraperService) {} @Post("scraper/blocks") @ApiTags("scraper") @@ -39,6 +41,23 @@ export class ScraperController { }); } + @Post("scraper/blocks/merkle-distributor") + @ApiTags("scraper") + @Roles(Role.Admin) + @UseGuards(JwtAuthGuard, RolesGuard) + @ApiBearerAuth() + async processMerkleDistributorBlocks(@Req() req: Request, @Body() body: ProcessBlocksBody) { + const { chainId, from, to } = body; + await this.scraperQueuesService.publishMessage( + ScraperQueue.MerkleDistributorBlocksEvents, + { + chainId, + from, + to, + }, + ); + } + @Post("scraper/block-number") @ApiTags("scraper") @Roles(Role.Admin) diff --git a/src/modules/scraper/model/MerkleDistributorProcessedBlock.entity.ts b/src/modules/scraper/model/MerkleDistributorProcessedBlock.entity.ts new file mode 100644 index 00000000..6eaca8ee --- /dev/null +++ b/src/modules/scraper/model/MerkleDistributorProcessedBlock.entity.ts @@ -0,0 +1,16 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class MerkleDistributorProcessedBlock { + @PrimaryGeneratedColumn() + id: number; + + @Column() + chainId: number; + + @Column() + latestBlock: number; + + @CreateDateColumn() + createdAt: Date; +} diff --git a/src/modules/scraper/model/claim.entity.ts b/src/modules/scraper/model/claim.entity.ts new file mode 100644 index 00000000..fccf3db7 --- /dev/null +++ b/src/modules/scraper/model/claim.entity.ts @@ -0,0 +1,49 @@ +import { + Column, + CreateDateColumn, + Entity, + Index, + PrimaryGeneratedColumn, + Unique, + UpdateDateColumn, + ManyToOne, +} from "typeorm"; +import { MerkleDistributorWindow } from "../../airdrop/model/merkle-distributor-window.entity"; + +@Entity() +@Unique("UK_claim_windowIndex_accountIndex", ["windowIndex", "accountIndex"]) +@Index("IX_claim_account", ["account"]) +export class Claim { + @PrimaryGeneratedColumn() + id: number; + + @Column() + caller: string; + + @Column() + accountIndex: number; + + @Column() + windowIndex: number; + + @Column() + account: string; + + @Column() + rewardToken: string; + + @Column() + blockNumber: number; + + @Column() + claimedAt: Date; + + @ManyToOne(() => MerkleDistributorWindow, (window) => window.claims) + merkleDistributorWindow: MerkleDistributorWindow; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/src/modules/scraper/model/deposit.entity.ts b/src/modules/scraper/model/deposit.entity.ts index e26e5f3f..6df8333e 100644 --- a/src/modules/scraper/model/deposit.entity.ts +++ b/src/modules/scraper/model/deposit.entity.ts @@ -100,6 +100,9 @@ export class Deposit { @Column({ nullable: true }) stickyReferralAddress?: string; + @Column({ nullable: true }) + rewardsWindowIndex?: number; + @CreateDateColumn() createdAt: Date; diff --git a/src/modules/scraper/module.ts b/src/modules/scraper/module.ts index 5d4a2537..010dba0d 100644 --- a/src/modules/scraper/module.ts +++ b/src/modules/scraper/module.ts @@ -8,10 +8,12 @@ import { MarketPriceModule } from "../market-price/module"; import { ReferralModule } from "../referral/module"; import { Web3Module } from "../web3/module"; import { DepositFixture } from "./adapter/db/deposit-fixture"; +import { ClaimFixture } from "./adapter/db/claim-fixture"; import { ScraperQueue } from "./adapter/messaging"; import { BlockNumberConsumer } from "./adapter/messaging/BlockNumberConsumer"; import { BlocksEventsConsumer } from "./adapter/messaging/BlocksEventsConsumer"; +import { MerkleDistributorBlocksEventsConsumer } from "./adapter/messaging/MerkleDistributorBlocksEventsConsumer"; import { DepositFilledDateConsumer } from "./adapter/messaging/DepositFilledDateConsumer"; import { DepositReferralConsumer } from "./adapter/messaging/DepositReferralConsumer"; import { FillEventsConsumer } from "./adapter/messaging/FillEventsConsumer"; @@ -19,7 +21,9 @@ import { TokenDetailsConsumer } from "./adapter/messaging/TokenDetailsConsumer"; import { TokenPriceConsumer } from "./adapter/messaging/TokenPriceConsumer"; import { ScraperController } from "./entry-point/http/controller"; import { Deposit } from "./model/deposit.entity"; +import { Claim } from "./model/claim.entity"; import { ProcessedBlock } from "./model/ProcessedBlock.entity"; +import { MerkleDistributorProcessedBlock } from "./model/MerkleDistributorProcessedBlock.entity"; import { ScraperService } from "./service"; import { ScraperQueuesService } from "./service/ScraperQueuesService"; @@ -28,6 +32,7 @@ import { ScraperQueuesService } from "./service/ScraperQueuesService"; ScraperService, ScraperQueuesService, BlocksEventsConsumer, + MerkleDistributorBlocksEventsConsumer, FillEventsConsumer, BlockNumberConsumer, TokenDetailsConsumer, @@ -35,11 +40,12 @@ import { ScraperQueuesService } from "./service/ScraperQueuesService"; TokenPriceConsumer, DepositFilledDateConsumer, DepositFixture, + ClaimFixture, ], imports: [ Web3Module, AppConfigModule, - TypeOrmModule.forFeature([ProcessedBlock, Deposit]), + TypeOrmModule.forFeature([ProcessedBlock, MerkleDistributorProcessedBlock, Claim, Deposit]), MarketPriceModule, HttpModule, ReferralModule, @@ -49,6 +55,9 @@ import { ScraperQueuesService } from "./service/ScraperQueuesService"; BullModule.registerQueue({ name: ScraperQueue.BlocksEvents, }), + BullModule.registerQueue({ + name: ScraperQueue.MerkleDistributorBlocksEvents, + }), BullModule.registerQueue({ name: ScraperQueue.TokenDetails, }), diff --git a/src/modules/scraper/service.ts b/src/modules/scraper/service.ts index f19f4343..915c04cc 100644 --- a/src/modules/scraper/service.ts +++ b/src/modules/scraper/service.ts @@ -6,8 +6,9 @@ import { Repository } from "typeorm"; import { ChainIds } from "../web3/model/ChainId"; import { AppConfig } from "../configuration/configuration.service"; import { ProcessedBlock } from "./model/ProcessedBlock.entity"; +import { MerkleDistributorProcessedBlock } from "./model/MerkleDistributorProcessedBlock.entity"; import { ScraperQueuesService } from "./service/ScraperQueuesService"; -import { BlocksEventsQueueMessage, ScraperQueue } from "./adapter/messaging"; +import { BlocksEventsQueueMessage, MerkleDistributorBlocksEventsQueueMessage, ScraperQueue } from "./adapter/messaging"; import { wait } from "../../utils"; @Injectable() @@ -19,6 +20,8 @@ export class ScraperService { private appConfig: AppConfig, @InjectRepository(ProcessedBlock) private processedBlockRepository: Repository, + @InjectRepository(MerkleDistributorProcessedBlock) + private merkleDistributorProcessedBlockRepository: Repository, private scraperQueuesService: ScraperQueuesService, ) { this.run(); @@ -27,8 +30,13 @@ export class ScraperService { public async run() { while (true) { try { + const latestBlocks = await this.getLatestBlocks(); + if (this.appConfig.values.enableSpokePoolsEventsProcessing) { - await this.publishBlocks(); + await this.publishBlocks(latestBlocks); + } + if (this.appConfig.values.enableMerkleDistributorEventsProcessing) { + await this.publishMerkleDistributorBlocks(latestBlocks); } } catch (error) { this.logger.error(error); @@ -37,10 +45,13 @@ export class ScraperService { } } - public async publishBlocks() { - const latestBlocks = await this.getLatestBlocks(); + public async publishBlocks(latestBlocks: Record) { this.logger.log(JSON.stringify(latestBlocks)); - const blockRanges = await this.determineBlockRanges(latestBlocks); + const blockRanges = await this.determineBlockRanges( + latestBlocks, + this.appConfig.values.web3.spokePoolContracts, + this.processedBlockRepository, + ); for (const chainId of Object.keys(blockRanges)) { const { from, to } = blockRanges[chainId]; @@ -52,6 +63,31 @@ export class ScraperService { } } + public async publishMerkleDistributorBlocks(latestBlocks: Record) { + const chainId = this.appConfig.values.web3.merkleDistributor.chainId; + const configStartBlockNumber = this.appConfig.values.web3.merkleDistributor.startBlockNumber; + const latestBlockNumber = latestBlocks[chainId]; + + const blockRange = await this.determineBlockRange( + chainId, + latestBlockNumber, + configStartBlockNumber, + this.merkleDistributorProcessedBlockRepository, + ); + + if (!blockRange) { + return; + } + + await this.scraperQueuesService.publishMessage( + ScraperQueue.MerkleDistributorBlocksEvents, + { + chainId, + ...blockRange, + }, + ); + } + /** * Fetch the latest block numbers from all supported chains */ @@ -72,44 +108,73 @@ export class ScraperService { * `to` is a block number up to the latest block number from chain, but capped at a max value. This way we avoid * huge block ranges to be processed. */ - public async determineBlockRanges(latestBlocks: Record) { + public async determineBlockRanges( + latestBlocks: Record, + startBlockNumbers: Record, + blockRepository: Repository, + ) { const blockRanges: Record = {}; - for (const chainId of Object.keys(latestBlocks)) { - let previousProcessedBlock = await this.processedBlockRepository.findOne({ - where: { chainId: parseInt(chainId) }, - }); - const configStartBlockNumber = this.appConfig.values.web3.spokePoolContracts[chainId].startBlockNumber; - let from = 1; + for (const chainIdStr of Object.keys(latestBlocks)) { + const chainId = parseInt(chainIdStr); + const configStartBlockNumber = startBlockNumbers[chainId]?.startBlockNumber; - if (previousProcessedBlock) { - from = previousProcessedBlock.latestBlock + 1; - } else if (configStartBlockNumber) { - from = configStartBlockNumber; + if (!configStartBlockNumber) { + continue; } - const to = Math.min( - latestBlocks[chainId] - this.getFollowingDistance(parseInt(chainId)), - from + this.getMinBlockRange(parseInt(chainId)), + const blockRange = await this.determineBlockRange( + chainId, + latestBlocks[chainId], + configStartBlockNumber, + blockRepository, ); - if (from < to) { - blockRanges[chainId] = { from, to }; - - if (!previousProcessedBlock) { - previousProcessedBlock = this.processedBlockRepository.create({ - chainId: parseInt(chainId), - latestBlock: to, - }); - } else { - previousProcessedBlock.latestBlock = to; - } - await this.processedBlockRepository.save(previousProcessedBlock); + + if (blockRange) { + blockRanges[chainId] = blockRange; } } return blockRanges; } + public async determineBlockRange( + chainId: number, + latestBlockNumber: number, + configStartBlockNumber: number, + blockRepository: Repository, + ) { + let previousProcessedBlock = await blockRepository.findOne({ + where: { chainId }, + }); + + let from = 1; + + if (previousProcessedBlock) { + from = previousProcessedBlock.latestBlock + 1; + } else if (configStartBlockNumber) { + from = configStartBlockNumber; + } + + const to = Math.min(latestBlockNumber - this.getFollowingDistance(chainId), from + this.getMinBlockRange(chainId)); + + if (from >= to) { + return; + } + + if (!previousProcessedBlock) { + previousProcessedBlock = blockRepository.create({ + chainId, + latestBlock: to, + }); + } else { + previousProcessedBlock.latestBlock = to; + } + await blockRepository.save(previousProcessedBlock); + + return { from, to }; + } + public getMinBlockRange(chainId: number) { if (chainId === ChainIds.boba) { return 50_000; diff --git a/src/modules/scraper/service/ScraperQueuesService.ts b/src/modules/scraper/service/ScraperQueuesService.ts index ab2d6113..f6f6ba39 100644 --- a/src/modules/scraper/service/ScraperQueuesService.ts +++ b/src/modules/scraper/service/ScraperQueuesService.ts @@ -9,6 +9,7 @@ export class ScraperQueuesService { public constructor( @InjectQueue(ScraperQueue.BlocksEvents) private blocksEventsQueue: Queue, + @InjectQueue(ScraperQueue.MerkleDistributorBlocksEvents) private merkleDistributorBlocksEventsQueue: Queue, @InjectQueue(ScraperQueue.FillEvents) private fillEventsQueue: Queue, @InjectQueue(ScraperQueue.BlockNumber) private blockNumberQueue: Queue, @InjectQueue(ScraperQueue.TokenDetails) private tokenDetailsQueue: Queue, @@ -20,6 +21,9 @@ export class ScraperQueuesService { this.blocksEventsQueue .getJobCounts() .then((data) => this.logger.log(`${ScraperQueue.BlocksEvents} ${JSON.stringify(data)}`)); + this.merkleDistributorBlocksEventsQueue + .getJobCounts() + .then((data) => this.logger.log(`${ScraperQueue.MerkleDistributorBlocksEvents} ${JSON.stringify(data)}`)); this.fillEventsQueue .getJobCounts() .then((data) => this.logger.log(`${ScraperQueue.FillEvents} ${JSON.stringify(data)}`)); @@ -56,6 +60,8 @@ export class ScraperQueuesService { await this.tokenPriceQueue.add(message); } else if (queue === ScraperQueue.DepositFilledDate) { await this.depositFilledDateQueue.add(message); + } else if (queue === ScraperQueue.MerkleDistributorBlocksEvents) { + await this.merkleDistributorBlocksEventsQueue.add(message); } } @@ -74,6 +80,8 @@ export class ScraperQueuesService { await this.tokenPriceQueue.addBulk(messages.map((m) => ({ data: m }))); } else if (queue === ScraperQueue.DepositFilledDate) { await this.depositFilledDateQueue.addBulk(messages.map((m) => ({ data: m }))); + } else if (queue === ScraperQueue.MerkleDistributorBlocksEvents) { + await this.merkleDistributorBlocksEventsQueue.addBulk(messages.map((m) => ({ data: m }))); } } } diff --git a/src/modules/web3/services/EthProvidersService.ts b/src/modules/web3/services/EthProvidersService.ts index 7c388240..12df415b 100644 --- a/src/modules/web3/services/EthProvidersService.ts +++ b/src/modules/web3/services/EthProvidersService.ts @@ -1,4 +1,4 @@ -import { ERC20__factory, SpokePool__factory } from "@across-protocol/contracts-v2"; +import { ERC20__factory, AcrossMerkleDistributor__factory, SpokePool__factory } from "@across-protocol/contracts-v2"; import { Injectable } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { ethers } from "ethers"; @@ -8,12 +8,14 @@ import { Block } from "../model/block.entity"; import { ChainId } from "../model/ChainId"; import { Token } from "../model/token.entity"; import { SpokePoolEventsQuerier } from "./SpokePoolEventsQuerier"; +import { MerkleDistributorEventsQuerier } from "./MerkleDistributorEventsQuerier"; import { Transaction } from "../model/transaction.entity"; @Injectable() export class EthProvidersService { private providers: Record = {}; private spokePoolEventQueriers: Record = {}; + private merkleDistributorEventQuerier: MerkleDistributorEventsQuerier; public constructor( private appConfig: AppConfig, @@ -21,22 +23,9 @@ export class EthProvidersService { @InjectRepository(Token) private tokenRepository: Repository, @InjectRepository(Transaction) private transactionRepository: Repository, ) { - const supportedChainIds = Object.keys(this.appConfig.values.web3.providers); - - for (const chainId of supportedChainIds) { - if (this.appConfig.values.web3.providers[chainId]) { - const provider = new ethers.providers.JsonRpcProvider(this.appConfig.values.web3.providers[chainId]); - this.providers[chainId] = provider; - } - } - - for (const chainId of Object.keys(this.getProviders())) { - const spokePool = SpokePool__factory.connect( - appConfig.values.web3.spokePoolContracts[parseInt(chainId)].address, - this.getProvider(parseInt(chainId)), - ); - this.spokePoolEventQueriers[chainId] = new SpokePoolEventsQuerier(spokePool); - } + this.setProviders(); + this.setSpokePoolEventQueriers(); + this.setMerkleDistributorEventQuerier(); } public getProvider(chainId: ChainId): ethers.providers.JsonRpcProvider | undefined { @@ -55,6 +44,10 @@ export class EthProvidersService { return this.spokePoolEventQueriers; } + public getMerkleDistributorQuerier(): MerkleDistributorEventsQuerier | undefined { + return this.merkleDistributorEventQuerier; + } + public async getCachedBlock(chainId: number, blockNumber: number) { let block = await this.blockRepository.findOne({ where: { chainId, blockNumber } }); @@ -111,4 +104,40 @@ export class EthProvidersService { return transaction; } + + private setProviders() { + const supportedChainIds = Object.keys(this.appConfig.values.web3.providers); + + for (const chainId of supportedChainIds) { + if (this.appConfig.values.web3.providers[chainId]) { + const provider = new ethers.providers.JsonRpcProvider(this.appConfig.values.web3.providers[chainId]); + this.providers[chainId] = provider; + } + } + } + + private setSpokePoolEventQueriers() { + for (const chainIdStr of Object.keys(this.getProviders())) { + const chainId = parseInt(chainIdStr); + const spokePoolAddress = this.appConfig.values.web3.spokePoolContracts[chainId]?.address; + if (spokePoolAddress) { + const spokePool = SpokePool__factory.connect( + this.appConfig.values.web3.spokePoolContracts[chainId].address, + this.getProvider(chainId), + ); + this.spokePoolEventQueriers[chainId] = new SpokePoolEventsQuerier(spokePool); + } + } + } + + private setMerkleDistributorEventQuerier() { + const provider = this.getProvider(this.appConfig.values.web3.merkleDistributor.chainId); + if (provider) { + const merkleDistributor = AcrossMerkleDistributor__factory.connect( + this.appConfig.values.web3.merkleDistributor.address, + provider, + ); + this.merkleDistributorEventQuerier = new MerkleDistributorEventsQuerier(merkleDistributor); + } + } } diff --git a/src/modules/web3/services/EventsQuerier.ts b/src/modules/web3/services/EventsQuerier.ts new file mode 100644 index 00000000..0d9e2a10 --- /dev/null +++ b/src/modules/web3/services/EventsQuerier.ts @@ -0,0 +1,93 @@ +import { MerkleDistributor, SpokePool } from "@across-protocol/contracts-v2"; +import { TypedEvent, TypedEventFilter } from "@across-protocol/contracts-v2/dist/typechain/common"; +import { Logger } from "@nestjs/common"; +import { Web3Error, Web3ErrorCode } from "../model/ChainId"; + +const DEFAULT_BLOCK_RANGE = 100_000; + +export class EventsQuerier { + constructor( + private contract: SpokePool | MerkleDistributor, + private logger: Logger, + private blockRangeSize?: number, + ) {} + + public async getEvents( + from: number, + to: number, + filters: TypedEventFilter[], any>, + ): Promise[]> { + let events: TypedEvent[] = []; + let retryWithLowerBatchSize; + + do { + const blockRangeSizeAtStart = this.blockRangeSize; + try { + retryWithLowerBatchSize = false; + events = []; + + if (this.blockRangeSize) { + const intervals = this.getSamplesBetween(from, to, this.blockRangeSize); + // query events only for the first interval to make sure block range is fine + const [intervalStart, intervalEnd] = intervals[0]; + const newEvents = await this.contract.queryFilter(filters, intervalStart, intervalEnd); + events.push(...newEvents); + + // query the rest of block intervals in parallel in order to get the events + const newEventsList = await Promise.all( + intervals + .slice(1) + .map(([intervalStart, intervalEnd]) => this.contract.queryFilter(filters, intervalStart, intervalEnd)), + ); + events.push(...newEventsList.flat()); + } else { + const newEvents = await this.contract.queryFilter(filters, from, to); + events.push(...newEvents); + } + } catch (error) { + if ( + (error as Web3Error).error?.code === Web3ErrorCode.BLOCK_RANGE_TOO_LARGE || + (error as Web3Error).error?.code === Web3ErrorCode.EXCEEDED_MAXIMUM_BLOCK_RANGE || + (error as Web3Error).error?.code === Web3ErrorCode.LOG_RESPONSE_SIZE_EXCEEDED || + (error as Web3Error).error?.code === Web3ErrorCode.LOG_RESPONSE_SIZE_EXCEEDED_2 + ) { + // make sure the block range size wasn't modified by a parallel function call + if (this.blockRangeSize === blockRangeSizeAtStart) { + const newBlockRangeSize = this.blockRangeSize ? this.blockRangeSize / 2 : DEFAULT_BLOCK_RANGE; + this.logger.warn(`lowering block range size from ${this.blockRangeSize} to ${newBlockRangeSize}`); + this.blockRangeSize = newBlockRangeSize; + } + retryWithLowerBatchSize = true; + } else { + retryWithLowerBatchSize = false; + console.error(error); + throw error; + } + } + } while (retryWithLowerBatchSize); + + return events; + } + + /** + * Takes two values and returns a list of number intervals + * + * @example + * ```js + * getSamplesBetween(1, 9, 3) //returns [[1, 3], [4, 7], [8, 9]] + * ``` + */ + private getSamplesBetween = (min: number, max: number, size: number) => { + let keepIterate = true; + const intervals = []; + + while (keepIterate) { + const to = Math.min(min + size - 1, max); + intervals.push([min, to]); + min = to + 1; + if (min >= max) keepIterate = false; + } + + return intervals; + }; +} diff --git a/src/modules/web3/services/MerkleDistributorEventsQuerier.ts b/src/modules/web3/services/MerkleDistributorEventsQuerier.ts new file mode 100644 index 00000000..5ea2a994 --- /dev/null +++ b/src/modules/web3/services/MerkleDistributorEventsQuerier.ts @@ -0,0 +1,21 @@ +import { AcrossMerkleDistributor } from "@across-protocol/contracts-v2"; +import { TypedEvent } from "@across-protocol/contracts-v2/dist/typechain/common"; +import { Logger } from "@nestjs/common"; +import { EventsQuerier } from "./EventsQuerier"; + +export class MerkleDistributorEventsQuerier extends EventsQuerier { + constructor(private merkleDistributor: AcrossMerkleDistributor, blockRangeSize?: number) { + super(merkleDistributor, new Logger(MerkleDistributorEventsQuerier.name), blockRangeSize); + } + + public async getClaimedEvents(from: number, to: number, account?: string): Promise[]> { + return this.getEvents(from, to, this.getClaimedEventsFilter(account)); + } + + private getClaimedEventsFilter(account?: string) { + if (account) { + return this.merkleDistributor.filters.Claimed(undefined, undefined, account, undefined, undefined, undefined); + } + return this.merkleDistributor.filters.Claimed(); + } +} diff --git a/src/modules/web3/services/SpokePoolEventsQuerier.ts b/src/modules/web3/services/SpokePoolEventsQuerier.ts index 74d99b6f..280b692b 100644 --- a/src/modules/web3/services/SpokePoolEventsQuerier.ts +++ b/src/modules/web3/services/SpokePoolEventsQuerier.ts @@ -1,14 +1,12 @@ import { SpokePool } from "@across-protocol/contracts-v2"; -import { TypedEvent, TypedEventFilter } from "@across-protocol/contracts-v2/dist/typechain/common"; +import { TypedEvent } from "@across-protocol/contracts-v2/dist/typechain/common"; import { Logger } from "@nestjs/common"; -import { Web3Error, Web3ErrorCode } from "../model/ChainId"; +import { EventsQuerier } from "./EventsQuerier"; -const DEFAULT_BLOCK_RANGE = 100_000; - -export class SpokePoolEventsQuerier { - private logger = new Logger(SpokePoolEventsQuerier.name); - - constructor(private spokePool: SpokePool, private blockRangeSize?: number) {} +export class SpokePoolEventsQuerier extends EventsQuerier { + constructor(private spokePool: SpokePool, blockRangeSize?: number) { + super(spokePool, new Logger(SpokePoolEventsQuerier.name), blockRangeSize); + } public async getFundsDepositEvents(from: number, to: number, depositorAddr?: string): Promise[]> { return this.getEvents(from, to, this.getDepositEventsFilters(depositorAddr)); @@ -57,83 +55,4 @@ export class SpokePoolEventsQuerier { } return this.spokePool.filters.FundsDeposited(); } - - private async getEvents( - from: number, - to: number, - filters: TypedEventFilter[], any>, - ): Promise[]> { - let events: TypedEvent[] = []; - let retryWithLowerBatchSize; - - do { - const blockRangeSizeAtStart = this.blockRangeSize; - try { - retryWithLowerBatchSize = false; - events = []; - - if (this.blockRangeSize) { - const intervals = this.getSamplesBetween(from, to, this.blockRangeSize); - // query events only for the first interval to make sure block range is fine - const [intervalStart, intervalEnd] = intervals[0]; - const newEvents = await this.spokePool.queryFilter(filters, intervalStart, intervalEnd); - events.push(...newEvents); - - // query the rest of block intervals in parallel in order to get the events - const newEventsList = await Promise.all( - intervals - .slice(1) - .map(([intervalStart, intervalEnd]) => this.spokePool.queryFilter(filters, intervalStart, intervalEnd)), - ); - events.push(...newEventsList.flat()); - } else { - const newEvents = await this.spokePool.queryFilter(filters, from, to); - events.push(...newEvents); - } - } catch (error) { - if ( - (error as Web3Error).error?.code === Web3ErrorCode.BLOCK_RANGE_TOO_LARGE || - (error as Web3Error).error?.code === Web3ErrorCode.EXCEEDED_MAXIMUM_BLOCK_RANGE || - (error as Web3Error).error?.code === Web3ErrorCode.LOG_RESPONSE_SIZE_EXCEEDED || - (error as Web3Error).error?.code === Web3ErrorCode.LOG_RESPONSE_SIZE_EXCEEDED_2 - ) { - // make sure the block range size wasn't modified by a parallel function call - if (this.blockRangeSize === blockRangeSizeAtStart) { - const newBlockRangeSize = this.blockRangeSize ? this.blockRangeSize / 2 : DEFAULT_BLOCK_RANGE; - this.logger.warn(`lowering block range size from ${this.blockRangeSize} to ${newBlockRangeSize}`); - this.blockRangeSize = newBlockRangeSize; - } - retryWithLowerBatchSize = true; - } else { - retryWithLowerBatchSize = false; - console.error(error); - throw error; - } - } - } while (retryWithLowerBatchSize); - - return events; - } - - /** - * Takes two values and returns a list of number intervals - * - * @example - * ```js - * getSamplesBetween(1, 9, 3) //returns [[1, 3], [4, 7], [8, 9]] - * ``` - */ - private getSamplesBetween = (min: number, max: number, size: number) => { - let keepIterate = true; - const intervals = []; - - while (keepIterate) { - const to = Math.min(min + size - 1, max); - intervals.push([min, to]); - min = to + 1; - if (min >= max) keepIterate = false; - } - - return intervals; - }; } diff --git a/src/utils.ts b/src/utils.ts index 8a5935da..652601c8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -17,3 +17,9 @@ export const getRandomInt = (min = 0, max = 1000000) => { max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; }; + +export const splitArrayInChunks = (array: T[], chunk_size: number) => + Array(Math.ceil(array.length / chunk_size)) + .fill(0) + .map((_, index) => index * chunk_size) + .map((begin) => array.slice(begin, begin + chunk_size)); diff --git a/test/referrals.e2e-spec.ts b/test/referrals.e2e-spec.ts new file mode 100644 index 00000000..6d18aac5 --- /dev/null +++ b/test/referrals.e2e-spec.ts @@ -0,0 +1,299 @@ +import request from "supertest"; +import { INestApplication } from "@nestjs/common"; +import { JwtService } from "@nestjs/jwt"; +import { Test } from "@nestjs/testing"; +import { ethers, utils } from "ethers"; + +import { DepositFixture, mockDepositEntity } from "../src/modules/scraper/adapter/db/deposit-fixture"; +import { ClaimFixture } from "../src/modules/scraper/adapter/db/claim-fixture"; +import { TokenFixture } from "../src/modules/web3/adapters/db/token-fixture"; +import { HistoricMarketPriceFixture } from "../src/modules/market-price/adapters/hmp-fixture"; +import { AppModule } from "../src/app.module"; +import { ReferralService } from "../src/modules/referral/services/service"; +import { Token } from "../src/modules/web3/model/token.entity"; +import { HistoricMarketPrice } from "../src/modules/market-price/model/historic-market-price.entity"; +import { Role } from "../src/modules/auth/entry-points/http/roles"; +import { configValues } from "../src/modules/configuration"; + +const referrer = "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D"; +const depositor = "0xdf120Bf3AEE9892f213B1Ba95035a60682D637c3"; +const usdc = { + address: "0x1", + symbol: "USDC", + decimals: 6, +}; +const tier5DepositAmount = utils.parseUnits("500000", usdc.decimals).toString(); +const tier4DepositAmount = utils.parseUnits("250000", usdc.decimals).toString(); +const dayInMS = 24 * 60 * 60 * 1000; + +let app: INestApplication; +let depositFixture: DepositFixture; +let claimFixture: ClaimFixture; +let priceFixture: HistoricMarketPriceFixture; +let tokenFixture: TokenFixture; +let referralService: ReferralService; + +let token: Token; +let price: HistoricMarketPrice; +let adminJwt: string; + +beforeAll(async () => { + const moduleFixture = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + depositFixture = app.get(DepositFixture); + claimFixture = app.get(ClaimFixture); + priceFixture = app.get(HistoricMarketPriceFixture); + tokenFixture = app.get(TokenFixture); + referralService = app.get(ReferralService); + adminJwt = app.get(JwtService).sign({ roles: [Role.Admin] }, { secret: configValues().auth.jwtSecret }); + + await app.init(); + + [token, price] = await Promise.all([ + tokenFixture.insertToken({ ...usdc }), + priceFixture.insertPrice({ symbol: usdc.symbol, usd: "1" }), + ]); +}); + +afterAll(async () => { + await Promise.all([tokenFixture.deleteAllTokens(), priceFixture.deleteAllPrices()]); + + await app.close(); +}); + +describe("POST /referrals/merkle-distribution", () => { + afterEach(async () => { + await depositFixture.deleteAllDeposits(); + }); + + it("return 401", async () => { + const response = await request(app.getHttpServer()) + .post(`/referrals/merkle-distribution`) + .send({ + windowIndex: 1, + maxDepositDate: new Date(Date.now() + dayInMS), + }); + expect(response.status).toBe(401); + }); + + it("return 201 for success and 400 for duplicate window", async () => { + await depositFixture.insertManyDeposits([ + mockDepositEntity({ + depositId: 1, + referralAddress: referrer, + stickyReferralAddress: referrer, + status: "filled", + tokenId: token.id, + priceId: price.id, + depositorAddr: depositor, + amount: tier5DepositAmount, + depositDate: new Date(), + bridgeFeePct: ethers.utils.parseEther("0.01").toString(), // 1% + }), + ]); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const successResponse = await request(app.getHttpServer()) + .post(`/referrals/merkle-distribution`) + .set({ Authorization: `Bearer ${adminJwt}` }) + .send({ + windowIndex: 1, + maxDepositDate: new Date(Date.now() + dayInMS), + }); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + const duplicateWindowResponse = await request(app.getHttpServer()) + .post(`/referrals/merkle-distribution`) + .set({ Authorization: `Bearer ${adminJwt}` }) + .send({ + windowIndex: 1, + maxDepositDate: new Date(Date.now() + dayInMS), + }); + expect(successResponse.status).toBe(201); + expect(successResponse.body.recipients.length).toBe(2); + expect(duplicateWindowResponse.status).toBe(400); + }); +}); + +describe("DELETE /referrals/merkle-distribution", () => { + afterEach(async () => { + await depositFixture.deleteAllDeposits(); + }); + + it("return 401", async () => { + const response = await request(app.getHttpServer()).delete(`/referrals/merkle-distribution`).send({ + windowIndex: 1, + }); + expect(response.status).toBe(401); + }); + + it("return 201", async () => { + await depositFixture.insertManyDeposits([ + mockDepositEntity({ + depositId: 1, + referralAddress: referrer, + stickyReferralAddress: referrer, + status: "filled", + tokenId: token.id, + priceId: price.id, + depositorAddr: depositor, + amount: tier5DepositAmount, + depositDate: new Date(), + bridgeFeePct: ethers.utils.parseEther("0.01").toString(), // 1% + }), + ]); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const firstPostResponse = await request(app.getHttpServer()) + .post(`/referrals/merkle-distribution`) + .set({ Authorization: `Bearer ${adminJwt}` }) + .send({ + windowIndex: 1, + maxDepositDate: new Date(Date.now() + dayInMS), + }); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + const deleteResponse = await request(app.getHttpServer()) + .delete(`/referrals/merkle-distribution`) + .set({ Authorization: `Bearer ${adminJwt}` }) + .send({ + windowIndex: 1, + }); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + const secondPostResponse = await request(app.getHttpServer()) + .post(`/referrals/merkle-distribution`) + .set({ Authorization: `Bearer ${adminJwt}` }) + .send({ + windowIndex: 1, + maxDepositDate: new Date(Date.now() + dayInMS), + }); + expect(firstPostResponse.status).toBe(201); + expect(firstPostResponse.body.recipients.length).toBe(2); + expect(deleteResponse.status).toBe(200); + expect(secondPostResponse.body.recipients.length).toBe(2); + }); +}); + +describe("GET /referrals/summary", () => { + beforeEach(async () => { + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + }); + + afterEach(async () => { + await depositFixture.deleteAllDeposits(); + await claimFixture.deleteAllClaims(); + }); + + it("return tier 1", async () => { + const response = await request(app.getHttpServer()).get(`/referrals/summary?address=${referrer}`); + expect(response.status).toBe(200); + expect(response.body.tier).toBe(1); + }); + + it("return tier 2 by num transfers", async () => { + await depositFixture.insertManyDeposits( + Array.from(Array(3).keys()).map((i) => + mockDepositEntity({ + depositId: i + 1, + referralAddress: referrer, + stickyReferralAddress: referrer, + status: "filled", + tokenId: token.id, + priceId: price.id, + depositorAddr: `0x${i}`, + }), + ), + ); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const response = await request(app.getHttpServer()).get(`/referrals/summary?address=${referrer}`); + expect(response.status).toBe(200); + expect(response.body.tier).toBe(2); + }); + + it("reset to tier 1 from 5 after claim", async () => { + await depositFixture.insertManyDeposits([ + mockDepositEntity({ + depositId: 1, + referralAddress: referrer, + stickyReferralAddress: referrer, + status: "filled", + tokenId: token.id, + priceId: price.id, + amount: tier5DepositAmount, + depositorAddr: `0x1`, + depositDate: new Date(Date.now() - dayInMS), + rewardsWindowIndex: 1, + }), + ]); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const responseBeforeClaim = await request(app.getHttpServer()).get(`/referrals/summary?address=${referrer}`); + expect(responseBeforeClaim.status).toBe(200); + expect(responseBeforeClaim.body.tier).toBe(5); + + await claimFixture.insertClaim({ + account: referrer, + claimedAt: new Date(Date.now()), + windowIndex: 1, + }); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const responseAfterClaim = await request(app.getHttpServer()).get(`/referrals/summary?address=${referrer}`); + expect(responseAfterClaim.status).toBe(200); + expect(responseAfterClaim.body.tier).toBe(1); + }); + + it("reset to tier 4 from 5 after claim", async () => { + const tier5DepositBase = { + referralAddress: referrer, + stickyReferralAddress: referrer, + amount: tier5DepositAmount, + tokenId: token.id, + priceId: price.id, + }; + + await depositFixture.insertManyDeposits([ + mockDepositEntity({ + ...tier5DepositBase, + status: "filled", + depositId: 1, + rewardsWindowIndex: 1, + }), + mockDepositEntity({ + ...tier5DepositBase, + amount: tier4DepositAmount, + status: "filled", + depositId: 2, + rewardsWindowIndex: 2, + }), + ]); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const responseBeforeClaim = await request(app.getHttpServer()).get(`/referrals/summary?address=${referrer}`); + expect(responseBeforeClaim.status).toBe(200); + expect(responseBeforeClaim.body.tier).toBe(5); + + await claimFixture.insertClaim({ + account: referrer, + windowIndex: 1, + }); + await referralService.cumputeReferralStats(); + await referralService.refreshMaterializedView(); + + const responseAfterClaim = await request(app.getHttpServer()).get(`/referrals/summary?address=${referrer}`); + expect(responseAfterClaim.status).toBe(200); + expect(responseAfterClaim.body.tier).toBe(4); + }); +}); diff --git a/yarn.lock b/yarn.lock index 277f754e..b517853f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,17 +2,18 @@ # yarn lockfile v1 -"@across-protocol/contracts-v2@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@across-protocol/contracts-v2/-/contracts-v2-1.0.2.tgz#53c1c56f159209d4e5c5c658a959251c6c7a2b5f" - integrity sha512-Or7Ccs4Fw8yolUGHn7cay6HTq6cdP6AuZm4/9RdUgNcqiGWTeNw8o7CbJLEjn9+6xrhrHWf/AUtbBXkdVVS+wg== +"@across-protocol/contracts-v2@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@across-protocol/contracts-v2/-/contracts-v2-1.0.7.tgz#d7eb5fc5a987dbed1f45867c05159d6f621d7977" + integrity sha512-e9J9ZOqT9lCMMkeDb/4oe0U/urG48Ld/HA4YbteAhBecG2+53Rvq8EC4ds7VybYX4BbUhNgc0zsuCCRE/mPaUw== dependencies: "@defi-wonderland/smock" "^2.0.7" "@eth-optimism/contracts" "^0.5.11" - "@openzeppelin/contracts" "^4.4.2" - "@uma/common" "^2.17.0" - "@uma/contracts-node" "^0.2.0" - "@uma/core" "^2.24.0" + "@openzeppelin/contracts" "^4.7.3" + "@uma/common" "^2.28.0" + "@uma/contracts-node" "^0.3.18" + "@uma/core" "^2.41.0" + "@uma/merkle-distributor" "^1.3.38" arb-bridge-eth "^0.7.4" arb-bridge-peripherals "^1.0.5" @@ -250,6 +251,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== +"@babel/parser@^7.9.4": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.0.tgz#b26133c888da4d79b0d3edcf42677bcadc783046" + integrity sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -639,6 +645,21 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@ethersproject/abi@5.7.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.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.10.tgz#a533aed39a5f27312745c8c4c40fa25fc884831c" @@ -665,6 +686,19 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/web" "^5.6.1" +"@ethersproject/abstract-provider@5.7.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.0.14": version "5.0.14" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.14.tgz#30ef912b0f86599d90fdffc65c110452e7b55cf1" @@ -687,6 +721,17 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" +"@ethersproject/abstract-signer@5.7.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.0.11": version "5.0.11" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.11.tgz#12022e8c590c33939beb5ab18b401ecf585eac59" @@ -709,6 +754,17 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.1" +"@ethersproject/address@5.7.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.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.9.tgz#bb1f35d3dba92082a574d5e2418f9202a0a1a7e6" @@ -723,6 +779,13 @@ dependencies: "@ethersproject/bytes" "^5.6.1" +"@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.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.9.tgz#00d727a031bac563cb8bb900955206f1bf3cf1fc" @@ -739,6 +802,14 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/properties" "^5.6.0" +"@ethersproject/basex@5.7.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.0.15": version "5.0.15" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.15.tgz#b089b3f1e0381338d764ac1c10512f0c93b184ed" @@ -757,6 +828,15 @@ "@ethersproject/logger" "^5.6.0" bn.js "^5.2.1" +"@ethersproject/bignumber@5.7.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.0.11": version "5.0.11" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.11.tgz#21118e75b1d00db068984c15530e316021101276" @@ -771,6 +851,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/bytes@5.7.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.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.10.tgz#eb0c604fbc44c53ba9641eed31a1d0c9e1ebcadc" @@ -785,6 +872,13 @@ dependencies: "@ethersproject/bignumber" "^5.6.2" +"@ethersproject/constants@5.7.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.0.12": version "5.0.12" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.12.tgz#6d488db46221258399dfe80b89bf849b3afd7897" @@ -816,6 +910,22 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.2" +"@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.0.12": version "5.0.12" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.12.tgz#1074599f7509e2ca2bb7a3d4f4e39ab3a796da42" @@ -844,6 +954,21 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@ethersproject/hash@5.7.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.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.10.tgz#f7cdf154bf5d104c76dce2940745fc71d9e7eb1b" @@ -880,6 +1005,24 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/wordlists" "^5.6.1" +"@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.0.12": version "5.0.12" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.12.tgz#8946a0fcce1634b636313a50330b7d30a24996e8" @@ -918,6 +1061,25 @@ aes-js "3.0.0" scrypt-js "3.0.1" +"@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.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.9.tgz#ca0d86e4af56c13b1ef25e533bde3e96d28f647d" @@ -934,6 +1096,14 @@ "@ethersproject/bytes" "^5.6.1" js-sha3 "0.8.0" +"@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/bytes" "^5.7.0" + js-sha3 "0.8.0" + "@ethersproject/logger@5.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.10.tgz#fd884688b3143253e0356ef92d5f22d109d2e026" @@ -944,6 +1114,11 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@5.7.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/networks@5.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.9.tgz#ec5da11e4d4bfd69bec4eaebc9ace33eb9569279" @@ -958,6 +1133,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/networks@5.7.1", "@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/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.9.tgz#be39c7f0a66c0d3cb1ad1dbb12a78e9bcdf9b5ae" @@ -974,6 +1156,14 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/sha2" "^5.6.1" +"@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/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/properties@5.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.9.tgz#d7aae634680760136ea522e25c3ef043ec15b5c2" @@ -988,6 +1178,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/properties@5.7.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.7.0" + "@ethersproject/providers@5.0.24": version "5.0.24" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.24.tgz#4c638a029482d052faa18364b5e0e2d3ddd9c0cb" @@ -1039,6 +1236,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + 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/random@5.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.9.tgz#1903d4436ba66e4c8ac77968b16f756abea3a0d0" @@ -1055,6 +1278,14 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" +"@ethersproject/random@5.7.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.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp@5.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.9.tgz#da205bf8a34d3c3409eb73ddd237130a4b376aff" @@ -1071,6 +1302,14 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" +"@ethersproject/rlp@5.7.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.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2@5.0.9": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.9.tgz#41275ee03e6e1660b3c997754005e089e936adc6" @@ -1089,6 +1328,15 @@ "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" +"@ethersproject/sha2@5.7.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.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + "@ethersproject/signing-key@5.0.11": version "5.0.11" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.11.tgz#19fc5c4597e18ad0a5efc6417ba5b74069fdd2af" @@ -1111,6 +1359,18 @@ elliptic "6.5.4" hash.js "1.1.7" +"@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.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.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.10.tgz#128c9289761cf83d81ff62a1195d6079a924a86c" @@ -1134,6 +1394,18 @@ "@ethersproject/sha2" "^5.6.1" "@ethersproject/strings" "^5.6.1" +"@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.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.10.tgz#ddce1e9724f4ac4f3f67e0cac0b48748e964bfdb" @@ -1152,6 +1424,15 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" +"@ethersproject/strings@5.7.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.0.11": version "5.0.11" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.11.tgz#b31df5292f47937136a45885d6ee6112477c13df" @@ -1182,6 +1463,21 @@ "@ethersproject/rlp" "^5.6.1" "@ethersproject/signing-key" "^5.6.2" +"@ethersproject/transactions@5.7.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.0.11": version "5.0.11" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.11.tgz#f82f6e353ac0d6fa43b17337790f1f9aa72cb4c8" @@ -1200,6 +1496,15 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.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.0.12": version "5.0.12" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.12.tgz#bfb96f95e066b4b1b4591c4615207b87afedda8b" @@ -1242,6 +1547,27 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/wordlists" "^5.6.1" +"@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.0.14": version "5.0.14" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.14.tgz#6e7bebdd9fb967cb25ee60f44d9218dc0803bac4" @@ -1264,6 +1590,17 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@ethersproject/web@5.7.1", "@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.0.10": version "5.0.10" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.10.tgz#177b9a0b4d72b9c4f304d08b36612d6c60e9b896" @@ -1286,6 +1623,17 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@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" + "@gnosis.pm/mock-contract@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@gnosis.pm/mock-contract/-/mock-contract-4.0.0.tgz#eaf500fddcab81b5f6c22280a7b22ff891dd6f87" @@ -1318,6 +1666,13 @@ dependencies: google-gax "^2.24.1" +"@google-cloud/kms@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/kms/-/kms-3.0.1.tgz#2e86889f2c08f13208afc5bd272a7f25326c9f17" + integrity sha512-xUrhzattC5mkNqbfMcIgBzwAab9eXCYrn1R1KYUNV5E96fK7ciT57bJESaUQvin7XKd18sQcLRD+uOJ6eTfXbg== + dependencies: + google-gax "^3.0.1" + "@google-cloud/paginator@^3.0.7": version "3.0.7" resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-3.0.7.tgz#fb6f8e24ec841f99defaebf62c75c2e744dd419b" @@ -1331,11 +1686,21 @@ resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-2.1.1.tgz#ae6af4fee02d78d044ae434699a630f8df0084ef" integrity sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ== +"@google-cloud/projectify@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-3.0.0.tgz#302b25f55f674854dce65c2532d98919b118a408" + integrity sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA== + "@google-cloud/promisify@^2.0.0": version "2.0.4" resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-2.0.4.tgz#9d8705ecb2baa41b6b2673f3a8e9b7b7e1abc52a" integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== +"@google-cloud/promisify@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-3.0.1.tgz#8d724fb280f47d1ff99953aee0c1669b25238c2e" + integrity sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA== + "@google-cloud/storage@^5.8.5": version "5.20.5" resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-5.20.5.tgz#1de71fc88d37934a886bc815722c134b162d335d" @@ -1365,6 +1730,29 @@ uuid "^8.0.0" xdg-basedir "^4.0.0" +"@google-cloud/storage@^6.4.2": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-6.6.0.tgz#01f64bf706acc98dc2787e490afe878ad9f64250" + integrity sha512-z1rj7ft15TZd7hzPVsqTZPduLPR+ZMOnwUME9d1yynJvHm5bWkyV3d3eigZ+v2Zirl7rjk8UZTdzRSYr1MvgRQ== + dependencies: + "@google-cloud/paginator" "^3.0.7" + "@google-cloud/projectify" "^3.0.0" + "@google-cloud/promisify" "^3.0.0" + abort-controller "^3.0.0" + async-retry "^1.3.3" + compressible "^2.0.12" + duplexify "^4.0.0" + ent "^2.2.0" + extend "^3.0.2" + gaxios "^5.0.0" + google-auth-library "^8.0.1" + mime "^3.0.0" + mime-types "^2.0.8" + p-limit "^3.0.1" + retry-request "^5.0.0" + teeny-request "^8.0.0" + uuid "^8.0.0" + "@grpc/grpc-js@~1.6.0": version "1.6.7" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz#4c4fa998ff719fe859ac19fe977fdef097bb99aa" @@ -1373,6 +1761,14 @@ "@grpc/proto-loader" "^0.6.4" "@types/node" ">=12.12.47" +"@grpc/grpc-js@~1.7.0": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" + integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + "@grpc/proto-loader@^0.6.12", "@grpc/proto-loader@^0.6.4": version "0.6.13" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.13.tgz#008f989b72a40c60c96cd4088522f09b05ac66bc" @@ -1384,6 +1780,17 @@ protobufjs "^6.11.3" yargs "^16.2.0" +"@grpc/proto-loader@^0.7.0": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.3.tgz#75a6f95b51b85c5078ac7394da93850c32d36bb8" + integrity sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.0.0" + yargs "^16.2.0" + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -1758,6 +2165,11 @@ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.0.2.tgz#baea7764b1adf201ce4a792fe971fd7211dad2e4" integrity sha512-fpnI00dt+yO1cKx9qBXelKhPBdEgvc8ZPav1+0r09j0woYQU2N79w/jcGawSY5UGlgQ3vjaJsFHnGbGvvqdLzg== +"@multiformats/base-x@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" + integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + "@nestjs/axios@^0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@nestjs/axios/-/axios-0.0.8.tgz#4e321e36b6bc3ab0f02d80bafe04ae39edfdcacf" @@ -2006,7 +2418,8 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@openzeppelin/contracts-0.8@npm:@openzeppelin/contracts@^4.3.2", "@openzeppelin/contracts@^4.2.0", "@openzeppelin/contracts@^4.3.2", "@openzeppelin/contracts@^4.4.2": +"@openzeppelin/contracts-0.8@npm:@openzeppelin/contracts@^4.3.2", "@openzeppelin/contracts@^4.2.0", "@openzeppelin/contracts@^4.3.2": + name "@openzeppelin/contracts-0.8" version "4.6.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.6.0.tgz#c91cf64bc27f573836dba4122758b4743418c1b3" integrity sha512-8vi4d50NNya/bQqCmaVzvHNmwHvS0OBKb7HNtuNwEE3scXWrP31fKQoGxNMT+KbzmrNZzatE3QK5p2gFONI/hg== @@ -2041,6 +2454,11 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.4.2.tgz#4e889c9c66e736f7de189a53f8ba5b8d789425c2" integrity sha512-NyJV7sJgoGYqbtNUWgzzOGW4T6rR19FmX1IJgXGdapGPWsuMelGJn9h03nos0iqfforCbCB0iYIR0MtIuIFLLw== +"@openzeppelin/contracts@^4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" + integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== + "@openzeppelin/upgrades-core@^1.7.6": version "1.16.1" resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.16.1.tgz#a4c383fc628cc9d37d5a276def99a093c951644b" @@ -2530,6 +2948,11 @@ dependencies: bignumber.js "*" +"@types/bluebird@^3.5.37": + version "3.5.37" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.37.tgz#b99e5c7fe382c2c6d5252dc99d9fba6810fedbeb" + integrity sha512-g2qEd+zkfkTEudA2SrMAeAvY7CrFqtbsLILm2dT2VIeKTqMqVzcdfURlvu6FU3srRgbmXN1Srm94pg34EIehww== + "@types/bn.js@5.1.0", "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" @@ -2743,6 +3166,11 @@ "@types/level-errors" "*" "@types/node" "*" +"@types/linkify-it@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" + integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + "@types/long@^4.0.0", "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" @@ -2763,12 +3191,25 @@ resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.3.2.tgz#8a3f2cdd4858ce698b56cd8597d9243b8e9d3c65" integrity sha512-WOehptuhKIXukSUUkRgGbj2c997Uv/iUgYgII8U7XLJqq9W2oF0kQ6frEznRQbdurioz+L/cdaIm4GutTQfgmA== +"@types/markdown-it@^12.2.3": + version "12.2.3" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" + integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== + dependencies: + "@types/linkify-it" "*" + "@types/mdurl" "*" + +"@types/mdurl@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" + integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/minimatch@*": +"@types/minimatch@*", "@types/minimatch@^3.0.4": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== @@ -3023,7 +3464,7 @@ "@typescript-eslint/types" "5.29.0" eslint-visitor-keys "^3.3.0" -"@uma/common@^2.17.0", "@uma/common@^2.21.0": +"@uma/common@^2.21.0": version "2.21.0" resolved "https://registry.yarnpkg.com/@uma/common/-/common-2.21.0.tgz#cfdb14dc5ade167c522603591bca2059c8892c6b" integrity sha512-PJSjwVnJWWkcpqsFs6WlG+B1GiCcw6+p1/WLo9jYDuXcYhEwcS9NsOOTcbu4sWqw9cJqI1Mx2r7f/7eOpwSvMQ== @@ -3060,12 +3501,49 @@ web3 "^1.6.0" winston "^3.2.1" -"@uma/contracts-node@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@uma/contracts-node/-/contracts-node-0.2.1.tgz#29ebba6b2ecba7f0d2dc9b484bc34f0abbdefdaa" - integrity sha512-7wPkH/m8tD8UMLYUjSXN5gSp/5NsuPRF1icmwXNTWlhp/Mg4qmJHeANjsWP9JCDxlgdSDixA4hJ5qhVOPXFniA== +"@uma/common@^2.28.0": + version "2.28.0" + resolved "https://registry.yarnpkg.com/@uma/common/-/common-2.28.0.tgz#7123caf705a7bad3f16a9c211759913d9226929b" + integrity sha512-a6znfnN8Te5imvIzEkcrwg87vkd6//Oa+H74uBtx1z4ZTU0+FcByUnfSbPMlwQxrvkF2GUF9+7mmnD81Dz8ZVg== + dependencies: + "@across-protocol/contracts" "^0.1.4" + "@eth-optimism/hardhat-ovm" "^0.2.2" + "@ethersproject/bignumber" "^5.0.5" + "@google-cloud/kms" "^3.0.1" + "@google-cloud/storage" "^6.4.2" + "@nomiclabs/hardhat-ethers" "^2.0.2" + "@nomiclabs/hardhat-etherscan" "^3.0.0" + "@nomiclabs/hardhat-web3" "^2.0.0" + "@truffle/contract" "^4.3.38" + "@truffle/hdwallet-provider" eip1559-beta + "@types/ethereum-protocol" "^1.0.0" + "@umaprotocol/truffle-ledger-provider" "^1.0.5" + "@uniswap/v3-core" "^1.0.0-rc.2" + abi-decoder "github:UMAprotocol/abi-decoder" + bignumber.js "^8.0.1" + chalk-pipe "^3.0.0" + decimal.js "^10.2.1" + dotenv "^9.0.0" + eth-crypto "^1.7.0" + hardhat-deploy "0.9.1" + hardhat-gas-reporter "^1.0.4" + hardhat-typechain "^0.3.5" + lodash.uniqby "^4.7.0" + minimist "^1.2.0" + moment "^2.24.0" + node-metamask "github:UMAprotocol/node-metamask" + require-context "^1.1.0" + solidity-coverage "^0.7.13" + truffle-deploy-registry "^0.5.1" + web3 "^1.6.0" + winston "^3.2.1" + +"@uma/contracts-node@^0.3.18": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@uma/contracts-node/-/contracts-node-0.3.18.tgz#40e053ff6bc66f7ae7ce6c5d203a3200cf9ed928" + integrity sha512-ENFYjvVnyplKZF1G5YxOfpm0Ob1nOKtKcwX+TtfOiQGLNMVed8azV8tTSAWlJG/5SZkekX9Y5xZSP5YfcmMj0A== -"@uma/core@^2.18.0", "@uma/core@^2.24.0": +"@uma/core@^2.18.0": version "2.29.0" resolved "https://registry.yarnpkg.com/@uma/core/-/core-2.29.0.tgz#499d457eaf9d046ab4f6e5039f1587dcf306746f" integrity sha512-LjOgO1m4iA1Aqxj3Q4DqmNSBEAkZRHINj7qA5PVkdH+8202licY+pf880xrUyJBTLhWydlTmtP0XWYvXqmCWWg== @@ -3081,6 +3559,36 @@ "@uniswap/v3-core" "^1.0.0-rc.2" "@uniswap/v3-periphery" "^1.0.0-beta.23" +"@uma/core@^2.41.0": + version "2.41.0" + resolved "https://registry.yarnpkg.com/@uma/core/-/core-2.41.0.tgz#1a571c354b93745ab0353ec8bc98d14b4089e31f" + integrity sha512-k/KbZZJefO17JSEa7dJ6cYP6RwBsVPuR7fonjG+EUrGBBJJl/XL/M4GeIPcKpxpuVBCcI6QcmjW3Whwsapp62A== + dependencies: + "@gnosis.pm/safe-contracts" "^1.3.0" + "@gnosis.pm/zodiac" "1.0.3" + "@maticnetwork/fx-portal" "^1.0.4" + "@openzeppelin/contracts" "4.4.2" + "@uma/common" "^2.28.0" + "@uniswap/lib" "4.0.1-alpha" + "@uniswap/v2-core" "1.0.0" + "@uniswap/v2-periphery" "1.1.0-beta.0" + "@uniswap/v3-core" "^1.0.0-rc.2" + "@uniswap/v3-periphery" "^1.0.0-beta.23" + +"@uma/merkle-distributor@^1.3.38": + version "1.3.38" + resolved "https://registry.yarnpkg.com/@uma/merkle-distributor/-/merkle-distributor-1.3.38.tgz#8e680df2ab32fefc8706387579ee194eb339e539" + integrity sha512-QezWgxZ+blfAwoKSvf/D3B/LuvQrRN/NOzUm9BV3htVptzOfpJaYGF/vqyEGtFNlvS8evlP1ArE9JEqLaTZz+A== + dependencies: + "@uma/common" "^2.28.0" + "@uma/contracts-node" "^0.3.18" + chai "^4.3.0" + commander "^7.1.0" + ethers "^5.4.2" + ipfs-http-client "^49.0.2" + mocha "^8.3.0" + node-fetch "^2.6.1" + "@umaprotocol/truffle-ledger-provider@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@umaprotocol/truffle-ledger-provider/-/truffle-ledger-provider-1.0.5.tgz#e30025c4ecc2f2540825c46788ef1291474080be" @@ -3317,6 +3825,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -3440,6 +3953,11 @@ acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.8.0: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + address@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" @@ -3598,6 +4116,14 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== +any-signal@^2.1.0, any-signal@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + anymatch@^3.0.3, anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -3738,7 +4264,7 @@ asap@^2.0.0, asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1.js@^5.2.0: +asn1.js@^5.0.1, 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== @@ -4545,7 +5071,7 @@ bip66@^1.1.5: dependencies: safe-buffer "^5.0.1" -bl@^4.0.3, bl@^4.1.0: +bl@^4.0.0, bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -4559,7 +5085,14 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.0, bluebird@^3.5.2: +blob-to-it@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" + integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== + dependencies: + browser-readablestream-to-it "^1.0.3" + +bluebird@^3.5.0, bluebird@^3.5.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== @@ -4602,6 +5135,19 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +borc@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" + integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== + dependencies: + bignumber.js "^9.0.0" + buffer "^5.5.0" + commander "^2.15.0" + ieee754 "^1.1.13" + iso-url "~0.4.7" + json-text-sequence "~0.1.0" + readable-stream "^3.6.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4610,6 +5156,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -4627,6 +5180,11 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -4771,7 +5329,7 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@6.0.3, buffer@^6.0.3: +buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -4779,7 +5337,7 @@ buffer@6.0.3, buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.4.3, 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== @@ -4899,6 +5457,13 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== + dependencies: + lodash "^4.17.15" + cbor@^5.0.2, cbor@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" @@ -4914,7 +5479,7 @@ cbor@^8.0.0: dependencies: nofilter "^3.1.0" -chai@^4.3.4: +chai@^4.3.0, chai@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== @@ -5063,6 +5628,21 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -5109,6 +5689,16 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" +cids@^1.0.0, cids@^1.1.5: + version "1.1.9" + resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" + integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== + dependencies: + multibase "^4.0.1" + multicodec "^3.0.1" + multihashes "^4.0.1" + uint8arrays "^3.0.0" + 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" @@ -5332,11 +5922,16 @@ commander@4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^2.19.0, commander@^2.20.0: +commander@^2.15.0, commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -5704,6 +6299,13 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, d dependencies: ms "2.1.2" +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" @@ -5854,6 +6456,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +delimit-stream@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" + integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== + denque@^1.1.0: version "1.5.1" resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" @@ -5956,6 +6563,15 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dns-over-http-resolver@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -6109,6 +6725,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +electron-fetch@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" + electron-to-chromium@^1.3.47, electron-to-chromium@^1.4.164: version "1.4.168" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.168.tgz#8f6bda320a434ac963850d18e41d83220973cbdd" @@ -6178,7 +6801,7 @@ encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding@^0.1.11: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -6217,11 +6840,26 @@ entities@^4.2.0, entities@^4.3.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656" integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg== +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +err-code@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +err-code@^3.0.0, err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + errno@~0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -6359,6 +6997,18 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +escodegen@^1.13.0: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -6492,6 +7142,15 @@ eslint@^8.12.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +espree@^9.0.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + espree@^9.3.2: version "9.3.2" resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" @@ -6530,7 +7189,7 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -7068,6 +7727,42 @@ ethers@^5.0.13, ethers@^5.4.6, ethers@^5.6.8: "@ethersproject/web" "5.6.1" "@ethersproject/wordlists" "5.6.1" +ethers@^5.4.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + 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.2" + "@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-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -7094,7 +7789,7 @@ eventemitter3@4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== -events@^3.0.0, events@^3.2.0: +events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -7254,6 +7949,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-fifo@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.1.0.tgz#17d1a3646880b9891dfa0c54e69c5fef33cad779" + integrity sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g== + fast-glob@^3.0.3, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -7604,7 +8304,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -7664,6 +8364,16 @@ gaxios@^4.0.0: is-stream "^2.0.0" node-fetch "^2.6.7" +gaxios@^5.0.0, gaxios@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.0.2.tgz#ca3a40e851c728d31d7001c2357062d46bf966d1" + integrity sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og== + dependencies: + extend "^3.0.2" + https-proxy-agent "^5.0.0" + is-stream "^2.0.0" + node-fetch "^2.6.7" + gcp-metadata@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.3.1.tgz#fb205fe6a90fef2fd9c85e6ba06e5559ee1eefa9" @@ -7672,6 +8382,14 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" +gcp-metadata@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.0.1.tgz#8d1e785ee7fad554bc2a80c1f930c9a9518d2b00" + integrity sha512-jiRJ+Fk7e8FH68Z6TLaqwea307OktJpDjmYnU7/li6ziwvVvU2RlrCyQo5vkdeP94chm0kcSCOOszvmuaioq3g== + dependencies: + gaxios "^5.0.0" + json-bigint "^1.0.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -7701,6 +8419,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.3" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -7799,6 +8522,18 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -7834,12 +8569,23 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== +glob@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== dependencies: - global-prefix "^3.0.0" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" @@ -7916,6 +8662,21 @@ google-auth-library@^7.14.0, google-auth-library@^7.14.1: jws "^4.0.0" lru-cache "^6.0.0" +google-auth-library@^8.0.1, google-auth-library@^8.0.2: + version "8.6.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.6.0.tgz#79cc4c8bacffee26bac244f25f4968ac87218bb8" + integrity sha512-y6bw1yTWMVgs1vGJwBZ3uu+uIClfgxQfsEVcTNKjQeNQOVwox69+ZUgTeTAzrh+74hBqrk1gWyb9RsQVDI7seg== + dependencies: + arrify "^2.0.0" + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + fast-text-encoding "^1.0.0" + gaxios "^5.0.0" + gcp-metadata "^5.0.0" + gtoken "^6.1.0" + jws "^4.0.0" + lru-cache "^6.0.0" + google-gax@^2.24.1: version "2.30.5" resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-2.30.5.tgz#e836f984f3228900a8336f608c83d75f9cb73eff" @@ -7935,6 +8696,26 @@ google-gax@^2.24.1: protobufjs "6.11.3" retry-request "^4.0.0" +google-gax@^3.0.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-3.5.2.tgz#7c3ad61dbf366a55527b803caead276668b160d8" + integrity sha512-AyP53w0gHcWlzxm+jSgqCR3Xu4Ld7EpSjhtNBnNhzwwWaIUyphH9kBGNIEH+i4UGkTUXOY29K/Re8EiAvkBRGw== + dependencies: + "@grpc/grpc-js" "~1.7.0" + "@grpc/proto-loader" "^0.7.0" + "@types/long" "^4.0.0" + abort-controller "^3.0.0" + duplexify "^4.0.0" + fast-text-encoding "^1.0.3" + google-auth-library "^8.0.2" + is-stream-ended "^0.1.4" + node-fetch "^2.6.1" + object-hash "^3.0.0" + proto3-json-serializer "^1.0.0" + protobufjs "7.1.2" + protobufjs-cli "1.0.2" + retry-request "^5.0.0" + google-p12-pem@^3.1.3: version "3.1.4" resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b" @@ -7942,6 +8723,13 @@ google-p12-pem@^3.1.3: dependencies: node-forge "^1.3.1" +google-p12-pem@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-4.0.1.tgz#82841798253c65b7dc2a4e5fe9df141db670172a" + integrity sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ== + dependencies: + node-forge "^1.3.1" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -7998,6 +8786,15 @@ gtoken@^5.0.4: google-p12-pem "^3.1.3" jws "^4.0.0" +gtoken@^6.1.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-6.1.2.tgz#aeb7bdb019ff4c3ba3ac100bbe7b6e74dce0e8bc" + integrity sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ== + dependencies: + gaxios "^5.0.1" + google-p12-pem "^4.0.0" + jws "^4.0.0" + handlebars@^4.0.1: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -8569,11 +9366,143 @@ ioredis@^4.28.5: redis-parser "^3.0.0" standard-as-callback "^2.1.0" +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ipaddr.js@1.9.1: version "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== +ipfs-core-types@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.3.1.tgz#5dab234428d031d0657d1708f7bb040281d6ab5f" + integrity sha512-xPBsowS951RsuskMo86AWz9y4ReaBot1YsjOhZvKl8ORd8taxIBTT72LnEPwIZ2G24U854Zjxvd/qUMqO14ivg== + dependencies: + cids "^1.1.5" + multiaddr "^8.0.0" + peer-id "^0.14.1" + +ipfs-core-utils@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.7.2.tgz#ebc1281d14d26538881a8249c3eed8c27b98f519" + integrity sha512-d7T72GxvhNN+tEHsJjxI5Y4LQVdMMbSwNbWB6nVsIHUEdwm3w85L2u1E/ctNd9aaNGvoBwEcnIZhSmqhMf7stw== + dependencies: + any-signal "^2.1.2" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + cids "^1.1.5" + err-code "^2.0.3" + ipfs-core-types "^0.3.1" + ipfs-utils "^6.0.1" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.1" + multiaddr "^8.0.0" + multiaddr-to-uri "^6.0.0" + parse-duration "^0.4.4" + timeout-abort-controller "^1.1.1" + uint8arrays "^2.1.3" + +ipfs-http-client@^49.0.2: + version "49.0.4" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-49.0.4.tgz#a7b5a696ab755ce1e822240e1774caab6cffa117" + integrity sha512-qgWbkcB4glQrUkE2tZR+GVXyrO6aJyspWBjyct/6TzrhCHx7evjz+kUTK+wNm4S9zccUePEml5VNZUmUhoQtbA== + dependencies: + abort-controller "^3.0.0" + any-signal "^2.1.2" + bignumber.js "^9.0.1" + cids "^1.1.5" + debug "^4.1.1" + form-data "^3.0.0" + ipfs-core-types "^0.3.1" + ipfs-core-utils "^0.7.2" + ipfs-utils "^6.0.1" + ipld-block "^0.11.0" + ipld-dag-cbor "^0.17.0" + ipld-dag-pb "^0.20.0" + ipld-raw "^6.0.0" + it-last "^1.0.4" + it-map "^1.0.4" + it-tar "^1.2.2" + it-to-stream "^0.1.2" + merge-options "^3.0.4" + multiaddr "^8.0.0" + multibase "^4.0.2" + multicodec "^3.0.1" + multihashes "^4.0.2" + nanoid "^3.1.12" + native-abort-controller "^1.0.3" + parse-duration "^0.4.4" + stream-to-it "^0.2.2" + uint8arrays "^2.1.3" + +ipfs-utils@^6.0.1: + version "6.0.8" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-6.0.8.tgz#a0e4cad19af35569226fac93a84664b4c222d946" + integrity sha512-mDDQaDisI/uWk+X08wyw+jBcq76IXwMjgyaoyEgJDb/Izb+QbBCSJjo9q+EvbMxh6/l6q0NiAfbbsxEyQYPW9w== + dependencies: + abort-controller "^3.0.0" + any-signal "^2.1.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.0.0" + it-glob "~0.0.11" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-abort-controller "^1.0.3" + native-fetch "^3.0.0" + node-fetch "^2.6.1" + stream-to-it "^0.2.2" + +ipld-block@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" + integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== + dependencies: + cids "^1.0.0" + +ipld-dag-cbor@^0.17.0: + version "0.17.1" + resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" + integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== + dependencies: + borc "^2.1.2" + cids "^1.0.0" + is-circular "^1.0.2" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + uint8arrays "^2.1.3" + +ipld-dag-pb@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" + integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== + dependencies: + cids "^1.0.0" + class-is "^1.1.0" + multicodec "^2.0.0" + multihashing-async "^2.0.0" + protons "^2.0.0" + reset "^0.1.0" + run "^1.4.0" + stable "^0.1.8" + uint8arrays "^1.0.0" + +ipld-raw@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" + integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== + dependencies: + cids "^1.0.0" + multicodec "^2.0.0" + multihashing-async "^2.0.0" + is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -8624,6 +9553,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-circular@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" + integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== + is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -8638,6 +9572,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-electron@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.1.tgz#751b1dd8a74907422faa5c35aaa0cf66d98086e9" + integrity sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -8704,6 +9643,13 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-lower-case@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" @@ -8857,6 +9803,29 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +iso-constants@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" + integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== + +iso-random-stream@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-2.0.2.tgz#a24f77c34cfdad9d398707d522a6a0cc640ff27d" + integrity sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ== + dependencies: + events "^3.3.0" + readable-stream "^3.4.0" + +iso-url@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== + +iso-url@~0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" + integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -8912,6 +9881,84 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +it-all@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-concat@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" + integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== + dependencies: + bl "^4.0.0" + +it-glob@~0.0.11: + version "0.0.14" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.14.tgz#24f5e7fa48f9698ce7dd410355f327470c91eb90" + integrity sha512-TKKzs9CglbsihSpcwJPXN5DBUssu4akRzPlp8QJRCoLrKoaOpyY2V1qDlxx+UMivn0i114YyTd4AawWl7eqIdw== + dependencies: + "@types/minimatch" "^3.0.4" + minimatch "^3.0.4" + +it-last@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" + integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== + +it-map@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-peekable@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" + integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== + +it-reader@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" + integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== + dependencies: + bl "^4.0.0" + +it-tar@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" + integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== + dependencies: + bl "^4.0.0" + buffer "^5.4.3" + iso-constants "^0.1.2" + it-concat "^1.0.0" + it-reader "^2.0.0" + p-defer "^3.0.0" + +it-to-stream@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" + integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== + dependencies: + buffer "^5.6.0" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + iterare@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" @@ -9358,6 +10405,13 @@ js-yaml@3.x, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -9365,11 +10419,39 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +js2xmlparser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== + dependencies: + xmlcreate "^2.0.4" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsdoc@^3.6.3: + version "3.6.11" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.11.tgz#8bbb5747e6f579f141a5238cbad4e95e004458ce" + integrity sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg== + dependencies: + "@babel/parser" "^7.9.4" + "@types/markdown-it" "^12.2.3" + bluebird "^3.7.2" + catharsis "^0.9.0" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.2" + klaw "^3.0.0" + markdown-it "^12.3.2" + markdown-it-anchor "^8.4.1" + marked "^4.0.10" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" + taffydb "2.6.2" + underscore "~1.13.2" + jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -9499,6 +10581,13 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json-text-sequence@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" + integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== + dependencies: + delimit-stream "0.1.0" + json5@2.x, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" @@ -9623,6 +10712,11 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keypair@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.4.tgz#a749a45f388593f3950f18b3757d32a93bd8ce83" + integrity sha512-zwhgOhhniaL7oxMgUMKKw5219PWWABMO+dgMnzJOQ2/5L3XJtTJGhW2PEXlxXj9zaccdReZJZ83+4NPhVfNVDg== + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -9642,6 +10736,13 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -9845,6 +10946,23 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libp2p-crypto@^0.19.0: + version "0.19.7" + resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.19.7.tgz#e96a95bd430e672a695209fe0fbd2bcbd348bc35" + integrity sha512-Qb5o/3WFKF2j6mYSt4UBPyi2kbKl3jYV0podBJoJCw70DlpM5Xc+oh3fFY9ToSunu8aSQQ5GY8nutjXgX/uGRA== + dependencies: + err-code "^3.0.1" + is-typedarray "^1.0.0" + iso-random-stream "^2.0.0" + keypair "^1.0.1" + multiformats "^9.4.5" + node-forge "^0.10.0" + pem-jwk "^2.0.0" + protobufjs "^6.11.2" + secp256k1 "^4.0.0" + uint8arrays "^3.0.0" + ursa-optional "^0.10.1" + libphonenumber-js@^1.9.43: version "1.10.7" resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.7.tgz#4c010b7b57e824c571ea4cdbf7aea6f3c408878c" @@ -9855,6 +10973,13 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -10018,6 +11143,13 @@ log-symbols@3.0.0: dependencies: chalk "^2.4.2" +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -10042,6 +11174,11 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" + integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== + loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -10148,11 +11285,32 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +markdown-it-anchor@^8.4.1: + version "8.6.5" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" + integrity sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ== + +markdown-it@^12.3.2: + version "12.3.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-table@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +marked@^4.0.10: + version "4.2.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.0.tgz#f1683b077626a6c53e28926b798a18184aa13a91" + integrity sha512-1qWHjHlBKwjnDfrkxd0L3Yx4LTad/WO7+d13YsXAC/ZfKj7p0xkLV3sDXJzfWgL7GfW4IBZwMAYWaz+ifyQouQ== + match-all@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" @@ -10172,6 +11330,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -10230,6 +11393,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -10359,6 +11529,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@*, minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + "minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -10468,6 +11645,37 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" +mocha@^8.3.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + mocha@^9.2.0: version "9.2.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" @@ -10562,6 +11770,27 @@ multer@1.4.4-lts.1: type-is "^1.6.4" xtend "^4.0.0" +multiaddr-to-uri@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" + integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== + dependencies: + multiaddr "^8.0.0" + +multiaddr@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" + integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== + dependencies: + cids "^1.0.0" + class-is "^1.1.0" + dns-over-http-resolver "^1.0.0" + err-code "^2.0.3" + is-ip "^3.1.0" + multibase "^3.0.0" + uint8arrays "^1.1.0" + varint "^5.0.0" + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -10570,6 +11799,21 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" +multibase@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" + integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== + dependencies: + "@multiformats/base-x" "^4.0.1" + web-encoding "^1.0.6" + +multibase@^4.0.1, multibase@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" + integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== + dependencies: + "@multiformats/base-x" "^4.0.1" + multibase@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" @@ -10593,6 +11837,27 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" +multicodec@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" + integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== + dependencies: + uint8arrays "1.1.0" + varint "^6.0.0" + +multicodec@^3.0.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" + integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== + dependencies: + uint8arrays "^3.0.0" + varint "^6.0.0" + +multiformats@^9.4.2, multiformats@^9.4.5: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" @@ -10602,6 +11867,27 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" +multihashes@^4.0.1, multihashes@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" + integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== + dependencies: + multibase "^4.0.1" + uint8arrays "^3.0.0" + varint "^5.0.2" + +multihashing-async@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.4.tgz#26dce2ec7a40f0e7f9e732fc23ca5f564d693843" + integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== + dependencies: + blakejs "^1.1.0" + err-code "^3.0.0" + js-sha3 "^0.8.0" + multihashes "^4.0.1" + murmurhash3js-revisited "^3.0.0" + uint8arrays "^3.0.0" + murmur-128@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" @@ -10611,6 +11897,11 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" +murmurhash3js-revisited@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" + integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -10635,6 +11926,11 @@ nan@^2.13.2, nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== +nan@^2.14.2: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + nano-base32@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" @@ -10650,12 +11946,17 @@ nanoid@*: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.0.tgz#6e144dee117609232c3f415c34b0e550e64999a5" integrity sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg== +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + nanoid@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== -nanoid@^3.0.0: +nanoid@^3.0.0, nanoid@^3.1.12, nanoid@^3.1.20: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== @@ -10665,6 +11966,16 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +native-abort-controller@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" + integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -10746,6 +12057,11 @@ node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -11067,6 +12383,19 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -11192,6 +12521,11 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== +parse-duration@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" + integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== + parse-headers@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" @@ -11376,6 +12710,26 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +peer-id@^0.14.1: + version "0.14.8" + resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.14.8.tgz#667c6bedc8ab313c81376f6aca0baa2140266fab" + integrity sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig== + dependencies: + cids "^1.1.5" + class-is "^1.1.0" + libp2p-crypto "^0.19.0" + minimist "^1.2.5" + multihashes "^4.0.2" + protobufjs "^6.10.2" + uint8arrays "^2.0.5" + +pem-jwk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085" + integrity sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA== + dependencies: + asn1.js "^5.0.1" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -11629,7 +12983,30 @@ proto3-json-serializer@^0.1.8: dependencies: protobufjs "^6.11.2" -protobufjs@6.11.3, protobufjs@^6.11.2, protobufjs@^6.11.3: +proto3-json-serializer@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.0.tgz#52d9c73b24d25ff925639e1e5a01ac883460149f" + integrity sha512-SjXwUWe/vANGs/mJJTbw5++7U67nwsymg7qsoPtw6GiXqw3kUy8ByojrlEdVE2efxAdKreX8WkDafxvYW95ZQg== + dependencies: + protobufjs "^7.0.0" + +protobufjs-cli@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.0.2.tgz#905fc49007cf4aaf3c45d5f250eb294eedeea062" + integrity sha512-cz9Pq9p/Zs7okc6avH20W7QuyjTclwJPgqXG11jNaulfS3nbVisID8rC+prfgq0gbZE0w9LBFd1OKFF03kgFzg== + dependencies: + chalk "^4.0.0" + escodegen "^1.13.0" + espree "^9.0.0" + estraverse "^5.1.0" + glob "^8.0.0" + jsdoc "^3.6.3" + minimist "^1.2.0" + semver "^7.1.2" + tmp "^0.2.1" + uglify-js "^3.7.7" + +protobufjs@6.11.3, protobufjs@^6.10.2, protobufjs@^6.11.2, protobufjs@^6.11.3: version "6.11.3" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== @@ -11648,6 +13025,39 @@ protobufjs@6.11.3, protobufjs@^6.11.2, protobufjs@^6.11.3: "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@7.1.2, protobufjs@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.2.tgz#a0cf6aeaf82f5625bffcf5a38b7cd2a7de05890c" + integrity sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + +protons@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.3.tgz#94f45484d04b66dfedc43ad3abff1e8907994bb2" + integrity sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA== + dependencies: + protocol-buffers-schema "^3.3.1" + signed-varint "^2.0.1" + uint8arrays "^3.0.0" + varint "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -11866,6 +13276,13 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -11873,6 +13290,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -12063,6 +13487,18 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requizzle@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" + integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== + dependencies: + lodash "^4.17.14" + +reset@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" + integrity sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -12133,6 +13569,11 @@ resumer@~0.0.0: dependencies: through "~2.3.4" +retimer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" + integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== + retry-request@^4.0.0, retry-request@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.2.2.tgz#b7d82210b6d2651ed249ba3497f07ea602f1a903" @@ -12141,6 +13582,14 @@ retry-request@^4.0.0, retry-request@^4.2.2: debug "^4.1.1" extend "^3.0.2" +retry-request@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-5.0.2.tgz#143d85f90c755af407fcc46b7166a4ba520e44da" + integrity sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ== + dependencies: + debug "^4.1.1" + extend "^3.0.2" + retry@0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -12202,6 +13651,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +run@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" + integrity sha512-962oBW07IjQ9SizyMHdoteVbDKt/e2nEsnTRZ0WjK/zs+jfQQICqH0qj0D5lqZNuy0JkbzfA6IOqw0Sk7C3DlQ== + dependencies: + minimatch "*" + rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" @@ -12329,7 +13785,7 @@ secp256k1@4.0.2: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -secp256k1@^4.0.1: +secp256k1@^4.0.0, secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== @@ -12370,6 +13826,13 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.2: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + 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" @@ -12402,6 +13865,13 @@ sentence-case@^2.1.0: no-case "^2.2.0" upper-case-first "^1.1.2" +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + serialize-javascript@6.0.0, serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -12513,6 +13983,13 @@ 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.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signed-varint@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" + integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== + dependencies: + varint "~5.0.0" + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -12740,6 +14217,11 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -12786,6 +14268,13 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-to-it@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== + dependencies: + get-iterator "^1.0.2" + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -13114,6 +14603,11 @@ table@^6.8.0: string-width "^4.2.3" strip-ansi "^6.0.1" +taffydb@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" + integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== + tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -13185,6 +14679,17 @@ teeny-request@^7.1.3: stream-events "^1.0.5" uuid "^8.0.0" +teeny-request@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-8.0.2.tgz#c06a75101cf782788ba8f9a2ed5f2ac84c1c4e15" + integrity sha512-34pe0a4zASseXZCKdeTiIZqSKA8ETHb1EwItZr01PAR3CLPojeAKgSjzeNS4373gi59hNulyDrPKEbh2zO9sCg== + dependencies: + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" + stream-events "^1.0.5" + uuid "^9.0.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -13292,6 +14797,14 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== +timeout-abort-controller@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" + integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== + dependencies: + abort-controller "^3.0.0" + retimer "^2.0.0" + title-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" @@ -13307,6 +14820,13 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -13606,16 +15126,48 @@ u2f-api@0.2.7: resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + uglify-js@^3.1.4: version "3.16.1" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.1.tgz#0e7ec928b3d0b1e1d952bce634c384fd56377317" integrity sha512-X5BGTIDH8U6IQ1TIRP62YC36k+ULAa1d59BxlWvPUJ1NkW5L3FwcGfEzuVvGmhJFBu0YJ5Ge25tmRISqCmLiRQ== +uglify-js@^3.7.7: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + uid2@0.0.x: version "0.0.4" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44" integrity sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA== +uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" + integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== + dependencies: + multibase "^3.0.0" + web-encoding "^1.0.2" + +uint8arrays@^2.0.5, uint8arrays@^2.1.3: + version "2.1.10" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" + integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== + dependencies: + multiformats "^9.4.2" + +uint8arrays@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -13631,6 +15183,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@~1.13.2: + version "1.13.6" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + undici@^5.4.0: version "5.5.1" resolved "https://registry.yarnpkg.com/undici/-/undici-5.5.1.tgz#baaf25844a99eaa0b22e1ef8d205bffe587c8f43" @@ -13709,6 +15266,14 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== +ursa-optional@^0.10.1: + version "0.10.2" + resolved "https://registry.yarnpkg.com/ursa-optional/-/ursa-optional-0.10.2.tgz#bd74e7d60289c22ac2a69a3c8dea5eb2817f9681" + integrity sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A== + dependencies: + bindings "^1.5.0" + nan "^2.14.2" + usb@^1.6.0: version "1.9.2" resolved "https://registry.yarnpkg.com/usb/-/usb-1.9.2.tgz#fb6b36f744ecc707a196c45a6ec72442cb6f2b73" @@ -13757,6 +15322,17 @@ util@^0.12.0: safe-buffer "^5.1.2" which-typed-array "^1.1.2" +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + utils-merge@1.0.1, utils-merge@1.x.x, utils-merge@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -13819,11 +15395,16 @@ validator@^13.7.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== -varint@^5.0.0: +varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13874,6 +15455,15 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-encoding@^1.0.2, web-encoding@^1.0.6: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + web3-bzz@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" @@ -14545,6 +16135,11 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + workerpool@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" @@ -14687,6 +16282,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmlcreate@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== + xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"