From 63daf0e026bb1e2600aec30e5a3433ff3b0e2974 Mon Sep 17 00:00:00 2001 From: Maikol <86025070+Maikol@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:45:27 -0300 Subject: [PATCH] feat: added DataEdge contract with OracleConfiguration (#2) * feat: added DataEdge contract with OracleConfiguration * fix: keep oracle history by using address as the ID * chore: changed to use subgraph ids * chore: use subgraphs deployment id and use version instead of commit hash --- .gitignore | 3 +- abis/SAODataEdge.json | 16 + networks.json | 4 + package.json | 2 +- schema.graphql | 67 ++-- src/constants.ts | 2 + src/helpers.ts | 31 ++ src/sao-data-edge.ts | 54 ++++ src/store-cache.ts | 87 +++++ src/subgraph-availability-manager.ts | 121 +++---- subgraph.template.yaml | 34 +- tests/sao-data-edge.test.ts | 59 ++++ tests/subgraph-availability-manager-utils.ts | 63 +--- tests/subgraph-availability-manager.test.ts | 100 +++--- yarn.lock | 320 ++----------------- 15 files changed, 430 insertions(+), 533 deletions(-) create mode 100644 abis/SAODataEdge.json create mode 100644 src/constants.ts create mode 100644 src/helpers.ts create mode 100644 src/sao-data-edge.ts create mode 100644 src/store-cache.ts create mode 100644 tests/sao-data-edge.test.ts diff --git a/.gitignore b/.gitignore index 03a6238..564cb0b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ config/addresses.ts config/generatedAddresses.json tests/.bin .vscode -.latest.json \ No newline at end of file +.latest.json +.docker diff --git a/abis/SAODataEdge.json b/abis/SAODataEdge.json new file mode 100644 index 0000000..430d68d --- /dev/null +++ b/abis/SAODataEdge.json @@ -0,0 +1,16 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "Log", + "type": "event" + }, + { "stateMutability": "payable", "type": "fallback" } +] diff --git a/networks.json b/networks.json index 7d17db8..1a165f3 100644 --- a/networks.json +++ b/networks.json @@ -3,6 +3,10 @@ "SubgraphAvailabilityManager": { "address": "0x9bDC3264596850E7F5d141A8D898dFA7001355CC", "startBlock": 22552633 + }, + "SAODataEdge": { + "address": "0xB61AF143c79Cbdd68f179B657AaC86665CC2B469", + "startBlock": 25463619 } } } \ No newline at end of file diff --git a/package.json b/package.json index 4af3ff7..556fadd 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "prep:test": "mustache ./config/test.json subgraph.template.yaml > subgraph.yaml" }, "dependencies": { - "@graphprotocol/graph-cli": "0.61.0", + "@graphprotocol/graph-cli": "0.71.0", "@graphprotocol/graph-ts": "0.30.0" }, "devDependencies": { diff --git a/schema.graphql b/schema.graphql index 852ea6c..3f149fa 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1,45 +1,42 @@ -type NewOwnership @entity(immutable: true) { - id: Bytes! - from: Bytes! # address - to: Bytes! # address - blockNumber: BigInt! - blockTimestamp: BigInt! - transactionHash: Bytes! +type GlobalState @entity { + id: ID! + oracles: [Oracle!]! @derivedFrom(field: "state") + activeOracles: [Oracle!]! } -type NewPendingOwnership @entity(immutable: true) { - id: Bytes! - from: Bytes! # address - to: Bytes! # address - blockNumber: BigInt! - blockTimestamp: BigInt! - transactionHash: Bytes! -} - -type OracleSet @entity(immutable: true) { - id: Bytes! - index: BigInt! # uint256 - oracle: Bytes! # address - blockNumber: BigInt! - blockTimestamp: BigInt! - transactionHash: Bytes! +type Oracle @entity { + id: Bytes! # address + index: String! # oracle_index + state: GlobalState! + latestConfig: OracleConfiguration! + configurations: [OracleConfiguration!]! @derivedFrom(field: "oracle") + votes: [OracleVote!]! @derivedFrom(field: "oracle") + active: Boolean! + activeSince: BigInt! + activeUntil: BigInt! # 0 means active } type OracleVote @entity(immutable: true) { - id: Bytes! + id: ID! + oracle: Oracle! subgraphDeploymentID: Bytes! # bytes32 deny: Boolean! # bool - oracleIndex: BigInt! # uint256 timestamp: BigInt! # uint256 - blockNumber: BigInt! - blockTimestamp: BigInt! - transactionHash: Bytes! } -type VoteTimeLimitSet @entity(immutable: true) { - id: Bytes! - voteTimeLimit: BigInt! # uint256 - blockNumber: BigInt! - blockTimestamp: BigInt! - transactionHash: Bytes! -} +type OracleConfiguration @entity(immutable: true) { + id: ID! + oracle: Oracle! + version: String! + ipfsConcurrency: String! + ipfsTimeout: String! + minSignal: String! + period: String! + gracePeriod: String! + supportedDataSourceKinds: String! + networkSubgraphDeploymentId: String! + epochBlockOracleSubgraphDeploymentId: String! + subgraphAvailabilityManagerContract: String! + oracleIndex: String! + createdAt: BigInt! +} \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..e994ecb --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,2 @@ +export let ORACLE_CONFIGURATION_ABI = + "(string,(string,string,string,string,string,string,string,string,string,string))" diff --git a/src/helpers.ts b/src/helpers.ts new file mode 100644 index 0000000..fdd5f42 --- /dev/null +++ b/src/helpers.ts @@ -0,0 +1,31 @@ +import { log, BigInt, Bytes } from "@graphprotocol/graph-ts"; +import { StoreCache } from "./store-cache"; + +export function parseCalldata(calldata: Bytes): Bytes { + // Remove function signature + let dataWithoutSignature = calldata.toHexString().slice(10); + + // ethabi expects a tuple offset if your tuple contains dynamic data + // https://medium.com/@r2d2_68242/indexing-transaction-input-data-in-a-subgraph-6ff5c55abf20 + let hexStringToDecode = '0x0000000000000000000000000000000000000000000000000000000000000020' + + dataWithoutSignature; + return Bytes.fromHexString(hexStringToDecode); +} + +export function isSubmitterAllowed( + cache: StoreCache, + oracleIndex: String, + submitter: Bytes +): boolean { + let oracle = cache.getOracle(submitter); + return oracle.active && oracle.index == oracleIndex; +} + + +export function getOracleVoteId( + subgraphDeploymentID: String, + oracleAddress: String, + timestamp: String +): string { + return [subgraphDeploymentID, oracleAddress, timestamp].join("-") as string; +} \ No newline at end of file diff --git a/src/sao-data-edge.ts b/src/sao-data-edge.ts new file mode 100644 index 0000000..ae66b07 --- /dev/null +++ b/src/sao-data-edge.ts @@ -0,0 +1,54 @@ +import { log, ethereum, Bytes } from "@graphprotocol/graph-ts"; +import { Log as LogEvent } from "../generated/SAODataEdge/SAODataEdge" +import { parseCalldata, isSubmitterAllowed } from "./helpers" +import { StoreCache } from "./store-cache"; +import { ORACLE_CONFIGURATION_ABI } from "./constants"; + +export function handleLog(event: LogEvent): void { + let submitter = event.transaction.from; + processPayload(submitter, event.params.data, event.transaction.hash.toHexString(), event.block); +} + +export function processPayload( + submitter: Bytes, + payload: Bytes, + txHash: string, + block: ethereum.Block +): void { + let submitterAddress = submitter.toHexString(); + log.warning("Processing payload. Submitter: {}", [submitterAddress]); + + let cache = new StoreCache(); + + let parsedCalldata = parseCalldata(payload); + let decoded = ethereum.decode(ORACLE_CONFIGURATION_ABI, parsedCalldata)!.toTuple(); + let decodedConfig = decoded[1].toTuple(); + let decodedOracleIndex = decodedConfig[9].toString(); + + if (!isSubmitterAllowed(cache, decodedOracleIndex, submitter)) { + log.error("Submitter not allowed: {}", [submitterAddress]); + return; + } + + log.info("Submitter allowed", []); + + let oracle = cache.getOracle(submitter); + let config = cache.getOracleConfiguration(txHash); + config.oracle = oracle.id; + config.version = decoded[0].toString(); + config.ipfsConcurrency = decodedConfig[0].toString(); + config.ipfsTimeout = decodedConfig[1].toString(); + config.minSignal = decodedConfig[2].toString(); + config.period = decodedConfig[3].toString(); + config.gracePeriod = decodedConfig[4].toString(); + config.supportedDataSourceKinds = decodedConfig[5].toString(); + config.networkSubgraphDeploymentId = decodedConfig[6].toString(); + config.epochBlockOracleSubgraphDeploymentId = decodedConfig[7].toString(); + config.subgraphAvailabilityManagerContract = decodedConfig[8].toString(); + config.oracleIndex = decodedOracleIndex; + config.createdAt = block.timestamp; + + oracle.latestConfig = config.id; + + cache.commitChanges(); +} diff --git a/src/store-cache.ts b/src/store-cache.ts new file mode 100644 index 0000000..4dfb4d0 --- /dev/null +++ b/src/store-cache.ts @@ -0,0 +1,87 @@ +import { GlobalState, Oracle, OracleConfiguration, OracleVote } from "../generated/schema" +import { log, Bytes } from "@graphprotocol/graph-ts" + +export class SafeMap extends Map { + safeGet(id: K): V | null { + return this.has(id) ? this.get(id) : null; + } +} + +export class StoreCache { + state: GlobalState; + oracles: SafeMap; + oraclesConfigs: SafeMap; + oracleVotes: SafeMap; + + constructor() { + let state = GlobalState.load("0"); + if (state == null) { + state = new GlobalState("0"); + state.activeOracles = []; + state.save(); + } + + this.state = state; + this.oracles = new SafeMap(); + this.oraclesConfigs = new SafeMap(); + this.oracleVotes = new SafeMap(); + } + + getGlobalState(): GlobalState { + return this.state; + } + + getOracle(id: Bytes): Oracle { + if (this.oracles.safeGet(id) == null) { + let oracle = Oracle.load(id); + if (oracle == null) { + oracle = new Oracle(id); + oracle.state = this.state.id; + oracle.index = ""; + } + this.oracles.set(id, oracle); + } + return this.oracles.safeGet(id)!; + } + + getOracleConfiguration(id: String): OracleConfiguration { + if (this.oraclesConfigs.safeGet(id) == null) { + let config = OracleConfiguration.load(id); + if (config == null) { + config = new OracleConfiguration(id); + } + this.oraclesConfigs.set(id, config); + } + return this.oraclesConfigs.safeGet(id)!; + } + + getOracleVote(id: String): OracleVote { + if (this.oracleVotes.safeGet(id) == null) { + let vote = OracleVote.load(id); + if (vote == null) { + vote = new OracleVote(id); + } + this.oracleVotes.set(id, vote); + } + return this.oracleVotes.safeGet(id)!; + } + + commitChanges(): void { + this.state.save(); + + let oracles = this.oracles.values(); + for (let i = 0; i < oracles.length; i++) { + oracles[i].save(); + } + + let configs = this.oraclesConfigs.values(); + for (let i = 0; i < configs.length; i++) { + configs[i].save(); + } + + let votes = this.oracleVotes.values(); + for (let i = 0; i < votes.length; i++) { + votes[i].save(); + } + } +} \ No newline at end of file diff --git a/src/subgraph-availability-manager.ts b/src/subgraph-availability-manager.ts index 5f3bc83..f5aac42 100644 --- a/src/subgraph-availability-manager.ts +++ b/src/subgraph-availability-manager.ts @@ -1,87 +1,64 @@ +import { BigInt, log } from "@graphprotocol/graph-ts" + import { - NewOwnership as NewOwnershipEvent, - NewPendingOwnership as NewPendingOwnershipEvent, OracleSet as OracleSetEvent, OracleVote as OracleVoteEvent, - VoteTimeLimitSet as VoteTimeLimitSetEvent } from "../generated/SubgraphAvailabilityManager/SubgraphAvailabilityManager" -import { - NewOwnership, - NewPendingOwnership, - OracleSet, - OracleVote, - VoteTimeLimitSet -} from "../generated/schema" - -export function handleNewOwnership(event: NewOwnershipEvent): void { - let entity = new NewOwnership( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ) - entity.from = event.params.from - entity.to = event.params.to - - entity.blockNumber = event.block.number - entity.blockTimestamp = event.block.timestamp - entity.transactionHash = event.transaction.hash - - entity.save() -} - -export function handleNewPendingOwnership( - event: NewPendingOwnershipEvent -): void { - let entity = new NewPendingOwnership( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ) - entity.from = event.params.from - entity.to = event.params.to - - entity.blockNumber = event.block.number - entity.blockTimestamp = event.block.timestamp - entity.transactionHash = event.transaction.hash - - entity.save() -} +import { Oracle } from "../generated/schema" +import { StoreCache } from "./store-cache"; +import { getOracleVoteId } from "./helpers"; export function handleOracleSet(event: OracleSetEvent): void { - let entity = new OracleSet( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ) - entity.index = event.params.index - entity.oracle = event.params.oracle + let oracleIndex = event.params.index.toString(); + let oracleAddress = event.params.oracle; + + let cache = new StoreCache(); + let state = cache.getGlobalState(); + let oracle = cache.getOracle(oracleAddress); + oracle.state = state.id; + oracle.index = oracleIndex; + oracle.latestConfig = ""; + oracle.active = true + oracle.activeSince = event.block.timestamp; + oracle.activeUntil = BigInt.fromI32(0); - entity.blockNumber = event.block.number - entity.blockTimestamp = event.block.timestamp - entity.transactionHash = event.transaction.hash - - entity.save() + replaceActiveOracle(oracle, cache); + cache.commitChanges(); } export function handleOracleVote(event: OracleVoteEvent): void { - let entity = new OracleVote( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ) - entity.subgraphDeploymentID = event.params.subgraphDeploymentID - entity.deny = event.params.deny - entity.oracleIndex = event.params.oracleIndex - entity.timestamp = event.params.timestamp - - entity.blockNumber = event.block.number - entity.blockTimestamp = event.block.timestamp - entity.transactionHash = event.transaction.hash + let subgraphDeploymentID = event.params.subgraphDeploymentID.toHexString(); + let oracleAddress = event.transaction.from.toHexString(); + let timestamp = event.params.timestamp.toString(); + let voteId = getOracleVoteId(subgraphDeploymentID, oracleAddress, timestamp); + + let cache = new StoreCache(); + let oracle = cache.getOracle(event.transaction.from); + let oracleVote = cache.getOracleVote(voteId); + oracleVote.subgraphDeploymentID = event.params.subgraphDeploymentID + oracleVote.deny = event.params.deny + oracleVote.oracle = oracle.id + oracleVote.timestamp = event.params.timestamp - entity.save() + cache.commitChanges(); } -export function handleVoteTimeLimitSet(event: VoteTimeLimitSetEvent): void { - let entity = new VoteTimeLimitSet( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ) - entity.voteTimeLimit = event.params.voteTimeLimit +function replaceActiveOracle(newOracle: Oracle, cache: StoreCache): void { + let state = cache.getGlobalState(); + let activeOracles = cache.getGlobalState().activeOracles; - entity.blockNumber = event.block.number - entity.blockTimestamp = event.block.timestamp - entity.transactionHash = event.transaction.hash + for (let i = 0; i < activeOracles.length; i++) { + let currectActiveOracle = cache.getOracle(activeOracles[i]); + // Replacement is done by oracle_index + if (currectActiveOracle.index == newOracle.index) { + activeOracles[i] = newOracle.id; + state.activeOracles = activeOracles; + currectActiveOracle.active = false; + currectActiveOracle.activeUntil = newOracle.activeSince; + return; + } + } - entity.save() -} + activeOracles.push(newOracle.id); + state.activeOracles = activeOracles; +} \ No newline at end of file diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 36c5e8a..48565da 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -4,11 +4,11 @@ schema: dataSources: - kind: ethereum name: SubgraphAvailabilityManager - network: sepolia + network: arbitrum-sepolia source: - address: "0x0539C6995aC74eBCBa449D88fD947eeD2877bE34" abi: SubgraphAvailabilityManager - startBlock: 5109718 + address: "0x9bDC3264596850E7F5d141A8D898dFA7001355CC" + startBlock: 22552633 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -23,14 +23,28 @@ dataSources: - name: SubgraphAvailabilityManager file: ./abis/SubgraphAvailabilityManager.json eventHandlers: - - event: NewOwnership(indexed address,indexed address) - handler: handleNewOwnership - - event: NewPendingOwnership(indexed address,indexed address) - handler: handleNewPendingOwnership - event: OracleSet(indexed uint256,indexed address) handler: handleOracleSet - event: OracleVote(indexed bytes32,bool,indexed uint256,uint256) handler: handleOracleVote - - event: VoteTimeLimitSet(uint256) - handler: handleVoteTimeLimitSet - file: ./src/subgraph-availability-manager.ts \ No newline at end of file + file: ./src/subgraph-availability-manager.ts + - kind: ethereum + name: SAODataEdge + network: arbitrum-sepolia + source: + address: "0xB61AF143c79Cbdd68f179B657AaC86665CC2B469" + abi: SAODataEdge + startBlock: 25463619 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - Log + abis: + - name: SAODataEdge + file: ./abis/SAODataEdge.json + eventHandlers: + - event: Log(bytes) + handler: handleLog + file: ./src/sao-data-edge.ts diff --git a/tests/sao-data-edge.test.ts b/tests/sao-data-edge.test.ts new file mode 100644 index 0000000..30f8067 --- /dev/null +++ b/tests/sao-data-edge.test.ts @@ -0,0 +1,59 @@ +import { + assert, + describe, + test, + clearStore, + beforeAll, + afterAll +} from "matchstick-as/assembly/index" +import { newMockEvent } from "matchstick-as" +import { Bytes, Address, BigInt } from "@graphprotocol/graph-ts" +import { processPayload } from "../src/sao-data-edge" +import { handleOracleSet } from "../src/subgraph-availability-manager" +import { createOracleSetEvent } from "./subgraph-availability-manager-utils" + +const oracleID = "0x0000000000000000000000000000000000000001" +const oracleAddress = Address.fromString(oracleID) +const txHash1 = "0x00"; +const txHash2 = "0x01"; + +describe("Describe entity assertions", () => { + beforeAll(() => { + let newOracleSetEvent = createOracleSetEvent(BigInt.fromI32(0), oracleAddress) + handleOracleSet(newOracleSetEvent) + assert.entityCount("Oracle", 1); + }) + + afterAll(() => { + clearStore() + }) + + test("Wrong Submitter", () => { + // Payload has ORACLE_INDEX = 1 + let payloadBytes = Bytes.fromHexString( + "b64198f600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000676302e302e3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000001340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053130303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000331303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003333030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c657468657265756d2c657468657265756d2f636f6e74726163742c66696c652f697066732c73756273747265616d732c66696c652f6172776561766500000000000000000000000000000000000000000000000000000000000000000000002e516d5357787664385361514b36715a4b4a37787466784343476f527a476e6f6932574e7a6d4a59594a5739425859000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d514547445462337865796b43584c6457783770505833716565474d5576486d4757503453704d6b7635514a660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010434f4e54524143545f414444524553530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000" + ) as Bytes; + + let event = newMockEvent() + processPayload(oracleAddress, payloadBytes, txHash1, event.block); + + assert.entityCount("OracleConfiguration", 0) + }) + + test("Valid Submitter", () => { + // Payload has ORACLE_INDEX = 0 + let payloadBytes = Bytes.fromHexString( + "b64198f600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000676302e302e3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000001340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053130303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000331303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003333030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c657468657265756d2c657468657265756d2f636f6e74726163742c66696c652f697066732c73756273747265616d732c66696c652f6172776561766500000000000000000000000000000000000000000000000000000000000000000000002e516d5357787664385361514b36715a4b4a37787466784343476f527a476e6f6932574e7a6d4a59594a5739425859000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d514547445462337865796b43584c6457783770505833716565474d5576486d4757503453704d6b7635514a660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010434f4e54524143545f414444524553530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000" + ) as Bytes; + + let event = newMockEvent() + processPayload(oracleAddress, payloadBytes, txHash2, event.block); + + assert.entityCount("OracleConfiguration", 1); + assert.fieldEquals("OracleConfiguration", txHash2, "version", "v0.0.1") + assert.fieldEquals("OracleConfiguration", txHash2, "minSignal", "100") + assert.fieldEquals("OracleConfiguration", txHash2, "period", "300") + assert.fieldEquals("OracleConfiguration", txHash2, "networkSubgraphDeploymentId", "QmSWxvd8SaQK6qZKJ7xtfxCCGoRzGnoi2WNzmJYYJW9BXY") + assert.fieldEquals("OracleConfiguration", txHash2, "epochBlockOracleSubgraphDeploymentId", "QmQEGDTb3xeykCXLdWx7pPX3qeeGMUvHmGWP4SpMkv5QJf") + }) +}) diff --git a/tests/subgraph-availability-manager-utils.ts b/tests/subgraph-availability-manager-utils.ts index 06d2b7b..5700cae 100644 --- a/tests/subgraph-availability-manager-utils.ts +++ b/tests/subgraph-availability-manager-utils.ts @@ -1,49 +1,10 @@ import { newMockEvent } from "matchstick-as" import { ethereum, Address, BigInt, Bytes } from "@graphprotocol/graph-ts" import { - NewOwnership, - NewPendingOwnership, OracleSet, - OracleVote, - VoteTimeLimitSet + OracleVote } from "../generated/SubgraphAvailabilityManager/SubgraphAvailabilityManager" -export function createNewOwnershipEvent( - from: Address, - to: Address -): NewOwnership { - let newOwnershipEvent = changetype(newMockEvent()) - - newOwnershipEvent.parameters = new Array() - - newOwnershipEvent.parameters.push( - new ethereum.EventParam("from", ethereum.Value.fromAddress(from)) - ) - newOwnershipEvent.parameters.push( - new ethereum.EventParam("to", ethereum.Value.fromAddress(to)) - ) - - return newOwnershipEvent -} - -export function createNewPendingOwnershipEvent( - from: Address, - to: Address -): NewPendingOwnership { - let newPendingOwnershipEvent = changetype(newMockEvent()) - - newPendingOwnershipEvent.parameters = new Array() - - newPendingOwnershipEvent.parameters.push( - new ethereum.EventParam("from", ethereum.Value.fromAddress(from)) - ) - newPendingOwnershipEvent.parameters.push( - new ethereum.EventParam("to", ethereum.Value.fromAddress(to)) - ) - - return newPendingOwnershipEvent -} - export function createOracleSetEvent( index: BigInt, oracle: Address @@ -63,12 +24,15 @@ export function createOracleSetEvent( } export function createOracleVoteEvent( + oracleAddress: Address, subgraphDeploymentID: Bytes, deny: boolean, oracleIndex: BigInt, timestamp: BigInt ): OracleVote { - let oracleVoteEvent = changetype(newMockEvent()) + let event = newMockEvent() + event.transaction.from = oracleAddress + let oracleVoteEvent = changetype(event) oracleVoteEvent.parameters = new Array() @@ -96,20 +60,3 @@ export function createOracleVoteEvent( return oracleVoteEvent } - -export function createVoteTimeLimitSetEvent( - voteTimeLimit: BigInt -): VoteTimeLimitSet { - let voteTimeLimitSetEvent = changetype(newMockEvent()) - - voteTimeLimitSetEvent.parameters = new Array() - - voteTimeLimitSetEvent.parameters.push( - new ethereum.EventParam( - "voteTimeLimit", - ethereum.Value.fromUnsignedBigInt(voteTimeLimit) - ) - ) - - return voteTimeLimitSetEvent -} diff --git a/tests/subgraph-availability-manager.test.ts b/tests/subgraph-availability-manager.test.ts index 20fd16e..7716893 100644 --- a/tests/subgraph-availability-manager.test.ts +++ b/tests/subgraph-availability-manager.test.ts @@ -3,95 +3,73 @@ import { describe, test, clearStore, - beforeAll, - afterAll + afterEach } from "matchstick-as/assembly/index" -import { Address, BigInt } from "@graphprotocol/graph-ts" -import { handleNewOwnership, handleNewPendingOwnership, handleOracleSet, handleOracleVote, handleVoteTimeLimitSet } from "../src/subgraph-availability-manager" -import { createNewOwnershipEvent, createNewPendingOwnershipEvent, createOracleSetEvent, createOracleVoteEvent, createVoteTimeLimitSetEvent } from "./subgraph-availability-manager-utils" +import { Address, BigInt, log } from "@graphprotocol/graph-ts" +import { handleOracleSet, handleOracleVote } from "../src/subgraph-availability-manager" +import { createOracleSetEvent, createOracleVoteEvent } from "./subgraph-availability-manager-utils" +import { getOracleVoteId } from "../src/helpers" +import { Oracle, GlobalState } from "../generated/schema" -import { logStore } from 'matchstick-as/assembly/store' - -// Tests structure (matchstick-as >=0.5.0) -// https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0 - -const defaultID = "0xa16081f360e3847006db660bae1c6d1b2e17ec2a01000000" -const samID = "0x0000000000000000000000000000000000000001" -const samAddress = Address.fromString(samID) -const governorID = "0x0000000000000000000000000000000000000002" -const governorAddress = Address.fromString(governorID) -const pendingGovernorID = "0x0000000000000000000000000000000000000003" -const pendingGovernorAddress = Address.fromString(pendingGovernorID) const oracleID = "0x0000000000000000000000000000000000000004" const oracleAddress = Address.fromString(oracleID) +const newOracleID = "0x0000000000000000000000000000000000000006" +const newOracleAddress = Address.fromString(newOracleID) const subgraphDeploymentID = "0x0000000000000000000000000000000000000005" const subgraphDeploymentAddress = Address.fromString(subgraphDeploymentID) -describe("OWNERSHIP", () => { - afterAll(() => { +describe("ORACLE", () => { + afterEach(() => { clearStore() }) - test("NewPendingOwnership created and stored", () => { - let newPendingOwnershipEvent = createNewPendingOwnershipEvent(governorAddress, pendingGovernorAddress) - handleNewPendingOwnership(newPendingOwnershipEvent) + test("OracleSet created and stored", () => { + let newOracleSetEvent = createOracleSetEvent(BigInt.fromI32(0), oracleAddress) + handleOracleSet(newOracleSetEvent) - assert.entityCount("NewPendingOwnership", 1) - assert.fieldEquals("NewPendingOwnership", defaultID, "from", governorID) - assert.fieldEquals("NewPendingOwnership", defaultID, "to", pendingGovernorID) + assert.entityCount("Oracle", 1) + assert.fieldEquals("Oracle", oracleID, "index", "0") }) - test("NewOwnership created and stored", () => { - let newNewOwnershipEvent = createNewOwnershipEvent(governorAddress, pendingGovernorAddress) - handleNewOwnership(newNewOwnershipEvent) + test("Replace oracle", () => { + let newOracleSetEvent = createOracleSetEvent(BigInt.fromI32(0), oracleAddress) + handleOracleSet(newOracleSetEvent) - assert.entityCount("NewOwnership", 1) - assert.fieldEquals("NewOwnership", defaultID, "from", governorID) - assert.fieldEquals("NewOwnership", defaultID, "to", pendingGovernorID) - }) -}) + // Replace oracle + let newOracleSetEvent2 = createOracleSetEvent(BigInt.fromI32(0), newOracleAddress) + handleOracleSet(newOracleSetEvent2) -describe("ORACLE", () => { - afterAll(() => { - clearStore() + assert.entityCount("Oracle", 2) + let oldOracle = Oracle.load(oracleAddress)! + let newOracle = Oracle.load(newOracleAddress)! + assert.booleanEquals(oldOracle.active, false) + assert.booleanEquals(newOracle.active, true) + + let state = GlobalState.load("0")! + let activeOracles = state.activeOracles + assert.i32Equals(activeOracles.length, 1) }) - test("OracleSet created and stored", () => { + test("OracleVote created and stored", () => { let newOracleSetEvent = createOracleSetEvent(BigInt.fromI32(0), oracleAddress) handleOracleSet(newOracleSetEvent) - assert.entityCount("OracleSet", 1) - assert.fieldEquals("OracleSet", defaultID, "index", "0") - assert.fieldEquals("OracleSet", defaultID, "oracle", oracleID) - }) + assert.entityCount("Oracle", 1) - test("OracleVote created and stored", () => { let newOracleVoteEvent = createOracleVoteEvent( + oracleAddress, subgraphDeploymentAddress, true, BigInt.fromI32(0), BigInt.fromI32(300) ) handleOracleVote(newOracleVoteEvent) - + + let oracleVoteID = getOracleVoteId(subgraphDeploymentID, oracleID, "300"); assert.entityCount("OracleVote", 1) - assert.fieldEquals("OracleVote", defaultID, "subgraphDeploymentID", subgraphDeploymentID) - assert.fieldEquals("OracleVote", defaultID, "deny", "true") - assert.fieldEquals("OracleVote", defaultID, "oracleIndex", "0") - assert.fieldEquals("OracleVote", defaultID, "timestamp", "300") - }) -}) - -describe("VOTE_TIME_LIMIT", () => { - afterAll(() => { - clearStore() - }) - - test("VoteTimeLimit created and stored", () => { - let newVoteTimeLimitEvent = createVoteTimeLimitSetEvent(BigInt.fromI32(300)) - handleVoteTimeLimitSet(newVoteTimeLimitEvent) - - assert.entityCount("VoteTimeLimitSet", 1) - assert.fieldEquals("VoteTimeLimitSet", defaultID, "voteTimeLimit", "300") + assert.fieldEquals("OracleVote", oracleVoteID, "subgraphDeploymentID", subgraphDeploymentID) + assert.fieldEquals("OracleVote", oracleVoteID, "deny", "true") + assert.fieldEquals("OracleVote", oracleVoteID, "oracle", oracleID) + assert.fieldEquals("OracleVote", oracleVoteID, "timestamp", "300") }) }) diff --git a/yarn.lock b/yarn.lock index 9568e01..5348d2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -218,10 +218,10 @@ graphql-import-node "^0.0.5" js-yaml "^4.1.0" -"@graphprotocol/graph-cli@0.61.0": - version "0.61.0" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.61.0.tgz#62b28e599c4a082f561d37594e34de66c4946e70" - integrity sha512-gc3+DioZ/K40sQCt6DsNvbqfPTc9ZysuSz3I9MJ++bD6SftaSSweWwfpPysDMzDuxvUAhLAsJ6QjBACPngT2Kw== +"@graphprotocol/graph-cli@0.71.0": + version "0.71.0" + resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.71.0.tgz#1ae67f0423793189406eacfb07c80f74cba37e6e" + integrity sha512-ITcSBHuXPuaoRs7FzNtqD0tCOIy4JGsM3j4IQNA2yZgXgr/TmmHG7KTB/c3B5Zlnsr9foXrU71T6ixGmwJ4PKw== dependencies: "@float-capital/float-subgraph-uncrashable" "^0.0.0-alpha.4" "@oclif/core" "2.8.6" @@ -237,14 +237,13 @@ dockerode "2.5.8" fs-extra "9.1.0" glob "9.3.5" - gluegun "5.1.2" + gluegun "5.1.6" graphql "15.5.0" immutable "4.2.1" ipfs-http-client "55.0.0" jayson "4.0.0" js-yaml "3.14.1" - prettier "1.19.1" - request "2.88.2" + prettier "3.0.3" semver "7.4.0" sync-request "6.1.0" tmp-promise "3.0.3" @@ -678,16 +677,6 @@ acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -789,13 +778,6 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - asn1js@^3.0.1, asn1js@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" @@ -822,11 +804,6 @@ assemblyscript@0.19.23, assemblyscript@^0.19.20: long "^5.2.0" source-map-support "^0.5.20" -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -847,16 +824,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - axios@^0.21.1, axios@^0.21.4: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -881,13 +848,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1210,7 +1170,7 @@ colors@1.4.0, colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1237,11 +1197,6 @@ concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1295,13 +1250,6 @@ cross-spawn@7.0.3, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1389,20 +1337,12 @@ dockerode@2.5.8: docker-modem "^1.0.8" tar-fs "~1.16.3" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ejs@3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" - integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== +ejs@3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== dependencies: - jake "^10.6.1" + jake "^10.8.5" ejs@^3.1.8: version "3.1.9" @@ -1571,21 +1511,6 @@ execa@5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -1596,11 +1521,6 @@ fast-decode-uri-component@^1.0.1: resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - fast-fifo@^1.0.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" @@ -1617,11 +1537,6 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - fast-levenshtein@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz#37b899ae47e1090e40e3fd2318e4d5f0142ca912" @@ -1674,11 +1589,6 @@ follow-redirects@^1.14.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -1688,15 +1598,6 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -1772,13 +1673,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1820,10 +1714,10 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gluegun@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-5.1.2.tgz#ffa0beda0fb6bbc089a867157b08602beae2c8cf" - integrity sha512-Cwx/8S8Z4YQg07a6AFsaGnnnmd8mN17414NcPS3OoDtZRwxgsvwRNJNg69niD6fDa8oNwslCG0xH7rEpRNNE/g== +gluegun@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-5.1.6.tgz#74ec13193913dc610f5c1a4039972c70c96a7bad" + integrity sha512-9zbi4EQWIVvSOftJWquWzr9gLX2kaDgPkNR5dYWbM53eVvCI3iKuxLlnKoHC0v4uPoq+Kr/+F569tjoFbA4DSA== dependencies: apisauce "^2.1.5" app-module-path "^2.2.0" @@ -1831,7 +1725,7 @@ gluegun@5.1.2: colors "1.4.0" cosmiconfig "7.0.1" cross-spawn "7.0.3" - ejs "3.1.6" + ejs "3.1.8" enquirer "2.3.6" execa "5.1.1" fs-jetpack "4.3.1" @@ -1883,19 +1777,6 @@ graphql@^16.6.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -1973,15 +1854,6 @@ http-response-object@^3.0.1: dependencies: "@types/node" "^10.0.3" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -2220,11 +2092,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -2257,11 +2124,6 @@ isomorphic-ws@^4.0.1: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - it-all@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" @@ -2307,7 +2169,7 @@ it-to-stream@^1.0.0: p-fifo "^1.0.0" readable-stream "^3.6.0" -jake@^10.6.1, jake@^10.8.5: +jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== @@ -2360,27 +2222,12 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -2399,16 +2246,6 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - keccak@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" @@ -2580,7 +2417,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -2766,11 +2603,6 @@ number-to-bn@1.7.0: bn.js "4.11.6" strip-hex-prefix "1.0.0" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2895,11 +2727,6 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -2910,10 +2737,10 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -prettier@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== process-nextick-args@~2.0.0: version "2.0.1" @@ -2946,11 +2773,6 @@ protobufjs@^6.10.2: "@types/node" ">=13.7.0" long "^4.0.0" -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" @@ -2964,11 +2786,6 @@ punycode@^1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - pvtsutils@^1.3.2, pvtsutils@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" @@ -2988,11 +2805,6 @@ qs@^6.4.0: dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3065,32 +2877,6 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -request@2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3160,7 +2946,7 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -3287,21 +3073,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" - integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - 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" @@ -3505,14 +3276,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -3542,18 +3305,6 @@ tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -3581,13 +3332,6 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - urlpattern-polyfill@^8.0.0: version "8.0.2" resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" @@ -3603,11 +3347,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -3623,15 +3362,6 @@ varint@^6.0.0: resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - wabt@1.0.24: version "1.0.24" resolved "https://registry.yarnpkg.com/wabt/-/wabt-1.0.24.tgz#c02e0b5b4503b94feaf4a30a426ef01c1bea7c6c"