From f4fe63a618829ea81c1a03ee1ddc16a98400897b Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:13:21 +0200 Subject: [PATCH 01/14] Update .gitignore files --- .gitignore | 7 +++---- app/backend/.gitignore | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 app/backend/.gitignore diff --git a/.gitignore b/.gitignore index 2024e11..1e48749 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,7 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies -/node_modules -*/node_modules/* +**/node_modules/* /.pnp .pnp.js @@ -29,7 +28,7 @@ yarn-error.log* # local env files .env*.local -app/backend/.env +.env # vercel .vercel @@ -37,7 +36,7 @@ app/backend/.env # typescript *.tsbuildinfo next-env.d.ts -/app/frontend/node_modules/ /.idea/ +/.vscode/ test.ts diff --git a/app/backend/.gitignore b/app/backend/.gitignore new file mode 100644 index 0000000..770ad53 --- /dev/null +++ b/app/backend/.gitignore @@ -0,0 +1,4 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# build files +/dist/* \ No newline at end of file From 991bb6b6d38326d78cf88169adb45125dc09cd84 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:14:29 +0200 Subject: [PATCH 02/14] Fix broken imports after npm build --- app/backend/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/backend/package.json b/app/backend/package.json index 066ae67..9608bc5 100644 --- a/app/backend/package.json +++ b/app/backend/package.json @@ -5,7 +5,7 @@ "scripts": { "start": "node src/index.ts", "dev": "nodemon src/index.ts", - "build": "tsc", + "build": "tsc && tsc-alias", "test": "mocha --timeout 10000", "lint:check": "eslint . --quiet", "lint:fix": "eslint . --fix", @@ -40,6 +40,7 @@ "nodemon": "^3.0.1", "prettier": "^3.2.4", "ts-node": "^10.9.2", + "tsc-alias": "^1.8.8", "tsconfig-paths": "^4.2.0" } } From 175c8aa5723d877e29e0b70b3a2dedbf644d1766 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:15:14 +0200 Subject: [PATCH 03/14] Fix missing contract ABIs after nom build --- app/backend/src/core/clients/ethereum/contracts/abis/index.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 app/backend/src/core/clients/ethereum/contracts/abis/index.ts diff --git a/app/backend/src/core/clients/ethereum/contracts/abis/index.ts b/app/backend/src/core/clients/ethereum/contracts/abis/index.ts new file mode 100644 index 0000000..15767b6 --- /dev/null +++ b/app/backend/src/core/clients/ethereum/contracts/abis/index.ts @@ -0,0 +1,4 @@ +// TODO: find a way for TS to copy all json files during build without import each one individually +import {} from "./L2OutputOracle.json"; +import {} from "./PolygonZkEVMProxy.json"; +import {} from "./StarknetCoreContract.json"; From 4674d72c0ae6c25374dce7f82ef63a989415b1ae Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:16:01 +0200 Subject: [PATCH 04/14] BREAKING: Skip file extensions in knex migrations --- app/backend/src/database/Database.ts | 6 +++- .../src/database/MigrationsResolver.ts | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 app/backend/src/database/MigrationsResolver.ts diff --git a/app/backend/src/database/Database.ts b/app/backend/src/database/Database.ts index 886f8f7..76114ba 100644 --- a/app/backend/src/database/Database.ts +++ b/app/backend/src/database/Database.ts @@ -2,6 +2,7 @@ import KnexConstructor, { Knex } from "knex"; import path from "path"; import Logger from "@/tools/Logger"; import { DatabaseConfig } from "@/config/Config"; +import { MigrationsResolver } from "@/database/MigrationsResolver"; export class Database { private readonly knex: Knex; @@ -16,7 +17,10 @@ export class Database { client: config.client, connection: config.connection, migrations: { - directory: path.join(__dirname, "migrations"), + disableMigrationsListValidation: true, + migrationSource: new MigrationsResolver( + path.join(__dirname, "migrations"), + ), }, pool: config.connectionPoolSize, }); diff --git a/app/backend/src/database/MigrationsResolver.ts b/app/backend/src/database/MigrationsResolver.ts new file mode 100644 index 0000000..09a1b69 --- /dev/null +++ b/app/backend/src/database/MigrationsResolver.ts @@ -0,0 +1,33 @@ +import type { Knex } from "knex"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-expect-error +import { FsMigrations } from "knex/lib/migrations/migrate/sources/fs-migrations.js"; + +type Migration = Knex.Migration; +type MigrationSource = Knex.MigrationSource; + +export class MigrationsResolver + extends FsMigrations + implements MigrationSource +{ + constructor(migrationDirectory: string) { + const sortDirsSeparately = false; + super([migrationDirectory], sortDirsSeparately, []); + } + + getMigrationName(migration: object): string { + const name = super.getMigrationName(migration) as string; + return name.replace(new RegExp(`.(ts|js)$`), ""); + } + + async getMigrations(loadExtensions: readonly string[]): Promise { + // We need to set the extension to empty string, otherwise the call to super.getMigrations() fails. + loadExtensions = [""]; + + return super.getMigrations(loadExtensions) as Promise; + } + + async getMigration(migration: object): Promise { + return super.getMigration(migration) as Promise; + } +} From e4955adce7c63ea57ee13d23fa79ac3b67297376 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:16:20 +0200 Subject: [PATCH 05/14] Update package files --- app/backend/package-lock.json | 189 +++++++++++++++++++++++++++++++++- app/backend/package.json | 1 - package-lock.json | 72 +++++++++++-- 3 files changed, 249 insertions(+), 13 deletions(-) diff --git a/app/backend/package-lock.json b/app/backend/package-lock.json index b7e0cab..f23d842 100644 --- a/app/backend/package-lock.json +++ b/app/backend/package-lock.json @@ -9,6 +9,8 @@ "version": "0.0.1", "license": "MIT", "dependencies": { + "axios": "^1.6.7", + "axios-rate-limit": "^1.3.0", "dotenv": "^16.4.1", "ethers": "^6.10.0", "express": "^4.18.2", @@ -30,7 +32,9 @@ "mocha": "^10.2.0", "nodemon": "^3.0.1", "prettier": "^3.2.4", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "tsc-alias": "^1.8.8", + "tsconfig-paths": "^4.2.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -774,6 +778,29 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-rate-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/axios-rate-limit/-/axios-rate-limit-1.3.0.tgz", + "integrity": "sha512-cKR5wTbU/CeeyF1xVl5hl6FlYsmzDVqxlN4rGtfO5x7J83UxKDckudsW0yW21/ZJRcO0Qrfm3fUFbhEbWTLayw==", + "peerDependencies": { + "axios": "*" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1031,6 +1058,26 @@ "text-hex": "1.0.x" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1136,6 +1183,14 @@ "node": ">= 0.4" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1672,6 +1727,38 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2139,6 +2226,18 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2393,6 +2492,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -2512,6 +2620,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mylas": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } + }, "node_modules/nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", @@ -2860,6 +2981,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dev": true, + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -2931,6 +3064,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -2960,6 +3098,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3387,6 +3534,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3553,6 +3709,37 @@ "node": ">=0.3.1" } }, + "node_modules/tsc-alias": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.8.tgz", + "integrity": "sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", diff --git a/app/backend/package.json b/app/backend/package.json index 9608bc5..e7ee5d0 100644 --- a/app/backend/package.json +++ b/app/backend/package.json @@ -26,7 +26,6 @@ "zod": "^3.22.4" }, "devDependencies": { - "@types/axios": "^0.14.0", "@types/express": "^4.17.21", "@types/mocha": "^10.0.6", "@types/node": "^20.11.8", diff --git a/package-lock.json b/package-lock.json index 96712be..e3caf2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,6 @@ "zod": "^3.22.4" }, "devDependencies": { - "@types/axios": "^0.14.0", "@types/express": "^4.17.21", "@types/mocha": "^10.0.6", "@types/node": "^20.11.8", @@ -47,6 +46,7 @@ "nodemon": "^3.0.1", "prettier": "^3.2.4", "ts-node": "^10.9.2", + "tsc-alias": "^1.8.8", "tsconfig-paths": "^4.2.0" } }, @@ -4473,16 +4473,6 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@types/axios": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", - "integrity": "sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ==", - "deprecated": "This is a stub types definition for axios (https://github.com/mzabriskie/axios). axios provides its own type definitions, so you don't need @types/axios installed!", - "dev": true, - "dependencies": { - "axios": "*" - } - }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -10493,6 +10483,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mylas": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -11411,6 +11414,18 @@ "node": ">=4" } }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dev": true, + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/postcss": { "version": "8.4.33", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", @@ -11799,6 +11814,15 @@ "inherits": "~2.0.3" } }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -13762,6 +13786,32 @@ "node": ">=0.3.1" } }, + "node_modules/tsc-alias": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.8.tgz", + "integrity": "sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + } + }, + "node_modules/tsc-alias/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", From 1751bc10995df8a5de8f3895cb81207ee78db187 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:16:38 +0200 Subject: [PATCH 06/14] Add "backend:start" root script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1efb5d4..38578bc 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ ] }, "scripts": { - "backend:start": "" + "backend:start": "(cd app/backend && npm run build && node dist/index.js)" }, "keywords": [], "license": "MIT", From d765e36909d7ec96de38c0580fb4e13c37e22967 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sat, 24 Feb 2024 12:17:46 +0200 Subject: [PATCH 07/14] [WIP] Add docker files --- app/backend/.dockerignore | 2 ++ app/backend/Dockerfile | 14 ++++++++++++++ app/backend/src/config/index.ts | 2 ++ docker-compose.yml | 10 ++++++++++ 4 files changed, 28 insertions(+) create mode 100644 app/backend/.dockerignore create mode 100644 app/backend/Dockerfile create mode 100644 docker-compose.yml diff --git a/app/backend/.dockerignore b/app/backend/.dockerignore new file mode 100644 index 0000000..a0270fb --- /dev/null +++ b/app/backend/.dockerignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/app/backend/Dockerfile b/app/backend/Dockerfile new file mode 100644 index 0000000..b2257bf --- /dev/null +++ b/app/backend/Dockerfile @@ -0,0 +1,14 @@ +FROM node:20.11.1 +RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app +WORKDIR /home/node/app +USER node + +COPY --chown=node:node package.json ./ +RUN npm install + +COPY --chown=node:node tsconfig.json ./ +COPY --chown=node:node src ./src +RUN npm run build + +EXPOSE 8080 +CMD [ "node", "./dist/index.js" ] \ No newline at end of file diff --git a/app/backend/src/config/index.ts b/app/backend/src/config/index.ts index 18c05fa..3cac53c 100644 --- a/app/backend/src/config/index.ts +++ b/app/backend/src/config/index.ts @@ -15,6 +15,8 @@ export function getConfig(): Config { return getTestConfig(env); case "local": return getLocalConfig(env); + case "dev": + return getLocalConfig(env); } throw new TypeError(`Unrecognized env: ${deploymentEnv}!`); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..974d177 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3' +services: + backend: + build: + context: app/backend + container_name: backend + env_file: app/backend/.env.dev + expose: + - 80 + restart: always \ No newline at end of file From f8cc46d9073f95ddd7bafaa69f742f77b12aac46 Mon Sep 17 00:00:00 2001 From: samtin0x <40127309+samtin0x@users.noreply.github.com> Date: Tue, 13 Feb 2024 23:13:44 +0100 Subject: [PATCH 08/14] Fix ethers rpc provider to reduce eth_chainId usage --- app/backend/src/core/clients/ethereum/EthereumClient.ts | 9 +++++++-- app/backend/src/core/clients/optimism/OptimismClient.ts | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/backend/src/core/clients/ethereum/EthereumClient.ts b/app/backend/src/core/clients/ethereum/EthereumClient.ts index 884c5d6..01e3e3d 100644 --- a/app/backend/src/core/clients/ethereum/EthereumClient.ts +++ b/app/backend/src/core/clients/ethereum/EthereumClient.ts @@ -1,4 +1,4 @@ -import { ethers } from "ethers"; +import { ethers, Network } from "ethers"; import contracts from "./contracts/contracts.json"; import { Config } from "@/config"; import Logger from "@/tools/Logger"; @@ -6,12 +6,17 @@ import { ContractName } from "@/core/clients/ethereum/contracts/types"; class EthereumClient { private provider: ethers.JsonRpcProvider; + private network: Network; private logger: Logger; constructor(config: Config, logger: Logger) { + this.network = Network.from( + ethers.Network.from(config.ethereumMonitorModule.chainId), + ); this.provider = new ethers.JsonRpcProvider( config.indexers.ethereumRpcEndpoint, - ethers.Network.from(config.ethereumMonitorModule.chainId), + this.network, + { staticNetwork: this.network }, ); this.logger = logger; } diff --git a/app/backend/src/core/clients/optimism/OptimismClient.ts b/app/backend/src/core/clients/optimism/OptimismClient.ts index 6e54f1e..4e56415 100644 --- a/app/backend/src/core/clients/optimism/OptimismClient.ts +++ b/app/backend/src/core/clients/optimism/OptimismClient.ts @@ -1,16 +1,21 @@ -import { ethers } from "ethers"; +import { ethers, Network } from "ethers"; import { Config } from "@/config"; import Logger from "@/tools/Logger"; import { OptimismSyncStatus } from "./types"; class OptimismClient { private provider: ethers.JsonRpcProvider; + private network: Network; private logger: Logger; constructor(config: Config, logger: Logger) { + this.network = Network.from( + ethers.Network.from(config.optimismModule.chainId), + ); this.provider = new ethers.JsonRpcProvider( config.indexers.optimismRpcEndpoint, - ethers.Network.from(config.optimismModule.chainId), + this.network, + { staticNetwork: this.network }, ); this.logger = logger; } From 6c249469e71f3f01fe5dc4a8126cc9925af635b2 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sun, 25 Feb 2024 18:09:22 +0200 Subject: [PATCH 09/14] Add deploy action --- .github/workflows/backend-deploy.yaml | 31 +++++++++++++++++++++++++++ app/backend/.env.dev | 24 +++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 .github/workflows/backend-deploy.yaml create mode 100644 app/backend/.env.dev diff --git a/.github/workflows/backend-deploy.yaml b/.github/workflows/backend-deploy.yaml new file mode 100644 index 0000000..918102f --- /dev/null +++ b/.github/workflows/backend-deploy.yaml @@ -0,0 +1,31 @@ +name: Backend deploy + +on: + push: + branches: + - feature/ci + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Install SSH key + uses: shimataro/ssh-key-action@v2 + with: + key: ${{ secrets.SSH_KEY }} + known_hosts: ${{ secrets.SSH_KNOWN_HOSTS }} + + - name: Copy input secrets to environment variables + uses: oNaiPs/secrets-to-env-action@ec46a22bfc9b37e014b627b3208b07eb8909ea0f + with: + secrets: ${{ toJSON(secrets) }} + include: INPUT_* + convert_prefix: false + + - name: Deploy & run docker + run: docker compose up -d + env: + DOCKER_HOST: ${{ format('ssh://{0}@{1}', secrets.SSH_USERNAME, secrets.SSH_HOST) }} \ No newline at end of file diff --git a/app/backend/.env.dev b/app/backend/.env.dev new file mode 100644 index 0000000..111a0a7 --- /dev/null +++ b/app/backend/.env.dev @@ -0,0 +1,24 @@ +DEPLOYMENT_ENV=dev +API_PORT=8080 + +DB_URI=${INPUT_DB_URI} +DB_FRESH_START=false +PGSSLMODE=no-verify + +PRICING_MODULE_ENABLED=false +PRICING_COINCAP_BASE_URL=https://api.coincap.io/v2 +PRICING_COINCAP_API_KEY=${INPUT_COINCAP_APIKEY} +PRICING_MINUTE_RATE_LIMIT=500 + +ETHEREUM_RPC_ENDPOINT=${INPUT_ETHEREUM_ENDPOINT} +OPTIMISM_RPC_ENDPOINT=${INPUT_OPTIMISM_ENDPOINT} + +ETHEREUM_MONITOR_MODULE_ENABLED=true +ETHEREUM_MONITOR_POLL_INTERVAL_MS=10000 +ETHEREUM_MONITOR_START_BLOCK=19119000 +ETHEREUM_MONITOR_MAX_LOG_RANGE=5000 + +OPTIMISM_MODULE_ENABLED=true +OPTIMISM_START_BLOCK=115952816 +OPTIMISM_MAX_BLOCK_RANGE=50 +OPTIMISM_POLL_INTERVAL_MS=15000 From 6fd9a65e8447c5fe408261125dd8dcf75c8a9305 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sun, 25 Feb 2024 22:28:45 +0200 Subject: [PATCH 10/14] Allow manual job run --- .github/workflows/backend-deploy.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/backend-deploy.yaml b/.github/workflows/backend-deploy.yaml index 918102f..585b7ee 100644 --- a/.github/workflows/backend-deploy.yaml +++ b/.github/workflows/backend-deploy.yaml @@ -1,9 +1,10 @@ name: Backend deploy on: + workflow_dispatch: push: branches: - - feature/ci + - feature/ci # used for testing, TODO: remove after merge to master jobs: deploy: From 77d6f7fa9bee6d4d2453f47733a51bef331754dd Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Sun, 25 Feb 2024 22:29:31 +0200 Subject: [PATCH 11/14] Fail on missing variable --- app/backend/.env.dev | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/backend/.env.dev b/app/backend/.env.dev index 111a0a7..65ab159 100644 --- a/app/backend/.env.dev +++ b/app/backend/.env.dev @@ -1,17 +1,17 @@ DEPLOYMENT_ENV=dev API_PORT=8080 -DB_URI=${INPUT_DB_URI} +DB_URI=${INPUT_DB_URI?error} DB_FRESH_START=false PGSSLMODE=no-verify PRICING_MODULE_ENABLED=false PRICING_COINCAP_BASE_URL=https://api.coincap.io/v2 -PRICING_COINCAP_API_KEY=${INPUT_COINCAP_APIKEY} +PRICING_COINCAP_API_KEY=${INPUT_COINCAP_APIKEY?error} PRICING_MINUTE_RATE_LIMIT=500 -ETHEREUM_RPC_ENDPOINT=${INPUT_ETHEREUM_ENDPOINT} -OPTIMISM_RPC_ENDPOINT=${INPUT_OPTIMISM_ENDPOINT} +ETHEREUM_RPC_ENDPOINT=${INPUT_ETHEREUM_ENDPOINT?error} +OPTIMISM_RPC_ENDPOINT=${INPUT_OPTIMISM_ENDPOINT?error} ETHEREUM_MONITOR_MODULE_ENABLED=true ETHEREUM_MONITOR_POLL_INTERVAL_MS=10000 From 157c8502b5b563d0873906dcf591bd2610338f8e Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Mon, 26 Feb 2024 08:38:05 +0200 Subject: [PATCH 12/14] Run install, lint, and tests before deploy --- .github/workflows/{backend-ci.yaml => backend-check.yaml} | 3 ++- .github/workflows/backend-deploy.yaml | 4 ++++ .github/workflows/{frontend-ci.yaml => frontend-check.yaml} | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) rename .github/workflows/{backend-ci.yaml => backend-check.yaml} (97%) rename .github/workflows/{frontend-ci.yaml => frontend-check.yaml} (96%) diff --git a/.github/workflows/backend-ci.yaml b/.github/workflows/backend-check.yaml similarity index 97% rename from .github/workflows/backend-ci.yaml rename to .github/workflows/backend-check.yaml index a99e76c..b4abc6d 100644 --- a/.github/workflows/backend-ci.yaml +++ b/.github/workflows/backend-check.yaml @@ -1,6 +1,7 @@ -name: Backend CI +name: Backend checks on: + workflow_call: pull_request: paths: - 'app/backend/**' diff --git a/.github/workflows/backend-deploy.yaml b/.github/workflows/backend-deploy.yaml index 585b7ee..c1294d1 100644 --- a/.github/workflows/backend-deploy.yaml +++ b/.github/workflows/backend-deploy.yaml @@ -7,7 +7,11 @@ on: - feature/ci # used for testing, TODO: remove after merge to master jobs: + backend-check: + uses: ./.github/workflows/backend-check.yaml + deploy: + needs: backend-check runs-on: ubuntu-latest steps: - name: Check out code diff --git a/.github/workflows/frontend-ci.yaml b/.github/workflows/frontend-check.yaml similarity index 96% rename from .github/workflows/frontend-ci.yaml rename to .github/workflows/frontend-check.yaml index e14e3de..63581f1 100644 --- a/.github/workflows/frontend-ci.yaml +++ b/.github/workflows/frontend-check.yaml @@ -1,6 +1,7 @@ -name: Frontend CI +name: Frontend checks on: + workflow_call: pull_request: paths: - 'app/frontend/**' From 9a006af458a467ff7f506d168c13f6e1d1206dbd Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Mon, 26 Feb 2024 08:51:53 +0200 Subject: [PATCH 13/14] Remove temporary automatic run from the branch --- .github/workflows/backend-deploy.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/backend-deploy.yaml b/.github/workflows/backend-deploy.yaml index c1294d1..2011ac4 100644 --- a/.github/workflows/backend-deploy.yaml +++ b/.github/workflows/backend-deploy.yaml @@ -2,9 +2,6 @@ name: Backend deploy on: workflow_dispatch: - push: - branches: - - feature/ci # used for testing, TODO: remove after merge to master jobs: backend-check: From 0de9a7e3ca497a5096cc43a52d595739dbe14882 Mon Sep 17 00:00:00 2001 From: Alex Bespalov Date: Mon, 26 Feb 2024 11:21:32 +0200 Subject: [PATCH 14/14] Expose on port 80 --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 974d177..375aa1a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,6 @@ services: context: app/backend container_name: backend env_file: app/backend/.env.dev - expose: - - 80 + ports: + - '80:8080' restart: always \ No newline at end of file