From a2881f7e58ab3fb2991716d4331bfd58bfeb207b Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:00:30 +0700 Subject: [PATCH 01/15] fix: use lib save file --- lib/op-github/save-file-mdx-from-github.ts | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/lib/op-github/save-file-mdx-from-github.ts b/lib/op-github/save-file-mdx-from-github.ts index 51c9f8f..3172027 100644 --- a/lib/op-github/save-file-mdx-from-github.ts +++ b/lib/op-github/save-file-mdx-from-github.ts @@ -1,23 +1,15 @@ import axios from "axios"; -import { Buffer } from 'buffer'; -import * as fs from 'fs' -import * as path from 'path' +import { Buffer } from 'buffer'; import markdownToTxt from 'markdown-to-txt'; import { FilePathAndUrl } from "../list-all-files-github-type"; import { chunkArray, convertSpecialChar, headerGithub } from "../../utils/utils"; +import { Savefile } from "../save-file/save-file"; export async function SaveFileMdxGithub(docs: FilePathAndUrl[], requiredPath: string[] = [], baseRefUrl:string) { try { - const folderName = path.join(__dirname, ...requiredPath) - - // Ensure the folder exists - if (!fs.existsSync(folderName)) { - console.log("folderName don't exist, creating . . .") - fs.mkdirSync(folderName, { recursive: true }) - } - + const headers = headerGithub() if (headers === null){ console.error("failed to get github key, put it on .env") @@ -48,15 +40,13 @@ export async function SaveFileMdxGithub(docs: FilePathAndUrl[], requiredPath: st // doc.path will be something like pages/... so it using next router so the file name will be the route const urlToSave = baseRefUrl + "/" + doc.path.replace("pages/", "").replace(".mdx", "") const fileName = convertSpecialChar(urlToSave) + ".txt" - const filePath = path.join(folderName, fileName) - - await fs.promises.writeFile(filePath, content, 'utf-8'); + await Savefile(content, requiredPath, fileName) } setTimeout(() => {}, 500) } catch (error) { - console.error('Fetch error:', error); + console.error('An error occured during process the data and saving the data:', error); } } } catch (error) { From 7b31ce1f8058fc5c64e4e309b2784475b1129c51 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:00:40 +0700 Subject: [PATCH 02/15] feat: add env sample --- .env.sample | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.sample b/.env.sample index 1678f27..29fa62c 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,8 @@ +NODE_ENV=dev GITHUB_KEY= +API_PASSWORD= +PORT=3002 +CORS= # API_SECRET= # CLOUD_NAME= -# API_KEY= \ No newline at end of file +# API_KEY= From 827f821c6567499c7dc912566dbf7e9199480029 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:00:52 +0700 Subject: [PATCH 03/15] feat: add build.md --- build.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/build.md b/build.md index 2cb508e..99a134a 100644 --- a/build.md +++ b/build.md @@ -1,11 +1,18 @@ -docker buildx build --platform linux/aarch64 -t worker:latest --load . +docker buildx build --platform linux/aarch64 --no-cache -t worker:v-25 --load . -docker tag worker:latest tgrziminiar/worker:latest +docker tag worker:v-25 tgrziminiar/worker:v-25 -docker push tgrziminiar/worker:latest +docker push tgrziminiar/worker:v-25 docker run -d \ -p 3001:3001 \ --env-file .env \ --name fukthis \ - worker:latest \ No newline at end of file + worker:v-2 + +docker run -d \ + -p 3001:3001 \ + -v /etc/timezone:/etc/timezone:ro \ + --env-file .env \ + --name kuay \ + worker:v-8 \ No newline at end of file From 7da00e9b8b4ef586ac497b740767e612306c3737 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:01:01 +0700 Subject: [PATCH 04/15] feat: add example.ts --- example.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/example.ts b/example.ts index c716c4d..6c0e4d3 100644 --- a/example.ts +++ b/example.ts @@ -1,17 +1,19 @@ const MODULE_NAME = "MODULE_NAME" -const DATA_DIR = [ '..', '..', 'data', 'any-folder-name'] +const DATA_DIR = [ 'data', 'any-folder-name'] -// cronTimer is the cron job timer for the module, it can be undefined if the module is not a cron job +// CRON_TIMER is the cron job timer for the module, it can be undefined if the module is not a cron job // visit https://github.com/node-cron/node-cron to get the cron job timer -const cronTimer:string | undefined = undefined +const CRON_TIMER:string | undefined = undefined async function Run() { + console.log(`${MODULE_NAME} is starting . . .`); try { // TODO: add your scraper here that will save the data in DATA_DIR + // OPTIONAL: you can call the Savefile function from lib/save-file/save-file.ts // await ProcessData(DATA_DIR); } catch (error) { @@ -20,6 +22,7 @@ async function Run() { } finally { console.log(`${MODULE_NAME} process finished.`); } + } -export {Run, DATA_DIR, cronTimer} \ No newline at end of file +export {Run, DATA_DIR, CRON_TIMER} \ No newline at end of file From 28f48901778c1a361c4371ec0b25d3d6245f0997 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:01:23 +0700 Subject: [PATCH 05/15] feat: add base lib save file --- lib/save-file/save-file.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lib/save-file/save-file.ts diff --git a/lib/save-file/save-file.ts b/lib/save-file/save-file.ts new file mode 100644 index 0000000..99e278d --- /dev/null +++ b/lib/save-file/save-file.ts @@ -0,0 +1,30 @@ +import * as path from "path"; +import * as fs from "fs"; + +export async function Savefile(data: any, requiredPath: string[] = [], fileName: string) { + try { + // Use process.cwd() instead of __dirname to get the current working directory + const folderName = path.join(process.cwd(), ...requiredPath) + + // Ensure the folder exists + if (!fs.existsSync(folderName)) { + console.log("folderName doesn't exist, creating..."); + try { + fs.mkdirSync(folderName, { recursive: true }); + } catch (mkdirError) { + console.error("Error creating directory:", mkdirError); + throw new Error("Failed to create directory. Check permissions and path."); + } + } + + const filePath = path.join(folderName, fileName); + + // Use fs.writeFileSync for more robust file writing + fs.writeFile(filePath, data, {encoding:"utf8", flag:"w"}, () => {}); + + console.log(`File successfully written to ${filePath}`); + } catch (error) { + console.error("An error occurred during the save file process:", error); + throw error; // Re-throw the error for proper handling upstream + } +} \ No newline at end of file From 99f5046e368d88d1744e6160d1bb88e5f14b6a78 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:02:19 +0700 Subject: [PATCH 06/15] fixed: comment github action --- .github/workflows/build.yaml | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f2ad83a..0fee036 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,34 +1,34 @@ # For more details, read this: https://coolify.io/docs/github-actions -name: Build Static Image -on: - push: - branches: ["main"] -env: - REGISTRY: ghcr.io - IMAGE_NAME: "tgrziminiar/worker" +# name: Build Static Image +# on: +# push: +# branches: ["main"] +# env: +# REGISTRY: ghcr.io +# IMAGE_NAME: "tgrziminiar/worker" -jobs: - aarch64: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v3 - - name: Login to ghcr.io - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.TOKEN }} - - name: Build image and push to registry - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile - platforms: linux/amd64 - push: true - tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - name: Deploy to Coolify - run: | - curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}' \ No newline at end of file +# jobs: +# aarch64: +# runs-on: ubuntu-latest +# permissions: +# contents: read +# packages: write +# steps: +# - uses: actions/checkout@v3 +# - name: Login to ghcr.io +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.REGISTRY }} +# username: ${{ github.actor }} +# password: ${{ secrets.TOKEN }} +# - name: Build image and push to registry +# uses: docker/build-push-action@v4 +# with: +# context: . +# file: Dockerfile +# platforms: linux/amd64 +# push: true +# tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest +# - name: Deploy to Coolify +# run: | +# curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}' \ No newline at end of file From 6720125d7ac2b9b5bdedebc2acfb73305dd85011 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:02:52 +0700 Subject: [PATCH 07/15] fix: remove some unused comment & set time zone --- utils/utils.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/utils/utils.ts b/utils/utils.ts index 95ebce3..f0b5d88 100644 --- a/utils/utils.ts +++ b/utils/utils.ts @@ -44,10 +44,11 @@ export function headerGithub() : (RawAxiosRequestHeaders) | AxiosHeaders| null // scheduleCronJobs use to schedule the cron jobs -export function scheduleCronJobs(cronJobsToSchedule: { cronTimer: string; run: () => void; dataDir: string }[]) { - console.log(`Scheduling ${cronJobsToSchedule.length} cron jobs`); +export function scheduleCronJobs(cronJobsToSchedule: { CRON_TIMER: string; run: () => void; dataDir: string }[]) { cronJobsToSchedule.forEach(job => { - console.log(`Scheduling cron job for ${job.dataDir} ${job.cronTimer}`); - cron.schedule(job.cronTimer, job.run); + console.log(`Scheduling cron job for ${job.dataDir} ${job.CRON_TIMER}`); + cron.schedule(job.CRON_TIMER, job.run, { + timezone: "America/Los_Angeles", + }); }); } \ No newline at end of file From b32267fbc890deeb7698f0c72263a1476b992d2f Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:03:44 +0700 Subject: [PATCH 08/15] fix: change cronTimer to CRON_TIMER & change base DATA_DIR --- src/scripts/dev-doc/dev-doc.ts | 6 +++--- src/scripts/forum/forum.ts | 8 ++++---- src/scripts/gov-doc/gov-doc.ts | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/scripts/dev-doc/dev-doc.ts b/src/scripts/dev-doc/dev-doc.ts index 7959031..5dc3843 100644 --- a/src/scripts/dev-doc/dev-doc.ts +++ b/src/scripts/dev-doc/dev-doc.ts @@ -2,10 +2,10 @@ import { ALL_DOCS_DEV_PATH, BASE_DOC_DEV } from "../../../const"; import { ListAllFilesInGithub } from "../../../lib/list-all-files-github"; import { SaveFileMdxGithub } from "../../../lib/op-github/save-file-mdx-from-github"; -const DATA_DIR = ['..', '..', 'data', 'dev-doc-data'] +const DATA_DIR = ['data', 'dev-doc-data'] // Which evaluates to 'At 0 seconds, 0 minutes every 1st hour'. -const cronTimer:string | undefined = undefined +const CRON_TIMER:string | undefined = undefined async function Run() { console.log("Dev Docs is starting . . ."); @@ -24,4 +24,4 @@ async function Run() { } } -export {Run, DATA_DIR, cronTimer} \ No newline at end of file +export {Run, DATA_DIR, CRON_TIMER} \ No newline at end of file diff --git a/src/scripts/forum/forum.ts b/src/scripts/forum/forum.ts index 9108968..b1e4611 100644 --- a/src/scripts/forum/forum.ts +++ b/src/scripts/forum/forum.ts @@ -15,11 +15,11 @@ import { GetAllProjectsUrl } from "./sitemap/sitemap" // console.log("done: 'list all projects in each category' working-on: 'get each project detail' . . .") -const DATA_DIR = ['..', '..', 'data', 'forum-data'] +const DATA_DIR = ['data', 'forum-data'] // Which evaluates to 'At 0 seconds, 0 minutes every 1st hour'. -const cronTimer:string | undefined = undefined -// const cronTimer:string | undefined = "0 0 */1 * * *" +const CRON_TIMER:string | undefined = undefined +// const CRON_TIMER:string | undefined = "0 0 */1 * * *" async function Run() { @@ -47,4 +47,4 @@ async function Run() { } -export {DATA_DIR, Run, cronTimer} \ No newline at end of file +export {DATA_DIR, Run, CRON_TIMER} \ No newline at end of file diff --git a/src/scripts/gov-doc/gov-doc.ts b/src/scripts/gov-doc/gov-doc.ts index da772c3..3ec2251 100644 --- a/src/scripts/gov-doc/gov-doc.ts +++ b/src/scripts/gov-doc/gov-doc.ts @@ -2,10 +2,10 @@ import { ALL_DOCS_PATH, BASE_DOC } from "../../../const"; import { ListAllFilesInGithub } from "../../../lib/list-all-files-github"; import { SaveFileMdxGithub } from "../../../lib/op-github/save-file-mdx-from-github"; -const DATA_DIR = [ '..', '..', 'data', 'gov-doc-data'] +const DATA_DIR = [ 'data', 'gov-doc-data'] // Which evaluates to 'At 0 seconds, 0 minutes every 1st hour'. -const cronTimer:string | undefined = undefined +const CRON_TIMER:string | undefined = undefined async function Run() { console.log("Gov Doc is starting . . ."); @@ -25,4 +25,4 @@ async function Run() { } } -export {Run, DATA_DIR, cronTimer} \ No newline at end of file +export {Run, DATA_DIR, CRON_TIMER} \ No newline at end of file From 02a67b579afa4c09edfdfcb762667736b7d6905f Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:04:10 +0700 Subject: [PATCH 09/15] fix: remove unused log --- src/controller/get-static-data.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/controller/get-static-data.ts b/src/controller/get-static-data.ts index 92b97f1..1b4a6b2 100644 --- a/src/controller/get-static-data.ts +++ b/src/controller/get-static-data.ts @@ -1,5 +1,5 @@ -import fs from "fs"; -import path from "path"; +import * as fs from "fs"; +import * as path from "path"; import { FastifyReply, FastifyRequest } from "fastify"; export async function GetStaticData(request: FastifyRequest<{ Params: { '*': string } }>, reply: FastifyReply) { @@ -17,7 +17,6 @@ export async function GetStaticData(request: FastifyRequest<{ Params: { '*': str }); } else { // If it's a file read and send its contents - console.log("running in here as a file"); const data = await fs.promises.readFile(fullPath, 'utf8'); if (path.extname(fullPath) === '.json') { const jsonData = JSON.parse(data); From 300ee8d4033755cc7ce02219bd28f93df56c25d8 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:04:27 +0700 Subject: [PATCH 10/15] fix: use base lib save file --- .../forum/project/save-project-detail.ts | 17 ++--------- .../retropgf5-live-data.ts | 28 ++++++++----------- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/src/scripts/forum/project/save-project-detail.ts b/src/scripts/forum/project/save-project-detail.ts index 4d06923..b2fb92d 100644 --- a/src/scripts/forum/project/save-project-detail.ts +++ b/src/scripts/forum/project/save-project-detail.ts @@ -7,19 +7,13 @@ import { } from './projectType' import { HTTPSTATUSOK } from '../../../../const' import { htmlToText } from 'html-to-text' -import * as fs from 'fs' -import * as path from 'path' import { convertSpecialChar } from '../../../../utils/utils' +import { Savefile } from '../../../../lib/save-file/save-file' // SaveProjectData: Save all the project data into /data/forum-data using urls from GetAllProjectsUrl export async function SaveProjectData(urls: string[], requiredPath: string[] = []) { - const folderName = path.join(__dirname, ...requiredPath) - // Ensure the folder exists - if (!fs.existsSync(folderName)) { - fs.mkdirSync(folderName, { recursive: true }) - } for (const url of urls) { try { @@ -92,14 +86,7 @@ export async function SaveProjectData(urls: string[], requiredPath: string[] = [ // remove unnecessary string let newUrl = url.replace('.json?forceLoad=true', '') + '.txt' const fileName = convertSpecialChar(newUrl) - const filePath = path.join(folderName, fileName) - - // Write the project data to a JSON file - fs.writeFileSync( - filePath, - JSON.stringify(projectOwner, null, 2), - 'utf-8' - ) + await Savefile(JSON.stringify(projectOwner), requiredPath, fileName) } } catch (error) { console.error(`Error fetching data ${url}:`, error) diff --git a/src/scripts/retropgf5-live-data/retropgf5-live-data.ts b/src/scripts/retropgf5-live-data/retropgf5-live-data.ts index d2a3064..2d5551b 100644 --- a/src/scripts/retropgf5-live-data/retropgf5-live-data.ts +++ b/src/scripts/retropgf5-live-data/retropgf5-live-data.ts @@ -1,8 +1,7 @@ import { ApolloClient, gql, HttpLink, InMemoryCache } from "@apollo/client/core"; import fetch from "cross-fetch"; import axios from "axios"; -import * as fs from 'fs' -import * as path from 'path' +import { Savefile } from "../../../lib/save-file/save-file"; const httpLink = new HttpLink({ uri: "https://optimism.easscan.org/graphql", fetch: fetch, @@ -80,7 +79,8 @@ async function fetchMetadataURL(refUid: string) { -async function fetchAndProcessData() { +export async function fetchAndProcessData() { + console.log("Fetching and processing data . . ."); try { const data = await fetchMetadataSnapshot(); const urlArrays = await Promise.all(data.map(async (d: string) => { @@ -102,34 +102,28 @@ async function fetchAndProcessData() { } } -const DATA_DIR = [ '..', '..', '..', 'data', 'retropgf5-live-data'] +const DATA_DIR = [ 'data', 'retropgf5-live-data'] // Which evaluates to 'At 0 seconds, 0 minutes every 1st hour'. -const cronTimer:string | undefined = "0 0 */1 * * *" +const CRON_TIMER:string | undefined = "0 0 */1 * * *" +// const CRON_TIMER:string | undefined = undefined async function Run() { console.log("RetroPGF5 Live Data is starting . . ."); + const fileName= "retropgf5-live-data.json" try { - const folderName = path.join(__dirname, ...DATA_DIR) - - // Ensure the folder exists - if (!fs.existsSync(folderName)) { - console.log("folderName don't exist, creating . . .") - fs.mkdirSync(folderName, { recursive: true }) - } const dataArray = await fetchAndProcessData(); - const fileName = "retropgf5-live-data.json" - const filePath = path.join(folderName, fileName) - await fs.promises.writeFile(filePath, JSON.stringify(dataArray), 'utf-8'); + // const dataArray: any[] = [] + await Savefile(JSON.stringify(dataArray), DATA_DIR, fileName) } catch (error) { - console.error("An error occurred during the RetroPGF5 Live Data process:", error); + console.error("An error occurred during the RetroPGF5 Live Data process:", error); } finally { console.log("RetroPGF5 Live Data process finished."); } } -export {Run, DATA_DIR, cronTimer} +export {Run, DATA_DIR, CRON_TIMER} From 5ebf4e8ac5039ef2b15feff862295e141e3c5012 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:04:44 +0700 Subject: [PATCH 11/15] feat: add production target extension --- Makefile | 7 + README.md | 19 +- .../retropgf5-live-data.json | 1 + package.json | 2 + pnpm-lock.yaml | 331 +++++++++++++++++- src/index.ts | 66 +++- tsconfig.json | 121 +------ 7 files changed, 418 insertions(+), 129 deletions(-) create mode 100644 Makefile create mode 100644 lib/data/retropgf5-live-data/retropgf5-live-data.json diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e61189e --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +serve: + pnpm dev:Serve + + +build: + pnpm run build + node dist/src/index.js diff --git a/README.md b/README.md index a9bc49e..73b7123 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,10 @@ Worker dynamically imports and executes TypeScript files from the `src/scripts` - `src/scripts`: add folder of the module and add the TypeScript file here the example is `example.ts` - It should export a `Run` function that will be executed by the worker - It should export a `DATA_DIR` variable that will be used to save the data - - It should export a `cronTimer` variable that will be used to set the cron job timer - It should export a `MODULE_NAME` variable that will be used to set the module name + - It should export a `CRON_TIMER` variable that will be used to set the cronjob timer + - CRON_TIMER is the cronjob timer for the module, it can be undefined if the module is not a cronjob + - Visit https://github.com/node-cron/node-cron to learn the format of cronjob ## Api Route - Get /api/ will list all the static file that can be served @@ -19,3 +21,18 @@ Worker dynamically imports and executes TypeScript files from the `src/scripts` - Post /api/modules/run/(any-module-name) will run the module - it required post body with a password + +## Development / Deployment +- Developmenet + - if you were on the development mode must change the value of `NODE_ENV` to `dev` and use cli command to run on local + ``` + pnpm dev:Serve + ``` + +- Deployment + - Must change the value of `NODE_ENV` to `production` and use cli command to run on production + ``` + pnpm run build + node dist/src/index.js + ``` + diff --git a/lib/data/retropgf5-live-data/retropgf5-live-data.json b/lib/data/retropgf5-live-data/retropgf5-live-data.json new file mode 100644 index 0000000..54c4152 --- /dev/null +++ b/lib/data/retropgf5-live-data/retropgf5-live-data.json @@ -0,0 +1 @@ +[{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"MonstersOnBase","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png","category":"NFT","osoSlug":"MonstersOnBase","socialLinks":{"website":["https://element.market/collections/monstersonbase"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/MonstersOnBasee","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.","links":[]},{"name":"MonstersOnBase","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png","category":"NFT","osoSlug":"MonstersOnBase","socialLinks":{"website":["https://element.market/collections/monstersonbase"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/MonstersOnBasee","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.","links":[]},{"name":"BASE BTC EARTH 🌍","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets. https://element.market/collections/base-btc-earth","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/f7b97236-dce1-4e44-873c-74bb5f31b49c.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/963d18b8-32a1-4d7c-a09a-640cd20e4f22.png","category":"NFT","osoSlug":"BASE BTC EARTH 🌍","socialLinks":{"website":["https://element.market/collections/base-btc-earth"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/BASE-BTC-EARTH--","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"pay_to_use","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.","links":[]},{"name":"Dragons On Op Stack 🔴","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/7d8db529-7225-43f2-bc2c-ade2f7aaf7af.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/af6a4fb6-52e3-4570-840a-e6c949ff905e.png","category":"NFT","osoSlug":"Dragons On Op Stack 🔴","socialLinks":{"website":["https://element.market/collections/dragons-on-op-stack"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/Dragons-On-Op-Stack--","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"pay_to_use","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.","links":[]},{"name":"FANBASE ✨","description":"This is a fanbase community that operates in the field of social engagement.","projectAvatarUrl":"https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/f6550061-4756-49ac-b3da-6dc87fd589a9/76716e6b0c575e52832cf0f58cae6f2c.jpg","projectCoverImageUrl":"https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/906bad2e-6a95-4bba-9261-aeaf88ff7afe/Screenshot_20240823-030141_1.jpg","category":"Social","osoSlug":"","socialLinks":{"website":["https://www.fanbase.app/"],"farcaster":["https://warpcast.com/denzooo","https://warpcast.com/phynn","https://warpcast.com/cepodr"],"twitter":"","mirror":null},"team":["508591"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[{"url":"https://news.fanbase.app/","name":"Fanbase","description":"Fanbase is a FREE Next-Generation Social Media App that allows ANY user to earn money from day one.\nUnlike other social apps, Fanbase is the one place you can truly be you "}]},{"name":"Punk Shield","description":"Punkshield is an advanced security solution designed to protect your valuable digital assets. It offers a multi-signature (multi-sig) wallet, adding multiple layers of security to safeguard your crypto holdings. Punkshield allows users to enable two-factor authentication (2FA) through Email or Google Authenticator for enhanced protection. The platform also includes a mobile-friendly interface, making it easy to manage your assets on the go.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/7782a4d3-48ab-4027-b2ac-7685dd744470.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/31d95f35-43e6-4c07-821b-70221b57e233.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://punkshield.xyz/"],"farcaster":["https://warpcast.com/punkshield.eth"],"twitter":"https://x.com/Punkonbase","mirror":null},"team":["841741"],"github":[],"packages":[],"contracts":[{"address":"0xD8461A9760D3DCE9b87259b7D1fB82c20656de3E","deploymentTxHash":"0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f","deployerAddress":"0x2b9C5411E205E8Ea59C1BE1Da4EFdd5FFa7A8a23","verificationProof":"0x230f16e658a22aed665c57a4c2a95003a93eb9be4c85d89e741243abb8cd92b90309927a6d3e07b654a1e016ddc492568b58c5dcec49aacd5ee0e33cc08e48d81c","chainId":8453}],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"All basepunk holder can access this for free & who have not held basepunk nft, they need to pay 0.0013 Eth to create punkshiled wallet for one time fees.","links":[{"url":"https://basescan.org/tx/0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f","name":"Punk Shield","description":"Punkshield revolutionizes digital asset security by providing unmatched protection and peace of mind. With its multi-sig wallet, two-factor authentication, and seamless integration of advanced features like swapping and bridging, Punkshield empowers users to take control of their crypto assets confidently. It safeguards against potential threats, ensuring that users' investments remain secure and accessible, allowing them to focus on growth and innovation in the digital world. With Punkshield, your assets are not just protected—they're fortified for the future."}]},{"name":"Solady","description":"Solady is an open-source repository containing highly-optimized Solidity snippets. It offers efficient implementations of commonly-used libraries, such as MerkleProofLib, alongside cutting-edge features like LibZip.\n\nBy thoughtfully encapsulating low-level inline assembly within flexible APIs, Solady simplifies the process of writing clean and efficient Solidity code. More than just a library, Solady also serves as a learning resource and experimental laboratory for pioneering gas-optimization techniques.\n\nSolady is used in the codebases of Optimism and Coinbase.\n\nWith respect to the OP stack, Solady contributes in the following ways:\n- Provides a Solidity and JavaScript implementation of FastLZ compression algorithm, which is used for more accurate gas estimations in the Fjord upgrade. The JavaScript code is very minimal, allowing for it's easy translation into Go.\n- Various other utilities such as bytecode proxies and string operations.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/0e726459-df1e-4cea-bddb-25399f88acea.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/0615ef25-edbb-4b19-934d-79614daf8040.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://solady.org"],"farcaster":[],"twitter":"https://twitter.com/optimizoor","mirror":null},"team":["4686"],"github":[{"url":"https://github.com/Vectorized/solady","name":"Solady","description":"Optimized Solidity snippets"}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":null,"link":null,"amount":"99379","date":"","details":null},{"grant":null,"link":null,"amount":"45018","date":"","details":null}],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[{"url":"https://github.com/search?q=repo%3Aethereum-optimism%2Foptimism%20solady&type=code","name":"Solady usage in Optimism","description":"Solady usage in Optimism"}]},{"name":"xuwinnie.review","description":"Security Researcher.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png","category":"Utility","osoSlug":"","socialLinks":{"website":["xuwinnie.review"],"farcaster":[],"twitter":null,"mirror":null},"team":["462511"],"github":[{"url":"https://github.com/xuwinnie/reports","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"NA","links":[]},{"name":"Builderism","description":"Make your op stack with just a few commands!","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/e74ad0ba-d2bc-449d-9411-cbcad9bc8105.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/c7c58454-c6b7-4ce0-8b5f-cd60576940f4.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://github.com/rabbitprincess/builderism"],"farcaster":[],"twitter":null,"mirror":null},"team":["841662"],"github":[{"url":"https://github.com/rabbitprincess/builderism","name":"Builderism","description":"Make your mainnet using OP Stack!"}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Moved Network","description":"We're building the next generation Ethereum L2 blockchain on Optimism OP Stack that supports the most secure Move smart contract language. Our goal is to help the security and parallel execution of Move meet Ethereum’s vast liquidity.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/4088a7f3-ba0f-4ec6-a6bc-ff4caaf666eb.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/68088c9d-248f-4b4c-b8b7-1e8c52c5569a.png","category":"Cross Chain","osoSlug":"","socialLinks":{"website":["https://moved.network"],"farcaster":[],"twitter":"https://x.com/MovedNetwork","mirror":null},"team":["831955"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":null,"link":null,"amount":"under-1m","date":"2024","details":"Received some of the pre-seed investment from 4 VCs and 2 angels. The rounds is still open for more investment."}],"revenue":[]},"pricingModel":"pay_to_use","pricingModelDetails":"Users pay for transaction fees","links":[{"url":"https://www.crunchbase.com/organization/moved-network","name":"Crunchbase","description":"Company investor profile"}]},{"name":"xuwinnie.review","description":"Security Researcher.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png","category":"Utility","osoSlug":"","socialLinks":{"website":["xuwinnie.review"],"farcaster":[],"twitter":"https://x.com/xuwinniexu","mirror":null},"team":["462511"],"github":[{"url":"https://github.com/xuwinnie/reports","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"Factors include sloc, complexity, postive impact...","links":[]},{"name":"hildr","description":"Hildr is an OP Stack rollup node client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/d304db21-cc7e-4236-8a63-a2a5161c4aee.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/2d30ac8c-806b-4332-b596-c8b5faadc032.png","category":"Utility","osoSlug":"hildr-optimism-java","socialLinks":{"website":["https://optimism-java.github.io/hildr-docs"],"farcaster":[],"twitter":"https://x.com/optimism_java","mirror":null},"team":["193400","754190"],"github":[{"url":"https://github.com/optimism-java/hildr","name":"","description":""}],"packages":[{"url":"https://github.com/optimism-java/hildr/pkgs/container/hildr","name":null,"description":null},{"url":"https://github.com/optimism-java/hildr/releases/tag/v0.4.4","name":null,"description":null}],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":null,"link":null,"amount":"62608.95","date":"","details":null},{"grant":"token-house-mission","link":"https://app.charmverse.io/op-grants/page-4923039239406415","amount":"25000","date":"2023-07-05","details":""}],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[{"url":"https://www.opensource.observer/project/hildr-optimism-java","name":"","description":""}]},{"name":"op-besu","description":"Op-besu is an OP Stack execution client written in Java 21. We are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://optimism-java.github.io/op-besu-docs"],"farcaster":[],"twitter":"https://x.com/optimism_java","mirror":null},"team":["193400"],"github":["https://github.com/optimism-java/op-besu"],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":"token-house-mission","link":"https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294","amount":"50000","date":"2024-05-09","details":""}],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]}] \ No newline at end of file diff --git a/package.json b/package.json index 1f73e3e..a710c8c 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "license": "ISC", "dependencies": { "@apollo/client": "^3.11.4", + "@fastify/cors": "^9.0.1", + "@fastify/static": "^7.0.4", "axios": "^1.7.4", "cheerio": "^1.0.0", "cloudinary": "^2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32fbb2b..7f32b2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,12 @@ dependencies: '@apollo/client': specifier: ^3.11.4 version: 3.11.4(graphql@16.9.0) + '@fastify/cors': + specifier: ^9.0.1 + version: 9.0.1 + '@fastify/static': + specifier: ^7.0.4 + version: 7.0.4 axios: specifier: ^1.7.4 version: 1.7.5 @@ -439,6 +445,11 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 + /@fastify/accept-negotiator@1.1.0: + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + dev: false + /@fastify/ajv-compiler@3.6.0: resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} dependencies: @@ -447,6 +458,13 @@ packages: fast-uri: 2.4.0 dev: false + /@fastify/cors@9.0.1: + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + dependencies: + fastify-plugin: 4.5.1 + mnemonist: 0.39.6 + dev: false + /@fastify/error@3.4.1: resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} dev: false @@ -463,6 +481,27 @@ packages: fast-deep-equal: 3.1.3 dev: false + /@fastify/send@2.1.0: + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + dev: false + + /@fastify/static@7.0.4: + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + dependencies: + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 2.1.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.1 + fastq: 1.17.1 + glob: 10.4.5 + dev: false + /@graphql-typed-document-node/core@3.2.0(graphql@16.9.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -471,6 +510,18 @@ packages: graphql: 16.9.0 dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -505,6 +556,18 @@ packages: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + /@lukeed/ms@2.0.2: + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@selderee/plugin-htmlparser2@0.11.0: resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} dependencies: @@ -731,6 +794,16 @@ packages: require-from-string: 2.0.2 dev: false + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -738,6 +811,18 @@ packages: color-convert: 1.9.3 dev: false + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -781,7 +866,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -803,6 +887,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + /braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -906,10 +996,21 @@ packages: color-name: 1.1.3 dev: false + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: false + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -921,6 +1022,13 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: false @@ -949,6 +1057,15 @@ packages: - encoding dev: false + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + /css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} dependencies: @@ -992,6 +1109,11 @@ packages: engines: {node: '>=0.4.0'} dev: false + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1045,10 +1167,22 @@ packages: xtend: 4.0.2 dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + /electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} dev: false + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + /encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} dependencies: @@ -1066,6 +1200,10 @@ packages: engines: {node: '>=6'} dev: false + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1128,6 +1266,10 @@ packages: resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} dev: false + /fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + dev: false + /fastify@4.28.1: resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} dependencies: @@ -1181,6 +1323,14 @@ packages: optional: true dev: false + /foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -1227,6 +1377,18 @@ packages: is-glob: 4.0.3 dev: true + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + dev: false + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1306,6 +1468,17 @@ packages: entities: 4.5.0 dev: false + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -1331,7 +1504,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -1357,6 +1529,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1374,6 +1551,18 @@ packages: engines: {node: '>=12'} dev: false + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: false @@ -1435,6 +1624,10 @@ packages: js-tokens: 4.0.0 dev: false + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -1690,22 +1883,46 @@ packages: mime-db: 1.52.0 dev: false + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true + /mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + dependencies: + obliterator: 2.0.4 + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false @@ -1749,6 +1966,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false + /on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -1769,6 +1990,10 @@ packages: tslib: 2.7.0 dev: false + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: false + /parse5-htmlparser2-tree-adapter@7.0.0: resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} dependencies: @@ -1800,10 +2025,23 @@ packages: engines: {node: '>=0.10.0'} dev: true + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: false + /path@0.12.7: resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} dependencies: @@ -2073,6 +2311,27 @@ packages: resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} dev: false + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + /sonic-boom@4.0.1: resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} dependencies: @@ -2096,12 +2355,49 @@ packages: engines: {node: '>= 10.x'} dev: false + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: false + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2152,6 +2448,11 @@ packages: engines: {node: '>=12'} dev: false + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false @@ -2382,6 +2683,32 @@ packages: webidl-conversions: 3.0.1 dev: false + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true diff --git a/src/index.ts b/src/index.ts index d45d9a9..c788255 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,22 @@ import Fastify, { FastifyInstance, FastifyRequest, FastifyReply } from "fastify"; -import fs from "fs"; -import path from "path"; +import * as fs from "fs"; +import * as path from "path"; import 'dotenv/config' import { TriggerModule } from "./controller/trigger-module"; import { GetStaticData } from "./controller/get-static-data"; import { scheduleCronJobs } from "../utils/utils"; - +import cors from '@fastify/cors' const fastify: FastifyInstance = Fastify(); +let origin:string = "*" +if (process.env.NODE_ENV === 'production') { + origin = process.env.CORS +} + +fastify.register(cors, { + origin: origin +}) + const scriptsDir = path.resolve(__dirname, 'scripts'); // res use to store the api path of the modules @@ -15,7 +24,7 @@ const scriptsDir = path.resolve(__dirname, 'scripts'); const fileNameAndApiPath: { [key: string]: string } = {} // cronJobsToSchedule use to store the cron jobs that need to be scheduled -const cronJobsToSchedule: { cronTimer: string; run: () => void; dataDir: string }[] = []; +const cronJobsToSchedule: { CRON_TIMER: string; run: () => void; dataDir: string }[] = []; // Store imported modules // the key is the file name and the value is the module (function to run) @@ -24,6 +33,10 @@ export const importedModules: { [key: string]: any } = {}; // processScripts use to check if there any module that need to be run async function processScripts() { + // const module = require('./scripts/gov-doc/gov-doc.js'); + + // console.log("here testing ", module); + try { const folders = await fs.promises.readdir(scriptsDir); @@ -31,36 +44,45 @@ async function processScripts() { const files = await fs.promises.readdir(path.resolve(scriptsDir, folder)); for (const file of files) { - if (path.extname(file) === '.ts') { + + let targetExtension = ".ts" + if (process.env.NODE_ENV === 'production') { + targetExtension = ".js" + } + + if (path.extname(file) === targetExtension) { try { // import the script - const filePath = path.resolve(scriptsDir, folder, file); - const module = await import(filePath); - + const filePath = path.resolve(__dirname, scriptsDir, folder, file); + const module = require(filePath); + // get the data dir - const dataDir = module.DATA_DIR.slice(2).join("").replace("data",""); - + const dataDir = module.DATA_DIR.join("").replace("data",""); + // get the api path const apiPath = "/api/modules/run/" + file; // add to the res object fileNameAndApiPath[file] = apiPath; - console.log(`File: ${file}, API_PATH: ${apiPath}`); + // console.log(`File: ${file}, API_PATH: ${apiPath}`); - const temp = module.DATA_DIR.slice(3).join("") - const fullDataDir = path.resolve(process.cwd(), 'data', temp); + const fullDataDir = path.resolve(process.cwd(), "data", dataDir); if (!fs.existsSync(fullDataDir)) { console.log(`Data directory ${fullDataDir} does not exist. Running module.Run() first.`); await module.Run(); } + // console.log("here is cron timer only file",module.DATA_DIR, " ", module.CRON_TIMER, module) // if there is a cron timer, schedule the cron job - if (module.cronTimer) { + if (typeof(module.CRON_TIMER) === "string" && module.CRON_TIMER.trim() !== "") { + console.log(`Scheduling cron job for ${file} with timer: ${module.CRON_TIMER}`); cronJobsToSchedule.push({ - cronTimer: module.cronTimer, + CRON_TIMER: module.CRON_TIMER, run: module.Run, dataDir: dataDir, }); + } else { + console.log(`No valid cron timer for ${file}, skipping cron job scheduling.`); } // Store the imported module @@ -72,7 +94,12 @@ async function processScripts() { } } - scheduleCronJobs(cronJobsToSchedule); + if (cronJobsToSchedule.length > 0) { + console.log(`Scheduling ${cronJobsToSchedule.length} cron job(s)`); + scheduleCronJobs(cronJobsToSchedule); + } else { + console.log("No cron jobs to schedule."); + } } catch (err) { console.error(`Could not process scripts: ${err}`); } @@ -80,9 +107,9 @@ async function processScripts() { - async function startServer() { console.log("Reading scripts directory . . .\n"); + await processScripts(); @@ -97,6 +124,11 @@ async function startServer() { fastify.get<{ Params: { '*': string } }>('/api/*', GetStaticData); + // Serve static files from the 'data' directory + fastify.register(require('@fastify/static'), { + root: path.join(__dirname, '..', 'data'), + prefix: '/data/', // This will be the URL prefix + }); const port = process.env.PORT || 3001; diff --git a/tsconfig.json b/tsconfig.json index 36598b2..c3573b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,109 +1,12 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - "resolveJsonModule": true /* Enable importing .json files. */, - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist" /* Specify an output folder for all emitted files. */, - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} +{ + "compilerOptions": { + "module": "commonjs", + "esModuleInterop": true, + "target": "es6", + "moduleResolution": "node", + "sourceMap": true, + "outDir": "dist", + "resolveJsonModule": true, + }, + "lib": ["es2015"] +} \ No newline at end of file From c6293146c0a64514b911d835fe33efb700185828 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:21:19 +0700 Subject: [PATCH 12/15] fix: change using writeFileSync --- .../retropgf5-live-data.json | 88 +++ .../retropgf5-live-data.json | 662 ++++++++++++++++++ lib/save-file/save-file.ts | 2 +- 3 files changed, 751 insertions(+), 1 deletion(-) create mode 100644 data/tempretropgf5-live-data/retropgf5-live-data.json diff --git a/data/retropgf5-live-data/retropgf5-live-data.json b/data/retropgf5-live-data/retropgf5-live-data.json index 733aa1b..520fe73 100644 --- a/data/retropgf5-live-data/retropgf5-live-data.json +++ b/data/retropgf5-live-data/retropgf5-live-data.json @@ -658,5 +658,93 @@ "pricingModel": "free", "pricingModelDetails": "", "links": [] + }, + { + "name": "MATUBMA", + "description": "I just registered for the SUNNY Awards to be eligible for 540K OP!", + "projectAvatarUrl": "https://cdn.charmverse.io/user-content/9100e3fe-1f1e-47cd-a424-e67c1ac6d523/50f6c156-3fd6-4220-80d5-045ef1658f8d/wazowski-mike.gif", + "projectCoverImageUrl": "https://cdn.charmverse.io/user-content/9100e3fe-1f1e-47cd-a424-e67c1ac6d523/84aaead4-8b2c-4cc2-8f4e-9ea1d4579984/6181.jpg", + "category": "NFT", + "osoSlug": "MATUBMA", + "socialLinks": { + "website": [ + "https://zora.co/@compile" + ], + "farcaster": [ + "https://warpcast.com/matubma" + ], + "twitter": "https://x.com/extremelyluxury", + "mirror": null + }, + "team": [ + "590905" + ], + "github": [ + { + "url": "https://github.com/tsvyntar", + "name": "", + "description": "" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://zora.co/@compile", + "name": "MATUBMA", + "description": "I make a nice collection and photo and imagine" + } + ] + }, + { + "name": "op-besu", + "description": "Op-besu is an OP Stack execution client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/op-besu-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400" + ], + "github": [ + { + "url": "https://github.com/optimism-java/op-besu", + "name": "", + "description": "" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294", + "amount": "50000", + "date": "2024-05-09", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] } ] \ No newline at end of file diff --git a/data/tempretropgf5-live-data/retropgf5-live-data.json b/data/tempretropgf5-live-data/retropgf5-live-data.json new file mode 100644 index 0000000..733aa1b --- /dev/null +++ b/data/tempretropgf5-live-data/retropgf5-live-data.json @@ -0,0 +1,662 @@ +[ + { + "name": "Nfts ", + "description": "nft creation ", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", + "category": "NFT", + "osoSlug": "", + "socialLinks": { + "website": [], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "427926" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "Nfts ", + "description": "nft creation ", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", + "category": "NFT", + "osoSlug": "", + "socialLinks": { + "website": [], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "427926" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "Nfts ", + "description": "nft creation ", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", + "category": "NFT", + "osoSlug": "", + "socialLinks": { + "website": [], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "427926" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "Nfts ", + "description": "nft creation ", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", + "category": "NFT", + "osoSlug": "", + "socialLinks": { + "website": [], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "427926" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "MonstersOnBase", + "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png", + "category": "NFT", + "osoSlug": "MonstersOnBase", + "socialLinks": { + "website": [ + "https://element.market/collections/monstersonbase" + ], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "569945" + ], + "github": [ + { + "url": "https://github.com/mali030303/MonstersOnBasee", + "name": null, + "description": null + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "freemium", + "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.", + "links": [] + }, + { + "name": "MonstersOnBase", + "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png", + "category": "NFT", + "osoSlug": "MonstersOnBase", + "socialLinks": { + "website": [ + "https://element.market/collections/monstersonbase" + ], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "569945" + ], + "github": [ + { + "url": "https://github.com/mali030303/MonstersOnBasee", + "name": null, + "description": null + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "freemium", + "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.", + "links": [] + }, + { + "name": "BASE BTC EARTH 🌍", + "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets. https://element.market/collections/base-btc-earth", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/f7b97236-dce1-4e44-873c-74bb5f31b49c.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/963d18b8-32a1-4d7c-a09a-640cd20e4f22.png", + "category": "NFT", + "osoSlug": "BASE BTC EARTH 🌍", + "socialLinks": { + "website": [ + "https://element.market/collections/base-btc-earth" + ], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "569945" + ], + "github": [ + { + "url": "https://github.com/mali030303/BASE-BTC-EARTH--", + "name": null, + "description": null + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "pay_to_use", + "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.", + "links": [] + }, + { + "name": "Dragons On Op Stack 🔴", + "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/7d8db529-7225-43f2-bc2c-ade2f7aaf7af.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/af6a4fb6-52e3-4570-840a-e6c949ff905e.png", + "category": "NFT", + "osoSlug": "Dragons On Op Stack 🔴", + "socialLinks": { + "website": [ + "https://element.market/collections/dragons-on-op-stack" + ], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "569945" + ], + "github": [ + { + "url": "https://github.com/mali030303/Dragons-On-Op-Stack--", + "name": null, + "description": null + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "pay_to_use", + "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.", + "links": [] + }, + { + "name": "FANBASE ✨", + "description": "This is a fanbase community that operates in the field of social engagement.", + "projectAvatarUrl": "https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/f6550061-4756-49ac-b3da-6dc87fd589a9/76716e6b0c575e52832cf0f58cae6f2c.jpg", + "projectCoverImageUrl": "https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/906bad2e-6a95-4bba-9261-aeaf88ff7afe/Screenshot_20240823-030141_1.jpg", + "category": "Social", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://www.fanbase.app/" + ], + "farcaster": [ + "https://warpcast.com/denzooo", + "https://warpcast.com/phynn", + "https://warpcast.com/cepodr" + ], + "twitter": "", + "mirror": null + }, + "team": [ + "508591" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://news.fanbase.app/", + "name": "Fanbase", + "description": "Fanbase is a FREE Next-Generation Social Media App that allows ANY user to earn money from day one.\nUnlike other social apps, Fanbase is the one place you can truly be you " + } + ] + }, + { + "name": "Punk Shield", + "description": "Punkshield is an advanced security solution designed to protect your valuable digital assets. It offers a multi-signature (multi-sig) wallet, adding multiple layers of security to safeguard your crypto holdings. Punkshield allows users to enable two-factor authentication (2FA) through Email or Google Authenticator for enhanced protection. The platform also includes a mobile-friendly interface, making it easy to manage your assets on the go.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/7782a4d3-48ab-4027-b2ac-7685dd744470.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/31d95f35-43e6-4c07-821b-70221b57e233.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://punkshield.xyz/" + ], + "farcaster": [ + "https://warpcast.com/punkshield.eth" + ], + "twitter": "https://x.com/Punkonbase", + "mirror": null + }, + "team": [ + "841741" + ], + "github": [], + "packages": [], + "contracts": [ + { + "address": "0xD8461A9760D3DCE9b87259b7D1fB82c20656de3E", + "deploymentTxHash": "0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f", + "deployerAddress": "0x2b9C5411E205E8Ea59C1BE1Da4EFdd5FFa7A8a23", + "verificationProof": "0x230f16e658a22aed665c57a4c2a95003a93eb9be4c85d89e741243abb8cd92b90309927a6d3e07b654a1e016ddc492568b58c5dcec49aacd5ee0e33cc08e48d81c", + "chainId": 8453 + } + ], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "freemium", + "pricingModelDetails": "All basepunk holder can access this for free & who have not held basepunk nft, they need to pay 0.0013 Eth to create punkshiled wallet for one time fees.", + "links": [ + { + "url": "https://basescan.org/tx/0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f", + "name": "Punk Shield", + "description": "Punkshield revolutionizes digital asset security by providing unmatched protection and peace of mind. With its multi-sig wallet, two-factor authentication, and seamless integration of advanced features like swapping and bridging, Punkshield empowers users to take control of their crypto assets confidently. It safeguards against potential threats, ensuring that users' investments remain secure and accessible, allowing them to focus on growth and innovation in the digital world. With Punkshield, your assets are not just protected—they're fortified for the future." + } + ] + }, + { + "name": "Solady", + "description": "Solady is an open-source repository containing highly-optimized Solidity snippets. It offers efficient implementations of commonly-used libraries, such as MerkleProofLib, alongside cutting-edge features like LibZip.\n\nBy thoughtfully encapsulating low-level inline assembly within flexible APIs, Solady simplifies the process of writing clean and efficient Solidity code. More than just a library, Solady also serves as a learning resource and experimental laboratory for pioneering gas-optimization techniques.\n\nSolady is used in the codebases of Optimism and Coinbase.\n\nWith respect to the OP stack, Solady contributes in the following ways:\n- Provides a Solidity and JavaScript implementation of FastLZ compression algorithm, which is used for more accurate gas estimations in the Fjord upgrade. The JavaScript code is very minimal, allowing for it's easy translation into Go.\n- Various other utilities such as bytecode proxies and string operations.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/0e726459-df1e-4cea-bddb-25399f88acea.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/0615ef25-edbb-4b19-934d-79614daf8040.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://solady.org" + ], + "farcaster": [], + "twitter": "https://twitter.com/optimizoor", + "mirror": null + }, + "team": [ + "4686" + ], + "github": [ + { + "url": "https://github.com/Vectorized/solady", + "name": "Solady", + "description": "Optimized Solidity snippets" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "99379", + "date": "", + "details": null + }, + { + "grant": null, + "link": null, + "amount": "45018", + "date": "", + "details": null + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://github.com/search?q=repo%3Aethereum-optimism%2Foptimism%20solady&type=code", + "name": "Solady usage in Optimism", + "description": "Solady usage in Optimism" + } + ] + }, + { + "name": "xuwinnie.review", + "description": "Security Researcher.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "xuwinnie.review" + ], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "462511" + ], + "github": [ + { + "url": "https://github.com/xuwinnie/reports", + "name": null, + "description": null + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "freemium", + "pricingModelDetails": "NA", + "links": [] + }, + { + "name": "Builderism", + "description": "Make your op stack with just a few commands!", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/e74ad0ba-d2bc-449d-9411-cbcad9bc8105.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/c7c58454-c6b7-4ce0-8b5f-cd60576940f4.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://github.com/rabbitprincess/builderism" + ], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "841662" + ], + "github": [ + { + "url": "https://github.com/rabbitprincess/builderism", + "name": "Builderism", + "description": "Make your mainnet using OP Stack!" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "Moved Network", + "description": "We're building the next generation Ethereum L2 blockchain on Optimism OP Stack that supports the most secure Move smart contract language. Our goal is to help the security and parallel execution of Move meet Ethereum’s vast liquidity.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/4088a7f3-ba0f-4ec6-a6bc-ff4caaf666eb.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/68088c9d-248f-4b4c-b8b7-1e8c52c5569a.png", + "category": "Cross Chain", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://moved.network" + ], + "farcaster": [], + "twitter": "https://x.com/MovedNetwork", + "mirror": null + }, + "team": [ + "831955" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "under-1m", + "date": "2024", + "details": "Received some of the pre-seed investment from 4 VCs and 2 angels. The rounds is still open for more investment." + } + ], + "revenue": [] + }, + "pricingModel": "pay_to_use", + "pricingModelDetails": "Users pay for transaction fees", + "links": [ + { + "url": "https://www.crunchbase.com/organization/moved-network", + "name": "Crunchbase", + "description": "Company investor profile" + } + ] + }, + { + "name": "xuwinnie.review", + "description": "Security Researcher.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "xuwinnie.review" + ], + "farcaster": [], + "twitter": "https://x.com/xuwinniexu", + "mirror": null + }, + "team": [ + "462511" + ], + "github": [ + { + "url": "https://github.com/xuwinnie/reports", + "name": null, + "description": null + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "freemium", + "pricingModelDetails": "Factors include sloc, complexity, postive impact...", + "links": [] + }, + { + "name": "hildr", + "description": "Hildr is an OP Stack rollup node client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/d304db21-cc7e-4236-8a63-a2a5161c4aee.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/2d30ac8c-806b-4332-b596-c8b5faadc032.png", + "category": "Utility", + "osoSlug": "hildr-optimism-java", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/hildr-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400", + "754190" + ], + "github": [ + { + "url": "https://github.com/optimism-java/hildr", + "name": "", + "description": "" + } + ], + "packages": [ + { + "url": "https://github.com/optimism-java/hildr/pkgs/container/hildr", + "name": null, + "description": null + }, + { + "url": "https://github.com/optimism-java/hildr/releases/tag/v0.4.4", + "name": null, + "description": null + } + ], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "62608.95", + "date": "", + "details": null + }, + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/page-4923039239406415", + "amount": "25000", + "date": "2023-07-05", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://www.opensource.observer/project/hildr-optimism-java", + "name": "", + "description": "" + } + ] + }, + { + "name": "op-besu", + "description": "Op-besu is an OP Stack execution client written in Java 21. We are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/op-besu-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400" + ], + "github": [ + "https://github.com/optimism-java/op-besu" + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294", + "amount": "50000", + "date": "2024-05-09", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + } +] \ No newline at end of file diff --git a/lib/save-file/save-file.ts b/lib/save-file/save-file.ts index 99e278d..d648167 100644 --- a/lib/save-file/save-file.ts +++ b/lib/save-file/save-file.ts @@ -20,7 +20,7 @@ export async function Savefile(data: any, requiredPath: string[] = [], fileName: const filePath = path.join(folderName, fileName); // Use fs.writeFileSync for more robust file writing - fs.writeFile(filePath, data, {encoding:"utf8", flag:"w"}, () => {}); + fs.writeFileSync(filePath, data, {encoding:"utf8", flag:"w"}); console.log(`File successfully written to ${filePath}`); } catch (error) { From a37373a67b564293e115ae896f7efb1de6806ae4 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Mon, 26 Aug 2024 01:23:21 +0700 Subject: [PATCH 13/15] remove: remove temp json file --- .../retropgf5-live-data.json | 662 ------------------ 1 file changed, 662 deletions(-) delete mode 100644 data/tempretropgf5-live-data/retropgf5-live-data.json diff --git a/data/tempretropgf5-live-data/retropgf5-live-data.json b/data/tempretropgf5-live-data/retropgf5-live-data.json deleted file mode 100644 index 733aa1b..0000000 --- a/data/tempretropgf5-live-data/retropgf5-live-data.json +++ /dev/null @@ -1,662 +0,0 @@ -[ - { - "name": "Nfts ", - "description": "nft creation ", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", - "category": "NFT", - "osoSlug": "", - "socialLinks": { - "website": [], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "427926" - ], - "github": [], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [] - }, - { - "name": "Nfts ", - "description": "nft creation ", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", - "category": "NFT", - "osoSlug": "", - "socialLinks": { - "website": [], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "427926" - ], - "github": [], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [] - }, - { - "name": "Nfts ", - "description": "nft creation ", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", - "category": "NFT", - "osoSlug": "", - "socialLinks": { - "website": [], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "427926" - ], - "github": [], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [] - }, - { - "name": "Nfts ", - "description": "nft creation ", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png", - "category": "NFT", - "osoSlug": "", - "socialLinks": { - "website": [], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "427926" - ], - "github": [], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [] - }, - { - "name": "MonstersOnBase", - "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png", - "category": "NFT", - "osoSlug": "MonstersOnBase", - "socialLinks": { - "website": [ - "https://element.market/collections/monstersonbase" - ], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "569945" - ], - "github": [ - { - "url": "https://github.com/mali030303/MonstersOnBasee", - "name": null, - "description": null - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "freemium", - "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.", - "links": [] - }, - { - "name": "MonstersOnBase", - "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png", - "category": "NFT", - "osoSlug": "MonstersOnBase", - "socialLinks": { - "website": [ - "https://element.market/collections/monstersonbase" - ], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "569945" - ], - "github": [ - { - "url": "https://github.com/mali030303/MonstersOnBasee", - "name": null, - "description": null - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "freemium", - "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.", - "links": [] - }, - { - "name": "BASE BTC EARTH 🌍", - "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets. https://element.market/collections/base-btc-earth", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/f7b97236-dce1-4e44-873c-74bb5f31b49c.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/963d18b8-32a1-4d7c-a09a-640cd20e4f22.png", - "category": "NFT", - "osoSlug": "BASE BTC EARTH 🌍", - "socialLinks": { - "website": [ - "https://element.market/collections/base-btc-earth" - ], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "569945" - ], - "github": [ - { - "url": "https://github.com/mali030303/BASE-BTC-EARTH--", - "name": null, - "description": null - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "pay_to_use", - "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.", - "links": [] - }, - { - "name": "Dragons On Op Stack 🔴", - "description": "Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/7d8db529-7225-43f2-bc2c-ade2f7aaf7af.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/af6a4fb6-52e3-4570-840a-e6c949ff905e.png", - "category": "NFT", - "osoSlug": "Dragons On Op Stack 🔴", - "socialLinks": { - "website": [ - "https://element.market/collections/dragons-on-op-stack" - ], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "569945" - ], - "github": [ - { - "url": "https://github.com/mali030303/Dragons-On-Op-Stack--", - "name": null, - "description": null - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "pay_to_use", - "pricingModelDetails": "Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.", - "links": [] - }, - { - "name": "FANBASE ✨", - "description": "This is a fanbase community that operates in the field of social engagement.", - "projectAvatarUrl": "https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/f6550061-4756-49ac-b3da-6dc87fd589a9/76716e6b0c575e52832cf0f58cae6f2c.jpg", - "projectCoverImageUrl": "https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/906bad2e-6a95-4bba-9261-aeaf88ff7afe/Screenshot_20240823-030141_1.jpg", - "category": "Social", - "osoSlug": "", - "socialLinks": { - "website": [ - "https://www.fanbase.app/" - ], - "farcaster": [ - "https://warpcast.com/denzooo", - "https://warpcast.com/phynn", - "https://warpcast.com/cepodr" - ], - "twitter": "", - "mirror": null - }, - "team": [ - "508591" - ], - "github": [], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [ - { - "url": "https://news.fanbase.app/", - "name": "Fanbase", - "description": "Fanbase is a FREE Next-Generation Social Media App that allows ANY user to earn money from day one.\nUnlike other social apps, Fanbase is the one place you can truly be you " - } - ] - }, - { - "name": "Punk Shield", - "description": "Punkshield is an advanced security solution designed to protect your valuable digital assets. It offers a multi-signature (multi-sig) wallet, adding multiple layers of security to safeguard your crypto holdings. Punkshield allows users to enable two-factor authentication (2FA) through Email or Google Authenticator for enhanced protection. The platform also includes a mobile-friendly interface, making it easy to manage your assets on the go.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/7782a4d3-48ab-4027-b2ac-7685dd744470.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/31d95f35-43e6-4c07-821b-70221b57e233.png", - "category": "Utility", - "osoSlug": "", - "socialLinks": { - "website": [ - "https://punkshield.xyz/" - ], - "farcaster": [ - "https://warpcast.com/punkshield.eth" - ], - "twitter": "https://x.com/Punkonbase", - "mirror": null - }, - "team": [ - "841741" - ], - "github": [], - "packages": [], - "contracts": [ - { - "address": "0xD8461A9760D3DCE9b87259b7D1fB82c20656de3E", - "deploymentTxHash": "0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f", - "deployerAddress": "0x2b9C5411E205E8Ea59C1BE1Da4EFdd5FFa7A8a23", - "verificationProof": "0x230f16e658a22aed665c57a4c2a95003a93eb9be4c85d89e741243abb8cd92b90309927a6d3e07b654a1e016ddc492568b58c5dcec49aacd5ee0e33cc08e48d81c", - "chainId": 8453 - } - ], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "freemium", - "pricingModelDetails": "All basepunk holder can access this for free & who have not held basepunk nft, they need to pay 0.0013 Eth to create punkshiled wallet for one time fees.", - "links": [ - { - "url": "https://basescan.org/tx/0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f", - "name": "Punk Shield", - "description": "Punkshield revolutionizes digital asset security by providing unmatched protection and peace of mind. With its multi-sig wallet, two-factor authentication, and seamless integration of advanced features like swapping and bridging, Punkshield empowers users to take control of their crypto assets confidently. It safeguards against potential threats, ensuring that users' investments remain secure and accessible, allowing them to focus on growth and innovation in the digital world. With Punkshield, your assets are not just protected—they're fortified for the future." - } - ] - }, - { - "name": "Solady", - "description": "Solady is an open-source repository containing highly-optimized Solidity snippets. It offers efficient implementations of commonly-used libraries, such as MerkleProofLib, alongside cutting-edge features like LibZip.\n\nBy thoughtfully encapsulating low-level inline assembly within flexible APIs, Solady simplifies the process of writing clean and efficient Solidity code. More than just a library, Solady also serves as a learning resource and experimental laboratory for pioneering gas-optimization techniques.\n\nSolady is used in the codebases of Optimism and Coinbase.\n\nWith respect to the OP stack, Solady contributes in the following ways:\n- Provides a Solidity and JavaScript implementation of FastLZ compression algorithm, which is used for more accurate gas estimations in the Fjord upgrade. The JavaScript code is very minimal, allowing for it's easy translation into Go.\n- Various other utilities such as bytecode proxies and string operations.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/0e726459-df1e-4cea-bddb-25399f88acea.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/0615ef25-edbb-4b19-934d-79614daf8040.png", - "category": "Utility", - "osoSlug": "", - "socialLinks": { - "website": [ - "https://solady.org" - ], - "farcaster": [], - "twitter": "https://twitter.com/optimizoor", - "mirror": null - }, - "team": [ - "4686" - ], - "github": [ - { - "url": "https://github.com/Vectorized/solady", - "name": "Solady", - "description": "Optimized Solidity snippets" - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [ - { - "grant": null, - "link": null, - "amount": "99379", - "date": "", - "details": null - }, - { - "grant": null, - "link": null, - "amount": "45018", - "date": "", - "details": null - } - ], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [ - { - "url": "https://github.com/search?q=repo%3Aethereum-optimism%2Foptimism%20solady&type=code", - "name": "Solady usage in Optimism", - "description": "Solady usage in Optimism" - } - ] - }, - { - "name": "xuwinnie.review", - "description": "Security Researcher.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png", - "category": "Utility", - "osoSlug": "", - "socialLinks": { - "website": [ - "xuwinnie.review" - ], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "462511" - ], - "github": [ - { - "url": "https://github.com/xuwinnie/reports", - "name": null, - "description": null - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "freemium", - "pricingModelDetails": "NA", - "links": [] - }, - { - "name": "Builderism", - "description": "Make your op stack with just a few commands!", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/e74ad0ba-d2bc-449d-9411-cbcad9bc8105.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/c7c58454-c6b7-4ce0-8b5f-cd60576940f4.png", - "category": "Utility", - "osoSlug": "", - "socialLinks": { - "website": [ - "https://github.com/rabbitprincess/builderism" - ], - "farcaster": [], - "twitter": null, - "mirror": null - }, - "team": [ - "841662" - ], - "github": [ - { - "url": "https://github.com/rabbitprincess/builderism", - "name": "Builderism", - "description": "Make your mainnet using OP Stack!" - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [] - }, - { - "name": "Moved Network", - "description": "We're building the next generation Ethereum L2 blockchain on Optimism OP Stack that supports the most secure Move smart contract language. Our goal is to help the security and parallel execution of Move meet Ethereum’s vast liquidity.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/4088a7f3-ba0f-4ec6-a6bc-ff4caaf666eb.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/68088c9d-248f-4b4c-b8b7-1e8c52c5569a.png", - "category": "Cross Chain", - "osoSlug": "", - "socialLinks": { - "website": [ - "https://moved.network" - ], - "farcaster": [], - "twitter": "https://x.com/MovedNetwork", - "mirror": null - }, - "team": [ - "831955" - ], - "github": [], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [ - { - "grant": null, - "link": null, - "amount": "under-1m", - "date": "2024", - "details": "Received some of the pre-seed investment from 4 VCs and 2 angels. The rounds is still open for more investment." - } - ], - "revenue": [] - }, - "pricingModel": "pay_to_use", - "pricingModelDetails": "Users pay for transaction fees", - "links": [ - { - "url": "https://www.crunchbase.com/organization/moved-network", - "name": "Crunchbase", - "description": "Company investor profile" - } - ] - }, - { - "name": "xuwinnie.review", - "description": "Security Researcher.", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png", - "category": "Utility", - "osoSlug": "", - "socialLinks": { - "website": [ - "xuwinnie.review" - ], - "farcaster": [], - "twitter": "https://x.com/xuwinniexu", - "mirror": null - }, - "team": [ - "462511" - ], - "github": [ - { - "url": "https://github.com/xuwinnie/reports", - "name": null, - "description": null - } - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [], - "revenue": [] - }, - "pricingModel": "freemium", - "pricingModelDetails": "Factors include sloc, complexity, postive impact...", - "links": [] - }, - { - "name": "hildr", - "description": "Hildr is an OP Stack rollup node client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/d304db21-cc7e-4236-8a63-a2a5161c4aee.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/2d30ac8c-806b-4332-b596-c8b5faadc032.png", - "category": "Utility", - "osoSlug": "hildr-optimism-java", - "socialLinks": { - "website": [ - "https://optimism-java.github.io/hildr-docs" - ], - "farcaster": [], - "twitter": "https://x.com/optimism_java", - "mirror": null - }, - "team": [ - "193400", - "754190" - ], - "github": [ - { - "url": "https://github.com/optimism-java/hildr", - "name": "", - "description": "" - } - ], - "packages": [ - { - "url": "https://github.com/optimism-java/hildr/pkgs/container/hildr", - "name": null, - "description": null - }, - { - "url": "https://github.com/optimism-java/hildr/releases/tag/v0.4.4", - "name": null, - "description": null - } - ], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [ - { - "grant": null, - "link": null, - "amount": "62608.95", - "date": "", - "details": null - }, - { - "grant": "token-house-mission", - "link": "https://app.charmverse.io/op-grants/page-4923039239406415", - "amount": "25000", - "date": "2023-07-05", - "details": "" - } - ], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [ - { - "url": "https://www.opensource.observer/project/hildr-optimism-java", - "name": "", - "description": "" - } - ] - }, - { - "name": "op-besu", - "description": "Op-besu is an OP Stack execution client written in Java 21. We are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", - "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png", - "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png", - "category": "Utility", - "osoSlug": "", - "socialLinks": { - "website": [ - "https://optimism-java.github.io/op-besu-docs" - ], - "farcaster": [], - "twitter": "https://x.com/optimism_java", - "mirror": null - }, - "team": [ - "193400" - ], - "github": [ - "https://github.com/optimism-java/op-besu" - ], - "packages": [], - "contracts": [], - "grantsAndFunding": { - "ventureFunding": [], - "grants": [ - { - "grant": "token-house-mission", - "link": "https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294", - "amount": "50000", - "date": "2024-05-09", - "details": "" - } - ], - "revenue": [] - }, - "pricingModel": "free", - "pricingModelDetails": "", - "links": [] - } -] \ No newline at end of file From e3cf62fbd54a7f9304ed468bd872d996994c0762 Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Tue, 27 Aug 2024 22:22:30 +0700 Subject: [PATCH 14/15] fix: remove in memory cache on api --- build.md | 10 +- .../retropgf5-live-data.json | 528 ++++++++++++++++++ .../retropgf5-live-data.json | 1 - lib/save-file/save-file.ts | 1 - src/controller/trigger-module.ts | 2 - src/index.ts | 10 +- .../retropgf5-live-data.ts | 15 +- utils/utils.ts | 18 +- 8 files changed, 564 insertions(+), 21 deletions(-) delete mode 100644 lib/data/retropgf5-live-data/retropgf5-live-data.json diff --git a/build.md b/build.md index 99a134a..76199a8 100644 --- a/build.md +++ b/build.md @@ -1,14 +1,14 @@ -docker buildx build --platform linux/aarch64 --no-cache -t worker:v-25 --load . +docker buildx build --platform linux/aarch64 -t worker:v-39 --load . -docker tag worker:v-25 tgrziminiar/worker:v-25 +docker tag worker:v-39 tgrziminiar/worker:v-39 -docker push tgrziminiar/worker:v-25 +docker push tgrziminiar/worker:v-39 docker run -d \ - -p 3001:3001 \ + -p 3002:3002 \ --env-file .env \ --name fukthis \ - worker:v-2 + worker:v-36 docker run -d \ -p 3001:3001 \ diff --git a/data/retropgf5-live-data/retropgf5-live-data.json b/data/retropgf5-live-data/retropgf5-live-data.json index 520fe73..d25bbdd 100644 --- a/data/retropgf5-live-data/retropgf5-live-data.json +++ b/data/retropgf5-live-data/retropgf5-live-data.json @@ -746,5 +746,533 @@ "pricingModel": "free", "pricingModelDetails": "", "links": [] + }, + { + "name": "Ethereum POS Testnet", + "description": " Quick and Easy Way to Bootstrap your own Local Ethereum PoS Testnet. Great for testing consensus", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/337dbbb2-74f9-4eee-9685-95922c926e38.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/e76d2c47-741f-4277-9b6f-e2930a492b47.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "542731" + ], + "github": [ + { + "url": "https://github.com/rzmahmood/ethereum-pos-testnet", + "name": "Ethereum PoS Testnet", + "description": "This deployment process allows you to setup and deploy your own local ethereum PoS networks with multiple nodes. This repository is targeted to developers who want to quickly modify client source code and deploy a PoS network. This setup can is can serve as a reference for building your own production deployments." + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "op-besu", + "description": "Op-besu is an OP Stack execution client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png", + "category": "Utility", + "osoSlug": "op-besu-optimism-java", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/op-besu-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400" + ], + "github": [ + { + "url": "https://github.com/optimism-java/op-besu", + "name": "", + "description": "" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294", + "amount": "50000", + "date": "2024-05-09", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "hildr", + "description": "Hildr is an OP Stack consensus client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/d304db21-cc7e-4236-8a63-a2a5161c4aee.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/2d30ac8c-806b-4332-b596-c8b5faadc032.png", + "category": "Utility", + "osoSlug": "hildr-optimism-java", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/hildr-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400", + "754190" + ], + "github": [ + { + "url": "https://github.com/optimism-java/hildr", + "name": "", + "description": "" + } + ], + "packages": [ + { + "url": "https://github.com/optimism-java/hildr/pkgs/container/hildr", + "name": null, + "description": null + }, + { + "url": "https://github.com/optimism-java/hildr/releases/tag/v0.4.4", + "name": null, + "description": null + } + ], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "62608.95", + "date": "", + "details": null + }, + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/page-4923039239406415", + "amount": "25000", + "date": "2023-07-05", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://www.opensource.observer/project/hildr-optimism-java", + "name": "", + "description": "" + } + ] + }, + { + "name": "RPCHub", + "description": "RPCHub is an open source RPC aggregator allowing you to customize configurations and set own strategies, enabling the fastest and most robust RPC services.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/db450965-ac30-4d2e-a635-39d40d1e4179.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/48fb767e-4b37-432b-91b6-be8671b99c45.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://rpchub.io/" + ], + "farcaster": [], + "twitter": "https://x.com/RealRPCHub", + "mirror": null + }, + "team": [ + "568168" + ], + "github": [ + { + "url": "https://github.com/BlockPILabs/aggregator", + "name": "", + "description": "" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://discord.com/channels/900985418202365982/1083240109811445801", + "name": "RPChub discord channel", + "description": "Many developers have expressed that this tool is very useful." + }, + { + "url": "https://github.com/ethereum-optimism/ecosystem-contributions/pull/193", + "name": "Builder Ideas PR", + "description": "The pull request we submitted and got approved and merged" + } + ] + }, + { + "name": "Retro Funding Site Design", + "description": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/86341a25-24ac-4e74-bd33-ebf7622e8863.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/2183cd4a-1222-48d8-9f15-09edcb6aaf39.png", + "category": "Governance", + "osoSlug": "", + "socialLinks": { + "website": [], + "farcaster": [], + "twitter": null, + "mirror": null + }, + "team": [ + "5779", + "844381" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "Lodestar", + "description": "Lodestar is a Typescript ecosystem for Ethereum consensus, developed by ChainSafe Systems. Our flagship products are our production-capable beacon chain and validator client. In addition, we maintain public repositories of useful tools for public use. Some of these libraries include JS implementations for BLS, SSZ, Discv5, Gossipsub, Noise and Yamux. Our work contributes to the backbone infrastructure required to keep the Ethereum blockchain progressing within the rules as defined by the specification.\n\nLodestar’s niche is in its implementation language, TypeScript. Our software and tooling is uniquely situated as the go-to for researchers and developers for rapid prototyping such as our Prover, a verified web3 provider using light clients to increase decentralization and security of the JSON-RPC. Millions of developers around the world are familiar with Typescript, and Lodestar’s high-quality codebases are excellent introductions to the Ethereum protocol, with the goal of increasing client diversity and attracting new talent from one of the largest groups of developers in the world.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/973ba7db-8101-405b-98a0-1f7d93a0f344.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/3bb2834a-dcfd-4a71-ae2f-1e4fbef4209c.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://lodestar.chainsafe.io", + "https://github.com/ChainSafe/lodestar", + "https://chainsafe.github.io/lodestar/", + "https://chainsafe.io" + ], + "farcaster": [ + "https://warpcast.com/lodestar" + ], + "twitter": "https://x.com/lodestar_eth", + "mirror": null + }, + "team": [ + "20822" + ], + "github": [ + { + "url": "https://github.com/ChainSafe/lodestar", + "name": "Lodestar", + "description": "TypeScript Implementation of Ethereum Consensus" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "248448.21", + "date": "", + "details": null + }, + { + "grant": null, + "link": null, + "amount": "79662.51", + "date": "", + "details": null + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://explorer.rated.network/o/ChainSafe%20-%20Lido?network=mainnet&timeWindow=30d&idType=poolShare", + "name": "ChainSafe Validator Metrics", + "description": "This page shows the performance of Lodestar as a validator client, run by ChainSafe infrastructure to support client diversity on mainnet validators via Lido." + }, + { + "url": "https://probelab.io/ethereum/discv5/2024-34/", + "name": "Probelab Discv5 Distribution", + "description": "This page represents the distribution of various user agents within the Ethereum discv5 DHT." + }, + { + "url": "https://npm-stat.com/charts.html?package=%40chainsafe%2Flodestar&from=2021-06-26&to=2024-08-26", + "name": "NPM Download Stats", + "description": "This mono-repository contains a suite of Ethereum Consensus packages." + } + ] + }, + { + "name": "Viem: TypeScript Tooling for OP Stack", + "description": "Viem is the most used TypeScript Interface for Ethereum and the OP Stack. Viem provides robust, performant, and type-safe modules to be the foundation for building Web Applications, TypeScript Libraries, Wallets, Backends, Indexers, Scripts, and more, on top of Ethereum (and the OP Stack). With over 2.5 million monthly downloads, Viem is used in production by most at-scale (and small scale!) OP Stack projects like Optimism, Uniswap, Zora, Coinbase, Opensea, WalletConnect, Friend.tech, Rainbow, and so much more.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/171f60c2-1e3e-4b0a-998e-4015a7f468f7.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/64c06023-a910-4646-ba3e-81baa2d935dc.png", + "category": "Utility", + "osoSlug": "wevm", + "socialLinks": { + "website": [ + "https://viem.sh" + ], + "farcaster": [ + "https://warpcast.com/wevm" + ], + "twitter": "https://x.com/wevm_dev", + "mirror": null + }, + "team": [ + "6143" + ], + "github": [ + { + "url": "https://github.com/wevm/viem", + "name": "Viem", + "description": "TypeScript Interface for the OP Stack and Ethereum" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "156463.05", + "date": "", + "details": null + }, + { + "grant": null, + "link": null, + "amount": "198758.57", + "date": "", + "details": null + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://npm.im/viem", + "name": "580k weekly downloads via NPM", + "description": "Downloads: 580,000 weekly downloads\nDependents: 1,365\n" + }, + { + "url": "https://github.com/wevm/viem/graphs/contributors", + "name": "368 unique contributors", + "description": "368 unique contributors\n" + }, + { + "url": "https://github.com/wevm/viem/network/dependents", + "name": "41.3k Open Source Projects using Viem", + "description": "41.3k open source projects are using Viem\n2.1k open source libraries are using Viem" + }, + { + "url": "https://github.com/wevm/viem", + "name": "2.4k GitHub Stars", + "description": "2.4k GitHub Stars" + } + ] + }, + { + "name": "hildr", + "description": "Hildr is an OP Stack consensus client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official [website](https://optimism-java.github.io) .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/d304db21-cc7e-4236-8a63-a2a5161c4aee.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/2d30ac8c-806b-4332-b596-c8b5faadc032.png", + "category": "Utility", + "osoSlug": "hildr-optimism-java", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/hildr-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400", + "754190" + ], + "github": [ + { + "url": "https://github.com/optimism-java/hildr", + "name": "", + "description": "" + } + ], + "packages": [ + { + "url": "https://github.com/optimism-java/hildr/pkgs/container/hildr", + "name": null, + "description": null + }, + { + "url": "https://github.com/optimism-java/hildr/releases/tag/v0.4.4", + "name": null, + "description": null + } + ], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "62608.95", + "date": "", + "details": null + }, + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/page-4923039239406415", + "amount": "25000", + "date": "2023-07-05", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [ + { + "url": "https://www.opensource.observer/project/hildr-optimism-java", + "name": "", + "description": "" + } + ] + }, + { + "name": "op-besu", + "description": "Op-besu is an OP Stack execution client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official [website](https://optimism-java.github.io) .", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png", + "category": "Utility", + "osoSlug": "op-besu-optimism-java", + "socialLinks": { + "website": [ + "https://optimism-java.github.io/op-besu-docs" + ], + "farcaster": [], + "twitter": "https://x.com/optimism_java", + "mirror": null + }, + "team": [ + "193400" + ], + "github": [ + { + "url": "https://github.com/optimism-java/op-besu", + "name": "", + "description": "" + } + ], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": "token-house-mission", + "link": "https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294", + "amount": "50000", + "date": "2024-05-09", + "details": "" + } + ], + "revenue": [] + }, + "pricingModel": "free", + "pricingModelDetails": "", + "links": [] + }, + { + "name": "MetaCRM", + "description": "MetaCRM provides a suite of innovative software solutions empowering marketing efficiency & personalized customer service for Web3 businesses.", + "projectAvatarUrl": "https://storage.googleapis.com/op-atlas/f3d4c02b-2511-4026-a886-1b74a7a4c206.png", + "projectCoverImageUrl": "https://storage.googleapis.com/op-atlas/1d6693d9-6b5e-489e-83dc-c4416f78ca93.png", + "category": "Utility", + "osoSlug": "", + "socialLinks": { + "website": [ + "https://metacrm.inc/#/" + ], + "farcaster": [ + "https://warpcast.com/metacrm" + ], + "twitter": "https://x.com/metacrm_inc", + "mirror": null + }, + "team": [ + "477715" + ], + "github": [], + "packages": [], + "contracts": [], + "grantsAndFunding": { + "ventureFunding": [], + "grants": [ + { + "grant": null, + "link": null, + "amount": "1m-5m", + "date": "2023", + "details": "Seed Round. Investors are Cherubic Ventures, Red Building Capital, Blockchain Founders Fund, and Ondine Capital" + } + ], + "revenue": [] + }, + "pricingModel": "freemium", + "pricingModelDetails": "https://metacrm.gitbook.io/metacrm/other-info/pricing", + "links": [ + { + "url": "https://app.radiant.capital/#/markets", + "name": "Use case", + "description": "Examples - dApps installed our front-end widget" + } + ] } ] \ No newline at end of file diff --git a/lib/data/retropgf5-live-data/retropgf5-live-data.json b/lib/data/retropgf5-live-data/retropgf5-live-data.json deleted file mode 100644 index 54c4152..0000000 --- a/lib/data/retropgf5-live-data/retropgf5-live-data.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Nfts ","description":"nft creation ","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/39cfa64d-46e8-43a1-9bf8-baf6d41de613.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f43cc8a7-8575-45c8-843f-01f9830befd0.png","category":"NFT","osoSlug":"","socialLinks":{"website":[],"farcaster":[],"twitter":null,"mirror":null},"team":["427926"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"MonstersOnBase","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png","category":"NFT","osoSlug":"MonstersOnBase","socialLinks":{"website":["https://element.market/collections/monstersonbase"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/MonstersOnBasee","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.","links":[]},{"name":"MonstersOnBase","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/ef7bc6d3-c915-4390-9d7f-f781d6f7fea3.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/6cf81b2e-43b7-4645-ab66-39f71cb1132b.png","category":"NFT","osoSlug":"MonstersOnBase","socialLinks":{"website":["https://element.market/collections/monstersonbase"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/MonstersOnBasee","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.","links":[]},{"name":"BASE BTC EARTH 🌍","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets. https://element.market/collections/base-btc-earth","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/f7b97236-dce1-4e44-873c-74bb5f31b49c.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/963d18b8-32a1-4d7c-a09a-640cd20e4f22.png","category":"NFT","osoSlug":"BASE BTC EARTH 🌍","socialLinks":{"website":["https://element.market/collections/base-btc-earth"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/BASE-BTC-EARTH--","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"pay_to_use","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.","links":[]},{"name":"Dragons On Op Stack 🔴","description":"Hello, I am a designer. I am an artificial intelligence designer. I am 25 years old. I'm from Turkey. I need some support. I want to do more for Optimisim. I don't know much about Github. But everything I did here is as you want. I increased the on-chain activity and interacted with 420 wallets.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/7d8db529-7225-43f2-bc2c-ade2f7aaf7af.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/af6a4fb6-52e3-4570-840a-e6c949ff905e.png","category":"NFT","osoSlug":"Dragons On Op Stack 🔴","socialLinks":{"website":["https://element.market/collections/dragons-on-op-stack"],"farcaster":[],"twitter":null,"mirror":null},"team":["569945"],"github":[{"url":"https://github.com/mali030303/Dragons-On-Op-Stack--","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"pay_to_use","pricingModelDetails":"Our price is the lowest fee. Our goal is community before money. It is usually a fee like 0.00001 Eth that everyone can reach.This is true for all the projects I do.","links":[]},{"name":"FANBASE ✨","description":"This is a fanbase community that operates in the field of social engagement.","projectAvatarUrl":"https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/f6550061-4756-49ac-b3da-6dc87fd589a9/76716e6b0c575e52832cf0f58cae6f2c.jpg","projectCoverImageUrl":"https://cdn.charmverse.io/user-content/6020d938-f07e-4f95-a756-5562f175762e/906bad2e-6a95-4bba-9261-aeaf88ff7afe/Screenshot_20240823-030141_1.jpg","category":"Social","osoSlug":"","socialLinks":{"website":["https://www.fanbase.app/"],"farcaster":["https://warpcast.com/denzooo","https://warpcast.com/phynn","https://warpcast.com/cepodr"],"twitter":"","mirror":null},"team":["508591"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[{"url":"https://news.fanbase.app/","name":"Fanbase","description":"Fanbase is a FREE Next-Generation Social Media App that allows ANY user to earn money from day one.\nUnlike other social apps, Fanbase is the one place you can truly be you "}]},{"name":"Punk Shield","description":"Punkshield is an advanced security solution designed to protect your valuable digital assets. It offers a multi-signature (multi-sig) wallet, adding multiple layers of security to safeguard your crypto holdings. Punkshield allows users to enable two-factor authentication (2FA) through Email or Google Authenticator for enhanced protection. The platform also includes a mobile-friendly interface, making it easy to manage your assets on the go.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/7782a4d3-48ab-4027-b2ac-7685dd744470.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/31d95f35-43e6-4c07-821b-70221b57e233.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://punkshield.xyz/"],"farcaster":["https://warpcast.com/punkshield.eth"],"twitter":"https://x.com/Punkonbase","mirror":null},"team":["841741"],"github":[],"packages":[],"contracts":[{"address":"0xD8461A9760D3DCE9b87259b7D1fB82c20656de3E","deploymentTxHash":"0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f","deployerAddress":"0x2b9C5411E205E8Ea59C1BE1Da4EFdd5FFa7A8a23","verificationProof":"0x230f16e658a22aed665c57a4c2a95003a93eb9be4c85d89e741243abb8cd92b90309927a6d3e07b654a1e016ddc492568b58c5dcec49aacd5ee0e33cc08e48d81c","chainId":8453}],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"All basepunk holder can access this for free & who have not held basepunk nft, they need to pay 0.0013 Eth to create punkshiled wallet for one time fees.","links":[{"url":"https://basescan.org/tx/0xb2f1f9c12a683959b290825bdf408392a5ac2ae5c942ef57aaea25528e72a06f","name":"Punk Shield","description":"Punkshield revolutionizes digital asset security by providing unmatched protection and peace of mind. With its multi-sig wallet, two-factor authentication, and seamless integration of advanced features like swapping and bridging, Punkshield empowers users to take control of their crypto assets confidently. It safeguards against potential threats, ensuring that users' investments remain secure and accessible, allowing them to focus on growth and innovation in the digital world. With Punkshield, your assets are not just protected—they're fortified for the future."}]},{"name":"Solady","description":"Solady is an open-source repository containing highly-optimized Solidity snippets. It offers efficient implementations of commonly-used libraries, such as MerkleProofLib, alongside cutting-edge features like LibZip.\n\nBy thoughtfully encapsulating low-level inline assembly within flexible APIs, Solady simplifies the process of writing clean and efficient Solidity code. More than just a library, Solady also serves as a learning resource and experimental laboratory for pioneering gas-optimization techniques.\n\nSolady is used in the codebases of Optimism and Coinbase.\n\nWith respect to the OP stack, Solady contributes in the following ways:\n- Provides a Solidity and JavaScript implementation of FastLZ compression algorithm, which is used for more accurate gas estimations in the Fjord upgrade. The JavaScript code is very minimal, allowing for it's easy translation into Go.\n- Various other utilities such as bytecode proxies and string operations.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/0e726459-df1e-4cea-bddb-25399f88acea.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/0615ef25-edbb-4b19-934d-79614daf8040.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://solady.org"],"farcaster":[],"twitter":"https://twitter.com/optimizoor","mirror":null},"team":["4686"],"github":[{"url":"https://github.com/Vectorized/solady","name":"Solady","description":"Optimized Solidity snippets"}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":null,"link":null,"amount":"99379","date":"","details":null},{"grant":null,"link":null,"amount":"45018","date":"","details":null}],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[{"url":"https://github.com/search?q=repo%3Aethereum-optimism%2Foptimism%20solady&type=code","name":"Solady usage in Optimism","description":"Solady usage in Optimism"}]},{"name":"xuwinnie.review","description":"Security Researcher.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png","category":"Utility","osoSlug":"","socialLinks":{"website":["xuwinnie.review"],"farcaster":[],"twitter":null,"mirror":null},"team":["462511"],"github":[{"url":"https://github.com/xuwinnie/reports","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"NA","links":[]},{"name":"Builderism","description":"Make your op stack with just a few commands!","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/e74ad0ba-d2bc-449d-9411-cbcad9bc8105.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/c7c58454-c6b7-4ce0-8b5f-cd60576940f4.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://github.com/rabbitprincess/builderism"],"farcaster":[],"twitter":null,"mirror":null},"team":["841662"],"github":[{"url":"https://github.com/rabbitprincess/builderism","name":"Builderism","description":"Make your mainnet using OP Stack!"}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]},{"name":"Moved Network","description":"We're building the next generation Ethereum L2 blockchain on Optimism OP Stack that supports the most secure Move smart contract language. Our goal is to help the security and parallel execution of Move meet Ethereum’s vast liquidity.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/4088a7f3-ba0f-4ec6-a6bc-ff4caaf666eb.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/68088c9d-248f-4b4c-b8b7-1e8c52c5569a.png","category":"Cross Chain","osoSlug":"","socialLinks":{"website":["https://moved.network"],"farcaster":[],"twitter":"https://x.com/MovedNetwork","mirror":null},"team":["831955"],"github":[],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":null,"link":null,"amount":"under-1m","date":"2024","details":"Received some of the pre-seed investment from 4 VCs and 2 angels. The rounds is still open for more investment."}],"revenue":[]},"pricingModel":"pay_to_use","pricingModelDetails":"Users pay for transaction fees","links":[{"url":"https://www.crunchbase.com/organization/moved-network","name":"Crunchbase","description":"Company investor profile"}]},{"name":"xuwinnie.review","description":"Security Researcher.","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/23976744-db3b-49b9-b5d4-3b629a28dd3a.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/f7905adc-4525-4ea2-bc64-925690c7069c.png","category":"Utility","osoSlug":"","socialLinks":{"website":["xuwinnie.review"],"farcaster":[],"twitter":"https://x.com/xuwinniexu","mirror":null},"team":["462511"],"github":[{"url":"https://github.com/xuwinnie/reports","name":null,"description":null}],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[],"revenue":[]},"pricingModel":"freemium","pricingModelDetails":"Factors include sloc, complexity, postive impact...","links":[]},{"name":"hildr","description":"Hildr is an OP Stack rollup node client written in Java 21. \n\nWe are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/d304db21-cc7e-4236-8a63-a2a5161c4aee.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/2d30ac8c-806b-4332-b596-c8b5faadc032.png","category":"Utility","osoSlug":"hildr-optimism-java","socialLinks":{"website":["https://optimism-java.github.io/hildr-docs"],"farcaster":[],"twitter":"https://x.com/optimism_java","mirror":null},"team":["193400","754190"],"github":[{"url":"https://github.com/optimism-java/hildr","name":"","description":""}],"packages":[{"url":"https://github.com/optimism-java/hildr/pkgs/container/hildr","name":null,"description":null},{"url":"https://github.com/optimism-java/hildr/releases/tag/v0.4.4","name":null,"description":null}],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":null,"link":null,"amount":"62608.95","date":"","details":null},{"grant":"token-house-mission","link":"https://app.charmverse.io/op-grants/page-4923039239406415","amount":"25000","date":"2023-07-05","details":""}],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[{"url":"https://www.opensource.observer/project/hildr-optimism-java","name":"","description":""}]},{"name":"op-besu","description":"Op-besu is an OP Stack execution client written in Java 21. We are OptimismJ who continue to build open source public goods to help the Ethereum and Optimism community get better and better. Our main work is on OP Stack core protocols and ecosystem tools and libraries. You can view more detailed information on our official website https://optimism-java.github.io .","projectAvatarUrl":"https://storage.googleapis.com/op-atlas/cccbc3c2-e7e4-4f1f-9eb9-110b9d3006dd.png","projectCoverImageUrl":"https://storage.googleapis.com/op-atlas/11b27f90-aab4-4013-b554-1375533a88c5.png","category":"Utility","osoSlug":"","socialLinks":{"website":["https://optimism-java.github.io/op-besu-docs"],"farcaster":[],"twitter":"https://x.com/optimism_java","mirror":null},"team":["193400"],"github":["https://github.com/optimism-java/op-besu"],"packages":[],"contracts":[],"grantsAndFunding":{"ventureFunding":[],"grants":[{"grant":"token-house-mission","link":"https://app.charmverse.io/op-grants/op-besu-an-op-stack-execution-client-based-on-hyperledger-besu-2818630304747294","amount":"50000","date":"2024-05-09","details":""}],"revenue":[]},"pricingModel":"free","pricingModelDetails":"","links":[]}] \ No newline at end of file diff --git a/lib/save-file/save-file.ts b/lib/save-file/save-file.ts index d648167..74cbb50 100644 --- a/lib/save-file/save-file.ts +++ b/lib/save-file/save-file.ts @@ -16,7 +16,6 @@ export async function Savefile(data: any, requiredPath: string[] = [], fileName: throw new Error("Failed to create directory. Check permissions and path."); } } - const filePath = path.join(folderName, fileName); // Use fs.writeFileSync for more robust file writing diff --git a/src/controller/trigger-module.ts b/src/controller/trigger-module.ts index 25b9718..539bb90 100644 --- a/src/controller/trigger-module.ts +++ b/src/controller/trigger-module.ts @@ -2,7 +2,6 @@ import { FastifyReply, FastifyRequest } from "fastify"; import { importedModules } from ".."; - export async function TriggerModule(request: FastifyRequest<{ Params: { scriptName: string } }>, reply: FastifyReply) { const { scriptName } = request.params; @@ -20,7 +19,6 @@ export async function TriggerModule(request: FastifyRequest<{ Params: { scriptNa }); } - if (importedModules[scriptName] && typeof importedModules[scriptName].Run === 'function') { try { await importedModules[scriptName].Run(); diff --git a/src/index.ts b/src/index.ts index c788255..a7178ea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,7 +24,7 @@ const scriptsDir = path.resolve(__dirname, 'scripts'); const fileNameAndApiPath: { [key: string]: string } = {} // cronJobsToSchedule use to store the cron jobs that need to be scheduled -const cronJobsToSchedule: { CRON_TIMER: string; run: () => void; dataDir: string }[] = []; +const cronJobsToSchedule: { CRON_TIMER: string; Run: any; DATA_DIR: string }[] = []; // Store imported modules // the key is the file name and the value is the module (function to run) @@ -74,12 +74,13 @@ async function processScripts() { // console.log("here is cron timer only file",module.DATA_DIR, " ", module.CRON_TIMER, module) // if there is a cron timer, schedule the cron job + // console.log(module) if (typeof(module.CRON_TIMER) === "string" && module.CRON_TIMER.trim() !== "") { console.log(`Scheduling cron job for ${file} with timer: ${module.CRON_TIMER}`); cronJobsToSchedule.push({ CRON_TIMER: module.CRON_TIMER, - run: module.Run, - dataDir: dataDir, + Run: module.Run, + DATA_DIR: dataDir, }); } else { console.log(`No valid cron timer for ${file}, skipping cron job scheduling.`); @@ -112,7 +113,6 @@ async function startServer() { await processScripts(); - fastify.get('/api/modules', async (request: FastifyRequest, reply: FastifyReply) => { reply.status(200).send({ msg: "ok", @@ -120,7 +120,7 @@ async function startServer() { }); }); - fastify.post<{ Params: { scriptName: string } }>('/api/modules/run/:scriptName', TriggerModule); + fastify.post<{ Params: { scriptName: string } }>('/backoffice/modules/run/:scriptName', TriggerModule); fastify.get<{ Params: { '*': string } }>('/api/*', GetStaticData); diff --git a/src/scripts/retropgf5-live-data/retropgf5-live-data.ts b/src/scripts/retropgf5-live-data/retropgf5-live-data.ts index 2d5551b..fdb373d 100644 --- a/src/scripts/retropgf5-live-data/retropgf5-live-data.ts +++ b/src/scripts/retropgf5-live-data/retropgf5-live-data.ts @@ -2,6 +2,7 @@ import { ApolloClient, gql, HttpLink, InMemoryCache } from "@apollo/client/core" import fetch from "cross-fetch"; import axios from "axios"; import { Savefile } from "../../../lib/save-file/save-file"; + const httpLink = new HttpLink({ uri: "https://optimism.easscan.org/graphql", fetch: fetch, @@ -9,7 +10,17 @@ const httpLink = new HttpLink({ const client = new ApolloClient({ link: httpLink, - cache: new InMemoryCache(), + cache: new InMemoryCache({ + resultCaching: false, + }), + defaultOptions: { + query: { + fetchPolicy: 'no-cache', + }, + watchQuery: { + fetchPolicy: 'no-cache', + }, + }, }) async function fetchMetadataSnapshot() { @@ -105,6 +116,7 @@ export async function fetchAndProcessData() { const DATA_DIR = [ 'data', 'retropgf5-live-data'] // Which evaluates to 'At 0 seconds, 0 minutes every 1st hour'. +// const CRON_TIMER:string | undefined = "*/5 * * * *" const CRON_TIMER:string | undefined = "0 0 */1 * * *" // const CRON_TIMER:string | undefined = undefined @@ -117,6 +129,7 @@ async function Run() { const dataArray = await fetchAndProcessData(); // const dataArray: any[] = [] await Savefile(JSON.stringify(dataArray), DATA_DIR, fileName) + // console.log("save retropgf5 \n", dataArray) } catch (error) { console.error("An error occurred during the RetroPGF5 Live Data process:", error); diff --git a/utils/utils.ts b/utils/utils.ts index f0b5d88..1f361dc 100644 --- a/utils/utils.ts +++ b/utils/utils.ts @@ -44,11 +44,17 @@ export function headerGithub() : (RawAxiosRequestHeaders) | AxiosHeaders| null // scheduleCronJobs use to schedule the cron jobs -export function scheduleCronJobs(cronJobsToSchedule: { CRON_TIMER: string; run: () => void; dataDir: string }[]) { - cronJobsToSchedule.forEach(job => { - console.log(`Scheduling cron job for ${job.dataDir} ${job.CRON_TIMER}`); - cron.schedule(job.CRON_TIMER, job.run, { - timezone: "America/Los_Angeles", +export function scheduleCronJobs(cronJobsToSchedule: { CRON_TIMER: string; Run: any; DATA_DIR: string }[]) { + try { + cronJobsToSchedule.forEach(job => { + console.log(`Scheduling cron job for ${job.DATA_DIR} ${job.CRON_TIMER}`); + cron.schedule(job.CRON_TIMER, () => { + job.Run() + }, { + timezone: "America/Los_Angeles", + }); }); - }); + } catch (error) { + console.log("error when schedule the cron job", error) + } } \ No newline at end of file From 1cc06c9c81253549398e6afbfbf543e044d985bf Mon Sep 17 00:00:00 2001 From: tgrziminiar Date: Tue, 27 Aug 2024 22:25:50 +0700 Subject: [PATCH 15/15] uncomment build.yaml --- .github/workflows/build.yaml | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0fee036..310947d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,34 +1,34 @@ # For more details, read this: https://coolify.io/docs/github-actions -# name: Build Static Image -# on: -# push: -# branches: ["main"] -# env: -# REGISTRY: ghcr.io -# IMAGE_NAME: "tgrziminiar/worker" +name: Build Static Image +on: + push: + branches: ["main"] +env: + REGISTRY: ghcr.io + IMAGE_NAME: "tgrziminiar/worker" -# jobs: -# aarch64: -# runs-on: ubuntu-latest -# permissions: -# contents: read -# packages: write -# steps: -# - uses: actions/checkout@v3 -# - name: Login to ghcr.io -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.REGISTRY }} -# username: ${{ github.actor }} -# password: ${{ secrets.TOKEN }} -# - name: Build image and push to registry -# uses: docker/build-push-action@v4 -# with: -# context: . -# file: Dockerfile -# platforms: linux/amd64 -# push: true -# tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest -# - name: Deploy to Coolify -# run: | -# curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}' \ No newline at end of file +jobs: + aarch64: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + - name: Login to ghcr.io + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.TOKEN }} + - name: Build image and push to registry + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile + platforms: linux/aarch64 + push: true + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + - name: Deploy to Coolify + run: | + curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}' \ No newline at end of file