From c2738ead8dfbcb90ef88b5ad3448977ee75fd879 Mon Sep 17 00:00:00 2001 From: Travis Vachon Date: Thu, 10 Aug 2023 16:06:40 -0700 Subject: [PATCH] fix!: remove deprecated space and voucher capabilities these have not been used in a few months now, so let's get rid of them --- packages/access-client/src/agent.js | 90 +----------- packages/access-client/test/helpers/utils.js | 7 - packages/capabilities/src/index.js | 6 - packages/capabilities/src/space.js | 27 +--- packages/capabilities/src/types.ts | 14 +- packages/capabilities/src/voucher.js | 114 ---------------- .../test/capabilities/voucher.test.js | 129 ------------------ packages/upload-api/src/access/delegate.js | 2 +- packages/upload-api/src/store/add.js | 2 +- packages/upload-api/src/types.ts | 11 +- packages/upload-api/src/types/rate-limits.ts | 6 +- packages/upload-api/src/upload/add.js | 2 +- pnpm-lock.yaml | 116 +++++++++++----- 13 files changed, 96 insertions(+), 430 deletions(-) delete mode 100644 packages/capabilities/src/voucher.js delete mode 100644 packages/capabilities/test/capabilities/voucher.test.js diff --git a/packages/access-client/src/agent.js b/packages/access-client/src/agent.js index e8ee3c15e..1f7c85c4e 100644 --- a/packages/access-client/src/agent.js +++ b/packages/access-client/src/agent.js @@ -6,10 +6,8 @@ import * as Ucanto from '@ucanto/interface' import * as CAR from '@ucanto/transport/car' import * as HTTP from '@ucanto/transport/http' import * as ucanto from '@ucanto/core' -import { URI } from '@ucanto/validator' import { Peer } from './awake/peer.js' import * as Space from '@web3-storage/capabilities/space' -import * as Voucher from '@web3-storage/capabilities/voucher' import * as Access from '@web3-storage/capabilities/access' import { Signer } from '@ucanto/principal/ed25519' @@ -22,10 +20,7 @@ import { canDelegateCapability, } from './delegations.js' import { AgentData, getSessionProofs } from './agent-data.js' -import { - addProviderAndDelegateToAccount, - waitForDelegationOnSocket, -} from './agent-use-cases.js' +import { addProviderAndDelegateToAccount } from './agent-use-cases.js' export { AgentData } export * from './agent-use-cases.js' @@ -394,88 +389,7 @@ export class Agent { * @param {Ucanto.DID<'web'>} [opts.provider] - provider to register - defaults to this.connection.id */ async registerSpace(email, opts = {}) { - // if the client passes `provider` use the new space registration flow - if (opts.provider) { - return await addProviderAndDelegateToAccount( - this, - this.#data, - email, - opts - ) - } - - const space = opts.space ?? this.currentSpace() - const service = this.connection.id - const spaceMeta = space ? this.#data.spaces.get(space) : undefined - - if (!space || !spaceMeta) { - throw new Error('No space selected') - } - - if (spaceMeta && spaceMeta.isRegistered) { - throw new Error('Space already registered with web3.storage.') - } - - const inv = await this.invokeAndExecute(Voucher.claim, { - nb: { - identity: URI.from(`mailto:${email}`), - product: 'product:free', - service: service.did(), - }, - }) - - if (inv && inv.out.error) { - throw new Error('Voucher claim failed', { cause: inv }) - } - - const voucherRedeem = - /** @type {Ucanto.Delegation<[import('./types').VoucherRedeem]>} */ ( - await this.#waitForDelegation(opts) - ) - await this.addProof(voucherRedeem) - const delegationToService = await this.delegate({ - abilities: ['*'], - audience: service, - expiration: Infinity, - audienceMeta: { - name: 'w3access', - type: 'service', - }, - }) - - const accInv = await this.invokeAndExecute(Voucher.redeem, { - with: URI.from(service.did()), - nb: { - space, - identity: voucherRedeem.capabilities[0].nb.identity, - product: voucherRedeem.capabilities[0].nb.product, - }, - proofs: [delegationToService], - facts: [ - { - space: spaceMeta, - agent: this.meta, - }, - ], - }) - - if (accInv && accInv.out.error) { - throw new Error('Space registration failed', { cause: accInv }) - } - - spaceMeta.isRegistered = true - - this.#data.addSpace(space, spaceMeta) - this.#data.removeDelegation(voucherRedeem.cid) - } - - /** - * - * @param {object} [opts] - * @param {AbortSignal} [opts.signal] - */ - async #waitForDelegation(opts) { - return waitForDelegationOnSocket(this, opts) + return await addProviderAndDelegateToAccount(this, this.#data, email, opts) } /** diff --git a/packages/access-client/test/helpers/utils.js b/packages/access-client/test/helpers/utils.js index 963a5be7d..a2cd14e67 100644 --- a/packages/access-client/test/helpers/utils.js +++ b/packages/access-client/test/helpers/utils.js @@ -53,13 +53,6 @@ export function createServer(handlers = {}) { }, } }), - recover: Server.provide(Space.recover, async ({ capability }) => { - return { - ok: { - recover: true, - }, - } - }), }, ...handlers, }, diff --git a/packages/capabilities/src/index.js b/packages/capabilities/src/index.js index 0751706cb..a52bc9286 100644 --- a/packages/capabilities/src/index.js +++ b/packages/capabilities/src/index.js @@ -3,7 +3,6 @@ import * as Space from './space.js' import * as Top from './top.js' import * as Store from './store.js' import * as Upload from './upload.js' -import * as Voucher from './voucher.js' import * as Access from './access.js' import * as Utils from './utils.js' import * as Consumer from './consumer.js' @@ -20,7 +19,6 @@ export { Top, Store, Upload, - Voucher, Consumer, Customer, Console, @@ -36,8 +34,6 @@ export const abilitiesAsStrings = [ Provider.add.can, Space.space.can, Space.info.can, - Space.recover.can, - Space.recoverValidation.can, Upload.upload.can, Upload.add.can, Upload.remove.can, @@ -46,8 +42,6 @@ export const abilitiesAsStrings = [ Store.add.can, Store.remove.can, Store.list.can, - Voucher.claim.can, - Voucher.redeem.can, Access.access.can, Access.authorize.can, Access.session.can, diff --git a/packages/capabilities/src/space.js b/packages/capabilities/src/space.js index 39a263413..66c86a200 100644 --- a/packages/capabilities/src/space.js +++ b/packages/capabilities/src/space.js @@ -10,8 +10,8 @@ */ import * as Store from './store.js' -import { capability, URI, Schema, ok, fail } from '@ucanto/validator' -import { canDelegateURI, equalWith, and } from './utils.js' +import { capability, Schema, ok, fail } from '@ucanto/validator' +import { equalWith } from './utils.js' import * as Upload from './upload.js' export { top } from './top.js' @@ -45,29 +45,6 @@ export const info = Store.add derives: equalWith, }) -export const recoverValidation = capability({ - can: 'space/recover-validation', - with: SpaceDID, - nb: Schema.struct({ - identity: URI.match({ protocol: 'mailto:' }), - }), -}) - -export const recover = capability({ - can: 'space/recover', - with: Schema.did(), - nb: Schema.struct({ - identity: URI.match({ protocol: 'mailto:' }), - }), - derives: (child, parent) => { - return ( - and(equalWith(child, parent)) || - and(canDelegateURI(child.nb.identity, parent.nb.identity)) || - ok({}) - ) - }, -}) - export const allocate = capability({ can: 'space/allocate', with: SpaceDID, diff --git a/packages/capabilities/src/types.ts b/packages/capabilities/src/types.ts index 606a593a6..8aae61ef0 100644 --- a/packages/capabilities/src/types.ts +++ b/packages/capabilities/src/types.ts @@ -3,12 +3,11 @@ import * as Ucanto from '@ucanto/interface' import type { Schema } from '@ucanto/core' import { InferInvokedCapability, Unit, DID, DIDKey } from '@ucanto/interface' import type { PieceLink } from '@web3-storage/data-segment' -import { space, info, recover, recoverValidation } from './space.js' +import { space, info } from './space.js' import * as provider from './provider.js' import { top } from './top.js' import { add, list, remove, store } from './store.js' import * as UploadCaps from './upload.js' -import { claim, redeem } from './voucher.js' import * as AccessCaps from './access.js' import * as CustomerCaps from './customer.js' import * as ConsumerCaps from './consumer.js' @@ -154,10 +153,6 @@ export type RateLimitListFailure = Ucanto.Failure // Space export type Space = InferInvokedCapability export type SpaceInfo = InferInvokedCapability -export type SpaceRecoverValidation = InferInvokedCapability< - typeof recoverValidation -> -export type SpaceRecover = InferInvokedCapability // filecoin export type FILECOIN_PROCESSING_STATUS = 'pending' | 'done' @@ -205,9 +200,6 @@ export interface ChainTrackerInfoFailure extends Ucanto.Failure { // TODO } -// Voucher Protocol -export type VoucherRedeem = InferInvokedCapability -export type VoucherClaim = InferInvokedCapability // Upload export type Upload = InferInvokedCapability export type UploadAdd = InferInvokedCapability @@ -239,8 +231,6 @@ export type AbilitiesArray = [ ProviderAdd['can'], Space['can'], SpaceInfo['can'], - SpaceRecover['can'], - SpaceRecoverValidation['can'], Upload['can'], UploadAdd['can'], UploadRemove['can'], @@ -249,8 +239,6 @@ export type AbilitiesArray = [ StoreAdd['can'], StoreRemove['can'], StoreList['can'], - VoucherClaim['can'], - VoucherRedeem['can'], Access['can'], AccessAuthorize['can'], AccessSession['can'], diff --git a/packages/capabilities/src/voucher.js b/packages/capabilities/src/voucher.js deleted file mode 100644 index c0776e3c9..000000000 --- a/packages/capabilities/src/voucher.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Voucher Capabilities - * - * These can be imported directly with: - * ```js - * import * as Account from '@web3-storage/capabilities/voucher' - * ``` - * - * @module - */ -import { capability, URI, DID, Schema, ok } from '@ucanto/validator' -import { equalWith, and, equal } from './utils.js' -export { top } from './top.js' - -export const SpaceDID = DID.match({ method: 'key' }) - -/** - * Products are identified by the CID of the DAG that describes them. - */ -export const Product = URI.uri() - -/** - * Verifiable identity to whom voucher is issued. Currently it is a `mailto:` - * URL. - */ -export const Identity = URI.match({ protocol: 'mailto:' }) - -/** - * Services are identified using a decentralized identifier. - */ -export const Service = DID.match({}) - -/** - * Capability can only be delegated (but not invoked) allowing audience to - * derived any `voucher/` prefixed capability for the (memory) space identified - * by did:key in the `with` field. - * - * Currently DID in the `with` field will always be web3.storage DID since we - * do not support other types of vouchers yet. - */ -export const voucher = capability({ - can: 'voucher/*', - with: URI.match({ protocol: 'did:' }), - derives: equalWith, -}) - -/** - * Capability can be invoked by an agent to claim a voucher for a specific - * user identifier (currently email address). - * - * The agent MAY issue claim with own DID or a DID it is delegate of. If `with` - * is different from `iss`, it is implied that the voucher is claimed for the - * DID in the `with` field. If `with` is same as `iss` it is implies that - * voucher is claimed for an unspecified `did`. - */ -export const claim = capability({ - can: 'voucher/claim', - with: URI.match({ protocol: 'did:' }), - nb: Schema.struct({ - /** - * URI of the product agent is requesting a voucher of. - */ - product: Product, - /** - * Verifiable identity on who's behalf behalf claim is made. - */ - identity: Identity, - /** - * Optional service DID who's voucher is been requested. - */ - service: Service.optional(), - }), - derives: (child, parent) => { - return ( - and(equalWith(child, parent)) || - and(equal(child.nb.product, parent.nb.product, 'product')) || - and(equal(child.nb.identity, parent.nb.identity, 'identity')) || - and(equal(child.nb.service, parent.nb.service, 'service')) || - ok({}) - ) - }, -}) - -export const redeem = capability({ - can: 'voucher/redeem', - with: URI.match({ protocol: 'did:' }), - nb: Schema.struct({ - /** - * Link of the product voucher is for. Must be the same as `nb.product` - * of `voucher/claim` that requested this. - */ - product: Product, - /** - * Verifiable identity to whom voucher is issued. It is a `mailto:` URL - * where this delegation is typically sent. - */ - identity: Identity, - /** - * Space identifier where voucher can be redeemed. When service delegates - * `voucher/redeem` to the user agent it may omit this field to allow - * agent to choose space. - */ - space: URI.match({ protocol: 'did:' }), - }), - derives: (child, parent) => { - return ( - and(equalWith(child, parent)) || - and(equal(child.nb.product, parent.nb.product, 'product')) || - and(equal(child.nb.identity, parent.nb.identity, 'identity')) || - and(equal(child.nb.space, parent.nb.space, 'account')) || - ok({}) - ) - }, -}) diff --git a/packages/capabilities/test/capabilities/voucher.test.js b/packages/capabilities/test/capabilities/voucher.test.js deleted file mode 100644 index 680f48335..000000000 --- a/packages/capabilities/test/capabilities/voucher.test.js +++ /dev/null @@ -1,129 +0,0 @@ -import assert from 'assert' -import { access } from '@ucanto/validator' -import { Verifier } from '@ucanto/principal/ed25519' -import { delegate } from '@ucanto/core' -import * as Voucher from '../../src/voucher.js' -import { alice, bob, service, mallory } from '../helpers/fixtures.js' - -describe('voucher capabilities', function () { - it('should delegate from * to claim', async function () { - const account = mallory - const claim = Voucher.claim.invoke({ - issuer: alice, - audience: service, - with: account.did(), - nb: { - identity: 'mailto:alice@email.com', - product: 'product:free', - service: service.did(), - }, - proofs: [ - await delegate({ - issuer: account, - audience: alice, - capabilities: [ - { - can: 'voucher/*', - with: account.did(), - }, - ], - }), - ], - }) - - const result = await access(await claim.delegate(), { - capability: Voucher.claim, - principal: Verifier, - authority: service, - }) - if (!result.error) { - assert.deepEqual(result.ok.audience.did(), service.did()) - assert.equal(result.ok.capability.can, 'voucher/claim') - assert.deepEqual(result.ok.capability.nb, { - identity: 'mailto:alice@email.com', - product: 'product:free', - service: service.did(), - }) - } - }) - - it('should delegate from claim to claim', async function () { - const claim = Voucher.claim.invoke({ - issuer: bob, - audience: service, - with: alice.did(), - nb: { - identity: 'mailto:alice@email.com', - product: 'product:free', - service: service.did(), - }, - proofs: [ - await Voucher.claim.delegate({ - issuer: alice, - audience: bob, - with: alice.did(), - nb: { - identity: 'mailto:alice@email.com', - product: 'product:free', - service: service.did(), - }, - }), - ], - }) - - const result = await access(await claim.delegate(), { - capability: Voucher.claim, - principal: Verifier, - authority: service, - }) - - if (result.error) { - assert.fail('should not error') - } else { - assert.deepEqual(result.ok.audience.did(), service.did()) - assert.equal(result.ok.capability.can, 'voucher/claim') - assert.deepEqual(result.ok.capability.nb, { - identity: 'mailto:alice@email.com', - product: 'product:free', - service: service.did(), - }) - } - }) - - it('should error claim to claim when caveats are different', async function () { - const claim = Voucher.claim.invoke({ - issuer: bob, - audience: service, - with: alice.did(), - nb: { - identity: 'mailto:alice@email.com', - product: 'product:freess', - service: service.did(), - }, - proofs: [ - await Voucher.claim.delegate({ - issuer: alice, - audience: bob, - with: alice.did(), - nb: { - identity: 'mailto:alice@email.com', - product: 'product:free', - service: service.did(), - }, - }), - ], - }) - - const result = await access(await claim.delegate(), { - capability: Voucher.claim, - principal: Verifier, - authority: service, - }) - - if (result.error) { - assert.ok(result.error.message.includes('- Can not derive')) - } else { - assert.fail('should error') - } - }) -}) diff --git a/packages/upload-api/src/access/delegate.js b/packages/upload-api/src/access/delegate.js index ba283faf4..85c6d30d0 100644 --- a/packages/upload-api/src/access/delegate.js +++ b/packages/upload-api/src/access/delegate.js @@ -23,7 +23,7 @@ export const delegate = async ({ capability, invocation }, context) => { const result = await Allocator.allocate( { capability: { - with: capability.with + with: capability.with, }, }, context diff --git a/packages/upload-api/src/store/add.js b/packages/upload-api/src/store/add.js index c909b2015..7f1003352 100644 --- a/packages/upload-api/src/store/add.js +++ b/packages/upload-api/src/store/add.js @@ -19,7 +19,7 @@ export function storeAddProvider(context) { allocate( { capability: { - with: space + with: space, }, }, context diff --git a/packages/upload-api/src/types.ts b/packages/upload-api/src/types.ts index 2139dc144..a81ac953e 100644 --- a/packages/upload-api/src/types.ts +++ b/packages/upload-api/src/types.ts @@ -184,11 +184,12 @@ export type StoreServiceContext = SpaceServiceContext & { carStoreBucket: CarStoreBucket } -export type UploadServiceContext = ConsumerServiceContext & SpaceServiceContext & { - signer: EdSigner.Signer - uploadTable: UploadTable - dudewhereBucket: DudewhereBucket -} +export type UploadServiceContext = ConsumerServiceContext & + SpaceServiceContext & { + signer: EdSigner.Signer + uploadTable: UploadTable + dudewhereBucket: DudewhereBucket + } export interface AccessClaimContext { delegationsStorage: Delegations diff --git a/packages/upload-api/src/types/rate-limits.ts b/packages/upload-api/src/types/rate-limits.ts index 7624a2507..315243916 100644 --- a/packages/upload-api/src/types/rate-limits.ts +++ b/packages/upload-api/src/types/rate-limits.ts @@ -1,10 +1,10 @@ import * as Ucanto from '@ucanto/interface' -// An opaque identifier used to identify rate limits. We use this instead of +// An opaque identifier used to identify rate limits. We use this instead of // deriving it from, eg, {rate, subject} because we'd like to allow implementors // to support more than one identical rate limit - an example of where this might -// be useful is a fraud prevention department flagging and blocking an account -// because they detected phishing sites being uploaded and, separately, a billing +// be useful is a fraud prevention department flagging and blocking an account +// because they detected phishing sites being uploaded and, separately, a billing // department blocking an account for non-payment. In this case the removal of one // "block" should not result in both "blocks" being lifted. export type RateLimitID = string diff --git a/packages/upload-api/src/upload/add.js b/packages/upload-api/src/upload/add.js index b780790a7..16d7622ca 100644 --- a/packages/upload-api/src/upload/add.js +++ b/packages/upload-api/src/upload/add.js @@ -19,7 +19,7 @@ export function uploadAddProvider(context) { const allocated = await allocate( { capability: { - with: space + with: space, }, }, context diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5bcc68d6..e428d8a9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -2156,7 +2156,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 prop-types: 15.8.1 dev: true @@ -2312,7 +2312,7 @@ packages: resolution: {integrity: sha512-HoFTUqUJL9cPGhC9qRmHCvamfIsj1JllQSQ/Xu9/KN/VNJp8To9Ms4qiZPEMOwcrNFclfYqrahjGYbf4KL/d9A==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - '@ipld/dag-cbor': 9.0.0 + '@ipld/dag-cbor': 9.0.4 cborg: 1.10.2 multiformats: 11.0.2 varint: 6.0.0 @@ -2323,6 +2323,14 @@ packages: dependencies: cborg: 1.10.2 multiformats: 11.0.2 + dev: false + + /@ipld/dag-cbor@9.0.4: + resolution: {integrity: sha512-HBNVngk/47pKNLTAelN6ORWgKkjJtQj96Xb+jIBtRShJGCsXgghj1TzTynTTIp1dZxwPe5rVIL6yjZmvdyP2Wg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 2.0.3 + multiformats: 12.0.1 /@ipld/dag-json@10.1.3: resolution: {integrity: sha512-c0PJE+cDnsYfyuWMdTTwkzMvxjthEwWD+0u6ApQfXrs+GTcxeYh+Hefd0xE9L4fb2Trr1DGA1a/iia4PAS3Mpg==} @@ -2340,7 +2348,7 @@ packages: /@ipld/dag-ucan@3.3.2: resolution: {integrity: sha512-EhuOrAfnudsVYIbzEIgi3itHAEo3WZNOt1VNPsYhxKBhOzDMeoTXh6/IHc7ZKBW1T2vDQHdgj4m1r64z6MssGA==} dependencies: - '@ipld/dag-cbor': 9.0.0 + '@ipld/dag-cbor': 9.0.4 '@ipld/dag-json': 10.1.3 multiformats: 11.0.2 @@ -2376,7 +2384,7 @@ packages: '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 18.17.4 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -2786,26 +2794,26 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/connect-history-api-fallback@1.5.0: resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} dependencies: '@types/express-serve-static-core': 4.17.35 - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/eslint-scope@3.7.4: @@ -2829,7 +2837,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -2861,7 +2869,7 @@ packages: /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/inquirer@9.0.3: @@ -2898,7 +2906,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/mdast@3.0.12: @@ -2925,6 +2933,10 @@ packages: /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + dev: true + + /@types/node@18.17.4: + resolution: {integrity: sha512-ATL4WLgr7/W40+Sp1WnNTSKbgVn6Pvhc/2RHAdt8fl6NsQyp4oPCi2eKcGOvA494bwf1K/W6nGgZ9TwDqvpjdw==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2949,8 +2961,8 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/react@18.2.19: - resolution: {integrity: sha512-e2S8wmY1ePfM517PqCG80CcE48Xs5k0pwJzuDZsfE8IZRRBfOMCF+XqnFxu6mWtyivum1MQm4aco+WIt6Coimw==} + /@types/react@18.2.20: + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -2960,7 +2972,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/retry@0.12.0: @@ -2983,7 +2995,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/serve-index@1.9.1: @@ -2997,7 +3009,7 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/sinon@10.0.13: @@ -3013,7 +3025,7 @@ packages: /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/through@0.0.30: @@ -3041,7 +3053,7 @@ packages: /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 dev: true /@types/yargs-parser@21.0.0: @@ -3208,7 +3220,7 @@ packages: resolution: {integrity: sha512-Ne45bH0uUhAexNkJWj8tYsvKut58LaL3rsu30vxVh+ybkj47nD02mY8KqW+vCHY80E1ubPcjlHuCt0+efR9bgw==} dependencies: '@ipld/car': 5.1.1 - '@ipld/dag-cbor': 9.0.0 + '@ipld/dag-cbor': 9.0.4 '@ipld/dag-ucan': 3.3.2 '@ucanto/interface': 8.0.0 multiformats: 11.0.2 @@ -3246,7 +3258,7 @@ packages: resolution: {integrity: sha512-S+cGKUVu074TT1FaoOyZa3mKf3CuEBLHLlE3TU1UoIC5Yp9WnvX+cDOGKIyfJ/HgHHBvAEDxYNOkNZbCATsRdA==} dependencies: '@ipld/car': 5.1.1 - '@ipld/dag-cbor': 9.0.0 + '@ipld/dag-cbor': 9.0.4 '@ucanto/core': 8.0.0 '@ucanto/interface': 8.0.0 multiformats: 11.0.2 @@ -4010,7 +4022,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001519 - electron-to-chromium: 1.4.488 + electron-to-chromium: 1.4.490 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: true @@ -4938,7 +4950,7 @@ packages: readdirp: 3.6.0 require-package-name: 2.0.1 resolve: 1.22.4 - sass: 1.64.2 + sass: 1.65.1 scss-parser: 1.0.6 semver: 7.5.4 yargs: 16.2.0 @@ -5131,8 +5143,8 @@ packages: encoding: 0.1.13 dev: false - /electron-to-chromium@1.4.488: - resolution: {integrity: sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ==} + /electron-to-chromium@1.4.490: + resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} dev: true /emoji-regex@8.0.0: @@ -6038,7 +6050,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 require-like: 0.1.2 dev: true @@ -6636,7 +6648,7 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: sparse-array: 1.3.2 - uint8arrays: 4.0.3 + uint8arrays: 4.0.6 dev: true /handle-thing@2.0.1: @@ -6790,7 +6802,7 @@ packages: eslint-plugin-react: 7.33.1(eslint@8.46.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.46.0) eslint-plugin-unicorn: 45.0.2(eslint@8.46.0) - lint-staged: 13.2.0 + lint-staged: 13.2.3 prettier: 2.8.3 simple-git-hooks: 2.9.0 typescript: 4.9.5 @@ -6820,7 +6832,7 @@ packages: eslint-plugin-react: 7.33.1(eslint@8.46.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.46.0) eslint-plugin-unicorn: 46.0.1(eslint@8.46.0) - lint-staged: 13.2.0 + lint-staged: 13.2.3 prettier: 2.8.8 simple-git-hooks: 2.9.0 typescript: 4.9.5 @@ -7166,7 +7178,7 @@ packages: resolution: {integrity: sha512-ZOBZzTlTctLfvzMTVNz4EGnY4Bj4C8SqgbkarVN0Q0A5XEAgT4Rx4lTb9HlfJxvk44TTOz4RmvBTzcZWhaGs4g==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - '@ipld/dag-cbor': 9.0.0 + '@ipld/dag-cbor': 9.0.4 '@ipld/dag-pb': 4.0.5 '@multiformats/murmur3': 2.1.6 err-code: 3.0.1 @@ -7180,7 +7192,7 @@ packages: it-pushable: 3.2.1 multiformats: 11.0.2 p-queue: 7.3.0 - uint8arrays: 4.0.3 + uint8arrays: 4.0.6 dev: true /ipfs-unixfs@9.0.1: @@ -7690,7 +7702,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 18.11.18 + '@types/node': 18.17.4 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -7701,7 +7713,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -7710,7 +7722,7 @@ packages: resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.17.4 jest-util: 29.6.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7926,6 +7938,29 @@ packages: - supports-color dev: true + /lint-staged@13.2.3: + resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + chalk: 5.2.0 + cli-truncate: 3.1.0 + commander: 10.0.1 + debug: 4.3.4(supports-color@8.1.1) + execa: 7.2.0 + lilconfig: 2.1.0 + listr2: 5.0.8 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + /listr2@5.0.8: resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} engines: {node: ^14.13.1 || >=16.0.0} @@ -9581,7 +9616,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.11.18 + '@types/node': 18.17.4 long: 5.2.3 /proxy-addr@2.0.7: @@ -10189,8 +10224,8 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sass@1.64.2: - resolution: {integrity: sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg==} + /sass@1.65.1: + resolution: {integrity: sha512-9DINwtHmA41SEd36eVPQ9BJKpn7eKDQmUHmpI0y5Zv2Rcorrh0zS+cFrt050hdNbmmCNKTW3hV5mWfuegNRsEA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -11246,6 +11281,13 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: multiformats: 11.0.2 + dev: false + + /uint8arrays@4.0.6: + resolution: {integrity: sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw==} + dependencies: + multiformats: 12.0.1 + dev: true /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}