diff --git a/README.md b/README.md index c4b01ee5..df4a3c0d 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,10 @@ yarn build * [graph-node](./packages/graph-node/README.md) +## Demos + +* [IPLD statediff and checkpointing](./ipld-demo.md) + ## Services The default config files used by the watchers assume the following services are setup and running on localhost: diff --git a/ipld-demo.md b/ipld-demo.md new file mode 100644 index 00000000..ff585192 --- /dev/null +++ b/ipld-demo.md @@ -0,0 +1,209 @@ +# Demo for IPLD statediff and checkpointing + +* In the root of `graph-watcher-ts`, run: + + ```bash + yarn && yarn build + ``` + +* In console, run the IPFS daemon: + + ```bash + # Verify ipfs version + ipfs version + # ipfs version 0.12.2 + + ipfs daemon + ``` + +* The following services should be running to work with watcher: + + * [vulcanize/go-ethereum](https://github.com/vulcanize/go-ethereum) ([v1.10.17-statediff-3.2.0](https://github.com/vulcanize/go-ethereum/releases/tag/v1.10.17-statediff-3.2.0)) on port 8545. + * [vulcanize/ipld-eth-server](https://github.com/vulcanize/ipld-eth-server) ([v3.0.0](https://github.com/vulcanize/ipld-eth-server/releases/tag/v3.0.0)) with native GQL API enabled on port 8082 and RPC API enabled on port 8081. + * [postgraphile](https://github.com/vulcanize/postgraphile) ([v1.1.1](https://github.com/vulcanize/postgraphile/releases/tag/v1.1.1)) on the `vulcanize/ipld-eth-server` database, on port 5000 + +* Deploy `Example` contract: + + ```bash + cd packages/graph-node + + yarn example:deploy + ``` + +* Set the returned address to the variable `$EXAMPLE_ADDRESS`: + + ```bash + EXAMPLE_ADDRESS= + ``` + +* In `packages/graph-node`, run: + + ```bash + cp .env.example .env + ``` + + * In `.env` file, set `EXAMPLE_CONTRACT_ADDRESS` to the `EXAMPLE_ADDRESS`. + + * In [packages/graph-node/test/subgraph/example1/subgraph.yaml](./packages/graph-node/test/subgraph/example1/subgraph.yaml), set the source address for `Example1` datasource to the `EXAMPLE_ADDRESS`. + + ```bash + yarn build:example + ``` + +* In `packages/codegen`, create a `config.yaml` file with the following contents: + + ```yaml + contracts: + - name: Example + path: ../graph-node/test/contracts/Example.sol + kind: Example1 + + outputFolder: ../demo-example-watcher + mode: all + kind: active + port: 3008 + flatten: true + subgraphPath: ../graph-node/test/subgraph/example1/build + ``` + + Reference: [packages/codegen/README.md](./packages/codegen/README.md#run) + +* Generate watcher: + + ```bash + cd packages/codegen + + yarn codegen --config-file ./config.yaml + ``` + +* In `packages/demo-example-watcher`, run: + + ```bash + yarn + ``` + +* Create dbs: + + ```bash + sudo su - postgres + # Delete databases if they already exist. + dropdb demo-example-watcher + dropdb demo-example-watcher-job-queue + + # Create databases + createdb demo-example-watcher + createdb demo-example-watcher-job-queue + ``` + + Enable the `pgcrypto` extension. + ``` + psql -U postgres -h localhost demo-example-watcher-job-queue + + demo-example-watcher-job-queue=# CREATE EXTENSION pgcrypto; + demo-example-watcher-job-queue=# exit + ``` + +* In a new terminal, in `packages/demo-example-watcher`, run: + + ```bash + yarn server + ``` + + ```bash + yarn job-runner + ``` + +* Run the following GQL subscription at the [graphql endpoint](http://127.0.0.1:3008/graphql): + + ```graphql + subscription { + onEvent { + event { + __typename + ... on TestEvent { + param1 + param2 + param3 + }, + }, + block { + number + hash + } + } + } + ``` + +* Trigger the `Test` event by calling example contract method: + + ```bash + cd packages/graph-node + + yarn example:test --address $EXAMPLE_ADDRESS + ``` + + A `Test` event shall be visible in the subscription at endpoint. + +* Run the `getState` query at the endpoint to get the latest `IPLDBlock` for `EXAMPLE_ADDRESS`: + + ```graphql + query { + getState ( + blockHash: "EVENT_BLOCK_HASH" + contractAddress: "EXAMPLE_ADDRESS" + kind: "diff_staged" + ) { + cid + block { + cid + hash + number + timestamp + parentHash + } + contractAddress + data + } + } + ``` + +* Run the query for entity at the endpoint: + + ```graphql + query { + author ( + block: { + hash: "EVENT_BLOCK_HASH" + } + id: "0xdc7d7a8920c8eecc098da5b7522a5f31509b5bfc" + ) { + __typename + name + paramInt + paramBigInt + paramBytes + } + } + ``` + +* `diff` IPLDBlocks get created corresponding to the `diff_staged` blocks when their respective `eth_block`s reach the pruned region. + +* In `packages/demo-example-watcher`: + + * After the `diff` block has been created, create a `checkpoint`: + + ```bash + cd packages/demo-example-watcher + + yarn checkpoint --address $EXAMPLE_ADDRESS + ``` + + * A `checkpoint` IPLDBlock should be created at the latest canonical block hash. + + * Run the `getState` query again at the endpoint with the output `blockHash` and kind `checkpoint`. + +* All the `IPLDBlock` entries can be seen in `pg-admin` in table `ipld_block`. + +* All the `diff` and `checkpoint` IPLDBlocks should be pushed to `IPFS`. + +* Open IPFS WebUI http://127.0.0.1:5001/webui and search for `IPLDBlock`s using their `CID`s. diff --git a/packages/graph-node/hardhat.config.ts b/packages/graph-node/hardhat.config.ts index f4c99e35..23eb916d 100644 --- a/packages/graph-node/hardhat.config.ts +++ b/packages/graph-node/hardhat.config.ts @@ -5,6 +5,7 @@ import '@nomiclabs/hardhat-waffle'; import './test/tasks/example-deploy'; +import './test/tasks/example-test'; // You need to export an object to set up your config // Go to https://hardhat.org/config/ to learn more diff --git a/packages/graph-node/package.json b/packages/graph-node/package.json index baf52107..1ca08349 100644 --- a/packages/graph-node/package.json +++ b/packages/graph-node/package.json @@ -42,7 +42,8 @@ "build:example": "cd test/subgraph/example1 && yarn && yarn codegen && yarn build", "watch": "DEBUG=vulcanize:* nodemon --watch src src/watcher.ts", "compare-entity": "node bin/compare-entity", - "example:deploy": "hardhat --network localhost example-deploy" + "example:deploy": "hardhat --network localhost example-deploy", + "example:test": "hardhat --network localhost example-test" }, "dependencies": { "@apollo/client": "^3.3.19", diff --git a/packages/graph-node/test/tasks/example-test.ts b/packages/graph-node/test/tasks/example-test.ts new file mode 100644 index 00000000..1e7eca49 --- /dev/null +++ b/packages/graph-node/test/tasks/example-test.ts @@ -0,0 +1,31 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { task, types } from 'hardhat/config'; +import '@nomiclabs/hardhat-ethers'; +import { ContractTransaction } from 'ethers'; + +task('example-test', 'Trigger Test event') + .addParam('address', 'Contract address', undefined, types.string) + .setAction(async (args, hre) => { + const { address } = args; + await hre.run('compile'); + const Example = await hre.ethers.getContractFactory('Example'); + const example = Example.attach(address); + + const transaction: ContractTransaction = await example.emitEvent(); + + const receipt = await transaction.wait(); + + if (receipt.events) { + const TestEvent = receipt.events.find(el => el.event === 'Test'); + + if (TestEvent && TestEvent.args) { + console.log('Test Event'); + console.log('param1:', TestEvent.args.param1.toString()); + console.log('param2:', TestEvent.args.param2.toString()); + console.log('param3:', TestEvent.args.param3.toString()); + } + } + }); diff --git a/packages/graph-test-watcher/package.json b/packages/graph-test-watcher/package.json index e3c90472..e46cda59 100644 --- a/packages/graph-test-watcher/package.json +++ b/packages/graph-test-watcher/package.json @@ -32,25 +32,24 @@ "@ethersproject/providers": "5.3.0", "@ipld/dag-cbor": "^6.0.12", "@vulcanize/cache": "^0.1.0", + "@vulcanize/graph-node": "^0.1.0", "@vulcanize/ipld-eth-client": "^0.1.0", "@vulcanize/solidity-mapper": "^0.1.0", "@vulcanize/util": "^0.1.0", - "@vulcanize/graph-node": "^0.1.0", "apollo-server-express": "^2.25.0", "apollo-type-bigint": "^0.1.3", "debug": "^4.3.1", + "decimal.js": "^10.3.1", "ethers": "^5.2.0", "express": "^4.17.1", "graphql": "^15.5.0", "graphql-import-node": "^0.0.4", - "ipfs-http-client": "^53.0.1", "json-bigint": "^1.0.0", "lodash": "^4.17.21", "multiformats": "^9.4.8", "reflect-metadata": "^0.1.13", "typeorm": "^0.2.32", - "yargs": "^17.0.1", - "decimal.js": "^10.3.1" + "yargs": "^17.0.1" }, "devDependencies": { "@ethersproject/abi": "^5.3.0", diff --git a/packages/util/package.json b/packages/util/package.json index 280be585..524ba4f7 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -12,7 +12,8 @@ "lodash": "^4.17.21", "multiformats": "^9.4.8", "pg-boss": "^6.1.0", - "toml": "^3.0.0" + "toml": "^3.0.0", + "ipfs-http-client": "^56.0.3" }, "devDependencies": { "@types/fs-extra": "^9.0.11", diff --git a/packages/util/src/ipfs.ts b/packages/util/src/ipfs.ts index 3c92443d..cb41b188 100644 --- a/packages/util/src/ipfs.ts +++ b/packages/util/src/ipfs.ts @@ -12,6 +12,6 @@ export class IPFSClient { } async push (data: any): Promise { - await this._client.dag.put(data, { format: 'dag-cbor', hashAlg: 'sha2-256' }); + await this._client.dag.put(data, { storeCodec: 'dag-cbor', hashAlg: 'sha2-256' }); } } diff --git a/yarn.lock b/yarn.lock index ace5b60c..a5d5b197 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1116,7 +1116,7 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== -"@ipld/dag-cbor@^6.0.12", "@ipld/dag-cbor@^6.0.5": +"@ipld/dag-cbor@^6.0.12": version "6.0.13" resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-6.0.13.tgz#b68265a3fbb808f2ea3fa247a107399dbc71d5a7" integrity sha512-tqh1VLjiHi6+i0gDEnoBrQcRvgnUwQV413uTyFnXQMOjJs8px95/TBVMBpQBkhQoeCL4oQlPAr4qIrelKEkQHw== @@ -1124,6 +1124,30 @@ cborg "^1.2.1" multiformats "^9.0.0" +"@ipld/dag-cbor@^6.0.3": + version "6.0.15" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz#aebe7a26c391cae98c32faedb681b1519e3d2372" + integrity sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + +"@ipld/dag-cbor@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-7.0.1.tgz#d46c6bbb9afa55c74a85d0117b4ab389ceb9083b" + integrity sha512-XqG8VEzHjQDC/Qcy5Gyf1kvAav5VuAugc6c7VtdaRLI+3d8lJrUP3F76GYJNNXuEnRZ58cCBnNNglkIGTdg1+A== + dependencies: + cborg "^1.6.0" + multiformats "^9.5.4" + +"@ipld/dag-json@^8.0.1": + version "8.0.9" + resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-8.0.9.tgz#c41641ddbd3799abd0c683015c56a37f3f6d1edc" + integrity sha512-NNKHmgHxc2zOEaB8qOUpAb2UK1vcEE/rBeh018Da/RzXE7N8GwiTJLRZ3Fe/G4fsiis67G0sagRz/YNQcANRsQ== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + "@ipld/dag-pb@^2.1.3": version "2.1.13" resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-2.1.13.tgz#174779914cf2bffca9e5be96e5b7f06821402333" @@ -3178,13 +3202,10 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= -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" +any-signal@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6" + integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg== anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" @@ -4678,6 +4699,11 @@ cborg@^1.2.1: resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.5.3.tgz#94cd037a50cde007397ca872259457d2f8dd0846" integrity sha512-iUweYinQpR48eXxcmEoZlixY2eo+vDCGc5utNwXV0oYhmowHU/2DwcSiJ4xU1l7niwXOR91pcE3zEgZl4VoFAQ== +cborg@^1.5.4, cborg@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.9.1.tgz#9ea2f7b1745048e7db51e78d54e8a9a0e4f64a11" + integrity sha512-6xKRdJ89ncwEXJGx9rFMRBNp72UqgYSGt2a88rqsvCLda4OuhRlh3xD2nu+ufrw6h9l94K0cnvyD4WEGpKtRtw== + chai-spies@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chai-spies/-/chai-spies-1.0.0.tgz#d16b39336fb316d03abf8c375feb23c0c8bb163d" @@ -5422,6 +5448,14 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +dag-jose@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dag-jose/-/dag-jose-1.0.0.tgz#52e42d70cb5bee31ae4e8e3ab860615568d7ad73" + integrity sha512-U0b/YsIPBp6YZNTFrVjwLZAlY3qGRxZTIEcM/CcQmrVrCWq9MWQq9pheXVSPLIhF4SNwzp2SikPva4/BIrJY+g== + dependencies: + "@ipld/dag-cbor" "^6.0.3" + multiformats "^9.0.2" + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -8457,28 +8491,30 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipfs-core-types@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.8.2.tgz#6923dd1a5fda9ea26d7b03e83f96a16a9e8cfc24" - integrity sha512-qgKn+hHAdRRyP4eX7ygmNSPucI75KUMxtoxgYaJGPcew4rdvCA1VCD/Rc0W+dHlRbTRM4CYIE10VS3qjpXSgDQ== +ipfs-core-types@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.10.3.tgz#89ebe98199d4d829f2b20104bfa3299f808c80fe" + integrity sha512-GNid2lRBjR5qgScCglgk7w9Hk3TZAwPHQXxOLQx72wgyc0jF2U5NXRoKW0GRvX8NPbHmsrFszForIqxd23I1Gw== dependencies: + "@ipld/dag-pb" "^2.1.3" interface-datastore "^6.0.2" + ipfs-unixfs "^6.0.3" multiaddr "^10.0.0" - multiformats "^9.4.1" + multiformats "^9.5.1" -ipfs-core-utils@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.11.1.tgz#4ac2143f2d89917f0823c9b8104e5ed489383ecb" - integrity sha512-SYBTeESuLgjYeDh8meCgttHV/LlES8FbljIDCySp+DpgPxYJA4EyC4GhywBaneQc/X3GWvHEzvW5b7ADluFcAw== +ipfs-core-utils@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.14.3.tgz#d04c631c472507bdefc58d4e8d1d9109efbb411c" + integrity sha512-aBkewVhgAj3NWXPwu6imj0wADGiGVZmJzqKzODOJsibDjkx6FGdMv8kvvqtLnK8LS/dvSk9yk32IDtuDyYoV7Q== dependencies: - any-signal "^2.1.2" + any-signal "^3.0.0" blob-to-it "^1.0.1" browser-readablestream-to-it "^1.0.1" debug "^4.1.1" err-code "^3.0.1" - ipfs-core-types "^0.8.1" + ipfs-core-types "^0.10.3" ipfs-unixfs "^6.0.3" - ipfs-utils "^9.0.2" + ipfs-utils "^9.0.6" it-all "^1.0.4" it-map "^1.0.4" it-peekable "^1.0.2" @@ -8486,32 +8522,32 @@ ipfs-core-utils@^0.11.1: merge-options "^3.0.4" multiaddr "^10.0.0" multiaddr-to-uri "^8.0.0" - multiformats "^9.4.1" + multiformats "^9.5.1" nanoid "^3.1.23" parse-duration "^1.0.0" - timeout-abort-controller "^1.1.1" + timeout-abort-controller "^3.0.0" uint8arrays "^3.0.0" -ipfs-http-client@^53.0.1: - version "53.0.1" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-53.0.1.tgz#1ae5afce607c87cec285429c7de665e341a3ec7d" - integrity sha512-0hmm5esSxoArEtVE9jeLwLw3pJm6rJA1kWKW+3Nqs2O8TQVSot8u1nzopF/yJ2IJGd5PHJc2JxqtEdVzV+p7nQ== +ipfs-http-client@^56.0.3: + version "56.0.3" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-56.0.3.tgz#45bbea55347ef13524769d5919cbed84d9d022d6" + integrity sha512-E3L5ylVl6BjyRUsNehvfuRBYp1hj8vQ8in4zskVPMNzXs6JiCFUbif5a6BtcAlSK4xPQyJCeLNNAWLUeFQTLNA== dependencies: - "@ipld/dag-cbor" "^6.0.5" + "@ipld/dag-cbor" "^7.0.0" + "@ipld/dag-json" "^8.0.1" "@ipld/dag-pb" "^2.1.3" - abort-controller "^3.0.0" - any-signal "^2.1.2" + any-signal "^3.0.0" + dag-jose "^1.0.0" debug "^4.1.1" err-code "^3.0.1" - ipfs-core-types "^0.8.1" - ipfs-core-utils "^0.11.1" - ipfs-utils "^9.0.2" + ipfs-core-types "^0.10.3" + ipfs-core-utils "^0.14.3" + ipfs-utils "^9.0.6" it-first "^1.0.6" it-last "^1.0.4" merge-options "^3.0.4" multiaddr "^10.0.0" - multiformats "^9.4.1" - native-abort-controller "^1.0.3" + multiformats "^9.5.1" parse-duration "^1.0.0" stream-to-it "^0.2.2" uint8arrays "^3.0.0" @@ -8524,13 +8560,12 @@ ipfs-unixfs@^6.0.3: err-code "^3.0.1" protobufjs "^6.10.2" -ipfs-utils@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.2.tgz#7e816a863753c5af1187464839a6b46aa8764e5b" - integrity sha512-o0DjVfd1kcr09fAYMkSnZ56ZkfoAzZhFWkizG3/tL7svukZpqyGyRxNlF58F+hsrn/oL8ouAP9x+4Hdf8XM+hg== +ipfs-utils@^9.0.6: + version "9.0.6" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.6.tgz#b7657b8be101e0bb64402aeb631c64168075a5e4" + integrity sha512-/WfdwOIiJVb3uqfKRQ9Eo+vCEKsDgp7h4Pdc37MRwAiFciZ7xKAkEqsfXubV0VQi8x5jWTifeHn8WEPBLL451w== dependencies: - abort-controller "^3.0.0" - any-signal "^2.1.0" + any-signal "^3.0.0" buffer "^6.0.1" electron-fetch "^1.7.2" err-code "^3.0.1" @@ -8540,7 +8575,6 @@ ipfs-utils@^9.0.2: 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 "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz" react-native-fetch-api "^2.0.0" @@ -10523,11 +10557,16 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" -multiformats@^9.0.0, multiformats@^9.4.1, multiformats@^9.4.2, multiformats@^9.4.5, multiformats@^9.4.8: +multiformats@^9.0.0, multiformats@^9.4.2, multiformats@^9.4.5, multiformats@^9.4.8: version "9.4.10" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.4.10.tgz#d654d06b28cc066506e4e59b246d65267fb6b93b" integrity sha512-BwWGvgqB/5J/cnWaOA0sXzJ+UGl+kyFAw3Sw1L6TN4oad34C9OpW+GCpYTYPDp4pUaXDC1EjvB3yv9Iodo1EhA== +multiformats@^9.0.2, multiformats@^9.5.1, multiformats@^9.5.4: + version "9.6.4" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.6.4.tgz#5dce1f11a407dbb69aa612cb7e5076069bb759ca" + integrity sha512-fCCB6XMrr6CqJiHNjfFNGT0v//dxOBMrOMqUIzpPc/mmITweLEyhvMpY9bF+jZ9z3vaMAau5E8B68DW77QMXkg== + multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" @@ -10618,11 +10657,6 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -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" @@ -12609,10 +12643,10 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -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== +retimer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df" + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== retry@0.12.0, retry@^0.12.0: version "0.12.0" @@ -13722,13 +13756,12 @@ 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 sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -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== +timeout-abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595" + integrity sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA== dependencies: - abort-controller "^3.0.0" - retimer "^2.0.0" + retimer "^3.0.0" tmp@0.0.33, tmp@^0.0.33: version "0.0.33"