From 86ce5982a5cfae875d0cedc7adf6b4a24399f3ac Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Thu, 30 Jan 2025 14:29:06 -0300 Subject: [PATCH 01/14] Add bun project --- packages/oidc-key-registry-server/.gitignore | 175 ++++++++++++++++++ packages/oidc-key-registry-server/README.md | 15 ++ packages/oidc-key-registry-server/bun.lock | 27 +++ packages/oidc-key-registry-server/index.ts | 6 + .../oidc-key-registry-server/package.json | 11 ++ .../oidc-key-registry-server/tsconfig.json | 27 +++ 6 files changed, 261 insertions(+) create mode 100644 packages/oidc-key-registry-server/.gitignore create mode 100644 packages/oidc-key-registry-server/README.md create mode 100644 packages/oidc-key-registry-server/bun.lock create mode 100644 packages/oidc-key-registry-server/index.ts create mode 100644 packages/oidc-key-registry-server/package.json create mode 100644 packages/oidc-key-registry-server/tsconfig.json diff --git a/packages/oidc-key-registry-server/.gitignore b/packages/oidc-key-registry-server/.gitignore new file mode 100644 index 00000000..9b1ee42e --- /dev/null +++ b/packages/oidc-key-registry-server/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/oidc-key-registry-server/README.md b/packages/oidc-key-registry-server/README.md new file mode 100644 index 00000000..d721f4ba --- /dev/null +++ b/packages/oidc-key-registry-server/README.md @@ -0,0 +1,15 @@ +# oidc-key-registry-server + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.2.0. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/packages/oidc-key-registry-server/bun.lock b/packages/oidc-key-registry-server/bun.lock new file mode 100644 index 00000000..42a4c496 --- /dev/null +++ b/packages/oidc-key-registry-server/bun.lock @@ -0,0 +1,27 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "oidc-key-registry-server", + "devDependencies": { + "@types/bun": "latest", + }, + "peerDependencies": { + "typescript": "^5.0.0", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.2.1", "", { "dependencies": { "bun-types": "1.2.1" } }, "sha512-iiCeMAKMkft8EPQJxSbpVRD0DKqrh91w40zunNajce3nMNNFd/LnAquVisSZC+UpTMjDwtcdyzbWct08IvEqRA=="], + + "@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], + + "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="], + + "bun-types": ["bun-types@1.2.1", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-p7bmXUWmrPWxhcbFVk7oUXM5jAGt94URaoa3qf4mz43MEhNAo/ot1urzBqctgvuq7y9YxkuN51u+/qm4BiIsHw=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + } +} diff --git a/packages/oidc-key-registry-server/index.ts b/packages/oidc-key-registry-server/index.ts new file mode 100644 index 00000000..1ad4a84f --- /dev/null +++ b/packages/oidc-key-registry-server/index.ts @@ -0,0 +1,6 @@ +const task = () => { + console.log('Hello World'); + setTimeout(task, 1000); +} + +task(); \ No newline at end of file diff --git a/packages/oidc-key-registry-server/package.json b/packages/oidc-key-registry-server/package.json new file mode 100644 index 00000000..a6e7a6f2 --- /dev/null +++ b/packages/oidc-key-registry-server/package.json @@ -0,0 +1,11 @@ +{ + "name": "oidc-key-registry-server", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} \ No newline at end of file diff --git a/packages/oidc-key-registry-server/tsconfig.json b/packages/oidc-key-registry-server/tsconfig.json new file mode 100644 index 00000000..238655f2 --- /dev/null +++ b/packages/oidc-key-registry-server/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} From be16d400c0cc5f21af5dc53f73514c64dc468696 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Fri, 31 Jan 2025 12:21:56 -0300 Subject: [PATCH 02/14] Add fetchKeys --- packages/oidc-key-registry-server/index.ts | 47 ++++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/oidc-key-registry-server/index.ts b/packages/oidc-key-registry-server/index.ts index 1ad4a84f..73d0e75d 100644 --- a/packages/oidc-key-registry-server/index.ts +++ b/packages/oidc-key-registry-server/index.ts @@ -1,6 +1,45 @@ -const task = () => { - console.log('Hello World'); - setTimeout(task, 1000); +const fetchKeys = async (): Promise> => { + const response = await fetch("https://www.googleapis.com/oauth2/v3/certs"); + if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`); + + const data: GoogleResponse = await response.json(); + return data.keys.map(key => ({ + kid: toBytes32(key.kid), + n: toBytes(key.n), + e: toBytes(key.e) + })); +} + +interface Key { + kid: string; // Key ID (as bytes32) + n: string; // RSA modulus (as bytes) + e: string; // RSA exponent (as bytes) +} + +const toBytes32 = (str: string): string => { + return `0x${str.padStart(64, '0')}`; +} + +const toBytes = (str: string): string => { + return `0x${Buffer.from(str, 'base64url').toString('hex')}`; +} + +interface GoogleResponse { + keys: Array +} + +interface KeyResponse { + "kid": string; + "n": string; + "e": string; +} + +const main = async () => { + const keys = await fetchKeys(); + + console.log(keys); + + setTimeout(main, 1000); } -task(); \ No newline at end of file +main(); \ No newline at end of file From a38037576bf4e4bdb72fdd0e0866e710dfb15884 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 08:15:28 -0300 Subject: [PATCH 03/14] Refactor keyFetcher --- .../fetchers/google.ts | 25 ++++++++++ packages/oidc-key-registry-server/index.ts | 49 ++++--------------- packages/oidc-key-registry-server/types.ts | 9 ++++ 3 files changed, 44 insertions(+), 39 deletions(-) create mode 100644 packages/oidc-key-registry-server/fetchers/google.ts create mode 100644 packages/oidc-key-registry-server/types.ts diff --git a/packages/oidc-key-registry-server/fetchers/google.ts b/packages/oidc-key-registry-server/fetchers/google.ts new file mode 100644 index 00000000..28b23ba0 --- /dev/null +++ b/packages/oidc-key-registry-server/fetchers/google.ts @@ -0,0 +1,25 @@ +import type { Key, KeyFetcher } from "../types"; + +export class GoogleFetcher implements KeyFetcher { + private apiUrl = "https://www.googleapis.com/oauth2/v3/certs"; + + async fetchKeys(): Promise { + const response = await fetch(this.apiUrl); + if (!response.ok) throw new Error(`Google API error: ${response.status}`); + + const data = await response.json(); + return data.keys.map((key: any) => ({ + kid: this.toBytes32(key.kid), + n: this.toBytes(key.n), + e: this.toBytes(key.e), + })); + } + + toBytes32(str: string): string { + return `0x${str.padStart(64, '0')}`; + } + + toBytes(str: string): string { + return `0x${Buffer.from(str, 'base64url').toString('hex')}`; + } +} \ No newline at end of file diff --git a/packages/oidc-key-registry-server/index.ts b/packages/oidc-key-registry-server/index.ts index 73d0e75d..bf20d723 100644 --- a/packages/oidc-key-registry-server/index.ts +++ b/packages/oidc-key-registry-server/index.ts @@ -1,45 +1,16 @@ -const fetchKeys = async (): Promise> => { - const response = await fetch("https://www.googleapis.com/oauth2/v3/certs"); - if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`); - - const data: GoogleResponse = await response.json(); - return data.keys.map(key => ({ - kid: toBytes32(key.kid), - n: toBytes(key.n), - e: toBytes(key.e) - })); -} - -interface Key { - kid: string; // Key ID (as bytes32) - n: string; // RSA modulus (as bytes) - e: string; // RSA exponent (as bytes) -} - -const toBytes32 = (str: string): string => { - return `0x${str.padStart(64, '0')}`; -} - -const toBytes = (str: string): string => { - return `0x${Buffer.from(str, 'base64url').toString('hex')}`; -} - -interface GoogleResponse { - keys: Array -} - -interface KeyResponse { - "kid": string; - "n": string; - "e": string; -} +import { GoogleFetcher } from "./fetchers/google"; const main = async () => { - const keys = await fetchKeys(); + const fetcher = new GoogleFetcher(); - console.log(keys); + try { + const keys = await fetcher.fetchKeys(); + console.log("Fetched keys:", keys); + } catch (error) { + console.error("Error fetching keys:", error); + } - setTimeout(main, 1000); -} + setTimeout(main, 60 * 1000); +}; main(); \ No newline at end of file diff --git a/packages/oidc-key-registry-server/types.ts b/packages/oidc-key-registry-server/types.ts new file mode 100644 index 00000000..059b34f0 --- /dev/null +++ b/packages/oidc-key-registry-server/types.ts @@ -0,0 +1,9 @@ +export interface Key { + kid: string; // Key ID (as bytes32) + n: string; // RSA modulus (as bytes) + e: string; // RSA exponent (as bytes) +} + +export interface KeyFetcher { + fetchKeys(): Promise; +} From b92b9d41234101a88cd9be235cd3d720461e3656 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 08:20:16 -0300 Subject: [PATCH 04/14] Move files into src --- packages/oidc-key-registry-server/{ => src}/fetchers/google.ts | 0 packages/oidc-key-registry-server/{ => src}/index.ts | 0 packages/oidc-key-registry-server/{ => src}/types.ts | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename packages/oidc-key-registry-server/{ => src}/fetchers/google.ts (100%) rename packages/oidc-key-registry-server/{ => src}/index.ts (100%) rename packages/oidc-key-registry-server/{ => src}/types.ts (100%) diff --git a/packages/oidc-key-registry-server/fetchers/google.ts b/packages/oidc-key-registry-server/src/fetchers/google.ts similarity index 100% rename from packages/oidc-key-registry-server/fetchers/google.ts rename to packages/oidc-key-registry-server/src/fetchers/google.ts diff --git a/packages/oidc-key-registry-server/index.ts b/packages/oidc-key-registry-server/src/index.ts similarity index 100% rename from packages/oidc-key-registry-server/index.ts rename to packages/oidc-key-registry-server/src/index.ts diff --git a/packages/oidc-key-registry-server/types.ts b/packages/oidc-key-registry-server/src/types.ts similarity index 100% rename from packages/oidc-key-registry-server/types.ts rename to packages/oidc-key-registry-server/src/types.ts From 5eb95074f657456eb3fd223a4131e3474cc93918 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 08:24:42 -0300 Subject: [PATCH 05/14] Add config file --- packages/oidc-key-registry-server/.env.example | 1 + packages/oidc-key-registry-server/bun.lock | 5 +++++ packages/oidc-key-registry-server/package.json | 3 +++ packages/oidc-key-registry-server/src/config.ts | 5 +++++ packages/oidc-key-registry-server/src/index.ts | 3 ++- 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 packages/oidc-key-registry-server/.env.example create mode 100644 packages/oidc-key-registry-server/src/config.ts diff --git a/packages/oidc-key-registry-server/.env.example b/packages/oidc-key-registry-server/.env.example new file mode 100644 index 00000000..e72af05f --- /dev/null +++ b/packages/oidc-key-registry-server/.env.example @@ -0,0 +1 @@ +FETCH_INTERVAL=60000 diff --git a/packages/oidc-key-registry-server/bun.lock b/packages/oidc-key-registry-server/bun.lock index 42a4c496..cf718624 100644 --- a/packages/oidc-key-registry-server/bun.lock +++ b/packages/oidc-key-registry-server/bun.lock @@ -3,6 +3,9 @@ "workspaces": { "": { "name": "oidc-key-registry-server", + "dependencies": { + "dotenv": "^16.4.7", + }, "devDependencies": { "@types/bun": "latest", }, @@ -20,6 +23,8 @@ "bun-types": ["bun-types@1.2.1", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-p7bmXUWmrPWxhcbFVk7oUXM5jAGt94URaoa3qf4mz43MEhNAo/ot1urzBqctgvuq7y9YxkuN51u+/qm4BiIsHw=="], + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], diff --git a/packages/oidc-key-registry-server/package.json b/packages/oidc-key-registry-server/package.json index a6e7a6f2..72352d20 100644 --- a/packages/oidc-key-registry-server/package.json +++ b/packages/oidc-key-registry-server/package.json @@ -7,5 +7,8 @@ }, "peerDependencies": { "typescript": "^5.0.0" + }, + "dependencies": { + "dotenv": "^16.4.7" } } \ No newline at end of file diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts new file mode 100644 index 00000000..342be2de --- /dev/null +++ b/packages/oidc-key-registry-server/src/config.ts @@ -0,0 +1,5 @@ +import "dotenv/config"; + +export default { + FETCH_INTERVAL: parseInt(process.env.FETCH_INTERVAL || "60000"), +}; diff --git a/packages/oidc-key-registry-server/src/index.ts b/packages/oidc-key-registry-server/src/index.ts index bf20d723..5f255f1c 100644 --- a/packages/oidc-key-registry-server/src/index.ts +++ b/packages/oidc-key-registry-server/src/index.ts @@ -1,3 +1,4 @@ +import config from "./config"; import { GoogleFetcher } from "./fetchers/google"; const main = async () => { @@ -10,7 +11,7 @@ const main = async () => { console.error("Error fetching keys:", error); } - setTimeout(main, 60 * 1000); + setTimeout(main, config.FETCH_INTERVAL); }; main(); \ No newline at end of file From 2196a5cf4438f44c389cab945493b9f1d8252e28 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 08:54:45 -0300 Subject: [PATCH 06/14] Add ContractUpdater --- .../oidc-key-registry-server/.env.example | 1 + packages/oidc-key-registry-server/bun.lock | 30 +++++++++++++++++-- .../oidc-key-registry-server/package.json | 4 ++- .../oidc-key-registry-server/src/config.ts | 1 + .../src/contractUpdater.ts | 17 +++++++++++ .../oidc-key-registry-server/src/index.ts | 3 ++ 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 packages/oidc-key-registry-server/src/contractUpdater.ts diff --git a/packages/oidc-key-registry-server/.env.example b/packages/oidc-key-registry-server/.env.example index e72af05f..676e2682 100644 --- a/packages/oidc-key-registry-server/.env.example +++ b/packages/oidc-key-registry-server/.env.example @@ -1 +1,2 @@ FETCH_INTERVAL=60000 +ZKSYNC_PRIVATE_KEY= diff --git a/packages/oidc-key-registry-server/bun.lock b/packages/oidc-key-registry-server/bun.lock index cf718624..87c51a80 100644 --- a/packages/oidc-key-registry-server/bun.lock +++ b/packages/oidc-key-registry-server/bun.lock @@ -5,6 +5,8 @@ "name": "oidc-key-registry-server", "dependencies": { "dotenv": "^16.4.7", + "ethers": "6", + "zksync-ethers": "^6.16.0", }, "devDependencies": { "@types/bun": "latest", @@ -15,18 +17,42 @@ }, }, "packages": { + "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.10.1", "", {}, "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw=="], + + "@noble/curves": ["@noble/curves@1.2.0", "", { "dependencies": { "@noble/hashes": "1.3.2" } }, "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw=="], + + "@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + "@types/bun": ["@types/bun@1.2.1", "", { "dependencies": { "bun-types": "1.2.1" } }, "sha512-iiCeMAKMkft8EPQJxSbpVRD0DKqrh91w40zunNajce3nMNNFd/LnAquVisSZC+UpTMjDwtcdyzbWct08IvEqRA=="], - "@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], + "@types/node": ["@types/node@22.7.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ=="], "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="], + "aes-js": ["aes-js@4.0.0-beta.5", "", {}, "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q=="], + "bun-types": ["bun-types@1.2.1", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-p7bmXUWmrPWxhcbFVk7oUXM5jAGt94URaoa3qf4mz43MEhNAo/ot1urzBqctgvuq7y9YxkuN51u+/qm4BiIsHw=="], "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + "ethers": ["ethers@6.13.5", "", { "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", "ws": "8.17.1" } }, "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ=="], + + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], - "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + + "ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + + "zksync-ethers": ["zksync-ethers@6.16.0", "", { "peerDependencies": { "ethers": "^6.7.1" } }, "sha512-XkuP1a9i9kS95nsUGJ9WxNxeAZnrEMG+CAkSpM0lGXNrmY7fGg4Uyuurx+z7kTriKjtnAdxdHGLPWHBaNCWFLg=="], + + "@types/ws/@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], + + "bun-types/@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], + + "@types/ws/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "bun-types/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], } } diff --git a/packages/oidc-key-registry-server/package.json b/packages/oidc-key-registry-server/package.json index 72352d20..ea6d6a6c 100644 --- a/packages/oidc-key-registry-server/package.json +++ b/packages/oidc-key-registry-server/package.json @@ -9,6 +9,8 @@ "typescript": "^5.0.0" }, "dependencies": { - "dotenv": "^16.4.7" + "dotenv": "^16.4.7", + "ethers": "6", + "zksync-ethers": "^6.16.0" } } \ No newline at end of file diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index 342be2de..e7a1748b 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -2,4 +2,5 @@ import "dotenv/config"; export default { FETCH_INTERVAL: parseInt(process.env.FETCH_INTERVAL || "60000"), + ZKSYNC_PRIVATE_KEY: process.env.ZKSYNC_PRIVATE_KEY!, }; diff --git a/packages/oidc-key-registry-server/src/contractUpdater.ts b/packages/oidc-key-registry-server/src/contractUpdater.ts new file mode 100644 index 00000000..7a95fd07 --- /dev/null +++ b/packages/oidc-key-registry-server/src/contractUpdater.ts @@ -0,0 +1,17 @@ +import { Wallet } from "ethers"; +import { Provider, types } from "zksync-ethers"; +import config from "./config"; + + +export class ContractUpdater { + private wallet: Wallet; + + constructor() { + const provider = Provider.getDefaultProvider(types.Network.Sepolia); + this.wallet = new Wallet(config.ZKSYNC_PRIVATE_KEY, provider); + } + + public async updateContract() { + console.log("Updating contract..."); + } +} \ No newline at end of file diff --git a/packages/oidc-key-registry-server/src/index.ts b/packages/oidc-key-registry-server/src/index.ts index 5f255f1c..d7304c2f 100644 --- a/packages/oidc-key-registry-server/src/index.ts +++ b/packages/oidc-key-registry-server/src/index.ts @@ -1,12 +1,15 @@ import config from "./config"; +import { ContractUpdater } from "./contractUpdater"; import { GoogleFetcher } from "./fetchers/google"; const main = async () => { const fetcher = new GoogleFetcher(); + const contractUpdater = new ContractUpdater(); try { const keys = await fetcher.fetchKeys(); console.log("Fetched keys:", keys); + contractUpdater.updateContract(); } catch (error) { console.error("Error fetching keys:", error); } From 6899267faa8e91b77918afe383e100b789c701e8 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 10:37:19 -0300 Subject: [PATCH 07/14] Refactor config module --- packages/oidc-key-registry-server/bun.lock | 12 +++++++++--- packages/oidc-key-registry-server/package.json | 6 ++++-- .../oidc-key-registry-server/src/config.ts | 18 +++++++++++++----- .../src/contractUpdater.ts | 2 +- packages/oidc-key-registry-server/src/index.ts | 5 +++-- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/packages/oidc-key-registry-server/bun.lock b/packages/oidc-key-registry-server/bun.lock index 87c51a80..7efead90 100644 --- a/packages/oidc-key-registry-server/bun.lock +++ b/packages/oidc-key-registry-server/bun.lock @@ -4,9 +4,11 @@ "": { "name": "oidc-key-registry-server", "dependencies": { - "dotenv": "^16.4.7", + "@t3-oss/env-core": "^0.12.0", "ethers": "6", + "install": "^0.13.0", "zksync-ethers": "^6.16.0", + "zod": "^3.24.1", }, "devDependencies": { "@types/bun": "latest", @@ -23,6 +25,8 @@ "@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + "@t3-oss/env-core": ["@t3-oss/env-core@0.12.0", "", { "peerDependencies": { "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0" }, "optionalPeers": ["typescript", "valibot", "zod"] }, "sha512-lOPj8d9nJJTt81mMuN9GMk8x5veOt7q9m11OSnCBJhwp1QrL/qR+M8Y467ULBSm9SunosryWNbmQQbgoiMgcdw=="], + "@types/bun": ["@types/bun@1.2.1", "", { "dependencies": { "bun-types": "1.2.1" } }, "sha512-iiCeMAKMkft8EPQJxSbpVRD0DKqrh91w40zunNajce3nMNNFd/LnAquVisSZC+UpTMjDwtcdyzbWct08IvEqRA=="], "@types/node": ["@types/node@22.7.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ=="], @@ -33,10 +37,10 @@ "bun-types": ["bun-types@1.2.1", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-p7bmXUWmrPWxhcbFVk7oUXM5jAGt94URaoa3qf4mz43MEhNAo/ot1urzBqctgvuq7y9YxkuN51u+/qm4BiIsHw=="], - "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], - "ethers": ["ethers@6.13.5", "", { "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", "ws": "8.17.1" } }, "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ=="], + "install": ["install@0.13.0", "", {}, "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA=="], + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], @@ -47,6 +51,8 @@ "zksync-ethers": ["zksync-ethers@6.16.0", "", { "peerDependencies": { "ethers": "^6.7.1" } }, "sha512-XkuP1a9i9kS95nsUGJ9WxNxeAZnrEMG+CAkSpM0lGXNrmY7fGg4Uyuurx+z7kTriKjtnAdxdHGLPWHBaNCWFLg=="], + "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + "@types/ws/@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], "bun-types/@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], diff --git a/packages/oidc-key-registry-server/package.json b/packages/oidc-key-registry-server/package.json index ea6d6a6c..e64fb50c 100644 --- a/packages/oidc-key-registry-server/package.json +++ b/packages/oidc-key-registry-server/package.json @@ -9,8 +9,10 @@ "typescript": "^5.0.0" }, "dependencies": { - "dotenv": "^16.4.7", + "@t3-oss/env-core": "^0.12.0", "ethers": "6", - "zksync-ethers": "^6.16.0" + "install": "^0.13.0", + "zksync-ethers": "^6.16.0", + "zod": "^3.24.1" } } \ No newline at end of file diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index e7a1748b..d0489d26 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -1,6 +1,14 @@ -import "dotenv/config"; +import { createEnv } from "@t3-oss/env-core"; +import { z } from "zod"; -export default { - FETCH_INTERVAL: parseInt(process.env.FETCH_INTERVAL || "60000"), - ZKSYNC_PRIVATE_KEY: process.env.ZKSYNC_PRIVATE_KEY!, -}; +export const config = createEnv({ + server: { + FETCH_INTERVAL: z.preprocess( + (val) => Number(val), + z.number().default(60 * 1000) + ), + ZKSYNC_PRIVATE_KEY: z.string(), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true, +}); diff --git a/packages/oidc-key-registry-server/src/contractUpdater.ts b/packages/oidc-key-registry-server/src/contractUpdater.ts index 7a95fd07..fbacea9b 100644 --- a/packages/oidc-key-registry-server/src/contractUpdater.ts +++ b/packages/oidc-key-registry-server/src/contractUpdater.ts @@ -1,6 +1,6 @@ import { Wallet } from "ethers"; import { Provider, types } from "zksync-ethers"; -import config from "./config"; +import { config } from "./config"; export class ContractUpdater { diff --git a/packages/oidc-key-registry-server/src/index.ts b/packages/oidc-key-registry-server/src/index.ts index d7304c2f..3a5ea22d 100644 --- a/packages/oidc-key-registry-server/src/index.ts +++ b/packages/oidc-key-registry-server/src/index.ts @@ -1,4 +1,5 @@ -import config from "./config"; + +import { config } from "./config"; import { ContractUpdater } from "./contractUpdater"; import { GoogleFetcher } from "./fetchers/google"; @@ -17,4 +18,4 @@ const main = async () => { setTimeout(main, config.FETCH_INTERVAL); }; -main(); \ No newline at end of file +main(); From 83690b61cd58179b8430cb93313f18a08cbc2425 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 10:41:39 -0300 Subject: [PATCH 08/14] Fix default value --- packages/oidc-key-registry-server/src/config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index d0489d26..ca8abd05 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -4,8 +4,8 @@ import { z } from "zod"; export const config = createEnv({ server: { FETCH_INTERVAL: z.preprocess( - (val) => Number(val), - z.number().default(60 * 1000) + (val) => (val === undefined ? 60 * 1000 : Number(val)), + z.number() ), ZKSYNC_PRIVATE_KEY: z.string(), }, From 141f108bf0ca5c1cd3d9dc3ea066c8ef3f1cbf5f Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 11:03:34 -0300 Subject: [PATCH 09/14] Update ContractUpdater --- .../oidc-key-registry-server/src/config.ts | 6 ++++ .../src/contractUpdater.ts | 33 +++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index ca8abd05..b760fd4b 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -1,6 +1,9 @@ import { createEnv } from "@t3-oss/env-core"; +import { types } from "zksync-ethers"; import { z } from "zod"; +const validNetworks = ["mainnet", "sepolia"] as const; + export const config = createEnv({ server: { FETCH_INTERVAL: z.preprocess( @@ -8,6 +11,9 @@ export const config = createEnv({ z.number() ), ZKSYNC_PRIVATE_KEY: z.string(), + + NETWORK: z.enum(validNetworks).optional(), + RPC_URL: z.string().url().optional(), }, runtimeEnv: process.env, emptyStringAsUndefined: true, diff --git a/packages/oidc-key-registry-server/src/contractUpdater.ts b/packages/oidc-key-registry-server/src/contractUpdater.ts index fbacea9b..859f89d4 100644 --- a/packages/oidc-key-registry-server/src/contractUpdater.ts +++ b/packages/oidc-key-registry-server/src/contractUpdater.ts @@ -5,13 +5,40 @@ import { config } from "./config"; export class ContractUpdater { private wallet: Wallet; + private provider: Provider; constructor() { - const provider = Provider.getDefaultProvider(types.Network.Sepolia); - this.wallet = new Wallet(config.ZKSYNC_PRIVATE_KEY, provider); + if (config.RPC_URL) { + this.provider = new Provider(config.RPC_URL); + } else if (config.NETWORK) { + this.provider = Provider.getDefaultProvider(this.getNetwork()); + } else { + throw new Error("Either RPC_URL or NETWORK must be set"); + } + this.wallet = new Wallet(config.ZKSYNC_PRIVATE_KEY, this.provider); } public async updateContract() { console.log("Updating contract..."); } -} \ No newline at end of file + + private getNetwork(): types.Network { + if (!config.NETWORK) { + throw new Error("NETWORK is not set in config"); + } + + const networkMap: Record = { + mainnet: types.Network.Mainnet, + sepolia: types.Network.Sepolia, + localhost: types.Network.Localhost, + }; + + const network = networkMap[config.NETWORK.toLowerCase()]; + + if (!network) { + throw new Error(`Unknown or unsupported network: ${config.NETWORK}`); + } + + return network; + } +} From 8cdbd3de4fcdf2a7375108fec8c94b5aaca7a5cb Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Feb 2025 16:40:39 -0300 Subject: [PATCH 10/14] Filter keys before adding --- packages/oidc-key-registry-server/bun.lock | 33 ++ .../oidc-key-registry-server/package.json | 1 + .../oidc-key-registry-server/src/config.ts | 3 +- .../src/contractUpdater.ts | 321 +++++++++++++++++- .../oidc-key-registry-server/src/index.ts | 2 +- 5 files changed, 357 insertions(+), 3 deletions(-) diff --git a/packages/oidc-key-registry-server/bun.lock b/packages/oidc-key-registry-server/bun.lock index 7efead90..2a1435f9 100644 --- a/packages/oidc-key-registry-server/bun.lock +++ b/packages/oidc-key-registry-server/bun.lock @@ -7,6 +7,7 @@ "@t3-oss/env-core": "^0.12.0", "ethers": "6", "install": "^0.13.0", + "viem": "^2.22.19", "zksync-ethers": "^6.16.0", "zod": "^3.24.1", }, @@ -25,6 +26,12 @@ "@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + "@scure/base": ["@scure/base@1.2.4", "", {}, "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ=="], + + "@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], + + "@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + "@t3-oss/env-core": ["@t3-oss/env-core@0.12.0", "", { "peerDependencies": { "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0" }, "optionalPeers": ["typescript", "valibot", "zod"] }, "sha512-lOPj8d9nJJTt81mMuN9GMk8x5veOt7q9m11OSnCBJhwp1QrL/qR+M8Y467ULBSm9SunosryWNbmQQbgoiMgcdw=="], "@types/bun": ["@types/bun@1.2.1", "", { "dependencies": { "bun-types": "1.2.1" } }, "sha512-iiCeMAKMkft8EPQJxSbpVRD0DKqrh91w40zunNajce3nMNNFd/LnAquVisSZC+UpTMjDwtcdyzbWct08IvEqRA=="], @@ -33,30 +40,56 @@ "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="], + "abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], + "aes-js": ["aes-js@4.0.0-beta.5", "", {}, "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q=="], "bun-types": ["bun-types@1.2.1", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-p7bmXUWmrPWxhcbFVk7oUXM5jAGt94URaoa3qf4mz43MEhNAo/ot1urzBqctgvuq7y9YxkuN51u+/qm4BiIsHw=="], "ethers": ["ethers@6.13.5", "", { "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", "ws": "8.17.1" } }, "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ=="], + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "install": ["install@0.13.0", "", {}, "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA=="], + "isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + + "ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + "viem": ["viem@2.22.19", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-aGR/NUHaboQ/HoS86wYfJWbXt6aewjhp2OCO2uczCrusgcwXO/qC0l36AcFVw2dkOPBEhIG5oXMEso97L+xHmA=="], + "ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], "zksync-ethers": ["zksync-ethers@6.16.0", "", { "peerDependencies": { "ethers": "^6.7.1" } }, "sha512-XkuP1a9i9kS95nsUGJ9WxNxeAZnrEMG+CAkSpM0lGXNrmY7fGg4Uyuurx+z7kTriKjtnAdxdHGLPWHBaNCWFLg=="], "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + "@scure/bip32/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@scure/bip32/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@scure/bip39/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@types/ws/@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], "bun-types/@types/node": ["@types/node@22.12.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA=="], + "ox/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "ox/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "viem/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "viem/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@types/ws/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], "bun-types/@types/node/undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], diff --git a/packages/oidc-key-registry-server/package.json b/packages/oidc-key-registry-server/package.json index e64fb50c..8f5e7214 100644 --- a/packages/oidc-key-registry-server/package.json +++ b/packages/oidc-key-registry-server/package.json @@ -12,6 +12,7 @@ "@t3-oss/env-core": "^0.12.0", "ethers": "6", "install": "^0.13.0", + "viem": "^2.22.19", "zksync-ethers": "^6.16.0", "zod": "^3.24.1" } diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index b760fd4b..16d79d62 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -11,7 +11,8 @@ export const config = createEnv({ z.number() ), ZKSYNC_PRIVATE_KEY: z.string(), - + CONTRACT_ADDRESS: z.string(), + CONTRACT_ABI: z.string(), NETWORK: z.enum(validNetworks).optional(), RPC_URL: z.string().url().optional(), }, diff --git a/packages/oidc-key-registry-server/src/contractUpdater.ts b/packages/oidc-key-registry-server/src/contractUpdater.ts index 859f89d4..d9f5d9f4 100644 --- a/packages/oidc-key-registry-server/src/contractUpdater.ts +++ b/packages/oidc-key-registry-server/src/contractUpdater.ts @@ -1,11 +1,291 @@ import { Wallet } from "ethers"; import { Provider, types } from "zksync-ethers"; import { config } from "./config"; +import { Contract } from "ethers"; +import type { Key } from "./types"; +import { keccak256, toBytes } from "viem"; +const abi = [ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "MAX_KEYS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "OIDCKeys", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getKey", + "inputs": [ + { + "name": "issHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct OidcKeyRegistry.Key", + "components": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "hashIssuer", + "inputs": [ + { + "name": "iss", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "initialize", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "keyIndexes", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setKey", + "inputs": [ + { + "name": "issHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "key", + "type": "tuple", + "internalType": "struct OidcKeyRegistry.Key", + "components": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setKeys", + "inputs": [ + { + "name": "issHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "keys", + "type": "tuple[]", + "internalType": "struct OidcKeyRegistry.Key[]", + "components": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } +] export class ContractUpdater { private wallet: Wallet; private provider: Provider; + private contract: Contract; + private issHashes = new Map(); constructor() { if (config.RPC_URL) { @@ -16,10 +296,38 @@ export class ContractUpdater { throw new Error("Either RPC_URL or NETWORK must be set"); } this.wallet = new Wallet(config.ZKSYNC_PRIVATE_KEY, this.provider); + + this.contract = new Contract( + config.CONTRACT_ADDRESS, + abi, + this.wallet + ) } - public async updateContract() { + public async updateContract(iss: string, keys: Key[]): Promise { console.log("Updating contract..."); + + const issHash = this.getIssHash(iss); + let finalKeys = []; + for (const key of keys) { + const tx = await this.contract.getKey(issHash, key.kid); + console.log(tx); + if (tx.kid === key.kid) { + console.log("Key already exists, skipping:", key.kid); + } else { + finalKeys.push(key); + } + } + + if (finalKeys.length === 0) { + console.log("No new keys to add"); + return; + } + + const tx = await this.contract.setKeys(issHash, finalKeys); + console.log("Transaction hash:", tx.hash); + await tx.wait(); + console.log("Transaction confirmed"); } private getNetwork(): types.Network { @@ -41,4 +349,15 @@ export class ContractUpdater { return network; } + + private getIssHash(iss: string): string { + let issHash = this.issHashes.get(iss); + if (!issHash) { + console.log("Hashing issuer:", iss); + issHash = keccak256(toBytes(iss)); + console.log("Hash:", issHash); + this.issHashes.set(iss, issHash); + } + return issHash; + } } diff --git a/packages/oidc-key-registry-server/src/index.ts b/packages/oidc-key-registry-server/src/index.ts index 3a5ea22d..746523ec 100644 --- a/packages/oidc-key-registry-server/src/index.ts +++ b/packages/oidc-key-registry-server/src/index.ts @@ -10,7 +10,7 @@ const main = async () => { try { const keys = await fetcher.fetchKeys(); console.log("Fetched keys:", keys); - contractUpdater.updateContract(); + await contractUpdater.updateContract("accounts.google.com", keys); } catch (error) { console.error("Error fetching keys:", error); } From 5690d23ac56e2e01ba01bbf3ce990efef6d6b1c0 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Tue, 4 Feb 2025 08:34:15 -0300 Subject: [PATCH 11/14] Add getNewKeys --- .../src/contractUpdater.ts | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/oidc-key-registry-server/src/contractUpdater.ts b/packages/oidc-key-registry-server/src/contractUpdater.ts index d9f5d9f4..3a0a5d7a 100644 --- a/packages/oidc-key-registry-server/src/contractUpdater.ts +++ b/packages/oidc-key-registry-server/src/contractUpdater.ts @@ -305,29 +305,39 @@ export class ContractUpdater { } public async updateContract(iss: string, keys: Key[]): Promise { - console.log("Updating contract..."); + console.log(`Updating contract for issuer: ${iss}`); const issHash = this.getIssHash(iss); - let finalKeys = []; - for (const key of keys) { - const tx = await this.contract.getKey(issHash, key.kid); - console.log(tx); - if (tx.kid === key.kid) { - console.log("Key already exists, skipping:", key.kid); - } else { - finalKeys.push(key); - } - } + const newKeys = await this.getNewKeys(issHash, keys); - if (finalKeys.length === 0) { - console.log("No new keys to add"); + if (newKeys.length === 0) { + console.log("No new keys to add."); return; } - const tx = await this.contract.setKeys(issHash, finalKeys); - console.log("Transaction hash:", tx.hash); - await tx.wait(); - console.log("Transaction confirmed"); + try { + const tx = await this.contract.setKeys(issHash, newKeys); + console.log(`Transaction sent: ${tx.hash}`); + await tx.wait(); + console.log("Transaction confirmed!"); + } catch (error) { + console.error("Error updating contract:", error); + } + } + + private async getNewKeys(issHash: string, keys: Key[]): Promise { + const results = await Promise.all( + keys.map(async (key) => { + try { + const stored = await this.contract.getKey(issHash, key.kid); + return stored.kid !== key.kid ? key : null; + } catch (error) { + return key; + } + }) + ); + + return results.filter((key): key is Key => key !== null); } private getNetwork(): types.Network { From 312d05d0ab49b40f9221f860553a485511e3da15 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Tue, 4 Feb 2025 08:55:11 -0300 Subject: [PATCH 12/14] Move abi --- packages/oidc-key-registry-server/src/abi.ts | 275 +++++++++++++++++ .../src/contractUpdater.ts | 280 +----------------- .../src/fetchers/google.ts | 8 +- .../oidc-key-registry-server/src/index.ts | 1 - 4 files changed, 281 insertions(+), 283 deletions(-) create mode 100644 packages/oidc-key-registry-server/src/abi.ts diff --git a/packages/oidc-key-registry-server/src/abi.ts b/packages/oidc-key-registry-server/src/abi.ts new file mode 100644 index 00000000..49236c16 --- /dev/null +++ b/packages/oidc-key-registry-server/src/abi.ts @@ -0,0 +1,275 @@ +export const abi = [ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "MAX_KEYS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "OIDCKeys", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getKey", + "inputs": [ + { + "name": "issHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct OidcKeyRegistry.Key", + "components": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "hashIssuer", + "inputs": [ + { + "name": "iss", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "initialize", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "keyIndexes", + "inputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setKey", + "inputs": [ + { + "name": "issHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "key", + "type": "tuple", + "internalType": "struct OidcKeyRegistry.Key", + "components": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setKeys", + "inputs": [ + { + "name": "issHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "keys", + "type": "tuple[]", + "internalType": "struct OidcKeyRegistry.Key[]", + "components": [ + { + "name": "kid", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "n", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "e", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } +] diff --git a/packages/oidc-key-registry-server/src/contractUpdater.ts b/packages/oidc-key-registry-server/src/contractUpdater.ts index 3a0a5d7a..44c6ce8a 100644 --- a/packages/oidc-key-registry-server/src/contractUpdater.ts +++ b/packages/oidc-key-registry-server/src/contractUpdater.ts @@ -4,282 +4,7 @@ import { config } from "./config"; import { Contract } from "ethers"; import type { Key } from "./types"; import { keccak256, toBytes } from "viem"; - -const abi = [ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "MAX_KEYS", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint8", - "internalType": "uint8" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "OIDCKeys", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "kid", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "n", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "e", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getKey", - "inputs": [ - { - "name": "issHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "kid", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct OidcKeyRegistry.Key", - "components": [ - { - "name": "kid", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "n", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "e", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "hashIssuer", - "inputs": [ - { - "name": "iss", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "initialize", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "keyIndexes", - "inputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint8", - "internalType": "uint8" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setKey", - "inputs": [ - { - "name": "issHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "key", - "type": "tuple", - "internalType": "struct OidcKeyRegistry.Key", - "components": [ - { - "name": "kid", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "n", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "e", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setKeys", - "inputs": [ - { - "name": "issHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "keys", - "type": "tuple[]", - "internalType": "struct OidcKeyRegistry.Key[]", - "components": [ - { - "name": "kid", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "n", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "e", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - } -] +import { abi } from "./abi"; export class ContractUpdater { private wallet: Wallet; @@ -363,9 +88,8 @@ export class ContractUpdater { private getIssHash(iss: string): string { let issHash = this.issHashes.get(iss); if (!issHash) { - console.log("Hashing issuer:", iss); issHash = keccak256(toBytes(iss)); - console.log("Hash:", issHash); + console.log("issHash:", issHash); this.issHashes.set(iss, issHash); } return issHash; diff --git a/packages/oidc-key-registry-server/src/fetchers/google.ts b/packages/oidc-key-registry-server/src/fetchers/google.ts index 28b23ba0..92742717 100644 --- a/packages/oidc-key-registry-server/src/fetchers/google.ts +++ b/packages/oidc-key-registry-server/src/fetchers/google.ts @@ -10,8 +10,8 @@ export class GoogleFetcher implements KeyFetcher { const data = await response.json(); return data.keys.map((key: any) => ({ kid: this.toBytes32(key.kid), - n: this.toBytes(key.n), - e: this.toBytes(key.e), + n: this.toHex(key.n), + e: this.toHex(key.e), })); } @@ -19,7 +19,7 @@ export class GoogleFetcher implements KeyFetcher { return `0x${str.padStart(64, '0')}`; } - toBytes(str: string): string { + toHex(str: string): string { return `0x${Buffer.from(str, 'base64url').toString('hex')}`; } -} \ No newline at end of file +} diff --git a/packages/oidc-key-registry-server/src/index.ts b/packages/oidc-key-registry-server/src/index.ts index 746523ec..37defd0c 100644 --- a/packages/oidc-key-registry-server/src/index.ts +++ b/packages/oidc-key-registry-server/src/index.ts @@ -9,7 +9,6 @@ const main = async () => { try { const keys = await fetcher.fetchKeys(); - console.log("Fetched keys:", keys); await contractUpdater.updateContract("accounts.google.com", keys); } catch (error) { console.error("Error fetching keys:", error); From 4c84daf18dea1765948eec66a22c7c73eeb02cd4 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Tue, 4 Feb 2025 08:59:12 -0300 Subject: [PATCH 13/14] Update config --- packages/oidc-key-registry-server/.env.example | 2 ++ packages/oidc-key-registry-server/src/config.ts | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/oidc-key-registry-server/.env.example b/packages/oidc-key-registry-server/.env.example index 676e2682..9e7df571 100644 --- a/packages/oidc-key-registry-server/.env.example +++ b/packages/oidc-key-registry-server/.env.example @@ -1,2 +1,4 @@ FETCH_INTERVAL=60000 ZKSYNC_PRIVATE_KEY= +NETWORK=mainnet +CONTRACT_ADDRESS= diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index 16d79d62..1dc7087c 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -12,7 +12,6 @@ export const config = createEnv({ ), ZKSYNC_PRIVATE_KEY: z.string(), CONTRACT_ADDRESS: z.string(), - CONTRACT_ABI: z.string(), NETWORK: z.enum(validNetworks).optional(), RPC_URL: z.string().url().optional(), }, From 8efaf3512a479f1891aaa5ca08608b70adfaf561 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Tue, 4 Feb 2025 09:00:03 -0300 Subject: [PATCH 14/14] Add localhost to valid networks --- packages/oidc-key-registry-server/src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/oidc-key-registry-server/src/config.ts b/packages/oidc-key-registry-server/src/config.ts index 1dc7087c..00216ed8 100644 --- a/packages/oidc-key-registry-server/src/config.ts +++ b/packages/oidc-key-registry-server/src/config.ts @@ -2,7 +2,7 @@ import { createEnv } from "@t3-oss/env-core"; import { types } from "zksync-ethers"; import { z } from "zod"; -const validNetworks = ["mainnet", "sepolia"] as const; +const validNetworks = ["mainnet", "sepolia", "localhost"] as const; export const config = createEnv({ server: {