From ec35dae474215fbd07433f46f33f4149971012af Mon Sep 17 00:00:00 2001 From: portuu3 <61605646+portuu3@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:29:54 +0200 Subject: [PATCH 01/12] [HUMAN App] Add social media promotion job type and corresponding label (#3878) --- .../frontend/src/modules/smart-contracts/EthKVStore/config.ts | 1 + packages/apps/human-app/frontend/src/shared/i18n/en.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/config.ts b/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/config.ts index c663fb9e03..06f52f89b0 100644 --- a/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/config.ts +++ b/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/config.ts @@ -15,6 +15,7 @@ export enum JobType { POLYGONS = 'image_polygons', AUDIO_TRANSCRIPTION = 'audio_transcription', AUDIO_ATTRIBUTE_ANNOTATION = 'audio_attribute_annotation', + SOCIAL_MEDIA_PROMOTION = 'social_media_promotion', } export const EthKVStoreKeys = { diff --git a/packages/apps/human-app/frontend/src/shared/i18n/en.json b/packages/apps/human-app/frontend/src/shared/i18n/en.json index bd42e03c26..d364c6e88c 100644 --- a/packages/apps/human-app/frontend/src/shared/i18n/en.json +++ b/packages/apps/human-app/frontend/src/shared/i18n/en.json @@ -505,6 +505,7 @@ "image_skeletons_from_boxes": "Skeletons from Bounding Boxes", "image_polygons": "Polygons", "audio_transcription": "Audio Transcription", - "audio_attribute_annotation": "Audio Attribute Annotation" + "audio_attribute_annotation": "Audio Attribute Annotation", + "social_media_promotion": "Social Media Promotion" } } From 57ce4b8539d01b65f7611cf6e20629d0b073a513 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 11:44:18 +0200 Subject: [PATCH 02/12] chore(deps): bump helmet from 7.2.0 to 8.1.0 (#3872) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../apps/fortune/recording-oracle/package.json | 2 +- packages/apps/job-launcher/server/package.json | 2 +- .../apps/reputation-oracle/server/package.json | 2 +- yarn.lock | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/apps/fortune/recording-oracle/package.json b/packages/apps/fortune/recording-oracle/package.json index 7dbb9968e4..b113905a8a 100644 --- a/packages/apps/fortune/recording-oracle/package.json +++ b/packages/apps/fortune/recording-oracle/package.json @@ -36,7 +36,7 @@ "class-transformer": "^0.5.1", "class-validator": "0.14.1", "dotenv": "^17.2.2", - "helmet": "^7.1.0", + "helmet": "^8.1.0", "joi": "^17.13.3", "minio": "8.0.6", "reflect-metadata": "^0.2.2", diff --git a/packages/apps/job-launcher/server/package.json b/packages/apps/job-launcher/server/package.json index c78219af26..ecf693068b 100644 --- a/packages/apps/job-launcher/server/package.json +++ b/packages/apps/job-launcher/server/package.json @@ -57,7 +57,7 @@ "class-validator": "0.14.1", "decimal.js": "^10.6.0", "dotenv": "^17.2.2", - "helmet": "^7.1.0", + "helmet": "^8.1.0", "joi": "^17.13.3", "json-stable-stringify": "^1.2.1", "minio": "8.0.6", diff --git a/packages/apps/reputation-oracle/server/package.json b/packages/apps/reputation-oracle/server/package.json index 97838300cb..4a975f4a7c 100644 --- a/packages/apps/reputation-oracle/server/package.json +++ b/packages/apps/reputation-oracle/server/package.json @@ -56,7 +56,7 @@ "class-validator": "^0.14.1", "dotenv": "^17.2.2", "ethers": "~6.16.0", - "helmet": "^7.1.0", + "helmet": "^8.1.0", "joi": "^17.13.3", "json-stable-stringify": "^1.2.1", "lodash": "^4.17.21", diff --git a/yarn.lock b/yarn.lock index 4a1691038c..d94feca416 100644 --- a/yarn.lock +++ b/yarn.lock @@ -398,7 +398,7 @@ __metadata: eslint-plugin-jest: "npm:^29.15.1" eslint-plugin-prettier: "npm:^5.5.5" globals: "npm:^16.3.0" - helmet: "npm:^7.1.0" + helmet: "npm:^8.1.0" jest: "npm:^29.7.0" joi: "npm:^17.13.3" minio: "npm:8.0.6" @@ -656,7 +656,7 @@ __metadata: eslint-plugin-jest: "npm:^29.15.1" eslint-plugin-prettier: "npm:^5.5.5" globals: "npm:^16.3.0" - helmet: "npm:^7.1.0" + helmet: "npm:^8.1.0" jest: "npm:^29.7.0" joi: "npm:^17.13.3" json-stable-stringify: "npm:^1.2.1" @@ -732,7 +732,7 @@ __metadata: eslint-plugin-prettier: "npm:^5.5.5" ethers: "npm:~6.16.0" globals: "npm:^16.3.0" - helmet: "npm:^7.1.0" + helmet: "npm:^8.1.0" jest: "npm:^29.7.0" joi: "npm:^17.13.3" json-stable-stringify: "npm:^1.2.1" @@ -21159,10 +21159,10 @@ __metadata: languageName: node linkType: hard -"helmet@npm:^7.1.0": - version: 7.2.0 - resolution: "helmet@npm:7.2.0" - checksum: 10c0/7ba8503519cabc1d6410330b710da3ac01a4ff66e7e10cb68c4d73c96803a2e86ce45c71f3127dfb8ef3ea2e91c7b8316726191873f80d0572f8826878b2854e +"helmet@npm:^8.1.0": + version: 8.1.0 + resolution: "helmet@npm:8.1.0" + checksum: 10c0/94d3a7ebc88dbda1421635bdf33f00724adb5252269e93c5ab296ec0db11336d01265659ad3739ab1a1e881fb23a686ff7e788aac6a5fb929285134f157df763 languageName: node linkType: hard From 4aaaa469e65c76612d6a428ddf65084834b846d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 11:46:07 +0200 Subject: [PATCH 03/12] chore(deps-dev): bump eslint-plugin-react-refresh from 0.4.24 to 0.5.2 (#3870) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/apps/dashboard/client/package.json | 2 +- .../exchange-oracle/client/package.json | 2 +- packages/apps/human-app/frontend/package.json | 2 +- packages/apps/staking/package.json | 2 +- yarn.lock | 18 +++++++++--------- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/apps/dashboard/client/package.json b/packages/apps/dashboard/client/package.json index 7677ec9567..08a81cf224 100644 --- a/packages/apps/dashboard/client/package.json +++ b/packages/apps/dashboard/client/package.json @@ -56,7 +56,7 @@ "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.11", + "eslint-plugin-react-refresh": "^0.5.2", "globals": "^16.2.0", "prettier": "^3.8.1", "sass": "^1.89.2", diff --git a/packages/apps/fortune/exchange-oracle/client/package.json b/packages/apps/fortune/exchange-oracle/client/package.json index 2c7c38158e..133c683064 100644 --- a/packages/apps/fortune/exchange-oracle/client/package.json +++ b/packages/apps/fortune/exchange-oracle/client/package.json @@ -52,7 +52,7 @@ "@vitejs/plugin-react": "^4.3.1", "eslint": "^10.1.0", "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.11", + "eslint-plugin-react-refresh": "^0.5.2", "globals": "^16.3.0", "prettier": "^3.8.1", "typescript": "^5.6.3", diff --git a/packages/apps/human-app/frontend/package.json b/packages/apps/human-app/frontend/package.json index fa702bb144..ed64c012fb 100644 --- a/packages/apps/human-app/frontend/package.json +++ b/packages/apps/human-app/frontend/package.json @@ -75,7 +75,7 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.11", + "eslint-plugin-react-refresh": "^0.5.2", "globals": "^16.3.0", "husky": "^9.1.6", "jsdom": "^25.0.1", diff --git a/packages/apps/staking/package.json b/packages/apps/staking/package.json index d8a070e924..dd4da353ee 100644 --- a/packages/apps/staking/package.json +++ b/packages/apps/staking/package.json @@ -55,7 +55,7 @@ "@vitejs/plugin-react": "^4.3.1", "eslint": "^10.1.0", "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.11", + "eslint-plugin-react-refresh": "^0.5.2", "globals": "^16.3.0", "prettier": "^3.8.1", "sass": "^1.89.2", diff --git a/yarn.lock b/yarn.lock index d94feca416..e6c1ba2594 100644 --- a/yarn.lock +++ b/yarn.lock @@ -128,7 +128,7 @@ __metadata: eslint-plugin-prettier: "npm:^5.5.5" eslint-plugin-react: "npm:^7.37.5" eslint-plugin-react-hooks: "npm:^5.2.0" - eslint-plugin-react-refresh: "npm:^0.4.11" + eslint-plugin-react-refresh: "npm:^0.5.2" globals: "npm:^16.2.0" prettier: "npm:^3.8.1" react: "npm:^19.2.4" @@ -291,7 +291,7 @@ __metadata: axios: "npm:^1.7.2" eslint: "npm:^10.1.0" eslint-plugin-react-hooks: "npm:^5.1.0" - eslint-plugin-react-refresh: "npm:^0.4.11" + eslint-plugin-react-refresh: "npm:^0.5.2" ethers: "npm:^6.16.0" globals: "npm:^16.3.0" prettier: "npm:^3.8.1" @@ -450,7 +450,7 @@ __metadata: eslint-plugin-jsx-a11y: "npm:^6.10.2" eslint-plugin-prettier: "npm:^5.5.5" eslint-plugin-react-hooks: "npm:^5.2.0" - eslint-plugin-react-refresh: "npm:^0.4.11" + eslint-plugin-react-refresh: "npm:^0.5.2" ethers: "npm:^6.16.0" globals: "npm:^16.3.0" husky: "npm:^9.1.6" @@ -780,7 +780,7 @@ __metadata: axios: "npm:^1.7.2" eslint: "npm:^10.1.0" eslint-plugin-react-hooks: "npm:^5.1.0" - eslint-plugin-react-refresh: "npm:^0.4.11" + eslint-plugin-react-refresh: "npm:^0.5.2" ethers: "npm:^6.16.0" globals: "npm:^16.3.0" prettier: "npm:^3.8.1" @@ -18871,12 +18871,12 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-refresh@npm:^0.4.11": - version: 0.4.24 - resolution: "eslint-plugin-react-refresh@npm:0.4.24" +"eslint-plugin-react-refresh@npm:^0.5.2": + version: 0.5.2 + resolution: "eslint-plugin-react-refresh@npm:0.5.2" peerDependencies: - eslint: ">=8.40" - checksum: 10c0/7471a25663cdec2886b5aec53cff6319475a6704616f96db4eef7ada3cba1236abeb71b4c2db6396e48a3a8a3a416a0266b2eac06bb6ef77d8b5674604ece7fb + eslint: ^9 || ^10 + checksum: 10c0/6e5b1b8ad673535ea1134fa16ecda986c389a045b87ca935e6c5f69070b1889218f3116bfb8b793ec10f37c286f28904d0b5b1d62a76760e465aa32e73e6010e languageName: node linkType: hard From e2894e7df84bcda99fa67635ebb26b4800f82cff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 15:46:35 +0200 Subject: [PATCH 04/12] chore(deps): bump actions/github-script from 8 to 9 (#3867) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-packages.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-packages.yaml b/.github/workflows/release-packages.yaml index 9c166da053..359e6f4d0b 100644 --- a/.github/workflows/release-packages.yaml +++ b/.github/workflows/release-packages.yaml @@ -19,7 +19,7 @@ jobs: - name: Check if release already exists id: release_check - uses: actions/github-script@v8 + uses: actions/github-script@v9 with: github-token: ${{ secrets.RELEASE_GH_TOKEN }} script: | From ff853dd2cce30b55331c8d595a61354e71982963 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 16:15:13 +0200 Subject: [PATCH 05/12] chore(deps): bump softprops/action-gh-release from 2 to 3 (#3874) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release-packages.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-packages.yaml b/.github/workflows/release-packages.yaml index 359e6f4d0b..b9c03a3b30 100644 --- a/.github/workflows/release-packages.yaml +++ b/.github/workflows/release-packages.yaml @@ -99,7 +99,7 @@ jobs: - name: Create GitHub release id: release if: ${{ steps.release_check.outputs.exists != 'true' }} - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: tag_name: ${{ github.ref_name }} name: ${{ github.ref_name }} From dd5673e22cf68b4f3162368c5bc5f0fc2cec8dc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 09:23:07 +0200 Subject: [PATCH 06/12] chore(deps): bump @mui/x-date-pickers from 8.26.0 to 9.0.4 (#3884) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/apps/dashboard/client/package.json | 2 +- packages/apps/human-app/frontend/package.json | 2 +- .../apps/job-launcher/client/package.json | 2 +- yarn.lock | 113 ++++++++++-------- 4 files changed, 63 insertions(+), 56 deletions(-) diff --git a/packages/apps/dashboard/client/package.json b/packages/apps/dashboard/client/package.json index 08a81cf224..7834abbc86 100644 --- a/packages/apps/dashboard/client/package.json +++ b/packages/apps/dashboard/client/package.json @@ -25,7 +25,7 @@ "@mui/styled-engine-sc": "7.3.8", "@mui/system": "^7.3.9", "@mui/x-data-grid": "^8.7.0", - "@mui/x-date-pickers": "^8.26.0", + "@mui/x-date-pickers": "^9.0.4", "@tanstack/react-query": "^5.91.3", "@types/react-router-dom": "^5.3.3", "@types/recharts": "^1.8.29", diff --git a/packages/apps/human-app/frontend/package.json b/packages/apps/human-app/frontend/package.json index ed64c012fb..32e15a8ab3 100644 --- a/packages/apps/human-app/frontend/package.json +++ b/packages/apps/human-app/frontend/package.json @@ -28,7 +28,7 @@ "@mui/icons-material": "^7.3.8", "@mui/material": "^5.16.7", "@mui/system": "^7.3.9", - "@mui/x-date-pickers": "^8.26.0", + "@mui/x-date-pickers": "^9.0.4", "@reown/appkit": "^1.7.11", "@reown/appkit-adapter-wagmi": "^1.7.11", "@synaps-io/verify-sdk": "^4.0.45", diff --git a/packages/apps/job-launcher/client/package.json b/packages/apps/job-launcher/client/package.json index a3fb1f76ed..d166459357 100644 --- a/packages/apps/job-launcher/client/package.json +++ b/packages/apps/job-launcher/client/package.json @@ -12,7 +12,7 @@ "@mui/lab": "^7.0.0-beta.17", "@mui/material": "^5.16.7", "@mui/system": "^7.3.9", - "@mui/x-date-pickers": "^8.26.0", + "@mui/x-date-pickers": "^9.0.4", "@reduxjs/toolkit": "^2.5.0", "@stripe/react-stripe-js": "^3.0.0", "@stripe/stripe-js": "^4.2.0", diff --git a/yarn.lock b/yarn.lock index e6c1ba2594..75cbfe8b7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -112,7 +112,7 @@ __metadata: "@mui/styled-engine-sc": "npm:7.3.8" "@mui/system": "npm:^7.3.9" "@mui/x-data-grid": "npm:^8.7.0" - "@mui/x-date-pickers": "npm:^8.26.0" + "@mui/x-date-pickers": "npm:^9.0.4" "@tanstack/react-query": "npm:^5.91.3" "@types/react": "npm:^19.2.2" "@types/react-dom": "npm:^19.2.3" @@ -428,7 +428,7 @@ __metadata: "@mui/icons-material": "npm:^7.3.8" "@mui/material": "npm:^5.16.7" "@mui/system": "npm:^7.3.9" - "@mui/x-date-pickers": "npm:^8.26.0" + "@mui/x-date-pickers": "npm:^9.0.4" "@reown/appkit": "npm:^1.7.11" "@reown/appkit-adapter-wagmi": "npm:^1.7.11" "@synaps-io/verify-sdk": "npm:^4.0.45" @@ -560,7 +560,7 @@ __metadata: "@mui/lab": "npm:^7.0.0-beta.17" "@mui/material": "npm:^5.16.7" "@mui/system": "npm:^7.3.9" - "@mui/x-date-pickers": "npm:^8.26.0" + "@mui/x-date-pickers": "npm:^9.0.4" "@reduxjs/toolkit": "npm:^2.5.0" "@stripe/react-stripe-js": "npm:^3.0.0" "@stripe/stripe-js": "npm:^4.2.0" @@ -3021,7 +3021,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.28.3": +"@babel/runtime@npm:^7.28.3, @babel/runtime@npm:^7.29.2": version: 7.29.2 resolution: "@babel/runtime@npm:7.29.2" checksum: 10c0/30b80a0140d16467792e1bbeb06f655b0dab70407da38dfac7fedae9c859f9ae9d846ef14ad77bd3814c064295fe9b1bc551f1541ea14646ae9f22b71a8bc17a @@ -7207,20 +7207,6 @@ __metadata: languageName: node linkType: hard -"@mui/types@npm:^7.4.10": - version: 7.4.10 - resolution: "@mui/types@npm:7.4.10" - dependencies: - "@babel/runtime": "npm:^7.28.4" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/2e1e807795dcb6f5bdb62eb49068a7f4414299c62f55ceaaa05925a1d043799216150873c00c02f086fd631f7171c97ea416dc66c099c98649503ee3046dab3d - languageName: node - linkType: hard - "@mui/types@npm:^7.4.12, @mui/types@npm:^7.4.6": version: 7.4.12 resolution: "@mui/types@npm:7.4.12" @@ -7249,6 +7235,20 @@ __metadata: languageName: node linkType: hard +"@mui/types@npm:^9.0.0": + version: 9.0.0 + resolution: "@mui/types@npm:9.0.0" + dependencies: + "@babel/runtime": "npm:^7.29.2" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/6c44a3bd3ebe8e6a3d964c72a9653d0a0221340e054e641a89344a4f7e209519e30ed4893c0c29e84f9d2f43c2e68e3c378d1719839f7ce10edfc13b768b8129 + languageName: node + linkType: hard + "@mui/types@npm:~7.2.15": version: 7.2.24 resolution: "@mui/types@npm:7.2.24" @@ -7261,6 +7261,26 @@ __metadata: languageName: node linkType: hard +"@mui/utils@npm:9.0.0": + version: 9.0.0 + resolution: "@mui/utils@npm:9.0.0" + dependencies: + "@babel/runtime": "npm:^7.29.2" + "@mui/types": "npm:^9.0.0" + "@types/prop-types": "npm:^15.7.15" + clsx: "npm:^2.1.1" + prop-types: "npm:^15.8.1" + react-is: "npm:^19.2.4" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/139ccbdc418dce45070def89f3644b9a42b4eef9a98e74338f83e0f74b715f484a047163708746bf18713da88aa0d8a9e4d0c3df51c93337e492dcebc953fde5 + languageName: node + linkType: hard + "@mui/utils@npm:^5.17.1": version: 5.17.1 resolution: "@mui/utils@npm:5.17.1" @@ -7321,26 +7341,6 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^7.3.5": - version: 7.3.7 - resolution: "@mui/utils@npm:7.3.7" - dependencies: - "@babel/runtime": "npm:^7.28.4" - "@mui/types": "npm:^7.4.10" - "@types/prop-types": "npm:^15.7.15" - clsx: "npm:^2.1.1" - prop-types: "npm:^15.8.1" - react-is: "npm:^19.2.3" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/2732a01a24968c8fe73b1cf3c7afabffd8a5f13556f3f8078529eaf09d855a05cb7905421b733cb671f771406eb857f5dddb3b82166ecc2a3d0ab1a987954d08 - languageName: node - linkType: hard - "@mui/x-data-grid@npm:^8.7.0": version: 8.16.0 resolution: "@mui/x-data-grid@npm:8.16.0" @@ -7368,13 +7368,13 @@ __metadata: languageName: node linkType: hard -"@mui/x-date-pickers@npm:^8.26.0": - version: 8.26.0 - resolution: "@mui/x-date-pickers@npm:8.26.0" +"@mui/x-date-pickers@npm:^9.0.4": + version: 9.0.4 + resolution: "@mui/x-date-pickers@npm:9.0.4" dependencies: - "@babel/runtime": "npm:^7.28.4" - "@mui/utils": "npm:^7.3.5" - "@mui/x-internals": "npm:8.26.0" + "@babel/runtime": "npm:^7.29.2" + "@mui/utils": "npm:9.0.0" + "@mui/x-internals": "npm:^9.0.4" "@types/react-transition-group": "npm:^4.4.12" clsx: "npm:^2.1.1" prop-types: "npm:^15.8.1" @@ -7382,8 +7382,8 @@ __metadata: peerDependencies: "@emotion/react": ^11.9.0 "@emotion/styled": ^11.8.1 - "@mui/material": ^5.15.14 || ^6.0.0 || ^7.0.0 - "@mui/system": ^5.15.14 || ^6.0.0 || ^7.0.0 + "@mui/material": ^7.3.0 || ^9.0.0 + "@mui/system": ^7.3.0 || ^9.0.0 date-fns: ^2.25.0 || ^3.2.0 || ^4.0.0 date-fns-jalali: ^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0 dayjs: ^1.10.7 @@ -7412,7 +7412,7 @@ __metadata: optional: true moment-jalaali: optional: true - checksum: 10c0/b2d28e10529cb0eb3e6413960658fb8f1c608066abd4365fab895adab66fa777846418e25cd91f04d47fc037d08abee114d9dde029b663532aefcede02c98175 + checksum: 10c0/0b21740373d367de3c25ed2c00f7579efde85ebff6822c0135a8d9b7a3596e005191082ae728e86e0c24a4a5c012b28455b465a01e69565ce0904eefd8a68590 languageName: node linkType: hard @@ -7430,17 +7430,17 @@ __metadata: languageName: node linkType: hard -"@mui/x-internals@npm:8.26.0": - version: 8.26.0 - resolution: "@mui/x-internals@npm:8.26.0" +"@mui/x-internals@npm:^9.0.4": + version: 9.0.4 + resolution: "@mui/x-internals@npm:9.0.4" dependencies: - "@babel/runtime": "npm:^7.28.4" - "@mui/utils": "npm:^7.3.5" + "@babel/runtime": "npm:^7.29.2" + "@mui/utils": "npm:9.0.0" reselect: "npm:^5.1.1" use-sync-external-store: "npm:^1.6.0" peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/819564e1b1c7626f5e237edd81f716a3871df1479f2e2e9fbef45a5963df21c510eca4931f6af726fdcd9dc643a019e44c5d61657865b389ef0a2ab5abb10d6c + checksum: 10c0/24347005e74e73a131a032c8e34c8e1edcaecc05d00d3f8f8450d5b3a6ca35bc3c0c849ac08d3283a8b72d8abc4d002196320cc8ad20b6e96abf81e73525a893 languageName: node linkType: hard @@ -27223,6 +27223,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^19.2.4": + version: 19.2.5 + resolution: "react-is@npm:19.2.5" + checksum: 10c0/58c28ab2f7f868f9836c728fa164a16dcf20246ab84a3ae6a09e617b0e4d9bbb3acdddfdc40452f0134d27b121d3359227602a050c0be554cb20069cb52a67f4 + languageName: node + linkType: hard + "react-loading-skeleton@npm:^3.3.1": version: 3.5.0 resolution: "react-loading-skeleton@npm:3.5.0" From 19b8a6db6e34d5bc2b2fb89bd0e3de2dca94e9d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 09:24:49 +0200 Subject: [PATCH 07/12] chore(deps): bump copy-to-clipboard from 3.3.3 to 4.0.2 (#3882) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../apps/job-launcher/client/package.json | 2 +- yarn.lock | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/packages/apps/job-launcher/client/package.json b/packages/apps/job-launcher/client/package.json index d166459357..563219e225 100644 --- a/packages/apps/job-launcher/client/package.json +++ b/packages/apps/job-launcher/client/package.json @@ -20,7 +20,7 @@ "@tanstack/react-query": "^5.91.3", "@tanstack/react-query-persist-client": "^5.80.7", "axios": "^1.1.3", - "copy-to-clipboard": "^3.3.3", + "copy-to-clipboard": "^4.0.2", "dayjs": "^1.11.12", "decimal.js": "^10.6.0", "ethers": "^6.16.0", diff --git a/yarn.lock b/yarn.lock index 75cbfe8b7b..35cc4734bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -573,7 +573,7 @@ __metadata: "@types/xml2js": "npm:^0.4.14" "@vitejs/plugin-react": "npm:^4.2.1" axios: "npm:^1.1.3" - copy-to-clipboard: "npm:^3.3.3" + copy-to-clipboard: "npm:^4.0.2" dayjs: "npm:^1.11.12" decimal.js: "npm:^10.6.0" eslint: "npm:^10.1.0" @@ -16792,12 +16792,10 @@ __metadata: languageName: node linkType: hard -"copy-to-clipboard@npm:^3.3.3": - version: 3.3.3 - resolution: "copy-to-clipboard@npm:3.3.3" - dependencies: - toggle-selection: "npm:^1.0.6" - checksum: 10c0/3ebf5e8ee00601f8c440b83ec08d838e8eabb068c1fae94a9cda6b42f288f7e1b552f3463635f419af44bf7675afc8d0390d30876cf5c2d5d35f86d9c56a3e5f +"copy-to-clipboard@npm:^4.0.2": + version: 4.0.2 + resolution: "copy-to-clipboard@npm:4.0.2" + checksum: 10c0/0a007c86cc5f235653ddd98ef9901fa8d52b40bd0aeadce4ecc92d6aad16f89136a526f2ae7050421de5b02a374d803de88a40cde1298915093d1b62aeadc9e5 languageName: node linkType: hard @@ -30031,13 +30029,6 @@ __metadata: languageName: node linkType: hard -"toggle-selection@npm:^1.0.6": - version: 1.0.6 - resolution: "toggle-selection@npm:1.0.6" - checksum: 10c0/f2cf1f2c70f374fd87b0cdc8007453ba9e981c4305a8bf4eac10a30e62ecdfd28bca7d18f8f15b15a506bf8a7bfb20dbe3539f0fcf2a2c8396c1a78d53e1f179 - languageName: node - linkType: hard - "toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" From 2287dec66044ab9a11a66713fa6dc3257f567bba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 09:33:31 +0200 Subject: [PATCH 08/12] chore(deps-dev): bump @nestjs/testing from 11.1.14 to 11.1.19 (#3883) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/apps/dashboard/server/package.json | 2 +- .../exchange-oracle/server/package.json | 2 +- .../fortune/recording-oracle/package.json | 2 +- packages/apps/human-app/server/package.json | 2 +- .../apps/job-launcher/server/package.json | 2 +- .../reputation-oracle/server/package.json | 2 +- yarn.lock | 20 +++++++++---------- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/apps/dashboard/server/package.json b/packages/apps/dashboard/server/package.json index ec904cd72d..7b5eda2d43 100644 --- a/packages/apps/dashboard/server/package.json +++ b/packages/apps/dashboard/server/package.json @@ -52,7 +52,7 @@ "@golevelup/ts-jest": "^3.0.0", "@nestjs/cli": "^11.0.16", "@nestjs/schematics": "^11.0.9", - "@nestjs/testing": "^11.1.14", + "@nestjs/testing": "^11.1.19", "@types/express": "^5.0.6", "@types/jest": "30.0.0", "@types/node": "22.10.5", diff --git a/packages/apps/fortune/exchange-oracle/server/package.json b/packages/apps/fortune/exchange-oracle/server/package.json index a0687122ae..661c4d0fd7 100644 --- a/packages/apps/fortune/exchange-oracle/server/package.json +++ b/packages/apps/fortune/exchange-oracle/server/package.json @@ -65,7 +65,7 @@ "@golevelup/ts-jest": "^3.0.0", "@nestjs/cli": "^11.0.16", "@nestjs/schematics": "^11.0.9", - "@nestjs/testing": "^11.1.14", + "@nestjs/testing": "^11.1.19", "@types/body-parser": "^1", "@types/express": "^5.0.6", "@types/jest": "30.0.0", diff --git a/packages/apps/fortune/recording-oracle/package.json b/packages/apps/fortune/recording-oracle/package.json index b113905a8a..984ae2bc2f 100644 --- a/packages/apps/fortune/recording-oracle/package.json +++ b/packages/apps/fortune/recording-oracle/package.json @@ -46,7 +46,7 @@ "@eslint/js": "^10.0.1", "@nestjs/cli": "^11.0.16", "@nestjs/schematics": "^11.0.9", - "@nestjs/testing": "^11.1.14", + "@nestjs/testing": "^11.1.19", "@types/express": "^5.0.6", "@types/jest": "^29.5.14", "@types/node": "^22.15.16", diff --git a/packages/apps/human-app/server/package.json b/packages/apps/human-app/server/package.json index 136ee5ed2d..eb0b876c9b 100644 --- a/packages/apps/human-app/server/package.json +++ b/packages/apps/human-app/server/package.json @@ -58,7 +58,7 @@ "@eslint/js": "^10.0.1", "@nestjs/cli": "^11.0.16", "@nestjs/schematics": "^11.0.9", - "@nestjs/testing": "^11.1.14", + "@nestjs/testing": "^11.1.19", "@types/express": "^5.0.6", "@types/jest": "30.0.0", "@types/jsonwebtoken": "^9.0.7", diff --git a/packages/apps/job-launcher/server/package.json b/packages/apps/job-launcher/server/package.json index ecf693068b..6a04bff3d0 100644 --- a/packages/apps/job-launcher/server/package.json +++ b/packages/apps/job-launcher/server/package.json @@ -80,7 +80,7 @@ "@golevelup/ts-jest": "^3.0.0", "@nestjs/cli": "^11.0.16", "@nestjs/schematics": "^11.0.9", - "@nestjs/testing": "^11.1.14", + "@nestjs/testing": "^11.1.19", "@types/bcrypt": "^6.0.0", "@types/express": "^5.0.6", "@types/jest": "30.0.0", diff --git a/packages/apps/reputation-oracle/server/package.json b/packages/apps/reputation-oracle/server/package.json index 4a975f4a7c..48c0e0eb89 100644 --- a/packages/apps/reputation-oracle/server/package.json +++ b/packages/apps/reputation-oracle/server/package.json @@ -78,7 +78,7 @@ "@golevelup/ts-jest": "^3.0.0", "@nestjs/cli": "^11.0.16", "@nestjs/schematics": "^11.0.9", - "@nestjs/testing": "^11.1.14", + "@nestjs/testing": "^11.1.19", "@types/bcrypt": "^6.0.0", "@types/express": "^5.0.6", "@types/jest": "30.0.0", diff --git a/yarn.lock b/yarn.lock index 35cc4734bb..86357850aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -172,7 +172,7 @@ __metadata: "@nestjs/schedule": "npm:^6.1.1" "@nestjs/schematics": "npm:^11.0.9" "@nestjs/swagger": "npm:^11.2.5" - "@nestjs/testing": "npm:^11.1.14" + "@nestjs/testing": "npm:^11.1.19" "@types/express": "npm:^5.0.6" "@types/jest": "npm:30.0.0" "@types/node": "npm:22.10.5" @@ -327,7 +327,7 @@ __metadata: "@nestjs/schematics": "npm:^11.0.9" "@nestjs/swagger": "npm:^11.2.5" "@nestjs/terminus": "npm:^11.1.1" - "@nestjs/testing": "npm:^11.1.14" + "@nestjs/testing": "npm:^11.1.19" "@nestjs/typeorm": "npm:^11.0.0" "@types/body-parser": "npm:^1" "@types/express": "npm:^5.0.6" @@ -384,7 +384,7 @@ __metadata: "@nestjs/platform-express": "npm:^11.1.12" "@nestjs/schematics": "npm:^11.0.9" "@nestjs/swagger": "npm:^11.2.5" - "@nestjs/testing": "npm:^11.1.14" + "@nestjs/testing": "npm:^11.1.19" "@types/express": "npm:^5.0.6" "@types/jest": "npm:^29.5.14" "@types/node": "npm:^22.15.16" @@ -508,7 +508,7 @@ __metadata: "@nestjs/schematics": "npm:^11.0.9" "@nestjs/swagger": "npm:^11.2.5" "@nestjs/terminus": "npm:^11.1.1" - "@nestjs/testing": "npm:^11.1.14" + "@nestjs/testing": "npm:^11.1.19" "@types/express": "npm:^5.0.6" "@types/jest": "npm:30.0.0" "@types/jsonwebtoken": "npm:^9.0.7" @@ -631,7 +631,7 @@ __metadata: "@nestjs/schematics": "npm:^11.0.9" "@nestjs/swagger": "npm:^11.2.5" "@nestjs/terminus": "npm:^11.1.1" - "@nestjs/testing": "npm:^11.1.14" + "@nestjs/testing": "npm:^11.1.19" "@nestjs/throttler": "npm:^6.5.0" "@nestjs/typeorm": "npm:^11.0.0" "@sendgrid/mail": "npm:^8.1.3" @@ -705,7 +705,7 @@ __metadata: "@nestjs/schematics": "npm:^11.0.9" "@nestjs/swagger": "npm:^11.2.5" "@nestjs/terminus": "npm:^11.1.1" - "@nestjs/testing": "npm:^11.1.14" + "@nestjs/testing": "npm:^11.1.19" "@nestjs/typeorm": "npm:^11.0.0" "@sendgrid/mail": "npm:^8.1.3" "@slack/bolt": "npm:^4.2.1" @@ -7809,9 +7809,9 @@ __metadata: languageName: node linkType: hard -"@nestjs/testing@npm:^11.1.14": - version: 11.1.14 - resolution: "@nestjs/testing@npm:11.1.14" +"@nestjs/testing@npm:^11.1.19": + version: 11.1.19 + resolution: "@nestjs/testing@npm:11.1.19" dependencies: tslib: "npm:2.8.1" peerDependencies: @@ -7824,7 +7824,7 @@ __metadata: optional: true "@nestjs/platform-express": optional: true - checksum: 10c0/bde7b90fead08ca3a5a7f44331e5c4ccf2904bcba5b95bbfa4fe22fc278f3e22beadbe4c4408ec4ea2fcd6dea267faeef502ccc0d3276bd838f3723f0eba7148 + checksum: 10c0/58c1d8249384ca22dd68af20d8cbd555328e8c2bbecd64c2785964ef75a084c94b760edf08cc7085896496292bc6e5ec42e018e7743a99bb2f1bb23ba2ec5b55 languageName: node linkType: hard From 1e62a4203327ce9111f6e3c64e8895b9e077d3a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 09:38:50 +0200 Subject: [PATCH 09/12] chore(deps): bump pg and @types/pg (#3881) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../exchange-oracle/server/package.json | 4 +- .../apps/job-launcher/server/package.json | 2 +- .../reputation-oracle/server/package.json | 2 +- yarn.lock | 141 +++++------------- 4 files changed, 45 insertions(+), 104 deletions(-) diff --git a/packages/apps/fortune/exchange-oracle/server/package.json b/packages/apps/fortune/exchange-oracle/server/package.json index 661c4d0fd7..79e993faac 100644 --- a/packages/apps/fortune/exchange-oracle/server/package.json +++ b/packages/apps/fortune/exchange-oracle/server/package.json @@ -54,7 +54,7 @@ "minio": "8.0.6", "passport": "^0.7.0", "passport-jwt": "^4.0.1", - "pg": "8.13.1", + "pg": "8.20.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.2.0", "typeorm": "^0.3.28", @@ -72,7 +72,7 @@ "@types/jsonwebtoken": "^9.0.7", "@types/node": "22.10.5", "@types/passport": "^1", - "@types/pg": "8.11.10", + "@types/pg": "8.20.0", "eslint": "^10.1.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^29.15.1", diff --git a/packages/apps/job-launcher/server/package.json b/packages/apps/job-launcher/server/package.json index 6a04bff3d0..6c76a5d839 100644 --- a/packages/apps/job-launcher/server/package.json +++ b/packages/apps/job-launcher/server/package.json @@ -65,7 +65,7 @@ "node-cache": "^5.1.2", "passport": "^0.7.0", "passport-jwt": "^4.0.1", - "pg": "8.13.1", + "pg": "8.20.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.2.0", "stripe": "^17.7.0", diff --git a/packages/apps/reputation-oracle/server/package.json b/packages/apps/reputation-oracle/server/package.json index 48c0e0eb89..b265289a56 100644 --- a/packages/apps/reputation-oracle/server/package.json +++ b/packages/apps/reputation-oracle/server/package.json @@ -63,7 +63,7 @@ "minio": "8.0.6", "passport": "^0.7.0", "passport-jwt": "^4.0.1", - "pg": "8.13.1", + "pg": "8.20.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.2.0", "typeorm": "^0.3.28", diff --git a/yarn.lock b/yarn.lock index 86357850aa..a52a69eb8d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -336,7 +336,7 @@ __metadata: "@types/node": "npm:22.10.5" "@types/passport": "npm:^1" "@types/passport-jwt": "npm:^4.0.1" - "@types/pg": "npm:8.11.10" + "@types/pg": "npm:8.20.0" axios: "npm:^1.3.1" body-parser: "npm:^1.20.3" class-transformer: "npm:^0.5.1" @@ -354,7 +354,7 @@ __metadata: minio: "npm:8.0.6" passport: "npm:^0.7.0" passport-jwt: "npm:^4.0.1" - pg: "npm:8.13.1" + pg: "npm:8.20.0" prettier: "npm:^3.8.1" reflect-metadata: "npm:^0.2.2" rxjs: "npm:^7.2.0" @@ -665,7 +665,7 @@ __metadata: node-cache: "npm:^5.1.2" passport: "npm:^0.7.0" passport-jwt: "npm:^4.0.1" - pg: "npm:8.13.1" + pg: "npm:8.20.0" prettier: "npm:^3.8.1" reflect-metadata: "npm:^0.2.2" rxjs: "npm:^7.2.0" @@ -741,7 +741,7 @@ __metadata: nock: "npm:^14.0.11" passport: "npm:^0.7.0" passport-jwt: "npm:^4.0.1" - pg: "npm:8.13.1" + pg: "npm:8.20.0" prettier: "npm:^3.8.1" reflect-metadata: "npm:^0.2.2" rxjs: "npm:^7.2.0" @@ -12154,14 +12154,14 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:8.11.10": - version: 8.11.10 - resolution: "@types/pg@npm:8.11.10" +"@types/pg@npm:8.20.0": + version: 8.20.0 + resolution: "@types/pg@npm:8.20.0" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" - pg-types: "npm:^4.0.1" - checksum: 10c0/c8800d0ab2c6424308e6c6b40c73f19583ee1aed758462bd07694844b0a551b5841442205a4ee05207b80109ba502f33f20241b1bd9b4902e713611fb9e08f6c + pg-types: "npm:^2.2.0" + checksum: 10c0/c8b5aa794ea074aa20d0c1ef6c721ce0fe16f2c084d0ccc32b7f12909a08ec969e6b01a094ce8e7019cc425381c4b59f261bd0133daf0c6d4aca5c6c492e8312 languageName: node linkType: hard @@ -25373,13 +25373,6 @@ __metadata: languageName: node linkType: hard -"obuf@npm:~1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 - languageName: node - linkType: hard - "obug@npm:^2.1.1": version: 2.1.1 resolution: "obug@npm:2.1.1" @@ -26121,17 +26114,17 @@ __metadata: languageName: node linkType: hard -"pg-cloudflare@npm:^1.1.1": - version: 1.2.7 - resolution: "pg-cloudflare@npm:1.2.7" - checksum: 10c0/8a52713dbdecc9d389dc4e65e3b7ede2e199ec3715f7491ee80a15db171f2d75677a102e9c2cef0cb91a2f310e91f976eaec0dd6ef5d8bf357de0b948f9d9431 +"pg-cloudflare@npm:^1.3.0": + version: 1.3.0 + resolution: "pg-cloudflare@npm:1.3.0" + checksum: 10c0/b0866c88af8e54c7b3ed510719d92df37714b3af5e3a3a10d9f761fcec99483e222f5b78a1f2de590368127648087c45c01aaf66fadbe46edb25673eedc4f8fc languageName: node linkType: hard -"pg-connection-string@npm:^2.7.0": - version: 2.9.1 - resolution: "pg-connection-string@npm:2.9.1" - checksum: 10c0/9a646529bbc0843806fc5de98ce93735a4612b571f11867178a85665d11989a827e6fd157388ca0e34ec948098564fce836c178cfd499b9f0e8cd9972b8e2e5c +"pg-connection-string@npm:^2.12.0": + version: 2.12.0 + resolution: "pg-connection-string@npm:2.12.0" + checksum: 10c0/3a26c62884a9f0464718f652bd5d6bce276ebda830c0fef4de4f88ae73c2507d70cae1d45c2f5b49bebd76187fb4c94f889d07c53fca6acd06b2eecbebcdc336 languageName: node linkType: hard @@ -26142,30 +26135,30 @@ __metadata: languageName: node linkType: hard -"pg-numeric@npm:1.0.2": - version: 1.0.2 - resolution: "pg-numeric@npm:1.0.2" - checksum: 10c0/43dd9884e7b52c79ddc28d2d282d7475fce8bba13452d33c04ceb2e0a65f561edf6699694e8e1c832ff9093770496363183c950dd29608e1bdd98f344b25bca9 - languageName: node - linkType: hard - -"pg-pool@npm:^3.7.0": - version: 3.10.1 - resolution: "pg-pool@npm:3.10.1" +"pg-pool@npm:^3.13.0": + version: 3.13.0 + resolution: "pg-pool@npm:3.13.0" peerDependencies: pg: ">=8.0" - checksum: 10c0/a00916b7df64226cc597fe769e3a757ff9b11562dc87ce5b0a54101a18c1fe282daaa2accaf27221e81e1e4cdf4da6a33dab09614734d32904d6c4e11c44a079 + checksum: 10c0/2756f79cda14e3834356f2ca035deab806bca2172a38a488b62ada54bd3e65d33f583661bbe96da0c0e75e6bc59807ada733c37efca6e24ae2893429936a1549 languageName: node linkType: hard -"pg-protocol@npm:*, pg-protocol@npm:^1.7.0": +"pg-protocol@npm:*": version: 1.10.3 resolution: "pg-protocol@npm:1.10.3" checksum: 10c0/f7ef54708c93ee6d271e37678296fc5097e4337fca91a88a3d99359b78633dbdbf6e983f0adb34b7cdd261b7ec7266deb20c3233bf3dfdb498b3e1098e8750b9 languageName: node linkType: hard -"pg-types@npm:^2.1.0": +"pg-protocol@npm:^1.13.0": + version: 1.13.0 + resolution: "pg-protocol@npm:1.13.0" + checksum: 10c0/a4e851e6bb8ff404ca19d561cf49b6b0caf45163bd3f289889edaf6c4e9fb25b08fb57f50d37a8cc86007efcf2cbb3dd2372c97a353a546f45eb49ddebc84fa9 + languageName: node + linkType: hard + +"pg-types@npm:2.2.0, pg-types@npm:^2.2.0": version: 2.2.0 resolution: "pg-types@npm:2.2.0" dependencies: @@ -26178,31 +26171,16 @@ __metadata: languageName: node linkType: hard -"pg-types@npm:^4.0.1": - version: 4.1.0 - resolution: "pg-types@npm:4.1.0" - dependencies: - pg-int8: "npm:1.0.1" - pg-numeric: "npm:1.0.2" - postgres-array: "npm:~3.0.1" - postgres-bytea: "npm:~3.0.0" - postgres-date: "npm:~2.1.0" - postgres-interval: "npm:^3.0.0" - postgres-range: "npm:^1.1.1" - checksum: 10c0/462a56b5c34e0dff38fc5f6ac939c66e80a92333a79bfb1d963ffe0383ca33427a16899e0b9d23235ce1f5df42473373fb9c9f24e1f614f8698b58cc45435ca6 - languageName: node - linkType: hard - -"pg@npm:8.13.1": - version: 8.13.1 - resolution: "pg@npm:8.13.1" +"pg@npm:8.20.0": + version: 8.20.0 + resolution: "pg@npm:8.20.0" dependencies: - pg-cloudflare: "npm:^1.1.1" - pg-connection-string: "npm:^2.7.0" - pg-pool: "npm:^3.7.0" - pg-protocol: "npm:^1.7.0" - pg-types: "npm:^2.1.0" - pgpass: "npm:1.x" + pg-cloudflare: "npm:^1.3.0" + pg-connection-string: "npm:^2.12.0" + pg-pool: "npm:^3.13.0" + pg-protocol: "npm:^1.13.0" + pg-types: "npm:2.2.0" + pgpass: "npm:1.0.5" peerDependencies: pg-native: ">=3.0.1" dependenciesMeta: @@ -26211,11 +26189,11 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: 10c0/c13bc661cbdb115337bc8519254836faf4bd79106dfd7ed588c8ece8c8b2dd3b7376bfec9a9a2f7646fa095b0b310cec77a83c3ba2ea4872331446eb93fd9055 + checksum: 10c0/e21d44b9fb3ec188e67778d7abd32d945a546f2da5128b6c8c16da8ae1e42fdc953c0d6f0a2ee65d11f31808c1dffaf908cb9c880cd2e8f0ae05525e4b8bc832 languageName: node linkType: hard -"pgpass@npm:1.x": +"pgpass@npm:1.0.5": version: 1.0.5 resolution: "pgpass@npm:1.0.5" dependencies: @@ -26543,13 +26521,6 @@ __metadata: languageName: node linkType: hard -"postgres-array@npm:~3.0.1": - version: 3.0.4 - resolution: "postgres-array@npm:3.0.4" - checksum: 10c0/47f3e648da512bacdd6a5ed55cf770605ec271330789faeece0fd13805a49f376d6e5c9e0e353377be11a9545e727dceaa2473566c505432bf06366ccd04c6b2 - languageName: node - linkType: hard - "postgres-bytea@npm:~1.0.0": version: 1.0.0 resolution: "postgres-bytea@npm:1.0.0" @@ -26557,15 +26528,6 @@ __metadata: languageName: node linkType: hard -"postgres-bytea@npm:~3.0.0": - version: 3.0.0 - resolution: "postgres-bytea@npm:3.0.0" - dependencies: - obuf: "npm:~1.1.2" - checksum: 10c0/41c79cc48aa730c5ba3eda6ab989a940034f07a1f57b8f2777dce56f1b8cca16c5870582932b5b10cc605048aef9b6157e06253c871b4717cafc6d00f55376aa - languageName: node - linkType: hard - "postgres-date@npm:~1.0.4": version: 1.0.7 resolution: "postgres-date@npm:1.0.7" @@ -26573,13 +26535,6 @@ __metadata: languageName: node linkType: hard -"postgres-date@npm:~2.1.0": - version: 2.1.0 - resolution: "postgres-date@npm:2.1.0" - checksum: 10c0/00a7472c10788f6b0d08d24108bf1eb80858de1bd6317740198a564918ea4a69b80c98148167b92ae688abd606483020d0de0dd3a36f3ea9a3e26bbeef3464f4 - languageName: node - linkType: hard - "postgres-interval@npm:^1.1.0": version: 1.2.0 resolution: "postgres-interval@npm:1.2.0" @@ -26589,20 +26544,6 @@ __metadata: languageName: node linkType: hard -"postgres-interval@npm:^3.0.0": - version: 3.0.0 - resolution: "postgres-interval@npm:3.0.0" - checksum: 10c0/8b570b30ea37c685e26d136d34460f246f98935a1533defc4b53bb05ee23ae3dc7475b718ec7ea607a57894d8c6b4f1adf67ca9cc83a75bdacffd427d5c68de8 - languageName: node - linkType: hard - -"postgres-range@npm:^1.1.1": - version: 1.1.4 - resolution: "postgres-range@npm:1.1.4" - checksum: 10c0/254494ef81df208e0adeae6b66ce394aba37914ea14c7ece55a45fb6691b7db04bee74c825380a47c887a9f87158fd3d86f758f9cc60b76d3a38ce5aca7912e8 - languageName: node - linkType: hard - "preact@npm:10.24.2": version: 10.24.2 resolution: "preact@npm:10.24.2" From b7e0e80a51df8d3951dc11b5c3026fdd46f7cfbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20L=C3=B3pez?= <50665615+flopez7@users.noreply.github.com> Date: Mon, 4 May 2026 11:11:34 +0200 Subject: [PATCH 10/12] [Reputation Oracle] Mark escrow completion as completed before webhook creation (#3876) Co-authored-by: flopez7 Co-authored-by: portuu3 <61605646+portuu3@users.noreply.github.com> --- .../escrow-completion/escrow-completion.service.spec.ts | 3 +-- .../modules/escrow-completion/escrow-completion.service.ts | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts index d8a951f98f..a912424054 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts @@ -958,8 +958,7 @@ describe('EscrowCompletionService', () => { ); expect(mockEscrowCompletionRepository.updateOne).toHaveBeenCalledWith({ ...paidPayoutsRecord, - failureDetail: 'Error message: Webhook url is no set for oracle', - status: 'failed', + status: 'completed', }); }); diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts index cf119c2515..8dbc5731f6 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts @@ -294,7 +294,11 @@ export class EscrowCompletionService { const { webhookUrl } = oracleData; if (!webhookUrl) { - throw new Error('Webhook url is no set for oracle'); + this.logger.error('Webhook url is not set for this oracle', { + escrowCompletionEntityId: escrowCompletionEntity.id, + oracleAddress, + }); + continue; } try { From bd7d1be9004efb30d323662b1c44fbdd509caaa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20L=C3=B3pez?= <50665615+flopez7@users.noreply.github.com> Date: Tue, 5 May 2026 08:16:47 +0200 Subject: [PATCH 11/12] [Reputation Oracle] Add marketing job (#3875) Co-authored-by: flopez7 Co-authored-by: Copilot Co-authored-by: portuu3 --- .../server/scripts/setup-kv-store.ts | 2 +- .../server/src/common/enums/manifest.ts | 4 + .../server/src/common/types/job-result.ts | 12 ++ .../server/src/common/types/manifest.ts | 12 +- .../escrow-completion.service.spec.ts | 30 ++++- .../escrow-completion.service.ts | 12 ++ .../escrow-completion/fixtures/index.ts | 1 + .../escrow-completion/fixtures/marketing.ts | 28 ++++ .../payouts-calculation/index.ts | 1 + .../marketing-payouts-calculator.spec.ts | 110 ++++++++++++++++ .../marketing-payouts-calculator.ts | 62 +++++++++ .../payouts-calculation/module.ts | 13 +- .../results-processing/index.ts | 1 + .../marketing-results-processor.spec.ts | 120 ++++++++++++++++++ .../marketing-results-processor.ts | 32 +++++ .../results-processing/module.ts | 13 +- .../server/src/utils/manifest.ts | 16 ++- 17 files changed, 458 insertions(+), 11 deletions(-) create mode 100644 packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/marketing.ts create mode 100644 packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.spec.ts create mode 100644 packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.ts create mode 100644 packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.spec.ts create mode 100644 packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.ts diff --git a/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts b/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts index 45ded5aea5..9672b2d2e9 100644 --- a/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts +++ b/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts @@ -16,7 +16,7 @@ const RPC_URL = isLocalEnv : process.env.RPC_URL_POLYGON_AMOY; const DEFAULT_SUPPORTED_JOB_TYPES = - 'fortune,image_boxes,image_boxes_from_points,image_points,image_polygons,image_skeletons_from_boxes'; + 'fortune,social_media_promotion,image_boxes,image_boxes_from_points,image_points,image_polygons,image_skeletons_from_boxes'; const ROLE = Role.ReputationOracle; async function setupCommonValues(kvStoreClient: KVStoreClient): Promise { diff --git a/packages/apps/reputation-oracle/server/src/common/enums/manifest.ts b/packages/apps/reputation-oracle/server/src/common/enums/manifest.ts index 80d3c77ade..9dc61669af 100644 --- a/packages/apps/reputation-oracle/server/src/common/enums/manifest.ts +++ b/packages/apps/reputation-oracle/server/src/common/enums/manifest.ts @@ -2,6 +2,10 @@ export enum FortuneJobType { FORTUNE = 'fortune', } +export enum MarketingJobType { + SOCIAL_MEDIA_PROMOTION = 'social_media_promotion', +} + export enum CvatJobType { IMAGE_BOXES = 'image_boxes', IMAGE_POINTS = 'image_points', diff --git a/packages/apps/reputation-oracle/server/src/common/types/job-result.ts b/packages/apps/reputation-oracle/server/src/common/types/job-result.ts index eb0ff27812..cab3caad0e 100644 --- a/packages/apps/reputation-oracle/server/src/common/types/job-result.ts +++ b/packages/apps/reputation-oracle/server/src/common/types/job-result.ts @@ -4,6 +4,18 @@ export type FortuneFinalResult = { error?: 'duplicated' | 'curse_word'; }; +export enum VerificationResult { + Accepted = 'accepted', + Rejected = 'rejected', +} + +export type MarketingFinalResult = { + workerAddress: string; + postUrl: string; + verificationResult: VerificationResult; + rejectionReason?: string; +}; + type CvatAnnotationMetaJob = { job_id: number; final_result_id: number; diff --git a/packages/apps/reputation-oracle/server/src/common/types/manifest.ts b/packages/apps/reputation-oracle/server/src/common/types/manifest.ts index 774833067e..d52ffca23c 100644 --- a/packages/apps/reputation-oracle/server/src/common/types/manifest.ts +++ b/packages/apps/reputation-oracle/server/src/common/types/manifest.ts @@ -1,4 +1,4 @@ -import { CvatJobType, FortuneJobType } from '@/common/enums'; +import { CvatJobType, FortuneJobType, MarketingJobType } from '@/common/enums'; export type FortuneManifest = { submissionsRequired: number; @@ -6,6 +6,12 @@ export type FortuneManifest = { requestType: FortuneJobType; }; +export type MarketingManifest = { + job_type: MarketingJobType; + submissions_required: number; + end_date?: string; +}; + export type CvatManifest = { annotation: { type: CvatJobType; @@ -16,6 +22,6 @@ export type CvatManifest = { job_bounty: string; }; -export type JobManifest = FortuneManifest | CvatManifest; +export type JobManifest = FortuneManifest | MarketingManifest | CvatManifest; -export type JobRequestType = FortuneJobType | CvatJobType; +export type JobRequestType = FortuneJobType | MarketingJobType | CvatJobType; diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts index a912424054..e63eece4b1 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.spec.ts @@ -25,7 +25,7 @@ import { Test } from '@nestjs/testing'; import stringify from 'json-stable-stringify'; import _ from 'lodash'; -import { CvatJobType, FortuneJobType } from '@/common/enums'; +import { CvatJobType, FortuneJobType, MarketingJobType } from '@/common/enums'; import { ServerConfigService, Web3ConfigService } from '@/config'; import { ReputationService } from '@/modules/reputation'; import { StorageService } from '@/modules/storage'; @@ -49,10 +49,12 @@ import { import { CvatPayoutsCalculator, FortunePayoutsCalculator, + MarketingPayoutsCalculator, } from './payouts-calculation'; import { CvatResultsProcessor, FortuneResultsProcessor, + MarketingResultsProcessor, } from './results-processing'; const mockServerConfigService = { @@ -68,8 +70,10 @@ const mockOutgoingWebhookService = createMock(); const mockReputationService = createMock(); const mockFortuneResultsProcessor = createMock(); const mockCvatResultsProcessor = createMock(); +const mockMarketingResultsProcessor = createMock(); const mockFortunePayoutsCalculator = createMock(); const mockCvatPayoutsCalculator = createMock(); +const mockMarketingPayoutsCalculator = createMock(); const mockedEscrowClient = jest.mocked(EscrowClient); const mockedEscrowUtils = jest.mocked(EscrowUtils); @@ -122,6 +126,10 @@ describe('EscrowCompletionService', () => { provide: CvatResultsProcessor, useValue: mockCvatResultsProcessor, }, + { + provide: MarketingResultsProcessor, + useValue: mockMarketingResultsProcessor, + }, { provide: FortunePayoutsCalculator, useValue: mockFortunePayoutsCalculator, @@ -130,6 +138,10 @@ describe('EscrowCompletionService', () => { provide: CvatPayoutsCalculator, useValue: mockCvatPayoutsCalculator, }, + { + provide: MarketingPayoutsCalculator, + useValue: mockMarketingPayoutsCalculator, + }, ], }).compile(); @@ -1199,6 +1211,14 @@ describe('EscrowCompletionService', () => { ); }, ); + it.each(Object.values(MarketingJobType))( + 'should return marketing processor for "%s" job type', + (jobRequestType) => { + expect(service['getEscrowResultsProcessor'](jobRequestType)).toBe( + mockMarketingResultsProcessor, + ); + }, + ); }); describe('getEscrowPayoutsCalculator', () => { @@ -1218,5 +1238,13 @@ describe('EscrowCompletionService', () => { ); }, ); + it.each(Object.values(MarketingJobType))( + 'should return marketing calculator for "%s" job type', + (jobRequestType) => { + expect(service['getEscrowPayoutsCalculator'](jobRequestType)).toBe( + mockMarketingPayoutsCalculator, + ); + }, + ); }); }); diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts index 8dbc5731f6..46755dd3d1 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/escrow-completion.service.ts @@ -40,11 +40,13 @@ import { FortunePayoutsCalculator, EscrowPayoutsCalculator, CalculatedPayout, + MarketingPayoutsCalculator, } from './payouts-calculation'; import { CvatResultsProcessor, EscrowResultsProcessor, FortuneResultsProcessor, + MarketingResultsProcessor, } from './results-processing'; @Injectable() @@ -64,8 +66,10 @@ export class EscrowCompletionService { private readonly reputationService: ReputationService, private readonly cvatResultsProcessor: CvatResultsProcessor, private readonly fortuneResultsProcessor: FortuneResultsProcessor, + private readonly marketingResultsProcessor: MarketingResultsProcessor, private readonly cvatPayoutsCalculator: CvatPayoutsCalculator, private readonly fortunePayoutsCalculator: FortunePayoutsCalculator, + private readonly marketingPayoutsCalculator: MarketingPayoutsCalculator, ) {} async createEscrowCompletion( @@ -487,6 +491,10 @@ export class EscrowCompletionService { return this.fortuneResultsProcessor; } + if (manifestUtils.isMarketingJobType(jobRequestType)) { + return this.marketingResultsProcessor; + } + if (manifestUtils.isCvatJobType(jobRequestType)) { return this.cvatResultsProcessor; } @@ -503,6 +511,10 @@ export class EscrowCompletionService { return this.fortunePayoutsCalculator; } + if (manifestUtils.isMarketingJobType(jobRequestType)) { + return this.marketingPayoutsCalculator; + } + if (manifestUtils.isCvatJobType(jobRequestType)) { return this.cvatPayoutsCalculator; } diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/index.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/index.ts index 912b0121d6..9503654031 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/index.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/index.ts @@ -1,2 +1,3 @@ export * from './fortune'; export * from './cvat'; +export * from './marketing'; diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/marketing.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/marketing.ts new file mode 100644 index 0000000000..46f2da3b14 --- /dev/null +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/fixtures/marketing.ts @@ -0,0 +1,28 @@ +import { faker } from '@faker-js/faker'; + +import { MarketingJobType } from '@/common/enums'; +import { + VerificationResult, + MarketingFinalResult, + MarketingManifest, +} from '@/common/types'; + +export function generateMarketingManifest(): MarketingManifest { + return { + job_type: MarketingJobType.SOCIAL_MEDIA_PROMOTION, + submissions_required: faker.number.int({ min: 2, max: 5 }), + }; +} + +export function generateMarketingResult( + verificationResult: MarketingFinalResult['verificationResult'] = VerificationResult.Accepted, +): MarketingFinalResult { + return { + workerAddress: faker.finance.ethereumAddress(), + postUrl: `https://x.com/${faker.internet.username().replace(/_/g, '')}/status/${faker.number.int({ min: 1000, max: 999999999 })}`, + verificationResult, + ...(verificationResult === VerificationResult.Rejected + ? { rejectionReason: faker.lorem.word() } + : {}), + }; +} diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/index.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/index.ts index 4d386af245..abd815d57a 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/index.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/index.ts @@ -1,3 +1,4 @@ export { CvatPayoutsCalculator } from './cvat-payouts-calculator'; export { FortunePayoutsCalculator } from './fortune-payouts-calculator'; +export { MarketingPayoutsCalculator } from './marketing-payouts-calculator'; export * from './types'; diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.spec.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.spec.ts new file mode 100644 index 0000000000..cb8222d9a7 --- /dev/null +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.spec.ts @@ -0,0 +1,110 @@ +jest.mock('@human-protocol/sdk'); + +import { faker } from '@faker-js/faker'; +import { createMock } from '@golevelup/ts-jest'; +import { EscrowClient } from '@human-protocol/sdk'; +import { Test } from '@nestjs/testing'; + +import { VerificationResult } from '@/common/types'; +import { StorageService } from '@/modules/storage'; +import { Web3Service } from '@/modules/web3'; +import { generateTestnetChainId } from '@/modules/web3/fixtures'; + +import { + generateMarketingManifest, + generateMarketingResult, +} from '../fixtures'; +import { MarketingPayoutsCalculator } from './marketing-payouts-calculator'; + +const mockedStorageService = createMock(); +const mockedWeb3Service = createMock(); +const mockedEscrowClient = jest.mocked(EscrowClient); + +describe('MarketingPayoutsCalculator', () => { + let calculator: MarketingPayoutsCalculator; + + beforeAll(async () => { + const moduleRef = await Test.createTestingModule({ + providers: [ + MarketingPayoutsCalculator, + { + provide: StorageService, + useValue: mockedStorageService, + }, + { + provide: Web3Service, + useValue: mockedWeb3Service, + }, + ], + }).compile(); + + calculator = moduleRef.get( + MarketingPayoutsCalculator, + ); + }); + + describe('calculate', () => { + const balance = BigInt(faker.number.int({ min: 1000 }).toString()); + const mockedGetReservedFunds = jest + .fn() + .mockImplementation(async () => balance); + + beforeAll(() => { + mockedEscrowClient.build.mockResolvedValue({ + getReservedFunds: mockedGetReservedFunds, + } as unknown as EscrowClient); + }); + + it('should properly calculate payouts for accepted results only', async () => { + const acceptedResults = [ + generateMarketingResult(VerificationResult.Accepted), + generateMarketingResult(VerificationResult.Accepted), + ]; + mockedStorageService.downloadJsonLikeData.mockResolvedValueOnce( + faker.helpers.shuffle([ + ...acceptedResults, + generateMarketingResult(VerificationResult.Rejected), + ]), + ); + + const manifest = generateMarketingManifest(); + const payouts = await calculator.calculate({ + chainId: generateTestnetChainId(), + escrowAddress: faker.finance.ethereumAddress(), + finalResultsUrl: faker.internet.url(), + manifest: manifest, + }); + + const expectedPayouts = acceptedResults.map((result) => ({ + address: result.workerAddress, + amount: balance / BigInt(manifest.submissions_required), + })); + + const normalize = (items: { address: string; amount: bigint }[]) => + items + .map((item) => ({ + address: item.address.toLowerCase(), + amount: item.amount.toString(), + })) + .sort((a, b) => a.address.localeCompare(b.address)); + + expect(normalize(payouts)).toEqual(normalize(expectedPayouts)); + }); + + it('should return an empty list when there are no accepted results', async () => { + mockedStorageService.downloadJsonLikeData.mockResolvedValueOnce([ + generateMarketingResult(VerificationResult.Rejected), + generateMarketingResult(VerificationResult.Rejected), + ]); + + const payouts = await calculator.calculate({ + chainId: generateTestnetChainId(), + escrowAddress: faker.finance.ethereumAddress(), + finalResultsUrl: faker.internet.url(), + manifest: generateMarketingManifest(), + }); + + expect(payouts).toEqual([]); + }); + }); +}); diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.ts new file mode 100644 index 0000000000..3c60ad7206 --- /dev/null +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/marketing-payouts-calculator.ts @@ -0,0 +1,62 @@ +import { EscrowClient } from '@human-protocol/sdk'; +import { Injectable } from '@nestjs/common'; +import type { OverrideProperties } from 'type-fest'; + +import { + MarketingFinalResult, + MarketingManifest, + VerificationResult, +} from '@/common/types'; +import { StorageService } from '@/modules/storage'; +import { Web3Service } from '@/modules/web3'; + +import { + CalclulatePayoutsInput, + CalculatedPayout, + EscrowPayoutsCalculator, +} from './types'; + +type CalculateMarketingPayoutsInput = OverrideProperties< + CalclulatePayoutsInput, + { manifest: MarketingManifest } +>; + +@Injectable() +export class MarketingPayoutsCalculator implements EscrowPayoutsCalculator { + constructor( + private readonly storageService: StorageService, + private readonly web3Service: Web3Service, + ) {} + + async calculate({ + manifest, + chainId, + escrowAddress, + finalResultsUrl, + }: CalculateMarketingPayoutsInput): Promise { + const signer = this.web3Service.getSigner(chainId); + const escrowClient = await EscrowClient.build(signer); + const finalResults = + await this.storageService.downloadJsonLikeData( + finalResultsUrl, + ); + + const recipients = finalResults + .filter( + (result) => result.verificationResult === VerificationResult.Accepted, + ) + .map((item) => item.workerAddress); + + if (!recipients.length) { + return []; + } + + const reservedFunds = await escrowClient.getReservedFunds(escrowAddress); + const payoutAmount = reservedFunds / BigInt(manifest.submissions_required); + + return recipients.map((recipient) => ({ + address: recipient, + amount: payoutAmount, + })); + } +} diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/module.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/module.ts index 578dcd8277..31147e9502 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/module.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/payouts-calculation/module.ts @@ -5,10 +5,19 @@ import { Web3Module } from '@/modules/web3'; import { CvatPayoutsCalculator } from './cvat-payouts-calculator'; import { FortunePayoutsCalculator } from './fortune-payouts-calculator'; +import { MarketingPayoutsCalculator } from './marketing-payouts-calculator'; @Module({ imports: [StorageModule, Web3Module], - providers: [CvatPayoutsCalculator, FortunePayoutsCalculator], - exports: [CvatPayoutsCalculator, FortunePayoutsCalculator], + providers: [ + CvatPayoutsCalculator, + FortunePayoutsCalculator, + MarketingPayoutsCalculator, + ], + exports: [ + CvatPayoutsCalculator, + FortunePayoutsCalculator, + MarketingPayoutsCalculator, + ], }) export class EscrowPayoutsCalculationModule {} diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/index.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/index.ts index 3f4731aceb..c6c989a922 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/index.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/index.ts @@ -1,3 +1,4 @@ export { CvatResultsProcessor } from './cvat-results-processor'; export { type EscrowResultsProcessor } from './escrow-results-processor'; export { FortuneResultsProcessor } from './fortune-results-processor'; +export { MarketingResultsProcessor } from './marketing-results-processor'; diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.spec.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.spec.ts new file mode 100644 index 0000000000..9cba041828 --- /dev/null +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.spec.ts @@ -0,0 +1,120 @@ +import { faker } from '@faker-js/faker'; +import { createMock } from '@golevelup/ts-jest'; +import { Test } from '@nestjs/testing'; + +import { VerificationResult } from '@/common/types'; +import { PgpEncryptionService } from '@/modules/encryption'; +import { StorageService } from '@/modules/storage'; +import { Web3Service } from '@/modules/web3'; + +import { + generateMarketingManifest, + generateMarketingResult, +} from '../fixtures'; +import { BaseEscrowResultsProcessor } from './escrow-results-processor'; +import { MarketingResultsProcessor } from './marketing-results-processor'; + +const mockedStorageService = createMock(); +const mockedPgpEncryptionService = createMock(); +const mockedWeb3Service = createMock(); + +describe('MarketingResultsProcessor', () => { + let processor: MarketingResultsProcessor; + + beforeAll(async () => { + const moduleRef = await Test.createTestingModule({ + providers: [ + MarketingResultsProcessor, + { + provide: StorageService, + useValue: mockedStorageService, + }, + { + provide: PgpEncryptionService, + useValue: mockedPgpEncryptionService, + }, + { + provide: Web3Service, + useValue: mockedWeb3Service, + }, + ], + }).compile(); + + processor = moduleRef.get( + MarketingResultsProcessor, + ); + }); + + it('should be properly initialized', () => { + expect(processor).toBeDefined(); + expect(processor).toBeInstanceOf(BaseEscrowResultsProcessor); + }); + + describe('constructIntermediateResultsUrl', () => { + it('should return intermediate results url as is', () => { + const baseUrl = faker.internet.url(); + + expect(processor['constructIntermediateResultsUrl'](baseUrl)).toBe( + baseUrl, + ); + }); + }); + + describe('assertResultsComplete', () => { + const testManifest = generateMarketingManifest(); + + it('throws if results is not json', async () => { + await expect( + processor['assertResultsComplete']( + Buffer.from(faker.lorem.words()), + testManifest, + ), + ).rejects.toThrow('Failed to parse results data'); + }); + + it('throws if results is not array', async () => { + await expect( + processor['assertResultsComplete']( + Buffer.from(JSON.stringify({})), + testManifest, + ), + ).rejects.toThrow('No final results found'); + }); + + it('throws if results is empty array', async () => { + await expect( + processor['assertResultsComplete']( + Buffer.from(JSON.stringify([])), + testManifest, + ), + ).rejects.toThrow('No final results found'); + }); + + it('passes when there are accepted and rejected results', async () => { + await expect( + processor['assertResultsComplete']( + Buffer.from( + JSON.stringify([ + generateMarketingResult(VerificationResult.Accepted), + generateMarketingResult(VerificationResult.Rejected), + ]), + ), + testManifest, + ), + ).resolves.not.toThrow(); + }); + + it('passes when there are only rejected results', async () => { + await expect( + processor['assertResultsComplete']( + Buffer.from( + JSON.stringify([ + generateMarketingResult(VerificationResult.Rejected), + ]), + ), + testManifest, + ), + ).resolves.not.toThrow(); + }); + }); +}); diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.ts new file mode 100644 index 0000000000..eeca140661 --- /dev/null +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/marketing-results-processor.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; + +import { MarketingFinalResult, MarketingManifest } from '@/common/types'; + +import { BaseEscrowResultsProcessor } from './escrow-results-processor'; + +@Injectable() +export class MarketingResultsProcessor extends BaseEscrowResultsProcessor { + protected constructIntermediateResultsUrl(baseUrl: string): string { + return baseUrl; + } + + protected async assertResultsComplete( + resultsFileContent: Buffer, + _manifest: MarketingManifest, + ): Promise { + let finalResults: MarketingFinalResult[]; + try { + finalResults = JSON.parse(resultsFileContent.toString()); + } catch { + throw new Error('Failed to parse results data'); + } + + if (!Array.isArray(finalResults) || !finalResults.length) { + throw new Error('No final results found'); + } + } + + protected getFinalResultsFileName(hash: string): string { + return `${hash}.json`; + } +} diff --git a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/module.ts b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/module.ts index 6057b7d620..dbde327c09 100644 --- a/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/module.ts +++ b/packages/apps/reputation-oracle/server/src/modules/escrow-completion/results-processing/module.ts @@ -6,10 +6,19 @@ import { Web3Module } from '@/modules/web3'; import { CvatResultsProcessor } from './cvat-results-processor'; import { FortuneResultsProcessor } from './fortune-results-processor'; +import { MarketingResultsProcessor } from './marketing-results-processor'; @Module({ imports: [EncryptionModule, StorageModule, Web3Module], - providers: [CvatResultsProcessor, FortuneResultsProcessor], - exports: [CvatResultsProcessor, FortuneResultsProcessor], + providers: [ + CvatResultsProcessor, + FortuneResultsProcessor, + MarketingResultsProcessor, + ], + exports: [ + CvatResultsProcessor, + FortuneResultsProcessor, + MarketingResultsProcessor, + ], }) export class EscrowResultsProcessingModule {} diff --git a/packages/apps/reputation-oracle/server/src/utils/manifest.ts b/packages/apps/reputation-oracle/server/src/utils/manifest.ts index 84804b1901..bd148288bc 100644 --- a/packages/apps/reputation-oracle/server/src/utils/manifest.ts +++ b/packages/apps/reputation-oracle/server/src/utils/manifest.ts @@ -1,4 +1,4 @@ -import { CvatJobType, FortuneJobType } from '@/common/enums'; +import { CvatJobType, FortuneJobType, MarketingJobType } from '@/common/enums'; import { JobManifest, JobRequestType } from '@/common/types'; const fortuneJobTypes = Object.values(FortuneJobType); @@ -7,13 +7,23 @@ export function isFortuneJobType(value: string): value is FortuneJobType { return fortuneJobTypes.includes(value as FortuneJobType); } +const marketingJobTypes = Object.values(MarketingJobType); + +export function isMarketingJobType(value: string): value is MarketingJobType { + return marketingJobTypes.includes(value as MarketingJobType); +} + const cvatJobTypes = Object.values(CvatJobType); export function isCvatJobType(value: string): value is CvatJobType { return cvatJobTypes.includes(value as CvatJobType); } -const validJobRequestTypes: string[] = [...fortuneJobTypes, ...cvatJobTypes]; +const validJobRequestTypes: string[] = [ + ...fortuneJobTypes, + ...marketingJobTypes, + ...cvatJobTypes, +]; function assertValidJobRequestType( value: string, @@ -30,6 +40,8 @@ export function getJobRequestType(manifest: JobManifest): JobRequestType { if ('requestType' in manifest) { jobRequestType = manifest.requestType; + } else if ('job_type' in manifest) { + jobRequestType = manifest.job_type; } else if ('annotation' in manifest) { jobRequestType = manifest.annotation.type; } From 211a887c22a27d745c9dd9d193d82520d8e8bcb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20L=C3=B3pez?= <50665615+flopez7@users.noreply.github.com> Date: Wed, 6 May 2026 16:05:35 +0200 Subject: [PATCH 12/12] add "types" for node and jest to multiple tsconfig files (#3889) Co-authored-by: flopez7 --- packages/apps/dashboard/server/tsconfig.json | 4 ++-- packages/apps/faucet/client/tsconfig.json | 1 - packages/apps/faucet/server/tsconfig.json | 3 ++- .../apps/fortune/exchange-oracle/client/tsconfig.json | 1 - .../apps/fortune/exchange-oracle/server/tsconfig.json | 4 ++-- packages/apps/fortune/recording-oracle/tsconfig.json | 1 + packages/apps/human-app/server/tsconfig.json | 6 +++--- packages/apps/job-launcher/client/tsconfig.json | 1 - .../job-launcher/server/src/common/validators/tokens.ts | 2 +- .../server/src/modules/job/job.repository.ts | 2 +- .../job-launcher/server/src/modules/job/job.service.ts | 5 ++--- .../server/src/modules/manifest/manifest.service.ts | 2 -- packages/apps/job-launcher/server/tsconfig.json | 4 ++-- packages/apps/reputation-oracle/server/tsconfig.json | 9 ++++----- packages/apps/staking/tsconfig.json | 1 - packages/subgraph/hmt/tsconfig.json | 1 - packages/subgraph/human-protocol/tsconfig.json | 1 - 17 files changed, 20 insertions(+), 28 deletions(-) diff --git a/packages/apps/dashboard/server/tsconfig.json b/packages/apps/dashboard/server/tsconfig.json index 4ac4174ca9..349d30a048 100644 --- a/packages/apps/dashboard/server/tsconfig.json +++ b/packages/apps/dashboard/server/tsconfig.json @@ -9,7 +9,6 @@ "target": "es2023", "sourceMap": true, "outDir": "./dist", - "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": false, @@ -17,6 +16,7 @@ "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false, - "esModuleInterop": true + "esModuleInterop": true, + "types": ["node", "jest"] } } diff --git a/packages/apps/faucet/client/tsconfig.json b/packages/apps/faucet/client/tsconfig.json index 9854ccc953..d538e2f2f7 100644 --- a/packages/apps/faucet/client/tsconfig.json +++ b/packages/apps/faucet/client/tsconfig.json @@ -17,7 +17,6 @@ "jsx": "react-jsx", "resolveJsonModule": true, "downlevelIteration": true, - "baseUrl": "./", "types": ["node"] }, "include": ["src"] diff --git a/packages/apps/faucet/server/tsconfig.json b/packages/apps/faucet/server/tsconfig.json index 1dd6c28e27..5714698029 100644 --- a/packages/apps/faucet/server/tsconfig.json +++ b/packages/apps/faucet/server/tsconfig.json @@ -17,6 +17,7 @@ "outDir": "build", "useUnknownInCatchVariables": false, "strictNullChecks": false, - "allowJs": true + "allowJs": true, + "types": ["node", "jest"] } } diff --git a/packages/apps/fortune/exchange-oracle/client/tsconfig.json b/packages/apps/fortune/exchange-oracle/client/tsconfig.json index 8b928a1b2b..177491cbf4 100644 --- a/packages/apps/fortune/exchange-oracle/client/tsconfig.json +++ b/packages/apps/fortune/exchange-oracle/client/tsconfig.json @@ -17,7 +17,6 @@ "jsx": "react-jsx", "resolveJsonModule": true, "downlevelIteration": true, - "baseUrl": ".", "types": ["node", "jest", "@testing-library/jest-dom"] }, "include": ["src", "tests"] diff --git a/packages/apps/fortune/exchange-oracle/server/tsconfig.json b/packages/apps/fortune/exchange-oracle/server/tsconfig.json index a1e0956c73..d6e2bc7276 100644 --- a/packages/apps/fortune/exchange-oracle/server/tsconfig.json +++ b/packages/apps/fortune/exchange-oracle/server/tsconfig.json @@ -10,7 +10,6 @@ "target": "es2023", "sourceMap": true, "outDir": "./dist", - "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": true, @@ -18,6 +17,7 @@ "strictBindCallApply": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, - "esModuleInterop": true + "esModuleInterop": true, + "types": ["node", "jest"] } } diff --git a/packages/apps/fortune/recording-oracle/tsconfig.json b/packages/apps/fortune/recording-oracle/tsconfig.json index 8c03f46cd7..104cb82667 100644 --- a/packages/apps/fortune/recording-oracle/tsconfig.json +++ b/packages/apps/fortune/recording-oracle/tsconfig.json @@ -21,6 +21,7 @@ "strictNullChecks": true, "strictPropertyInitialization": false, "baseUrl": ".", + "types": ["node", "jest"], "paths": { "@/*": ["src/*"] } diff --git a/packages/apps/human-app/server/tsconfig.json b/packages/apps/human-app/server/tsconfig.json index fa2f86f2a3..0a823addd6 100644 --- a/packages/apps/human-app/server/tsconfig.json +++ b/packages/apps/human-app/server/tsconfig.json @@ -10,7 +10,6 @@ "target": "es2023", "sourceMap": true, "outDir": "./dist", - "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": true, @@ -19,6 +18,7 @@ "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "types": ["node", "jest"] } -} \ No newline at end of file +} diff --git a/packages/apps/job-launcher/client/tsconfig.json b/packages/apps/job-launcher/client/tsconfig.json index 0f0d0aecf6..52b15047fa 100644 --- a/packages/apps/job-launcher/client/tsconfig.json +++ b/packages/apps/job-launcher/client/tsconfig.json @@ -17,7 +17,6 @@ "jsx": "react-jsx", "resolveJsonModule": true, "downlevelIteration": true, - "baseUrl": ".", "types": ["node", "jest"] }, "include": ["src", "tests"] diff --git a/packages/apps/job-launcher/server/src/common/validators/tokens.ts b/packages/apps/job-launcher/server/src/common/validators/tokens.ts index 81e38a3fac..d957dfbda5 100644 --- a/packages/apps/job-launcher/server/src/common/validators/tokens.ts +++ b/packages/apps/job-launcher/server/src/common/validators/tokens.ts @@ -5,7 +5,7 @@ import { ValidatorConstraint, ValidatorConstraintInterface, } from 'class-validator'; -import { JobDto } from 'src/modules/job/job.dto'; +import { JobDto } from '../../modules/job/job.dto'; import { TOKEN_ADDRESSES } from '../constants/tokens'; import { ChainId } from '@human-protocol/sdk'; diff --git a/packages/apps/job-launcher/server/src/modules/job/job.repository.ts b/packages/apps/job-launcher/server/src/modules/job/job.repository.ts index 31a644e310..0dadd98f28 100644 --- a/packages/apps/job-launcher/server/src/modules/job/job.repository.ts +++ b/packages/apps/job-launcher/server/src/modules/job/job.repository.ts @@ -18,7 +18,7 @@ import { JobCountDto, } from '../statistic/statistic.dto'; import { convertToDatabaseSortDirection } from '../../database/database.utils'; -import { PaymentSource } from 'src/common/enums/payment'; +import { PaymentSource } from '../../common/enums/payment'; @Injectable() export class JobRepository extends BaseRepository { diff --git a/packages/apps/job-launcher/server/src/modules/job/job.service.ts b/packages/apps/job-launcher/server/src/modules/job/job.service.ts index 271743182f..0cc8735a72 100644 --- a/packages/apps/job-launcher/server/src/modules/job/job.service.ts +++ b/packages/apps/job-launcher/server/src/modules/job/job.service.ts @@ -83,8 +83,7 @@ import { JobRepository } from './job.repository'; @Injectable() export class JobService { private readonly logger = logger.child({ context: JobService.name }); - public readonly bucket: string; - private cronJobRepository: CronJobRepository; + private cronJobRepository!: CronJobRepository; constructor( @Inject(Web3Service) @@ -454,7 +453,7 @@ export class JobService { }); return new PageDto(data.page!, data.pageSize!, itemCount, jobs); - } catch (error) { + } catch (error: any) { throw new ServerError(error.message, error.stack); } } diff --git a/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.ts b/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.ts index 93a47b8481..99b9911652 100644 --- a/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.ts +++ b/packages/apps/job-launcher/server/src/modules/manifest/manifest.service.ts @@ -37,8 +37,6 @@ import { @Injectable() export class ManifestService { - public readonly bucket: string; - constructor( private readonly web3Service: Web3Service, private readonly cvatConfigService: CvatConfigService, diff --git a/packages/apps/job-launcher/server/tsconfig.json b/packages/apps/job-launcher/server/tsconfig.json index a1e0956c73..d6e2bc7276 100644 --- a/packages/apps/job-launcher/server/tsconfig.json +++ b/packages/apps/job-launcher/server/tsconfig.json @@ -10,7 +10,6 @@ "target": "es2023", "sourceMap": true, "outDir": "./dist", - "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": true, @@ -18,6 +17,7 @@ "strictBindCallApply": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, - "esModuleInterop": true + "esModuleInterop": true, + "types": ["node", "jest"] } } diff --git a/packages/apps/reputation-oracle/server/tsconfig.json b/packages/apps/reputation-oracle/server/tsconfig.json index b517dc2243..a9f8f0c55d 100644 --- a/packages/apps/reputation-oracle/server/tsconfig.json +++ b/packages/apps/reputation-oracle/server/tsconfig.json @@ -10,7 +10,6 @@ "target": "es2024", "rootDir": ".", "outDir": "./dist", - "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": true, @@ -18,16 +17,16 @@ "noImplicitAny": true, "strictBindCallApply": true, "isolatedModules": true, + "baseUrl": ".", "paths": { "@/*": ["src/*"], "~/test/*": ["test/*"] }, - "resolveJsonModule": true + "resolveJsonModule": true, + "types": ["node", "jest"] }, "ts-node": { "files": true, - "require": [ - "tsconfig-paths/register" - ] + "require": ["tsconfig-paths/register"] } } diff --git a/packages/apps/staking/tsconfig.json b/packages/apps/staking/tsconfig.json index 07119c98da..23dbb1f09a 100644 --- a/packages/apps/staking/tsconfig.json +++ b/packages/apps/staking/tsconfig.json @@ -17,7 +17,6 @@ "jsx": "react-jsx", "resolveJsonModule": true, "downlevelIteration": true, - "baseUrl": ".", "types": ["node", "jest"] }, "include": ["src"] diff --git a/packages/subgraph/hmt/tsconfig.json b/packages/subgraph/hmt/tsconfig.json index 3c11a89fec..fdebee90f5 100644 --- a/packages/subgraph/hmt/tsconfig.json +++ b/packages/subgraph/hmt/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "baseUrl": ".", "types": ["@graphprotocol/graph-ts", "node"] }, "include": ["src", "tests"] diff --git a/packages/subgraph/human-protocol/tsconfig.json b/packages/subgraph/human-protocol/tsconfig.json index 3c11a89fec..fdebee90f5 100644 --- a/packages/subgraph/human-protocol/tsconfig.json +++ b/packages/subgraph/human-protocol/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "baseUrl": ".", "types": ["@graphprotocol/graph-ts", "node"] }, "include": ["src", "tests"]