diff --git a/.gitignore b/.gitignore
index 157884c0..0a6139ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,5 +26,8 @@ build
generated
subgraph.yaml
+# SDK
+lib
+
# Misc
.DS_Store
diff --git a/explorer/.eslintrc.cjs b/explorer/.eslintrc.cjs
new file mode 100644
index 00000000..d6c95379
--- /dev/null
+++ b/explorer/.eslintrc.cjs
@@ -0,0 +1,18 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:react-hooks/recommended',
+ ],
+ ignorePatterns: ['dist', '.eslintrc.cjs'],
+ parser: '@typescript-eslint/parser',
+ plugins: ['react-refresh'],
+ rules: {
+ 'react-refresh/only-export-components': [
+ 'warn',
+ { allowConstantExport: true },
+ ],
+ },
+}
diff --git a/explorer/README.md b/explorer/README.md
new file mode 100644
index 00000000..a1a220e0
--- /dev/null
+++ b/explorer/README.md
@@ -0,0 +1 @@
+# Verax Attestation Registry - Explorer
diff --git a/explorer/index.html b/explorer/index.html
new file mode 100644
index 00000000..302f0a45
--- /dev/null
+++ b/explorer/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Verax | Explorer
+
+
+
+
+
+
diff --git a/explorer/package.json b/explorer/package.json
new file mode 100644
index 00000000..db82bc46
--- /dev/null
+++ b/explorer/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "linea-attestation-registry-explorer",
+ "version": "0.0.1",
+ "description": "Verax Attestation Registry explorer",
+ "keywords": [
+ "linea-attestation-registry",
+ "blockchain",
+ "attestation",
+ "ethereum",
+ "foundry",
+ "smart-contracts",
+ "solidity"
+ ],
+ "repository": "github.com/Consensys/linea-attestation-registry",
+ "license": "MIT",
+ "author": "Consensys",
+ "type": "module",
+ "scripts": {
+ "build": "tsc && vite build",
+ "dev": "vite",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@verax-attestation-registry/verax-sdk": "workspace:^",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.15",
+ "@types/react-dom": "^18.2.7",
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
+ "@typescript-eslint/parser": "^6.0.0",
+ "@vitejs/plugin-react": "^4.0.3",
+ "eslint": "^8.45.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.3",
+ "typescript": "^5.0.2",
+ "vite": "^4.4.5"
+ }
+}
diff --git a/explorer/src/App.css b/explorer/src/App.css
new file mode 100644
index 00000000..b9d355df
--- /dev/null
+++ b/explorer/src/App.css
@@ -0,0 +1,42 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/explorer/src/App.tsx b/explorer/src/App.tsx
new file mode 100644
index 00000000..289b4299
--- /dev/null
+++ b/explorer/src/App.tsx
@@ -0,0 +1,36 @@
+import { useState } from "react";
+import veraxLogo from "./assets/verax-logo-circle.svg";
+import "./App.css";
+
+function App() {
+ const [attestations, setAttestations] = useState([]);
+
+ const getSomeAttestations = async () => {
+ const veraxSdk = new VeraxSdk(VeraxSdk.DEFAULT_LINEA_TESTNET_FRONTEND);
+ setAttestations(await veraxSdk.attestation.findBy(2));
+ };
+
+ return (
+ <>
+
+ Verax Attestation Registry
+
+
+ {attestations.length > 0 && (
+
+ {attestations.map((attestation) => (
+ - {attestation.id}
+ ))}
+
+ )}
+
+ Click on the Verax logo to learn more
+ >
+ );
+}
+
+export default App;
diff --git a/explorer/src/assets/verax-logo-circle.svg b/explorer/src/assets/verax-logo-circle.svg
new file mode 100644
index 00000000..cc19b6ad
--- /dev/null
+++ b/explorer/src/assets/verax-logo-circle.svg
@@ -0,0 +1,59 @@
+
+
+
diff --git a/explorer/src/index.css b/explorer/src/index.css
new file mode 100644
index 00000000..2c3fac68
--- /dev/null
+++ b/explorer/src/index.css
@@ -0,0 +1,69 @@
+:root {
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/explorer/src/main.tsx b/explorer/src/main.tsx
new file mode 100644
index 00000000..3d7150da
--- /dev/null
+++ b/explorer/src/main.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App.tsx'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/explorer/src/vite-env.d.ts b/explorer/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/explorer/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/explorer/tsconfig.json b/explorer/tsconfig.json
new file mode 100644
index 00000000..a7fc6fbf
--- /dev/null
+++ b/explorer/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/explorer/tsconfig.node.json b/explorer/tsconfig.node.json
new file mode 100644
index 00000000..42872c59
--- /dev/null
+++ b/explorer/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/explorer/vite.config.ts b/explorer/vite.config.ts
new file mode 100644
index 00000000..081c8d9f
--- /dev/null
+++ b/explorer/vite.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+export default defineConfig({
+ plugins: [react()],
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 79428e9c..692893aa 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,6 +14,10 @@ overrides:
importers:
.:
+ dependencies:
+ '@verax-attestation-registry/verax-sdk':
+ specifier: link:/Users/alain/Documents/ConsenSys/attestation-registry/linea-attestation-registry/sdk
+ version: link:sdk
devDependencies:
'@typescript-eslint/eslint-plugin':
specifier: ^6.7.3
@@ -64,6 +68,49 @@ importers:
specifier: ^0.0.5
version: 0.0.5(prettier-plugin-solidity@1.1.3)(prettier@2.8.8)
+ explorer:
+ dependencies:
+ '@verax-attestation-registry/verax-sdk':
+ specifier: workspace:^
+ version: link:../sdk
+ react:
+ specifier: ^18.2.0
+ version: 18.2.0
+ react-dom:
+ specifier: ^18.2.0
+ version: 18.2.0(react@18.2.0)
+ devDependencies:
+ '@types/react':
+ specifier: ^18.2.15
+ version: 18.2.29
+ '@types/react-dom':
+ specifier: ^18.2.7
+ version: 18.2.13
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^6.0.0
+ version: 6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2)
+ '@typescript-eslint/parser':
+ specifier: ^6.0.0
+ version: 6.7.3(eslint@8.50.0)(typescript@5.2.2)
+ '@vitejs/plugin-react':
+ specifier: ^4.0.3
+ version: 4.1.0(vite@4.5.0)
+ eslint:
+ specifier: ^8.45.0
+ version: 8.50.0
+ eslint-plugin-react-hooks:
+ specifier: ^4.6.0
+ version: 4.6.0(eslint@8.50.0)
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.3
+ version: 0.4.3(eslint@8.50.0)
+ typescript:
+ specifier: ^5.0.2
+ version: 5.2.2
+ vite:
+ specifier: ^4.4.5
+ version: 4.5.0
+
sdk:
dependencies:
'@graphprotocol/client-cli':
@@ -1274,7 +1321,6 @@ packages:
dependencies:
'@babel/core': 7.23.0
'@babel/helper-plugin-utils': 7.22.5
- dev: false
/@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.0):
resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==}
@@ -1284,7 +1330,6 @@ packages:
dependencies:
'@babel/core': 7.23.0
'@babel/helper-plugin-utils': 7.22.5
- dev: false
/@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0):
resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==}
@@ -1734,6 +1779,204 @@ packages:
tslib: 2.6.2
dev: false
+ /@esbuild/android-arm64@0.18.20:
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.18.20:
+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.18.20:
+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.18.20:
+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.18.20:
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.18.20:
+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.18.20:
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.18.20:
+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.18.20:
+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.18.20:
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.18.20:
+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.18.20:
+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.18.20:
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.18.20:
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.18.20:
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.18.20:
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.18.20:
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.18.20:
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.18.20:
+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.18.20:
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.18.20:
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.18.20:
+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@eslint-community/eslint-utils@4.4.0(eslint@8.50.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5325,10 +5568,28 @@ packages:
resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
dev: true
+ /@types/prop-types@15.7.9:
+ resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==}
+ dev: true
+
/@types/qs@6.9.8:
resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==}
dev: true
+ /@types/react-dom@18.2.13:
+ resolution: {integrity: sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==}
+ dependencies:
+ '@types/react': 18.2.29
+ dev: true
+
+ /@types/react@18.2.29:
+ resolution: {integrity: sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q==}
+ dependencies:
+ '@types/prop-types': 15.7.9
+ '@types/scheduler': 0.16.4
+ csstype: 3.1.2
+ dev: true
+
/@types/readable-stream@2.3.15:
resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==}
dependencies:
@@ -5336,6 +5597,10 @@ packages:
safe-buffer: 5.1.2
dev: true
+ /@types/scheduler@0.16.4:
+ resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==}
+ dev: true
+
/@types/secp256k1@4.0.3:
resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==}
dependencies:
@@ -5512,6 +5777,22 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
+ /@vitejs/plugin-react@4.1.0(vite@4.5.0):
+ resolution: {integrity: sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0
+ dependencies:
+ '@babel/core': 7.23.0
+ '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.0)
+ '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.0)
+ '@types/babel__core': 7.20.2
+ react-refresh: 0.14.0
+ vite: 4.5.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@whatwg-node/cookie-store@0.0.1:
resolution: {integrity: sha512-uoti8QU5xd+X+9PULOGpPpOqPDdwkz+ukMc4kyQG1GwXeKVGktr4FSllr6dBotjOjNVPSBPpmj5V6zrUdDcLaw==}
dependencies:
@@ -7094,6 +7375,10 @@ packages:
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
dev: true
+ /csstype@3.1.2:
+ resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
+ dev: true
+
/dashdash@1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
@@ -7558,6 +7843,36 @@ packages:
es6-promise: 4.2.8
dev: true
+ /esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+ dev: true
+
/escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@@ -7592,6 +7907,23 @@ packages:
source-map: 0.2.0
dev: true
+ /eslint-plugin-react-hooks@4.6.0(eslint@8.50.0):
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ dependencies:
+ eslint: 8.50.0
+ dev: true
+
+ /eslint-plugin-react-refresh@0.4.3(eslint@8.50.0):
+ resolution: {integrity: sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==}
+ peerDependencies:
+ eslint: '>=7'
+ dependencies:
+ eslint: 8.50.0
+ dev: true
+
/eslint-scope@7.2.2:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -8283,7 +8615,7 @@ packages:
/fs-jetpack@4.3.1:
resolution: {integrity: sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==}
dependencies:
- minimatch: 3.1.2
+ minimatch: 9.0.3
rimraf: 2.7.1
dev: true
@@ -9614,7 +9946,7 @@ packages:
resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==}
dependencies:
'@types/minimatch': 3.0.5
- minimatch: 3.1.2
+ minimatch: 9.0.3
dev: true
/it-last@1.0.6:
@@ -11197,6 +11529,12 @@ packages:
hasBin: true
dev: true
+ /nanoid@3.3.6:
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
/napi-macros@2.2.2:
resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==}
dev: true
@@ -11765,6 +12103,15 @@ packages:
engines: {node: '>=4'}
dev: true
+ /postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.6
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
/prelude-ls@1.1.2:
resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
engines: {node: '>= 0.8.0'}
@@ -11972,6 +12319,16 @@ packages:
- utf-8-validate
dev: false
+ /react-dom@18.2.0(react@18.2.0):
+ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
+ peerDependencies:
+ react: ^18.2.0
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.2.0
+ scheduler: 0.23.0
+ dev: false
+
/react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
requiresBuild: true
@@ -12061,6 +12418,11 @@ packages:
- utf-8-validate
dev: false
+ /react-refresh@0.14.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/react-refresh@0.4.3:
resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==}
engines: {node: '>=0.10.0'}
@@ -12401,6 +12763,14 @@ packages:
bn.js: 5.2.1
dev: true
+ /rollup@3.29.4:
+ resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
/run-parallel-limit@1.1.0:
resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==}
dependencies:
@@ -12464,6 +12834,12 @@ packages:
wordwrap: 1.0.0
dev: true
+ /scheduler@0.23.0:
+ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
/scheduler@0.24.0-canary-efb381bbf-20230505:
resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==}
dependencies:
@@ -12754,6 +13130,11 @@ packages:
- supports-color
dev: true
+ /source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/source-map-support@0.5.13:
resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
dependencies:
@@ -13754,6 +14135,41 @@ packages:
- zod
dev: false
+ /vite@4.5.0:
+ resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.18.20
+ postcss: 8.4.31
+ rollup: 3.29.4
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
/vlq@1.0.1:
resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==}
dev: false
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index b917e0db..54999f85 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,4 +1,5 @@
packages:
- 'contracts'
+ - 'explorer'
- 'subgraph'
- 'sdk'
diff --git a/sdk/.npmignore b/sdk/.npmignore
new file mode 100644
index 00000000..579fc838
--- /dev/null
+++ b/sdk/.npmignore
@@ -0,0 +1,14 @@
+.graphclient
+!dist/.graphclient
+examples
+node_modules
+src
+!dist/src
+test
+.env
+.env.example
+.graphclientrc.yml
+.npmignore
+babel-jest.config.cjs
+jest.config.js
+tsconfig.json
diff --git a/sdk/LICENSE b/sdk/LICENSE
new file mode 100644
index 00000000..3f498aa4
--- /dev/null
+++ b/sdk/LICENSE
@@ -0,0 +1,7 @@
+Copyright 2023 ConsenSys Software, Inc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/sdk/README.md b/sdk/README.md
index 516042fa..65aaabf6 100644
--- a/sdk/README.md
+++ b/sdk/README.md
@@ -1,21 +1,26 @@
# Verax Attestation Registry - SDK
-The `verax-sdk` facilitates the interactions with the contracts and the subgraph, both from a frontend and a backend.
+The Verax SDK facilitates the interactions with the contracts and the subgraph, both from a frontend and a backend.
[DRAFT]
## Installation
-VeraxSDK is a [npm package](https://www.npmjs.com/package/verax-sdk/).
+VeraxSDK is a [npm package](https://www.npmjs.com/package/@verax-attestation-registry/verax-sdk/).
```bash
# npm
-npm install --save verax-sdk
+npm i @verax-attestation-registry/verax-sdk
```
```bash
# yarn
-yarn add verax-sdk
+yarn add @verax-attestation-registry/verax-sdk
+```
+
+```bash
+# pnpm
+pnpm add @verax-attestation-registry/verax-sdk
```
## Getting Started
@@ -24,26 +29,26 @@ yarn add verax-sdk
```js
// CommonJS
-var VeraxSdk = require("verax-sdk");
+var VeraxSdk = require("@verax-attestation-registry/verax-sdk");
```
```js
// ES6
-import VeraxSdk from "verax-sdk";
+import VeraxSdk from "@verax-attestation-registry/verax-sdk";
```
### 2. Instantiate VeraxSdk
```js
// Default configuration for Linea Testnet
-const veraxSdk = new VeraxSdk(VeraxSdk.LineaConfTestnet);
+const veraxSdk = new VeraxSdk(VeraxSdk.DEFAULT_LINEA_TESTNET);
```
or,
```js
// Default configuration for Linea Mainnet
-const veraxSdk = new VeraxSdk(VeraxSdk.LineaConfMainnet);
+const veraxSdk = new VeraxSdk(VeraxSdk.DEFAULT_LINEA_MAINNET);
```
or,
@@ -51,8 +56,8 @@ or,
```js
// Custom configuration
const myVeraxConfiguration = {
- rpcUrl: "https://my.rpc.url",
- chain: 12345,
+ chain: lineaTestnet,
+ mode: SDKMode.BACKEND,
subgraphUrl: "https://my.subgraph.url",
portalRegistryAddress: "0xMyPortalRegistryAddress",
moduleRegistryAddress: "0xMyModuleRegistryAddress",
@@ -69,10 +74,10 @@ const veraxSdk = new VeraxSdk(myVeraxConfiguration);
```js
// Each Verax classes has its DataMapper
// Get them from the SDK instance
-const portalDataMapper = veraxSdk.portalDataMapper; // RW Portals
-const schemaDataMapper = veraxSdk.schemaDataMapper; // RW Schemas
-const moduleDataMapper = veraxSdk.moduleDataMapper; // RW Modules
-const attestationDataMapper = veraxSdk.attestationDataMapper; // RW Attestations
+const portalDataMapper = veraxSdk.portal; // RW Portals
+const schemaDataMapper = veraxSdk.schema; // RW Schemas
+const moduleDataMapper = veraxSdk.module; // RW Modules
+const attestationDataMapper = veraxSdk.attestation; // RW Attestations
```
### 2. Read content (one object)
diff --git a/sdk/package.json b/sdk/package.json
index 83b98646..e21b7f3e 100644
--- a/sdk/package.json
+++ b/sdk/package.json
@@ -1,6 +1,6 @@
{
- "name": "linea-attestation-registry-sdk",
- "version": "0.0.1",
+ "name": "@verax-attestation-registry/verax-sdk",
+ "version": "0.0.4",
"description": "Verax Attestation Registry SDK to interact with the subgraph and the contracts",
"keywords": [
"linea-attestation-registry",
@@ -15,8 +15,31 @@
"license": "MIT",
"author": "Consensys",
"type": "module",
+ "files": [
+ "lib/**/*"
+ ],
+ "types": "./lib/cjs/types/index.d.ts",
+ "main": "./lib/cjs/index.js",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./lib/esm/types/index.d.ts",
+ "default": "./lib/esm/index.mjs"
+ },
+ "require": {
+ "types": "./lib/cjs/types/index.d.ts",
+ "default": "./lib/cjs/index.js"
+ }
+ }
+ },
"scripts": {
"attestation": "ts-node examples/attestation/index.ts",
+ "clean": "rm -rf ./lib",
+ "build": "pnpm run clean && pnpm run build:esm && pnpm run build:cjs",
+ "build:esm": "tsc -p ./tsconfig.esm.json",
+ "build:cjs": "tsc -p ./tsconfig.cjs.json",
+ "prepack": "npm run build",
+ "publish:public": "pnpm publish --access public --no-git-checks",
"module": "ts-node examples/module/index.ts",
"portal": "ts-node examples/portal/index.ts",
"schema": "ts-node examples/schema/index.ts",
diff --git a/sdk/tsconfig.cjs.json b/sdk/tsconfig.cjs.json
new file mode 100644
index 00000000..aa783b68
--- /dev/null
+++ b/sdk/tsconfig.cjs.json
@@ -0,0 +1,12 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "lib": ["ES6", "DOM"],
+ "target": "ES6",
+ "module": "CommonJS",
+ "moduleResolution": "Node",
+ "outDir": "./lib/cjs",
+ "declarationDir": "./lib/cjs/types"
+ },
+ "include": ["src/**/*.ts", ".graphclient/**/*.ts"]
+}
diff --git a/sdk/tsconfig.esm.json b/sdk/tsconfig.esm.json
new file mode 100644
index 00000000..b4974dda
--- /dev/null
+++ b/sdk/tsconfig.esm.json
@@ -0,0 +1,11 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "lib": ["ESNext", "DOM"],
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "outDir": "./lib/esm",
+ "declarationDir": "./lib/esm/types"
+ },
+ "include": ["src/**/*.ts", ".graphclient/**/*.ts"]
+}
diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json
index c27acc60..cf943c9d 100644
--- a/sdk/tsconfig.json
+++ b/sdk/tsconfig.json
@@ -1,8 +1,17 @@
{
- "extends": "../tsconfig.json",
"compilerOptions": {
- "module": "ESNext",
- "target": "ESNext"
+ "strict": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "checkJs": true,
+ "allowJs": true,
+ "declaration": true,
+ "declarationMap": true,
+ "allowSyntheticDefaultImports": true,
+ "outDir": "./lib",
+ "sourceMap": true,
+ "noEmit": false
},
"ts-node": {
"esm": true,