diff --git a/.dockerignore b/.dockerignore index b3f877500..321b0e935 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,5 +6,4 @@ !/packages/subgraph/ /packages/subgraph/generated/ /packages/subgraph/build/ -/packages/subgraph/subgraph.yaml -/packages/subgraph/.drone.yml \ No newline at end of file +/packages/subgraph/.drone.yml diff --git a/packages/sdk/.drone.yml b/packages/sdk/.drone.yml index c51283125..e7dc682e4 100644 --- a/packages/sdk/.drone.yml +++ b/packages/sdk/.drone.yml @@ -327,7 +327,7 @@ steps: - test:unit - name: subgraph-deploy - image: node:18.19 + image: node:20.18 environment: GRAPHNODE_URL: http://graphnode:8020 IPFS_URL: http://ipfs:5001 diff --git a/packages/sdk/src/lib/dataProtectorSharing/smartContract/getPocoContract.ts b/packages/sdk/src/lib/dataProtectorSharing/smartContract/getPocoContract.ts index 3277864c6..7152ea41f 100644 --- a/packages/sdk/src/lib/dataProtectorSharing/smartContract/getPocoContract.ts +++ b/packages/sdk/src/lib/dataProtectorSharing/smartContract/getPocoContract.ts @@ -1,9 +1,7 @@ import type { IExecModule } from 'iexec'; import type { IPoCo } from '../../../../generated/typechain/sharing/interfaces/IPoCo.js'; -export async function getPocoContract( - iexec: IExecModule -): Promise { +export async function getPocoContract(iexec: IExecModule): Promise { const client = await iexec.config.resolveContractsClient(); return client.getIExecContract() as unknown as IPoCo; } diff --git a/packages/sdk/tests/docker-compose.yml b/packages/sdk/tests/docker-compose.yml index 4c4457ccf..d0d719e60 100644 --- a/packages/sdk/tests/docker-compose.yml +++ b/packages/sdk/tests/docker-compose.yml @@ -229,6 +229,7 @@ services: condition: service_started environment: START_BLOCK: $BELLECOUR_FORK_BLOCK + NETWORK_NAME: bellecour GRAPHNODE_URL: http://graphnode:8020 IPFS_URL: http://ipfs:5001 ENV: prod diff --git a/packages/sdk/tests/test-utils.ts b/packages/sdk/tests/test-utils.ts index ddfaccfd1..7988a6bc7 100644 --- a/packages/sdk/tests/test-utils.ts +++ b/packages/sdk/tests/test-utils.ts @@ -49,8 +49,8 @@ export const getTestConfig = ( : 'http://127.0.0.1:8080', ipfsNode: process.env.DRONE ? 'http://ipfs:5001' : 'http://127.0.0.1:5001', subgraphUrl: process.env.DRONE - ? 'http://graphnode:8000/subgraphs/name/DataProtector-v2' - : 'http://127.0.0.1:8000/subgraphs/name/DataProtector-v2', + ? 'http://graphnode:8000/subgraphs/name/bellecour/DataProtector-v2' + : 'http://127.0.0.1:8000/subgraphs/name/bellecour/DataProtector-v2', }; return [ethProvider, options]; }; diff --git a/packages/subgraph/.drone.yml b/packages/subgraph/.drone.yml index 4b0e27bf6..d01c966b6 100644 --- a/packages/subgraph/.drone.yml +++ b/packages/subgraph/.drone.yml @@ -8,7 +8,7 @@ trigger: steps: - name: build-subgraph - image: node:18.19 + image: node:20.18 environment: ENV: prod commands: diff --git a/packages/subgraph/.env.template b/packages/subgraph/.env.template index cbdb25a36..67f8b2ee9 100644 --- a/packages/subgraph/.env.template +++ b/packages/subgraph/.env.template @@ -9,3 +9,6 @@ IPFS_URL=... # The version label for the deployment (e.g., v1.0.0) VERSION_LABEL=... + +# Start block number for local testing +START_BLOCK=... diff --git a/packages/subgraph/.gitignore b/packages/subgraph/.gitignore index 656d04ef7..88b67bd59 100644 --- a/packages/subgraph/.gitignore +++ b/packages/subgraph/.gitignore @@ -10,5 +10,5 @@ coverage.json # subgraph generated -subgraph.yaml tests/.latest.json +subgraph.yaml \ No newline at end of file diff --git a/packages/subgraph/.nvmrc b/packages/subgraph/.nvmrc new file mode 100644 index 000000000..10fef252a --- /dev/null +++ b/packages/subgraph/.nvmrc @@ -0,0 +1 @@ +20.18 diff --git a/packages/subgraph/config/env.ts b/packages/subgraph/config/env.ts index 9a53cc29c..c5b53f121 100644 --- a/packages/subgraph/config/env.ts +++ b/packages/subgraph/config/env.ts @@ -12,6 +12,14 @@ const envSchema = z.object({ IPFS_URL: z.string().url('IPFS_URL must be a valid URL').default('http://localhost:5001'), VERSION_LABEL: z.string().min(1, 'VERSION_LABEL is required').default('bellecour/poco-v5'), + + START_BLOCK: z + .string() + .transform((val) => parseInt(val, 10)) + .refine((val) => !isNaN(val) && val >= 0, { + message: 'START_BLOCK must be a valid non-negative integer', + }) + .or(z.undefined()), }); export const env = envSchema.parse(process.env); diff --git a/packages/subgraph/deployer.Dockerfile b/packages/subgraph/deployer.Dockerfile index 3c269024b..31d647aa2 100644 --- a/packages/subgraph/deployer.Dockerfile +++ b/packages/subgraph/deployer.Dockerfile @@ -1,4 +1,4 @@ -FROM node:18.19 +FROM node:20.18 RUN mkdir /app @@ -8,4 +8,4 @@ WORKDIR /app/packages/subgraph RUN npm ci -ENTRYPOINT [ "npm", "run", "all" ] \ No newline at end of file +ENTRYPOINT [ "npm", "run", "all" ] diff --git a/packages/subgraph/package-lock.json b/packages/subgraph/package-lock.json index c65192a30..9a3787419 100644 --- a/packages/subgraph/package-lock.json +++ b/packages/subgraph/package-lock.json @@ -18,13 +18,22 @@ "devDependencies": { "dotenv": "^16.5.0", "dotenv-cli": "^8.0.0", + "ethers": "^6.14.1", "prettier": "^3.2.5", + "tsx": "^4.19.4", "zod": "^3.24.3" } }, "../../environments": { "name": "@iexec/dataprotector-environments" }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -63,6 +72,431 @@ "@chainsafe/is-ip": "^2.0.1" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@fastify/busboy": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", @@ -1157,6 +1591,13 @@ } } }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -2036,6 +2477,47 @@ "es6-promise": "^4.0.3" } }, + "node_modules/esbuild": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2084,6 +2566,107 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/ethers": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.1.tgz", + "integrity": "sha512-JnFiPFi3sK2Z6y7jZ3qrafDMwiXmU+6cNZ0M+kPq+mTy9skqEzwqAdFW3nb/em2xjlIVXX6Lz8ID6i3LmS4+fQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -2371,6 +2954,21 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2444,6 +3042,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", @@ -4261,6 +4872,16 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -4712,6 +5333,26 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.19.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", + "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/packages/subgraph/package.json b/packages/subgraph/package.json index aa674b066..cd3b2468a 100644 --- a/packages/subgraph/package.json +++ b/packages/subgraph/package.json @@ -5,13 +5,14 @@ "scripts": { "format": "prettier --write \"(src|tests)/**/*.{ts,json}\"", "check-format": "prettier --check \"(src|tests)/**/*.ts|tests/**/*.ts\"", - "build": "dotenv -e .env -- graph codegen && graph build --network ${NETWORK_NAME:-bellecour}", + "codegen": "graph codegen subgraph.template.yaml", + "build": "dotenv -e .env -- sh -c 'graph codegen subgraph.template.yaml && graph build subgraph.template.yaml --network ${NETWORK_NAME:-bellecour}'", "deploy": "graph deploy --node https://api.thegraph.com/deploy/ DataProtector", - "create-local": "dotenv -e .env -- graph create --node ${GRAPHNODE_URL:-http://localhost:8020} ${NETWORK_NAME:-bellecour}/DataProtector-v2", - "remove-local": "dotenv -e .env -- graph remove --node ${GRAPHNODE_URL:-http://localhost:8020} ${NETWORK_NAME:-bellecour}/DataProtector-v2", - "deploy-local": "dotenv -e .env -- graph deploy --node ${GRAPHNODE_URL:-http://localhost:8020} --ipfs ${IPFS_URL:-http://localhost:5001} ${NETWORK_NAME:-bellecour}/DataProtector-v2 --version-label ${VERSION_LABEL:-dev}", + "create-local": "dotenv -e .env -- sh -c 'graph create ${NETWORK_NAME:-bellecour}/DataProtector-v2 --node ${GRAPHNODE_URL:-http://localhost:8020}'", + "remove-local": "dotenv -e .env -- sh -c 'graph remove ${NETWORK_NAME:-bellecour}/DataProtector-v2 --node ${GRAPHNODE_URL:-http://localhost:8020}'", + "deploy-local": "dotenv -e .env -- sh -c 'graph deploy ${NETWORK_NAME:-bellecour}/DataProtector-v2 subgraph.template.yaml --network ${NETWORK_NAME:-bellecour} --node ${GRAPHNODE_URL:-http://localhost:8020} --ipfs ${IPFS_URL:-http://localhost:5001} --version-label ${VERSION_LABEL:-dev}'", "clean": "rm -rf generated && rm -rf build", - "all": "npm run clean && npm run codegen && npm run build && npm run create-local && npm run deploy-local", + "all": " dotenv -e .env -- sh -c 'tsx ./test-stack/prepare-test-env.ts && npm run clean && npm run codegen && npm run create-local && npm run deploy-local'", "refresh-abis": "node tools/refreshAbis.mjs", "test": "graph test", "coverage": "graph test -- -c" @@ -24,9 +25,11 @@ "matchstick-as": "^0.6.0" }, "devDependencies": { - "prettier": "^3.2.5", "dotenv": "^16.5.0", "dotenv-cli": "^8.0.0", + "ethers": "^6.14.1", + "prettier": "^3.2.5", + "tsx": "^4.19.4", "zod": "^3.24.3" } } diff --git a/packages/subgraph/subgraph.template.yaml b/packages/subgraph/subgraph.template.yaml new file mode 100644 index 000000000..3a27a25c4 --- /dev/null +++ b/packages/subgraph/subgraph.template.yaml @@ -0,0 +1,166 @@ +specVersion: 0.0.6 +description: Subgraph for dataProtector smart contract +schema: + file: ./schema.graphql +dataSources: + - name: DataProtector + kind: ethereum/contract + source: + abi: DataProtector + address: "0x3a4Ab33F3D605e75b6D00A32A0Fa55C3628F6A59" + startBlock: 25455501 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - ProtectedData + - SchemaEntry + - Account + abis: + - name: Dataset + file: node_modules/@iexec/poco/build/contracts/Dataset.json + - name: DataProtector + file: ./abis/DataProtectorCoreABI.json + eventHandlers: + - event: DatasetSchema(indexed address,string) + handler: handleDatasetSchema + file: ./src/dataProtector.ts + network: bellecour + - name: DatasetRegistry + kind: ethereum/contract + source: + abi: DatasetRegistry + address: "0x0000000000000000000000000000000000000000" + startBlock: 25455501 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - ProtectedData + abis: + - name: Dataset + file: node_modules/@iexec/poco/build/contracts/Dataset.json + - name: DatasetRegistry + file: node_modules/@iexec/poco/build/contracts/DatasetRegistry.json + eventHandlers: + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleTransferDataset + file: ./src/datasetRegistry.ts + network: bellecour + - name: AppRegistry + kind: ethereum/contract + source: + abi: AppRegistry + address: "0x0000000000000000000000000000000000000000" + startBlock: 28566236 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - App + abis: + - name: App + file: node_modules/@iexec/poco/build/contracts/App.json + - name: AppRegistry + file: node_modules/@iexec/poco/build/contracts/AppRegistry.json + eventHandlers: + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleTransferApp + file: ./src/appRegistry.ts + network: bellecour + - name: DataProtectorSharing + kind: ethereum/contract + source: + abi: DataProtectorSharing + address: "0x1390c3c6a545198809F1C7c5Dd2600ef74D60925" + startBlock: 28566236 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - Account + - Collection + - SubscriptionParam + - CollectionSubscription + - Rental + - RentalParam + - Sale + - SaleParam + - Consumption + abis: + - name: DataProtectorSharing + file: ./abis/DataProtectorSharingABI.json + eventHandlers: + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleTransfer + - event: ProtectedDataTransfer(address,uint256,uint256,address) + handler: handleProtectedDataTransfer + - event: ProtectedDataConsumed(bytes32,address,uint8) + handler: handleProtectedDataConsumed + - event: NewSubscription(uint256,indexed address,uint48) + handler: handleNewSubscription + - event: NewSubscriptionParams(uint256,(uint72,uint40)) + handler: handleNewSubscriptionParams + - event: ProtectedDataAddedForSubscription(uint256,address) + handler: handleProtectedDataAddedForSubscription + - event: ProtectedDataRemovedFromSubscription(uint256,address) + handler: handleProtectedDataRemovedFromSubscription + - event: NewRental(uint256,address,address,uint48) + handler: handleNewRental + - event: ProtectedDataAddedForRenting(uint256,address,(uint72,uint40)) + handler: handleProtectedDataAddedForRenting + - event: ProtectedDataRemovedFromRenting(uint256,address) + handler: handleProtectedDataRemovedFromRenting + - event: ProtectedDataSold(uint256,address,address) + handler: handleProtectedDataSold + - event: ProtectedDataAddedForSale(uint256,address,uint72) + handler: handleProtectedDataAddedForSale + - event: ProtectedDataRemovedFromSale(uint256,address) + handler: handleProtectedDataRemovedFromSale + file: ./src/dataProtectorSharing.ts + network: bellecour + - name: AddOnlyAppWhitelistRegistry + kind: ethereum/contract + source: + abi: AddOnlyAppWhitelistRegistry + address: "0x498D324F711b8998Be81818742e268dEE30347c6" + startBlock: 28566234 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - AddOnlyAppWhitelist + abis: + - name: AddOnlyAppWhitelistRegistry + file: ./abis/AddOnlyAppWhitelistRegistryABI.json + eventHandlers: + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleNewAddOnlyAppWhitelist + file: ./src/addOnlyAppWhitelistRegistry.ts + network: bellecour +templates: + - kind: ethereum/contract + name: AddOnlyAppWhitelistTemplate + source: + abi: AddOnlyAppWhitelist + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - App + abis: + - name: AddOnlyAppWhitelist + file: ./abis/AddOnlyAppWhitelistABI.json + - name: App + file: node_modules/@iexec/poco/build/contracts/App.json + eventHandlers: + - event: NewAppAddedToAddOnlyAppWhitelist(address) + handler: handleNewAppAdded + file: ./src/addOnlyAppWhitelist.ts + network: bellecour diff --git a/packages/subgraph/test-stack/prepare-test-env.ts b/packages/subgraph/test-stack/prepare-test-env.ts new file mode 100644 index 000000000..94a79a137 --- /dev/null +++ b/packages/subgraph/test-stack/prepare-test-env.ts @@ -0,0 +1,79 @@ +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; +import { env } from '../config/env'; + +// Get current file directory in ESM +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +// Path to the networks.json file (one directory up) +const networksFilePath = join(__dirname, '..', 'networks.json'); + +/** + * Update networks.json file with the current block number + * @param {string} networkName - The network to update + * @param {number} startBlock - The block number to fork from + */ +async function updateNetworksFile({ + networkName, + startBlock, +}: { + networkName: string; + startBlock: number; +}) { + if (!existsSync(networksFilePath)) { + console.warn(`networks.json file not found at ${networksFilePath}`); + return; + } + + console.log(`Updating ${networksFilePath} for network '${networkName}'`); + + try { + // Read the current networks.json file + const networksData = JSON.parse(readFileSync(networksFilePath, 'utf8')); + + // Check if the specified network exists in the file + if (networksData[networkName]) { + console.log( + `Updating startBlock for network '${networkName}' to ${startBlock}` + ); + + // Update all startBlock values for the specified network + Object.keys(networksData[networkName]).forEach((contract) => { + networksData[networkName][contract].startBlock = startBlock; + }); + + // Write the updated networks.json file + writeFileSync(networksFilePath, JSON.stringify(networksData, null, 4)); + console.log(`Successfully updated ${networksFilePath}`); + } else { + console.warn( + `Network '${networkName}' not found in networks.json. File unchanged.` + ); + } + } catch (error) { + console.error(`Error updating networks.json file: ${error}`); + } +} + +/** + * Main function to orchestrate the process + */ +async function main() { + try { + if (env.NETWORK_NAME && env.START_BLOCK) { + await updateNetworksFile({ + networkName: env.NETWORK_NAME, + startBlock: env.START_BLOCK, + }); + } else { + console.log('nothing to update in networks'); + } + } catch (error) { + console.error(`Error in main process: ${error}`); + process.exit(1); + } +} + +main(); diff --git a/packages/subgraph/tsconfig.json b/packages/subgraph/tsconfig.json new file mode 100644 index 000000000..623c015a3 --- /dev/null +++ b/packages/subgraph/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "node", + "esModuleInterop": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +}