diff --git a/.gitignore b/.gitignore index f6ab2c3b..e7eaa0f5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ broadcast/* .aider* .codeium/ .gemini/ + +# Generated CDM registration assets (deployment-specific; see scripts/cdm/) +.generated/ diff --git a/DEPLOYMENT_CHECKLIST.md b/DEPLOYMENT_CHECKLIST.md index 95eeba68..31bcad42 100644 --- a/DEPLOYMENT_CHECKLIST.md +++ b/DEPLOYMENT_CHECKLIST.md @@ -141,6 +141,49 @@ Confirm these keys are present: Done. ✅ +## Step 9 — (Optional) Publish the deployment to the CDM registry + +Registering the deployment in the [CDM contract registry](https://github.com/paritytech/contract-dependency-manager) +lets consumers resolve the current DotNS addresses with `cdm install @dotns/` +instead of chasing address changes across redeploys. + +```bash +# Generate CDM assets from the manifest you just deployed (needs `forge build` output): +bun run cdm:generate -- \ + --deployment deployments//.json \ + --network + +# Preview what would be published (no transactions): +bun run cdm:register -- --metadata .generated/dotns-cdm/metadata.json \ + --name paseo --dry-run + +# Publish (the signer needs funds on Asset Hub and Bulletin storage authorization; +# CDM_SURI env var also works, preferred in CI): +bun run cdm:register -- --metadata .generated/dotns-cdm/metadata.json \ + --name paseo --suri "" +``` + +For networks without a CDM preset, pass explicit endpoints: + +```bash +bun run cdm:register -- --metadata .generated/dotns-cdm/metadata.json \ + --name custom \ + --assethub-url wss://... --bulletin-url wss://... \ + --registry-address 0x... \ + --suri "$CDM_SURI" +``` + +Notes: + +- Re-running is safe: contracts whose registered address and metadata already + match are skipped, so a partially-failed run can simply be re-run. +- The first registration of each `@dotns/*` package claims its name for the + signing account; use the same account for subsequent redeploys. +- See `scripts/deploy/cdm/` for how the assets are generated (static descriptors + + readmes in the repo, addresses from the manifest, ABIs from `out/**`). + +Done. ✅ + ## Troubleshooting — the four things that actually go wrong - **`PRIVATE_KEY is required`** — the keystore account doesn't exist yet. Make diff --git a/bun.lock b/bun.lock index 807410fd..ba80357e 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,11 @@ "name": "@dotns/dotns-contracts", "dependencies": { "@openzeppelin/upgrades-core": "1.44.2", + "@parity/cdm-builder": "^5.0.0", + "@parity/cdm-env": "^2.3.0", + "@parity/product-sdk-cloud-storage": "^0.5.4", + "@parity/product-sdk-contracts": "^0.9.0", + "@parity/product-sdk-tx": "^0.2.8", }, "devDependencies": { "cross-env": "^10.1.0", @@ -21,8 +26,14 @@ "packages": { "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.1", "", {}, "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ=="], + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + "@bytecodealliance/preview2-shim": ["@bytecodealliance/preview2-shim@0.17.0", "", {}, "sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ=="], + "@commander-js/extra-typings": ["@commander-js/extra-typings@15.0.0", "", { "peerDependencies": { "commander": "~15.0.0" } }, "sha512-yeJlba62xqmkgELUsn7356MEnzLLu/fw2x4lofFqGnXh6YysRdEs2BaLeLtg1+KU0AXvMeqQvTTp+3hBEBK+EA=="], + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], "@epic-web/invariant": ["@epic-web/invariant@1.0.0", "", {}, "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA=="], @@ -79,12 +90,16 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], + "@ipld/dag-pb": ["@ipld/dag-pb@4.1.7", "", { "dependencies": { "multiformats": "^14.0.0" } }, "sha512-/i/13trFihjWfDyXlylRwhuYjtzYjvOFw0vlRjYGnZuv7d7MOgA2lV/vRuL5RfeUajM03aZfFLdq4S7cTbbTRg=="], + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], + "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], "@noble/curves": ["@noble/curves@1.9.2", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g=="], @@ -95,6 +110,96 @@ "@openzeppelin/upgrades-core": ["@openzeppelin/upgrades-core@1.44.2", "", { "dependencies": { "@nomicfoundation/slang": "^0.18.3", "bignumber.js": "^9.1.2", "cbor": "^10.0.0", "chalk": "^4.1.0", "compare-versions": "^6.0.0", "debug": "^4.1.1", "ethereumjs-util": "^7.0.3", "minimatch": "^9.0.5", "minimist": "^1.2.7", "proper-lockfile": "^4.1.1", "solidity-ast": "^0.4.60" }, "bin": { "openzeppelin-upgrades-core": "dist/cli/cli.js" } }, "sha512-m6iorjyhPK9ow5/trNs7qsBC/SOzJCO51pvvAF2W9nOiZ1t0RtCd+rlRmRmlWTv4M33V0wzIUeamJ2BPbzgUXA=="], + "@parity/bulletin-sdk": ["@parity/bulletin-sdk@0.3.0", "", { "dependencies": { "@ipld/dag-pb": "^4.1.3", "@noble/hashes": "^2.2.0", "@polkadot-labs/hdkd-helpers": "^0.0.29", "ipfs-unixfs": "^12.0.0" }, "peerDependencies": { "multiformats": "^13.4.1", "polkadot-api": "^2.1.2" } }, "sha512-sxVwBzyH/egXze1muPXbaGwQuOkP8efVB4Lxunshixf18gJ6WT2tedgUy08QOfQ1848BDQS4wVpRRQfPfb09/g=="], + + "@parity/cdm-builder": ["@parity/cdm-builder@5.0.0", "", { "dependencies": { "@noble/hashes": "^2.0.1", "@parity/cdm-env": "2.3.0", "@parity/cdm-utils": "0.5.0", "@parity/product-sdk-cloud-storage": "0.7.0", "@parity/product-sdk-contracts": "0.9.0", "@parity/product-sdk-descriptors": "0.7.0", "@parity/product-sdk-tx": "0.3.0", "multiformats": "^13.4.2", "polkadot-api": "^2.1.7" } }, "sha512-YEV/Ane8Ke2CAZDOLqZJA+gymqCGUgzyZwrQodm3qegxtx0t3RmRWCf4U9RVgVTP8ynvgpjCrp5ued9EMah5Lg=="], + + "@parity/cdm-env": ["@parity/cdm-env@2.3.0", "", { "dependencies": { "@parity/cdm-utils": "0.5.0", "@parity/product-sdk-descriptors": "0.7.0", "@parity/product-sdk-host": "0.13.0", "@polkadot-labs/hdkd": "^0.0.26", "@polkadot-labs/hdkd-helpers": "^0.0.27", "polkadot-api": "^2.1.7", "smoldot": "^2.0.40" } }, "sha512-eDXO3nL/AqAO9xXFJg0+GYQWnCIWci8h60lC25QTCNMG/YEj9eCgcEH445h1QmkpUJM0nOOw2ZTuY8jrnM6BTA=="], + + "@parity/cdm-utils": ["@parity/cdm-utils@0.5.0", "", { "dependencies": { "@polkadot-labs/hdkd": "^0.0.26", "@polkadot-labs/hdkd-helpers": "^0.0.27" } }, "sha512-5zvTk/MAnQ9mkR1Pc3GeW46e+OzEce49PqBHFaqF2+Ldcs4mDHpqkSka968VsKfIvax61khbrAfgD25qQivV/A=="], + + "@parity/product-sdk-address": ["@parity/product-sdk-address@0.1.1", "", { "dependencies": { "@noble/hashes": "^1.7.1", "@polkadot-api/substrate-bindings": "^0.12.0" } }, "sha512-sSymun3alNGdvawhdc0Ha0KEkuqMwBZui1bsUVeZIZRJAfWvQzrV1AVaf8aah5JFlcaRdg8FYyp7xL2eP+ZplA=="], + + "@parity/product-sdk-chain-client": ["@parity/product-sdk-chain-client@0.6.1", "", { "dependencies": { "@parity/product-sdk-descriptors": "0.5.2", "@parity/product-sdk-host": "0.7.1", "@parity/product-sdk-logger": "0.1.1", "polkadot-api": "^2.1.5" } }, "sha512-dZ+mXSFisWpgYo1sIUlIIQEhYQZ10aBOcz43XEsOw9bYxMI/XVn6UAP5T/u+Ri0DqYIwBWWc2PX+JjQWnqKOZQ=="], + + "@parity/product-sdk-cloud-storage": ["@parity/product-sdk-cloud-storage@0.5.5", "", { "dependencies": { "@parity/bulletin-sdk": "^0.3.0", "@parity/product-sdk-chain-client": "0.6.1", "@parity/product-sdk-descriptors": "0.5.2", "@parity/product-sdk-host": "0.7.1", "@parity/product-sdk-logger": "0.1.1", "@parity/product-sdk-tx": "0.2.9", "multiformats": "^13.3.0", "polkadot-api": "^2.1.5" } }, "sha512-SairWT2CDvxNHCoFoZBMTYhJVgGIxn1RHzVNf3KR43S2PnnhuVt2Lk41IvmGELVEhk7z9QG0vlIUy3J190t6ow=="], + + "@parity/product-sdk-contracts": ["@parity/product-sdk-contracts@0.9.2", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-keys": "0.3.16", "@parity/product-sdk-logger": "0.1.1", "@parity/product-sdk-signer": "0.11.1", "@parity/product-sdk-tx": "0.3.2", "@parity/result": "0.2.0", "@polkadot-labs/hdkd-helpers": "^0.0.30", "polkadot-api": "^2.1.6", "viem": "^2.52.0" } }, "sha512-4svBhyBOoNfV4K5f9feizZSPl1Hn5frYpJvf5hjR9z7zp+t+1ruM/DjUM5QCgwrAmwkpfw7oxHDFTN3SlBo0tw=="], + + "@parity/product-sdk-crypto": ["@parity/product-sdk-crypto@0.1.1", "", { "dependencies": { "@noble/ciphers": "^1.2.1", "@noble/curves": "^1.8.0", "@noble/hashes": "^1.7.1", "tweetnacl": "^1.0.3" } }, "sha512-No6AyTLw1Nv3ym8SDdXh/tnezdClNOL9pJgaciVr9Ny6hIL5rs6MQiXsP0+1bc1Nwymz5Q4FqsYg/htE4lejNg=="], + + "@parity/product-sdk-descriptors": ["@parity/product-sdk-descriptors@0.7.0", "", { "dependencies": { "polkadot-api": "^2.1.6" } }, "sha512-JBo3M5+9YCzCD+OzOrcUq+nK/RYSnSpzSfP4ks67vZS+BUcpArGG4mWH4uZ2HEksrAmwMtZZH8f0k8hCEV9YSw=="], + + "@parity/product-sdk-errors": ["@parity/product-sdk-errors@0.2.0", "", {}, "sha512-2rvJV0iJyNAxSjm+RHcoch3GRGYgfMDd2wCha+LmykIDZ06oUfFo+wY6Jf8z56ZMMqHvBvDO1ZNrstVgUZxlEQ=="], + + "@parity/product-sdk-host": ["@parity/product-sdk-host@0.13.0", "", { "dependencies": { "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "@parity/truapi": "^0.3.2", "@polkadot-api/json-rpc-provider": "^0.2.0", "@polkadot-api/substrate-bindings": "^0.20.3", "neverthrow": "^8.2.0", "polkadot-api": "^2.1.6" } }, "sha512-8J7xZq7voI6JF0UFwl9fcuoGStL0mivsZXGcolZQVaFPNEHmhSe+U/+XsRkELds/e8EEwpjSL4DgpKknqT6MDA=="], + + "@parity/product-sdk-keys": ["@parity/product-sdk-keys@0.3.16", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-crypto": "0.1.1", "@parity/product-sdk-local-storage": "0.3.2", "@polkadot-labs/hdkd": "^0.0.28", "@polkadot-labs/hdkd-helpers": "^0.0.30", "@scure/sr25519": "^2.2.0", "polkadot-api": "^2.1.6", "scale-ts": "^1.6.1" } }, "sha512-dnaHPQVOyxE7yEET/NsHi/0l8rI+vkH0m1OaZQ+qMkv4zwrFqXbhcXO7z6Kj+RHp5hswkmrcpEmjl4DeV5Z2xQ=="], + + "@parity/product-sdk-local-storage": ["@parity/product-sdk-local-storage@0.3.2", "", { "dependencies": { "@parity/product-sdk-host": "0.14.1", "@parity/product-sdk-logger": "0.1.1" } }, "sha512-1KJGOZrf6pj1P19j8AVbVC5NTmQe5KGE2VJ0gzJDYCHGWPYECtm7Fc0zfq6AAZbyPJkgsuZz/K4+MRijf4lf2A=="], + + "@parity/product-sdk-logger": ["@parity/product-sdk-logger@0.1.1", "", {}, "sha512-AiSV3TTNlMZJftLQsO78BZsEymGFuJtGMSpGrJ+vUtqaZavWaW/Hc6MICBLnEYgeCrdNpv7QBso3dRsTfnAZXQ=="], + + "@parity/product-sdk-signer": ["@parity/product-sdk-signer@0.11.1", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-host": "0.14.1", "@parity/product-sdk-keys": "0.3.16", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "polkadot-api": "^2.1.6" } }, "sha512-9wGaazcmqVaSkJckcZhHFkhpPQJSNVgvFRbH2qIXkvAmxKMfW9xzdplsEoMnxRcvUree6I1YK2m3kn61/dBpjw=="], + + "@parity/product-sdk-tx": ["@parity/product-sdk-tx@0.2.17", "", { "dependencies": { "@parity/product-sdk-keys": "0.3.13", "@parity/product-sdk-logger": "0.1.1", "@polkadot-labs/hdkd-helpers": "^0.0.30", "polkadot-api": "^2.1.6" } }, "sha512-Ljgc7kjDK7QgeO/pKxHUafx6YH1CUSA4GP1zxPsWTEkCHADMye/r3xCCzMDQ0xucltw+m0zRlhU2pU+8qNbnhw=="], + + "@parity/result": ["@parity/result@0.2.0", "", {}, "sha512-QCrhYPeVVaPIjnlsfBIk5GHPRqfuCjy6MjqKkoCP4kwS1LIo5YtJCSFeB5mGtvMG7hiaRNl4lHQcd5YqDfJ1tQ=="], + + "@parity/truapi": ["@parity/truapi@0.3.2", "", { "dependencies": { "@noble/hashes": "^2.2.0", "neverthrow": "^8.2.0", "scale-ts": "^1.6.1" } }, "sha512-mP2mn74nTs9qhMq5+N/G9S/nqU4YHJOrO/+e6lEsLUai7E6N1krcQxnqAur5j1bNhd/YUQO7ps9IHtTmdkgLDg=="], + + "@polkadot-api/cli": ["@polkadot-api/cli@0.21.10", "", { "dependencies": { "@commander-js/extra-typings": "^15.0.0", "@polkadot-api/codegen": "0.22.5", "@polkadot-api/ink-contracts": "0.6.3", "@polkadot-api/json-rpc-provider": "0.2.0", "@polkadot-api/known-chains": "0.12.1", "@polkadot-api/metadata-compatibility": "0.6.3", "@polkadot-api/observable-client": "0.18.8", "@polkadot-api/sm-provider": "0.3.8", "@polkadot-api/smoldot": "0.4.6", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/substrate-client": "0.7.0", "@polkadot-api/utils": "0.4.0", "@polkadot-api/wasm-executor": "^0.2.3", "@polkadot-api/ws-middleware": "0.3.6", "@polkadot-api/ws-provider": "0.9.1", "@types/node": "^25.9.4", "commander": "^15.0.0", "execa": "^9.6.1", "fs.promises.exists": "^1.1.4", "ora": "^9.4.1", "read-pkg": "^10.1.0", "rollup": "^4.62.2", "rollup-plugin-esbuild": "^6.2.1", "rxjs": "^7.8.2", "tsc-prog": "^2.3.0", "typescript": "^6.0.3", "write-package": "^7.2.0" }, "bin": { "papi": "./dist/main/src/main.js", "polkadot-api": "./dist/main/src/main.js" } }, "sha512-i2Z1Xv6BJOAhdzRKfTGao4WMo+Zv2UsHiKz9CDcaYL290ueYM6T9k32l043opBDQT1EdcUQH7I7hDiwP125neA=="], + + "@polkadot-api/codegen": ["@polkadot-api/codegen@0.22.5", "", { "dependencies": { "@polkadot-api/ink-contracts": "0.6.3", "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/metadata-compatibility": "0.6.3", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-zwZJAlviI211zhj5i6oXkrr0crrbO3GZjBd2vC9AshY1pRmyiNLV9DZsXw4E6l4JQwdAAyNWtPdnvvB9T3TpKg=="], + + "@polkadot-api/ink-contracts": ["@polkadot-api/ink-contracts@0.6.3", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-XqnM1VDzI5L62xgg+f8le2yEoz8QZbUKEfAfPnHMOgBj9tJiyF15FcOJmnLMO/vq3cGixqh18tzJekLG5YTxtA=="], + + "@polkadot-api/json-rpc-provider": ["@polkadot-api/json-rpc-provider@0.2.0", "", {}, "sha512-lhkuBS/x06i3djQIN7p8jVkMnYuGsUAEMS6RhdWeEpz7X/8/APER4Wdih7MEBovCuwVSCTjOxl8f+alH7AZHZg=="], + + "@polkadot-api/json-rpc-provider-proxy": ["@polkadot-api/json-rpc-provider-proxy@0.4.1", "", {}, "sha512-F1Hw01C60jn98KQ0vBbgcwAvEcMcKLsJ5kFzq600sgjc6Rnbn1VF/XjTdrjcIqvfpR9sXyGIrpImrov2Usbrsw=="], + + "@polkadot-api/known-chains": ["@polkadot-api/known-chains@0.12.1", "", {}, "sha512-ZW9TYD2y5IhgNy28zi9sByMr0CaP2I9x8HcAI0pwZR2qDC0kysCG6brDlg1UoZKCjRO99SsKO/iU1o434JgMnQ=="], + + "@polkadot-api/logs-provider": ["@polkadot-api/logs-provider@0.2.0", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.2.0" } }, "sha512-BH9YdxZu+ZBPPAUwGrvqHPn1hQStL2Im3MmTwYkwXOWW2HlGHULcF65QKvyK+T6/mj2vDvl3MgivnGkUw4pVxg=="], + + "@polkadot-api/merkleize-metadata": ["@polkadot-api/merkleize-metadata@1.2.3", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-WkPbz0p2XQ9c8yXagdnwCHEB70Gnm91okcsd6IXU393//3aPgkxKgb+/Efnz7C5/KQmg02P0zXo7q/n/W/yVCA=="], + + "@polkadot-api/metadata-builders": ["@polkadot-api/metadata-builders@0.14.3", "", { "dependencies": { "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-m7CACsiqHzgVEh5WBZGkTV8AQ3CBQKR1YpPQMnlsJfCr/IkgKU0UyWM6WxCmBiReLFVkOfXMtGlpN8+GxpHmww=="], + + "@polkadot-api/metadata-compatibility": ["@polkadot-api/metadata-compatibility@0.6.3", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/substrate-bindings": "0.20.3" } }, "sha512-/Y0uF8nDk60ijydp8Bd37YexPFdB8hBXJWwEgOJHsVlhiny8sVKXiMg+UkJ9BiEk2z+yMbZRCKmhNpTpizo7aw=="], + + "@polkadot-api/observable-client": ["@polkadot-api/observable-client@0.18.8", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/substrate-client": "0.7.0", "@polkadot-api/utils": "0.4.0" }, "peerDependencies": { "rxjs": ">=7.8.0" } }, "sha512-V9BTze/Y+egPMHUGEavIKEcRQ5bDvz3WxTfUvpgvC1ZdkIkvlifc2mNrj7OCehyzBSCcV0D/NDMXyXc5SuRplQ=="], + + "@polkadot-api/pjs-signer": ["@polkadot-api/pjs-signer@0.7.3", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signers-common": "0.2.3", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-U7BLFZfnpFMxCh/scJoLXT6oSbfZtZgMTkiu+TbuWQljAb/1ttrQOfshub5VihNyD5rHajp/2Fq0ONZoL5N5PA=="], + + "@polkadot-api/polkadot-signer": ["@polkadot-api/polkadot-signer@0.1.6", "", {}, "sha512-X7ghAa4r7doETtjAPTb50IpfGtrBmy3BJM5WCfNKa1saK04VFY9w+vDn+hwEcM4p0PcDHt66Ts74hzvHq54d9A=="], + + "@polkadot-api/raw-client": ["@polkadot-api/raw-client@0.3.0", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.2.0" } }, "sha512-u/wM9W7ugIXxBSOEV8+zvQI43b5vgSI0pvE0Rg8PV0G65BTLK0SMc2o2SQL0HtS5+bi5sw/gg4reBJ/0a4U0cw=="], + + "@polkadot-api/signer": ["@polkadot-api/signer@0.3.3", "", { "dependencies": { "@noble/hashes": "^2.2.0", "@polkadot-api/merkleize-metadata": "1.2.3", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signers-common": "0.2.3", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-bmEV65TwgwbMfiecl7ZQ3k5lfkCOx9FPwPYkVvALcPiqb/d3zYwT9LL/E00hj+EB6IKMlMelEQVuchcW5i/92w=="], + + "@polkadot-api/signers-common": ["@polkadot-api/signers-common@0.2.3", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" } }, "sha512-SzGLJMxug31Y1P8+0I809ICpDrayztUXFFh2TV02GuwjEnY6mDGnmX56wowZF5yCn+WteeRdcTJTK7Whk3AGYQ=="], + + "@polkadot-api/sm-provider": ["@polkadot-api/sm-provider@0.3.8", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.2.0", "@polkadot-api/json-rpc-provider-proxy": "0.4.1" }, "peerDependencies": { "@polkadot-api/smoldot": ">=0.3" } }, "sha512-jIvzBNsBsh6LIpCrUOa7miZdQPwLPns5IUQyz/8v84R3ON7URSIVbtywGSR8O83BZGyW/DmVkqa5lClLE2fkqw=="], + + "@polkadot-api/smoldot": ["@polkadot-api/smoldot@0.4.6", "", { "dependencies": { "@types/node": "^25.9.4", "smoldot": "~3.3.1" } }, "sha512-gOXMJ10fXOub0zPP1cGAYeyf29BA2fB+qukrjXGcGN9b0Ya+lDgV7A7Q7y9JOrlGLeKbd1YdrYLAe/F43V7b9Q=="], + + "@polkadot-api/substrate-bindings": ["@polkadot-api/substrate-bindings@0.20.3", "", { "dependencies": { "@noble/hashes": "^2.2.0", "@polkadot-api/utils": "0.4.0", "@scure/base": "^2.2.0", "scale-ts": "^1.6.1" } }, "sha512-9iqC71fx1ee9ld1NZV8PFime5vryi0kt1bKCSlvNgO6dqMc06sMZuZ8WPjOzWLCHiKHLuphdMs3rVBBaeCP3yg=="], + + "@polkadot-api/substrate-client": ["@polkadot-api/substrate-client@0.7.0", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.2.0", "@polkadot-api/raw-client": "0.3.0", "@polkadot-api/utils": "0.4.0" } }, "sha512-TWCc4MAMa5SLVQXmomLHknbj+bztQ/Yclgwm8ENBhz8hR7c9rw9FBAkCa02jMBMCAygPhp3ayGRq+UFcF8KIxQ=="], + + "@polkadot-api/utils": ["@polkadot-api/utils@0.4.0", "", {}, "sha512-9b/hwRM0UloLWV7SfpNaSD/4k8UQAHoaACAk7Xe+1MlfAm2JtnmPiB1GfGrfTyBlsrJVUIBCZpEmbmxVMaIqBA=="], + + "@polkadot-api/wasm-executor": ["@polkadot-api/wasm-executor@0.2.3", "", {}, "sha512-B2h1o+Qlo9idpASaHvMSoViB2I5ko5OAfwfhYF8LQDkTADK0B+SeStzNj1Qn+FG34wqTuv7HzBCdjaUgzYINJQ=="], + + "@polkadot-api/ws-middleware": ["@polkadot-api/ws-middleware@0.3.6", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.2.0", "@polkadot-api/json-rpc-provider-proxy": "0.4.1", "@polkadot-api/raw-client": "0.3.0", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/utils": "0.4.0" }, "peerDependencies": { "rxjs": ">=7.8.0" } }, "sha512-IMoJB572DdSYPshCQa2JmmehUEzX2Uwg5vKQafubbTMEFacXbifc6LTTVvi9Ue67rBuDy2VOWXBAm3BBpfKpDA=="], + + "@polkadot-api/ws-provider": ["@polkadot-api/ws-provider@0.9.1", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.2.0", "@polkadot-api/json-rpc-provider-proxy": "0.4.1", "@polkadot-api/utils": "0.4.0" }, "peerDependencies": { "rxjs": ">=7.8.0" } }, "sha512-Ft2QJEjLZgTyKiCEbz3urSOxNfMdqNkg+QKqJhRbOFB7JtR1qMTvLE3TjM+5d2mNlEpOc3j2KDK3APNSj7uQ2Q=="], + + "@polkadot-labs/hdkd": ["@polkadot-labs/hdkd@0.0.26", "", { "dependencies": { "@polkadot-labs/hdkd-helpers": "~0.0.27" } }, "sha512-9B+egs7pIwmaxi3X7XBbruxS40aVbcdI1iIqSxfSOf4+RS52E+sgd3MW/LECWrHSof2h4ngcdsXRrOl95FVV8g=="], + + "@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.27", "", { "dependencies": { "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", "@scure/base": "^2.0.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-GTSj/Mw5kwtZbefvq2BhvBnHvs7AY4OnJgppO0kE2S/AuDbD6288C9rmO6qwMNmiNVX8OrYMWaJcs46Mt1UbBw=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.2", "", { "os": "android", "cpu": "arm" }, "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.2", "", { "os": "android", "cpu": "arm64" }, "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg=="], @@ -145,12 +250,20 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.2", "", { "os": "win32", "cpu": "x64" }, "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA=="], + "@rx-state/core": ["@rx-state/core@0.1.4", "", { "peerDependencies": { "rxjs": ">=7" } }, "sha512-Z+3hjU2xh1HisLxt+W5hlYX/eGSDaXXP+ns82gq/PLZpkXLu0uwcNUh9RLY3Clq4zT+hSsA3vcpIGt6+UAb8rQ=="], + "@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], "@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], "@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@scure/sr25519": ["@scure/sr25519@1.0.0", "", { "dependencies": { "@noble/curves": "~2.0.0", "@noble/hashes": "~2.0.0" } }, "sha512-b+uhK5akMINXZP95F3gJGcb5CMKYxf+q55fwMl0GoBwZDbWolmGNi1FrBSwuaZX5AhqS2byHiAueZgtDNpot2A=="], + + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + "@solidity-parser/parser": ["@solidity-parser/parser@0.20.2", "", {}, "sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA=="], "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="], @@ -171,6 +284,8 @@ "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], + "@types/pbkdf2": ["@types/pbkdf2@3.1.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew=="], "@types/secp256k1": ["@types/secp256k1@4.0.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw=="], @@ -195,6 +310,8 @@ "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], @@ -243,10 +360,16 @@ "cipher-base": ["cipher-base@1.0.7", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.2" } }, "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA=="], + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="], + "compare-versions": ["compare-versions@6.1.1", "", {}, "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg=="], "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], @@ -265,8 +388,12 @@ "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "deepmerge-ts": ["deepmerge-ts@7.1.5", "", {}, "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw=="], + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + "detect-indent": ["detect-indent@7.0.2", "", {}, "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A=="], + "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], @@ -295,20 +422,32 @@ "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="], + "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "fs.promises.exists": ["fs.promises.exists@1.1.4", "", {}, "sha512-lJzUGWbZn8vhGWBedA+RYjB/BeJ+3458ljUfmplqhIeb6ewzTFWNPCR1HCiYCkXV9zxcHz9zXkJzMsEgDLzh3Q=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + + "get-tsconfig": ["get-tsconfig@4.14.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], @@ -329,12 +468,30 @@ "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + "hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="], + + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ipfs-unixfs": ["ipfs-unixfs@12.0.2", "", { "dependencies": { "protons-runtime": "^6.0.1", "uint8arraylist": "^2.4.8" } }, "sha512-uZ3rutVVZZ+tw52P+sgDSgOSK6ztExJVlfCjKvSD+NIEVlWQPDeKgdSFm+Kxchmgp7t6g1h+dzir+NgY+VsQXg=="], + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -345,8 +502,12 @@ "keccak": ["keccak@3.0.4", "", { "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", "readable-stream": "^3.6.0" } }, "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q=="], + "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="], + "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], + "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], @@ -355,6 +516,8 @@ "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], @@ -365,16 +528,32 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "multiformats": ["multiformats@13.4.2", "", {}, "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "neverthrow": ["neverthrow@8.2.0", "", { "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.24.0" } }, "sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ=="], + "node-addon-api": ["node-addon-api@2.0.2", "", {}, "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="], "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], "nofilter": ["nofilter@3.1.0", "", {}, "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g=="], + "normalize-package-data": ["normalize-package-data@8.0.0", "", { "dependencies": { "hosted-git-info": "^9.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ=="], + + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "ora": ["ora@9.4.1", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.3.2", "string-width": "^8.1.0" } }, "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw=="], + "ox": ["ox@0.8.6", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.0.8", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w=="], + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], + + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -387,6 +566,8 @@ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + "polkadot-api": ["polkadot-api@2.2.2", "", { "dependencies": { "@polkadot-api/cli": "0.21.10", "@polkadot-api/ink-contracts": "0.6.3", "@polkadot-api/json-rpc-provider": "0.2.0", "@polkadot-api/known-chains": "0.12.1", "@polkadot-api/logs-provider": "0.2.0", "@polkadot-api/metadata-builders": "0.14.3", "@polkadot-api/metadata-compatibility": "0.6.3", "@polkadot-api/observable-client": "0.18.8", "@polkadot-api/pjs-signer": "0.7.3", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signer": "0.3.3", "@polkadot-api/sm-provider": "0.3.8", "@polkadot-api/smoldot": "0.4.6", "@polkadot-api/substrate-bindings": "0.20.3", "@polkadot-api/substrate-client": "0.7.0", "@polkadot-api/utils": "0.4.0", "@polkadot-api/ws-middleware": "0.3.6", "@polkadot-api/ws-provider": "0.9.1", "@rx-state/core": "^0.1.4" }, "peerDependencies": { "rxjs": ">=7.8.0" }, "bin": { "papi": "./bin/cli.js", "polkadot-api": "./bin/cli.js" } }, "sha512-OpDJ1pZSu6ulukTb8l2T3wyA5jH6uVlR9TEUcf4N4jw3rMS7wJ+AKKtFXNWXWnMBt0z4LnlOJ7OyoN7Osa5zXw=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], "postcss": ["postcss@8.5.10", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ=="], @@ -395,14 +576,24 @@ "prettier-plugin-solidity": ["prettier-plugin-solidity@1.4.3", "", { "dependencies": { "@solidity-parser/parser": "^0.20.1", "semver": "^7.7.1" }, "peerDependencies": { "prettier": ">=2.3.0" } }, "sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg=="], + "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + "protons-runtime": ["protons-runtime@6.0.2", "", { "dependencies": { "uint8-varint": "^2.0.4", "uint8arraylist": "^2.4.8", "uint8arrays": "^5.1.0" } }, "sha512-hiyjyANwGcgmzc+tXc1/ZcSZhKnl5MDjaVNWkISHBgadaU0sjTgKIKZMZ62d9J9zlSTyKHCs/osPkQ/3Z+7yeA=="], + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + "read-pkg": ["read-pkg@10.1.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.4", "normalize-package-data": "^8.0.0", "parse-json": "^8.3.0", "type-fest": "^5.4.4", "unicorn-magic": "^0.4.0" } }, "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg=="], + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], "ripemd160": ["ripemd160@2.0.3", "", { "dependencies": { "hash-base": "^3.1.2", "inherits": "^2.0.4" } }, "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA=="], @@ -411,8 +602,14 @@ "rollup": ["rollup@4.60.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.2", "@rollup/rollup-android-arm64": "4.60.2", "@rollup/rollup-darwin-arm64": "4.60.2", "@rollup/rollup-darwin-x64": "4.60.2", "@rollup/rollup-freebsd-arm64": "4.60.2", "@rollup/rollup-freebsd-x64": "4.60.2", "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", "@rollup/rollup-linux-arm-musleabihf": "4.60.2", "@rollup/rollup-linux-arm64-gnu": "4.60.2", "@rollup/rollup-linux-arm64-musl": "4.60.2", "@rollup/rollup-linux-loong64-gnu": "4.60.2", "@rollup/rollup-linux-loong64-musl": "4.60.2", "@rollup/rollup-linux-ppc64-gnu": "4.60.2", "@rollup/rollup-linux-ppc64-musl": "4.60.2", "@rollup/rollup-linux-riscv64-gnu": "4.60.2", "@rollup/rollup-linux-riscv64-musl": "4.60.2", "@rollup/rollup-linux-s390x-gnu": "4.60.2", "@rollup/rollup-linux-x64-gnu": "4.60.2", "@rollup/rollup-linux-x64-musl": "4.60.2", "@rollup/rollup-openbsd-x64": "4.60.2", "@rollup/rollup-openharmony-arm64": "4.60.2", "@rollup/rollup-win32-arm64-msvc": "4.60.2", "@rollup/rollup-win32-ia32-msvc": "4.60.2", "@rollup/rollup-win32-x64-gnu": "4.60.2", "@rollup/rollup-win32-x64-msvc": "4.60.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ=="], + "rollup-plugin-esbuild": ["rollup-plugin-esbuild@6.2.1", "", { "dependencies": { "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "get-tsconfig": "^4.10.0", "unplugin-utils": "^0.2.4" }, "peerDependencies": { "esbuild": ">=0.18.0", "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" } }, "sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "scale-ts": ["scale-ts@1.6.1", "", {}, "sha512-PBMc2AWc6wSEqJYBDPcyCLUj9/tMKnLX70jLOSndMtcUoLQucP/DM0vnQo1wJAYjTrQiq8iG9rD0q6wFzgjH7g=="], + "scrypt-js": ["scrypt-js@3.0.1", "", {}, "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="], "secp256k1": ["secp256k1@4.0.4", "", { "dependencies": { "elliptic": "^6.5.7", "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" } }, "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw=="], @@ -433,20 +630,42 @@ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "smoldot": ["smoldot@2.0.40", "", { "dependencies": { "ws": "^8.8.1" } }, "sha512-h6XC/kKDLdZBBTI0X8y4ZxmaZ2KYVVB0+5isCQm6j26ljeNjHZUDOV+hf8VyoE23+jg00wrxNJ2IVcIAURxwtg=="], + "solidity-ast": ["solidity-ast@0.4.62", "", {}, "sha512-jSC7msQCkJXIzM8LlDjRZ5cif5w40g6THlXHFk3zchbL5dm3YLoBETvqPGo5KndYkftjhcs5kz1fnTu4d34lVQ=="], + "sort-keys": ["sort-keys@5.1.0", "", { "dependencies": { "is-plain-obj": "^4.0.0" } }, "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ=="], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + "stdin-discarder": ["stdin-discarder@0.3.2", "", {}, "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A=="], + + "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], @@ -463,16 +682,36 @@ "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], + "tsc-prog": ["tsc-prog@2.3.0", "", { "peerDependencies": { "typescript": ">=4" } }, "sha512-ycET2d75EgcX7y8EmG4KiZkLAwUzbY4xRhA6NU0uVbHkY4ZjrAAuzTMxXI85kOwATqPnBI5C/7y7rlpY0xdqHA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "type-fest": ["type-fest@5.8.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA=="], + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + "uint8-varint": ["uint8-varint@2.0.5", "", { "dependencies": { "uint8arraylist": "^2.0.0", "uint8arrays": "^5.0.0" } }, "sha512-jeFLbL/x30wBRnWjKE1qVBXeumG46r7XmYkpis955lTQ+blccGKFrOsSMHlxePwYB1pI7L8YPHz1t4jLxEs3nA=="], + + "uint8arraylist": ["uint8arraylist@2.4.9", "", { "dependencies": { "uint8arrays": "^5.0.1" } }, "sha512-KxWjyEFzchzik3aoQlK66oaoxIReoMo5bQRm1fcjBUZvE8xv/tyR3CTKhjh6K/faV8VaF6hd5pjr45CzbwuwkA=="], + + "uint8arrays": ["uint8arrays@5.1.1", "", { "dependencies": { "multiformats": "^13.0.0" } }, "sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ=="], + "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], + + "unplugin-utils": ["unplugin-utils@0.2.5", "", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + "viem": ["viem@2.33.3", "", { "dependencies": { "@noble/curves": "1.9.2", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.0.8", "isows": "1.0.7", "ox": "0.8.6", "ws": "8.18.2" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw=="], "vite": ["vite@7.3.2", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg=="], @@ -487,20 +726,326 @@ "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], + + "write-json-file": ["write-json-file@6.0.0", "", { "dependencies": { "detect-indent": "^7.0.1", "is-plain-obj": "^4.1.0", "sort-keys": "^5.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-MNHcU3f9WxnNyR6MxsYSj64Jz0+dwIpisWKWq9gqLj/GwmA9INg3BZ3vt70/HB3GEwrnDQWr4RPrywnhNzmUFA=="], + + "write-package": ["write-package@7.2.0", "", { "dependencies": { "deepmerge-ts": "^7.1.0", "read-pkg": "^9.0.1", "sort-keys": "^5.0.0", "type-fest": "^4.23.0", "write-json-file": "^6.0.0" } }, "sha512-uMQTubF/vcu+Wd0b5BGtDmiXePd/+44hUWQz2nZPbs92/BnxRo74tqs+hqDo12RLiEd+CXFKUwxvvIZvtt34Jw=="], + "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], + "yoctocolors": ["yoctocolors@2.2.0", "", {}, "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg=="], + + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@ipld/dag-pb/multiformats": ["multiformats@14.0.5", "", {}, "sha512-vbIm83F2yZ1pWJGS0yl0ysracIvv56LtbrIyiIQHoLdYDJOMoLfVFsXhh9DUH4SFdkdkFhucyWniihsNzVEjkQ=="], + + "@parity/bulletin-sdk/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/bulletin-sdk/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.29", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.0.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-yiLm1Gj3j5NrQV+VFMlFzkBgcRBNfq2Sd/U3S8iau2bzhDwgsn4gy6FDt94TRPD5xLxOzi1I3wSLOrgOs2eLVw=="], + + "@parity/cdm-builder/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/cdm-builder/@parity/product-sdk-cloud-storage": ["@parity/product-sdk-cloud-storage@0.7.0", "", { "dependencies": { "@parity/bulletin-sdk": "^0.3.0", "@parity/product-sdk-chain-client": "0.8.0", "@parity/product-sdk-descriptors": "0.7.0", "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-host": "0.13.0", "@parity/product-sdk-logger": "0.1.1", "@parity/product-sdk-tx": "0.3.0", "@parity/result": "0.2.0", "multiformats": "^13.3.0", "polkadot-api": "^2.1.6" } }, "sha512-9yGAEY5JMRPC76t8cnMAkZJwT5D5isk1jpDgc3gAT3h47Ofq1WIAbtHMY4skgOuyxb5WKrZD65GvvtJIpWpslQ=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts": ["@parity/product-sdk-contracts@0.9.0", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-keys": "0.3.14", "@parity/product-sdk-logger": "0.1.1", "@parity/product-sdk-signer": "0.10.0", "@parity/product-sdk-tx": "0.3.0", "@parity/result": "0.2.0", "@polkadot-labs/hdkd-helpers": "^0.0.30", "polkadot-api": "^2.1.6", "viem": "^2.52.0" } }, "sha512-bFLvnVqRMNpHQFgdaFBDUPkDvuhbqp4CE0/P1r5OfW3XWvGtULd3iMougc54aaL9s8F1YBfNwcTIeHHTWdo2Fw=="], + + "@parity/cdm-builder/@parity/product-sdk-tx": ["@parity/product-sdk-tx@0.3.0", "", { "dependencies": { "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-keys": "0.3.14", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "@polkadot-labs/hdkd-helpers": "^0.0.30", "polkadot-api": "^2.1.6" } }, "sha512-VzaCUNYe8J1U33jF+U2Yr+WrP1k4rL4DIipNd2myATSpn/vPHB/xisagwLKrICK4h8B1tip5z1H3VjyznkbC4A=="], + + "@parity/product-sdk-address/@polkadot-api/substrate-bindings": ["@polkadot-api/substrate-bindings@0.12.0", "", { "dependencies": { "@noble/hashes": "^1.8.0", "@polkadot-api/utils": "0.1.2", "@scure/base": "^1.2.5", "scale-ts": "^1.6.1" } }, "sha512-cIjDeJRHW6g3z+/55UzpoG4LG1N0HbT4x3NvZsQkYg4eoio9Sw7Pw2aZZX86pWemxc7vQbNw7WSz2Gz+ckdX6Q=="], + + "@parity/product-sdk-chain-client/@parity/product-sdk-descriptors": ["@parity/product-sdk-descriptors@0.5.2", "", { "dependencies": { "polkadot-api": "^2.1.5" } }, "sha512-5yPBx4SdchSNgjANUi1dRI9UuXzh6NBwCu4HqXOl5T7Kzh95dO9sMW/0DNwa/L1M0Y2SnUhTr+h/FtiJF2p5qg=="], + + "@parity/product-sdk-chain-client/@parity/product-sdk-host": ["@parity/product-sdk-host@0.7.1", "", { "dependencies": { "@parity/product-sdk-logger": "0.1.1", "polkadot-api": "^2.1.5" }, "peerDependencies": { "@novasamatech/host-api": ">=0.8.0", "@novasamatech/host-api-wrapper": ">=0.8.0" }, "optionalPeers": ["@novasamatech/host-api", "@novasamatech/host-api-wrapper"] }, "sha512-eJ1ZVAcV8a/J6NY2cFWzaQwHH2mFkB8x9uWEgk+M/GVJngtdMgEU/9pxJUAYX2jNEKEm/OdncM0hTMxCMKlKqQ=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-descriptors": ["@parity/product-sdk-descriptors@0.5.2", "", { "dependencies": { "polkadot-api": "^2.1.5" } }, "sha512-5yPBx4SdchSNgjANUi1dRI9UuXzh6NBwCu4HqXOl5T7Kzh95dO9sMW/0DNwa/L1M0Y2SnUhTr+h/FtiJF2p5qg=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-host": ["@parity/product-sdk-host@0.7.1", "", { "dependencies": { "@parity/product-sdk-logger": "0.1.1", "polkadot-api": "^2.1.5" }, "peerDependencies": { "@novasamatech/host-api": ">=0.8.0", "@novasamatech/host-api-wrapper": ">=0.8.0" }, "optionalPeers": ["@novasamatech/host-api", "@novasamatech/host-api-wrapper"] }, "sha512-eJ1ZVAcV8a/J6NY2cFWzaQwHH2mFkB8x9uWEgk+M/GVJngtdMgEU/9pxJUAYX2jNEKEm/OdncM0hTMxCMKlKqQ=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx": ["@parity/product-sdk-tx@0.2.9", "", { "dependencies": { "@parity/product-sdk-keys": "0.3.5", "@parity/product-sdk-logger": "0.1.1", "@polkadot-labs/hdkd-helpers": "^0.0.30", "polkadot-api": "^2.1.5" } }, "sha512-fVGtWauv2Gm84dWQn/D3PPMDIEzcIKq9EKJ5gtb0GfJO7HRmCPKkLrXNzWWOQB1hIs14h/wLkxP/dDtuzSHkyQ=="], + + "@parity/product-sdk-contracts/@parity/product-sdk-tx": ["@parity/product-sdk-tx@0.3.2", "", { "dependencies": { "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-keys": "0.3.16", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "@polkadot-labs/hdkd-helpers": "^0.0.30", "polkadot-api": "^2.1.6" } }, "sha512-Y10Sw/ZluIAA6+zB9Ty+y0bSwbrEVIeBKN3umrQXHyseDfBmxWEXkwlhjCxnusJ44wtUgrIN9BsNRGI/51ffKQ=="], + + "@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@parity/product-sdk-contracts/viem": ["viem@2.55.11", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.14.33", "ws": "8.21.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-RR5MwtdUnFfqw6ZGoFptizywyLOkLuhTL7UafoP3Irf2upXpANakQkLgGqY4H7A7+8JBxjUs6lElGF5zuGjMEw=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd": ["@polkadot-labs/hdkd@0.0.28", "", { "dependencies": { "@polkadot-labs/hdkd-helpers": "~0.0.29" } }, "sha512-LpdqtQRpcgZQ5Mr8J0ddMA5ZufsbI4W3KuJkVdoYMnSmWs4179LigDb1rTYAOtyCg2jWUjf7rWP0mGxQQvNrHw=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@parity/product-sdk-keys/@scure/sr25519": ["@scure/sr25519@2.2.0", "", { "dependencies": { "@noble/curves": "~2.2.0", "@noble/hashes": "~2.2.0" } }, "sha512-UTOZb6Hzw44REQdl2SWNBhBFIoqOIhMLNIz3zYyVQLbqdshhuyuuxYoibKHlDg9oqdwdCHQe5LkTsevugPpUbw=="], + + "@parity/product-sdk-local-storage/@parity/product-sdk-host": ["@parity/product-sdk-host@0.14.1", "", { "dependencies": { "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "@parity/truapi": "^0.5.0", "@polkadot-api/json-rpc-provider": "^0.2.0", "@polkadot-api/substrate-bindings": "^0.20.3", "neverthrow": "^8.2.0", "polkadot-api": "^2.1.6" } }, "sha512-PF87O0Kb35TyZo+sDlcYo9ZvaUedR8NNbcZvfBf8PBL65Yck10jIDuXE386hl9pgpgOn6o0Y1z6iJfEolhNXsg=="], + + "@parity/product-sdk-signer/@parity/product-sdk-host": ["@parity/product-sdk-host@0.14.1", "", { "dependencies": { "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "@parity/truapi": "^0.5.0", "@polkadot-api/json-rpc-provider": "^0.2.0", "@polkadot-api/substrate-bindings": "^0.20.3", "neverthrow": "^8.2.0", "polkadot-api": "^2.1.6" } }, "sha512-PF87O0Kb35TyZo+sDlcYo9ZvaUedR8NNbcZvfBf8PBL65Yck10jIDuXE386hl9pgpgOn6o0Y1z6iJfEolhNXsg=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys": ["@parity/product-sdk-keys@0.3.13", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-crypto": "0.1.1", "@parity/product-sdk-local-storage": "0.2.12", "@polkadot-labs/hdkd": "^0.0.28", "@polkadot-labs/hdkd-helpers": "^0.0.30", "@scure/sr25519": "^2.2.0", "polkadot-api": "^2.1.6", "scale-ts": "^1.6.1" } }, "sha512-wi8LJG7ovr9RbwyeOProjsHoTX8V+qDZBw4gqJE6Y9fPF3vlSGjhoS+D9Doeg7+wwqh+rzoiA6jlyxP8bok9cw=="], + + "@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@parity/truapi/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@polkadot-api/cli/@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + + "@polkadot-api/cli/rollup": ["rollup@4.62.4", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.62.4", "@rollup/rollup-android-arm64": "4.62.4", "@rollup/rollup-darwin-arm64": "4.62.4", "@rollup/rollup-darwin-x64": "4.62.4", "@rollup/rollup-freebsd-arm64": "4.62.4", "@rollup/rollup-freebsd-x64": "4.62.4", "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", "@rollup/rollup-linux-arm-musleabihf": "4.62.4", "@rollup/rollup-linux-arm64-gnu": "4.62.4", "@rollup/rollup-linux-arm64-musl": "4.62.4", "@rollup/rollup-linux-loong64-gnu": "4.62.4", "@rollup/rollup-linux-loong64-musl": "4.62.4", "@rollup/rollup-linux-ppc64-gnu": "4.62.4", "@rollup/rollup-linux-ppc64-musl": "4.62.4", "@rollup/rollup-linux-riscv64-gnu": "4.62.4", "@rollup/rollup-linux-riscv64-musl": "4.62.4", "@rollup/rollup-linux-s390x-gnu": "4.62.4", "@rollup/rollup-linux-x64-gnu": "4.62.4", "@rollup/rollup-linux-x64-musl": "4.62.4", "@rollup/rollup-openbsd-x64": "4.62.4", "@rollup/rollup-openharmony-arm64": "4.62.4", "@rollup/rollup-win32-arm64-msvc": "4.62.4", "@rollup/rollup-win32-ia32-msvc": "4.62.4", "@rollup/rollup-win32-x64-gnu": "4.62.4", "@rollup/rollup-win32-x64-msvc": "4.62.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg=="], + + "@polkadot-api/cli/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "@polkadot-api/signer/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@polkadot-api/smoldot/@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + + "@polkadot-api/smoldot/smoldot": ["smoldot@3.3.2", "", { "dependencies": { "ws": "^8.8.1" } }, "sha512-Zl4h/0gsw8cfTZzuJ7LV7mtR6QjxltwYjMY7MsVw0oXBXrLK8zyOS6DS9Vjsy57pX1vBMg6UVhHxjbH3W905zA=="], + + "@polkadot-api/substrate-bindings/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@polkadot-api/substrate-bindings/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@polkadot-labs/hdkd/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@polkadot-labs/hdkd-helpers/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@scure/sr25519/@noble/curves": ["@noble/curves@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw=="], + + "@scure/sr25519/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + "elliptic/bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="], + "execa/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "secp256k1/node-addon-api": ["node-addon-api@5.1.0", "", {}, "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="], "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "write-package/read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], + + "write-package/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "@parity/bulletin-sdk/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/bulletin-sdk/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@parity/cdm-builder/@parity/product-sdk-cloud-storage/@parity/product-sdk-chain-client": ["@parity/product-sdk-chain-client@0.8.0", "", { "dependencies": { "@parity/product-sdk-descriptors": "0.7.0", "@parity/product-sdk-host": "0.13.0", "@parity/product-sdk-logger": "0.1.1", "polkadot-api": "^2.1.6" } }, "sha512-kDuugg/2AvzIBBeHkeOu2+5t9pOrVBdEBkIbfREffshSf7hIqYFrSOjf+GmNgJTd/yo49TL7oHqQAOSIclcxRQ=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@parity/product-sdk-keys": ["@parity/product-sdk-keys@0.3.14", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-crypto": "0.1.1", "@parity/product-sdk-local-storage": "0.3.0", "@polkadot-labs/hdkd": "^0.0.28", "@polkadot-labs/hdkd-helpers": "^0.0.30", "@scure/sr25519": "^2.2.0", "polkadot-api": "^2.1.6", "scale-ts": "^1.6.1" } }, "sha512-MZ0QNyYyyTrDrE07xbmHAVTEhImb8TbZBJkSKrvpjdhmphz+L3HMMVKJQxoKq4gkcWrd+psMwaMxQcLXn8HpXw=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@parity/product-sdk-signer": ["@parity/product-sdk-signer@0.10.0", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-errors": "0.2.0", "@parity/product-sdk-host": "0.13.0", "@parity/product-sdk-keys": "0.3.14", "@parity/product-sdk-logger": "0.1.1", "@parity/result": "0.2.0", "polkadot-api": "^2.1.6" } }, "sha512-OoVvhQZ2vcMVdEVi0obsqhiLdrwLPBxhVc43Buhd2n1eeYGwLIoiKw3TFJTQo3paASx6pM2sDrheudPJsKyrpA=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/viem": ["viem@2.55.11", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.14.33", "ws": "8.21.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-RR5MwtdUnFfqw6ZGoFptizywyLOkLuhTL7UafoP3Irf2upXpANakQkLgGqY4H7A7+8JBxjUs6lElGF5zuGjMEw=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@parity/product-sdk-keys": ["@parity/product-sdk-keys@0.3.14", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-crypto": "0.1.1", "@parity/product-sdk-local-storage": "0.3.0", "@polkadot-labs/hdkd": "^0.0.28", "@polkadot-labs/hdkd-helpers": "^0.0.30", "@scure/sr25519": "^2.2.0", "polkadot-api": "^2.1.6", "scale-ts": "^1.6.1" } }, "sha512-MZ0QNyYyyTrDrE07xbmHAVTEhImb8TbZBJkSKrvpjdhmphz+L3HMMVKJQxoKq4gkcWrd+psMwaMxQcLXn8HpXw=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@parity/product-sdk-address/@polkadot-api/substrate-bindings/@polkadot-api/utils": ["@polkadot-api/utils@0.1.2", "", {}, "sha512-yhs5k2a8N1SBJcz7EthZoazzLQUkZxbf+0271Xzu42C5AEM9K9uFLbsB+ojzHEM72O5X8lPtSwGKNmS7WQyDyg=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@parity/product-sdk-keys": ["@parity/product-sdk-keys@0.3.5", "", { "dependencies": { "@parity/product-sdk-address": "0.1.1", "@parity/product-sdk-crypto": "0.1.1", "@parity/product-sdk-local-storage": "0.2.4", "@polkadot-labs/hdkd": "^0.0.28", "@polkadot-labs/hdkd-helpers": "^0.0.30", "@scure/sr25519": "^2.2.0", "polkadot-api": "^2.1.5", "scale-ts": "^1.6.1" } }, "sha512-3gW058jMeVzk4KsDRpg90aJ9HS4Ts9Bfpee0kUOlMYw/UcaxXBo0FJ4dheskfcowW6dSGLg/hB4ZPr1ssT544Q=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers": ["@polkadot-labs/hdkd-helpers@0.0.30", "", { "dependencies": { "@noble/curves": "^2.2.0", "@noble/hashes": "^2.2.0", "@scure/base": "^2.2.0", "@scure/sr25519": "^1.0.0", "scale-ts": "^1.6.1" } }, "sha512-qWmmD6ayj14RenDuDFfjF3sHS7ObqPzwIIMPcSVoDeKFSeQV7RY0HwyhC5CG4i6FoguMzak2dbtjYpNN5XQiwQ=="], + + "@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@parity/product-sdk-contracts/viem/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], + + "@parity/product-sdk-contracts/viem/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], + + "@parity/product-sdk-contracts/viem/ox": ["ox@0.14.33", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ=="], + + "@parity/product-sdk-contracts/viem/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers/@scure/sr25519": ["@scure/sr25519@1.0.0", "", { "dependencies": { "@noble/curves": "~2.0.0", "@noble/hashes": "~2.0.0" } }, "sha512-b+uhK5akMINXZP95F3gJGcb5CMKYxf+q55fwMl0GoBwZDbWolmGNi1FrBSwuaZX5AhqS2byHiAueZgtDNpot2A=="], + + "@parity/product-sdk-keys/@scure/sr25519/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-keys/@scure/sr25519/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-local-storage/@parity/product-sdk-host/@parity/truapi": ["@parity/truapi@0.5.1", "", { "dependencies": { "@noble/hashes": "^2.2.0", "neverthrow": "^8.2.0", "scale-ts": "^1.6.1" } }, "sha512-5AV6YoqnUKXj2wJ/qt/J2i3jpFawhEVkY165V5fSDccGkgK2oVHxlSfLwscXpZp4DxwFTL1FmvkhwhuqPDIdtA=="], + + "@parity/product-sdk-signer/@parity/product-sdk-host/@parity/truapi": ["@parity/truapi@0.5.1", "", { "dependencies": { "@noble/hashes": "^2.2.0", "neverthrow": "^8.2.0", "scale-ts": "^1.6.1" } }, "sha512-5AV6YoqnUKXj2wJ/qt/J2i3jpFawhEVkY165V5fSDccGkgK2oVHxlSfLwscXpZp4DxwFTL1FmvkhwhuqPDIdtA=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys/@parity/product-sdk-local-storage": ["@parity/product-sdk-local-storage@0.2.12", "", { "dependencies": { "@parity/product-sdk-host": "0.12.0", "@parity/product-sdk-logger": "0.1.1" } }, "sha512-qVou7bDpxHjEbVoHEoehBv1HEaAitEn00hnUYrRbtKa289koB7hmz8UcW2SWkWTi6Fayn3ViLHnzmBL20t5uhg=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys/@polkadot-labs/hdkd": ["@polkadot-labs/hdkd@0.0.28", "", { "dependencies": { "@polkadot-labs/hdkd-helpers": "~0.0.29" } }, "sha512-LpdqtQRpcgZQ5Mr8J0ddMA5ZufsbI4W3KuJkVdoYMnSmWs4179LigDb1rTYAOtyCg2jWUjf7rWP0mGxQQvNrHw=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519": ["@scure/sr25519@2.2.0", "", { "dependencies": { "@noble/curves": "~2.2.0", "@noble/hashes": "~2.2.0" } }, "sha512-UTOZb6Hzw44REQdl2SWNBhBFIoqOIhMLNIz3zYyVQLbqdshhuyuuxYoibKHlDg9oqdwdCHQe5LkTsevugPpUbw=="], + + "@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@polkadot-api/cli/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.4", "", { "os": "android", "cpu": "arm" }, "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.4", "", { "os": "android", "cpu": "arm64" }, "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.4", "", { "os": "linux", "cpu": "arm" }, "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.4", "", { "os": "linux", "cpu": "arm" }, "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.4", "", { "os": "linux", "cpu": "none" }, "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.4", "", { "os": "linux", "cpu": "x64" }, "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.4", "", { "os": "linux", "cpu": "x64" }, "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.4", "", { "os": "none", "cpu": "arm64" }, "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.4", "", { "os": "win32", "cpu": "x64" }, "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw=="], + + "@polkadot-api/cli/rollup/@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.4", "", { "os": "win32", "cpu": "x64" }, "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q=="], + + "@polkadot-api/cli/rollup/@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@polkadot-api/smoldot/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + + "@polkadot-api/smoldot/smoldot/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "@polkadot-labs/hdkd/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@polkadot-labs/hdkd/@polkadot-labs/hdkd-helpers/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@polkadot-labs/hdkd/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + "hash-base/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "write-package/read-pkg/normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], + + "write-package/read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@parity/product-sdk-keys/@parity/product-sdk-local-storage": ["@parity/product-sdk-local-storage@0.3.0", "", { "dependencies": { "@parity/product-sdk-host": "0.13.0", "@parity/product-sdk-logger": "0.1.1" } }, "sha512-4LClLkxwEs3UBa/2psLogpGE2GOxoY692cW/4MBwZ+fspY61F/XcvkpR+LS7AeiQATKpByH9HqI20YD31oXtnw=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@parity/product-sdk-keys/@polkadot-labs/hdkd": ["@polkadot-labs/hdkd@0.0.28", "", { "dependencies": { "@polkadot-labs/hdkd-helpers": "~0.0.29" } }, "sha512-LpdqtQRpcgZQ5Mr8J0ddMA5ZufsbI4W3KuJkVdoYMnSmWs4179LigDb1rTYAOtyCg2jWUjf7rWP0mGxQQvNrHw=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@parity/product-sdk-keys/@scure/sr25519": ["@scure/sr25519@2.2.0", "", { "dependencies": { "@noble/curves": "~2.2.0", "@noble/hashes": "~2.2.0" } }, "sha512-UTOZb6Hzw44REQdl2SWNBhBFIoqOIhMLNIz3zYyVQLbqdshhuyuuxYoibKHlDg9oqdwdCHQe5LkTsevugPpUbw=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/viem/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/viem/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/viem/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/viem/ox": ["ox@0.14.33", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/viem/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@parity/product-sdk-keys/@parity/product-sdk-local-storage": ["@parity/product-sdk-local-storage@0.3.0", "", { "dependencies": { "@parity/product-sdk-host": "0.13.0", "@parity/product-sdk-logger": "0.1.1" } }, "sha512-4LClLkxwEs3UBa/2psLogpGE2GOxoY692cW/4MBwZ+fspY61F/XcvkpR+LS7AeiQATKpByH9HqI20YD31oXtnw=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@parity/product-sdk-keys/@polkadot-labs/hdkd": ["@polkadot-labs/hdkd@0.0.28", "", { "dependencies": { "@polkadot-labs/hdkd-helpers": "~0.0.29" } }, "sha512-LpdqtQRpcgZQ5Mr8J0ddMA5ZufsbI4W3KuJkVdoYMnSmWs4179LigDb1rTYAOtyCg2jWUjf7rWP0mGxQQvNrHw=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519": ["@scure/sr25519@2.2.0", "", { "dependencies": { "@noble/curves": "~2.2.0", "@noble/hashes": "~2.2.0" } }, "sha512-UTOZb6Hzw44REQdl2SWNBhBFIoqOIhMLNIz3zYyVQLbqdshhuyuuxYoibKHlDg9oqdwdCHQe5LkTsevugPpUbw=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@parity/product-sdk-keys/@parity/product-sdk-local-storage": ["@parity/product-sdk-local-storage@0.2.4", "", { "dependencies": { "@parity/product-sdk-host": "0.7.1", "@parity/product-sdk-logger": "0.1.1" } }, "sha512-lp0E2mQieLBKLm1Pm1ZQRx2vfT/1HvfKwtE1z/R0PfFYNWIPM9zNO8y6ccIGwPnX1hsQhx+XQzSBU4ssZstvlw=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@parity/product-sdk-keys/@polkadot-labs/hdkd": ["@polkadot-labs/hdkd@0.0.28", "", { "dependencies": { "@polkadot-labs/hdkd-helpers": "~0.0.29" } }, "sha512-LpdqtQRpcgZQ5Mr8J0ddMA5ZufsbI4W3KuJkVdoYMnSmWs4179LigDb1rTYAOtyCg2jWUjf7rWP0mGxQQvNrHw=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519": ["@scure/sr25519@2.2.0", "", { "dependencies": { "@noble/curves": "~2.2.0", "@noble/hashes": "~2.2.0" } }, "sha512-UTOZb6Hzw44REQdl2SWNBhBFIoqOIhMLNIz3zYyVQLbqdshhuyuuxYoibKHlDg9oqdwdCHQe5LkTsevugPpUbw=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@polkadot-labs/hdkd-helpers/@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers/@scure/sr25519/@noble/curves": ["@noble/curves@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw=="], + + "@parity/product-sdk-keys/@polkadot-labs/hdkd-helpers/@scure/sr25519/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + + "@parity/product-sdk-local-storage/@parity/product-sdk-host/@parity/truapi/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-signer/@parity/product-sdk-host/@parity/truapi/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys/@parity/product-sdk-local-storage/@parity/product-sdk-host": ["@parity/product-sdk-host@0.12.0", "", { "dependencies": { "@parity/product-sdk-logger": "0.1.1", "@parity/truapi": "^0.3.2", "@polkadot-api/json-rpc-provider": "^0.2.0", "@polkadot-api/substrate-bindings": "^0.20.3", "neverthrow": "^8.2.0", "polkadot-api": "^2.1.6" } }, "sha512-5K6q650w2dkYvMjQ+KXIQ1XweH9m3YzJMZCA3A78FdO2e62mdfxHS+T4JkD0yX3RisPer+7uYWM28DdPSdo/LQ=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "write-package/read-pkg/normalize-package-data/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "@parity/cdm-builder/@parity/product-sdk-contracts/@parity/product-sdk-keys/@scure/sr25519/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/cdm-builder/@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519/@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@parity/product-sdk-cloud-storage/@parity/product-sdk-tx/@parity/product-sdk-keys/@scure/sr25519/@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "write-package/read-pkg/normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], } } diff --git a/package.json b/package.json index 8678f021..bea569ca 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "deploy:testnet": "./scripts/deploy/run.sh '--timeout 1000'", "deploy:factory": "./scripts/deploy/factory.sh", "deploy:all": "./scripts/deploy/deployall.sh", + "cdm:generate": "bun scripts/deploy/cdm/generate.ts", + "cdm:register": "bun scripts/deploy/cdm/register.ts", "postinstall": "./setup.bash", "reset": "forge clean" }, @@ -43,6 +45,11 @@ "node": "24.6.0" }, "dependencies": { - "@openzeppelin/upgrades-core": "1.44.2" + "@openzeppelin/upgrades-core": "1.44.2", + "@parity/cdm-builder": "^5.0.0", + "@parity/cdm-env": "^2.3.0", + "@parity/product-sdk-cloud-storage": "^0.5.4", + "@parity/product-sdk-contracts": "^0.9.0", + "@parity/product-sdk-tx": "^0.2.8" } -} \ No newline at end of file +} diff --git a/scripts/deploy/cdm/descriptors.json b/scripts/deploy/cdm/descriptors.json new file mode 100644 index 00000000..705627f7 --- /dev/null +++ b/scripts/deploy/cdm/descriptors.json @@ -0,0 +1,137 @@ +{ + "repository": "https://github.com/paritytech/dotns", + "homepage": "https://github.com/paritytech/dotns#readme", + "authors": [ + "Parity Technologies" + ], + "contracts": [ + { + "name": "DotnsProtocolRegistry", + "cdmPackage": "@dotns/protocol-registry", + "description": "dotNS protocol-level address registry used by contracts to resolve sibling protocol components at runtime.", + "sourcePath": "contracts/registry/DotnsProtocolRegistry.sol", + "artifactContract": "DotnsProtocolRegistry", + "readme": "DotnsProtocolRegistry.md" + }, + { + "name": "Multicall3", + "cdmPackage": "@dotns/multicall3", + "description": "Generic Multicall3 helper for batching dotNS and other Asset Hub contract reads.", + "sourcePath": "contracts/utils/Multicall3.sol", + "artifactContract": "Multicall3", + "readme": "Multicall3.md" + }, + { + "name": "DotnsRegistrar", + "cdmPackage": "@dotns/registrar", + "description": "ERC721 token of record for .dot names, with controller-gated minting and PopRules-priced, fee-gated transfers.", + "sourcePath": "contracts/registrars/DotnsRegistrar.sol", + "artifactContract": "DotnsRegistrar", + "readme": "DotnsRegistrar.md" + }, + { + "name": "DotnsRegistry", + "cdmPackage": "@dotns/registry", + "description": "Forward dotNS registry for node ownership, resolver selection, and subname records.", + "sourcePath": "contracts/registry/DotnsRegistry.sol", + "artifactContract": "DotnsRegistry", + "readme": "DotnsRegistry.md" + }, + { + "name": "DotnsRegistrarController", + "cdmPackage": "@dotns/registrar-controller", + "description": "Commit-reveal public registration controller for dotNS names.", + "sourcePath": "contracts/registrars/DotnsRegistrarController.sol", + "artifactContract": "DotnsRegistrarController", + "readme": "DotnsRegistrarController.md" + }, + { + "name": "DotnsPopController", + "cdmPackage": "@dotns/pop-controller", + "description": "Gateway-only controller issuing lite- and full-person PoP usernames, with per-label base-name reservation queues.", + "sourcePath": "contracts/registrars/DotnsPopController.sol", + "artifactContract": "DotnsPopController", + "readme": "DotnsPopController.md" + }, + { + "name": "RootGatewayDispatcher", + "cdmPackage": "@dotns/root-gateway-dispatcher", + "description": "Root-authority dispatcher that forwards verified gateway calls into the PoP controller.", + "sourcePath": "contracts/registrars/RootGatewayDispatcher.sol", + "artifactContract": "RootGatewayDispatcher", + "readme": "RootGatewayDispatcher.md" + }, + { + "name": "PopRules", + "cdmPackage": "@dotns/pop-rules", + "description": "Proof-of-Personhood policy and pricing rules for dotNS registration and transfer flows.", + "sourcePath": "contracts/pop/PopRules.sol", + "artifactContract": "PopRules", + "readme": "PopRules.md" + }, + { + "name": "DotnsResolver", + "cdmPackage": "@dotns/resolver", + "description": "Forward resolver mapping each dotNS node to a single address record, writable by the node owner.", + "sourcePath": "contracts/resolvers/DotnsResolver.sol", + "artifactContract": "DotnsResolver", + "readme": "DotnsResolver.md" + }, + { + "name": "DotnsReverseResolver", + "cdmPackage": "@dotns/reverse-resolver", + "description": "Reverse resolver that maps owner accounts back to dotNS names.", + "sourcePath": "contracts/resolvers/DotnsReverseResolver.sol", + "artifactContract": "DotnsReverseResolver", + "readme": "DotnsReverseResolver.md" + }, + { + "name": "DotnsContentResolver", + "cdmPackage": "@dotns/content-resolver", + "description": "Contenthash and text-record resolver for dotNS nodes, with operator-delegated record management.", + "sourcePath": "contracts/resolvers/DotnsContentResolver.sol", + "artifactContract": "DotnsContentResolver", + "readme": "DotnsContentResolver.md" + }, + { + "name": "DotnsPopResolver", + "cdmPackage": "@dotns/pop-resolver", + "description": "Resolver for PoP-issued records: per-node chat keys and bidirectional lite/full username links.", + "sourcePath": "contracts/resolvers/DotnsPopResolver.sol", + "artifactContract": "DotnsPopResolver", + "readme": "DotnsPopResolver.md" + }, + { + "name": "DotnsNameEscrow", + "cdmPackage": "@dotns/name-escrow", + "description": "Escrow contract for dotNS release positions, transfer friction fees, and overpayment accounting.", + "sourcePath": "contracts/escrow/DotnsNameEscrow.sol", + "artifactContract": "DotnsNameEscrow", + "readme": "DotnsNameEscrow.md" + }, + { + "name": "StoreFactory", + "cdmPackage": "@dotns/store-factory", + "description": "Factory deploying each user's permanent LabelStore and UserStore as beacon proxies behind two upgradeable beacons.", + "sourcePath": "contracts/store/StoreFactory.sol", + "artifactContract": "StoreFactory", + "readme": "StoreFactory.md" + }, + { + "name": "LabelStoreBeacon", + "cdmPackage": "@dotns/label-store-beacon", + "description": "Upgradeable beacon that points StoreFactory-created label stores at the current LabelStore implementation.", + "sourcePath": "contracts/store/LabelStore.sol", + "artifactContract": "UpgradeableBeacon", + "readme": "LabelStoreBeacon.md" + }, + { + "name": "UserStoreBeacon", + "cdmPackage": "@dotns/user-store-beacon", + "description": "Upgradeable beacon that points StoreFactory-created user stores at the current UserStore implementation.", + "sourcePath": "contracts/store/UserStore.sol", + "artifactContract": "UpgradeableBeacon", + "readme": "UserStoreBeacon.md" + } + ] +} diff --git a/scripts/deploy/cdm/generate.ts b/scripts/deploy/cdm/generate.ts new file mode 100644 index 00000000..7439d6c2 --- /dev/null +++ b/scripts/deploy/cdm/generate.ts @@ -0,0 +1,171 @@ +#!/usr/bin/env bun +// Generate CDM registration assets from a DotNS deployment. +// +// Reads three inputs and produces one self-contained asset directory that +// `scripts/cdm/register.ts` can publish to a CDM contract registry: +// +// 1. A deployment manifest (`deployments//.json`), +// the flat {"ContractName": "0xaddress"} map written by the deploy +// pipeline — this is where addresses come from. +// 2. Foundry build artifacts (`out/.sol/.json`) — this is +// where ABIs come from. Run `forge build` first. +// 3. The static descriptor map (`scripts/deploy/cdm/descriptors.json`) + readmes +// (`scripts/cdm/readmes/*.md`) — checked-in, deployment-independent +// metadata: CDM package names, descriptions, docs. +// +// Nothing in the output is hand-maintained: addresses and ABIs always come +// from the actual deployment and build, so the generated assets cannot drift +// from what is on chain (see issue: "Generate CDM registration metadata from +// DotNS deployments"). +// +// Local usage: +// forge build +// bun run cdm:generate -- \ +// --deployment deployments/paseo-assethub/420420417.json \ +// --network paseo-assethub-previewnet +// +// Output (git-ignored): +// .generated/dotns-cdm/ +// metadata.json manifest consumed by register.ts +// abis/*.abi.json extracted from Foundry artifacts +// *.md copied readmes + +import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { basename, dirname, join, resolve } from "node:path"; +import { parseArgs } from "node:util"; + +const REPO_ROOT = resolve(dirname(Bun.main), "../../.."); + +const { values: flags } = parseArgs({ + options: { + deployment: { type: "string" }, + network: { type: "string" }, + out: { type: "string", default: ".generated/dotns-cdm" }, + "cdm-registry": { type: "string" }, + help: { type: "boolean", short: "h" }, + }, +}); + +if (flags.help || !flags.deployment || !flags.network) { + console.log( + `Usage: bun run cdm:generate -- --deployment deployments//.json --network [--out .generated/dotns-cdm] [--cdm-registry
]`, + ); + process.exit(flags.help ? 0 : 1); +} + +const readJson = (path: string) => JSON.parse(readFileSync(path, "utf8")); + +interface Descriptor { + name: string; + cdmPackage: string; + description: string; + sourcePath: string; + artifactContract: string; + readme: string; +} + +const descriptorsPath = join(REPO_ROOT, "scripts/deploy/cdm/descriptors.json"); +const descriptorDoc = readJson(descriptorsPath) as { + repository: string; + homepage: string; + authors: string[]; + contracts: Descriptor[]; +}; + +const deploymentPath = resolve(flags.deployment); +if (!existsSync(deploymentPath)) { + console.error(`Deployment manifest not found: ${deploymentPath}`); + process.exit(1); +} +const deployment = readJson(deploymentPath) as Record; + +// The deploy pipeline's serialization sentinel; never a contract. +delete deployment._seed; + +// Every descriptor must have a deployed address — a manifest missing any +// published contract is a partial deploy and must not be registered. +const missing = descriptorDoc.contracts + .map((d) => d.name) + .filter((name) => !/^0x[0-9a-fA-F]{40}$/.test(deployment[name] ?? "")); +if (missing.length > 0) { + console.error( + `Deployment manifest ${flags.deployment} is missing required contracts:\n ${missing.join("\n ")}`, + ); + process.exit(1); +} + +// The reverse — deployed contracts we have no descriptor for — is fine +// (Create3Factory is deployment infrastructure, not a CDM package), but say +// so, in case a new contract was added without a descriptor. +const undescribed = Object.keys(deployment).filter( + (name) => !descriptorDoc.contracts.some((d) => d.name === name), +); +if (undescribed.length > 0) { + console.log(`Skipping manifest entries with no CDM descriptor: ${undescribed.join(", ")}`); +} + +const outDir = resolve(flags.out); +mkdirSync(join(outDir, "abis"), { recursive: true }); + +const contracts = descriptorDoc.contracts.map((descriptor) => { + // Foundry keys artifacts by source file, and every artifact we publish + // lives in a file named after its contract (.sol/.json) + // — including UpgradeableBeacon, which comes from OpenZeppelin. + const artifactPath = join( + REPO_ROOT, + "out", + `${descriptor.artifactContract}.sol`, + `${descriptor.artifactContract}.json`, + ); + if (!existsSync(artifactPath)) { + console.error( + `Foundry artifact not found: ${artifactPath}\n` + + `(descriptor ${descriptor.name} → artifact contract ${descriptor.artifactContract}; run \`forge build\` first)`, + ); + process.exit(1); + } + const abi = readJson(artifactPath).abi; + if (!Array.isArray(abi) || abi.length === 0) { + console.error(`Artifact has no ABI: ${artifactPath}`); + process.exit(1); + } + + const readmeSource = join(REPO_ROOT, "scripts/deploy/cdm/readmes", descriptor.readme); + if (!existsSync(readmeSource)) { + console.error(`Readme not found for ${descriptor.name}: ${readmeSource}`); + process.exit(1); + } + + const abiPath = `abis/${descriptor.name}.abi.json`; + const readmePath = basename(descriptor.readme); + writeFileSync(join(outDir, abiPath), `${JSON.stringify(abi, null, 2)}\n`); + copyFileSync(readmeSource, join(outDir, readmePath)); + + return { + name: descriptor.name, + cdmPackage: descriptor.cdmPackage, + address: deployment[descriptor.name], + description: descriptor.description, + abiPath, + readmePath, + sourcePath: descriptor.sourcePath, + contractName: descriptor.artifactContract, + }; +}); + +const metadata = { + version: 1, + // Also used by register.ts as the published_at timestamp, so re-registering + // the same generated assets produces byte-identical metadata (and thus the + // same content CIDs), which is what makes registration idempotent. + generatedAt: new Date().toISOString(), + network: flags.network, + ...(flags["cdm-registry"] ? { registry: flags["cdm-registry"] } : {}), + repository: descriptorDoc.repository, + homepage: descriptorDoc.homepage, + authors: descriptorDoc.authors, + contracts, +}; + +writeFileSync(join(outDir, "metadata.json"), `${JSON.stringify(metadata, null, 2)}\n`); +console.log(`Generated CDM assets for ${contracts.length} contracts at ${outDir}`); diff --git a/scripts/deploy/cdm/readmes/DotnsContentResolver.md b/scripts/deploy/cdm/readmes/DotnsContentResolver.md new file mode 100644 index 00000000..c20141db --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsContentResolver.md @@ -0,0 +1,17 @@ +# DotnsContentResolver + +Stores per-node contenthash and arbitrary text key/value records — where a name points at content (e.g. an IPFS CID) and publishes metadata (social handles, avatars, verification data). + +## Interface + +**Reads (open)**: `contenthash(node) → bytes`, `text(node, key) → string`, `isApprovedForAll(owner, operator) → bool`. + +**Writes**: +- `setContenthash(node, bytes)`, `setText(node, key, value)` — the node owner, a resolver-local approved operator, or any address the registry's `isAuthorised` recognises for the node (the ERC721 holder, a single-token approvee, or an operator-for-all on the registrar); `NotAuthorised` otherwise. +- `setApprovalForAll(operator, bool)` — ERC721-style, but scoped to this resolver: the operator can edit the caller's records yet gains no power over ownership or transfers. This is the narrowest delegation; a registrar-level approval also confers record-write authority here (and transfer power everywhere). + +UUPS-upgradeable, `Ownable`. Authority is re-evaluated against the current node owner (via the forward registry, resolved live from the protocol registry) on every write, so transferring the name drops the prior owner's delegates automatically. + +## Notes + +- Records are opaque bytes/strings — no validation or normalization; text keys are case-sensitive. diff --git a/scripts/deploy/cdm/readmes/DotnsNameEscrow.md b/scripts/deploy/cdm/readmes/DotnsNameEscrow.md new file mode 100644 index 00000000..f6a3a0ae --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsNameEscrow.md @@ -0,0 +1,32 @@ +# DotnsNameEscrow + +Custodial vault for dotNS registration deposits and transfer-friction fees. Deposits are bound to the **name (`tokenId`)**, not the depositor, so they travel with the NFT and only unlock when the holder releases the name. + +## What it does + +**Deposits.** The controller records a deposit per `tokenId` on registration (native token only). The position's recipient rebinds to the current holder on every transfer — transferring a funded name hands the locked deposit to the recipient. Zero-amount positions are valid (free verified registrations) and still releasable. + +**Release lifecycle.** `release(tokenId)` (the holder, who must first approve the escrow on the registrar) moves the name into escrow custody and starts a cooldown; `withdraw(tokenId)` after the cooldown credits the deposit to the holder's withdrawal balance; the controller's `reclaim` later hands the name to a new registrant — a position is only reclaimable once it has been both released *and* withdrawn. + +**Two pull-payment ledgers, deliberately separate:** +- *Withdrawal ledger* — no cooldown of its own. Receives withdrawn release deposits (the cooldown already ran on the position) and registration overpayments that couldn't be returned inline. Pulled with `claimWithdrawal()`. +- *Refund ledger* — each entry carries its own cooldown clock. Holds transfer-fee overpayments credited by `chargeTransferFee`. Pulled with `claimRefund(id)` / `claimRefundsBatch(ids)`. + +Transfer-friction fees (`chargeTransferFee`, registrar only) go to a non-refundable shared **insurance fund**. + +## Interface + +**Reads**: `getReleasePosition(tokenId)`, `pendingWithdrawal(addr)`, `pendingRefundCount/Ids/refunds(addr, offset, limit)` (paginated, capped), `refundEntry(id)`, `releasedTokens(...)`, `insuranceFund()`, `cooldown()`. + +**Writes (holder)**: `release`, `withdraw`, `claimWithdrawal`, `claimRefund`, `claimRefundsBatch`. + +**Writes (protocol)**: `deposit`, `creditOverpayment`, `depositInsurance`, `reclaim` (controller only); `chargeTransferFee` (registrar only). + +**Writes (owner)**: `updateCooldown` (capped at `MAX_COOLDOWN`, 1 hour). + +UUPS-upgradeable, `Ownable`, reentrancy-guarded, `IERC721Receiver` (rejects unsolicited transfers). + +## Notes + +- The cooldown is a short window — the original payer's uncontested chance to pull a refund before the name is handed out again, not a long-lived lock. Cooldown changes affect only future releases. +- Because the deposit follows the NFT, a NoStatus user cannot recover their deposit by re-registering from a fresh address; the only path back is releasing the name. diff --git a/scripts/deploy/cdm/readmes/DotnsPopController.md b/scripts/deploy/cdm/readmes/DotnsPopController.md new file mode 100644 index 00000000..64b0aae7 --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsPopController.md @@ -0,0 +1,31 @@ +# DotnsPopController + +Dedicated controller for the Proof-of-Personhood username flow. Its registration entry points are callable only by the PoP gateway (the `RootGatewayDispatcher` registered under `popGateway`). It issues lite- and full-person usernames to verified users and coordinates with `PopRules` so the public flow sees the same reservations. + +## What it does + +**Issuance** +- `reserveLiteName` — mints a lite-person username. Input is `stem.NN` (one stem label plus a two-digit suffix, e.g. `michal.03`); the controller strips the dot so the on-chain label is flat (`michal03`). Optionally persists the user's chat key on the PoP resolver. +- `reserveBaseName` — mints a lite username and, when a base label is supplied, also enqueues a reservation for the full-person base name the user intends to claim later. `reserveBaseNameOnly` enqueues the reservation without minting. +- `registerBaseName` — mints a full-person username. Whether it is a claim against the user's queued reservation or a fresh standalone registration is derived from on-chain state, not chosen by the caller. A `link` selects the chat-key source (fresh, or inherit from a prior lite name); inheriting also writes the bidirectional lite⇄full links on the PoP resolver in the same transaction. + +**Reservation queue.** Each base label has a head/tail FIFO queue (`MAX_RESERVATION_QUEUE` = 64 deep; entries live for `reservationDuration`). On every head transition the new head is mirrored into `PopRules`, so the public commit-reveal flow is blocked on the same stem. `expireReservation` is permissionless GC of a stale head; `relinquishReservation` drops your own entry. + +**Deferred LabelStore (testnet limitation).** substrate Root cannot deploy a contract for an account it does not control, so for a user with no store yet the controller stamps a *pending claim* instead of writing the label. The user later calls `claimLabelStore` (or the gateway calls `claimLabelStoreFor`) to settle it; `expirePendingClaim` is permissionless GC of stale pending claims. Until a name is settled it has no readable label, and so quotes a zero transfer floor. + +## Interface + +**Writes (gateway only)**: `reserveLiteName`, `reserveBaseName`, `reserveBaseNameOnly`, `registerBaseName`, `claimLabelStoreFor`. The four reserve/register entry points each have a typed-tuple overload and an ABI-encoded-`bytes` overload (for cross-chain payloads); `claimLabelStoreFor(address)` is typed only. + +**Writes (open)**: `claimLabelStore()`, `relinquishReservation()`, `expireReservation(string)`, `expirePendingClaim(address)`. + +**Writes (owner)**: `setReservationDuration(uint64)`. + +**Reads**: `isReservedForClaim(string) → (bool, address)`, `reservationMeta`, `reservationEntry`, `userReservation`, `pendingClaims`, `pendingClaimUsers`/`pendingClaimUserCount` (paginated enumeration). + +UUPS-upgradeable, `Ownable`. + +## Notes + +- The two controllers never import each other; `PopRules` is the single cross-flow authority for stem collisions. +- `registerBaseName` rejects lite-shaped and governance-reserved labels (`InvalidBaseLabel`) and rejects a stem held by another user (`NotHolder`). diff --git a/scripts/deploy/cdm/readmes/DotnsPopResolver.md b/scripts/deploy/cdm/readmes/DotnsPopResolver.md new file mode 100644 index 00000000..3b3038c7 --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsPopResolver.md @@ -0,0 +1,23 @@ +# DotnsPopResolver + +Per-node resolver for records produced by the Proof-of-Personhood flow. The writer is the PoP controller (resolved live from the protocol registry), not the node owner — these records are issued during identity provisioning, not curated by the holder. + +## Records + +- **Chat key** — a 65-byte uncompressed public key per node, the on-chain discovery channel for end-to-end encrypted messaging. Written by the controller on issuance (lite reservations and base registrations, whether fresh or inherited from a prior lite name); must be exactly 65 bytes (`InvalidChatKeyLength`). +- **Lite link** (`liteLink`): full node → the lite labelhash it was claimed from. +- **Full claim** (`fullClaim`): lite labelhash → the full node that claimed it. + +The two links are written together and kept bidirectionally consistent (`fullClaim(liteLink(node)) == node`), so consumers resolve either direction without scanning events. Re-linking nulls the stale inverse entries. + +## Interface + +**Reads (open)**: `chatKey(node)`, `liteLink(node)`, `fullClaim(liteLabelhash)`. + +**Writes (PoP controller only)**: `setChatKey(node, bytes)`, `setLiteLink(fullNode, liteLabelhash)`. + +UUPS-upgradeable, `Ownable`. + +## Notes + +- Rotating the PoP controller needs no resolver upgrade — the writer is read from the registry on each write. diff --git a/scripts/deploy/cdm/readmes/DotnsProtocolRegistry.md b/scripts/deploy/cdm/readmes/DotnsProtocolRegistry.md new file mode 100644 index 00000000..b2eeacd8 --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsProtocolRegistry.md @@ -0,0 +1,29 @@ +# DotnsProtocolRegistry + +The protocol's on-chain address book. Maps well-known `bytes32` role keys to the contract that currently fills each role, so every other dotNS contract discovers its siblings at call time instead of hardcoding addresses. + +## What it does + +A single `key → address` mapping plus a per-address reference count. Resolving a sibling is a `get(key)` view; rewiring the protocol after an upgrade is a single owner `set(key, addr)`. Because consumers re-read the registry on every call, rotating any component (a new PoP controller, a new resolver) takes effect everywhere immediately, with no consumer redeploy. + +The refcount lets one address occupy several keys and tracks whether an address is still wired in anywhere. `isRegisteredAddress` is the O(1) peer-trust gate the stores use to authorize protocol writes. + +## Keys + +`registrar`, `controller`, `registry`, `reverseResolver`, `resolver`, `contentResolver`, `popRules`, `storeFactory`, `popController`, `popResolver`, `nameEscrow`, `multicall3`, `create3Factory`, `popGateway`. + +## Interface + +**Reads** +- `get(bytes32 key) → address` — registered address, or `address(0)` if unset. Callers must null-check where required. +- `isRegisteredAddress(address) → bool` — true if the address is wired under at least one key. + +**Writes** +- `set(bytes32 key, address addr)` — owner only. Rejects `address(0)` (`ZeroAddress`). Idempotent writes emit nothing; effective changes emit `AddressUpdated(key, addr)`. + +UUPS-upgradeable, `Ownable`. + +## Notes + +- The registry does not verify that a stored address is the contract type its key implies — that is governance's responsibility. +- An address stays "registered" until its last key is rewired away. diff --git a/scripts/deploy/cdm/readmes/DotnsRegistrar.md b/scripts/deploy/cdm/readmes/DotnsRegistrar.md new file mode 100644 index 00000000..a8bd295e --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsRegistrar.md @@ -0,0 +1,36 @@ +# DotnsRegistrar + +ERC721 token of record for `.dot` second-level names. The `tokenId` is the name's namehash; holding the token *is* owning the name. Registration is permanent — there is no expiry or renewal. + +## What it does + +Minting is gated to addresses in the `controllers` mapping (owner-managed via `addController`/`removeController`). This is how the public commit-reveal controller and the PoP controller coexist on one registrar: every other contract checks *this* mapping rather than keeping its own. + +Transfers are `payable` and fee-gated. On each transfer the ERC721 `_update` hook: +- mirrors the name's label from the sender's LabelStore into the recipient's, so the label travels with the token; +- quotes a cross-tier transfer floor via `PopRules.transferFloor(label, from, to)` and reverts `TransferFeeRequired` if `msg.value` is short; +- rebinds any escrow release position to the new holder (the refundable deposit follows the NFT, not the prior owner); +- forwards the fee to the escrow. + +Mints and self-transfers must carry no value (`UnexpectedValue`). + +## Interface + +**Reads** +- `available(uint256 id) → bool` — true if unminted *or* held by escrow (signals mint vs. reclaim to the controller). +- `exists(uint256 id) → bool` +- `labelOf(uint256 id) → string` — human label (no `.dot`), read from the holder's LabelStore. +- `quoteTransferFee(uint256 id, address to) → uint256` — extra native value a transfer to `to` will require. +- `controllers(address) → bool`, plus standard ERC721 views. + +**Writes** +- `register(uint256 id, address owner, string label)` — controllers only. Label may be empty (gateway-cold mints) or a single canonical DNS label. +- `addController` / `removeController` — owner only. +- `transferFrom` / `safeTransferFrom` — payable; routed through the fee/escrow hook. + +UUPS-upgradeable, `Ownable`, ERC721. + +## Notes + +- A gateway-issued name whose holder has not yet called `claimLabelStore` has no readable label, so its transfer floor quotes as zero until the store is settled. +- Permanent ownership: names move only by transfer or escrow reclaim — there is no burn path. diff --git a/scripts/deploy/cdm/readmes/DotnsRegistrarController.md b/scripts/deploy/cdm/readmes/DotnsRegistrarController.md new file mode 100644 index 00000000..5875562d --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsRegistrarController.md @@ -0,0 +1,28 @@ +# DotnsRegistrarController + +The public, commit-reveal entry point for registering `.dot` names. Anyone can register here; pricing and eligibility are delegated to `PopRules`. + +## What it does + +**Commit-reveal** defeats front-running: +1. `commit(commitment)` records `keccak256(abi.encode(label, owner, secret, reserved))` with a timestamp. +2. After `minCommitmentAge` (and before `maxCommitmentAge`), `register(registration)` reveals the params alongside payment. + +On reveal it validates the label (single DNS label, ≥3 chars), checks availability on the registrar, prices through PopRules, then orchestrates the full side-effect set: mint on the registrar, forward wire-up on the registry, an optional reverse record, the immutable LabelStore write, the escrow deposit, and an inline refund of any overpayment (falling back to the escrow's pull ledger if the inline push fails). Registering a name a prior holder released back to escrow follows the same flow but routes through `escrow.reclaim` instead of a fresh mint. A direct lite-tier registration additionally stamps a 12-week reservation on the bare stem in PopRules. + +**Pricing paths.** A direct registration (`msg.sender == owner`) routes through `priceWithCheck`, and the charge becomes a refundable NoStatus deposit. A cross-payer registration (a sponsor paying for a different owner) routes through `priceWithoutCheck`, charges the greater of the owner-side price and the downward transfer floor (never their sum) into the escrow insurance fund, and still requires the *owner's* PoP tier to meet the label — sponsoring an unverified owner reverts `OwnerStatusInsufficient`. + +**Whitelist.** `registerReserved` lets whitelisted addresses register reserved labels, bypassing the PoP gate but not the commit-reveal or availability checks. Entries are managed by a dedicated operator role. + +## Interface + +**Reads**: `available(string) → bool`, `makeCommitment(registration) → bytes32`, `isWhiteListed(address) → bool`. + +**Writes**: `commit(bytes32)`, `register(registration)` (payable), `registerReserved(registration)` (whitelist/owner), `whiteListAddress(address, bool)` (operator). + +UUPS-upgradeable, `Ownable` + AccessControl (whitelist-operator role), reentrancy-guarded on the payable paths. + +## Notes + +- Common reverts: `LabelTooShort`, `CommitmentTooNew`/`CommitmentTooOld`, `InsufficientValue`. Reservation and governance conflicts revert `NameReserved`/`GovernanceReserved` on the cross-payer path; the direct path surfaces the same conflicts as `PopError` reverts from PopRules. +- The `secret` is caller-chosen entropy; the same `(label, owner, secret, reserved)` tuple must be passed to both `makeCommitment` and `register`. diff --git a/scripts/deploy/cdm/readmes/DotnsRegistry.md b/scripts/deploy/cdm/readmes/DotnsRegistry.md new file mode 100644 index 00000000..3ca6e7c8 --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsRegistry.md @@ -0,0 +1,33 @@ +# DotnsRegistry + +Forward registry for the `.dot` name hierarchy: maps each node to its `(owner, resolver)` and is where subnames live. Deliberately policy-free — no pricing, expiry, or eligibility logic lives here. + +## What it does + +Nodes are keyed by **namehash** (`keccak256(parentNode, keccak256(label))`, walking right-to-left from the root). Each node holds a `Record { owner, resolver, exists }`. + +- **Second-level names** (`alice.dot`) are tokenised: the record stores `owner = address(0)` as a sentinel and ownership defers to the ERC721 registrar, so `owner(node)` returns the registrar's `ownerOf` for these. +- **Subnames** (`x.alice.dot`) store an explicit owner and can themselves carry subnames. The parent owner is sovereign: it can reassign a subname or its resolver without the subname holder's consent. + +On any ownership change the resolver pointer is **reset to the default reverse resolver**, so a prior owner's resolver wiring never follows a name to its next holder. + +## Interface + +**Reads** +- `owner(bytes32 node) → address` — explicit subnode owner, else the registrar's `ownerOf`, else `address(0)`. +- `resolver(bytes32 node) → address` +- `recordExists(bytes32 node) → bool` +- `isAuthorised(bytes32 node, address account) → bool` — the protocol-wide "may this account manage this node?" check: the stored subnode owner, or (for tokenised names) the ERC721 holder, a single-token approvee, or an operator-for-all on the registrar. Sibling contracts (e.g. the content resolver) delegate to it, so one registrar-level approval carries across the protocol. + +**Writes** +- `setSubnodeOwner((parentNode, subLabel, parentLabel, owner)) → bytes32 subnode` — parent-owner only. Creates/reassigns a subname and indexes it in the owner's LabelStore. Validates the label shape and that `parentLabel` hashes to `parentNode`. +- `setOwner(bytes32 node, address newOwner)` — registrar controllers only; used on escrow reclaim. Requires `newOwner == registrar.ownerOf(node)`. +- `setResolver(bytes32 node, address)` — node owner (or ERC721-approved, for tokenised nodes). +- `setSubnodeResolver((parentNode, subLabel, parentLabel, resolver))` — parent-owner override of an existing subname's resolver. + +UUPS-upgradeable. Controller authority is delegated to the registrar's `controllers` mapping — the registry keeps no controller list of its own. + +## Notes + +- Resolver reset on transfer is unconditional; treat a resolver rotation as a re-attestation prompt and gate resolver reads on current ownership. +- Resolvers are not interface-validated here — verify resolver shape off-chain before trusting reads. diff --git a/scripts/deploy/cdm/readmes/DotnsResolver.md b/scripts/deploy/cdm/readmes/DotnsResolver.md new file mode 100644 index 00000000..62762ee9 --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsResolver.md @@ -0,0 +1,14 @@ +# DotnsResolver + +Forward address resolver — the conventional "name → address" lookup. One address record per node. + +## Interface + +- `addressOf(bytes32 node) → address` — open read; `address(0)` if unset. +- `setAddress(bytes32 node, address)` — current node owner only (`NotAuthorised` otherwise). Emits `AddressSet`. + +The owner check is live: the resolver fetches the registry from the protocol registry on each write, so a registry rewire needs no resolver redeploy. UUPS-upgradeable, `Ownable`. + +## Notes + +- Single address per node — no coin-type / multi-chain records and no operator delegation; only the node owner writes. diff --git a/scripts/deploy/cdm/readmes/DotnsReverseResolver.md b/scripts/deploy/cdm/readmes/DotnsReverseResolver.md new file mode 100644 index 00000000..88ad1e6b --- /dev/null +++ b/scripts/deploy/cdm/readmes/DotnsReverseResolver.md @@ -0,0 +1,17 @@ +# DotnsReverseResolver + +Reverse resolver — maps an account to its primary `.dot` name. Reads are fail-closed against current ownership. + +## What it does + +Two write paths: +- `setReverseName(addr, name)` — seeder, restricted to the registrar/controller; sets a primary on a fresh reserved registration when the registrant has none. +- `claimReverseRecord(label)` — self-service for any current holder; the resolver checks `registrar.ownerOf(namehash(label)) == caller` before writing (`NotNameOwner` otherwise). + +`nameOf(addr)` re-validates current ownership against the registrar before returning, so an address that transferred its primary away resolves to `""` until it claims a name it currently holds. Past ownership is never sufficient. + +UUPS-upgradeable, `Ownable`. + +## Notes + +- The security guarantee is the fail-closed read, not eager cleanup. A registrar that reverts on the ownership check is treated as "not owned" (empty string). diff --git a/scripts/deploy/cdm/readmes/LabelStoreBeacon.md b/scripts/deploy/cdm/readmes/LabelStoreBeacon.md new file mode 100644 index 00000000..b5bab928 --- /dev/null +++ b/scripts/deploy/cdm/readmes/LabelStoreBeacon.md @@ -0,0 +1,20 @@ +# LabelStoreBeacon + +The `UpgradeableBeacon` that every per-user **LabelStore** proxy points at. It is the stable implementation anchor: the `StoreFactory` owner upgrades all label stores at once by pointing this beacon at a new implementation. This entry is the beacon address, not any single per-user store instance. + +## What a LabelStore is + +The protocol-managed half of a user's storage — the durable, append-only ledger of names that address has held. The registrar and controllers write a label entry once when a name is registered or transferred in, and the slot is then **permanently locked** (`LabelAlreadyExists` on rewrite). It exists to answer "what names has this address ever held?", which neither the resolvers (keyed per node) nor the registry (live ownership only) can serve. + +The invariant is *labels only* — every other per-name record (reverse, content, address, chat key, links) lives on a dedicated resolver. Writes are gated to protocol-registered addresses; reads are open and paginated (`getLabel(labelhash)`, `getLabels`, `getLabelhashes`). + +## Beacon interface + +- `implementation() → address` — the LabelStore logic all proxies delegate to. +- `upgradeTo(address)` — owner (StoreFactory) only; upgrades every label store at once. Emits `Upgraded`. +- `owner()`, `transferOwnership(address)`. + +## Notes + +- Per-user store addresses come from `StoreFactory.getLabelStore(user)`; this beacon is the shared implementation pointer, not a store itself. +- The beacon is a plain OZ `UpgradeableBeacon` deployed inside the `StoreFactory` constructor, so unlike the CREATE3-deployed core contracts its address is not guaranteed stable across networks — read it from `StoreFactory.labelStoreBeacon()` or the deployment manifest. diff --git a/scripts/deploy/cdm/readmes/Multicall3.md b/scripts/deploy/cdm/readmes/Multicall3.md new file mode 100644 index 00000000..d532c74a --- /dev/null +++ b/scripts/deploy/cdm/readmes/Multicall3.md @@ -0,0 +1,12 @@ +# Multicall3 + +A standard [Multicall3](https://github.com/mds1/multicall3) deployment for batching calls in a single transaction. Generic infrastructure — not dotNS-specific and not an authorization surface. + +## What it does + +Aggregates an array of calls to arbitrary targets: `aggregate3` / `aggregate3Value` (per-call `allowFailure`), plus the legacy `aggregate`, `tryAggregate`, `blockAndAggregate`, `tryBlockAndAggregate`, and block-info helpers (`getBlockNumber`, `getBasefee`, `getEthBalance`, …). + +## Notes + +- **Caller context:** targets see Multicall3 as `msg.sender`, not the original account. Use it freely for read batching; only route owner-gated dotNS writes through it if the target explicitly supports that caller model. +- This is a dotNS-specific deterministic deployment (via the dotNS CREATE3 factory), **not** the canonical `0xcA11…` singleton. Resolve its address from the protocol registry's `multicall3` key or the deployment manifest — never hardcode `0xcA11…`. diff --git a/scripts/deploy/cdm/readmes/PopRules.md b/scripts/deploy/cdm/readmes/PopRules.md new file mode 100644 index 00000000..d3d75d29 --- /dev/null +++ b/scripts/deploy/cdm/readmes/PopRules.md @@ -0,0 +1,45 @@ +# PopRules + +The Proof-of-Personhood oracle for dotNS. It classifies labels into tiers, reads each account's personhood status from the precompile, prices registrations and transfers, and holds the cross-flow base-name reservation table that both controllers honor. + +## Classification + +A label's tier is read from its **stem** (the label with trailing digits removed) and its trailing-digit count, which must be exactly 0 or 2 (1 or 3+ digits are invalid): + +| Stem length | Trailing digits | Tier | Who can register | +|---|---|---|---| +| ≤ 5 | — | Reserved | governance / whitelist | +| 6–8 | 0 | PopFull | full-person verified | +| 6–8 | 2 | PopLite | lite-person, gateway-issued | +| ≥ 9 | 0 or 2 | NoStatus | anyone (flat deposit) | + +Classification is by *shape*, not by who holds the name — a long `andrewsays` is always a NoStatus-tier label even when a PopFull user owns it. + +## Personhood and pricing + +Tier is read live (never stored) from the personhood precompile at `0x…0a010000` with the `"dotns"` context. The status byte maps `2 → PopFull`, `1 → PopLite`, anything else → `NoStatus` (fail-closed: an unknown future tier is never treated as higher). + +- `priceWithCheck(name, user)` — price plus eligibility; **reverts** on reservation conflict, tier mismatch, or reserved label. +- `priceWithoutCheck(name, user)` — same numbers, non-reverting (reports `Reserved` instead). +- `transferFloor(name, from, to)` — the cross-tier friction: the `max` of a reach component (recipient can't meet the label tier) and a downgrade component (recipient tier < sender tier). Maxed, never summed. + +Only NoStatus names (stem ≥ 9) carry a price — the flat `startingPrice` deposit; verified tiers register free. + +## Reservation table + +A `stem → Reservation { owner, expires, controller }` mapping, expiring after `MAX_RESERVATION_TIME` (12 weeks). Two write paths share it: the public controller during a lite registration, and the PoP controller on each queue-head transition. A cross-user collision reverts; only the stamping controller can release a live entry. Both price reads strip trailing digits first, so any live entry blocks every variant under that stem. + +## Interface + +**Reads**: `classifyName`, `priceWithCheck`, `priceWithoutCheck`, `price`, `reachFee`, `transferFloor`, `stripDigits`, `isBaseName`, `getBaseNameReservation`, `isBaseNameReserved`. + +**Writes (controllers only)**: `reserveBaseName`, `reserveBaseNameForPop`, `releaseBaseName`, `releaseReservationForReclaim`. + +**Writes (owner)**: `updateStartingPrice`. + +UUPS-upgradeable, `Ownable`. + +## Notes + +- There is no self-attestation: dotNS only consumes precompile status. Users earn personhood off-chain (People-chain ring proof, propagated to Asset Hub via the alias-accounts pallet). +- To reason about a *live* name, combine three reads: classify the label, read the registrar owner, then read that owner's `"dotns"`-context PoP status. diff --git a/scripts/deploy/cdm/readmes/RootGatewayDispatcher.md b/scripts/deploy/cdm/readmes/RootGatewayDispatcher.md new file mode 100644 index 00000000..9f8e52b9 --- /dev/null +++ b/scripts/deploy/cdm/readmes/RootGatewayDispatcher.md @@ -0,0 +1,20 @@ +# RootGatewayDispatcher + +Non-upgradeable shim that turns a substrate Root-origin dispatch into an EVM-observable caller for the PoP controller. It is the address registered under `popGateway`. + +## What it does + +Every call hits the `fallback`: it asks revive's System precompile `callerIsRoot()` **in its own frame**, and only if that passes forwards the raw calldata to its immutable target (the PoP controller proxy) via a plain message call, bubbling the return/revert data back verbatim. If the check fails it reverts `NotRoot`. The controller then authorizes the dispatcher by matching `msg.sender` against the `popGateway` registry key. + +## Why it is a separate contract + +The Root check is only meaningful in the frame that is the *direct* callee of Root. A UUPS implementation runs inside the proxy's `delegatecall`, so the controller cannot ask the precompile from its own frame — the dispatcher can. It holds no storage, never delegatecalls, and its target is fixed at construction, so it cannot be repurposed as an arbitrary-target proxy. + +## Interface + +- `TARGET() → address` — the controller proxy it forwards to (immutable). +- `fallback()` — non-payable; forwards any calldata after the Root check. The gated controller entry points take no value, so value transfers are rejected at the dispatcher boundary. + +## Notes + +- Rotating the gateway is a single `set(popGateway, …)` on the protocol registry. To point at a different controller, deploy a new dispatcher (the target is immutable). diff --git a/scripts/deploy/cdm/readmes/StoreFactory.md b/scripts/deploy/cdm/readmes/StoreFactory.md new file mode 100644 index 00000000..e916c8ec --- /dev/null +++ b/scripts/deploy/cdm/readmes/StoreFactory.md @@ -0,0 +1,23 @@ +# StoreFactory + +Deploys the per-user storage layer: at most one **LabelStore** and one **UserStore** per account, ever. Both run as `BeaconProxy` instances behind two `UpgradeableBeacon`s the factory owns, so every store of a kind upgrades atomically. + +## What it does + +- `deployLabelStoreFor(user)` — deploy-on-demand of a user's protocol-managed LabelStore. Callable by the factory owner or any protocol-registered address (so the registrar/controllers can provision on first write); unused accounts never pay. +- `claimUserStore()` — self-claim of the caller's UserStore; binds to `msg.sender` regardless of who pays gas. + +Re-deploying or re-claiming reverts `AlreadyDeployed`. The factory verifies each fresh proxy reports the expected owner before returning it. + +## Interface + +**Reads**: `getLabelStore(user)`, `getUserStore(user)`, `getLabelStores`/`getUserStores(offset, limit)` and counts, `labelStoreBeacon()`, `userStoreBeacon()`. + +**Writes**: `deployLabelStoreFor(user)`, `claimUserStore()`, `upgradeLabelStoreImplementation(impl)` / `upgradeUserStoreImplementation(impl)` (owner only). + +`Ownable`. The factory itself is not a proxy; the stores it deploys are. + +## Notes + +- Bindings are permanent — stores can't be transferred, reassigned, or re-created. +- See `LabelStoreBeacon` and `UserStoreBeacon` for what each store kind holds. diff --git a/scripts/deploy/cdm/readmes/UserStoreBeacon.md b/scripts/deploy/cdm/readmes/UserStoreBeacon.md new file mode 100644 index 00000000..d45403f9 --- /dev/null +++ b/scripts/deploy/cdm/readmes/UserStoreBeacon.md @@ -0,0 +1,20 @@ +# UserStoreBeacon + +The `UpgradeableBeacon` that every per-user **UserStore** proxy points at — the stable implementation anchor, upgraded for all instances at once by the `StoreFactory` owner. This entry is the beacon address, not any single per-user store instance. + +## What a UserStore is + +The user-claimed half of a user's storage: a generic `key → value` store that only the bound owner can write, with each superseded non-empty value snapshotted into a per-key history (value + timestamp). It gives user-controlled records that don't belong to any one name a home that bills the user's own contract instead of polluting a shared resolver. + +A user claims their store with `StoreFactory.claimUserStore()`; thereafter `setValue(key, bytes)` is owner-only. Reads are open and paginated: `getValue(key)`, `getKeys`, `getHistory(key, …)`. + +## Beacon interface + +- `implementation() → address` — the UserStore logic all proxies delegate to. +- `upgradeTo(address)` — owner (StoreFactory) only; upgrades every user store at once. Emits `Upgraded`. +- `owner()`, `transferOwnership(address)`. + +## Notes + +- Per-user store addresses come from `StoreFactory.getUserStore(user)`; this beacon is the shared implementation pointer, not a store itself. +- The beacon is a plain OZ `UpgradeableBeacon` deployed inside the `StoreFactory` constructor, so unlike the CREATE3-deployed core contracts its address is not guaranteed stable across networks — read it from `StoreFactory.userStoreBeacon()` or the deployment manifest. diff --git a/scripts/deploy/cdm/register.ts b/scripts/deploy/cdm/register.ts new file mode 100644 index 00000000..0623724d --- /dev/null +++ b/scripts/deploy/cdm/register.ts @@ -0,0 +1,322 @@ +#!/usr/bin/env bun +// Register generated DotNS deployment assets in a CDM contract registry. +// +// Takes the asset directory produced by `scripts/cdm/generate.ts` and, for +// each contract: uploads its metadata (description, readme, ABI) to the +// Bulletin chain, then calls `publishLatest(name, address, metadataCid)` on +// the CDM registry contract on Asset Hub. After this, any CDM consumer can +// `cdm install @dotns/` and resolve the current addresses — no more +// chasing address changes across redeploys. +// +// Local usage (preset network): +// bun run cdm:register -- \ +// --metadata .generated/dotns-cdm/metadata.json \ +// --name paseo \ +// --suri "" +// +// Custom endpoints (e.g. previewnet): +// bun run cdm:register -- \ +// --metadata .generated/dotns-cdm/metadata.json \ +// --name custom \ +// --assethub-url wss://... --bulletin-url wss://... \ +// --registry-address 0x... \ +// --suri "$CDM_SURI" +// +// The signer can also come from the CDM_SURI env var (preferred in CI — keeps +// the secret out of shell history and process lists). +// +// Behavior notes: +// - Idempotent: contracts whose latest registry entry already matches the +// manifest address AND metadata CID are skipped, so re-running after a +// partial failure only does the remaining work. (Registry versions are an +// on-chain counter; skipping avoids burning versions on no-op re-runs.) +// - Metadata is uploaded to Bulletin BEFORE registration, so the registry +// never points at content that isn't stored. +// - First registration of a package claims its name for the signing +// account; only that owner can publish subsequent versions. +// - `--dry-run` connects, checks ownership/idempotence, prints the plan, +// and submits nothing. + +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { parseArgs } from "node:util"; +import { + CONTRACTS_REGISTRY_ABI, + MetadataPublisher, + STORAGE_DEPOSIT_LIMIT, + type Metadata, +} from "@parity/cdm-builder"; +import { + createCdmChainClient, + getChainPreset, + prepareSignerFromSuri, + ss58Address, +} from "@parity/cdm-env"; +import { BulletinPreparer, DEFAULT_CLIENT_CONFIG } from "@parity/product-sdk-cloud-storage"; +import { createContractFromClient } from "@parity/product-sdk-contracts"; +import { batchSubmitAndWatch } from "@parity/product-sdk-tx"; + +const { values: flags } = parseArgs({ + options: { + metadata: { type: "string" }, + name: { type: "string", short: "n", default: "paseo" }, + suri: { type: "string" }, + "assethub-url": { type: "string" }, + "bulletin-url": { type: "string" }, + "registry-address": { type: "string" }, + "dry-run": { type: "boolean", default: false }, + "batch-size": { type: "string", default: "4" }, + "gas-buffer-percent": { type: "string", default: "100" }, + help: { type: "boolean", short: "h" }, + }, +}); + +if (flags.help || !flags.metadata) { + console.log( + `Usage: bun run cdm:register -- --metadata --suri [--name paseo|custom] [--assethub-url ] [--bulletin-url ] [--registry-address <0x..>] [--dry-run] [--batch-size 4] [--gas-buffer-percent 100]\n` + + `The suri may also be provided via the CDM_SURI env var.`, + ); + process.exit(flags.help ? 0 : 1); +} + +const batchSize = Number(flags["batch-size"]); +const gasBufferPercent = Number(flags["gas-buffer-percent"]); +if (!Number.isInteger(batchSize) || batchSize <= 0) throw new Error("Invalid --batch-size"); +if (!Number.isFinite(gasBufferPercent) || gasBufferPercent < 0) { + throw new Error("Invalid --gas-buffer-percent"); +} + +const manifestPath = resolve(flags.metadata); +const manifestDir = dirname(manifestPath); +const manifest = JSON.parse(readFileSync(manifestPath, "utf8")); +if (manifest.version !== 1 || !manifest.contracts?.length) { + throw new Error(`Invalid CDM manifest: ${manifestPath}`); +} + +// Endpoints: preset by name, or fully explicit with --name custom. +const preset = flags.name === "custom" ? undefined : getChainPreset(flags.name); +const assethubUrl = flags["assethub-url"] ?? preset?.assethubUrl; +const bulletinUrl = flags["bulletin-url"] ?? preset?.bulletinUrl; +const registryAddress = + flags["registry-address"] ?? manifest.registry ?? preset?.registryAddress; +if (!assethubUrl || !bulletinUrl || !registryAddress) { + throw new Error( + "Missing endpoints. Use --name , or pass --assethub-url, --bulletin-url, and --registry-address.", + ); +} + +const suri = flags.suri ?? process.env.CDM_SURI; +if (!suri) throw new Error("Missing signer. Pass --suri or set CDM_SURI."); + +interface ManifestContract { + name: string; + cdmPackage: string; + address: string; + description?: string; + abiPath: string; + readmePath: string; +} + +// Build the CDM metadata payloads. published_at comes from the manifest's +// generatedAt (not "now") so the payload bytes — and therefore the Bulletin +// CIDs — are deterministic for a given generated asset directory. That +// determinism is what makes the idempotence check below possible. +const publishedAt = manifest.generatedAt ?? new Date().toISOString(); +const entries = (manifest.contracts as ManifestContract[]).map((contract) => { + if (!/^@[A-Za-z0-9_-]+\/[A-Za-z0-9_-]+$/.test(contract.cdmPackage)) { + throw new Error(`Invalid CDM package name: ${contract.cdmPackage}`); + } + if (!/^0x[0-9a-fA-F]{40}$/.test(contract.address)) { + throw new Error(`Invalid address for ${contract.cdmPackage}: ${contract.address}`); + } + const abiRaw = JSON.parse(readFileSync(resolve(manifestDir, contract.abiPath), "utf8")); + const abi = Array.isArray(abiRaw) ? abiRaw : abiRaw.abi; + if (!abi?.length) throw new Error(`Empty ABI: ${contract.abiPath}`); + + const metadata: Metadata = { + publish_block: 0, + published_at: publishedAt, + description: contract.description ?? "", + readme: readFileSync(resolve(manifestDir, contract.readmePath), "utf8"), + authors: manifest.authors ?? [], + homepage: manifest.homepage ?? "", + repository: manifest.repository ?? "", + abi, + }; + const bytes = new TextEncoder().encode(JSON.stringify(metadata)); + return { ...contract, metadata, bytes }; +}); + +const bulletinPreparer = new BulletinPreparer(); +async function computeBulletinCid(bytes: Uint8Array): Promise { + // Metadata is a description + readme + ABI — tens of KB. Anything near the + // Bulletin chunking threshold (2 MiB) would need a chunked upload, which + // MetadataPublisher doesn't do; fail clearly instead of mid-publish. + if (bytes.length > DEFAULT_CLIENT_CONFIG.chunkingThreshold) { + throw new Error( + `Metadata payload of ${bytes.length} bytes exceeds the Bulletin single-tx threshold`, + ); + } + const { cid } = await bulletinPreparer.prepareStore(bytes); + return cid.toString(); +} + +function bufferWeight(weight: { ref_time: bigint; proof_size: bigint }, percent: number) { + const scale = (value: bigint) => (value * BigInt(100 + percent) + 99n) / 100n; + return { ref_time: scale(weight.ref_time), proof_size: scale(weight.proof_size) }; +} + +const signer = prepareSignerFromSuri(suri); +const origin = ss58Address(signer.publicKey); +console.log(`Registry: ${registryAddress} (${flags.name})`); +console.log(`Asset Hub: ${assethubUrl}`); +console.log(`Bulletin: ${bulletinUrl}`); +console.log(`Signer: ${origin}`); + +const client = await createCdmChainClient({ + assethubUrl, + bulletinUrl, + chainName: flags.name, +}); + +try { + // Contract calls require a mapped account; harmless if already mapped. + // Skipped for --dry-run, which must submit no transactions at all. + if (!flags["dry-run"]) { + try { + await client.assetHub.tx.Revive.map_account().signAndSubmit(signer); + } catch { + // Already mapped (the usual case after a first run). + } + } + + const registry = createContractFromClient( + client.raw.assetHub, + client.descriptors.assetHub, + registryAddress, + CONTRACTS_REGISTRY_ABI, + { defaultSigner: signer, defaultOrigin: origin }, + // biome-ignore lint: the generated contract surface is dynamic + ) as any; + + const cids = await Promise.all(entries.map((entry) => computeBulletinCid(entry.bytes))); + + // Idempotence probe: skip contracts whose latest registry entry already + // matches this manifest exactly (same address, same metadata CID). + const unwrapOption = (value: unknown): { isSome: boolean; value?: unknown } => + value && typeof value === "object" && "isSome" in value + ? (value as { isSome: boolean; value: unknown }) + : { isSome: false }; + + const work: { entry: (typeof entries)[number]; cid: string }[] = []; + for (let i = 0; i < entries.length; i++) { + const entry = entries[i]; + const [addressResult, uriResult] = await Promise.all([ + registry.getAddress.query(entry.cdmPackage, { origin }), + registry.getMetadataUri.query(entry.cdmPackage, { origin }), + ]); + const onChainAddress = unwrapOption(addressResult.value); + const onChainUri = unwrapOption(uriResult.value); + const unchanged = + onChainAddress.isSome && + String(onChainAddress.value).toLowerCase() === entry.address.toLowerCase() && + onChainUri.isSome && + onChainUri.value === cids[i]; + if (unchanged) { + console.log(` = ${entry.cdmPackage} already registered (unchanged), skipping`); + } else { + work.push({ entry, cid: cids[i] }); + } + } + + if (work.length === 0) { + console.log("Nothing to do — all contracts already registered with this metadata."); + process.exit(0); + } + + // Dry-run the registry calls up front: catches name-ownership conflicts + // ("Unauthorized": the package was first published by a different account) + // and produces the gas limits for the real submission. + const prepared = []; + for (const { entry, cid } of work) { + const query = await registry.publishLatest.query(entry.cdmPackage, entry.address, cid, { + origin, + }); + if (!query.success || !query.gasRequired) { + const detail = JSON.stringify(query.value ?? query, (_k, v) => + typeof v === "bigint" ? v.toString() : v, + ); + throw new Error(`Registry dry-run failed for ${entry.cdmPackage}: ${detail}`); + } + prepared.push({ + entry, + cid, + gasLimit: bufferWeight(query.gasRequired, gasBufferPercent), + }); + console.log(` + ${entry.cdmPackage} → ${entry.address} (${cid})`); + } + + if (flags["dry-run"]) { + console.log(`Dry run: would publish ${prepared.length} contracts. No transactions sent.`); + process.exit(0); + } + + // Upload metadata to Bulletin FIRST: the registry must never point at + // content that isn't stored. (A failure here costs nothing on-chain.) + const publisher = new MetadataPublisher(signer, client.bulletin, client.raw.bulletin); + const uploaded = await publisher.publishBatch(prepared.map(({ entry }) => entry.metadata)); + uploaded.cids.forEach((cid, i) => { + if (cid !== prepared[i].cid) { + throw new Error( + `CID mismatch for ${prepared[i].entry.cdmPackage}: computed ${prepared[i].cid}, stored ${cid}`, + ); + } + }); + console.log(`Uploaded ${uploaded.cids.length} metadata payloads to Bulletin`); + + // Then register on Asset Hub in batches. + const calls = []; + for (const { entry, cid, gasLimit } of prepared) { + calls.push( + await registry.publishLatest.prepare(entry.cdmPackage, entry.address, cid, { + origin, + gasLimit, + storageDepositLimit: STORAGE_DEPOSIT_LIMIT, + }), + ); + } + for (let start = 0; start < calls.length; start += batchSize) { + const batch = calls.slice(start, start + batchSize); + if (batchSize === 1) { + // Direct submission — works on runtimes whose Utility pallet is + // incompatible with the bundled descriptors (e.g. local dev nets). + const { entry, cid, gasLimit } = prepared[start]; + const result = await registry.publishLatest.tx(entry.cdmPackage, entry.address, cid, { + origin, + gasLimit, + storageDepositLimit: STORAGE_DEPOSIT_LIMIT, + }); + if (!result.ok) { + throw new Error( + `publishLatest failed for ${entry.cdmPackage}: ${JSON.stringify( + result.dispatchError ?? result, + (_k, v) => (typeof v === "bigint" ? v.toString() : v), + )}`, + ); + } + console.log(`Registered ${start + 1}/${calls.length} contracts`); + } else { + const result = await batchSubmitAndWatch(batch, client.assetHub, signer, { + mode: "batch_all", + waitFor: "best-block", + }); + console.log( + `Registered ${Math.min(start + batchSize, calls.length)}/${calls.length} contracts (${result.txHash})`, + ); + } + } + + console.log(`Done: ${prepared.length} contracts published to ${registryAddress}`); +} finally { + client.destroy(); +}