diff --git a/README.md b/README.md index bbda53333..b20b4203b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ deno install --allow-scripts && ./patch.sh # Build All Contracts deno task -r contract:compile -# If running on linux set env DISABLE_YACI=true # Run Example Deployment Mode deno task -f @e2e/node quickstart ``` diff --git a/deno.lock b/deno.lock index e58285b97..4541d663d 100644 --- a/deno.lock +++ b/deno.lock @@ -51,13 +51,14 @@ "jsr:@ts-morph/bootstrap@0.27": "0.27.0", "jsr:@ts-morph/common@0.27": "0.27.0", "npm:@aurowallet/mina-provider@^1.0.12": "1.0.12", + "npm:@bloxbean/yaci-devkit@*": "0.10.6", "npm:@cardano-foundation/cardano-verify-datasignature@1.0.11": "1.0.11", "npm:@cardano-sdk/core@~0.46.11": "0.46.12_rxjs@7.8.2", "npm:@cardano-sdk/util@~0.17.1": "0.17.1", "npm:@coderspirit/nominal@^4.1.1": "4.1.1_typescript@5.6.3", "npm:@dcspark/carp-client@^3.3.0": "3.3.0", "npm:@dcspark/cip34-js@3.0.1": "3.0.1", - "npm:@deno/vite-plugin@^1.0.4": "1.0.6_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", + "npm:@deno/vite-plugin@^1.0.4": "1.0.6_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0", "npm:@docusaurus/core@3.8.1": "3.8.1_@mdx-js+react@3.1.1__@types+react@18.3.1__react@18.3.1_react@18.3.1_react-dom@18.3.1__react@18.3.1_@types+react@18.3.1_webpack@5.104.1__acorn@8.15.0_react-router@5.3.4__react@18.3.1_typescript@5.6.3", "npm:@docusaurus/module-type-aliases@3.8.1": "3.8.1_react@18.3.1_react-dom@18.3.1__react@18.3.1", "npm:@docusaurus/plugin-client-redirects@3.8.1": "3.8.1_react@18.3.1_react-dom@18.3.1__react@18.3.1_@mdx-js+react@3.1.1__@types+react@18.3.1__react@18.3.1_@types+react@18.3.1_typescript@5.6.3", @@ -133,7 +134,8 @@ "npm:@sinclair/typebox@*": "0.34.41", "npm:@sinclair/typebox@0.34.41": "0.34.41", "npm:@subsquid/ss58-codec@^1.2.3": "1.2.3", - "npm:@txpipe/dolos@0.19.1": "0.19.1", + "npm:@txpipe/dolos@*": "1.0.0-rc.10", + "npm:@txpipe/dolos@1.0.0-rc.10": "1.0.0-rc.10", "npm:@types/node@*": "24.2.0", "npm:@types/react@18.3.1": "18.3.1", "npm:@types/react@19.1.0": "19.1.0", @@ -141,7 +143,7 @@ "npm:@types/semver@7.7.1": "7.7.1", "npm:@utxorpc/sdk@0.8": "0.8.0_@connectrpc+connect@1.4.0__@bufbuild+protobuf@1.10.1", "npm:@utxorpc/spec@~0.18.1": "0.18.1", - "npm:@vitejs/plugin-react@^4.4.1": "4.7.0_vite@7.1.3__picomatch@4.0.3_@babel+core@7.29.0_@types+node@24.2.0", + "npm:@vitejs/plugin-react@^4.4.1": "4.7.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@babel+core@7.29.0_@types+node@24.2.0", "npm:@wagmi/cli@2.3.1": "2.3.1_typescript@5.6.3_zod@3.25.76_esbuild@0.25.12_picomatch@3.0.1", "npm:@xhmikosr/bin-wrapper@5": "5.0.1", "npm:@xhmikosr/bin-wrapper@^13.2.0": "13.2.0", @@ -230,13 +232,13 @@ "npm:viem@2.23.10": "2.23.10_typescript@5.6.3_ws@8.18.1", "npm:viem@2.37.3": "2.37.3_typescript@5.6.3_ws@8.18.3__bufferutil@4.1.0__utf-8-validate@5.0.10", "npm:viem@^2.21.3": "2.45.2_typescript@5.6.3_ws@8.18.3__bufferutil@4.1.0__utf-8-validate@5.0.10", - "npm:vite-plugin-node-stdlib-browser@*": "0.2.1_node-stdlib-browser@1.3.1_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", - "npm:vite-plugin-static-copy@^3.1.1": "3.2.0_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", - "npm:vite-plugin-top-level-await@^1.6.0": "1.6.0_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", - "npm:vite-plugin-wasm@^3.5.0": "3.5.0_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", - "npm:vite@*": "7.1.3_picomatch@4.0.3_@types+node@24.2.0", - "npm:vite@7.1.3": "7.1.3_picomatch@4.0.3_@types+node@24.2.0", - "npm:vitest@^3.2.4": "3.2.4_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", + "npm:vite-plugin-node-stdlib-browser@*": "0.2.1_node-stdlib-browser@1.3.1_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0", + "npm:vite-plugin-static-copy@^3.1.1": "3.2.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0", + "npm:vite-plugin-top-level-await@^1.6.0": "1.6.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0", + "npm:vite-plugin-wasm@^3.5.0": "3.5.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0", + "npm:vite@*": "7.1.3_@types+node@24.2.0_picomatch@4.0.3", + "npm:vite@7.1.3": "7.1.3_@types+node@24.2.0_picomatch@4.0.3", + "npm:vitest@^3.2.4": "3.2.4_@types+node@24.2.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3", "npm:wagmi@^2.16.9": "2.19.5_@tanstack+react-query@5.90.20__react@18.3.1_react@18.3.1_typescript@5.6.3_viem@2.23.10__typescript@5.6.3__ws@8.18.1_@wagmi+core@2.22.1__typescript@5.6.3__viem@2.23.10___typescript@5.6.3___ws@8.18.1__@types+react@18.3.1__react@18.3.1__use-sync-external-store@1.4.0___react@18.3.1_@types+react@18.3.1_use-sync-external-store@1.4.0__react@18.3.1", "npm:wait-on@8.0.3": "8.0.3", "npm:web3-utils@^4.3.3": "4.3.3", @@ -1571,6 +1573,22 @@ "uint8arrays@5.1.0" ] }, + "@bloxbean/yaci-devkit-linux-x64@0.10.6": { + "integrity": "sha512-etXqT0oK6c/xsMXgq3hQXTcBA/x6G6LzenE3FHS7AeNwERihuIOwdUxlUYI6QP+QZBRDKk98+sD7HBR3I0x1vQ==", + "bin": true + }, + "@bloxbean/yaci-devkit-macos-arm64@0.10.6": { + "integrity": "sha512-jIq/KC3OXg/a8i7s0M+tu+0JeFBwzPfUSoKs6w1tCmAC/zSK5JBWw63HxfD9Z7GH1ClJjkwuOh27EaWxcrWiGQ==", + "bin": true + }, + "@bloxbean/yaci-devkit@0.10.6": { + "integrity": "sha512-TTQVnhlcouKTqws1FlEBuGuMVgmtFNGFNUezonbl1u2p260iYMyfHNuU2WwBEr7znsThk+Wa4OlTMSzU2VGQ8w==", + "dependencies": [ + "@bloxbean/yaci-devkit-linux-x64", + "@bloxbean/yaci-devkit-macos-arm64" + ], + "bin": true + }, "@borewit/text-codec@0.2.1": { "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==" }, @@ -2185,16 +2203,10 @@ "@dcspark/cip34-js@3.0.1": { "integrity": "sha512-xUChOH4fDAuAPImnRQs/5XXzBF6oWeLsRcwjjL5mFC2CXFAxhJrOavijQpbl67IcYUypOVSLg+8c2FCJonfH3Q==" }, - "@deno/vite-plugin@1.0.6_vite@7.1.3__picomatch@4.0.3": { - "integrity": "sha512-Sh5XqvFuKAwjARTesi0n6xRpEXm1V0UeqKh+SxIrexCofxOaieNDMqXZD02RiZCg0mrJ43V8eCMuVrDfq6mLmg==", - "dependencies": [ - "vite@7.1.3_picomatch@4.0.3" - ] - }, - "@deno/vite-plugin@1.0.6_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { + "@deno/vite-plugin@1.0.6_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0": { "integrity": "sha512-Sh5XqvFuKAwjARTesi0n6xRpEXm1V0UeqKh+SxIrexCofxOaieNDMqXZD02RiZCg0mrJ43V8eCMuVrDfq6mLmg==", "dependencies": [ - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" + "vite" ] }, "@discoveryjs/json-ext@0.5.7": { @@ -3353,7 +3365,7 @@ "content-disposition@1.0.1", "fastify-plugin", "fastq", - "glob@13.0.1" + "glob@13.0.6" ] }, "@fastify/swagger-ui@5.2.5": { @@ -3443,15 +3455,6 @@ "mlly" ] }, - "@isaacs/balanced-match@4.0.1": { - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==" - }, - "@isaacs/brace-expansion@5.0.1": { - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "dependencies": [ - "@isaacs/balanced-match" - ] - }, "@isaacs/cliui@8.0.2": { "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": [ @@ -3466,12 +3469,6 @@ "@isaacs/cliui@9.0.0": { "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==" }, - "@isaacs/fs-minipass@4.0.1": { - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dependencies": [ - "minipass@7.1.2" - ] - }, "@jest/schemas@29.6.3": { "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": [ @@ -3484,7 +3481,7 @@ "@jest/schemas", "@types/istanbul-lib-coverage", "@types/istanbul-reports", - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/yargs", "chalk@4.1.2" ] @@ -5439,7 +5436,7 @@ "glob@11.1.0", "io-ts", "io-ts-reporters", - "minimatch@10.1.2", + "minimatch@10.2.2", "nunjucks", "pascal-case@4.0.0", "piscina", @@ -7650,15 +7647,14 @@ "@trysound/sax@0.2.0": { "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, - "@txpipe/dolos@0.19.1": { - "integrity": "sha512-7CPaD60U4ah4fLIywNRUJ00SfvbvQSmS0oQCDkSPgWYpu5fSSjNiGRT0DKiITaFFBVHIQgqcchlDDi3fmnXl2g==", + "@txpipe/dolos@1.0.0-rc.10": { + "integrity": "sha512-jR/Jv9xtuVwNVtkhmgyrgIjEwxNBg+liIga3DhG/Upi5AUxs9pCqxvbOKxXRGE95cGNYfCh5C/NyzSvK03HIeg==", "dependencies": [ "axios@1.13.5", "axios-proxy-builder", "console.table", "detect-libc", - "rimraf@5.0.10", - "tar@7.5.7" + "rimraf@6.1.3" ], "scripts": true, "bin": true @@ -7704,26 +7700,26 @@ "@types/bn.js@5.2.0": { "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/body-parser@1.19.6": { "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dependencies": [ "@types/connect", - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/bonjour@3.5.13": { "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/bunyan@1.8.9": { "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/cacheable-request@6.0.3": { @@ -7731,7 +7727,7 @@ "dependencies": [ "@types/http-cache-semantics", "@types/keyv", - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/responselike" ] }, @@ -7746,13 +7742,13 @@ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dependencies": [ "@types/express-serve-static-core", - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/connect@3.4.36": { "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/d3-array@3.2.2": { @@ -7930,7 +7926,7 @@ "@types/docker-modem@3.0.6": { "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/ssh2" ] }, @@ -7938,7 +7934,7 @@ "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==", "dependencies": [ "@types/docker-modem", - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/ssh2" ] }, @@ -7975,7 +7971,7 @@ "@types/express-serve-static-core@4.19.8": { "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/qs", "@types/range-parser", "@types/send" @@ -8017,7 +8013,7 @@ "@types/http-proxy@1.17.17": { "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/istanbul-lib-coverage@2.0.6": { @@ -8047,7 +8043,7 @@ "@types/keyv@3.1.4": { "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/lodash@4.17.23": { @@ -8065,7 +8061,7 @@ "@types/memcached@2.2.10": { "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/mime@1.3.5": { @@ -8077,13 +8073,13 @@ "@types/mysql@2.15.26": { "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/node-forge@1.3.14": { "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/node@12.20.55": { @@ -8116,7 +8112,7 @@ "@types/pg@8.6.1": { "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "pg-protocol", "pg-types" ] @@ -8178,13 +8174,13 @@ "@types/readable-stream@4.0.23": { "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/responselike@1.0.3": { "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/retry@0.12.0": { @@ -8193,7 +8189,7 @@ "@types/sax@1.2.7": { "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/semver@7.7.1": { @@ -8203,7 +8199,7 @@ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dependencies": [ "@types/mime", - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/serve-index@1.9.4": { @@ -8216,7 +8212,7 @@ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dependencies": [ "@types/http-errors", - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/send" ] }, @@ -8226,26 +8222,26 @@ "@types/sockjs@0.3.36": { "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/ssh2-streams@0.1.13": { "integrity": "sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/ssh2@0.5.52": { "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "@types/ssh2-streams" ] }, "@types/tedious@4.0.14": { "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/trusted-types@2.0.7": { @@ -8263,19 +8259,19 @@ "@types/ws@7.4.7": { "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/ws@8.18.1": { "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/ws@8.5.3": { "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@types/yargs-parser@21.0.3": { @@ -8290,7 +8286,7 @@ "@types/yauzl@2.10.3": { "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dependencies": [ - "@types/node@22.7.5" + "@types/node@24.2.0" ] }, "@ungap/structured-clone@1.3.0": { @@ -8312,19 +8308,7 @@ "@bufbuild/protobuf" ] }, - "@vitejs/plugin-react@4.7.0_vite@7.1.3__picomatch@4.0.3_@babel+core@7.29.0": { - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dependencies": [ - "@babel/core", - "@babel/plugin-transform-react-jsx-self", - "@babel/plugin-transform-react-jsx-source", - "@rolldown/pluginutils", - "@types/babel__core", - "react-refresh", - "vite@7.1.3_picomatch@4.0.3" - ] - }, - "@vitejs/plugin-react@4.7.0_vite@7.1.3__picomatch@4.0.3_@babel+core@7.29.0_@types+node@24.2.0": { + "@vitejs/plugin-react@4.7.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@babel+core@7.29.0_@types+node@24.2.0": { "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dependencies": [ "@babel/core", @@ -8333,7 +8317,7 @@ "@rolldown/pluginutils", "@types/babel__core", "react-refresh", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" + "vite" ] }, "@vitest/expect@3.2.4": { @@ -8346,28 +8330,16 @@ "tinyrainbow" ] }, - "@vitest/mocker@3.2.4_vite@7.1.3__picomatch@4.0.3": { + "@vitest/mocker@3.2.4_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0": { "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dependencies": [ "@vitest/spy", "estree-walker@3.0.3", "magic-string", - "vite@7.1.3_picomatch@4.0.3" + "vite" ], "optionalPeers": [ - "vite@7.1.3_picomatch@4.0.3" - ] - }, - "@vitest/mocker@3.2.4_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dependencies": [ - "@vitest/spy", - "estree-walker@3.0.3", - "magic-string", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" - ], - "optionalPeers": [ - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" + "vite" ] }, "@vitest/pretty-format@3.2.4": { @@ -9720,6 +9692,9 @@ "balanced-match@1.0.2": { "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "balanced-match@4.0.4": { + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" + }, "bare-events@2.8.2": { "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==" }, @@ -10016,14 +9991,20 @@ "brace-expansion@1.1.12": { "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": [ - "balanced-match", + "balanced-match@1.0.2", "concat-map" ] }, "brace-expansion@2.0.2": { "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dependencies": [ - "balanced-match" + "balanced-match@1.0.2" + ] + }, + "brace-expansion@5.0.3": { + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dependencies": [ + "balanced-match@4.0.4" ] }, "braces@3.0.3": { @@ -10482,9 +10463,6 @@ "chownr@2.0.0": { "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "chownr@3.0.0": { - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, "chrome-trace-event@1.0.4": { "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==" }, @@ -12215,7 +12193,7 @@ "eval@0.1.8": { "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "require-like" ] }, @@ -12879,7 +12857,7 @@ "foreground-child", "jackspeak@3.4.3", "minimatch@9.0.5", - "minipass@7.1.2", + "minipass@7.1.3", "package-json-from-dist", "path-scurry@1.11.1" ], @@ -12891,20 +12869,20 @@ "dependencies": [ "foreground-child", "jackspeak@4.2.3", - "minimatch@10.1.2", - "minipass@7.1.2", + "minimatch@10.2.2", + "minipass@7.1.3", "package-json-from-dist", - "path-scurry@2.0.1" + "path-scurry@2.0.2" ], "deprecated": true, "bin": true }, - "glob@13.0.1": { - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "glob@13.0.6": { + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dependencies": [ - "minimatch@10.1.2", - "minipass@7.1.2", - "path-scurry@2.0.1" + "minimatch@10.2.2", + "minipass@7.1.3", + "path-scurry@2.0.2" ] }, "glob@7.2.3": { @@ -14026,7 +14004,7 @@ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": [ "@jest/types", - "@types/node@22.7.5", + "@types/node@24.2.0", "chalk@4.1.2", "ci-info", "graceful-fs@4.2.11", @@ -14036,7 +14014,7 @@ "jest-worker@27.5.1": { "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "merge-stream", "supports-color@8.1.1" ] @@ -14044,7 +14022,7 @@ "jest-worker@29.7.0": { "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": [ - "@types/node@22.7.5", + "@types/node@24.2.0", "jest-util", "merge-stream", "supports-color@8.1.1" @@ -15260,10 +15238,10 @@ "minimalistic-crypto-utils@1.0.1": { "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, - "minimatch@10.1.2": { - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", + "minimatch@10.2.2": { + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dependencies": [ - "@isaacs/brace-expansion" + "brace-expansion@5.0.3" ] }, "minimatch@3.1.2": { @@ -15296,8 +15274,8 @@ "minipass@5.0.0": { "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" }, - "minipass@7.1.2": { - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + "minipass@7.1.3": { + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==" }, "minizlib@2.1.2": { "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", @@ -15306,12 +15284,6 @@ "yallist@4.0.0" ] }, - "minizlib@3.1.0": { - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dependencies": [ - "minipass@7.1.2" - ] - }, "mipd@0.0.7_typescript@5.6.3": { "integrity": "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==", "dependencies": [ @@ -16164,14 +16136,14 @@ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": [ "lru-cache@10.4.3", - "minipass@7.1.2" + "minipass@7.1.3" ] }, - "path-scurry@2.0.1": { - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "path-scurry@2.0.2": { + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dependencies": [ "lru-cache@11.2.5", - "minipass@7.1.2" + "minipass@7.1.3" ] }, "path-to-regexp@0.1.12": { @@ -17158,7 +17130,7 @@ "@protobufjs/path", "@protobufjs/pool", "@protobufjs/utf8", - "@types/node@22.7.5", + "@types/node@24.2.0", "long" ], "scripts": true @@ -17822,6 +17794,14 @@ ], "bin": true }, + "rimraf@6.1.3": { + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "dependencies": [ + "glob@13.0.6", + "package-json-from-dist" + ], + "bin": true + }, "ripemd160@2.0.3": { "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "dependencies": [ @@ -18773,23 +18753,12 @@ "chownr@2.0.0", "fs-minipass", "minipass@5.0.0", - "minizlib@2.1.2", + "minizlib", "mkdirp", "yallist@4.0.0" ], "deprecated": true }, - "tar@7.5.7": { - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", - "dependencies": [ - "@isaacs/fs-minipass", - "chownr@3.0.0", - "minipass@7.1.2", - "minizlib@3.1.0", - "yallist@5.0.0" - ], - "deprecated": true - }, "terser-webpack-plugin@5.3.16_webpack@5.104.1__acorn@8.15.0": { "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dependencies": [ @@ -19592,17 +19561,6 @@ "typescript" ] }, - "vite-node@3.2.4": { - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dependencies": [ - "cac", - "debug@4.4.3", - "es-module-lexer@1.7.0", - "pathe@2.0.3", - "vite@7.1.3_picomatch@4.0.3" - ], - "bin": true - }, "vite-node@3.2.4_@types+node@24.2.0": { "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dependencies": [ @@ -19610,94 +19568,45 @@ "debug@4.4.3", "es-module-lexer@1.7.0", "pathe@2.0.3", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" + "vite" ], "bin": true }, - "vite-plugin-node-stdlib-browser@0.2.1_node-stdlib-browser@1.3.1_vite@7.1.3__picomatch@4.0.3": { - "integrity": "sha512-6u2i613Dkqj5KaTNIrnZvE6y3/awWAp0S5TjucTvGxdhetftB1Mgvblc+nwYzlw6sntPlac8UOC7ttXNh+LZKA==", - "dependencies": [ - "@rollup/plugin-inject", - "node-stdlib-browser", - "vite@7.1.3_picomatch@4.0.3" - ] - }, - "vite-plugin-node-stdlib-browser@0.2.1_node-stdlib-browser@1.3.1_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { + "vite-plugin-node-stdlib-browser@0.2.1_node-stdlib-browser@1.3.1_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0": { "integrity": "sha512-6u2i613Dkqj5KaTNIrnZvE6y3/awWAp0S5TjucTvGxdhetftB1Mgvblc+nwYzlw6sntPlac8UOC7ttXNh+LZKA==", "dependencies": [ "@rollup/plugin-inject", "node-stdlib-browser", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" + "vite" ] }, - "vite-plugin-static-copy@3.2.0_vite@7.1.3__picomatch@4.0.3": { + "vite-plugin-static-copy@3.2.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0": { "integrity": "sha512-g2k9z8B/1Bx7D4wnFjPLx9dyYGrqWMLTpwTtPHhcU+ElNZP2O4+4OsyaficiDClus0dzVhdGvoGFYMJxoXZ12Q==", "dependencies": [ "chokidar@3.6.0", "p-map@7.0.4", "picocolors", "tinyglobby", - "vite@7.1.3_picomatch@4.0.3" + "vite" ] }, - "vite-plugin-static-copy@3.2.0_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { - "integrity": "sha512-g2k9z8B/1Bx7D4wnFjPLx9dyYGrqWMLTpwTtPHhcU+ElNZP2O4+4OsyaficiDClus0dzVhdGvoGFYMJxoXZ12Q==", - "dependencies": [ - "chokidar@3.6.0", - "p-map@7.0.4", - "picocolors", - "tinyglobby", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" - ] - }, - "vite-plugin-top-level-await@1.6.0_vite@7.1.3__picomatch@4.0.3": { + "vite-plugin-top-level-await@1.6.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0": { "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", "dependencies": [ "@rollup/plugin-virtual", "@swc/core", "@swc/wasm", "uuid@10.0.0", - "vite@7.1.3_picomatch@4.0.3" + "vite" ] }, - "vite-plugin-top-level-await@1.6.0_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { - "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", - "dependencies": [ - "@rollup/plugin-virtual", - "@swc/core", - "@swc/wasm", - "uuid@10.0.0", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" - ] - }, - "vite-plugin-wasm@3.5.0_vite@7.1.3__picomatch@4.0.3": { + "vite-plugin-wasm@3.5.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3_@types+node@24.2.0": { "integrity": "sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==", "dependencies": [ - "vite@7.1.3_picomatch@4.0.3" + "vite" ] }, - "vite-plugin-wasm@3.5.0_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { - "integrity": "sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==", - "dependencies": [ - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0" - ] - }, - "vite@7.1.3_picomatch@4.0.3": { - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", - "dependencies": [ - "esbuild@0.25.12", - "fdir@6.5.0_picomatch@4.0.3", - "picomatch@4.0.3", - "postcss", - "rollup", - "tinyglobby" - ], - "optionalDependencies": [ - "fsevents" - ], - "bin": true - }, - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0": { + "vite@7.1.3_@types+node@24.2.0_picomatch@4.0.3": { "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", "dependencies": [ "@types/node@24.2.0", @@ -19716,42 +19625,13 @@ ], "bin": true }, - "vitest@3.2.4_vite@7.1.3__picomatch@4.0.3": { - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dependencies": [ - "@types/chai", - "@vitest/expect", - "@vitest/mocker@3.2.4_vite@7.1.3__picomatch@4.0.3", - "@vitest/pretty-format", - "@vitest/runner", - "@vitest/snapshot", - "@vitest/spy", - "@vitest/utils", - "chai", - "debug@4.4.3", - "expect-type", - "magic-string", - "pathe@2.0.3", - "picomatch@4.0.3", - "std-env", - "tinybench", - "tinyexec@0.3.2", - "tinyglobby", - "tinypool", - "tinyrainbow", - "vite@7.1.3_picomatch@4.0.3", - "vite-node@3.2.4", - "why-is-node-running" - ], - "bin": true - }, - "vitest@3.2.4_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0": { + "vitest@3.2.4_@types+node@24.2.0_vite@7.1.3__@types+node@24.2.0__picomatch@4.0.3": { "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dependencies": [ "@types/chai", "@types/node@24.2.0", "@vitest/expect", - "@vitest/mocker@3.2.4_vite@7.1.3__picomatch@4.0.3_@types+node@24.2.0", + "@vitest/mocker", "@vitest/pretty-format", "@vitest/runner", "@vitest/snapshot", @@ -19769,8 +19649,8 @@ "tinyglobby", "tinypool", "tinyrainbow", - "vite@7.1.3_picomatch@4.0.3_@types+node@24.2.0", - "vite-node@3.2.4_@types+node@24.2.0", + "vite", + "vite-node", "why-is-node-running" ], "optionalPeers": [ @@ -20499,9 +20379,6 @@ "yallist@4.0.0": { "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yallist@5.0.0": { - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - }, "yaml@2.8.2": { "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "bin": true @@ -20780,7 +20657,7 @@ "e2e/shared/contracts/cardano": { "dependencies": [ "jsr:@std/toml@*", - "npm:@txpipe/dolos@0.19.1" + "npm:@txpipe/dolos@1.0.0-rc.10" ], "packageJson": { "dependencies": [ @@ -20914,13 +20791,6 @@ ] } }, - "packages/binaries/compactc": { - "packageJson": { - "dependencies": [ - "npm:@xhmikosr/bin-wrapper@5" - ] - } - }, "packages/binaries/grafana-alloy": { "packageJson": { "dependencies": [ @@ -21212,45 +21082,6 @@ "npm:web3@^4.16.0" ] }, - "packages/effectstream-sdk/wallets/npm": { - "packageJson": { - "dependencies": [ - "npm:@aurowallet/mina-provider@^1.0.12", - "npm:@cardano-foundation/cardano-verify-datasignature@1.0.11", - "npm:@coderspirit/nominal@^4.1.1", - "npm:@foxglove/crc@^1.0.1", - "npm:@metamask/providers@^22.1.0", - "npm:@midnight-ntwrk/dapp-connector-api@4.0.0", - "npm:@perawallet/connect@^1.4.2", - "npm:@polkadot/extension-dapp@~0.58.10", - "npm:@polkadot/extension-inject@~0.58.10", - "npm:@polkadot/util-crypto@^13.4.3", - "npm:@polkadot/util@^13.4.3", - "npm:@sinclair/typebox@0.34.41", - "npm:@subsquid/ss58-codec@^1.2.3", - "npm:abitype@1.1.0", - "npm:algosdk@^3.4.0", - "npm:assert-never@^1.4.0", - "npm:avail-js-sdk@~0.4.2", - "npm:bech32@2", - "npm:bs58@6", - "npm:bs58check@4", - "npm:effection@^3.5.0", - "npm:ethers@^6.15.0", - "npm:hi-base32@~0.5.1", - "npm:js-base64@^3.7.7", - "npm:js-sha3@~0.9.3", - "npm:js-sha512@0.9", - "npm:mina-signer@^3.0.7", - "npm:mqtt-pattern@^2.1.0", - "npm:mqtt@^5.14.0", - "npm:semver@^7.7.3", - "npm:viem@2.37.3", - "npm:web3-utils@^4.3.3", - "npm:web3@^4.16.0" - ] - } - }, "packages/node-sdk/db": { "dependencies": [ "npm:@pgtyped/parser@2.4.2", diff --git a/docs/site/docs/home/1200-templates/1202-wallets.md b/docs/site/docs/home/1200-templates/1202-wallets.md index 3562dd296..f3dae2838 100644 --- a/docs/site/docs/home/1200-templates/1202-wallets.md +++ b/docs/site/docs/home/1200-templates/1202-wallets.md @@ -31,7 +31,6 @@ deno install --allow-scripts && ./patch.sh deno task -f @e2e/evm-contracts build deno task -f @e2e/evm-contracts deploy:standalone deno task -f @e2e/midnight-contracts midnight-contract:compile -# If running on linux set env DISABLE_YACI=true deno task -f @e2e/node dev ``` In another terminal, run the demo: diff --git a/docs/site/docs/home/200-chains/203-cardano.md b/docs/site/docs/home/200-chains/203-cardano.md index 00e290965..cf6093d87 100644 --- a/docs/site/docs/home/200-chains/203-cardano.md +++ b/docs/site/docs/home/200-chains/203-cardano.md @@ -27,7 +27,7 @@ Effectstream supports syncing via **UTXO-RPC** (using Dolos/Yaci) or **Carp**. name: "parallelUtxoRpc", type: ConfigSyncProtocolType.CARDANO_UTXORPC_PARALLEL, rpcUrl: "http://127.0.0.1:50051", // UTXO-RPC endpoint - startSlot: 1, + startChainPoint: { slot: 1, hash: "abc123..." }, // slot and block hash to start syncing from }) ) ``` diff --git a/e2e/client/node/deno.json b/e2e/client/node/deno.json index f4af36362..bba2567a9 100644 --- a/e2e/client/node/deno.json +++ b/e2e/client/node/deno.json @@ -18,7 +18,8 @@ "clean_binaries": "cd ../../../packages/binaries/midnight-node && npm run clean && cd ../midnight-indexer && npm run clean && cd ../midnight-proof-server && npm run clean", "quickstart": "deno task -f @effectstream/tui clean && EFFECTSTREAM_ENV=quickstart NODE_ENV=development MIDNIGHT_STORAGE_PASSWORD=yourpasswordmypassword deno run -A --check --unstable-raw-imports scripts/start.quickstart.ts", "e2e": "EFFECTSTREAM_ENV=e2e deno run -A --unstable-raw-imports --check scripts/start.e2e.ts", - "testnet": "EFFECTSTREAM_ENV=testnet deno run -A --unstable-raw-imports --check scripts/start.testnet.ts" + "testnet": "EFFECTSTREAM_ENV=testnet deno run -A --unstable-raw-imports --check scripts/start.testnet.ts", + "cardano-midnight": "DISABLE_EVM=true DISABLE_AVAIL=true DISABLE_BITCOIN=true EFFECTSTREAM_ENV=e2e MIDNIGHT_STORAGE_PASSWORD=yourpasswordmypassword deno run -A --unstable-raw-imports --check scripts/start.cardano-midnight.ts" }, "imports": { "pg": "npm:pg@^8.14.0", diff --git a/e2e/client/node/e2e-tests/e2e.migrations.ts b/e2e/client/node/e2e-tests/e2e.migrations.ts index 11f3d01f6..0394a1448 100644 --- a/e2e/client/node/e2e-tests/e2e.migrations.ts +++ b/e2e/client/node/e2e-tests/e2e.migrations.ts @@ -6,7 +6,7 @@ const evm_enabled = !ENV.getBoolean("DISABLE_EVM"); const midnight_enabled = !ENV.getBoolean("DISABLE_MIDNIGHT"); const avail_enabled = !ENV.getBoolean("DISABLE_AVAIL"); const bitcoin_enabled = !ENV.getBoolean("DISABLE_BITCOIN"); -const yaci_enabled = false; //!ENV.getBoolean("DISABLE_YACI"); +const cardano_enabled = !ENV.getBoolean("DISABLE_CARDANO"); export async function testMigrations(db: Client) { const version = await safeQuery<{ @@ -51,7 +51,7 @@ export async function testMigrations(db: Client) { expectedMigrations += 5; // 5 dynamic tables } - if (!midnight_enabled && !avail_enabled && !bitcoin_enabled && !yaci_enabled && !evm_enabled) { + if (!midnight_enabled && !avail_enabled && !bitcoin_enabled && !cardano_enabled && !evm_enabled) { // if no other chain is enabled, then we might hit this code before blocks are generated. // So we know between 5 and 8 migration are expected. assert( diff --git a/e2e/client/node/scripts/start.cardano-midnight.ts b/e2e/client/node/scripts/start.cardano-midnight.ts new file mode 100644 index 000000000..dbd0809b4 --- /dev/null +++ b/e2e/client/node/scripts/start.cardano-midnight.ts @@ -0,0 +1,34 @@ +import { + OrchestratorConfig, + start, +} from "@effectstream/orchestrator"; +import { ComponentNames } from "@effectstream/log"; +import { Value } from "@sinclair/typebox/value"; +import { launchCardano } from "@effectstream/orchestrator/start-cardano"; +import { launchMidnight } from "@effectstream/orchestrator/start-midnight"; +import { ENV } from "@effectstream/utils/node-env"; + +const logs = ENV.getBoolean("EFFECTSTREAM_STDOUT") ? "stdout" : "development"; +const external_db_enabled = ENV.getBoolean("EXTERNAL_DB_ENABLED"); + +const cardano_processes = launchCardano("@e2e/cardano-contracts"); +const midnight_processes = launchMidnight("@e2e/midnight-contracts"); + +const config = Value.Parse(OrchestratorConfig, { + logs, + processes: { + [ComponentNames.TMUX]: logs === "development", + [ComponentNames.TUI]: logs === "development", + [ComponentNames.EFFECTSTREAM_PGLITE]: !external_db_enabled, + [ComponentNames.COLLECTOR]: true, + }, + + packageName: "@effectstream", + + processesToLaunch: [ + ...cardano_processes, + ...midnight_processes, + ], +}); + +await start(config); diff --git a/e2e/client/node/scripts/start.e2e.ts b/e2e/client/node/scripts/start.e2e.ts index 5bd5b1d23..91de487df 100644 --- a/e2e/client/node/scripts/start.e2e.ts +++ b/e2e/client/node/scripts/start.e2e.ts @@ -32,7 +32,7 @@ const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); const external_db_enabled = ENV.getBoolean("EXTERNAL_DB_ENABLED"); const evm_enabled = !ENV.getBoolean("DISABLE_EVM"); -const yaci_enabled = false; //!ENV.getBoolean("DISABLE_YACI") +const cardano_enabled = !ENV.getBoolean("DISABLE_CARDANO"); const midnight_enabled = !ENV.getBoolean("DISABLE_MIDNIGHT"); const avail_enabled = !ENV.getBoolean("DISABLE_AVAIL"); const bitcoin_enabled = !ENV.getBoolean("DISABLE_BITCOIN"); @@ -72,7 +72,7 @@ if (bitcoin_enabled) { lastProcess = bitcoin_processes[bitcoin_processes.length - 1].name; } -if (yaci_enabled) { +if (cardano_enabled) { cardano_processes = launchCardano("@e2e/cardano-contracts"); // TODO Cardano processes are skipped if the dependencies are not met. if (cardano_processes.length > 0) { @@ -130,7 +130,7 @@ export async function startup(): Promise { evm_enabled ? ComponentNames.DEPLOY_EVM_CONTRACTS : undefined, midnight_enabled ? ComponentNames.MIDNIGHT_CONTRACT : undefined, avail_enabled ? ComponentNames.AVAIL_CLIENT_WAIT : undefined, - yaci_enabled ? ComponentNames.DOLOS_WAIT : undefined, + cardano_enabled ? ComponentNames.DOLOS_WAIT : undefined, bitcoin_enabled ? ComponentNames.BITCOIN_WAIT_FOR_BLOCK : undefined, ].filter(Boolean), }, @@ -141,7 +141,7 @@ export async function startup(): Promise { dependsOn: [ is_serial ? lastProcess : undefined, 'batcher', - (yaci_enabled && cardano_processes.length > 0) ? ComponentNames.DOLOS_WAIT : undefined, + (cardano_enabled && cardano_processes.length > 0) ? ComponentNames.DOLOS_WAIT : undefined, avail_enabled ? ComponentNames.AVAIL_CLIENT_WAIT : undefined, ].filter(Boolean), }, diff --git a/e2e/client/node/scripts/start.quickstart.ts b/e2e/client/node/scripts/start.quickstart.ts index 8e10d8bcf..07cf84ad3 100644 --- a/e2e/client/node/scripts/start.quickstart.ts +++ b/e2e/client/node/scripts/start.quickstart.ts @@ -14,12 +14,12 @@ import { ENV } from "@effectstream/utils/node-env"; const logs = ENV.getBoolean("EFFECTSTREAM_STDOUT") ? "stdout" : "development"; const external_db_enabled = ENV.getBoolean("EXTERNAL_DB_ENABLED"); -const yaci_enabled = false; //!ENV.getBoolean("DISABLE_YACI"); +const cardano_enabled = !ENV.getBoolean("DISABLE_CARDANO"); const midnight_enabled = !ENV.getBoolean("DISABLE_MIDNIGHT"); const avail_enabled = !ENV.getBoolean("DISABLE_AVAIL"); const bitcoin_enabled = !ENV.getBoolean("DISABLE_BITCOIN"); -const cardano_processes = (yaci_enabled ? launchCardano("@e2e/cardano-contracts") : []); +const cardano_processes = (cardano_enabled ? launchCardano("@e2e/cardano-contracts") : []); const config = Value.Parse(OrchestratorConfig, { logs, @@ -60,7 +60,7 @@ const config = Value.Parse(OrchestratorConfig, { waitToExit: true, dependsOn: [ 'batcher', - (yaci_enabled && cardano_processes.length > 0) ? ComponentNames.DOLOS_WAIT : undefined, + (cardano_enabled && cardano_processes.length > 0) ? ComponentNames.DOLOS_WAIT : undefined, avail_enabled ? ComponentNames.AVAIL_CLIENT_WAIT : undefined, ].filter(Boolean), }, diff --git a/e2e/shared/contracts/cardano/deno.json b/e2e/shared/contracts/cardano/deno.json index 36ce0e8fb..252542a53 100644 --- a/e2e/shared/contracts/cardano/deno.json +++ b/e2e/shared/contracts/cardano/deno.json @@ -4,17 +4,16 @@ "license": "MIT", "exports": {}, "tasks": { - "dolos:exists": "test -f ./dolos", "devkit:start": "deno run -A --node-modules-dir npm:@bloxbean/yaci-devkit up", "devkit:wait": "wait-on tcp:3001", "dolos:fill-template": "deno run -A ./fill-template.ts", // rm -rf is required because of this issue: https://github.com/txpipe/dolos/issues/398 - // TODO we need to provide newer versions of dolos binaries. - "dolos:start": "rm -rf ./data ./dolos.socket && ./dolos bootstrap relay && ./dolos daemon", + "dolos:start": "rm -rf ./data ./dolos.socket && deno run -A --node-modules-dir npm:@txpipe/dolos bootstrap relay && deno run -A --node-modules-dir npm:@txpipe/dolos daemon", "dolos:wait": "wait-on tcp:50051" // utxorpc port }, "imports": { - "@txpipe/dolos": "npm:@txpipe/dolos@0.19.1", + "@bloxbean/yaci-devkit": "@bloxbean/yaci-devkit@0.11.0-beta1", + "@txpipe/dolos": "npm:@txpipe/dolos@1.0.0-rc.10", "toml": "jsr:@std/toml" } } diff --git a/e2e/shared/data-types/src/config.ts b/e2e/shared/data-types/src/config.ts index 69363212c..56aa12f9a 100644 --- a/e2e/shared/data-types/src/config.ts +++ b/e2e/shared/data-types/src/config.ts @@ -43,7 +43,7 @@ const isEnvTrue = (key: string, defaultValue?: boolean) => { // TODO: This is a workaround to disable yaci-devkit in linux for testing. // There is a unknown error when launching this process. // error: Text file busy (os error 26) -const yaci_enabled = false; //!isEnvTrue("DISABLE_YACI"); +const cardano_enabled = !isEnvTrue("DISABLE_CARDANO"); // NOTE: This disable midnight sync, allowing for faster testing. const midnight_enabled = !isEnvTrue("DISABLE_MIDNIGHT"); @@ -76,8 +76,8 @@ if (typeof Deno !== 'undefined' && Deno) { const dbConn = getConnection(); try { const result = await dbConn.query(` - SELECT * FROM effectstream.sync_protocol_pagination - WHERE protocol_name = '${mainSyncProtocolName}' + SELECT * FROM effectstream.sync_protocol_pagination + WHERE protocol_name = '${mainSyncProtocolName}' ORDER BY page_number ASC LIMIT 1 `); @@ -92,11 +92,13 @@ if (typeof Deno !== 'undefined' && Deno) { } // We fetch the latest block from the dolos mini blockfrost endpoint - if (yaci_enabled) { - const response = await fetch("http://localhost:3000/blocks/latest"); - yaciDevKitStartTime = (await response.json()).time * 1000; + if (cardano_enabled) { + const latestResponse = await fetch("http://localhost:3000/blocks/latest"); + const latestBlock = await latestResponse.json(); + yaciDevKitStartTime = latestBlock.time * 1000; yaciDevKitStartTime = new Date().getTime() - yaciDevKitStartTime; console.log("yaciDevKitStartTime", yaciDevKitStartTime); + } } @@ -154,7 +156,7 @@ export const config = new ConfigBuilder() }); } - if (yaci_enabled) { + if (cardano_enabled) { b = b .addNetwork({ name: "yaci", @@ -256,7 +258,7 @@ export const config = new ConfigBuilder() ); } - if (yaci_enabled) { + if (cardano_enabled) { result = result .addParallel( @@ -265,7 +267,7 @@ export const config = new ConfigBuilder() name: "parallelUtxoRpc", type: ConfigSyncProtocolType.CARDANO_UTXORPC_PARALLEL, rpcUrl: "http://127.0.0.1:50051", // dolos utxorpc address - startSlot: 1, + startChainPoint: "origin", // TODO: The exact delay is not correct, but it's close. // byron-genesis.json startTime // 633 skipped slots @@ -456,7 +458,7 @@ export const config = new ConfigBuilder() }), ); } - if (yaci_enabled) { + if (cardano_enabled) { b = b.addPrimitive( (syncProtocols) => (syncProtocols as any).parallelUtxoRpc, (network, deployments, syncProtocol) => ({ diff --git a/packages/build-tools/orchestrator/scripts/launch-cardano.ts b/packages/build-tools/orchestrator/scripts/launch-cardano.ts index 298c81b22..7f0089922 100644 --- a/packages/build-tools/orchestrator/scripts/launch-cardano.ts +++ b/packages/build-tools/orchestrator/scripts/launch-cardano.ts @@ -1,7 +1,4 @@ import { ComponentNames } from "@effectstream/log"; -import { statSync } from "node:fs"; -import { spawnSync } from "node:child_process"; -import { getEnv } from "@effectstream/utils/runtime"; // Start Cardano Node and Indexer. // @@ -31,38 +28,12 @@ export const launchCardano = (packageName: string): { cwd?: string; command?: string; }[] => { - const home = getEnv("HOME"); - const yaciDir = `${home}/.yaci-cli`; - const yaciCliPath = `${yaciDir}/yaci-cli`; - // TODO $HOME/.yaci-cli/yaci-cli must be installed to allow this to work. - // At the time the npm packages is incompatible with deno. - try { - statSync(yaciCliPath); - } catch (_error) { - throw new Error( - `Cardano launcher skipped: missing ${yaciCliPath}. Run yaci-cli setup.`, - ); - } - // TODO We require the latest dolos binary built from source. - // At the time there is not npm package for the latest dolos binary. - try { - const dolosExists = spawnSync("deno", ["task", "-f", packageName, "dolos:exists"], { encoding: "utf-8" }); - if (dolosExists.status !== 0) throw new Error(); - } catch (_error) { - throw new Error( - "Cardano launcher skipped: dolos binary is missing.", - ); - } - - return [ { stopProcessAtPort: [8090, 10000, 50051, 3001], - cwd: yaciDir, - command: "./yaci-cli", - args: ["up"], name: ComponentNames.YACI_DEVKIT, + args: ["task", "-f", packageName, "devkit:start"], waitToExit: false, type: "system-dependency", logsStartDisabled: true, @@ -72,6 +43,12 @@ export const launchCardano = (packageName: string): { args: ["task", "-f", packageName, "devkit:wait"], // dependsOn: [ComponentNames.YACI_DEVKIT], }, + { + name: ComponentNames.DOLOS_FILL_TEMPLATE, + args: ["task", "-f", packageName, "dolos:fill-template"], + waitToExit: true, + dependsOn: [ComponentNames.YACI_DEVKIT_WAIT], + }, { name: ComponentNames.DOLOS, args: ["task", "-f", packageName, "dolos:start"], @@ -80,7 +57,7 @@ export const launchCardano = (packageName: string): { logsStartDisabled: true, disableStderr: true, type: "system-dependency", - dependsOn: [ComponentNames.YACI_DEVKIT_WAIT], + dependsOn: [ComponentNames.DOLOS_FILL_TEMPLATE], }, { name: ComponentNames.DOLOS_WAIT, diff --git a/packages/effectstream-sdk/config/src/schema/common.ts b/packages/effectstream-sdk/config/src/schema/common.ts index 1d267d8fd..048ce0794 100644 --- a/packages/effectstream-sdk/config/src/schema/common.ts +++ b/packages/effectstream-sdk/config/src/schema/common.ts @@ -38,6 +38,28 @@ export const StartStopSlot = new ConfigSchema({ }), }); +export const CardanoChainPoint = Type.Object({ + slot: TypeboxHelpers.AbsoluteSlotNumber(), + hash: TypeboxHelpers.Cardano.BlockHash, +}); + +export const StartChainPointValue = Type.Union([ + Type.Literal("origin"), + Type.Literal("tip"), + CardanoChainPoint, +]); + +export const StartStopChainPoint = new ConfigSchema({ + required: Type.Object({ + startChainPoint: StartChainPointValue, + }), + optional: Type.Object({ + stopChainPoint: TypeboxHelpers.Nullable(CardanoChainPoint, { + default: null, + }), + }), +}); + export const StartStopTimestamp = new ConfigSchema({ required: Type.Object({ startTimestamp: TypeboxHelpers.TimestampMs(), diff --git a/packages/effectstream-sdk/config/src/schema/sync-protocols/cardano/utxorpc.ts b/packages/effectstream-sdk/config/src/schema/sync-protocols/cardano/utxorpc.ts index 491daab28..1eded21c9 100644 --- a/packages/effectstream-sdk/config/src/schema/sync-protocols/cardano/utxorpc.ts +++ b/packages/effectstream-sdk/config/src/schema/sync-protocols/cardano/utxorpc.ts @@ -1,7 +1,7 @@ import { Type } from "@sinclair/typebox"; import type { Static } from "@sinclair/typebox"; import { ConfigSyncProtocolType } from "../types.ts"; -import { NameField, StartStopSlot } from "../../common.ts"; +import { NameField, StartStopChainPoint } from "../../common.ts"; import { CommonResponseParallelSyncProtocol, type ConfigSyncProtocolCommonResponse, @@ -21,15 +21,15 @@ import { // ===== export const UtxorpcAddressPattern = Type.Object({ - exactAddress: Type.Optional(Type.String()), - paymentPart: Type.Optional(Type.String()), - delegationPart: Type.Optional(Type.String()), + exact_address: Type.Optional(Type.String()), + payment_part: Type.Optional(Type.String()), + delegation_part: Type.Optional(Type.String()), }); export type UtxorpcAddressPattern = Static; export const UtxorpcAssetPattern = Type.Object({ - policyId: Type.Optional(Type.String()), - assetName: Type.Optional(Type.String()), + policy_id: Type.Optional(Type.String()), + asset_name: Type.Optional(Type.String()), }); export type UtxorpcAssetPattern = Static; @@ -40,19 +40,22 @@ export const UtxorpcTxOutputPattern = Type.Object({ export type UtxorpcTxOutputPattern = Static; export const UtxorpcTxPattern = Type.Object({ - consumes: Type.Optional(UtxorpcTxOutputPattern), - produces: Type.Optional(UtxorpcTxOutputPattern), - hasAddress: Type.Optional(UtxorpcAddressPattern), - movesAsset: Type.Optional(UtxorpcAssetPattern), - mintsAsset: Type.Optional(UtxorpcAssetPattern), + has_address: Type.Optional(UtxorpcAddressPattern), + moves_asset: Type.Optional(UtxorpcAssetPattern), + mints_asset: Type.Optional(UtxorpcAssetPattern), }); export type UtxorpcTxPattern = Static; +export const UtxorpcAnyChainTxPattern = Type.Object({ + cardano: Type.Optional(UtxorpcTxPattern), +}); +export type UtxorpcAnyChainTxPattern = Static; + export const UtxorpcTxPredicate = Type.Recursive(This => Type.Object({ - match: Type.Optional(UtxorpcTxPattern), + match: Type.Optional(UtxorpcAnyChainTxPattern), not: Type.Optional(Type.Array(This)), - allOf: Type.Optional(Type.Array(This)), - anyOf: Type.Optional(Type.Array(This)), + all_of: Type.Optional(Type.Array(This)), + any_of: Type.Optional(Type.Array(This)), })); export type UtxorpcTxPredicate = Static; @@ -62,7 +65,7 @@ export type UtxorpcTxPredicate = Static; export const ConfigSyncProtocolSchemaCardanoUtxoRpcBase = NameField .cloneMerge( - StartStopSlot, + StartStopChainPoint, ).cloneMerge({ required: Type.Object({ name: Type.String(), diff --git a/packages/effectstream-sdk/log/src/const.ts b/packages/effectstream-sdk/log/src/const.ts index a271f6b19..7ae3d935c 100644 --- a/packages/effectstream-sdk/log/src/const.ts +++ b/packages/effectstream-sdk/log/src/const.ts @@ -46,6 +46,7 @@ export const SecondaryComponents = { // This is the entry point, so it gets launched by default. ORCHESTRATOR: "orchestrator", // Thses processes are launched by their counterpart. + DOLOS_FILL_TEMPLATE: "dolos-fill-template", DOLOS_WAIT: "dolos-wait", YACI_DEVKIT_WAIT: "yaci-devkit-wait", MIDNIGHT_NODE_WAIT: "midnight-node-wait", diff --git a/packages/node-sdk/db/scripts/start-pglite.ts b/packages/node-sdk/db/scripts/start-pglite.ts index 81ecf6804..d60bbc444 100644 --- a/packages/node-sdk/db/scripts/start-pglite.ts +++ b/packages/node-sdk/db/scripts/start-pglite.ts @@ -19,16 +19,17 @@ if (isNaN(port)) { } // TODO: find nearest node_modules folder, as import { pg_ivm } is not working +const extensionSubPath = "/node_modules/@electric-sql/pglite/dist/pg_ivm.tar.gz"; let nodeModulesPath = cwd(); while (true) { try { - const st = statSync(nodeModulesPath + "/node_modules"); - if (st.isDirectory()) break; + const st = statSync(nodeModulesPath + extensionSubPath); + if (st.isFile()) break; } catch (_e) { - // not found or not dir + // not found } if (!nodeModulesPath || nodeModulesPath === "/") { - throw new Error("Node modules not found"); + throw new Error("Could not find pglite pg_ivm extension in any parent node_modules"); } nodeModulesPath = nodeModulesPath.split("/").slice(0, -1).join("/"); } diff --git a/packages/node-sdk/sync/src/sync-protocols/utxorpc/BufferedRpc.ts b/packages/node-sdk/sync/src/sync-protocols/utxorpc/BufferedRpc.ts index 64ae57ad0..3b9303f21 100644 --- a/packages/node-sdk/sync/src/sync-protocols/utxorpc/BufferedRpc.ts +++ b/packages/node-sdk/sync/src/sync-protocols/utxorpc/BufferedRpc.ts @@ -29,7 +29,17 @@ export class BufferedRpc { return BufferedRpc.lastHeight; } - public async start(point: undefined | ChainPoint): Promise { + public async resolveOrigin(): Promise { + const blocks = await this.syncClient.fetchHistory(undefined, 1); + if (!blocks.length) throw new Error("No blocks found on chain"); + const header = blocks[0].parsedBlock.header!; + return { + slot: Number(header.slot), + hash: Buffer.from(header.hash).toString("hex"), + }; + } + + public async start(point?: ChainPoint): Promise { if (BufferedRpc.initialized) { // We do not want to follow the tip again. throw new Error("BufferedRpc already initialized"); diff --git a/packages/node-sdk/sync/src/sync-protocols/utxorpc/fetcher.ts b/packages/node-sdk/sync/src/sync-protocols/utxorpc/fetcher.ts index 2318892d1..c63e22491 100644 --- a/packages/node-sdk/sync/src/sync-protocols/utxorpc/fetcher.ts +++ b/packages/node-sdk/sync/src/sync-protocols/utxorpc/fetcher.ts @@ -20,10 +20,15 @@ export class UtxoRpcFetcher } @bound - async startAsync(point: ChainPoint | undefined) { + async startAsync(point?: ChainPoint) { await this.client.start(point); } + @bound + async resolveOrigin(): Promise { + return this.client.resolveOrigin(); + } + @bound override *readData( data: Input, diff --git a/packages/node-sdk/sync/src/sync-protocols/utxorpc/state.ts b/packages/node-sdk/sync/src/sync-protocols/utxorpc/state.ts index 435da8f58..08fcbe893 100644 --- a/packages/node-sdk/sync/src/sync-protocols/utxorpc/state.ts +++ b/packages/node-sdk/sync/src/sync-protocols/utxorpc/state.ts @@ -37,10 +37,16 @@ export class UtxoRpcSyncState extends SyncState< @bound override *startAsync(): Operation { if (this.lastPage == null) { - // TODO: get startSlot if lastPage doesn't exist - // problem: utxorpc "fetchBlock" requires a ChainPoint - // see: https://github.com/utxorpc/spec/issues/148 - yield* call(() => this.fetcher.startAsync(undefined)); + const cp = this.config.syncProtocol.startChainPoint; + if (cp === "origin") { + const origin = yield* call(() => this.fetcher.resolveOrigin()); + yield* call(() => this.fetcher.startAsync(origin)); + } else if (cp === "tip") { + yield* call(() => this.fetcher.startAsync(undefined)); + } else { + yield* call(() => this.fetcher.startAsync({ slot: cp.slot, hash: cp.hash })); + } + return; } yield* call(() => this.fetcher.startAsync({ @@ -72,7 +78,13 @@ export class UtxoRpcSyncState extends SyncState< } // TODO This might be wrong, we are using block heights - not slots (?) - const startHeight = this.lastPage?.own.height ?? this.config.syncProtocol.startSlot - 1; + const cp = this.config.syncProtocol.startChainPoint; + const startHeight = this.lastPage?.own.height ?? + (cp === "tip" + ? Number(tipHeight) - 1 + : cp === "origin" + ? 0 + : cp.slot - 1); if (BigInt(startHeight) >= tipHeight) { return undefined; diff --git a/packages/node-sdk/sync/src/sync-protocols/utxorpc/types.ts b/packages/node-sdk/sync/src/sync-protocols/utxorpc/types.ts index 002042e86..1b5515caa 100644 --- a/packages/node-sdk/sync/src/sync-protocols/utxorpc/types.ts +++ b/packages/node-sdk/sync/src/sync-protocols/utxorpc/types.ts @@ -15,11 +15,8 @@ import type { SyncProtocolWithNetwork, } from "@effectstream/config"; -// TODO: https://github.com/utxorpc/node-sdk/pull/38 -export type ChainPoint = { - slot: number | string; - hash: string; -}; +import type { CardanoChainPoint } from "@utxorpc/sdk"; +export type ChainPoint = CardanoChainPoint; export type Page = { slot: AbsoluteSlotNumber; @@ -53,4 +50,4 @@ export const chainPointRelation: PageRelation = { export type ConfigType = Extract< SyncProtocolWithNetwork, { syncProtocolType: ConfigSyncProtocolType.CARDANO_UTXORPC_PARALLEL } ->; \ No newline at end of file +>; diff --git a/packages/node-sdk/sync/src/sync-protocols/utxorpc/utils.ts b/packages/node-sdk/sync/src/sync-protocols/utxorpc/utils.ts index 0c0b95f0c..36c2095cb 100644 --- a/packages/node-sdk/sync/src/sync-protocols/utxorpc/utils.ts +++ b/packages/node-sdk/sync/src/sync-protocols/utxorpc/utils.ts @@ -1,5 +1,5 @@ import type { cardano } from '@utxorpc/spec'; -import type { UtxorpcAddressPattern, UtxorpcAssetPattern, UtxorpcTxOutputPattern, UtxorpcTxPattern, UtxorpcTxPredicate } from "@effectstream/config"; +import type { UtxorpcAddressPattern, UtxorpcAnyChainTxPattern, UtxorpcAssetPattern, UtxorpcTxOutputPattern, UtxorpcTxPredicate } from "@effectstream/config"; import { hexStringToUint8Array } from "@effectstream/utils"; import { Cardano } from '@cardano-sdk/core'; import { HexBlob } from '@cardano-sdk/util'; @@ -23,24 +23,24 @@ export function matchesPredicate(tx: cardano.Tx, predicate: UtxorpcTxPredicate): if (predicate.not && predicate.not.some(p => matchesPredicate(tx, p))) { return false; } - if (predicate.allOf && !predicate.allOf.every(p => matchesPredicate(tx, p))) { + if (predicate.all_of && !predicate.all_of.every(p => matchesPredicate(tx, p))) { return false; } - if (predicate.anyOf && !predicate.anyOf.some(p => matchesPredicate(tx, p))) { + if (predicate.any_of && !predicate.any_of.some(p => matchesPredicate(tx, p))) { return false; } return true; } -function matchesPattern(tx: cardano.Tx, pattern: UtxorpcTxPattern): boolean { +function matchesPattern(tx: cardano.Tx, pattern: UtxorpcAnyChainTxPattern): boolean { + const cardanoPattern = pattern.cardano; + if (!cardanoPattern) return false; const outputs = tx.outputs; const inputs = tx.inputs.map(input => input.asOutput!).filter(x => x); - const matchConsumes = !pattern.consumes || matchesOutputPattern(outputs, pattern.consumes); - const matchProduces = !pattern.produces || matchesOutputPattern(inputs, pattern.produces); - const matchHasAddress = !pattern.hasAddress || matchesAddress(outputs, pattern.hasAddress) || matchesAddress(inputs, pattern.hasAddress); - const matchMovesAsset = !pattern.movesAsset || matchesAsset(inputs, pattern.movesAsset); - const matchMintsAsset = !pattern.mintsAsset || matchesAsset(outputs, pattern.mintsAsset); - return matchConsumes && matchProduces && matchHasAddress && matchMovesAsset && matchMintsAsset; + const matchHasAddress = !cardanoPattern.has_address || matchesAddress(outputs, cardanoPattern.has_address) || matchesAddress(inputs, cardanoPattern.has_address); + const matchMovesAsset = !cardanoPattern.moves_asset || matchesAsset(inputs, cardanoPattern.moves_asset); + const matchMintsAsset = !cardanoPattern.mints_asset || matchesAsset(outputs, cardanoPattern.mints_asset); + return matchHasAddress && matchMovesAsset && matchMintsAsset; } function matchesOutputPattern(outputs: cardano.TxOutput[], pattern: UtxorpcTxOutputPattern): boolean { @@ -50,18 +50,18 @@ function matchesOutputPattern(outputs: cardano.TxOutput[], pattern: UtxorpcTxOut } function matchesAddress(outputs: cardano.TxOutput[], pattern: UtxorpcAddressPattern): boolean { - if (pattern.exactAddress) { - const address = hexStringToUint8Array(pattern.exactAddress); + if (pattern.exact_address) { + const address = Uint8Array.from(atob(pattern.exact_address), c => c.charCodeAt(0)); if (!outputs.some(o => hashEqual(o.address, address))) { return false; } } - if (pattern.paymentPart || pattern.delegationPart) { + if (pattern.payment_part || pattern.delegation_part) { const addresses = outputs.map(o => Cardano.Address.fromBytes(HexBlob.fromBytes(o.address))); - if (pattern.paymentPart && !addresses.some(a => a.getProps()?.paymentPart?.hash === pattern.paymentPart)) { + if (pattern.payment_part && !addresses.some(a => a.getProps()?.paymentPart?.hash === pattern.payment_part)) { return false; } - if (pattern.delegationPart && !addresses.some(a => a.getProps()?.delegationPart?.hash === pattern.delegationPart)) { + if (pattern.delegation_part && !addresses.some(a => a.getProps()?.delegationPart?.hash === pattern.delegation_part)) { return false; } } @@ -69,8 +69,8 @@ function matchesAddress(outputs: cardano.TxOutput[], pattern: UtxorpcAddressPatt } function matchesAsset(outputs: cardano.TxOutput[], pattern: UtxorpcAssetPattern): boolean { - const policyId = pattern.policyId ? hexStringToUint8Array(pattern.policyId) : null; - const assetName = pattern.assetName ? hexStringToUint8Array(pattern.assetName) : null; + const policyId = pattern.policy_id ? hexStringToUint8Array(pattern.policy_id) : null; + const assetName = pattern.asset_name ? hexStringToUint8Array(pattern.asset_name) : null; return outputs.some(o => o.assets.some(ma => { if (policyId && !hashEqual(policyId, ma.policyId)) { return false;