From 488644789e05894c4ee1771d704c109f73f0c65c Mon Sep 17 00:00:00 2001 From: alexghr Date: Fri, 27 Feb 2026 11:50:16 +0000 Subject: [PATCH 1/7] fix: logging of class instances (#20807) Fix logging eth addresses image --- .../foundation/src/log/bigint-utils.ts | 3 ++ .../foundation/src/log/pino-logger.test.ts | 29 +++++++++++++++++++ .../slasher/src/tally_slasher_client.ts | 6 +--- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/yarn-project/foundation/src/log/bigint-utils.ts b/yarn-project/foundation/src/log/bigint-utils.ts index 6cc94101ac2f..c9083ec1bfd0 100644 --- a/yarn-project/foundation/src/log/bigint-utils.ts +++ b/yarn-project/foundation/src/log/bigint-utils.ts @@ -11,6 +11,9 @@ export function convertBigintsToStrings(obj: unknown): unknown { } if (obj !== null && typeof obj === 'object') { + if (typeof (obj as any).toJSON === 'function') { + return convertBigintsToStrings((obj as any).toJSON()); + } const result: Record = {}; for (const key in obj) { result[key] = convertBigintsToStrings((obj as Record)[key]); diff --git a/yarn-project/foundation/src/log/pino-logger.test.ts b/yarn-project/foundation/src/log/pino-logger.test.ts index 9881535d4f58..22afc9e6a293 100644 --- a/yarn-project/foundation/src/log/pino-logger.test.ts +++ b/yarn-project/foundation/src/log/pino-logger.test.ts @@ -273,6 +273,35 @@ describe('pino-logger', () => { }); }); + it('serializes objects with toJSON() instead of dumping raw properties', () => { + const testLogger = createLogger('tojson-test'); + capturingStream.clear(); + + // Simulate an EthAddress-like object with an internal buffer and a toJSON method + const addressLike = { + buffer: Buffer.from('1234567890abcdef1234567890abcdef12345678', 'hex'), + toJSON() { + return '0x1234567890abcdef1234567890abcdef12345678'; + }, + }; + + testLogger.info('address logging test', { + validator: addressLike, + nested: { addr: addressLike }, + array: [addressLike], + plainString: 'hello', + }); + + const entries = capturingStream.getJsonLines(); + expect(entries).toHaveLength(1); + expect(entries[0]).toMatchObject({ + validator: '0x1234567890abcdef1234567890abcdef12345678', + nested: { addr: '0x1234567890abcdef1234567890abcdef12345678' }, + array: ['0x1234567890abcdef1234567890abcdef12345678'], + plainString: 'hello', + }); + }); + it('returns bindings via getBindings', () => { const testLogger = createLogger('bindings-test', { actor: 'main', instanceId: 'id-123' }); const bindings = testLogger.getBindings(); diff --git a/yarn-project/slasher/src/tally_slasher_client.ts b/yarn-project/slasher/src/tally_slasher_client.ts index 70ef6fdfeeb6..d95d565746a8 100644 --- a/yarn-project/slasher/src/tally_slasher_client.ts +++ b/yarn-project/slasher/src/tally_slasher_client.ts @@ -349,15 +349,11 @@ export class TallySlasherClient implements ProposerSlashActionProvider, SlasherC return undefined; } - const offensesToSlashLog = offensesToSlash.map(offense => ({ - ...offense, - amount: offense.amount.toString(), - })); this.log.info(`Voting to slash ${offensesToSlash.length} offenses`, { slotNumber, currentRound, slashedRound, - offensesToSlash: offensesToSlashLog, + offensesToSlash, }); const committees = await this.collectCommitteesActiveDuringRound(slashedRound); From 68c2cb183e3fdb2fda6f99ee5592ba260422a978 Mon Sep 17 00:00:00 2001 From: alexghr Date: Fri, 27 Feb 2026 12:14:02 +0000 Subject: [PATCH 2/7] chore: deps (#20910) --- yarn-project/aztec.js/package.json | 2 +- yarn-project/prover-client/package.json | 1 - yarn-project/stdlib/package.json | 2 +- yarn-project/yarn.lock | 1570 +++++++++++------------ 4 files changed, 782 insertions(+), 793 deletions(-) diff --git a/yarn-project/aztec.js/package.json b/yarn-project/aztec.js/package.json index 96f53c190ef5..ec59ec3baae6 100644 --- a/yarn-project/aztec.js/package.json +++ b/yarn-project/aztec.js/package.json @@ -101,7 +101,7 @@ "@aztec/l1-artifacts": "workspace:^", "@aztec/protocol-contracts": "workspace:^", "@aztec/stdlib": "workspace:^", - "axios": "^1.12.0", + "axios": "^1.13.5", "tslib": "^2.4.0", "viem": "npm:@aztec/viem@2.38.2", "zod": "^3.23.8" diff --git a/yarn-project/prover-client/package.json b/yarn-project/prover-client/package.json index 7f1691fbbaaf..1d65685a9af9 100644 --- a/yarn-project/prover-client/package.json +++ b/yarn-project/prover-client/package.json @@ -81,7 +81,6 @@ "@aztec/stdlib": "workspace:^", "@aztec/telemetry-client": "workspace:^", "@aztec/world-state": "workspace:^", - "@google-cloud/storage": "^7.15.0", "@iarna/toml": "^2.2.5", "commander": "^12.1.0", "lodash.chunk": "^4.2.0", diff --git a/yarn-project/stdlib/package.json b/yarn-project/stdlib/package.json index 9189844ec9aa..a16cb6461664 100644 --- a/yarn-project/stdlib/package.json +++ b/yarn-project/stdlib/package.json @@ -99,7 +99,7 @@ "@aztec/noir-noirc_abi": "portal:../../noir/packages/noirc_abi", "@aztec/validator-ha-signer": "workspace:^", "@google-cloud/storage": "^7.15.0", - "axios": "^1.12.0", + "axios": "^1.13.5", "json-stringify-deterministic": "1.0.12", "lodash.chunk": "^4.2.0", "lodash.isequal": "^4.5.0", diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 75b235c07906..cb1b1d09ce4d 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -143,574 +143,551 @@ __metadata: linkType: hard "@aws-sdk/client-s3@npm:^3.892.0": - version: 3.892.0 - resolution: "@aws-sdk/client-s3@npm:3.892.0" + version: 3.998.0 + resolution: "@aws-sdk/client-s3@npm:3.998.0" dependencies: "@aws-crypto/sha1-browser": "npm:5.2.0" "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/credential-provider-node": "npm:3.891.0" - "@aws-sdk/middleware-bucket-endpoint": "npm:3.890.0" - "@aws-sdk/middleware-expect-continue": "npm:3.891.0" - "@aws-sdk/middleware-flexible-checksums": "npm:3.892.0" - "@aws-sdk/middleware-host-header": "npm:3.891.0" - "@aws-sdk/middleware-location-constraint": "npm:3.891.0" - "@aws-sdk/middleware-logger": "npm:3.891.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.891.0" - "@aws-sdk/middleware-sdk-s3": "npm:3.891.0" - "@aws-sdk/middleware-ssec": "npm:3.891.0" - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/region-config-resolver": "npm:3.890.0" - "@aws-sdk/signature-v4-multi-region": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@aws-sdk/util-user-agent-browser": "npm:3.887.0" - "@aws-sdk/util-user-agent-node": "npm:3.891.0" - "@aws-sdk/xml-builder": "npm:3.887.0" - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/core": "npm:^3.11.0" - "@smithy/eventstream-serde-browser": "npm:^4.1.1" - "@smithy/eventstream-serde-config-resolver": "npm:^4.2.1" - "@smithy/eventstream-serde-node": "npm:^4.1.1" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/hash-blob-browser": "npm:^4.1.1" - "@smithy/hash-node": "npm:^4.1.1" - "@smithy/hash-stream-node": "npm:^4.1.1" - "@smithy/invalid-dependency": "npm:^4.1.1" - "@smithy/md5-js": "npm:^4.1.1" - "@smithy/middleware-content-length": "npm:^4.1.1" - "@smithy/middleware-endpoint": "npm:^4.2.2" - "@smithy/middleware-retry": "npm:^4.2.3" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-body-length-node": "npm:^4.1.0" - "@smithy/util-defaults-mode-browser": "npm:^4.1.2" - "@smithy/util-defaults-mode-node": "npm:^4.1.2" - "@smithy/util-endpoints": "npm:^3.1.2" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@smithy/util-stream": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.1.0" - "@smithy/util-waiter": "npm:^4.1.1" - "@types/uuid": "npm:^9.0.1" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/credential-provider-node": "npm:^3.972.13" + "@aws-sdk/middleware-bucket-endpoint": "npm:^3.972.5" + "@aws-sdk/middleware-expect-continue": "npm:^3.972.5" + "@aws-sdk/middleware-flexible-checksums": "npm:^3.973.0" + "@aws-sdk/middleware-host-header": "npm:^3.972.5" + "@aws-sdk/middleware-location-constraint": "npm:^3.972.5" + "@aws-sdk/middleware-logger": "npm:^3.972.5" + "@aws-sdk/middleware-recursion-detection": "npm:^3.972.5" + "@aws-sdk/middleware-sdk-s3": "npm:^3.972.14" + "@aws-sdk/middleware-ssec": "npm:^3.972.5" + "@aws-sdk/middleware-user-agent": "npm:^3.972.14" + "@aws-sdk/region-config-resolver": "npm:^3.972.5" + "@aws-sdk/signature-v4-multi-region": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-endpoints": "npm:^3.996.2" + "@aws-sdk/util-user-agent-browser": "npm:^3.972.5" + "@aws-sdk/util-user-agent-node": "npm:^3.972.13" + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/core": "npm:^3.23.6" + "@smithy/eventstream-serde-browser": "npm:^4.2.10" + "@smithy/eventstream-serde-config-resolver": "npm:^4.3.10" + "@smithy/eventstream-serde-node": "npm:^4.2.10" + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/hash-blob-browser": "npm:^4.2.11" + "@smithy/hash-node": "npm:^4.2.10" + "@smithy/hash-stream-node": "npm:^4.2.10" + "@smithy/invalid-dependency": "npm:^4.2.10" + "@smithy/md5-js": "npm:^4.2.10" + "@smithy/middleware-content-length": "npm:^4.2.10" + "@smithy/middleware-endpoint": "npm:^4.4.20" + "@smithy/middleware-retry": "npm:^4.4.37" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/middleware-stack": "npm:^4.2.10" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-body-length-browser": "npm:^4.2.1" + "@smithy/util-body-length-node": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.36" + "@smithy/util-defaults-mode-node": "npm:^4.2.39" + "@smithy/util-endpoints": "npm:^3.3.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-retry": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" + "@smithy/util-waiter": "npm:^4.2.10" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10/a17a07f5a2764b3995485fd3d804cc3187001f33f23751938bb8ae03e5777af4b41d9e95950a7a445b2d091ba09eccd6c7797be9eee65f94b53362a5d300d100 + checksum: 10/b8b73b16e5b33f44169545d7b3a69085af1571913fd1ab3a90e136007bef4b601eef9c9c78a271066faa5807ff9b75a9d0a86dc469a0a42928c0ccf20e0416c0 + languageName: node + linkType: hard + +"@aws-sdk/core@npm:^3.973.14": + version: 3.973.14 + resolution: "@aws-sdk/core@npm:3.973.14" + dependencies: + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/xml-builder": "npm:^3.972.7" + "@smithy/core": "npm:^3.23.6" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/signature-v4": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-utf8": "npm:^4.2.1" + tslib: "npm:^2.6.2" + checksum: 10/8ca24fc9542aa92c082636b2fce8a2b6df6c588042e3a97f566420351459207a8bd37e6c469d1b8e8101ecb8e033ef5d1de990fdfb36397d0f48fd79caf47a0e languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/client-sso@npm:3.891.0" +"@aws-sdk/crc64-nvme@npm:^3.972.2": + version: 3.972.2 + resolution: "@aws-sdk/crc64-nvme@npm:3.972.2" dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/middleware-host-header": "npm:3.891.0" - "@aws-sdk/middleware-logger": "npm:3.891.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.891.0" - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/region-config-resolver": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@aws-sdk/util-user-agent-browser": "npm:3.887.0" - "@aws-sdk/util-user-agent-node": "npm:3.891.0" - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/core": "npm:^3.11.0" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/hash-node": "npm:^4.1.1" - "@smithy/invalid-dependency": "npm:^4.1.1" - "@smithy/middleware-content-length": "npm:^4.1.1" - "@smithy/middleware-endpoint": "npm:^4.2.2" - "@smithy/middleware-retry": "npm:^4.2.3" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-body-length-node": "npm:^4.1.0" - "@smithy/util-defaults-mode-browser": "npm:^4.1.2" - "@smithy/util-defaults-mode-node": "npm:^4.1.2" - "@smithy/util-endpoints": "npm:^3.1.2" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/03bbff822df8ea9eec181c552823410417700049f0f315e98535eb2d9b0c0a67fb5a45d1ef77f8d8e13e89ea7e5c76e6b03f333f4d9dc8614a5666b1732b94d8 - languageName: node - linkType: hard - -"@aws-sdk/core@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/core@npm:3.890.0" - dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/xml-builder": "npm:3.887.0" - "@smithy/core": "npm:^3.11.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/signature-v4": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-utf8": "npm:^4.1.0" - fast-xml-parser: "npm:5.2.5" - tslib: "npm:^2.6.2" - checksum: 10/1b6c24c841076591adef95742cb91125c3d8fddb4da5e90e71095805caee51954bba510a90ac62b586fde886962c08cd6ba8bd2a4e328d7feca94a811eb874cd + checksum: 10/f29f7a96c281215189b66375e87502a9e7061effc39b6ad8b9a8d4477eca73dee61ff95cefcf465401619a8a927b359c845292b4719e57607754278dcd3e5abd languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.890.0" +"@aws-sdk/credential-provider-env@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-env@npm:3.972.12" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d8a3d755a85bdd49ec364d65578fecc5e6634e0632d0b6a5a530a8918688eaab70d3adcda8318306eb3f18ad2fbaaacf62093e4c7365de024fd11cfb1a8318ff + checksum: 10/b93aeb45989fa33129238b79dda4894dcde8f2e8fc08b9db88ddfc8e6e714397934fb648a897e81674541ca2d47bc4a8d8203630e21a313b690aa59bc6d8be70 languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.890.0" +"@aws-sdk/credential-provider-http@npm:^3.972.14": + version: 3.972.14 + resolution: "@aws-sdk/credential-provider-http@npm:3.972.14" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-stream": "npm:^4.3.1" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-stream": "npm:^4.5.15" tslib: "npm:^2.6.2" - checksum: 10/26260f64b90c4a6cb2a0682f2a96151799448b92e4e1b7ffbadd0a8267984a9be5b487ae6d6487e9a8ffb6a2d127f7da03213b139f8d6fe86e1c7d503034996d - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.891.0" - dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/credential-provider-env": "npm:3.890.0" - "@aws-sdk/credential-provider-http": "npm:3.890.0" - "@aws-sdk/credential-provider-process": "npm:3.890.0" - "@aws-sdk/credential-provider-sso": "npm:3.891.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.891.0" - "@aws-sdk/nested-clients": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/credential-provider-imds": "npm:^4.1.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + checksum: 10/2d5da972415d3ce26f77e65e9f044e9bcd1ca7a22ebd92c72a3c5fc1dc5676f24ee4260b4179680616a6ec2bd4ce8a59e8262af24b2a6b5ce32a17dea133b1a7 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-ini@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-ini@npm:3.972.12" + dependencies: + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/credential-provider-env": "npm:^3.972.12" + "@aws-sdk/credential-provider-http": "npm:^3.972.14" + "@aws-sdk/credential-provider-login": "npm:^3.972.12" + "@aws-sdk/credential-provider-process": "npm:^3.972.12" + "@aws-sdk/credential-provider-sso": "npm:^3.972.12" + "@aws-sdk/credential-provider-web-identity": "npm:^3.972.12" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/credential-provider-imds": "npm:^4.2.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/5b992d289948a3066432977ae85ed6ae08341ecb6260a51f36654d9ee69bfe3701cb301bc4d1ebb573451841f69419d695ca1bb3cc6d0479bf1760c2ab4712c9 + checksum: 10/5ceb4814c1408d3eafc23c490d08a17f6e4dbecf95687a62ee6e7299df5534d097cc7f800639ebe35c68935f80ae099d0a846a60e49304b310ec4eaaaca11d32 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.891.0" +"@aws-sdk/credential-provider-login@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-login@npm:3.972.12" dependencies: - "@aws-sdk/credential-provider-env": "npm:3.890.0" - "@aws-sdk/credential-provider-http": "npm:3.890.0" - "@aws-sdk/credential-provider-ini": "npm:3.891.0" - "@aws-sdk/credential-provider-process": "npm:3.890.0" - "@aws-sdk/credential-provider-sso": "npm:3.891.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/credential-provider-imds": "npm:^4.1.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/cb9606e4ef3c276227aa7ebae4c1b58cfd735a433ab753f854d88c6985013c062e0742dd77f572d4e0e25790ab72670692e7c7f366cf4682272ae8b8e21f1182 + checksum: 10/11465db821bd727beb2038e86f374ddfd8fb3f96b1643dc4875b0862f858fa8a0031a3c23a54baed2179b5cd14d62a292b84f08257642cf5ad34ae28683c9968 languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.890.0" +"@aws-sdk/credential-provider-node@npm:^3.972.13": + version: 3.972.13 + resolution: "@aws-sdk/credential-provider-node@npm:3.972.13" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/credential-provider-env": "npm:^3.972.12" + "@aws-sdk/credential-provider-http": "npm:^3.972.14" + "@aws-sdk/credential-provider-ini": "npm:^3.972.12" + "@aws-sdk/credential-provider-process": "npm:^3.972.12" + "@aws-sdk/credential-provider-sso": "npm:^3.972.12" + "@aws-sdk/credential-provider-web-identity": "npm:^3.972.12" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/credential-provider-imds": "npm:^4.2.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/57043a2f8c8d379660156838cafe5b32a1c839411f51d4ba9de80c266ea893169fbee17f126d385204c3cb0663a05e485366277099ecae56a9c469e62a8a8448 + checksum: 10/47b11d1b8b2cdd055b63b1acc8bc0a8fe9ae23d75e514d3f36eedc01180b5276b4d0cba1f3ad8aa100200e97f96e7b5683d9abdedb15ae629eff685f62add659 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.891.0" +"@aws-sdk/credential-provider-process@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-process@npm:3.972.12" dependencies: - "@aws-sdk/client-sso": "npm:3.891.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/token-providers": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/a034bea117500a0e7c48d537e5338be77688ba67412904af87e750e763bcf7b9925a2f7ddc939196829afdbaf8e2465adbbd1bb65a81ae6760eaf96811678fdb + checksum: 10/c2c587d8e31de880df899ab8c2be4f1d310ce73f4da85b5a1ff04de09f63ad720fd35f0f6d146b55026d06f846b6f0953591cf99023bca29b0d60623b8ff85db languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.891.0" +"@aws-sdk/credential-provider-sso@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-sso@npm:3.972.12" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/nested-clients": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/token-providers": "npm:3.998.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d15c3171d125c99614098672cc3f3517246344453981f301b6d723eb0dd5db7f9ebefebbcf94fdd03f948e083ade9cf789357cfc2f6bc2de5ab02041223c1e74 + checksum: 10/b22e3b184e4430a0fd267b9dbc30aac409d06632dcf83394aed503ae901f40a8a73ae014d82178415fa5bc12b9dbe28b078b601656e6ca0b6e8fafc86a30119d languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.890.0" +"@aws-sdk/credential-provider-web-identity@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.972.12" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-arn-parser": "npm:3.873.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/f6b1f5d5cc722fff3eb9454177cf9d38a8412463a59ee7e350381569c13bf6b94dde1fd9e64abc2fcb664b2df4232cfcca660742e7d12d697a32cbb154b2f457 + checksum: 10/ebb536035c21208e605529be4088c857e00ff27f808007eb1116cb0f83a44b650241197fbe590afea03c0cb7a6a0451965edd76df02156cbf33023962577c773 languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.891.0" +"@aws-sdk/middleware-bucket-endpoint@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-arn-parser": "npm:^3.972.2" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-config-provider": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/4e1ec09ab9b1398e4ad6ae840cfe62483f65ba2615a97b81ca26a4d8beea93da89d1360eadac0cf6645330316e50091755bf3cb928de8fe59dff3d89b754826a + checksum: 10/075b50d32458163ca2635f573e9327c4acfaac3f339d42fc93d0372713c7c4e66122ae2950a7505c9c5e91d5b50f2a929ce7b4b7c5fd3c52697a7155dabafc1b languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.892.0": - version: 3.892.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.892.0" +"@aws-sdk/middleware-expect-continue@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.972.5" + dependencies: + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + tslib: "npm:^2.6.2" + checksum: 10/ee57a4693bf8f09b6561321b6c3f814932a56ef431331b7875a5c3ca368df9b6181c5680fe1ca6a70f87065beac76a510033d9c866510b892fd0cfcf6cad2a31 + languageName: node + linkType: hard + +"@aws-sdk/middleware-flexible-checksums@npm:^3.973.0": + version: 3.973.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.973.0" dependencies: "@aws-crypto/crc32": "npm:5.2.0" "@aws-crypto/crc32c": "npm:5.2.0" "@aws-crypto/util": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/is-array-buffer": "npm:^4.1.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-stream": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.1.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/crc64-nvme": "npm:^3.972.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/is-array-buffer": "npm:^4.2.1" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/de67db1ed29faf665b501259a4241befd4fbf6f2e6b2626c7e526a8fbd5211a40c3a1a183bf42de62511928c60b0c7a9424a094a86ca4ede824963f218764320 + checksum: 10/0432367ec463b6616e410c8d5534d33b1cbdac7d4090251ead362f4989414f299c8fcdad4538c581b566441f96a7de821647929db12a7ae5db11226827b344c6 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.891.0" +"@aws-sdk/middleware-host-header@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-host-header@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d2e38a288303db64948869542c88474c8401c8730bb66e1ec0205d4175a1f9df78c9c1fe9cc3100450eff04a1dc8195ac96d7c042229c6eb04160d4a499d7d82 + checksum: 10/1111cb18fcb621ebe97ef4f5d7f6e2814a9b74143f7327412d99112b44e3b087f476f3099c30822a981d9113b1f3ce637d7d8c0d333e1117920fe539f9f118f9 languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.891.0" +"@aws-sdk/middleware-location-constraint@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/458904e299497fb228177252de8752b6ee061b3882b888538b13d1ee0a952d4df534740b5111465019eb39d6ccf4c253aa6140fc31acf1d1bbc95ee974af8125 + checksum: 10/61dad687d0db28ec9968d15cfb4815ffc84c8231c7ee830c9a6dbd53064ac4b885b2fd601a650446315b37dedc729bab2128426f8d7f5733e7aafbc4ac0db92d languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-logger@npm:3.891.0" +"@aws-sdk/middleware-logger@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-logger@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ae410515ea8c4933bb8861b225cf84253a146964644be62581bec793177d0f589da13d0d7fe1df679f11f3e22b1b7c5f5736e43abbab99fb4b550d74a1bfc745 + checksum: 10/c846998f69412d6b1e5e1f047a11c87c14ad1e28b049cf92a205269eb0ae28f0742ee28644580590407080783193b4995ecbeb397b4adfde251fcae8b2a98d57 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.891.0" +"@aws-sdk/middleware-recursion-detection@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@aws/lambda-invoke-store": "npm:^0.0.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@aws/lambda-invoke-store": "npm:^0.2.2" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/f69b35645b581049a35bd93ee31333aa9bd2885857867529cc6a5ebb7d67598538b76236c937802e288eeacecba975d125af7d070ea9c520e2327fac81eff0e4 - languageName: node - linkType: hard - -"@aws-sdk/middleware-sdk-s3@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.891.0" - dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-arn-parser": "npm:3.873.0" - "@smithy/core": "npm:^3.11.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/signature-v4": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-stream": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.1.0" + checksum: 10/110e9e38b8938ca186f99106319e73e807b9a99c47e32e8bbf8f1e3c84b4caf8b1ad58e5646b0c475f4d5dc03eb21e63489460ffeda33b98cf82cec64f0e5638 + languageName: node + linkType: hard + +"@aws-sdk/middleware-sdk-s3@npm:^3.972.14": + version: 3.972.14 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.972.14" + dependencies: + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-arn-parser": "npm:^3.972.2" + "@smithy/core": "npm:^3.23.6" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/signature-v4": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-config-provider": "npm:^4.2.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/8f337e23a469efccef49ca76dd26ac9f33695d3da28bb0d04781fde2b45a66450f717e1b688e0d1e66a0f8f75018a317207a0d928e6db7df89ed43fc88d0d423 + checksum: 10/499b7152ad33fe57acb75000ed3b27c9807804fff563dcca0be7eb762935d5cd84c39054bd7e94412d165accc3a26af3e015a27c0d137b2a0efffb54cc4ab2fe languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.891.0" +"@aws-sdk/middleware-ssec@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-ssec@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/eaff1bcb582ae55882db977019d019b167e3a0ba2e23cc70719ecb8c45939e7e7f973a9966e64ae5e26e766219d2d1c46decffa05f933f10bfad8ffb12822057 + checksum: 10/d224c0be37527219f5e5fdf543c8a969d954ef526e426a72fc35778af32144d5b2378a2a591fa1adf97b0bb2e35df80b114baf414c7b77b41d73fd9b64dfcbad languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.891.0" +"@aws-sdk/middleware-user-agent@npm:^3.972.14": + version: 3.972.14 + resolution: "@aws-sdk/middleware-user-agent@npm:3.972.14" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@smithy/core": "npm:^3.11.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-endpoints": "npm:^3.996.2" + "@smithy/core": "npm:^3.23.6" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ae9dad8f3092120e609d21668bc0c82025c0adc30ec80633cb7d734c648ca03af776e82f114e29b9c29ecad54bc4788f17e8f4dd387e03682472fa1a39da2d43 + checksum: 10/161f85507e7338c3c75c0ab1cc1de9ff70fd02cbb10a895483b08f02100009287a932df72bc3dc08f17675fe374531275c16f014d8bb34c6bb19e9256ffee50e languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/nested-clients@npm:3.891.0" +"@aws-sdk/nested-clients@npm:^3.996.2": + version: 3.996.2 + resolution: "@aws-sdk/nested-clients@npm:3.996.2" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/middleware-host-header": "npm:3.891.0" - "@aws-sdk/middleware-logger": "npm:3.891.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.891.0" - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/region-config-resolver": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@aws-sdk/util-user-agent-browser": "npm:3.887.0" - "@aws-sdk/util-user-agent-node": "npm:3.891.0" - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/core": "npm:^3.11.0" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/hash-node": "npm:^4.1.1" - "@smithy/invalid-dependency": "npm:^4.1.1" - "@smithy/middleware-content-length": "npm:^4.1.1" - "@smithy/middleware-endpoint": "npm:^4.2.2" - "@smithy/middleware-retry": "npm:^4.2.3" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-body-length-node": "npm:^4.1.0" - "@smithy/util-defaults-mode-browser": "npm:^4.1.2" - "@smithy/util-defaults-mode-node": "npm:^4.1.2" - "@smithy/util-endpoints": "npm:^3.1.2" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@smithy/util-utf8": "npm:^4.1.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/middleware-host-header": "npm:^3.972.5" + "@aws-sdk/middleware-logger": "npm:^3.972.5" + "@aws-sdk/middleware-recursion-detection": "npm:^3.972.5" + "@aws-sdk/middleware-user-agent": "npm:^3.972.14" + "@aws-sdk/region-config-resolver": "npm:^3.972.5" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-endpoints": "npm:^3.996.2" + "@aws-sdk/util-user-agent-browser": "npm:^3.972.5" + "@aws-sdk/util-user-agent-node": "npm:^3.972.13" + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/core": "npm:^3.23.6" + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/hash-node": "npm:^4.2.10" + "@smithy/invalid-dependency": "npm:^4.2.10" + "@smithy/middleware-content-length": "npm:^4.2.10" + "@smithy/middleware-endpoint": "npm:^4.4.20" + "@smithy/middleware-retry": "npm:^4.4.37" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/middleware-stack": "npm:^4.2.10" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-body-length-browser": "npm:^4.2.1" + "@smithy/util-body-length-node": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.36" + "@smithy/util-defaults-mode-node": "npm:^4.2.39" + "@smithy/util-endpoints": "npm:^3.3.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-retry": "npm:^4.2.10" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/04582711919570aad21dc894a1dc6b4f7ed648e6e624d1ed05436afdd1f517819c201bcca2fef5351ec1739d8703d12e991c65ea7f7b3fb337429789f90b36e7 + checksum: 10/544fd7ed6bef14c5e8c9289d3900d7cee1ccb61b54ca6ff0ef9b60f9d31c67e3a2b8a3b894250efcf663aae7a27ee3eec38bcb639fa9ba21b2728b1ac183ccba languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.890.0" +"@aws-sdk/region-config-resolver@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/region-config-resolver@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/cc206435a728beea2ba08ce6efdd6a2e980be350f92b5dee0194665f3f1e88c3a82bf48d7cddf1567a9ff2fc597b30eda31749d88b09e4d2b30d71b3b67956a0 + checksum: 10/0499dbbf00c441a308c323b93bf0b05ec998102e2febed007682db0af13a92f54b6473f0af093429198c56c50a178092e47932b107e015274e5d6d05923117d1 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.891.0" +"@aws-sdk/signature-v4-multi-region@npm:^3.996.2": + version: 3.996.2 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.996.2" dependencies: - "@aws-sdk/middleware-sdk-s3": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/signature-v4": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/middleware-sdk-s3": "npm:^3.972.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/signature-v4": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/0ca324f399f18acb081c1a39dfafb433d48be55f35af05309c5b4332f5772612d8c2b2b83b34b2b46bd19288650b8062a2764d36453bfd4d7320b22bfa7b598c + checksum: 10/db0125ce57c8bd7a82116e494f5892f0377adf9467a2df2d43fe148c1d87eee107bb5ce0cee574224e074ed6bb1ca6c4ebe496100d67aba33adad6974e909408 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/token-providers@npm:3.891.0" +"@aws-sdk/token-providers@npm:3.998.0": + version: 3.998.0 + resolution: "@aws-sdk/token-providers@npm:3.998.0" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/nested-clients": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ef72f752850eeb653c91c9cdf29ee6fd82ceae33ddeb818bf7935a59d1e897370eb0ec6121a308c71dbfac628fde49b0effad011b2e6e21c15ce0eef4717e848 + checksum: 10/f909edc88ea504d9146e18c7a979a51e0b471df9110ecc8f2a9c8a4f51398f285d99549df487800fe3ee466cad21dafcdf9fedbed306e7cb37d8aa8231d0c05e languageName: node linkType: hard -"@aws-sdk/types@npm:3.887.0, @aws-sdk/types@npm:^3.222.0": - version: 3.887.0 - resolution: "@aws-sdk/types@npm:3.887.0" +"@aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.973.3": + version: 3.973.3 + resolution: "@aws-sdk/types@npm:3.973.3" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/b4a0024c35d01b481d18454ed1d6eaca8aa1f61082e9e71b1af78d1bc714c919fad3f594498a572aafa73f0d4301b26ae359d009a79d62c5ad995dad25416d59 + checksum: 10/00b27f33990ce1ae58feea6889c57a47d2c1f176d05ca401fbff1e510f256c97ae8fead4b2de81b25d075e38c6439b87ac02f65ded5cb6923a096690ec2f4cc2 languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.873.0": - version: 3.873.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.873.0" +"@aws-sdk/util-arn-parser@npm:^3.972.2": + version: 3.972.2 + resolution: "@aws-sdk/util-arn-parser@npm:3.972.2" dependencies: tslib: "npm:^2.6.2" - checksum: 10/c0438e9730bf5e9c9fdabf1ed5befe3cdbceaa163ccadef616de2675ed5fbdcc84d5c2286b2c20ec6043c29f699b9bc22dc37afc2895d1145499531ec6c0ad36 + checksum: 10/6c09725259187615199b44c21cc9aaf6e61c4d1f326535fd36cf1e95d9842bd58084542c72a9facbca47c5846c5bd8fed7b179e86a036ee142d4a171a6098092 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/util-endpoints@npm:3.891.0" +"@aws-sdk/util-endpoints@npm:^3.996.2": + version: 3.996.2 + resolution: "@aws-sdk/util-endpoints@npm:3.996.2" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-endpoints": "npm:^3.1.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-endpoints": "npm:^3.3.1" tslib: "npm:^2.6.2" - checksum: 10/72f50b9c31cc18637f0e2586c2597583860713a2fdb3b14e92dff78b20d8852df2c78577222ec453a0cbc62eac2227d1638b445b9c93f2a58e6449902e604504 + checksum: 10/a964913f92d21b7d30a55c280ed908df28d17805be059e8f611188efc659557952f6304fdf6ebd510861a81a6a7ce5e00aef653908726834d87c17ba73649826 languageName: node linkType: hard "@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.873.0 - resolution: "@aws-sdk/util-locate-window@npm:3.873.0" + version: 3.965.4 + resolution: "@aws-sdk/util-locate-window@npm:3.965.4" dependencies: tslib: "npm:^2.6.2" - checksum: 10/36f252a0cc7dd2ae08eb14ca3aba2982761ce813e42d455b478213765688ac1bcc609888ad8888b8ab23220ec0865987640d66e0cf9182552063e88220257563 + checksum: 10/5b41a026b8600549805a368143f2c4fb79deb60fb8a82064c76a0286bda5ef629c2ea0e5eb6b4d038f90bf2a5cf46cb098232e84c9dc342c15c7206543fbb8b1 languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.887.0" +"@aws-sdk/util-user-agent-browser@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" bowser: "npm:^2.11.0" tslib: "npm:^2.6.2" - checksum: 10/9ea71ca8e756a5e69e9651724253917fa5b75d31fc91562976d09c65d1ebdad65f529afc07922639549027c75f5f207fc70694ae29787198e895573f888c1b0e + checksum: 10/0ad962747d0655211842772ce70c146930200755ba6b0804021d8bba1c972a2b33bdf9a8aea7b9eac4e7d89e575e346b30326adb13fa4a882d76806e3395e433 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.891.0" +"@aws-sdk/util-user-agent-node@npm:^3.972.13": + version: 3.972.13 + resolution: "@aws-sdk/util-user-agent-node@npm:3.972.13" dependencies: - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/middleware-user-agent": "npm:^3.972.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: 10/4ed824842e5b680db9a08f07a105f6020b3bf5f6489a7d9b133b27c76bef7e3c808b045dbc786017e4badaeeb2266b0833a82f824e415e8e9cbef01d76c5b6f2 + checksum: 10/47157f35bcc37fe0dfa78586db6990c8fe4c3578080cc58987dbc684e43bfd660834cc8440bf59578a4d01c155b9009603b77beeece70ba9bcab1d5770d05102 languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/xml-builder@npm:3.887.0" +"@aws-sdk/xml-builder@npm:^3.972.7": + version: 3.972.7 + resolution: "@aws-sdk/xml-builder@npm:3.972.7" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" + fast-xml-parser: "npm:5.3.6" tslib: "npm:^2.6.2" - checksum: 10/4a6189a319b846a82fe8a2cee7d34d6e5da934aacd5913d140bd3f3f7c677bd28617d49ce51dee95bee8aeccb4e436989a544405e8f3f28304daa43f1081c29c + checksum: 10/0c467ddc63b273b4bb99ffdf818ca2beecada06f8ee9fa1c2cf2a5d565cd44c9e9a7f5f1c8821e9c20b0d7c8282f49f17ec153c0a06f40f7ac355d9f99dae1cb languageName: node linkType: hard -"@aws/lambda-invoke-store@npm:^0.0.1": - version: 0.0.1 - resolution: "@aws/lambda-invoke-store@npm:0.0.1" - checksum: 10/e8f54d28aade8828962f2871a22aa4e960ebc40c8fa551414181dd9dd32d6258279013c42f88e57d17aa4252cb5ed00df6a49fc35185f9fa6b6f351ccf821bd6 +"@aws/lambda-invoke-store@npm:^0.2.2": + version: 0.2.3 + resolution: "@aws/lambda-invoke-store@npm:0.2.3" + checksum: 10/d0efa8ca73b2d8dc0bf634525eefa1b72cda85f5d47366264849343a6f2860cfa5c52b7f766a16b78da8406bbd3ee975da3abb1dbe38183f8af95413eafeb256 languageName: node linkType: hard @@ -856,7 +833,7 @@ __metadata: "@types/jest": "npm:^30.0.0" "@types/node": "npm:^22.15.17" "@typescript/native-preview": "npm:7.0.0-dev.20260113.1" - axios: "npm:^1.12.0" + axios: "npm:^1.13.5" buffer: "npm:^6.0.3" crypto-browserify: "npm:^3.12.1" jest: "npm:^30.0.0" @@ -1894,7 +1871,6 @@ __metadata: "@aztec/stdlib": "workspace:^" "@aztec/telemetry-client": "workspace:^" "@aztec/world-state": "workspace:^" - "@google-cloud/storage": "npm:^7.15.0" "@iarna/toml": "npm:^2.2.5" "@jest/globals": "npm:^30.0.0" "@types/jest": "npm:^30.0.0" @@ -2158,7 +2134,7 @@ __metadata: "@types/node": "npm:^22.15.17" "@types/pako": "npm:^2.0.3" "@typescript/native-preview": "npm:7.0.0-dev.20260113.1" - axios: "npm:^1.12.0" + axios: "npm:^1.13.5" eslint: "npm:^9.26.0" jest: "npm:^30.0.0" jest-mock-extended: "npm:^4.0.0" @@ -3780,7 +3756,7 @@ __metadata: languageName: node linkType: hard -"@google-cloud/promisify@npm:^4.0.0": +"@google-cloud/promisify@npm:<4.1.0": version: 4.0.0 resolution: "@google-cloud/promisify@npm:4.0.0" checksum: 10/c5de81321b3a5c567edcbe0b941fb32644611147f3ba22f20575918c225a979988a99bc2ebda05ac914fa8714b0a54c69be72c3f46c7a64c3b19db7d7fba8d04 @@ -3788,16 +3764,16 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^7.15.0": - version: 7.15.0 - resolution: "@google-cloud/storage@npm:7.15.0" + version: 7.19.0 + resolution: "@google-cloud/storage@npm:7.19.0" dependencies: "@google-cloud/paginator": "npm:^5.0.0" "@google-cloud/projectify": "npm:^4.0.0" - "@google-cloud/promisify": "npm:^4.0.0" + "@google-cloud/promisify": "npm:<4.1.0" abort-controller: "npm:^3.0.0" async-retry: "npm:^1.3.3" duplexify: "npm:^4.1.3" - fast-xml-parser: "npm:^4.4.1" + fast-xml-parser: "npm:^5.3.4" gaxios: "npm:^6.0.2" google-auth-library: "npm:^9.6.3" html-entities: "npm:^2.5.2" @@ -3806,7 +3782,7 @@ __metadata: retry-request: "npm:^7.0.0" teeny-request: "npm:^9.0.0" uuid: "npm:^8.0.0" - checksum: 10/b9898537125974e0c787ad351d3adf5cfec8c1c1bb98bdf2a56bcbc89ea84f719c9efed35aa14f309f934b97b8f9ffb161de6ba3cecc32961c3d8786c246c849 + checksum: 10/6fa0621ff702f3e8e8e4edd25c1f7582b5f2a0b44866ad0b94cd3f074ff58b9164d1c470222bf9c29fcf54c27fabb4ff6706ee073a706c6a67673a8e19b17c30 languageName: node linkType: hard @@ -6364,190 +6340,190 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/abort-controller@npm:4.1.1" +"@smithy/abort-controller@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/abort-controller@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d2a007a4a41afd3ac13c291f2683d1da57709e75db0a09f502225983c097c8169e3b1b78fc01ee691fb12980492fb3ca49628b3f34ece0a66806bd0caf701710 + checksum: 10/cd13d1a674e6a9318166cb3602e8d6aecf7141f3f4f8faf25afe2a9841faf6ecfface8058be520174a6b4776e45c18bac41fa352e917ca3cafaf4e77f893a0e2 languageName: node linkType: hard -"@smithy/chunked-blob-reader-native@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/chunked-blob-reader-native@npm:4.1.0" +"@smithy/chunked-blob-reader-native@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/chunked-blob-reader-native@npm:4.2.2" dependencies: - "@smithy/util-base64": "npm:^4.1.0" + "@smithy/util-base64": "npm:^4.3.1" tslib: "npm:^2.6.2" - checksum: 10/5ddca9cb700392ff0e6025726528e2c2e20e189b974af0eb8286b2b7bfa248c10c479c99ff09d0fbf0c3c5feefa98ce5da78f4273bbdae0b85e064d753fdecc9 + checksum: 10/2137c946da0bff26f1643252ab63ecc20b1359ed0e66aa7fe502d880343b14ddd1e3d21fdf9addc55a7e71444c4dcab0d13f759670827b7903759d78cf76fb3d languageName: node linkType: hard -"@smithy/chunked-blob-reader@npm:^5.1.0": - version: 5.1.0 - resolution: "@smithy/chunked-blob-reader@npm:5.1.0" +"@smithy/chunked-blob-reader@npm:^5.2.1": + version: 5.2.1 + resolution: "@smithy/chunked-blob-reader@npm:5.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/a7d1d7d5b45499dc6e2c6a4bbfd1ac8cfbaf85b5b28db060c8d3cb1f331432cdada0e5586d57d949a3e521d7eb7b88c425d66cd2ee7ab9d1cf4fbff9a1f830e0 + checksum: 10/a0979d9a22b9e042c0527e5331e1f1a11fb14c169628814371953273cb7bb772bf8051055e63e7738287efeb98c64d2a9bef64332db25aa099d52b426f3e11e4 languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/config-resolver@npm:4.2.2" +"@smithy/config-resolver@npm:^4.4.9": + version: 4.4.9 + resolution: "@smithy/config-resolver@npm:4.4.9" dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-config-provider": "npm:^4.2.1" + "@smithy/util-endpoints": "npm:^3.3.1" + "@smithy/util-middleware": "npm:^4.2.10" tslib: "npm:^2.6.2" - checksum: 10/8b489420646c61c4ac57e2754ad6e4012de27aa6d0bca18d69f1916085908d58d8ba4d8d963e24ba55c9a797996b95cedff18e3fa2674136c6eb14044f942da0 + checksum: 10/59733532725b50a9b7ec0f569bffafe6d47465c3b61ba5449a11952834b8cc07862b398fdb1a85b9a0205eddb7905f1b1095bad1a8561db883c42c192cf079b2 languageName: node linkType: hard -"@smithy/core@npm:^3.11.0, @smithy/core@npm:^3.11.1": - version: 3.11.1 - resolution: "@smithy/core@npm:3.11.1" +"@smithy/core@npm:^3.23.6": + version: 3.23.6 + resolution: "@smithy/core@npm:3.23.6" dependencies: - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-stream": "npm:^4.3.2" - "@smithy/util-utf8": "npm:^4.1.0" - "@types/uuid": "npm:^9.0.1" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-body-length-browser": "npm:^4.2.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" + "@smithy/uuid": "npm:^1.1.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10/23637790d7ce4366d9facf3ce63802ecfe2bdaba5235f0501fa7feef6ca67276c6c3877ace0b910e171274daa61724647a20e4fd8ec25f6bd93b9dfd5ab39896 + checksum: 10/aea8d404fefeb1532c1caf00a2eef8764e3260b26f70746bf9460ba668d63c4616f95064c6edf15d7e0eba072740b79d1b9351745c4fa5d1a569502210370746 languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/credential-provider-imds@npm:4.1.2" +"@smithy/credential-provider-imds@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/credential-provider-imds@npm:4.2.10" dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" tslib: "npm:^2.6.2" - checksum: 10/c10cbea54ba8475d27cd38e956bda9113efa7e90ad46369aa2b3f8bce511ccc89a45f2198efe8bd00a35de16f5ef411723be01093cc02c10511ea89c5ed0131e + checksum: 10/32b1b2ad3d071b36bb50da598d620100ec72fee45cae22f87d27b9764614a2e975e94cf481df78e088a60cf621a48ea9141ce18d6f7ba2d0e351707cecfe16d7 languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-codec@npm:4.1.1" +"@smithy/eventstream-codec@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-codec@npm:4.2.10" dependencies: "@aws-crypto/crc32": "npm:5.2.0" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-hex-encoding": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-hex-encoding": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/7921997f85957c17fd5493567777dcfa31b90c84a3cb2a27adfc8218846994dd6ddebb4699c0656e02d25709d44b692b58a0c94296e771257097ab61626ebdd3 + checksum: 10/83e0a9b8d12f148fb6719369979a39961720bbab04f7a6418402432625edb9ec19f2e054c726b6e3ee024bf55967dabf51a0e174a5742694b1a13d37d43dde5e languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-serde-browser@npm:4.1.1" +"@smithy/eventstream-serde-browser@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-serde-browser@npm:4.2.10" dependencies: - "@smithy/eventstream-serde-universal": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/eventstream-serde-universal": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/89afea2e1deeb3e771e69e62dbc3d17a4fb366dc0b3edf355069a0d8c429cc09e46c8b78f92456dded8e40e22dd06dade5bc717e17ae197b0fe5997729aac82c + checksum: 10/7be36cc32d731d32b8ea8b91d68fc6b8a8dc061816a0bc2979b4b287f2bc6fe4f86187976a39d403527660b3b867a09cc9e17ed59ea8dafc9a525fdb96c03e17 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^4.2.1": - version: 4.2.1 - resolution: "@smithy/eventstream-serde-config-resolver@npm:4.2.1" +"@smithy/eventstream-serde-config-resolver@npm:^4.3.10": + version: 4.3.10 + resolution: "@smithy/eventstream-serde-config-resolver@npm:4.3.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/18e1f0e69bb10b427103113ca14542d6e740e9096cd51d706f890cec78d390f5ccc81513ceef0b861ba05ff0004f0244aaac29d4f3eeff2bc062a16a76331944 + checksum: 10/4b5c7f49ea853b52ee61bc1b021aa001c8d9ffe9723767cfb08121200234379436c25da1385da9e03ae159a6971a96b0c3cabefd92d2b86537d1caef51f1d643 languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-serde-node@npm:4.1.1" +"@smithy/eventstream-serde-node@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-serde-node@npm:4.2.10" dependencies: - "@smithy/eventstream-serde-universal": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/eventstream-serde-universal": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/9ec402098b3d67d051e92d332afb7ea7ab056d178e206d4e35ca47e9b2d12915373358323681c6183f22680e847101277dbf43abb9703bfda2ec23451cc87c51 + checksum: 10/6a904fedfde118fc7f9d5b3903a8f4f01bf3af66cc5681965569937ea6abbe3963cb01269e5ed5d00417df03666e1e1962cb0f55974468663fa027d768f0a953 languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-serde-universal@npm:4.1.1" +"@smithy/eventstream-serde-universal@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-serde-universal@npm:4.2.10" dependencies: - "@smithy/eventstream-codec": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/eventstream-codec": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/bbe77b9f14d718d18972dc4690c53b6518e0088e0c24d7f0a38b3ede3dd0291fd494112bfe7efb93591ba4b923b0ce9b8598ee72eec4e4481812ef3f4bfb5af7 + checksum: 10/4354d22497aa72cc35b1aa62c2afa755607da721752b47e37cfe7bb3972b82bca25cf73aac4821b9c3ed3d7f024d72d93a63230557e103ecb228555d4bba9be8 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.2.1": - version: 5.2.1 - resolution: "@smithy/fetch-http-handler@npm:5.2.1" +"@smithy/fetch-http-handler@npm:^5.3.11": + version: 5.3.11 + resolution: "@smithy/fetch-http-handler@npm:5.3.11" dependencies: - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/querystring-builder": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/querystring-builder": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" tslib: "npm:^2.6.2" - checksum: 10/a7038d20ad2ad64bdfda06b61e6a485b20af2086e94b78dc8f955a5baf270efaca6c9a3f7401114b8e856eed3ff8dda9701119a560455e6d72f8ae1957f50d33 + checksum: 10/b15461b66a3fdc293ab62f3146b322d9ec6e76457b3a33ec9dbad40f93e927705e318cfe4006742aab3f1bf4928938acff9472abb076c8b47ff9ae767a7dfbad languageName: node linkType: hard -"@smithy/hash-blob-browser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/hash-blob-browser@npm:4.1.1" +"@smithy/hash-blob-browser@npm:^4.2.11": + version: 4.2.11 + resolution: "@smithy/hash-blob-browser@npm:4.2.11" dependencies: - "@smithy/chunked-blob-reader": "npm:^5.1.0" - "@smithy/chunked-blob-reader-native": "npm:^4.1.0" - "@smithy/types": "npm:^4.5.0" + "@smithy/chunked-blob-reader": "npm:^5.2.1" + "@smithy/chunked-blob-reader-native": "npm:^4.2.2" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/8e29bf75da5ceebc571bee17c3e6c28162572105dcdc17b249a5edf3691e0987daf579470cb60799e8f200756cb3bd8fa69e0b299a8435edaff490f14101bc13 + checksum: 10/ae08dc05eff99a7e5c8d7d526e7229975c316ed9ab6dc3902ea857119d14f68dc3d5c5432498d3453bbdde3c0ff1dca5cce3e075cb02577a149fa36e118c0c37 languageName: node linkType: hard -"@smithy/hash-node@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/hash-node@npm:4.1.1" +"@smithy/hash-node@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/hash-node@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-buffer-from": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-buffer-from": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/234f3d52975f99583ec8e739f70b3ccb1941f57bb47e1d230af954d5b1b3d7ee6c94907079017ef5fbfec4bcb618c0214b26b2ff7d7a01dc57d1f8f5ff414cba + checksum: 10/e81cdad00803cbb3598efe1c37f7b13e050a371bd0456d622c790bc6c125b28549f06f277c10aae1f66fbdaf2a599f5d184f062d8ed44b29eb03de8e77b65534 languageName: node linkType: hard -"@smithy/hash-stream-node@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/hash-stream-node@npm:4.1.1" +"@smithy/hash-stream-node@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/hash-stream-node@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/abdeea567ffb65f41e79c4dec5733c29a419a1de546e968be95113e2d96fc7e870149c1de422ff4fefb4229ee3dd0e29996df14c2c95e42a65027f9cdfa8f03a + checksum: 10/197719def18803fd23fe1320937bbcd4e434f85304205fbbcfecf9c5b97b97d0fa6ff53005340cc221c628ed13af147754896405ef9198ee67d1da26b3445903 languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/invalid-dependency@npm:4.1.1" +"@smithy/invalid-dependency@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/invalid-dependency@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/665e34379c6b3ad3a6bb0cf14ad646ba2bd9785b6e1b571d41192ad2d5617f5f48cd743d2ad75ce5ba6d5a2c2e312f7f86c2be50d2b8b12c9f2c0e5f42c9633e + checksum: 10/7f9be8eade96a8dff5b2a71b6ffcedf97f743b9531e10b10430dea22b663ed821ee22f5d7e58f0aa7739c9ca6bf86b568531a5c9e0b01d1c7ba25c7d20149618 languageName: node linkType: hard @@ -6560,254 +6536,253 @@ __metadata: languageName: node linkType: hard -"@smithy/is-array-buffer@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/is-array-buffer@npm:4.1.0" +"@smithy/is-array-buffer@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/is-array-buffer@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/5fba7ea13175100d39bc88b480dc70dc04bb62c62dc470e61e09b287f3b4c851c56473bda2ec077eca31675cde184dadc4d50ef11f065fb566e0b88f92d9465a + checksum: 10/a6cb22520c1cac6e5aca8ebc830fa4ad96bd793d7ff9f12a34d0bfa2ddc7f4c62930b032d6f81af4271ce2031998a8d7494ea16492bdb5d343b8649ab220535f languageName: node linkType: hard -"@smithy/md5-js@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/md5-js@npm:4.1.1" +"@smithy/md5-js@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/md5-js@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/383d9acb06adad67c1089283988195d478475a53fa6e9954f5b237989b5ae15a8f2ec70f8f64557c65ce2984e8503bdc55ea4ff487def8c04822af1132f6746b + checksum: 10/a2ba23e4fad7af31ff50da64f3929961462f87cf50e30bd2d72fc4a2c64b7610f9f1c5ce8584cf0d91a1f02f937b55e06f890579f27ecde379540edfbb3350f2 languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/middleware-content-length@npm:4.1.1" +"@smithy/middleware-content-length@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/middleware-content-length@npm:4.2.10" dependencies: - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/eb2a99c11d01484ff0b17ba9c5d02878b92c61153568080eab011699de4460ff4534a302d9131583deb83963be83494a43e1973235c1e7edbaaaa2ace5e2b202 + checksum: 10/7b58bdcfc97f01997e2a235c16536847b70ba07fdb7da8dfc81b93e4782fcd5fcf8b894a599455b35bed7ac0b145e2d00d0be4610131f48be6bb4df2e110b68c languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.2.2, @smithy/middleware-endpoint@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/middleware-endpoint@npm:4.2.3" - dependencies: - "@smithy/core": "npm:^3.11.1" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-middleware": "npm:^4.1.1" +"@smithy/middleware-endpoint@npm:^4.4.20": + version: 4.4.20 + resolution: "@smithy/middleware-endpoint@npm:4.4.20" + dependencies: + "@smithy/core": "npm:^3.23.6" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-middleware": "npm:^4.2.10" tslib: "npm:^2.6.2" - checksum: 10/0a7a5187b12c2b0e78b9fe3e36617874bf7326a6f3eec61d782ec107c621d770e5ae70de4bd2d7c83fbedc0c03fe699fa072c2d5beec27142b36198a083ce200 + checksum: 10/5c383e2b2bdadee64547ba9a3fa7690c9b146510313cec999477527029a0eb0a25bac94034b769b1b528480e2e825c4e611511d01458b90841edef3bb3735cf0 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.2.3": - version: 4.2.4 - resolution: "@smithy/middleware-retry@npm:4.2.4" - dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/service-error-classification": "npm:^4.1.2" - "@smithy/smithy-client": "npm:^4.6.3" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@types/uuid": "npm:^9.0.1" +"@smithy/middleware-retry@npm:^4.4.37": + version: 4.4.37 + resolution: "@smithy/middleware-retry@npm:4.4.37" + dependencies: + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/service-error-classification": "npm:^4.2.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-retry": "npm:^4.2.10" + "@smithy/uuid": "npm:^1.1.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10/ff078b30f43b37e2fa02f743dddfd7c61f4485df2816646f33ad88689c54282466ebd258cf4af146aa9e5aaae49eb93b09011c36d6fdf55f7e98fcb9ddba06de + checksum: 10/4a9ac93ed0ec19dba8ced3787a12baa812df431718176d167a6894fd9a21c0da0b7a9953341d07662d44fa9f0a1942559883e3132db8daed84dcb611422fbbda languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/middleware-serde@npm:4.1.1" +"@smithy/middleware-serde@npm:^4.2.11": + version: 4.2.11 + resolution: "@smithy/middleware-serde@npm:4.2.11" dependencies: - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/01d907751748a4b2806aba43ec4a668d313c89c04ecd6ba3b15663e39b9b447842387e4300e47d8ce7066c415fb70b05b53c11967f98c4d8ea5488891070cad6 + checksum: 10/0d61120641729ca921c19077562e59b407d06010d674520726493ce56db6c6b42c97ad3844f9b9f53c3be7f67d356105de169ab1fd2ad24657e14b9754e8811f languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/middleware-stack@npm:4.1.1" +"@smithy/middleware-stack@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/middleware-stack@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/7c07663cb381f785d2bf39ff7fa5ee14e233168021274ede6b86335fff60a23260f42535f5ef32c8fe581c780a80acd06df39fcbcd3634e61c1eae685372a65c + checksum: 10/bc37f3650b1e05f63e32156ef0c72b8cc7e2ede1ec5f122266e7042ba69f9165681c2633c73156a7195053e2022a14c66a4df021afd29613370f6a06cd90b926 languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/node-config-provider@npm:4.2.2" +"@smithy/node-config-provider@npm:^4.3.10": + version: 4.3.10 + resolution: "@smithy/node-config-provider@npm:4.3.10" dependencies: - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/18f290c8be9c5de33b64e7cae847bfbf1b926e7fbb1df31e853a7d04ef3275adb690f5cf3450ffef23ab68fc8f37f45d42bee9c05bf791b8b66c447c97ba2e25 + checksum: 10/49c6450b7a6b1871bc9f1eee4ecfa6170f022b4b5c47a320aae73041c4ec1aa1901e0d8babd772d71745d363a3bd735fd08e1ebfd28b4a33498bd38a4f3bf7e4 languageName: node linkType: hard -"@smithy/node-http-handler@npm:^4.2.1": - version: 4.2.1 - resolution: "@smithy/node-http-handler@npm:4.2.1" +"@smithy/node-http-handler@npm:^4.4.12": + version: 4.4.12 + resolution: "@smithy/node-http-handler@npm:4.4.12" dependencies: - "@smithy/abort-controller": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/querystring-builder": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/abort-controller": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/querystring-builder": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/71f6551dbd06e2a9eb2b536bf13f11ec32c93da324376bf82ff3614e24241970e9ba4106cbbc8a0ac2867595fad3b12c6b2807366f921561ec41086a90af2ece + checksum: 10/2c561c4af663a5d48778051fa23b31469045a00531cda14aadbd4b454d2f8e95f396505204f3990817a99872feae0a7d150abb2158d2c620d5a2f7cf2f594f67 languageName: node linkType: hard -"@smithy/property-provider@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/property-provider@npm:4.1.1" +"@smithy/property-provider@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/property-provider@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/f44da66c108b6bb0d9e59a30d8dbde17fc38656890b3ba688cf22db130e93f84d7436003cde473d2636a16d736eb4a8638e069f9a1cb0228a9bb2a5d90f8e40a + checksum: 10/4ad889be847e391ae5fd82b97c18db6c5c67174073c50c26d3458dad76f11bc08ebf45db2afb690a3935c85dbd5c3b4526270270248168f79af1c829d5e78d5f languageName: node linkType: hard -"@smithy/protocol-http@npm:^5.2.1": - version: 5.2.1 - resolution: "@smithy/protocol-http@npm:5.2.1" +"@smithy/protocol-http@npm:^5.3.10": + version: 5.3.10 + resolution: "@smithy/protocol-http@npm:5.3.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/7e00b314d6b38d58f4ca692546642b6a641be564d67fc31bae227ec0f0fd8f568522752189727a45828654c6ebcab2784884d4058ce992d2f48fc63ab37f4c2c + checksum: 10/617835e3f9ccc30e8d03c364ec6617335088e02ad9117b7c1bee868ae14ce904dffee686be7f75ab955e6fe11f1976a17298cba88dd17db48148d34ed7a40c9e languageName: node linkType: hard -"@smithy/querystring-builder@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/querystring-builder@npm:4.1.1" +"@smithy/querystring-builder@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/querystring-builder@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-uri-escape": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-uri-escape": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/bbbfd564ccd585273df3829cc5e86572341cf22ed65477fdf31c8b9fc99759e872246ad419863efc259a110fbdab5bac408a5729abc8f883edd8390ae80aaf30 + checksum: 10/3c5fa9eea099ec1087dc05deaba0d482136b23cc5548f46acfec6b18690bb2ce0f591b8c441c45fcc6139682b54e032e17749ef21f795422bf6ff0966ab5d5c8 languageName: node linkType: hard -"@smithy/querystring-parser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/querystring-parser@npm:4.1.1" +"@smithy/querystring-parser@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/querystring-parser@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/08b81b7e8350d88b5a350cbe55c626c71bb86de06041e8311c44133919accba63b401672f84e65cbdbddce02a08b408da40669161d92af1d4d283dd167863aa5 + checksum: 10/676763166c3c34e8553ca5981f59313bc6d07177b2db83027be90ff1e89b1fe41912f39c23f3eeea01a58686adf465dcd74d2ccd1661dfc2860e915acbf957f8 languageName: node linkType: hard -"@smithy/service-error-classification@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/service-error-classification@npm:4.1.2" +"@smithy/service-error-classification@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/service-error-classification@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - checksum: 10/50e8835e9850167093db1a96e9265ee66991f8e03b44fd2f23c44114de5634d9d65dd80fc6f7f94ebba2f2e892f73a270bbfdca5c07bfc97bb36bbf3b95ad4a3 + "@smithy/types": "npm:^4.13.0" + checksum: 10/f535fddfb958440f008d6dabd50acf0bae3129923af5f3f94e9c30fe2695015ec2bae88e938ace195cae5f33337cc40fd32d376a199a48f6c37a01000e7510f3 languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^4.2.0": - version: 4.2.0 - resolution: "@smithy/shared-ini-file-loader@npm:4.2.0" +"@smithy/shared-ini-file-loader@npm:^4.4.5": + version: 4.4.5 + resolution: "@smithy/shared-ini-file-loader@npm:4.4.5" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ee67bbfbbde59407ef15777118cccc2ef39163f70efc0704044144dcd08019316b08ccdec5e8dc94fb17d2be6aeb256a2d7b790a36c9938b6149e2e4c646db89 + checksum: 10/84fca675b277b5bcadc107628fcfe6c33da0af590467c239c796f3bd921b65b96c42bc9620790f246ecd8c7a2cd09ef7605346aea9576e2b4b2044a38125e9c1 languageName: node linkType: hard -"@smithy/signature-v4@npm:^5.2.1": - version: 5.2.1 - resolution: "@smithy/signature-v4@npm:5.2.1" - dependencies: - "@smithy/is-array-buffer": "npm:^4.1.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-hex-encoding": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-uri-escape": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" +"@smithy/signature-v4@npm:^5.3.10": + version: 5.3.10 + resolution: "@smithy/signature-v4@npm:5.3.10" + dependencies: + "@smithy/is-array-buffer": "npm:^4.2.1" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-hex-encoding": "npm:^4.2.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-uri-escape": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/4f22b6f1a1d15c15627af64ea1490ce797f020fca3177b00ec54d89e72ecdce98ed71ec8a96ece638110ac0b331718065a8393687654776e6989a523f03703b0 + checksum: 10/654f621ede3bdcb68e655e2a310e948e81b347d56525ba893ff126149d1172ee7a224aeb59c9887065352191178cff745ce1025c21ad5a6e1487c7bd1438cda4 languageName: node linkType: hard -"@smithy/smithy-client@npm:^4.6.2, @smithy/smithy-client@npm:^4.6.3": - version: 4.6.3 - resolution: "@smithy/smithy-client@npm:4.6.3" - dependencies: - "@smithy/core": "npm:^3.11.1" - "@smithy/middleware-endpoint": "npm:^4.2.3" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-stream": "npm:^4.3.2" +"@smithy/smithy-client@npm:^4.12.0": + version: 4.12.0 + resolution: "@smithy/smithy-client@npm:4.12.0" + dependencies: + "@smithy/core": "npm:^3.23.6" + "@smithy/middleware-endpoint": "npm:^4.4.20" + "@smithy/middleware-stack": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-stream": "npm:^4.5.15" tslib: "npm:^2.6.2" - checksum: 10/7bf439f1b4d4b31e514090af7fa68c8cf3366e2293debcb8020ce38f0ff7e662464815bf1b4ff71e8bdc2a124d83b0658e8f585e7b4f642b982e757b79bce982 + checksum: 10/aa339275f3a2de7cabc463c173d8cdc4faebf958be357efb47243eba65e69e244c285563825f4d091df368256f7beffcb7410839fce4e42608b00dbaf816ed4c languageName: node linkType: hard -"@smithy/types@npm:^4.5.0": - version: 4.5.0 - resolution: "@smithy/types@npm:4.5.0" +"@smithy/types@npm:^4.13.0": + version: 4.13.0 + resolution: "@smithy/types@npm:4.13.0" dependencies: tslib: "npm:^2.6.2" - checksum: 10/d25275a0f1cb75dd3534a60a637b0202fbe1343703a448c410aa3e3029d5dc1d128c711c005bbda29a111af5a072aaf01bd8314a05c9806857d18e625f41c075 + checksum: 10/abcc033be2ee9500f4befd988879a5dcedbe460e445207095a17eb974f9f07ec31cbf0b27754b704a9ca9a4fc17891948026438d34215b84d539e4bdaf5ac7b6 languageName: node linkType: hard -"@smithy/url-parser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/url-parser@npm:4.1.1" +"@smithy/url-parser@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/url-parser@npm:4.2.10" dependencies: - "@smithy/querystring-parser": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/querystring-parser": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/35904bf3561d433f92c318c2f9d1fb8324e7693ea11af3e7570a334944f701e9c6720d5b426d93830e33cfe105dd026cd5fda842b20d14589ff62b9c67b4118b + checksum: 10/e86ae3397434c58b8a831048f8bb2bf76e7f2627fec58262ac92aa34f18daa98e708c7ba6c2549c4d587e7c836a8e318ebbe5e509adc3d442e9f8892bbc34174 languageName: node linkType: hard -"@smithy/util-base64@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-base64@npm:4.1.0" +"@smithy/util-base64@npm:^4.3.1": + version: 4.3.1 + resolution: "@smithy/util-base64@npm:4.3.1" dependencies: - "@smithy/util-buffer-from": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/util-buffer-from": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/980391b462ab5d8a99ce2ac55441b3bcaef73e197926327f32ef09d708535f6d0449eb05fa166d709e27fdeb212a60f201d6678f2c64122fce072ef3d82c0644 + checksum: 10/77dd092e73566ebb1a9942ec37bc0fcf861159a62f90c03a676c17826c1e43a6ad493fee65ddae2c0b4b3ce89b9f363cee2856fc6c2068fbb215320cf5e179b2 languageName: node linkType: hard -"@smithy/util-body-length-browser@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-body-length-browser@npm:4.1.0" +"@smithy/util-body-length-browser@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-body-length-browser@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/264b1b0f47127b1d215e95e7c66d3717b3f838d674b195e0150c8405e1875779694b3c75ab1932bf1a51c890ed495f7a9560a25c40e635d2f5585e496d9fbf77 + checksum: 10/2a5221e7d1b233a1182f1d9f754eb116b7cc86e3152beaff6941c1c55b863099fcab73795cffa299d522069fc5f74f985b4d6713a0913247d13d8936a4de1a2c languageName: node linkType: hard -"@smithy/util-body-length-node@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-body-length-node@npm:4.1.0" +"@smithy/util-body-length-node@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/util-body-length-node@npm:4.2.2" dependencies: tslib: "npm:^2.6.2" - checksum: 10/5a6d925afdebdcde7a7f1ce55e69d823c0a9b7a5ed8f899417c402952585784b0ac843932691875381ce389f0e5f543d25c9fe4a3d8addeddbd48124a8985b6b + checksum: 10/b6bea331247f3a81134fe2b3e07b3b00bab467dc45ccf4b1fb4dd98d51c9341ff7fdbd760532a84bd7b479387cc0af564760b06e58b9825e34c5ba171185c611 languageName: node linkType: hard @@ -6821,116 +6796,115 @@ __metadata: languageName: node linkType: hard -"@smithy/util-buffer-from@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-buffer-from@npm:4.1.0" +"@smithy/util-buffer-from@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-buffer-from@npm:4.2.1" dependencies: - "@smithy/is-array-buffer": "npm:^4.1.0" + "@smithy/is-array-buffer": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/b1337ac6874adac67bbc91144c6e0e760b194f44af91a9816812c042c19a83d552cd5c8a94b8ed01af6047d2163a854fc32ebcd957a6053b4fd27dedc8793bb5 + checksum: 10/686c8feafb751942caa60bbd47c6214acf75e8ac6118e5d0f9cee3d5a60be2dfa8f95a5955bbe65a53f8ad1136b2d446642ec343e37c8440b1852779040da46a languageName: node linkType: hard -"@smithy/util-config-provider@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-config-provider@npm:4.1.0" +"@smithy/util-config-provider@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-config-provider@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/b6daf4d12e721062d7b1888a14a760db23a3df388cced56ba47673cc1a3a24b8933190a7631be1cc548eb62fb5a3b5c34d6de2eb595ffdacdfd7e0dcb7fee5ef + checksum: 10/3d17e618d9427d049ce51c41ae75ceb7800f29f59babe2823783cd585d0922205046a660c49c1afefa57f00a5f20e428cbaf9ede68ad1fc99b415455d47befb4 languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.1.2": - version: 4.1.3 - resolution: "@smithy/util-defaults-mode-browser@npm:4.1.3" +"@smithy/util-defaults-mode-browser@npm:^4.3.36": + version: 4.3.36 + resolution: "@smithy/util-defaults-mode-browser@npm:4.3.36" dependencies: - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/smithy-client": "npm:^4.6.3" - "@smithy/types": "npm:^4.5.0" - bowser: "npm:^2.11.0" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/732b739d642c3111549e1667f72d4c6fcb07e09ed33448766b6bb4226f6acd98f52b198fac25351e2112384b365b79a90c34644ca6167f4786291a6a074cf506 + checksum: 10/8edbb9e7f5970bfabd29de066a8f59d18f437b11f1150e54421795cdf648b288c6019f07259c5a8cd63196252301f59b3963b959904c7df12bfd657a19f952f7 languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^4.1.2": - version: 4.1.3 - resolution: "@smithy/util-defaults-mode-node@npm:4.1.3" - dependencies: - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/credential-provider-imds": "npm:^4.1.2" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/smithy-client": "npm:^4.6.3" - "@smithy/types": "npm:^4.5.0" +"@smithy/util-defaults-mode-node@npm:^4.2.39": + version: 4.2.39 + resolution: "@smithy/util-defaults-mode-node@npm:4.2.39" + dependencies: + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/credential-provider-imds": "npm:^4.2.10" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/a882d3edc30781cce987ab9a9d15f60b0083e36f703a4601f4800d9aea2dee1db60dfc4c73f6656c298c78a62917acb24624d145ef2dd25143a8bd55713bf6de + checksum: 10/999faa0a8abc2273a1134f0fbfb9fb68aee8da6b0a651c6a1453b492bbf2308bb0f26075f50c748c1e3ccf7159fe77db35714fe197f71c112b749f53e9cd8abe languageName: node linkType: hard -"@smithy/util-endpoints@npm:^3.1.2": - version: 3.1.2 - resolution: "@smithy/util-endpoints@npm:3.1.2" +"@smithy/util-endpoints@npm:^3.3.1": + version: 3.3.1 + resolution: "@smithy/util-endpoints@npm:3.3.1" dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/4310b3ae356d69f5bc6a7b3477ac5c16b0d014fe5c36db3445c010bfcea43f8b5de7abcb118f6935ccf9b41b9dcb6f17ca60792a68074c5b3ac70332dbc3c4b2 + checksum: 10/75f6bc5d467981b8c4caf9e10ae1b47ca1534b2565fd33f36beffdd6b73c80951ed408df922a2d7ba013d988c1a73abea04317a99613012acb5b898a950484f8 languageName: node linkType: hard -"@smithy/util-hex-encoding@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-hex-encoding@npm:4.1.0" +"@smithy/util-hex-encoding@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-hex-encoding@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/dc66a330ba5e4a7e034c75ff6bf823e7a3dd9df3283511f0e5e95797063f3a82cd1d68d1bdb2353b33502e7a2ae6806ae195a964c2e3339547e972d917c78ea4 + checksum: 10/5b1a486d9b36feffa542cfa012ca8067b95f512ee020113a666e78f879b103cd0e1826cfae4f668f2a0c2e0f58d322580176fea930d49511c4d885e2764ab86b languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/util-middleware@npm:4.1.1" +"@smithy/util-middleware@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/util-middleware@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/bc80179fb554271dd44a9eb8403f09a2ed4f14de5ee1ba44fea17d8ee2d5b2178a433a24c85ee8898d7a69b45a8cf5978b3ef71866b6b461179a7c4ef4e79b58 + checksum: 10/609f3d0fc1ca3b47aaa3c8fea0b9cb7a9c2c651c3c8a4806633aa271daeba2b1e8bd5c32df04e0a8ad882cd0996d77434af28e9230ecd9382c0474a3fcb66a94 languageName: node linkType: hard -"@smithy/util-retry@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/util-retry@npm:4.1.2" +"@smithy/util-retry@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/util-retry@npm:4.2.10" dependencies: - "@smithy/service-error-classification": "npm:^4.1.2" - "@smithy/types": "npm:^4.5.0" + "@smithy/service-error-classification": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/3daf4b560de5dff99c14661b7ae5c4456b7b99642141cd4c7dccb281579435edecd22695a9fe78d47e716c85e25c9bbc555d44598f460f01f2d28d9182834dd4 + checksum: 10/a47b04d3faeb195f5147bbf876e75d5cc2beabe1c55990b9b6c2ae6456243ab942fd9bedc5945f165c951c0d30d56f0e2c6042968047046c8773a30b35b9a9e5 languageName: node linkType: hard -"@smithy/util-stream@npm:^4.3.1, @smithy/util-stream@npm:^4.3.2": - version: 4.3.2 - resolution: "@smithy/util-stream@npm:4.3.2" - dependencies: - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-buffer-from": "npm:^4.1.0" - "@smithy/util-hex-encoding": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" +"@smithy/util-stream@npm:^4.5.15": + version: 4.5.15 + resolution: "@smithy/util-stream@npm:4.5.15" + dependencies: + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-buffer-from": "npm:^4.2.1" + "@smithy/util-hex-encoding": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/244739dcb05c1d1cb3e7b2cad313475605846fb1a264220d97777d35ab4c676a9e71a4443fb9f04b5ed0f6cd28c74f692ce75b14840429b0e28abffb6ab10ebb + checksum: 10/97b23cf181cfc39dd21f1d77ccc4723c3914408d3901e39e9f2c49b744886d6587efb54fca16b4ccab3b0fe525d1ff79cc3860edd84a2a8b715314a8ee6064ed languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-uri-escape@npm:4.1.0" +"@smithy/util-uri-escape@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-uri-escape@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/c576cb2b7d365d02338734efd83d8b9d2e5ab7ea5a91444762ace367b6fe46e060a2a85ba51ba84ca5ac73b3e732436b22fb61359af4b731b41c1f803f3055ff + checksum: 10/16a75ad9686d1d972255f18fdf275b798ed9849917e02cac23213af28af5931149e0916c9742d1c45f78a232c2c89cd9a0dca653baa0db36becb1244e6b9c05c languageName: node linkType: hard @@ -6944,24 +6918,33 @@ __metadata: languageName: node linkType: hard -"@smithy/util-utf8@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-utf8@npm:4.1.0" +"@smithy/util-utf8@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-utf8@npm:4.2.1" dependencies: - "@smithy/util-buffer-from": "npm:^4.1.0" + "@smithy/util-buffer-from": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/4565df6e64df958d2e45da4344d3206a81e66b6e6a48734a45b5228fe73c5c5982ec52beedc8065ab73d169a278f9028438a60410a6daa1d40aebd9dd6122a07 + checksum: 10/ff8ee4e26b6222d358cd3b9ef52bbdfb2500a2952f439aa0264a127c4235508681648600b6def3ce7d276c03b16fe79bb5a38430ec2e46e41185412790353ee7 languageName: node linkType: hard -"@smithy/util-waiter@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/util-waiter@npm:4.1.1" +"@smithy/util-waiter@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/util-waiter@npm:4.2.10" dependencies: - "@smithy/abort-controller": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/abort-controller": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/019eecded24b9244675da3b956f572261e333d8d2b0d0555f9c85c893f2583f113bf0210521876e825943085d2d89e7e4fdb768cdc802627b9660d809734cce3 + checksum: 10/0b310d9f9a523ba069a9251a80ecebf6e53bf7fb192bcc5defa9deb02ef33863a09621a9fb3d8be1ff149390562ef9ee5ee042fe5ccf8358464ba24d3d60c2b0 + languageName: node + linkType: hard + +"@smithy/uuid@npm:^1.1.1": + version: 1.1.1 + resolution: "@smithy/uuid@npm:1.1.1" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/26acc5b818d219ec049c1877857afc783dd9c4cb62234b61d1c18b1465ec731ec0aea902bdf6f58f730a4bf72d9564559b1fb14c94ceaafe3d41f6923745a97c languageName: node linkType: hard @@ -8130,13 +8113,6 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^9.0.1": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: 10/b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 - languageName: node - linkType: hard - "@types/wrap-ansi@npm:^3.0.0": version: 3.0.0 resolution: "@types/wrap-ansi@npm:3.0.0" @@ -9685,14 +9661,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.12.0": - version: 1.12.2 - resolution: "axios@npm:1.12.2" +"axios@npm:^1.13.5": + version: 1.13.5 + resolution: "axios@npm:1.13.5" dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.4" + follow-redirects: "npm:^1.15.11" + form-data: "npm:^4.0.5" proxy-from-env: "npm:^1.1.0" - checksum: 10/886a79770594eaad76493fecf90344b567bd956240609b5dcd09bd0afe8d3e6f1ad6d3257a93a483b6192b409d4b673d9515a34619e3e3ed1b2c0ec2a83b20ba + checksum: 10/db726d09902565ef9a0632893530028310e2ec2b95b727114eca1b101450b00014133dfc3871cffc87983fb922bca7e4874d7e2826d1550a377a157cdf3f05b6 languageName: node linkType: hard @@ -9863,9 +9839,9 @@ __metadata: linkType: hard "basic-ftp@npm:^5.0.2": - version: 5.0.5 - resolution: "basic-ftp@npm:5.0.5" - checksum: 10/3dc56b2092b10d67e84621f5b9bbb0430469499178e857869194184d46fbdd367a9aa9fad660084388744b074b5f540e6ac8c22c0826ebba4fcc86a9d1c324e2 + version: 5.2.0 + resolution: "basic-ftp@npm:5.2.0" + checksum: 10/f5a15d789aa98859af4da9e976154b2aeae19052e1762dc68d259d2bce631dafa40c667aa06d7346cd630aa6f9cc9a26f515b468e0bd24243fbae2149c7d01ad languageName: node linkType: hard @@ -13203,25 +13179,33 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:5.2.5": - version: 5.2.5 - resolution: "fast-xml-parser@npm:5.2.5" +"fast-xml-builder@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-xml-builder@npm:1.0.0" + checksum: 10/06c04d80545e5c9f4d1d6cca00567b5cc09953a92c6328fa48cfb4d7f42630313b8c2bb62e9cb81accee7bb5e1c5312fcae06c3d20dbe52d969a5938233316da + languageName: node + linkType: hard + +"fast-xml-parser@npm:5.3.6": + version: 5.3.6 + resolution: "fast-xml-parser@npm:5.3.6" dependencies: - strnum: "npm:^2.1.0" + strnum: "npm:^2.1.2" bin: fxparser: src/cli/cli.js - checksum: 10/305017cff6968a34cbac597317be1516e85c44f650f30d982c84f8c30043e81fd38d39a8810d570136c921399dd43b9ac4775bdfbbbcfee96456f3c086b48bdd + checksum: 10/03527ab0bdf49d960fdc8f6088cd0715c052e06b68b39459da87b1a1fbb3439a855b2d83cbf3c400e983b8e668b396296b072a4dd5c63403cf1e618c9326b6df languageName: node linkType: hard -"fast-xml-parser@npm:^4.4.1": - version: 4.5.1 - resolution: "fast-xml-parser@npm:4.5.1" +"fast-xml-parser@npm:^5.3.4": + version: 5.4.1 + resolution: "fast-xml-parser@npm:5.4.1" dependencies: - strnum: "npm:^1.0.5" + fast-xml-builder: "npm:^1.0.0" + strnum: "npm:^2.1.2" bin: fxparser: src/cli/cli.js - checksum: 10/17ce5908e798de1b6d12a39d26f04ac3b582ea9ce28f3a6e3b9c401edcb74790f28df84d75377608af53308ff8caad2b244ba1283cc4b5b4cf4cc7bd532a9983 + checksum: 10/2b40067c3ad3542ca197d1353bcb0416cd5db20d5c66d74ac176b99af6ff9bd55a6182d36856a2fd477c95b8fc1f07405475f1662a31185480130ba7076c702a languageName: node linkType: hard @@ -13428,13 +13412,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.11": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10/70c7612c4cab18e546e36b991bbf8009a1a41cf85354afe04b113d1117569abf760269409cb3eb842d9f7b03d62826687086b081c566ea7b1e6613cf29030bf7 + checksum: 10/07372fd74b98c78cf4d417d68d41fdaa0be4dcacafffb9e67b1e3cf090bc4771515e65020651528faab238f10f9b9c0d9707d6c1574a6c0387c5de1042cde9ba languageName: node linkType: hard @@ -13478,7 +13462,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0, form-data@npm:^4.0.4": +"form-data@npm:^4.0.0": version: 4.0.4 resolution: "form-data@npm:4.0.4" dependencies: @@ -13491,6 +13475,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.5": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10/52ecd6e927c8c4e215e68a7ad5e0f7c1031397439672fd9741654b4a94722c4182e74cc815b225dcb5be3f4180f36428f67c6dd39eaa98af0dcfdd26c00c19cd + languageName: node + linkType: hard + "formidable@npm:^2.1.2": version: 2.1.2 resolution: "formidable@npm:2.1.2" @@ -20649,17 +20646,10 @@ __metadata: languageName: node linkType: hard -"strnum@npm:^1.0.5": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 10/d3117975db8372d4d7b2c07601ed2f65bf21cc48d741f37a8617b76370d228f2ec26336e53791ebc3638264d23ca54e6c241f57f8c69bd4941c63c79440525ca - languageName: node - linkType: hard - -"strnum@npm:^2.1.0": - version: 2.1.1 - resolution: "strnum@npm:2.1.1" - checksum: 10/d5fe6e4333cddc17569331048e403e876ffcf629989815f0359b0caf05dae9441b7eef3d7dd07427313ac8b3f05a8f60abc1f61efc15f97245dbc24028362bc9 +"strnum@npm:^2.1.2": + version: 2.1.2 + resolution: "strnum@npm:2.1.2" + checksum: 10/7d894dff385e3a5c5b29c012cf0a7ea7962a92c6a299383c3d6db945ad2b6f3e770511356a9774dbd54444c56af1dc7c435dad6466c47293c48173274dd6c631 languageName: node linkType: hard From 619f522a17fd8b9ff64cc8647467db5c2b39b23a Mon Sep 17 00:00:00 2001 From: alexghr Date: Fri, 27 Feb 2026 12:23:21 +0000 Subject: [PATCH 3/7] refactor(aztec-node): skip unnecessary subsystems in prover-only mode and remove P2PClientType enum (#20848) --- .../aztec-node/src/aztec-node/server.ts | 131 ++++++++++-------- yarn-project/end-to-end/src/fixtures/setup.ts | 7 +- yarn-project/p2p/src/client/factory.ts | 21 ++- yarn-project/p2p/src/client/interface.ts | 12 +- .../p2p/src/client/p2p_client.test.ts | 13 +- yarn-project/p2p/src/client/p2p_client.ts | 14 +- .../proposal_tx_collector_worker.ts | 3 +- .../services/libp2p/libp2p_service.test.ts | 3 +- .../p2p/src/services/libp2p/libp2p_service.ts | 16 +-- .../src/test-helpers/make-test-p2p-clients.ts | 2 - .../p2p/src/test-helpers/mock-pubsub.ts | 9 +- .../p2p/src/test-helpers/reqresp-nodes.ts | 7 +- .../testbench/p2p_client_testbench_worker.ts | 8 +- yarn-project/stdlib/src/interfaces/p2p.ts | 15 +- yarn-project/stdlib/src/p2p/client_type.ts | 6 - yarn-project/stdlib/src/p2p/index.ts | 1 - yarn-project/stdlib/src/p2p/topic_type.ts | 23 ++- yarn-project/stdlib/src/p2p/topics.test.ts | 15 +- 18 files changed, 118 insertions(+), 188 deletions(-) diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index 99481ba2373e..4670222c1125 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -79,7 +79,6 @@ import { import type { DebugLogStore, LogFilter, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs'; import { InMemoryDebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs'; import { InboxLeaf, type L1ToL2MessageSource } from '@aztec/stdlib/messaging'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import type { Offense, SlashPayloadRound } from '@aztec/stdlib/slashing'; import type { NullifierLeafPreimage, PublicDataTreeLeaf, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees'; import { MerkleTreeId, NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees'; @@ -194,7 +193,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { logger?: Logger; publisher?: SequencerPublisher; dateProvider?: DateProvider; - p2pClientDeps?: P2PClientDeps; + p2pClientDeps?: P2PClientDeps; proverNodeDeps?: Partial; } = {}, options: { @@ -325,9 +324,13 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { const proofVerifier = new QueuedIVCVerifier(config, circuitVerifier); + const proverOnly = config.enableProverNode && config.disableValidator; + if (proverOnly) { + log.info('Starting in prover-only mode: skipping validator, sequencer, sentinel, and slasher subsystems'); + } + // create the tx pool and the p2p client, which will need the l2 block source const p2pClient = await createP2PClient( - P2PClientType.Full, config, archiver, proofVerifier, @@ -342,7 +345,10 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { // We should really not be modifying the config object config.txPublicSetupAllowList = config.txPublicSetupAllowList ?? (await getDefaultAllowedSetupFunctions()); - // Create FullNodeCheckpointsBuilder for validator and non-validator block proposal handling + // We'll accumulate sentinel watchers here + const watchers: Watcher[] = []; + + // Create FullNodeCheckpointsBuilder for block proposal handling and tx validation const validatorCheckpointsBuilder = new FullNodeCheckpointsBuilder( { ...config, l1GenesisTime, slotDuration: Number(slotDuration) }, worldStateSynchronizer, @@ -351,47 +357,48 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { telemetry, ); - // We'll accumulate sentinel watchers here - const watchers: Watcher[] = []; - - // Create validator client if required - const validatorClient = await createValidatorClient(config, { - checkpointsBuilder: validatorCheckpointsBuilder, - worldState: worldStateSynchronizer, - p2pClient, - telemetry, - dateProvider, - epochCache, - blockSource: archiver, - l1ToL2MessageSource: archiver, - keyStoreManager, - blobClient, - }); - - // If we have a validator client, register it as a source of offenses for the slasher, - // and have it register callbacks on the p2p client *before* we start it, otherwise messages - // like attestations or auths will fail. - if (validatorClient) { - watchers.push(validatorClient); - if (!options.dontStartSequencer) { - await validatorClient.registerHandlers(); - } - } + let validatorClient: ValidatorClient | undefined; - // If there's no validator client but alwaysReexecuteBlockProposals is enabled, - // create a BlockProposalHandler to reexecute block proposals for monitoring - if (!validatorClient && config.alwaysReexecuteBlockProposals) { - log.info('Setting up block proposal reexecution for monitoring'); - createBlockProposalHandler(config, { + if (!proverOnly) { + // Create validator client if required + validatorClient = await createValidatorClient(config, { checkpointsBuilder: validatorCheckpointsBuilder, worldState: worldStateSynchronizer, + p2pClient, + telemetry, + dateProvider, epochCache, blockSource: archiver, l1ToL2MessageSource: archiver, - p2pClient, - dateProvider, - telemetry, - }).registerForReexecution(p2pClient); + keyStoreManager, + blobClient, + }); + + // If we have a validator client, register it as a source of offenses for the slasher, + // and have it register callbacks on the p2p client *before* we start it, otherwise messages + // like attestations or auths will fail. + if (validatorClient) { + watchers.push(validatorClient); + if (!options.dontStartSequencer) { + await validatorClient.registerHandlers(); + } + } + + // If there's no validator client but alwaysReexecuteBlockProposals is enabled, + // create a BlockProposalHandler to reexecute block proposals for monitoring + if (!validatorClient && config.alwaysReexecuteBlockProposals) { + log.info('Setting up block proposal reexecution for monitoring'); + createBlockProposalHandler(config, { + checkpointsBuilder: validatorCheckpointsBuilder, + worldState: worldStateSynchronizer, + epochCache, + blockSource: archiver, + l1ToL2MessageSource: archiver, + p2pClient, + dateProvider, + telemetry, + }).registerForReexecution(p2pClient); + } } // Start world state and wait for it to sync to the archiver. @@ -400,29 +407,33 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { // Start p2p. Note that it depends on world state to be running. await p2pClient.start(); - const validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config); - if (validatorsSentinel && config.slashInactivityPenalty > 0n) { - watchers.push(validatorsSentinel); - } - + let validatorsSentinel: Awaited> | undefined; let epochPruneWatcher: EpochPruneWatcher | undefined; - if (config.slashPrunePenalty > 0n || config.slashDataWithholdingPenalty > 0n) { - epochPruneWatcher = new EpochPruneWatcher( - archiver, - archiver, - epochCache, - p2pClient.getTxProvider(), - validatorCheckpointsBuilder, - config, - ); - watchers.push(epochPruneWatcher); - } - - // We assume we want to slash for invalid attestations unless all max penalties are set to 0 let attestationsBlockWatcher: AttestationsBlockWatcher | undefined; - if (config.slashProposeInvalidAttestationsPenalty > 0n || config.slashAttestDescendantOfInvalidPenalty > 0n) { - attestationsBlockWatcher = new AttestationsBlockWatcher(archiver, epochCache, config); - watchers.push(attestationsBlockWatcher); + + if (!proverOnly) { + validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config); + if (validatorsSentinel && config.slashInactivityPenalty > 0n) { + watchers.push(validatorsSentinel); + } + + if (config.slashPrunePenalty > 0n || config.slashDataWithholdingPenalty > 0n) { + epochPruneWatcher = new EpochPruneWatcher( + archiver, + archiver, + epochCache, + p2pClient.getTxProvider(), + validatorCheckpointsBuilder, + config, + ); + watchers.push(epochPruneWatcher); + } + + // We assume we want to slash for invalid attestations unless all max penalties are set to 0 + if (config.slashProposeInvalidAttestationsPenalty > 0n || config.slashAttestDescendantOfInvalidPenalty > 0n) { + attestationsBlockWatcher = new AttestationsBlockWatcher(archiver, epochCache, config); + watchers.push(attestationsBlockWatcher); + } } // Start p2p-related services once the archiver has completed sync diff --git a/yarn-project/end-to-end/src/fixtures/setup.ts b/yarn-project/end-to-end/src/fixtures/setup.ts index 6def0cbc67f6..abfd4da901e0 100644 --- a/yarn-project/end-to-end/src/fixtures/setup.ts +++ b/yarn-project/end-to-end/src/fixtures/setup.ts @@ -49,7 +49,6 @@ import type { SequencerClient } from '@aztec/sequencer-client'; import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract'; import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client'; import { tryStop } from '@aztec/stdlib/interfaces/server'; -import type { P2PClientType } from '@aztec/stdlib/p2p'; import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees'; import { type TelemetryClient, @@ -456,7 +455,7 @@ export async function setup( } let mockGossipSubNetwork: MockGossipSubNetwork | undefined; - let p2pClientDeps: P2PClientDeps | undefined = undefined; + let p2pClientDeps: P2PClientDeps | undefined = undefined; if (opts.mockGossipSubNetwork) { mockGossipSubNetwork = new MockGossipSubNetwork(); @@ -503,7 +502,7 @@ export async function setup( const proverNodePrivateKeyHex: Hex = `0x${proverNodePrivateKey!.toString('hex')}`; const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex')); - const p2pClientDeps: Partial> = { + const p2pClientDeps: Partial = { p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork!), rpcTxProviders: [aztecNodeService], }; @@ -719,7 +718,7 @@ export function createAndSyncProverNode( deps: { telemetry?: TelemetryClient; dateProvider: DateProvider; - p2pClientDeps?: P2PClientDeps; + p2pClientDeps?: P2PClientDeps; }, options: { prefilledPublicData: PublicDataTreeLeaf[]; dontStart?: boolean }, ): Promise<{ proverNode: AztecNodeService }> { diff --git a/yarn-project/p2p/src/client/factory.ts b/yarn-project/p2p/src/client/factory.ts index 9cc4d53b18de..c6b431ca5a12 100644 --- a/yarn-project/p2p/src/client/factory.ts +++ b/yarn-project/p2p/src/client/factory.ts @@ -9,7 +9,6 @@ import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ChainConfig } from '@aztec/stdlib/config'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { AztecNode, ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; import { P2PClient } from '../client/p2p_client.js'; @@ -27,14 +26,14 @@ import { NodeRpcTxSource, type TxSource, createNodeRpcTxSources } from '../servi import { TxFileStore } from '../services/tx_file_store/tx_file_store.js'; import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js'; -export type P2PClientDeps = { +export type P2PClientDeps = { txPool?: TxPoolV2; store?: AztecAsyncKVStore; attestationPool?: AttestationPoolApi; logger?: Logger; txCollectionNodeSources?: TxSource[]; rpcTxProviders?: AztecNode[]; - p2pServiceFactory?: (...args: Parameters<(typeof LibP2PService)['new']>) => Promise>; + p2pServiceFactory?: (...args: Parameters<(typeof LibP2PService)['new']>) => Promise; }; export const P2P_STORE_NAME = 'p2p'; @@ -42,8 +41,7 @@ export const P2P_ARCHIVE_STORE_NAME = 'p2p-archive'; export const P2P_PEER_STORE_NAME = 'p2p-peers'; export const P2P_ATTESTATION_STORE_NAME = 'p2p-attestation'; -export async function createP2PClient( - clientType: T, +export async function createP2PClient( inputConfig: P2PConfig & DataStoreConfig & ChainConfig, archiver: L2BlockSource & ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, @@ -52,7 +50,7 @@ export async function createP2PClient( packageVersion: string, dateProvider: DateProvider = new DateProvider(), telemetry: TelemetryClient = getTelemetryClient(), - deps: P2PClientDeps = {}, + deps: P2PClientDeps = {}, ) { const config = await configureP2PClientAddresses({ ...inputConfig, @@ -110,9 +108,8 @@ export async function createP2PClient( attestationPool: deps.attestationPool ?? new AttestationPool(attestationStore, telemetry), }; - const p2pService = await createP2PService( + const p2pService = await createP2PService( config, - clientType, archiver, proofVerifier, worldStateSynchronizer, @@ -170,7 +167,6 @@ export async function createP2PClient( ); return new P2PClient( - clientType, store, archiver, mempools, @@ -184,9 +180,8 @@ export async function createP2PClient( ); } -async function createP2PService( +async function createP2PService( config: P2PConfig & DataStoreConfig, - clientType: T, archiver: L2BlockSource & ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, @@ -194,7 +189,7 @@ async function createP2PService( store: AztecAsyncKVStore, peerStore: AztecLMDBStoreV2, mempools: MemPools, - p2pServiceFactory: P2PClientDeps['p2pServiceFactory'], + p2pServiceFactory: P2PClientDeps['p2pServiceFactory'], packageVersion: string, logger: Logger, telemetry: TelemetryClient, @@ -210,7 +205,7 @@ async function createP2PService( const peerIdPrivateKey = await getPeerIdPrivateKey(config, store, logger); const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey.getValue()); - const p2pService = await (p2pServiceFactory ?? LibP2PService.new)(clientType, config, peerId, { + const p2pService = await (p2pServiceFactory ?? LibP2PService.new)(config, peerId, { packageVersion, mempools, l2BlockSource: archiver, diff --git a/yarn-project/p2p/src/client/interface.ts b/yarn-project/p2p/src/client/interface.ts index 220802ee1b85..3ba683362f39 100644 --- a/yarn-project/p2p/src/client/interface.ts +++ b/yarn-project/p2p/src/client/interface.ts @@ -1,13 +1,7 @@ import type { SlotNumber } from '@aztec/foundation/branded-types'; import type { EthAddress, L2BlockId } from '@aztec/stdlib/block'; -import type { ITxProvider, P2PApiFull } from '@aztec/stdlib/interfaces/server'; -import type { - BlockProposal, - CheckpointAttestation, - CheckpointProposal, - P2PClientType, - TopicType, -} from '@aztec/stdlib/p2p'; +import type { ITxProvider, P2PClient } from '@aztec/stdlib/interfaces/server'; +import type { BlockProposal, CheckpointAttestation, CheckpointProposal, TopicType } from '@aztec/stdlib/p2p'; import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx'; import type { PeerId } from '@libp2p/interface'; @@ -54,7 +48,7 @@ export interface P2PSyncState { /** * Interface of a P2P client. **/ -export type P2P = P2PApiFull & { +export type P2P = P2PClient & { /** * Broadcasts a block proposal to other peers. * diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 9dc1c59982f4..20a41e28ec11 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -7,7 +7,6 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { L2Block } from '@aztec/stdlib/block'; import { EmptyL1RollupConstants, type L1RollupConstants } from '@aztec/stdlib/epoch-helpers'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import { mockTx } from '@aztec/stdlib/testing'; import { TxHash } from '@aztec/stdlib/tx'; @@ -62,17 +61,7 @@ describe('P2P Client', () => { }); const createClient = (config: Partial = {}) => - new P2PClient( - P2PClientType.Full, - kvStore, - blockSource, - mempools, - p2pService, - txCollection, - undefined, - epochCache, - config, - ); + new P2PClient(kvStore, blockSource, mempools, p2pService, txCollection, undefined, epochCache, config); const advanceToProvenBlock = async (blockNumber: BlockNumber) => { blockSource.setProvenBlockNumber(blockNumber); diff --git a/yarn-project/p2p/src/client/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts index 0f6941d213e2..7996594ff9cb 100644 --- a/yarn-project/p2p/src/client/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -20,13 +20,7 @@ import { import type { ContractDataSource } from '@aztec/stdlib/contract'; import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers'; import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server'; -import { - type BlockProposal, - CheckpointAttestation, - type CheckpointProposal, - type P2PClientType, - type TopicType, -} from '@aztec/stdlib/p2p'; +import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p'; import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx'; import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client'; @@ -59,10 +53,7 @@ import { type P2P, P2PClientState, type P2PSyncState } from './interface.js'; /** * The P2P client implementation. */ -export class P2PClient - extends WithTracer - implements P2P, P2P -{ +export class P2PClient extends WithTracer implements P2P { /** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */ private runningPromise!: Promise; @@ -94,7 +85,6 @@ export class P2PClient private slotMonitor: RunningPromise | undefined; constructor( - _clientType: T, private store: AztecAsyncKVStore, private l2BlockSource: L2BlockSource & ContractDataSource, mempools: MemPools, diff --git a/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts b/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts index 655becaf4173..e1f054b98a02 100644 --- a/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +++ b/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts @@ -8,7 +8,7 @@ import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType, PeerErrorSeverity } from '@aztec/stdlib/p2p'; +import { PeerErrorSeverity } from '@aztec/stdlib/p2p'; import type { Tx, TxValidationResult } from '@aztec/stdlib/tx'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; @@ -114,7 +114,6 @@ async function startClient(config: P2PConfig, clientIndex: number) { }; client = await createP2PClient( - P2PClientType.Full, config as P2PConfig & DataStoreConfig, l2BlockSource as L2BlockSource & ContractDataSource, proofVerifier as ClientProtocolCircuitVerifier, diff --git a/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts b/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts index d9bf686d8f70..a0e812112a30 100644 --- a/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts +++ b/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts @@ -9,7 +9,7 @@ import { openTmpStore } from '@aztec/kv-store/lmdb'; import { L2Block, type L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server'; -import { BlockProposal, P2PClientType, PeerErrorSeverity } from '@aztec/stdlib/p2p'; +import { BlockProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p'; import { makeBlockHeader, makeBlockProposal, @@ -1118,7 +1118,6 @@ class TestLibP2PService extends LibP2PService { }); super( - P2PClientType.Full, mockConfig, node, mockPeerDiscoveryService, diff --git a/yarn-project/p2p/src/services/libp2p/libp2p_service.ts b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts index 5d6edd034eb9..8da82a7d195b 100644 --- a/yarn-project/p2p/src/services/libp2p/libp2p_service.ts +++ b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts @@ -16,13 +16,12 @@ import { CheckpointProposal, type CheckpointProposalCore, type Gossipable, - P2PClientType, P2PMessage, type ValidationResult as P2PValidationResult, PeerErrorSeverity, TopicType, createTopicString, - getTopicsForClientAndConfig, + getTopicsForConfig, metricsTopicStrToLabels, } from '@aztec/stdlib/p2p'; import { MerkleTreeId } from '@aztec/stdlib/trees'; @@ -135,7 +134,7 @@ type ReceivedMessageValidationResult = /** * Lib P2P implementation of the P2PService interface. */ -export class LibP2PService extends WithTracer implements P2PService { +export class LibP2PService extends WithTracer implements P2PService { private discoveryRunningPromise?: RunningPromise; private msgIdSeenValidators: Record = {} as Record; @@ -182,7 +181,6 @@ export class LibP2PService extends protected logger: Logger; constructor( - private clientType: T, private config: P2PConfig, protected node: PubSubLibp2p, private peerDiscoveryService: PeerDiscoveryService, @@ -266,8 +264,7 @@ export class LibP2PService extends * @param txPool - The transaction pool to be accessed by the service. * @returns The new service. */ - public static async new( - clientType: T, + public static async new( config: P2PConfig, peerId: PeerId, deps: { @@ -479,7 +476,6 @@ export class LibP2PService extends peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId); return new LibP2PService( - clientType, config, node, peerDiscoveryService, @@ -553,7 +549,7 @@ export class LibP2PService extends await this.node.start(); // Subscribe to standard GossipSub topics by default - for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)) { + for (const topic of getTopicsForConfig(this.config.disableTransactions)) { this.subscribeToTopic(this.topicStrings[topic]); } @@ -822,9 +818,7 @@ export class LibP2PService extends if (msg.topic === this.topicStrings[TopicType.tx]) { await this.handleGossipedTx(p2pMessage.payload, msgId, source); } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) { - if (this.clientType === P2PClientType.Full) { - await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source); - } + await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source); } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) { await this.processBlockFromPeer(p2pMessage.payload, msgId, source); } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) { diff --git a/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts b/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts index b0c69cb7ebe5..1bb554f79b06 100644 --- a/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts +++ b/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts @@ -7,7 +7,6 @@ import { sleep } from '@aztec/foundation/sleep'; import type { DataStoreConfig } from '@aztec/kv-store/config'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import { createP2PClient } from '../client/index.js'; import type { P2PClient } from '../client/p2p_client.js'; @@ -98,7 +97,6 @@ export async function makeTestP2PClient( const kvStore = await openTmpStore('test'); const client = await createP2PClient( - P2PClientType.Full, config, l2BlockSource, proofVerifier, diff --git a/yarn-project/p2p/src/test-helpers/mock-pubsub.ts b/yarn-project/p2p/src/test-helpers/mock-pubsub.ts index 03d50870945d..cf48654e0aff 100644 --- a/yarn-project/p2p/src/test-helpers/mock-pubsub.ts +++ b/yarn-project/p2p/src/test-helpers/mock-pubsub.ts @@ -4,7 +4,6 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store'; import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import type { TelemetryClient } from '@aztec/telemetry-client'; import type { GossipsubEvents, GossipsubMessage } from '@chainsafe/libp2p-gossipsub'; @@ -42,11 +41,10 @@ type GossipSubService = PubSubLibp2p['services']['pubsub']; * Given a mock gossip sub network, returns a factory function that creates an instance LibP2PService connected to it. * Designed to be used in tests in P2PClientDeps.p2pServiceFactory. */ -export function getMockPubSubP2PServiceFactory( +export function getMockPubSubP2PServiceFactory( network: MockGossipSubNetwork, -): (...args: Parameters<(typeof LibP2PService)['new']>) => Promise> { +): (...args: Parameters<(typeof LibP2PService)['new']>) => Promise { return ( - clientType: P2PClientType, config: P2PConfig, peerId: PeerId, deps: { @@ -66,8 +64,7 @@ export function getMockPubSubP2PServiceFactory( const peerManager = new DummyPeerManager(peerId, network); const reqresp: ReqRespInterface = new MockReqResp(peerId, network); const peerDiscoveryService = new DummyPeerDiscoveryService(); - const service = new LibP2PService( - clientType as T, + const service = new LibP2PService( config, libp2p, peerDiscoveryService, diff --git a/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts b/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts index a3c0fe5443b9..f0e6f04232e2 100644 --- a/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts +++ b/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts @@ -12,7 +12,6 @@ import type { IVCProofVerificationResult, WorldStateSynchronizer, } from '@aztec/stdlib/interfaces/server'; -import type { P2PClientType } from '@aztec/stdlib/p2p'; import type { Tx } from '@aztec/stdlib/tx'; import { compressComponentVersions } from '@aztec/stdlib/versioning'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; @@ -107,8 +106,7 @@ export async function createLibp2pNode( * * */ -export async function createTestLibP2PService( - clientType: T, +export async function createTestLibP2PService( boostrapAddrs: string[] = [], archiver: L2BlockSource & ContractDataSource, worldStateSynchronizer: WorldStateSynchronizer, @@ -159,8 +157,7 @@ export async function createTestLibP2PService( p2pNode.services.pubsub.score.params.appSpecificScore = (peerId: string) => peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId); - return new LibP2PService( - clientType, + return new LibP2PService( config, p2pNode as PubSubLibp2p, discoveryService, diff --git a/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts b/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts index a44fa2808dea..dc2fa88beb89 100644 --- a/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts +++ b/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts @@ -19,7 +19,7 @@ import { protocolContractsHash } from '@aztec/protocol-contracts'; import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p'; +import { type BlockProposal, P2PMessage } from '@aztec/stdlib/p2p'; import { ChonkProof } from '@aztec/stdlib/proofs'; import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing'; import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx'; @@ -86,12 +86,11 @@ export interface BenchReadyMessage { } const txCache = new Map(); -class TestLibP2PService extends LibP2PService { +class TestLibP2PService extends LibP2PService { private disableTxValidation: boolean; private gossipMessageCount = 0; constructor( - clientType: T, config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, @@ -107,7 +106,6 @@ class TestLibP2PService extends Li disableTxValidation = true, ) { super( - clientType, config, node, peerDiscoveryService, @@ -365,7 +363,6 @@ process.on('message', async msg => { }; const client = await createP2PClient( - P2PClientType.Full, config as P2PConfig & DataStoreConfig, l2BlockSource, proofVerifier as ClientProtocolCircuitVerifier, @@ -378,7 +375,6 @@ process.on('message', async msg => { ); const testService = new TestLibP2PService( - P2PClientType.Full, config, (client as any).p2pService.node, (client as any).p2pService.peerDiscoveryService, diff --git a/yarn-project/stdlib/src/interfaces/p2p.ts b/yarn-project/stdlib/src/interfaces/p2p.ts index fe0b5517bcff..301cbb4f9fee 100644 --- a/yarn-project/stdlib/src/interfaces/p2p.ts +++ b/yarn-project/stdlib/src/interfaces/p2p.ts @@ -3,7 +3,6 @@ import type { SlotNumber } from '@aztec/foundation/branded-types'; import { z } from 'zod'; import { CheckpointAttestation } from '../p2p/checkpoint_attestation.js'; -import type { P2PClientType } from '../p2p/client_type.js'; import { type ApiSchemaFor, optional, schemas } from '../schemas/index.js'; import { Tx } from '../tx/tx.js'; import { TxHash } from '../tx/tx_hash.js'; @@ -27,7 +26,7 @@ const PeerInfoSchema = z.discriminatedUnion('status', [ ]); /** Exposed API to the P2P module. */ -export interface P2PApiWithoutAttestations { +export interface P2PApi { /** * Returns all pending transactions in the transaction pool. * @param limit - The number of items to returns @@ -48,9 +47,7 @@ export interface P2PApiWithoutAttestations { * Returns info for all connected, dialing, and cached peers. */ getPeers(includePending?: boolean): Promise; -} -export interface P2PApiWithAttestations extends P2PApiWithoutAttestations { /** * Queries the Attestation pool for checkpoint attestations for the given slot * @@ -61,19 +58,11 @@ export interface P2PApiWithAttestations extends P2PApiWithoutAttestations { getCheckpointAttestationsForSlot(slot: SlotNumber, proposalId?: string): Promise; } -export interface P2PClient extends P2PApiWithAttestations { +export interface P2PClient extends P2PApi { /** Manually adds checkpoint attestations to the p2p client attestation pool. */ addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise; } -export type P2PApi = T extends P2PClientType.Full - ? P2PApiWithAttestations - : P2PApiWithoutAttestations; - -export type P2PApiFull = T extends P2PClientType.Full - ? P2PApiWithAttestations & P2PClient - : P2PApiWithoutAttestations; - export const P2PApiSchema: ApiSchemaFor = { getCheckpointAttestationsForSlot: z .function() diff --git a/yarn-project/stdlib/src/p2p/client_type.ts b/yarn-project/stdlib/src/p2p/client_type.ts index 75d1fea547c1..e69de29bb2d1 100644 --- a/yarn-project/stdlib/src/p2p/client_type.ts +++ b/yarn-project/stdlib/src/p2p/client_type.ts @@ -1,6 +0,0 @@ -export enum P2PClientType { - // Full p2p clients will subscribe to all gossip topics - Full, - // Prove p2p clients will only subscribe to transaction and proving topics - Prover, -} diff --git a/yarn-project/stdlib/src/p2p/index.ts b/yarn-project/stdlib/src/p2p/index.ts index c057784472ac..590f7b4e60f6 100644 --- a/yarn-project/stdlib/src/p2p/index.ts +++ b/yarn-project/stdlib/src/p2p/index.ts @@ -8,7 +8,6 @@ export * from './interface.js'; export * from './signature_utils.js'; export * from './signed_txs.js'; export * from './topic_type.js'; -export * from './client_type.js'; export * from './message_validator.js'; export * from './peer_error.js'; export * from './constants.js'; diff --git a/yarn-project/stdlib/src/p2p/topic_type.ts b/yarn-project/stdlib/src/p2p/topic_type.ts index 949ec2c6173b..107298f8dc38 100644 --- a/yarn-project/stdlib/src/p2p/topic_type.ts +++ b/yarn-project/stdlib/src/p2p/topic_type.ts @@ -1,5 +1,3 @@ -import { P2PClientType } from './client_type.js'; - /** * Creates the topic channel identifier string from a given topic type */ @@ -27,19 +25,14 @@ export enum TopicType { checkpoint_attestation = 'checkpoint_attestation', } -export function getTopicTypeForClientType(clientType: P2PClientType) { - if (clientType === P2PClientType.Full) { - return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal, TopicType.checkpoint_attestation]; - } else if (clientType === P2PClientType.Prover) { - return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal]; - } else { - const _: never = clientType; - return [TopicType.tx]; - } -} - -export function getTopicsForClientAndConfig(clientType: P2PClientType, disableTransactions: boolean) { - const topics = getTopicTypeForClientType(clientType); +/** Returns all gossip topics, optionally filtering out transactions. */ +export function getTopicsForConfig(disableTransactions: boolean) { + const topics = [ + TopicType.tx, + TopicType.block_proposal, + TopicType.checkpoint_proposal, + TopicType.checkpoint_attestation, + ]; if (disableTransactions) { return topics.filter(topic => topic !== TopicType.tx); } diff --git a/yarn-project/stdlib/src/p2p/topics.test.ts b/yarn-project/stdlib/src/p2p/topics.test.ts index 79c395f0801b..78556986802a 100644 --- a/yarn-project/stdlib/src/p2p/topics.test.ts +++ b/yarn-project/stdlib/src/p2p/topics.test.ts @@ -1,16 +1,13 @@ -import { P2PClientType } from './client_type.js'; -import { TopicType, getTopicFromString, getTopicsForClientAndConfig } from './topic_type.js'; +import { TopicType, getTopicFromString, getTopicsForConfig } from './topic_type.js'; describe('Gossip topic retrieval', () => { it.each([ - [P2PClientType.Full, ['tx', 'block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], true], - [P2PClientType.Prover, ['tx', 'block_proposal', 'checkpoint_proposal'], true], - [P2PClientType.Full, ['block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], false], - [P2PClientType.Prover, ['block_proposal', 'checkpoint_proposal'], false], + [['tx', 'block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], true], + [['block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], false], ])( - 'Node type %s subscribes to topics %s with transactions enabled: %s', - (clientType: P2PClientType, expectedTopics: string[], transactionsEnabled: boolean) => { - expect(getTopicsForClientAndConfig(clientType, !transactionsEnabled)).toEqual(expectedTopics); + 'subscribes to topics %s with transactions enabled: %s', + (expectedTopics: string[], transactionsEnabled: boolean) => { + expect(getTopicsForConfig(!transactionsEnabled)).toEqual(expectedTopics); }, ); }); From 5e3241e9ab49bb4c1d1b82a1bd0b5808bad10350 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Fri, 27 Feb 2026 12:30:39 +0000 Subject: [PATCH 4/7] chore: Configs for next-net, testnet etc (#20803) --- spartan/environments/testnet.env | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/spartan/environments/testnet.env b/spartan/environments/testnet.env index 2ffd8829f6d0..8702a5335d4e 100644 --- a/spartan/environments/testnet.env +++ b/spartan/environments/testnet.env @@ -4,36 +4,6 @@ CLUSTER=aztec-gke-public NAMESPACE=${NAMESPACE:-testnet} NETWORK=testnet -REAL_VERIFIER=true -AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE=48 -AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE=48 -AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN=10 -AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT=400 -AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE=10 -AZTEC_SLOT_DURATION=72 -AZTEC_EPOCH_DURATION=32 -AZTEC_TARGET_COMMITTEE_SIZE=48 -AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET=2 -AZTEC_LAG_IN_EPOCHS_FOR_RANDAO=2 -AZTEC_PROOF_SUBMISSION_EPOCHS=1 -AZTEC_LOCAL_EJECTION_THRESHOLD=199000e18 -AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS=2 -AZTEC_SLASHING_QUORUM=33 -AZTEC_SLASHING_OFFSET_IN_ROUNDS=2 -AZTEC_SLASHING_LIFETIME_IN_ROUNDS=5 -AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS=2 -AZTEC_SLASHING_VETOER=\"0xdfe19Da6a717b7088621d8bBB66be59F2d78e924\" -AZTEC_MANA_TARGET=75000000 -AZTEC_PROVING_COST_PER_MANA=25000000 -AZTEC_SLASH_AMOUNT_SMALL=100000e18 -AZTEC_SLASH_AMOUNT_MEDIUM=100000e18 -AZTEC_SLASH_AMOUNT_LARGE=100000e18 -AZTEC_ACTIVATION_THRESHOLD=200000e18 -AZTEC_EJECTION_THRESHOLD=100000e18 -AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE=100 -AZTEC_GOVERNANCE_PROPOSER_QUORUM=60 - - ETHEREUM_CHAIN_ID=11155111 ETHEREUM_RPC_URLS=REPLACE_WITH_GCP_SECRET ETHEREUM_CONSENSUS_HOST_URLS=REPLACE_WITH_GCP_SECRET From ce5e0c0ba91ef7f4162d77d5a7ee1fe31acdbc5a Mon Sep 17 00:00:00 2001 From: aminsammara Date: Fri, 27 Feb 2026 13:25:58 +0000 Subject: [PATCH 5/7] feat(slasher): make slash grace period relative to rollup upgrade time (#20942) ## Summary Closes A-596 - Anchors `SLASH_GRACE_PERIOD_L2_SLOTS` to the `CanonicalRollupUpdated` event emitted by the Registry when the rollup becomes canonical, instead of comparing against genesis slot 0 - Adds `getCanonicalRollupRegistrationTimestamp()` to `RegistryContract` to query the registration event timestamp - Computes and caches the canonical rollup registration L2 slot in the slasher factory, threading it through to the `SlashOffensesCollector` where the grace period comparison now uses `offenseSlot < registeredSlot + gracePeriodSlots` ## Motivation The rollup can be deployed weeks/months before becoming canonical (registered via `addRollup()`). By upgrade time, the current slot is far past any "slot from genesis" value, making the grace period ineffective. Now operators just set a duration (e.g. 3600 slots = 3 days) and the system anchors it to the actual upgrade time automatically. ## Test plan - Unit tests updated and passing for `SlashOffensesCollector`, `EmpireSlasherClient`, and `TallySlasherClient` - Grace period test verifies offenses within `registeredSlot + gracePeriod` are skipped and offenses after are not --- .../src/spartan/slash_inactivity.test.ts | 2 +- .../ethereum/src/contracts/registry.ts | 32 +++++++++++++++++- yarn-project/slasher/src/config.ts | 3 +- .../slasher/src/empire_slasher_client.test.ts | 1 + .../slasher/src/factory/create_facade.ts | 33 +++++++++++++++++-- .../src/factory/create_implementation.ts | 31 +++++++++++++++-- .../slasher/src/factory/get_settings.ts | 4 +-- .../src/slash_offenses_collector.test.ts | 26 ++++++++------- .../slasher/src/slash_offenses_collector.ts | 11 +++++-- .../slasher/src/slasher_client_facade.ts | 2 ++ .../slasher/src/tally_slasher_client.test.ts | 1 + 11 files changed, 122 insertions(+), 24 deletions(-) diff --git a/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts b/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts index 6092f1af2605..bdd7ea3e7fd0 100644 --- a/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts +++ b/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts @@ -38,7 +38,7 @@ describe('slash inactivity test', () => { let client: ViemPublicClient; let rollup: RollupContract; - let slashSettings: TallySlasherSettings; + let slashSettings: Omit; let constants: Omit; let monitor: ChainMonitor; let offlineValidator: EthAddress; diff --git a/yarn-project/ethereum/src/contracts/registry.ts b/yarn-project/ethereum/src/contracts/registry.ts index 89156ec13c7a..a4bf15f16bb8 100644 --- a/yarn-project/ethereum/src/contracts/registry.ts +++ b/yarn-project/ethereum/src/contracts/registry.ts @@ -3,7 +3,7 @@ import { createLogger } from '@aztec/foundation/log'; import { RegistryAbi } from '@aztec/l1-artifacts/RegistryAbi'; import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi'; -import { type GetContractReturnType, type Hex, getContract } from 'viem'; +import { type GetContractReturnType, type Hex, getAbiItem, getContract } from 'viem'; import type { L1ContractAddresses } from '../l1_contract_addresses.js'; import type { ViemClient } from '../types.js'; @@ -128,4 +128,34 @@ export class RegistryContract { public async getRewardDistributor(): Promise { return EthAddress.fromString(await this.registry.read.getRewardDistributor()); } + + /** Returns the L1 timestamp at which the given rollup was registered via addRollup(). */ + public async getCanonicalRollupRegistrationTimestamp( + rollupAddress: EthAddress, + fromBlock?: bigint, + ): Promise { + const event = getAbiItem({ abi: RegistryAbi, name: 'CanonicalRollupUpdated' }); + const start = fromBlock ?? 0n; + const latestBlock = await this.client.getBlockNumber(); + const chunkSize = 1_000n; + + for (let from = start; from <= latestBlock; from += chunkSize) { + const to = from + chunkSize - 1n > latestBlock ? latestBlock : from + chunkSize - 1n; + const logs = await this.client.getLogs({ + address: this.address.toString(), + fromBlock: from, + toBlock: to, + strict: true, + event, + args: { instance: rollupAddress.toString() }, + }); + + if (logs.length > 0) { + const block = await this.client.getBlock({ blockNumber: logs[0].blockNumber }); + return block.timestamp; + } + } + + return undefined; + } } diff --git a/yarn-project/slasher/src/config.ts b/yarn-project/slasher/src/config.ts index 79cef1e58b1a..646225cc6e20 100644 --- a/yarn-project/slasher/src/config.ts +++ b/yarn-project/slasher/src/config.ts @@ -155,7 +155,8 @@ export const slasherConfigMappings: ConfigMappingsType = { ...numberConfigHelper(DefaultSlasherConfig.slashMaxPayloadSize), }, slashGracePeriodL2Slots: { - description: 'Number of L2 slots to wait before considering a slashing offense expired.', + description: + 'Number of L2 slots after the network upgrade during which slashing offenses are ignored. The upgrade time is determined from the CanonicalRollupUpdated event.', env: 'SLASH_GRACE_PERIOD_L2_SLOTS', ...numberConfigHelper(DefaultSlasherConfig.slashGracePeriodL2Slots), }, diff --git a/yarn-project/slasher/src/empire_slasher_client.test.ts b/yarn-project/slasher/src/empire_slasher_client.test.ts index 4aa40aee11f9..1bff7848fdc5 100644 --- a/yarn-project/slasher/src/empire_slasher_client.test.ts +++ b/yarn-project/slasher/src/empire_slasher_client.test.ts @@ -50,6 +50,7 @@ describe('EmpireSlasherClient', () => { slotDuration: 4, ethereumSlotDuration: 12, slashingAmounts: undefined, + rollupRegisteredAtL2Slot: SlotNumber(0), }; const config: SlasherConfig = { diff --git a/yarn-project/slasher/src/factory/create_facade.ts b/yarn-project/slasher/src/factory/create_facade.ts index af6f7ed9cd6c..6787fc65ce75 100644 --- a/yarn-project/slasher/src/factory/create_facade.ts +++ b/yarn-project/slasher/src/factory/create_facade.ts @@ -1,13 +1,15 @@ import { EpochCache } from '@aztec/epoch-cache'; -import { RollupContract } from '@aztec/ethereum/contracts'; +import { RegistryContract, RollupContract } from '@aztec/ethereum/contracts'; import type { L1ReaderConfig } from '@aztec/ethereum/l1-reader'; import type { ViemClient } from '@aztec/ethereum/types'; +import { SlotNumber } from '@aztec/foundation/branded-types'; import { unique } from '@aztec/foundation/collection'; import { EthAddress } from '@aztec/foundation/eth-address'; import { createLogger } from '@aztec/foundation/log'; import { DateProvider } from '@aztec/foundation/timer'; import type { DataStoreConfig } from '@aztec/kv-store/config'; import { createStore } from '@aztec/kv-store/lmdb-v2'; +import { getSlotAtTimestamp } from '@aztec/stdlib/epoch-helpers'; import type { SlasherConfig } from '@aztec/stdlib/interfaces/server'; import { SlasherClientFacade } from '../slasher_client_facade.js'; @@ -18,7 +20,7 @@ import type { Watcher } from '../watcher.js'; /** Creates a slasher client facade that updates itself whenever the rollup slasher changes */ export async function createSlasherFacade( config: SlasherConfig & DataStoreConfig & { ethereumSlotDuration: number }, - l1Contracts: Pick, + l1Contracts: Pick, l1Client: ViemClient, watchers: Watcher[], dateProvider: DateProvider, @@ -34,6 +36,32 @@ export async function createSlasherFacade( const kvStore = await createStore('slasher', SCHEMA_VERSION, config, logger.getBindings()); const rollup = new RollupContract(l1Client, l1Contracts.rollupAddress); + // Compute and cache the L2 slot at which the rollup was registered as canonical + const settingsMap = kvStore.openMap('slasher-settings'); + const cacheKey = `registeredSlot:${l1Contracts.rollupAddress}`; + let rollupRegisteredAtL2Slot = (await settingsMap.getAsync(cacheKey)) as SlotNumber | undefined; + + if (rollupRegisteredAtL2Slot === undefined) { + const registry = new RegistryContract(l1Client, l1Contracts.registryAddress); + const l1StartBlock = await rollup.getL1StartBlock(); + const registrationTimestamp = await registry.getCanonicalRollupRegistrationTimestamp( + l1Contracts.rollupAddress, + l1StartBlock, + ); + if (registrationTimestamp !== undefined) { + const l1GenesisTime = await rollup.getL1GenesisTime(); + const slotDuration = await rollup.getSlotDuration(); + rollupRegisteredAtL2Slot = getSlotAtTimestamp(registrationTimestamp, { + l1GenesisTime, + slotDuration: Number(slotDuration), + }); + } else { + rollupRegisteredAtL2Slot = SlotNumber(0); + } + await settingsMap.set(cacheKey, rollupRegisteredAtL2Slot); + logger.info(`Canonical rollup registered at L2 slot ${rollupRegisteredAtL2Slot}`); + } + const slashValidatorsNever = config.slashSelfAllowed ? config.slashValidatorsNever : unique([...config.slashValidatorsNever, ...validatorAddresses].map(a => a.toString())).map(EthAddress.fromString); @@ -48,6 +76,7 @@ export async function createSlasherFacade( epochCache, dateProvider, kvStore, + rollupRegisteredAtL2Slot, logger, ); } diff --git a/yarn-project/slasher/src/factory/create_implementation.ts b/yarn-project/slasher/src/factory/create_implementation.ts index d793f3285709..0c6eb8ce6d76 100644 --- a/yarn-project/slasher/src/factory/create_implementation.ts +++ b/yarn-project/slasher/src/factory/create_implementation.ts @@ -5,6 +5,7 @@ import { TallySlashingProposerContract, } from '@aztec/ethereum/contracts'; import type { ViemClient } from '@aztec/ethereum/types'; +import type { SlotNumber } from '@aztec/foundation/branded-types'; import { EthAddress } from '@aztec/foundation/eth-address'; import { createLogger } from '@aztec/foundation/log'; import { DateProvider } from '@aztec/foundation/timer'; @@ -31,19 +32,40 @@ export async function createSlasherImplementation( epochCache: EpochCache, dateProvider: DateProvider, kvStore: AztecLMDBStoreV2, + rollupRegisteredAtL2Slot: SlotNumber, logger = createLogger('slasher'), ) { const proposer = await rollup.getSlashingProposer(); if (!proposer) { return new NullSlasherClient(config); } else if (proposer.type === 'tally') { - return createTallySlasher(config, rollup, proposer, watchers, dateProvider, epochCache, kvStore, logger); + return createTallySlasher( + config, + rollup, + proposer, + watchers, + dateProvider, + epochCache, + kvStore, + rollupRegisteredAtL2Slot, + logger, + ); } else { if (!slashFactoryAddress || slashFactoryAddress.equals(EthAddress.ZERO)) { throw new Error('Cannot initialize an empire-based SlasherClient without a SlashFactory address'); } const slashFactory = new SlashFactoryContract(l1Client, slashFactoryAddress.toString()); - return createEmpireSlasher(config, rollup, proposer, slashFactory, watchers, dateProvider, kvStore, logger); + return createEmpireSlasher( + config, + rollup, + proposer, + slashFactory, + watchers, + dateProvider, + kvStore, + rollupRegisteredAtL2Slot, + logger, + ); } } @@ -55,6 +77,7 @@ async function createEmpireSlasher( watchers: Watcher[], dateProvider: DateProvider, kvStore: AztecLMDBStoreV2, + rollupRegisteredAtL2Slot: SlotNumber, logger = createLogger('slasher'), ): Promise { if (slashingProposer.type !== 'empire') { @@ -97,6 +120,7 @@ async function createEmpireSlasher( l1StartBlock, ethereumSlotDuration: config.ethereumSlotDuration, slashingAmounts: undefined, + rollupRegisteredAtL2Slot, }; const payloadsStore = new SlasherPayloadsStore(kvStore, { @@ -130,13 +154,14 @@ async function createTallySlasher( dateProvider: DateProvider, epochCache: EpochCache, kvStore: AztecLMDBStoreV2, + rollupRegisteredAtL2Slot: SlotNumber, logger = createLogger('slasher'), ): Promise { if (slashingProposer.type !== 'tally') { throw new Error('Slashing proposer contract is not of type tally'); } - const settings = await getTallySlasherSettings(rollup, slashingProposer); + const settings = { ...(await getTallySlasherSettings(rollup, slashingProposer)), rollupRegisteredAtL2Slot }; const slasher = await rollup.getSlasherContract(); const offensesStore = new SlasherOffensesStore(kvStore, { diff --git a/yarn-project/slasher/src/factory/get_settings.ts b/yarn-project/slasher/src/factory/get_settings.ts index 078073847e13..6fd10662edcd 100644 --- a/yarn-project/slasher/src/factory/get_settings.ts +++ b/yarn-project/slasher/src/factory/get_settings.ts @@ -5,7 +5,7 @@ import type { TallySlasherSettings } from '../tally_slasher_client.js'; export async function getTallySlasherSettings( rollup: RollupContract, slashingProposer?: TallySlashingProposerContract, -): Promise { +): Promise> { if (!slashingProposer) { const rollupSlashingProposer = await rollup.getSlashingProposer(); if (!rollupSlashingProposer || rollupSlashingProposer.type !== 'tally') { @@ -40,7 +40,7 @@ export async function getTallySlasherSettings( rollup.getTargetCommitteeSize(), ]); - const settings: TallySlasherSettings = { + const settings: Omit = { slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds), slashingRoundSize: Number(slashingRoundSize), slashingRoundSizeInEpochs: Number(slashingRoundSizeInEpochs), diff --git a/yarn-project/slasher/src/slash_offenses_collector.test.ts b/yarn-project/slasher/src/slash_offenses_collector.test.ts index f23d1824fb18..3eeeb532494e 100644 --- a/yarn-project/slasher/src/slash_offenses_collector.test.ts +++ b/yarn-project/slasher/src/slash_offenses_collector.test.ts @@ -1,3 +1,4 @@ +import { SlotNumber } from '@aztec/foundation/branded-types'; import { EthAddress } from '@aztec/foundation/eth-address'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { openTmpStore } from '@aztec/kv-store/lmdb'; @@ -18,6 +19,7 @@ describe('SlashOffensesCollector', () => { const settings: SlashOffensesCollectorSettings = { epochDuration: 32, slashingAmounts: [100n, 200n, 300n], + rollupRegisteredAtL2Slot: 100 as SlotNumber, }; const config: SlasherConfig = { @@ -90,27 +92,28 @@ describe('SlashOffensesCollector', () => { }); }); - it('should skip offenses that happen during grace period', async () => { + it('should skip offenses that happen during grace period after upgrade', async () => { const validator1 = EthAddress.random(); const validator2 = EthAddress.random(); - // Create offense during grace period (slot < slashGracePeriodL2Slots = 10) + // Grace period is registeredSlot (100) + gracePeriodL2Slots (10) = 110 + // Create offense during grace period (slot 105 < 110) const gracePeriodOffense: WantToSlashArgs[] = [ { validator: validator1, amount: 1000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, // Slot-based offense - epochOrSlot: 5n, // Within grace period (< 10) + epochOrSlot: 105n, // Within grace period (< 110) }, ]; - // Create offense after grace period + // Create offense after grace period (slot 115 >= 110) const validOffense: WantToSlashArgs[] = [ { validator: validator2, amount: 2000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, // Slot-based offense - epochOrSlot: 20n, // After grace period (>= 10) + epochOrSlot: 115n, // After grace period (>= 110) }, ]; @@ -134,25 +137,26 @@ describe('SlashOffensesCollector', () => { const validator2 = EthAddress.random(); const validator3 = EthAddress.random(); - // Create an event with multiple offenses in a single array + // Grace period ends at registeredSlot (100) + gracePeriod (10) = 110 + // All offenses are after the grace period const multipleOffensesArgs: WantToSlashArgs[] = [ { validator: validator1, amount: 1000000000000000000n, offenseType: OffenseType.INACTIVITY, - epochOrSlot: 100n, + epochOrSlot: 100n, // epoch 100 → slot 3200, well past grace period }, { validator: validator2, amount: 2000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, - epochOrSlot: 50n, + epochOrSlot: 150n, // slot 150 >= 110 }, { validator: validator3, amount: 1500000000000000000n, offenseType: OffenseType.ATTESTED_DESCENDANT_OF_INVALID, - epochOrSlot: 75n, + epochOrSlot: 175n, // slot 175 >= 110 }, ]; @@ -182,14 +186,14 @@ describe('SlashOffensesCollector', () => { validator: validator2, amount: 2000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, - epochOrSlot: 50n, + epochOrSlot: 150n, }); expect(offensesByValidator[validator3.toString()]).toMatchObject({ validator: validator3, amount: 1500000000000000000n, offenseType: OffenseType.ATTESTED_DESCENDANT_OF_INVALID, - epochOrSlot: 75n, + epochOrSlot: 175n, }); }); }); diff --git a/yarn-project/slasher/src/slash_offenses_collector.ts b/yarn-project/slasher/src/slash_offenses_collector.ts index 551f868ccec3..59cc7a0e1dc6 100644 --- a/yarn-project/slasher/src/slash_offenses_collector.ts +++ b/yarn-project/slasher/src/slash_offenses_collector.ts @@ -1,3 +1,4 @@ +import type { SlotNumber } from '@aztec/foundation/branded-types'; import { createLogger } from '@aztec/foundation/log'; import type { Prettify } from '@aztec/foundation/types'; import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers'; @@ -9,7 +10,11 @@ import { WANT_TO_SLASH_EVENT, type WantToSlashArgs, type Watcher } from './watch export type SlashOffensesCollectorConfig = Prettify>; export type SlashOffensesCollectorSettings = Prettify< - Pick & { slashingAmounts: [bigint, bigint, bigint] | undefined } + Pick & { + slashingAmounts: [bigint, bigint, bigint] | undefined; + /** L2 slot at which the rollup was registered as canonical in the Registry. Used to anchor the slash grace period. */ + rollupRegisteredAtL2Slot: SlotNumber; + } >; /** @@ -110,9 +115,9 @@ export class SlashOffensesCollector { return this.offensesStore.markAsSlashed(offenses); } - /** Returns whether to skip an offense if it happened during the grace period at the beginning of the chain */ + /** Returns whether to skip an offense if it happened during the grace period after the network upgrade */ private shouldSkipOffense(offense: Offense): boolean { const offenseSlot = getSlotForOffense(offense, this.settings); - return offenseSlot < this.config.slashGracePeriodL2Slots; + return offenseSlot < this.settings.rollupRegisteredAtL2Slot + this.config.slashGracePeriodL2Slots; } } diff --git a/yarn-project/slasher/src/slasher_client_facade.ts b/yarn-project/slasher/src/slasher_client_facade.ts index 943084816870..0ef4a677ac0a 100644 --- a/yarn-project/slasher/src/slasher_client_facade.ts +++ b/yarn-project/slasher/src/slasher_client_facade.ts @@ -32,6 +32,7 @@ export class SlasherClientFacade implements SlasherClientInterface { private epochCache: EpochCache, private dateProvider: DateProvider, private kvStore: AztecLMDBStoreV2, + private rollupRegisteredAtL2Slot: SlotNumber, private logger = createLogger('slasher'), ) {} @@ -88,6 +89,7 @@ export class SlasherClientFacade implements SlasherClientInterface { this.epochCache, this.dateProvider, this.kvStore, + this.rollupRegisteredAtL2Slot, this.logger, ); } diff --git a/yarn-project/slasher/src/tally_slasher_client.test.ts b/yarn-project/slasher/src/tally_slasher_client.test.ts index 9ca14eaa7a44..62f5b492fa99 100644 --- a/yarn-project/slasher/src/tally_slasher_client.test.ts +++ b/yarn-project/slasher/src/tally_slasher_client.test.ts @@ -50,6 +50,7 @@ describe('TallySlasherClient', () => { l1GenesisTime: BigInt(Math.floor(Date.now() / 1000) - 10000), slotDuration: 4, slashingQuorumSize: 110, + rollupRegisteredAtL2Slot: SlotNumber(0), }; const config: SlasherConfig = { From 24b18050ca08dfcc657c754ad5f5209c2c1cf155 Mon Sep 17 00:00:00 2001 From: nventuro Date: Fri, 27 Feb 2026 14:42:56 +0000 Subject: [PATCH 6/7] docs: add docs on state vars docs re packing in structs (#20747) --- .../aztec-nr/aztec/src/macros/storage.nr | 4 +- .../src/state_vars/delayed_public_mutable.nr | 28 ++ .../aztec-nr/aztec/src/state_vars/mod.nr | 56 +++ .../aztec/src/state_vars/public_immutable.nr | 9 +- .../crates/serde/src/type_impls.nr | 28 ++ .../crates/types/src/traits.nr | 344 ------------------ .../crates/types/src/traits/empty.nr | 175 +++++++++ .../crates/types/src/traits/from_field.nr | 52 +++ .../crates/types/src/traits/hash.nr | 3 + .../crates/types/src/traits/mod.nr | 16 + .../crates/types/src/traits/packable.nr | 129 +++++++ .../crates/types/src/traits/to_field.nr | 61 ++++ 12 files changed, 555 insertions(+), 350 deletions(-) delete mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits.nr create mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr create mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr create mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr create mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr create mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr create mode 100644 noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr diff --git a/noir-projects/aztec-nr/aztec/src/macros/storage.nr b/noir-projects/aztec-nr/aztec/src/macros/storage.nr index b9ebe14382a5..a7d9d114f22c 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/storage.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/storage.nr @@ -5,7 +5,9 @@ use std::meta::unquote; /// generating a `storage_layout()` getter on the contract struct. pub comptime mut global STORAGE_LAYOUT_NAME: CHashMap = CHashMap::new(); -/// This function +/// Declares the contract's storage. +/// +/// This function: /// - marks the contract as having storage, so that `macros::utils::module_has_storage` will return true, /// - marks the struct `s` as the one describing the storage layout of a contract, /// - generates an `impl` block for the storage struct with an `init` function (call to `init` is then injected at the diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr index b05d7a5ec7b8..78cd64900a7b 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr @@ -166,6 +166,34 @@ impl DelayedPublicMutable { + /// paused: DelayedPublicMutable, + /// fee: DelayedPublicMutable, + /// } + /// + /// // Good: both `paused` and `fee` are retrieved in a single historical public storage read + /// #[derive(Packable)] + /// struct Config { + /// paused: bool, + /// fee: Field, + /// } + /// + /// #[storage] + /// struct Storage { + /// config: DelayedPublicMutable, + /// } + /// ``` pub fn get_current_value(self) -> T where T: Packable, diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr b/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr index 404011c407fe..f050e2aa8f0b 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr @@ -7,6 +7,62 @@ //! Due to Aztec contracts being able to store both public and private state, there are many more different types of //! state variables, each with their nuance and use cases. Understanding these is key to understanding how a contract //! works. +//! +//! ## Packing for Efficient Access +//! +//! Because all state variables are fully independent, when a contract reads or writes one of them all others are left +//! untouched. This is good for isolation, but in some cases users may want to group variables together for more +//! efficient access, for example to access multiple values in a single storage read or write. +//! +//! The pattern to follow is to **group related values in a `struct`**, just like in Solidity. How values are packed +//! inside this `struct` is governed by the [`crate::protocol::traits::Packable`] trait, which must be `#[derive]`'d or +//! manually implemented - see the [`Packable`](crate::protocol::traits::Packable)'s docs on how to do this. +//! +//! ```noir +//! // Inefficient reads and writes - each bool is assigned a distinct storage slot, so reading or writing both +//! requires +//! // executing `SLOAD` or `SSTORE` twice. +//! #[storage] +//! struct Storage { +//! a: PublicMutable, +//! b: PublicMutable, +//! } +//! +//! // By storing the booleans in a single struct and implementing the Packable trait with tight packing, we can now +//! // read and write both values in a single `SLOAD` or `SSTORE` opcode. +//! struct TwoBooleans { +//! a: bool, +//! b: bool, +//! } +//! +//! impl aztec::protocol::traits::Packable for TwoBooleans { +//! let N: u32 = 1; +//! +//! fn pack(self) -> [Field; Self::N] { +//! [(self.a as Field) * 2.pow_32(1) + (self.b as Field)] +//! } +//! +//! fn unpack(packed: [Field; Self::N]) -> Self { +//! let b = (packed[0] as u1) != 0; +//! let a = (((packed[0] - b as Field) / 2.pow_32(1)) as u1) != 0; +//! +//! Self { a, b } +//! } +//! } +//! +//! #[storage] +//! struct Storage { +//! a_and_b: PublicMutable, +//! } +//! ``` +//! +//! Note that private state variables and public ones that can be read from private (like +//! [`PublicImmutable`](crate::state_vars::PublicImmutable) and +//! [`DelayedPublicMutable`](crate::state_vars::DelayedPublicMutable)) benefit from packing multiple values in the same +//! `struct` even if there is no need for tight packing (e.g. if all values are `Field`s), since they often work by +//! reading the _hash_ of the entire value. Many values in the same `struct` will result in a single hash, and +//! therefore +//! a single read. mod state_variable; pub use state_variable::StateVariable; diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr index 4211f1ce3e77..2db7c2f325e4 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr @@ -287,11 +287,10 @@ impl PublicImmutable { /// ## Cost /// /// A nullifier existence request is pushed to the context, which will be verified by the kernel circuit. - /// Additionally, a historical public storage read at the anchor block is performed for a single storage slot, - /// **regardless of `T`'s packed length**. This is because [`PublicImmutable::initialize`] stores not just the - /// value - /// but also its hash: this function obtains the preimage from an oracle and proves that it matches the hash from - /// public storage. + /// Additionally, a historical public storage read at the anchor block (which is on the order of 4k gates) is + /// performed for a single storage slot, **regardless of `T`'s packed length**. This is because + /// [`PublicImmutable::initialize`] stores not just the value but also its hash: this function obtains the preimage + /// from an oracle and proves that it matches the hash from public storage. /// /// Because of this reason it is convenient to group together all of a contract's public immutable values that are /// read privately in a single type `T`: diff --git a/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr b/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr index 73ca1c17f3d1..7d533d01f1a3 100644 --- a/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr +++ b/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr @@ -796,3 +796,31 @@ where mod impls { use crate::serialization::{Deserialize, Serialize}; } + +#[test] +unconstrained fn bounded_vec_serialization() { + // Test empty BoundedVec + let empty_vec: BoundedVec = BoundedVec::from_array([]); + let serialized = empty_vec.serialize(); + let deserialized = BoundedVec::::deserialize(serialized); + assert_eq(empty_vec, deserialized); + assert_eq(deserialized.len(), 0); + + // Test partially filled BoundedVec + let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]); + let serialized = partial_vec.serialize(); + let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); + assert_eq(partial_vec, deserialized); + assert_eq(deserialized.len(), 1); + assert_eq(deserialized.get(0), [1, 2]); + + // Test full BoundedVec + let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]); + let serialized = full_vec.serialize(); + let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); + assert_eq(full_vec, deserialized); + assert_eq(deserialized.len(), 3); + assert_eq(deserialized.get(0), [1, 2]); + assert_eq(deserialized.get(1), [3, 4]); + assert_eq(deserialized.get(2), [5, 6]); +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr deleted file mode 100644 index 988bd650d4d9..000000000000 --- a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr +++ /dev/null @@ -1,344 +0,0 @@ -use crate::meta::derive_packable; -use crate::utils::field::field_from_bytes; - -pub use serde::serialization::{Deserialize, Serialize}; - -// Trait: is_empty -// -// The general is_empty trait checks if a data type is is empty, -// and it defines empty for the basic data types as 0. -// -// If a Field is equal to zero, then it is regarded as zero. -// We will go with this definition for now, however it can be problematic -// if a value can actually be zero. In a future refactor, we can -// use the optional type for safety. Doing it now would lead to a worse devex -// and would make it harder to sync up with the cpp code. -// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty. -pub trait Empty: Eq { - fn empty() -> Self; - - fn is_empty(self) -> bool { - self.eq(Self::empty()) - } - - // Requires this Noir fix: https://github.com/noir-lang/noir/issues/9002 - // fn assert_not_empty(self, msg: str) { // This msg version was failing with weird compiler errors. - // // We provide a default impl but it's likely inefficient. - // // The reason we include this function is because there's a lot of - // // opportunity for optimisation on a per-struct basis. - // // You only need to show one element is not empty to know that the whole thing - // // is not empty. - // // If you know an element of your struct which should always be nonempty, - // // you can write an impl that solely checks that that element is nonempty. - // assert(!self.is_empty(), msg); - // } - - // This default impl is overwritten by types like arrays, because there's a much - // more efficient approach. - fn assert_empty(self, msg: str) { - assert(self.is_empty(), msg); - } -} - -impl Empty for Field { - #[inline_always] - fn empty() -> Self { - 0 - } -} - -impl Empty for bool { - #[inline_always] - fn empty() -> Self { - false - } -} - -impl Empty for u1 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u8 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u16 { - fn empty() -> Self { - 0 - } -} -impl Empty for u32 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u64 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u128 { - #[inline_always] - fn empty() -> Self { - 0 - } -} - -impl Empty for [T; N] -where - T: Empty, -{ - #[inline_always] - fn empty() -> Self { - [T::empty(); N] - } - - fn is_empty(self) -> bool { - self.all(|elem| elem.is_empty()) - } - - fn assert_empty(self, msg: str) -> () { - self.for_each(|elem| elem.assert_empty(msg)) - } -} - -impl Empty for [T] -where - T: Empty, -{ - #[inline_always] - fn empty() -> Self { - [T::empty()] - } - - fn is_empty(self) -> bool { - self.all(|elem| elem.is_empty()) - } - - fn assert_empty(self, msg: str) -> () { - self.for_each(|elem| elem.assert_empty(msg)) - } -} -impl Empty for (A, B) -where - A: Empty, - B: Empty, -{ - #[inline_always] - fn empty() -> Self { - (A::empty(), B::empty()) - } -} - -impl Empty for Option -where - T: Eq, -{ - #[inline_always] - fn empty() -> Self { - Option::none() - } -} - -// pub fn is_empty(item: T) -> bool -// where -// T: Empty, -// { -// item.eq(T::empty()) -// } - -// pub fn is_empty_array(array: [T; N]) -> bool -// where -// T: Empty, -// { -// array.all(|elem| is_empty(elem)) -// } - -// pub fn assert_empty(item: T) -> () -// where -// T: Empty, -// { -// assert(item.eq(T::empty())) -// } - -// pub fn assert_empty_array(array: [T; N]) -> () -// where -// T: Empty, -// { -// // A cheaper option than `is_empty_array` for if you don't need to gracefully -// // handle a bool result. -// // Avoids the `&` operator of `is_empty_array`'s `.all()` call. -// for i in 0..N { -// assert(is_empty(array[i])); -// } -// } - -pub trait Hash { - fn hash(self) -> Field; -} - -pub trait ToField { - fn to_field(self) -> Field; -} - -impl ToField for Field { - #[inline_always] - fn to_field(self) -> Field { - self - } -} - -impl ToField for bool { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u1 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u8 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u16 { - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u32 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u64 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u128 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for str { - #[inline_always] - fn to_field(self) -> Field { - assert(N < 32, "String doesn't fit in a field, consider using Serialize instead"); - field_from_bytes(self.as_bytes(), true) - } -} - -pub trait FromField { - fn from_field(value: Field) -> Self; -} - -impl FromField for Field { - #[inline_always] - fn from_field(value: Field) -> Self { - value - } -} - -impl FromField for bool { - #[inline_always] - fn from_field(value: Field) -> Self { - value != 0 - } -} -impl FromField for u1 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u1 - } -} -impl FromField for u8 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u8 - } -} -impl FromField for u16 { - fn from_field(value: Field) -> Self { - value as u16 - } -} -impl FromField for u32 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u32 - } -} -impl FromField for u64 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u64 - } -} -impl FromField for u128 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u128 - } -} - -/// Trait for efficiently packing and unpacking Noir types into and from arrays of Fields. -/// -/// The `Packable` trait allows types to be serialized and deserialized with a focus on minimizing the size of -/// the resulting Field array. This trait is used when storage efficiency is critical (e.g. when storing data -/// in the contract's public storage). -/// -/// # Associated Constants -/// * `N` - The length of the Field array, known at compile time -#[derive_via(derive_packable)] -pub trait Packable { - let N: u32; - - /// Packs the current value into a compact array of `Field` elements. - fn pack(self) -> [Field; N]; - - /// Unpacks a compact array of `Field` elements into the original value. - fn unpack(fields: [Field; N]) -> Self; -} - -#[test] -unconstrained fn bounded_vec_serialization() { - // Test empty BoundedVec - let empty_vec: BoundedVec = BoundedVec::from_array([]); - let serialized = empty_vec.serialize(); - let deserialized = BoundedVec::::deserialize(serialized); - assert_eq(empty_vec, deserialized); - assert_eq(deserialized.len(), 0); - - // Test partially filled BoundedVec - let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]); - let serialized = partial_vec.serialize(); - let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); - assert_eq(partial_vec, deserialized); - assert_eq(deserialized.len(), 1); - assert_eq(deserialized.get(0), [1, 2]); - - // Test full BoundedVec - let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]); - let serialized = full_vec.serialize(); - let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); - assert_eq(full_vec, deserialized); - assert_eq(deserialized.len(), 3); - assert_eq(deserialized.get(0), [1, 2]); - assert_eq(deserialized.get(1), [3, 4]); - assert_eq(deserialized.get(2), [5, 6]); -} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr new file mode 100644 index 000000000000..3aa3601b8a5c --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr @@ -0,0 +1,175 @@ +// Trait: is_empty +// +// The general is_empty trait checks if a data type is empty, +// and it defines empty for the basic data types as 0. +// +// If a Field is equal to zero, then it is regarded as zero. +// We will go with this definition for now, however it can be problematic +// if a value can actually be zero. In a future refactor, we can +// use the optional type for safety. Doing it now would lead to a worse devex +// and would make it harder to sync up with the cpp code. +// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty. +pub trait Empty: Eq { + fn empty() -> Self; + + fn is_empty(self) -> bool { + self.eq(Self::empty()) + } + + // Requires this Noir fix: https://github.com/noir-lang/noir/issues/9002 + // fn assert_not_empty(self, msg: str) { // This msg version was failing with weird compiler errors. + // // We provide a default impl but it's likely inefficient. + // // The reason we include this function is because there's a lot of + // // opportunity for optimisation on a per-struct basis. + // // You only need to show one element is not empty to know that the whole thing + // // is not empty. + // // If you know an element of your struct which should always be nonempty, + // // you can write an impl that solely checks that that element is nonempty. + // assert(!self.is_empty(), msg); + // } + + // This default impl is overwritten by types like arrays, because there's a much + // more efficient approach. + fn assert_empty(self, msg: str) { + assert(self.is_empty(), msg); + } +} + +impl Empty for Field { + #[inline_always] + fn empty() -> Self { + 0 + } +} + +impl Empty for bool { + #[inline_always] + fn empty() -> Self { + false + } +} + +impl Empty for u1 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u8 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u16 { + fn empty() -> Self { + 0 + } +} +impl Empty for u32 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u64 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u128 { + #[inline_always] + fn empty() -> Self { + 0 + } +} + +impl Empty for [T; N] +where + T: Empty, +{ + #[inline_always] + fn empty() -> Self { + [T::empty(); N] + } + + fn is_empty(self) -> bool { + self.all(|elem| elem.is_empty()) + } + + fn assert_empty(self, msg: str) -> () { + self.for_each(|elem| elem.assert_empty(msg)) + } +} + +impl Empty for [T] +where + T: Empty, +{ + #[inline_always] + fn empty() -> Self { + [T::empty()] + } + + fn is_empty(self) -> bool { + self.all(|elem| elem.is_empty()) + } + + fn assert_empty(self, msg: str) -> () { + self.for_each(|elem| elem.assert_empty(msg)) + } +} +impl Empty for (A, B) +where + A: Empty, + B: Empty, +{ + #[inline_always] + fn empty() -> Self { + (A::empty(), B::empty()) + } +} + +impl Empty for Option +where + T: Eq, +{ + #[inline_always] + fn empty() -> Self { + Option::none() + } +} + +// pub fn is_empty(item: T) -> bool +// where +// T: Empty, +// { +// item.eq(T::empty()) +// } + +// pub fn is_empty_array(array: [T; N]) -> bool +// where +// T: Empty, +// { +// array.all(|elem| is_empty(elem)) +// } + +// pub fn assert_empty(item: T) -> () +// where +// T: Empty, +// { +// assert(item.eq(T::empty())) +// } + +// pub fn assert_empty_array(array: [T; N]) -> () +// where +// T: Empty, +// { +// // A cheaper option than `is_empty_array` for if you don't need to gracefully +// // handle a bool result. +// // Avoids the `&` operator of `is_empty_array`'s `.all()` call. +// for i in 0..N { +// assert(is_empty(array[i])); +// } +// } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr new file mode 100644 index 000000000000..0cfa123fef8d --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr @@ -0,0 +1,52 @@ +pub trait FromField { + fn from_field(value: Field) -> Self; +} + +impl FromField for Field { + #[inline_always] + fn from_field(value: Field) -> Self { + value + } +} + +impl FromField for bool { + #[inline_always] + fn from_field(value: Field) -> Self { + value != 0 + } +} +impl FromField for u1 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u1 + } +} +impl FromField for u8 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u8 + } +} +impl FromField for u16 { + fn from_field(value: Field) -> Self { + value as u16 + } +} +impl FromField for u32 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u32 + } +} +impl FromField for u64 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u64 + } +} +impl FromField for u128 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u128 + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr new file mode 100644 index 000000000000..1a9476f012c9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr @@ -0,0 +1,3 @@ +pub trait Hash { + fn hash(self) -> Field; +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr new file mode 100644 index 000000000000..b71fd4c56af7 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr @@ -0,0 +1,16 @@ +mod empty; +pub use empty::Empty; + +mod from_field; +pub use from_field::FromField; + +mod hash; +pub use hash::Hash; + +mod packable; +pub use packable::Packable; + +mod to_field; +pub use to_field::ToField; + +pub use serde::serialization::{Deserialize, Serialize}; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr new file mode 100644 index 000000000000..2ffc97c22dd9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr @@ -0,0 +1,129 @@ +use crate::meta::derive_packable; + +/// Space-efficient value packing and unpacking. +/// +/// Like [`Serialize`](crate::traits::Serialize) and [`Deserialize`](crate::traits::Deserialize), this trait is used to +/// convert to a from `Field` array representations. `Packable` is used instead of those whenever _the length_ of the +/// resulting array needs to be minimized, for example in order to reduce the number of amount storage access +/// operations, or the number of values that will be hashed together. +/// +/// The associated constant `N` is the length of the `Field` array. +/// +/// ## Automatic Derivation +/// +/// The `#[derive]` macro can be used on any type that holds primitive values, or types that themselves also derive +/// `Packable`. The resulting implementation does not attempt to tightly-pack values at all, and instead simply assigns +/// a full `Field` to each value. This makes it suitable for types that are composed solely of `Field`-sized elements. +/// +/// ```noir +/// #[derive(Packable)] +/// struct FieldGrouping { +/// a: Field, +/// b: Field, +/// c: Field, +/// } +/// +/// #[derive(Packable)] +/// struct NestedStructs { +/// fg: FieldGrouping, +/// x: Field, +/// } +/// +/// // Inefficient: there are gains to be had by manually implementing the trait instead of using `derive` +/// #[derive(Packable)] +/// struct SubFieldGrouping { +/// a: bool, +/// b: u32, +/// c: u64, +/// } +/// ``` +/// +/// ## Manual Implementation +/// +/// If a type holds at least two elements smaller than a `Field`, then manually implementing `Packable` can result in +/// reduced costs (assuming the sub-`Field` elements are small enough to be packed together). +/// +/// The nature of cost reduction will depend on what the value is used for. For public storage, it will typically +/// decrease both L2 gas (in the form of fewer `SLOAD` and `SSTORE` opcodes) and DA costs (due to there being fewer +/// slots accessed). For notes, it will typically decrease proving times (due to fewer hash operations). +/// +/// Note that packing and unpacking must also be runtime efficient for the previously mentioned gains to not be offset +/// by this overhead. Bit-packing by multiplying and dividing by powers of 2 is often a good strategy, as this maps well +/// to both AVM opcodes (for public contract functions) and proving backend primitives (for private contract functions). +/// +/// ```noir +/// struct TwoBooleans { +/// a: bool, +/// b: bool, +/// } +/// +/// impl Packable for TwoBooleans { +/// let N: u32 = 1; +/// +/// fn pack(self) -> [Field; Self::N] { +/// // a in bit 1, b in bit 0 +/// [(self.a as Field) * 2.pow_32(1) + (self.b as Field)] +/// } +/// +/// fn unpack(packed: [Field; Self::N]) -> Self { +/// let b = (packed[0] as u1) != 0; +/// let a = (((packed[0] - b as Field) / 2.pow_32(1)) as u1) != 0; +/// +/// Self { a, b } +/// } +/// } +/// ``` +#[derive_via(derive_packable)] +pub trait Packable { + let N: u32; + + /// Packs the value into a compact `Field` array. + /// + /// The original value can be reconstructed by calling [`Packable::unpack`]. + fn pack(self) -> [Field; N]; + + /// Unpacks the value from a compact `Field` array. + /// + /// `packed` must be the value returned by [`Packable::pack`]. + fn unpack(packed: [Field; N]) -> Self; +} + +mod test { + use super::Packable; + + #[derive(Eq)] + struct TwoBooleans { + a: bool, + b: bool, + } + + impl Packable for TwoBooleans { + let N: u32 = 1; + + fn pack(self) -> [Field; Self::N] { + [(self.a as Field) * 2.pow_32(1) + (self.b as Field)] + } + + fn unpack(packed: [Field; Self::N]) -> Self { + let b = (packed[0] as u1) != 0; + let a = (((packed[0] - b as Field) / 2.pow_32(1)) as u1) != 0; + + Self { a, b } + } + } + + #[test] + fn pack_unpack_docs_example() { + let x = TwoBooleans { a: false, b: false }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + + let x = TwoBooleans { a: false, b: true }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + + let x = TwoBooleans { a: true, b: false }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + + let x = TwoBooleans { a: true, b: true }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr new file mode 100644 index 000000000000..c1ddfaa3c593 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr @@ -0,0 +1,61 @@ +use crate::utils::field::field_from_bytes; + +pub trait ToField { + fn to_field(self) -> Field; +} + +impl ToField for Field { + #[inline_always] + fn to_field(self) -> Field { + self + } +} + +impl ToField for bool { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u1 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u8 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u16 { + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u32 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u64 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u128 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for str { + #[inline_always] + fn to_field(self) -> Field { + assert(N < 32, "String doesn't fit in a field, consider using Serialize instead"); + field_from_bytes(self.as_bytes(), true) + } +} From 7d23cc93f9a7481f82e1cc026b2a44e6b06d359e Mon Sep 17 00:00:00 2001 From: spypsy Date: Fri, 27 Feb 2026 16:38:11 +0000 Subject: [PATCH 7/7] chore: remove unused prover-node dep (#20955) Fixes [A-564](https://linear.app/aztec-labs/issue/A-564/ensure-node-sources-are-correctly-injected-into-the-prover-node) --- yarn-project/prover-node/src/factory.ts | 5 ----- yarn-project/prover-node/src/prover-node.test.ts | 9 +++++++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/yarn-project/prover-node/src/factory.ts b/yarn-project/prover-node/src/factory.ts index c0d3660b09dd..ee312b2ce90d 100644 --- a/yarn-project/prover-node/src/factory.ts +++ b/yarn-project/prover-node/src/factory.ts @@ -19,7 +19,6 @@ import { getPublisherConfigFromProverConfig, } from '@aztec/sequencer-client'; import type { - AztecNode, ITxProvider, ProverConfig, ProvingJobBroker, @@ -38,7 +37,6 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js'; export type ProverNodeDeps = { telemetry?: TelemetryClient; log?: Logger; - aztecNodeTxProvider?: Pick; archiver: Archiver; publisherFactory?: ProverPublisherFactory; broker?: ProvingJobBroker; @@ -128,9 +126,6 @@ export async function createProverNode( telemetry, }); - // TODO(#20393): Check that the tx collection node sources are properly injected - // See aztecNodeTxProvider - const proverNodeConfig = { ...pick( config, diff --git a/yarn-project/prover-node/src/prover-node.test.ts b/yarn-project/prover-node/src/prover-node.test.ts index 4b9c28d2c8b7..9effe18edd71 100644 --- a/yarn-project/prover-node/src/prover-node.test.ts +++ b/yarn-project/prover-node/src/prover-node.test.ts @@ -207,6 +207,15 @@ describe('prover-node', () => { expect(proverNode.totalJobCount).toEqual(0); }); + it('gathers txs via the p2p client tx provider', async () => { + await proverNode.handleEpochReadyToProve(EpochNumber.fromBigInt(10n)); + // The prover node must route tx gathering through the shared p2p client's tx provider + expect(p2p.getTxProvider).toHaveBeenCalled(); + // One call per block across all checkpoints in the epoch + const totalBlocks = checkpoints.flatMap(c => c.blocks).length; + expect(txProvider.getTxsForBlock).toHaveBeenCalledTimes(totalBlocks); + }); + it('does not start a proof if there is a tx missing from coordinator', async () => { txProvider.getTxsForBlock.mockResolvedValue({ missingTxs: [TxHash.random()], txs: [] }); await proverNode.handleEpochReadyToProve(EpochNumber.fromBigInt(10n));