diff --git a/.changeset/product-sdk-0-9-migration.md b/.changeset/product-sdk-0-9-migration.md
new file mode 100644
index 0000000..7073f01
--- /dev/null
+++ b/.changeset/product-sdk-0-9-migration.md
@@ -0,0 +1,7 @@
+---
+"playground-cli": minor
+---
+
+Sign transactions through the Polkadot app's native transaction builder (product-sdk 0.9, RFC-0020 `createTransaction`). The wallet now decodes and displays what it signs, and chain-declared signed extensions (`AsPgas`, `AuthorizeValueTransfer`, …) are forwarded to the wallet verbatim — eliminating the "PJS does not support this signed-extension" failures on username claim, deploy, and account mapping.
+
+Existing logins keep working — no re-pair needed. Resource allowances (Bulletin, Statement Store, smart-contract gas) are re-requested once in a single phone dialog the next time they're needed (the allowance cache moved to the SDK's store).
diff --git a/CLAUDE.md b/CLAUDE.md
index bf13d6d..fbeadf6 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -22,27 +22,28 @@ These aren't self-evident from reading the code and have bitten us before. Treat
- **Import from `@parity/product-sdk-*`, never `@polkadot-apps/*`.** The CLI runtime is fully on product-sdk. `@polkadot-apps/*` is gone from the lockfile and CI's `Format` job runs `grep -rnE "['\"]@polkadot-apps/" src/ e2e/ scripts/ tools/` as a guard. Product-sdk uses caret ranges (`^0.x.y`); on a 0.x line `^` only widens patches, so a true breaking change still needs an explicit `package.json` bump.
- **`@dotdm/contracts` tracks the `^3.x` line.** The legacy `1.1.1` stable still depends on `@polkadot-apps/*` + PAPI 1.x — do NOT downgrade.
-- **`@novasamatech/*` packages are forced to `0.7.9-4` via `pnpm.overrides`.** They're transitive (via `@parity/product-sdk-terminal`'s `^0.7.7` ranges) and pnpm won't bump transitives across patches. The override aligns the tree on the latest published Novasama line including RFC-0010 `requestResourceAllocation`. Drop the override once product-sdk-terminal bumps its caret natively.
-- **`@polkadot-api/json-rpc-provider: ^0.2.0` override is load-bearing.** Removing it splits the lockfile across three versions of `json-rpc-provider` (`0.0.1`/`0.0.4`/`0.2.0`) — different PAPI 2.x transitive consumers ask for different versions. Forcing everyone onto `0.2.0` avoids subtle wire-shape divergence and reduces bundle/process memory.
+- **`@novasamatech/*` is force-pinned to `0.7.9` via `pnpm.overrides` — a deliberate mobile-compat pin, NOT tree hygiene.** `@parity/product-sdk-terminal@0.3.0` declares `^0.8.1`, but host-papp 0.8 emits a **V2 pairing QR** (leading SCALE byte `0x01`, `VersionedHandshakeProposal.V2`) that the Polkadot mobile app cannot decode: its native pairing codec (`feature/sso/impl/.../HandshakeOffer.kt`) accepts ONLY `@EnumIndex(0) V1`, and no V2 support exists anywhere in the Android repo (verified at build 1227 and HEAD, 2026-06-03) — scanning a 0.8 QR shows "Invalid QR code". host-papp `0.7.9` final keeps the V1 QR AND has everything terminal 0.3.0 needs: `UserSession.createTransaction` (RFC-0020) with a wire codec that is byte-identical to 0.8.4's, `requestResourceAllocation`, no `verifiablejs` (so no WASM patch). **Drop the pin only when the mobile app ships V2 pairing** — upstream guidance (host-papp maintainers, 2026-06-03) is to stay on 0.7.9 for now since the V2 handshake is part of multi-device support, which is not merged yet. Re-verify pairing on a real phone before merging the un-pin. The pin travels with a `pnpm` patch on `@parity/product-sdk-terminal` (`patches/`) restoring the `metadataUrl` adapter option: the V1 QR embeds a metadata URL (`src/config.ts::TERMINAL_METADATA_URL`) that the phone fetches to render the Sign-In screen — without it the V1 `metadata` field encodes as an empty string and pairing dies with "Failed to load pairing request". Remove the patch + `TERMINAL_METADATA_URL` together with the pin. Upstream RENAMED `@novasamatech/product-sdk` → `@novasamatech/host-api-wrapper` (triangle-js-sdks #169, no compat re-export) — nothing in our code may depend on the old name. The `host-api-wrapper@0.8.4` copy in the lockfile hangs off the `@dotdm/contracts@^3.x` peer subtree (dormant, signer-less paths). `auth.ts::loadSessions` still translates session decode failures into a `STALE_SESSION_MESSAGE` "playground logout / playground init" hint — defensive for future wire bumps; on the 0.7.9 pin existing sessions decode fine.
+- **`@polkadot-api/json-rpc-provider: ^0.2.0` override is load-bearing.** Removing it splits the lockfile across three versions of `json-rpc-provider` (`0.0.1`/`0.0.4`/`0.2.0`) — different PAPI 2.x transitive consumers ask for different versions. Forcing everyone onto `0.2.0` avoids subtle wire-shape divergence and reduces bundle/process memory. Relatedly, `polkadot-api` itself is deduped to a single `2.1.5` resolution in the runtime — if a future bump ever re-splits it, `pnpm dedupe polkadot-api` collapses it back (the bundled dotns-cli `1.23.3` copy is separate and unaffected, per the PAPI bullet below).
- **`@parity/dotns-cli@0.6.1` ships a broken publish manifest** declaring `"@polkadot-api/descriptors": "file:.papi/descriptors"` — a workspace path missing from the tarball. pnpm refuses; we redirect that sub-dep to `stubs/papi-descriptors-stub/` (an empty `{}` export). dotns-cli's `dist/cli.js` is a fully-bundled Bun build, so the stub is functionally correct. Remove the override + stub when `@parity/dotns-cli` republishes a clean manifest.
-- **`bulletin-deploy` is pinned to an explicit version (`0.7.29`), not `latest`.** A previous `latest` (0.6.8) had a WebSocket-heartbeat bug that tore chunk uploads down mid-flight. The pin avoids ever silently sliding onto a broken `latest`. When bumping, read release notes for changes to `deploy()`, DotNS methods, or the `DeployOptions` we use (`jsMerkle`, `signer`, `signerAddress`, `mnemonic`, `rpc`, `attributes`). Newer releases now also export environment helpers (`loadEnvironments`, `resolveEndpoints`, etc.); we don't consume them — our env table lives in `src/config.ts::CONFIGS`.
-- **`polkadot-api` is `^2.1.3`** and effectively the only PAPI version in the runtime: the lockfile contains `polkadot-api@1.x` only because `@parity/dotns-cli` declares it, and dotns-cli ships as a single fully-bundled `dist/cli.js` with all deps inlined — never resolved at runtime.
+- **`bulletin-deploy` is pinned to an explicit version (`0.8.1`), not `latest`.** A previous `latest` (0.6.8) had a WebSocket-heartbeat bug that tore chunk uploads down mid-flight. The pin avoids ever silently sliding onto a broken `latest`. The 0.7.29 → 0.8.1 bump was verified additive for everything we touch: the `deploy()` signature, the `DeployOptions` we use (`jsMerkle`, `signer`, `signerAddress`, `mnemonic`, `rpc`, `attributes`), the DotNS methods, and the env helpers (`loadEnvironments`, `resolveEndpoints`) are all unchanged. New in 0.8.1: an optional `DeployOptions.contracts` (unused by us) and a `verifiablejs@1.3.0-beta.4` pin. The merkleizer is functionally unchanged, so the `jsMerkle: false` invariant below still stands. When bumping again, re-read the release notes for changes to those same surfaces; we don't consume the env helpers — our env table lives in `src/config.ts::CONFIGS`.
+- **`polkadot-api` resolves to a single `2.1.5`** and is effectively the only PAPI version in the runtime: the lockfile contains `polkadot-api@1.23.3` only because `@parity/dotns-cli` declares it, and dotns-cli ships as a single fully-bundled `dist/cli.js` with all deps inlined — never resolved at runtime.
### Network / env
- **`ACTIVE_TESTNET_ENV = "paseo-next-v2"`** (`src/config.ts`). It's the only env wired up; the others throw "not supported" from `getChainConfig()`. The deploy `--env` flag accepts both the new ids and the legacy `testnet|mainnet` aliases (mapped via `resolveLegacyEnv`). When adding an env, populate `CONFIGS` and verify descriptors exist in `@parity/product-sdk-descriptors`. The `paseo-*` descriptor exports we use today are generated against paseo-next-v2 endpoints despite the unversioned names.
- **All chain URLs / contract addresses live in `src/config.ts`.** Never inline a websocket URL or `0x…` address anywhere else — at mainnet launch we'll flip one switch, not grep the tree.
+- **Live contract addresses resolve through `ContractManager.fromLiveClient`, not a hand-rolled patcher.** With `@parity/product-sdk-contracts@0.7` the `cdm.json` is FLAT (`{ registry, dependencies, contracts }`, no target-hash buckets). `src/utils/registry.ts` calls `ContractManager.fromLiveClient(cdmJson, client, descriptor, { libraries, defaultOrigin, defaultSigner? })` wrapped in a `MetaRegistryFailure:` error. The old hand-rolled `resolveLiveContractAddresses` / `withRequiredLiveContractAddresses` / `patchContractAddresses` in `contractManifest.ts` are DELETED — that file now only holds `PLAYGROUND_REGISTRY_CONTRACT` + Revive trace-noise suppression. The `registry` address (`0xf62c2ece29cd8df2e10040ecfa5a894a5c5d9cb0`) and the `"@w3s/playground-registry": "latest"` dependency in `cdm.json` MUST stay byte-identical to playground-app's `cdm.json`: runtime convergence comes from same-registry + `latest` live resolution, NOT from snapshotting addresses. Don't pin the dep or fork the registry address.
- **Username lookup hits `Resources.Consumers` on the People parachain** (`src/utils/username.ts`). Mirrors `@novasamatech/host-papp`'s `createIdentityRpcAdapter`. Pass the SS58 string directly to `getValues([[ss58]])` — do NOT round-trip through `AccountId().dec(ss58)`. The upstream code only does that because its callers pass `0x…` hex; on an SS58 string `Bytes(32).dec` silently corrupts it into a different 32-byte sequence and the lookup fails opaquely as `(lookup failed)`.
### Deploy / Bulletin
- **Deploy delegates to `bulletin-deploy` for everything storage-related** — chunking, retries, pool accounts, nonce fallback, DAG-PB, DotNS commit-reveal. Don't reimplement. The one thing we own is `registry.publish()`. The contract takes an `Option
owner` parameter — when None, it falls back to `env::caller()`; when Some, that H160 is recorded as the app owner regardless of who signed. Phone mode passes None (caller IS the user). Dev mode with an active session passes the session's `productH160` so Alice can sign the tx while the user still appears in MyApps. The `publisher` field on `AppInfo` always stores `env::caller()`, so `is_authorized_to_republish` lets the original signer iterate without rewriting ownership. See `src/utils/deploy/playground.ts` and `src/utils/deploy/signerMode.ts::resolveSignerSetup`.
-- **Do NOT call `bulletin-deploy.deploy()` just to store a metadata JSON.** `deploy()` unconditionally runs a DotNS `register()` + `setContenthash()`, and for `domainName: null` invents a `test-domain-` label and registers THAT — the side-trip reverts cryptically. For metadata storage we submit `TransactionStorage.store` directly via PAPI using `calculateCid` from `@parity/product-sdk-bulletin`. The metadata `store` is signed with the product-scoped RFC-0010 Bulletin allowance account cached in `allowance-keys.json` (not Alice, not the product account). Asset Hub `registry.publish` is signed with the user's product account in phone mode, and with a dev signer in dev mode (claimed-owner H160 carries the user identity, per the bullet above). See `src/utils/deploy/playground.ts::publishToPlayground`.
+- **Do NOT call `bulletin-deploy.deploy()` just to store a metadata JSON.** `deploy()` unconditionally runs a DotNS `register()` + `setContenthash()`, and for `domainName: null` invents a `test-domain-` label and registers THAT — the side-trip reverts cryptically. For metadata storage we submit `TransactionStorage.store` directly via PAPI using `calculateCid` from `@parity/product-sdk-cloud-storage`. The metadata `store` is signed with the SDK-cached Bulletin slot account from `@parity/product-sdk-terminal/host` (`~/.polkadot-apps/_AllowanceKeys.json`, not Alice, not the product account). Asset Hub `registry.publish` is signed with the user's product account in phone mode, and with a dev signer in dev mode (claimed-owner H160 carries the user identity, per the bullet above). See `src/utils/deploy/playground.ts::publishToPlayground`.
- **The "dev signer" used in dev mode is bulletin-deploy's `DEFAULT_MNEMONIC` bare-root account, not Substrate's `//Alice`.** The bare-root SS58 (`5DfhGyQd…`) is what bulletin-deploy uses internally for its DEFAULT_MNEMONIC storage + DotNS signing, so the CLI's `createAliceSignerForDevPublish` derives from the same `(mnemonic, path="")` pair via `seedToAccount`. Storage, DotNS, and registry publish all sign as one identity. Substrate's `//Alice` (`5Grwva…`) is a DIFFERENT account — `createDevSigner("Alice")` from `@parity/product-sdk-tx` returns that one. Don't mix them; the `signerModeAlice.test.ts` snapshot guards against regression.
- **Dev-mode re-publish only works on apps that were first published from dev mode.** `is_authorized_to_republish` accepts `caller == owner OR caller == publisher`. In dev mode the publisher is always Alice (`5DfhGyQd…`), so dev-mode re-deploys of a dev-published app succeed. But an app first published from phone mode has `caller == publisher == user H160`; Alice is neither, so a dev-mode re-deploy reverts `Unauthorized`. To iterate on a phone-published app in dev mode the user must unpublish it from phone mode first. Intentional asymmetry: once a user "owns" an app from their phone, a shared dev key can't touch it.
- **Build a dedicated Bulletin client with `heartbeatTimeout: 300_000` for the metadata upload.** The shared client from `getConnection()` uses `@parity/product-sdk-chain-client`'s default 40 s heartbeat; a single `TransactionStorage.store` round-trip can exceed that and the socket tears down as `WS halt (3)`. We mirror bulletin-deploy's 300 s heartbeat with a one-off client that gets destroyed immediately after the upload.
- **`dot deploy` does NOT pass `jsMerkle: true` today.** bulletin-deploy's pure-JS merkleizer produces CARs containing only raw leaves (DAG-PB blocks are silently dropped by `blockstore-core/memory`'s `getAll()` under `rawLeaves: true` + `wrapWithDirectory: true`) → polkadot-desktop parses zero files → sites return 404. We rely on the Kubo binary path until the upstream merkleizer collects all blocks, not just leaves. `dot init` installs `ipfs`. Trade-off: this temporarily breaks the RevX WebContainer story for the main storage upload — flip `jsMerkle: true` back once `merkleizeJS` is fixed.
-- **The mobile app wraps `signRaw` data with `…`** (anti-phishing envelope). On paseo-next-v2 this doesn't matter for tx signing: `@parity/product-sdk-terminal@0.2.1+`'s `createSessionSignerForAccount` routes tx payloads through `session.signRaw({ data: { tag: "Payload", value: hex(toSign) } })` — opaque bytes, no `` envelope — so every signed extension declared by the chain (including paseo-next-v2's `AsPgas`) survives end-to-end. Don't reach for `signRaw` to sign extrinsic payloads from anywhere outside the signer; raw-message signing keeps the `Bytes` tag for arbitrary user data. The pre-0.2.1 PJS path failed on v2 with `PJS does not support this signed-extension: AsPgas`.
+- **Tx signing routes through host-papp `createTransaction`, NOT through `signRaw`.** `@parity/product-sdk-terminal@0.3.0`'s `createSessionSignerForAccount` hands the extrinsic to the wallet, which builds AND signs it — so every signed extension the chain declares (paseo-next-v2's `AsPgas`, `AuthorizeValueTransfer`, all of them) survives verbatim, with no PJS bridge, no relaxed-extensions wrapper, and no `` envelope ever touching a tx payload. `signBytes` still routes `signRaw({ tag: "Bytes" })` — that path keeps the `` anti-phishing envelope and is for arbitrary raw USER data only; never reach for it to sign extrinsic payloads. The CLI MUST pass the derived product-account publicKey to the SDK signer (`src/utils/sessionSigner.ts` always supplies `derivePlaygroundProductPublicKey(...)`); the SDK's fallback is the wallet's currently-selected account, which would produce signatures the chain rejects.
- **Signer mode selection lives in one file** (`src/utils/deploy/signerMode.ts`). The mainnet rewrite is a single-file swap; keep that boundary clean.
- **`src/utils/account/bulletinTopUp.ts` mirrors bulletin-deploy's internal `attemptTestnetTopUp`** so `dot init` front-loads the dev-funder top-up at setup time rather than waiting for the just-in-time call inside `deploy()`. Both flows no-op once the recipient is ≥ 0.1 PAS, so running them back-to-back doesn't double-transfer. Delete the local mirror only once bulletin-deploy surfaces `attemptTestnetTopUp` at the package root — today it's an internal `DotNS` method.
@@ -50,16 +51,16 @@ These aren't self-evident from reading the code and have bitten us before. Treat
- **`session.rootAccountId` is whatever the mobile app published as `rootUserAccountId` in the SSO handshake.** On current mobile builds (`polkadot-app-android-v2`, see `feature/sso/impl/.../RealSsoHandshakeUseCase.kt:34` → `deriveRootAccount() = derivationPath = null`) it's the bare-mnemonic sr25519 root with no junction. The host-papp SDK does not derive it — it just decodes the 32 bytes from `HandshakeResponseSensitiveData.rootUserAccountId` (`triangle-js-sdks/packages/host-papp/src/sso/auth/scale/handshake.ts:23-27`) and forwards them. If a future mobile release changes the path, our display will silently change with it — the source of truth is the phone, not the CLI.
- **The mobile's "Wallet account address" and "Candidate account address" debug rows are NOT reachable from the host.** They're sr25519 of mnemonic + `//wallet` and mnemonic + `//candidate` respectively (`feature/account/impl/.../RealAccountRepository.kt:166-173`, hard junctions). Hard derivations can't be reproduced from a public key, so the CLI never sees those SS58s. Don't try to surface a "wallet address that matches mobile" — it isn't possible without the mnemonic.
-- **The playground product account is derived by exactly one function** (`src/utils/sessionSigner.ts::derivePlaygroundProductPublicKey`), called by both `createPlaygroundSessionSigner` (signer construction) and `auth.ts::deriveSessionAddresses` (display triple). The math is `deriveProductAccountPublicKey(rootAccountId, "playground.dot", 0)` from `@parity/product-sdk-keys`. Do NOT call `deriveProductAccountPublicKey` (or any helper that wraps it) on an already-product-derived SS58 — that yields a doubly-derived ghost account. The `productAccountDisplay` / `productAccountAddresses` helpers that used to live in `src/commands/init/identityLine.ts` had exactly this bug and were deleted; resist re-introducing them. A frozen-vector regression test in `src/utils/auth.test.ts` (`deriveSessionAddresses` block) locks the pubkey/H160 the playground-app expects.
+- **The playground product account is derived by exactly one function** (`src/utils/sessionSigner.ts::derivePlaygroundProductPublicKey`), called by both `createPlaygroundSessionSigner` (which feeds the result as the SDK signer's `publicKey` — terminal 0.3.0 `createSessionSignerForAccount`, see the tx-signing bullet) and `auth.ts::deriveSessionAddresses` (display triple). The math is `deriveProductAccountPublicKey(rootAccountId, "playground.dot", 0)` from `@parity/product-sdk-keys`. Do NOT call `deriveProductAccountPublicKey` (or any helper that wraps it) on an already-product-derived SS58 — that yields a doubly-derived ghost account. The `productAccountDisplay` / `productAccountAddresses` helpers that used to live in `src/commands/init/identityLine.ts` had exactly this bug and were deleted; resist re-introducing them. A frozen-vector regression test in `src/utils/auth.test.ts` (`deriveSessionAddresses` block) locks the pubkey/H160 the playground-app expects.
- **Username storage is keyed on `session.rootAccountId`, not on the product account.** `Resources.Consumers[]` on the People parachain is populated by mobile's `Resources.register_person` call (signed by `//wallet`-derived key, but the storage key is the root). `lookupUsername` MUST be called with `addresses.rootAddress`, not the product SS58. Polkadot-desktop's `useSessionIdentity(session)` does the same — both read off the SSO `rootAccountId`.
-- **`SessionAddresses` triples are computed once in `auth.ts` and threaded through.** `ConnectResult`, `LoginStatus.success`, and `SessionHandle` all carry the `{ rootAddress, productAddress, productH160 }` bundle. `SessionHandle.address` is kept as a back-compat alias for `addresses.productAddress` because `signer.ts::resolveSigner` spreads the handle into `ResolvedSigner` and downstream deploy code (`signerMode.ts`, `playground.ts`, `registry.ts`, `DeployScreen.tsx`) reads `.address` for the signing key. UI code should prefer `addresses` so the root vs product distinction stays explicit.
+- **`SessionAddresses` triples are computed once in `auth.ts` and threaded through.** `ConnectResult`, `LoginStatus.success`, and `SessionHandle` all carry the `{ rootAddress, productAddress, productH160 }` bundle. `SessionHandle.address` is kept as a back-compat alias for `addresses.productAddress` because `signer.ts::resolveSigner` spreads the handle into `ResolvedSigner` and downstream deploy code (`signerMode.ts`, `playground.ts`, `registry.ts`, `DeployScreen.tsx`) reads `.address` for the signing key. UI code should prefer `addresses` so the root vs product distinction stays explicit. `SessionHandle` now also exposes `adapter` (the `TerminalAdapter`) because the SDK `./host` allowance calls need it alongside the session; `ResolvedSigner` carries an optional `adapter`, present iff `source === "session"`.
### Allowances / session
- **`getSessionSigner()` returns an adapter that keeps the Node event loop alive.** Every caller must invoke the returned `destroy()` when done. Forgetting it manifests as `dot ` hanging after the work visibly finishes.
-- **`requestResourceAllocation` lives in a CLI-local shim** (`src/utils/allowances/host.ts`). `@parity/product-sdk-terminal@0.2.1` does NOT yet re-export the RFC-0010 host call at the package root, but the underlying `UserSession` (from `@novasamatech/host-papp`) does — we call it directly via the raw session on `SessionHandle.userSession`. `@parity/product-sdk-host`'s `requestResourceAllocation` is the in-container variant (browser globals required) and won't work from the CLI. Replace the shim when product-sdk-terminal surfaces it externally.
-- **Allowance grant markers live at `~/.polkadot/allowances.json`** (`src/utils/allowances/marker.ts`), mode 0600, sibling to `accounts.json`. RFC-0010 has no on-chain query for allowance status, so we persist `{ env: { ss58Address: { resourceTag: { grantedAt, source } } } }` after a successful host grant. Slot-account private keys for Bulletin / Statement Store live separately in `~/.polkadot/allowance-keys.json` (`src/utils/allowances/slotKeys.ts`), also mode 0600. A marker alone isn't enough to skip `dot init` for slot resources — confirm the matching key exists too. Markers and keys are isolated per env. Keep `source: "host"` as the only value emitted from production code.
-- **Bulletin is not requested through mobile resource allocation in `dot init`.** Until product-sdk exposes the proper terminal host/preimage path, the CLI creates or reuses a locally cached Bulletin slot key and surfaces `bulletinAuthorizationHelp(slot)` against the env's `bulletinAuthorizationUrl`. Always check usability via `hasUsableBulletinSlotAuthorization`, never just `hasSlotAccountKey`.
+- **RFC-0010 allowances come from `@parity/product-sdk-terminal/host` — there is no CLI-local shim.** The old `src/utils/allowances/host.ts` shim is DELETED; do NOT re-add it. The SDK `./host` module exports `requestResourceAllocation(session, adapter, resources, opts)`, `getCachedAllocation`, `ensureSlotAccountSigner`, and `createSlotAccountSigner`; these need both the session and its adapter (hence `SessionHandle.adapter`). `@parity/product-sdk-host`'s `requestResourceAllocation` is the in-container variant (browser globals required) and still won't work from the CLI — use the terminal `./host` one. CLI-local glue that remains: `src/utils/allowances/resources.ts` (`PLAYGROUND_RESOURCES`, `summarizeOutcomes`, `describeResource`) and `bulletin.ts`'s quota loop.
+- **The SDK now owns both the grant marker and the slot keys** — one file, `~/.polkadot-apps/_AllowanceKeys.json` (0600, atomic write), managed entirely by `@parity/product-sdk-terminal/host`. A cache entry IS the grant marker: the SDK writes it only after the wallet returns `Allocated`, so a present key doubles as proof the grant happened. The old CLI-local `~/.polkadot/allowances.json` (`marker.ts`) and `~/.polkadot/allowance-keys.json` (`slotKeys.ts`) files are DEAD and both source files are DELETED — do NOT resurrect `marker.ts` / `slotKeys.ts` or any `{ env: { ss58: { resourceTag } } }` marker scheme. Gotcha: the SDK cache is NOT env-keyed. When `ACTIVE_TESTNET_ENV` changes, stale Bulletin slots surface as "not authorized on-chain" and `playground init` re-grants — don't try to read the cache as authoritative across envs.
+- **`playground init` requests all three resources in ONE mobile dialog.** `PLAYGROUND_RESOURCES` (`src/utils/allowances/resources.ts`) = Bulletin + Statement Store + SmartContract(gas, 0) passed together to the SDK `requestResourceAllocation`, so the user sees a single approval dialog, not three. Usability is checked via `cachedBulletinSlotAuthorization` (verifies on-chain authorization through cloud-storage `checkAuthorization` AND remaining quota) — NEVER infer usability from "a key is cached". When Bulletin quota is exhausted, `getBulletinAllowanceSigner` (`bulletin.ts`) makes a single `Increase` retry on the phone, then re-checks; still-unusable throws a plain-English error.
- **`dot init --yes` auto-runs at the end of `install.sh`** to skip the interactive QR-scan so non-interactive installers don't block. It installs prerequisites and prints "setup complete", then `install.sh` prints a hint to run `dot init` for the full mobile login. Dep-setup failures surface their exit code so CI runs don't silently pass.
### CLI surface boundaries
@@ -78,7 +79,7 @@ These aren't self-evident from reading the code and have bitten us before. Treat
- **Throttle TUI info updates.** bulletin-deploy logs per-chunk, builds stream thousands of lines/sec. `setState`-per-event floods React's reconciler with backpressure (can balloon past 20 GB and freeze the OS). `RunningStage` coalesces "latest info" updates to ≤10/sec via a ref + timer and caps line length at 160 chars. Don't hook raw per-line streams directly into Ink state.
- **`DeployLogParser.feed()` MUST NOT emit an event per log line.** It's called for every console line bulletin-deploy prints. We emit only for phase-banner matches and `[N/M]` chunk progress; everything else returns `null`. A catch-all `info` emit allocates ~200 bytes × thousands of lines and was a measurable contributor to chunk-upload memory pressure.
- **`startMemoryWatchdog()` runs for both `dot deploy` and `dot mod`.** Mod's tarball download is a streaming pipe through `node:zlib` + `tar.extract()`; a stuck IPFS gateway or malformed tarball can leak buffers. Any new top-level command doing meaningful I/O should also call `startMemoryWatchdog()` and register `stopWatchdog` via `onProcessShutdown()`.
-- **`QueryResult` from `@parity/product-sdk-contracts@0.5+` is a discriminated union.** Narrow on `.success` before reading `.value`. On the failure branch `.value` is the runtime's dispatch-error payload (`unknown`). On the success branch `gasRequired` is non-optional. We apply this in `src/utils/contractManifest.ts::resolveLiveContractAddresses`, `src/commands/mod/AppBrowser.tsx`, and `src/commands/mod/SetupScreen.tsx`.
+- **`QueryResult` from `@parity/product-sdk-contracts@0.7` is a discriminated union.** Narrow on `.success` before reading `.value`. On the failure branch `.value` is the runtime's dispatch-error payload (`unknown`). On the success branch `gasRequired` is non-optional. We apply this in `src/commands/mod/AppBrowser.tsx` and `src/commands/mod/SetupScreen.tsx`.
## Repo conventions
diff --git a/cdm.json b/cdm.json
index 1dc0f07..d38c3c4 100644
--- a/cdm.json
+++ b/cdm.json
@@ -1,1027 +1,1017 @@
{
- "targets": {
- "b7a87bf51613d89f": {
- "asset-hub": "wss://paseo-asset-hub-next-rpc.polkadot.io",
- "bulletin": "https://paseo-bulletin-next-ipfs.polkadot.io/ipfs",
- "registry": "0xf62c2ece29cd8df2e10040ecfa5a894a5c5d9cb0"
+ "registry": "0xf62c2ece29cd8df2e10040ecfa5a894a5c5d9cb0",
+ "dependencies": {
+ "@w3s/playground-registry": "latest"
+ },
+ "contracts": {
+ "@w3s/playground-registry": {
+ "version": 0,
+ "address": "0x1C12456f461aBd82C276436d3136F9Df4E8f3E08",
+ "abi": [
+ {
+ "type": "constructor",
+ "inputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "publish",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "metadata_uri",
+ "type": "string"
+ },
+ {
+ "name": "visibility",
+ "type": "uint8"
+ },
+ {
+ "name": "owner",
+ "type": "tuple",
+ "components": [
+ {
+ "name": "isSome",
+ "type": "bool"
+ },
+ {
+ "name": "value",
+ "type": "address"
+ }
+ ]
+ },
+ {
+ "name": "modded_from",
+ "type": "string"
+ },
+ {
+ "name": "is_moddable",
+ "type": "bool"
+ },
+ {
+ "name": "is_dev_signer",
+ "type": "bool"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "unpublish",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "rateApp",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "rating",
+ "type": "uint8"
+ },
+ {
+ "name": "comment_uri",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "removeRating",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "reviewer",
+ "type": "address"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "star",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "unstar",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "getContextId",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getAppCount",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getDomainAt",
+ "inputs": [
+ {
+ "name": "index",
+ "type": "uint32"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple",
+ "components": [
+ {
+ "name": "isSome",
+ "type": "bool"
+ },
+ {
+ "name": "value",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getOwnerAppCount",
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getOwnerDomainAt",
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint32"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple",
+ "components": [
+ {
+ "name": "isSome",
+ "type": "bool"
+ },
+ {
+ "name": "value",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getSudo",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "addAdmin",
+ "inputs": [
+ {
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "removeAdmin",
+ "inputs": [
+ {
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "isAdmin",
+ "inputs": [
+ {
+ "name": "addr",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "setBlacklisted",
+ "inputs": [
+ {
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "name": "value",
+ "type": "bool"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "isBlacklisted",
+ "inputs": [
+ {
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "setVisibility",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "visibility",
+ "type": "uint8"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "getVisibility",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "pin",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "unpin",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "isPinned",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getPinnedApps",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "index",
+ "type": "uint32"
+ },
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "metadata_uri",
+ "type": "string"
+ },
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "visibility",
+ "type": "uint8"
+ },
+ {
+ "name": "publisher",
+ "type": "address"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getApps",
+ "inputs": [
+ {
+ "name": "start",
+ "type": "uint32"
+ },
+ {
+ "name": "count",
+ "type": "uint32"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple",
+ "components": [
+ {
+ "name": "total",
+ "type": "uint32"
+ },
+ {
+ "name": "scanned",
+ "type": "uint32"
+ },
+ {
+ "name": "entries",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "index",
+ "type": "uint32"
+ },
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "metadata_uri",
+ "type": "string"
+ },
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "visibility",
+ "type": "uint8"
+ },
+ {
+ "name": "publisher",
+ "type": "address"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getLineageCount",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getLineage",
+ "inputs": [
+ {
+ "name": "start",
+ "type": "uint32"
+ },
+ {
+ "name": "count",
+ "type": "uint32"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "child",
+ "type": "string"
+ },
+ {
+ "name": "source",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getMetadataUri",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple",
+ "components": [
+ {
+ "name": "isSome",
+ "type": "bool"
+ },
+ {
+ "name": "value",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getOwner",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getPoints",
+ "inputs": [
+ {
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint128"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getTopBuilders",
+ "inputs": [
+ {
+ "name": "start",
+ "type": "uint32"
+ },
+ {
+ "name": "count",
+ "type": "uint32"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "name": "score",
+ "type": "uint128"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getModCount",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getStarCount",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "hasStarred",
+ "inputs": [
+ {
+ "name": "voter",
+ "type": "address"
+ },
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getPointBreakdown",
+ "inputs": [
+ {
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "tuple",
+ "components": [
+ {
+ "name": "launch_points",
+ "type": "uint128"
+ },
+ {
+ "name": "mod_points",
+ "type": "uint128"
+ },
+ {
+ "name": "star_points",
+ "type": "uint128"
+ },
+ {
+ "name": "total",
+ "type": "uint128"
+ }
+ ]
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "setFrozen",
+ "inputs": [
+ {
+ "name": "value",
+ "type": "bool"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "isFrozen",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "refreshReputationReference",
+ "inputs": [],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importApp",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "publisher",
+ "type": "address"
+ },
+ {
+ "name": "visibility",
+ "type": "uint8"
+ },
+ {
+ "name": "metadata_uri",
+ "type": "string"
+ },
+ {
+ "name": "is_moddable",
+ "type": "bool"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importApps",
+ "inputs": [
+ {
+ "name": "apps",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "publisher",
+ "type": "address"
+ },
+ {
+ "name": "visibility",
+ "type": "uint8"
+ },
+ {
+ "name": "metadata_uri",
+ "type": "string"
+ },
+ {
+ "name": "is_moddable",
+ "type": "bool"
+ }
+ ]
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importPinned",
+ "inputs": [
+ {
+ "name": "domain",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importLineage",
+ "inputs": [
+ {
+ "name": "entries",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "child",
+ "type": "string"
+ },
+ {
+ "name": "source",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importPoints",
+ "inputs": [
+ {
+ "name": "entries",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "name": "total",
+ "type": "uint128"
+ }
+ ]
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importSocialCounts",
+ "inputs": [
+ {
+ "name": "entries",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "domain",
+ "type": "string"
+ },
+ {
+ "name": "star_count",
+ "type": "uint32"
+ },
+ {
+ "name": "mod_count",
+ "type": "uint32"
+ }
+ ]
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "importUsernames",
+ "inputs": [
+ {
+ "name": "entries",
+ "type": "tuple[]",
+ "components": [
+ {
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "setUsername",
+ "inputs": [
+ {
+ "name": "name",
+ "type": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "clearUsername",
+ "inputs": [],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "getUsername",
+ "inputs": [
+ {
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getUsernames",
+ "inputs": [
+ {
+ "name": "accounts",
+ "type": "address[]"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "string[]"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "getUsernameOwner",
+ "inputs": [
+ {
+ "name": "name",
+ "type": "string"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "isUsernameAvailable",
+ "inputs": [
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "prospective_caller",
+ "type": "address"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view"
+ }
+ ],
+ "metadataCid": "bafk2bzaceduyvqkzgyfafjcy77v3t3ypvkruwvt6zq3uaw37zvzelalfpkfty"
+ }
}
- },
- "dependencies": {
- "b7a87bf51613d89f": {
- "@w3s/playground-registry": "latest"
- }
- },
- "contracts": {
- "b7a87bf51613d89f": {
- "@w3s/playground-registry": {
- "version": 0,
- "address": "0x1C12456f461aBd82C276436d3136F9Df4E8f3E08",
- "abi": [
- {
- "type": "constructor",
- "inputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "publish",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "metadata_uri",
- "type": "string"
- },
- {
- "name": "visibility",
- "type": "uint8"
- },
- {
- "name": "owner",
- "type": "tuple",
- "components": [
- {
- "name": "isSome",
- "type": "bool"
- },
- {
- "name": "value",
- "type": "address"
- }
- ]
- },
- {
- "name": "modded_from",
- "type": "string"
- },
- {
- "name": "is_moddable",
- "type": "bool"
- },
- {
- "name": "is_dev_signer",
- "type": "bool"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "unpublish",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "rateApp",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "rating",
- "type": "uint8"
- },
- {
- "name": "comment_uri",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "removeRating",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "reviewer",
- "type": "address"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "star",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "unstar",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "getContextId",
- "inputs": [],
- "outputs": [
- {
- "name": "",
- "type": "bytes32"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getAppCount",
- "inputs": [],
- "outputs": [
- {
- "name": "",
- "type": "uint32"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getDomainAt",
- "inputs": [
- {
- "name": "index",
- "type": "uint32"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple",
- "components": [
- {
- "name": "isSome",
- "type": "bool"
- },
- {
- "name": "value",
- "type": "string"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getOwnerAppCount",
- "inputs": [
- {
- "name": "owner",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "uint32"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getOwnerDomainAt",
- "inputs": [
- {
- "name": "owner",
- "type": "address"
- },
- {
- "name": "index",
- "type": "uint32"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple",
- "components": [
- {
- "name": "isSome",
- "type": "bool"
- },
- {
- "name": "value",
- "type": "string"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getSudo",
- "inputs": [],
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "addAdmin",
- "inputs": [
- {
- "name": "admin",
- "type": "address"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "removeAdmin",
- "inputs": [
- {
- "name": "admin",
- "type": "address"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "isAdmin",
- "inputs": [
- {
- "name": "addr",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "setBlacklisted",
- "inputs": [
- {
- "name": "accounts",
- "type": "address[]"
- },
- {
- "name": "value",
- "type": "bool"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "isBlacklisted",
- "inputs": [
- {
- "name": "account",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "setVisibility",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "visibility",
- "type": "uint8"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "getVisibility",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "uint8"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "pin",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "unpin",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "isPinned",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getPinnedApps",
- "inputs": [],
- "outputs": [
- {
- "name": "",
- "type": "tuple[]",
- "components": [
- {
- "name": "index",
- "type": "uint32"
- },
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "metadata_uri",
- "type": "string"
- },
- {
- "name": "owner",
- "type": "address"
- },
- {
- "name": "visibility",
- "type": "uint8"
- },
- {
- "name": "publisher",
- "type": "address"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getApps",
- "inputs": [
- {
- "name": "start",
- "type": "uint32"
- },
- {
- "name": "count",
- "type": "uint32"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple",
- "components": [
- {
- "name": "total",
- "type": "uint32"
- },
- {
- "name": "scanned",
- "type": "uint32"
- },
- {
- "name": "entries",
- "type": "tuple[]",
- "components": [
- {
- "name": "index",
- "type": "uint32"
- },
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "metadata_uri",
- "type": "string"
- },
- {
- "name": "owner",
- "type": "address"
- },
- {
- "name": "visibility",
- "type": "uint8"
- },
- {
- "name": "publisher",
- "type": "address"
- }
- ]
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getLineageCount",
- "inputs": [],
- "outputs": [
- {
- "name": "",
- "type": "uint32"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getLineage",
- "inputs": [
- {
- "name": "start",
- "type": "uint32"
- },
- {
- "name": "count",
- "type": "uint32"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple[]",
- "components": [
- {
- "name": "child",
- "type": "string"
- },
- {
- "name": "source",
- "type": "string"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getMetadataUri",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple",
- "components": [
- {
- "name": "isSome",
- "type": "bool"
- },
- {
- "name": "value",
- "type": "string"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getOwner",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getPoints",
- "inputs": [
- {
- "name": "account",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "uint128"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getTopBuilders",
- "inputs": [
- {
- "name": "start",
- "type": "uint32"
- },
- {
- "name": "count",
- "type": "uint32"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple[]",
- "components": [
- {
- "name": "account",
- "type": "address"
- },
- {
- "name": "score",
- "type": "uint128"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getModCount",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "uint32"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getStarCount",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "uint32"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "hasStarred",
- "inputs": [
- {
- "name": "voter",
- "type": "address"
- },
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getPointBreakdown",
- "inputs": [
- {
- "name": "account",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "tuple",
- "components": [
- {
- "name": "launch_points",
- "type": "uint128"
- },
- {
- "name": "mod_points",
- "type": "uint128"
- },
- {
- "name": "star_points",
- "type": "uint128"
- },
- {
- "name": "total",
- "type": "uint128"
- }
- ]
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "setFrozen",
- "inputs": [
- {
- "name": "value",
- "type": "bool"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "isFrozen",
- "inputs": [],
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "refreshReputationReference",
- "inputs": [],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importApp",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "owner",
- "type": "address"
- },
- {
- "name": "publisher",
- "type": "address"
- },
- {
- "name": "visibility",
- "type": "uint8"
- },
- {
- "name": "metadata_uri",
- "type": "string"
- },
- {
- "name": "is_moddable",
- "type": "bool"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importApps",
- "inputs": [
- {
- "name": "apps",
- "type": "tuple[]",
- "components": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "owner",
- "type": "address"
- },
- {
- "name": "publisher",
- "type": "address"
- },
- {
- "name": "visibility",
- "type": "uint8"
- },
- {
- "name": "metadata_uri",
- "type": "string"
- },
- {
- "name": "is_moddable",
- "type": "bool"
- }
- ]
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importPinned",
- "inputs": [
- {
- "name": "domain",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importLineage",
- "inputs": [
- {
- "name": "entries",
- "type": "tuple[]",
- "components": [
- {
- "name": "child",
- "type": "string"
- },
- {
- "name": "source",
- "type": "string"
- }
- ]
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importPoints",
- "inputs": [
- {
- "name": "entries",
- "type": "tuple[]",
- "components": [
- {
- "name": "account",
- "type": "address"
- },
- {
- "name": "total",
- "type": "uint128"
- }
- ]
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importSocialCounts",
- "inputs": [
- {
- "name": "entries",
- "type": "tuple[]",
- "components": [
- {
- "name": "domain",
- "type": "string"
- },
- {
- "name": "star_count",
- "type": "uint32"
- },
- {
- "name": "mod_count",
- "type": "uint32"
- }
- ]
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "importUsernames",
- "inputs": [
- {
- "name": "entries",
- "type": "tuple[]",
- "components": [
- {
- "name": "account",
- "type": "address"
- },
- {
- "name": "name",
- "type": "string"
- }
- ]
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "setUsername",
- "inputs": [
- {
- "name": "name",
- "type": "string"
- }
- ],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "clearUsername",
- "inputs": [],
- "outputs": [],
- "stateMutability": "nonpayable"
- },
- {
- "type": "function",
- "name": "getUsername",
- "inputs": [
- {
- "name": "account",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "string"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getUsernames",
- "inputs": [
- {
- "name": "accounts",
- "type": "address[]"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "string[]"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "getUsernameOwner",
- "inputs": [
- {
- "name": "name",
- "type": "string"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view"
- },
- {
- "type": "function",
- "name": "isUsernameAvailable",
- "inputs": [
- {
- "name": "name",
- "type": "string"
- },
- {
- "name": "prospective_caller",
- "type": "address"
- }
- ],
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view"
- }
- ],
- "metadataCid": "bafk2bzaceduyvqkzgyfafjcy77v3t3ypvkruwvt6zq3uaw37zvzelalfpkfty"
- }
- }
- }
}
diff --git a/package.json b/package.json
index 9f7b2f2..0b669c9 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,6 @@
"pg": "./src/index.ts"
},
"scripts": {
- "postinstall": "bash node_modules/@parity/product-sdk-terminal/scripts/patch-wasm.sh",
"format": "biome format --write .",
"format:check": "biome format .",
"lint:license": "./scripts/check-license-headers.sh",
@@ -30,21 +29,18 @@
"@dotdm/env": "^2.0.2",
"@parity/dotns-cli": "0.6.1",
"@parity/product-sdk-address": "^0.1.1",
- "@parity/product-sdk-bulletin": "^0.4.2",
- "@parity/product-sdk-chain-client": "^0.4.2",
- "@parity/product-sdk-contracts": "^0.5.1",
- "@parity/product-sdk-descriptors": "^0.4.1",
- "@parity/product-sdk-host": "^0.4.0",
+ "@parity/product-sdk-cloud-storage": "^0.5.3",
+ "@parity/product-sdk-contracts": "^0.7.0",
+ "@parity/product-sdk-descriptors": "^0.5.2",
"@parity/product-sdk-keys": "^0.3.0",
"@parity/product-sdk-logger": "^0.1.1",
- "@parity/product-sdk-storage": "^0.1.5",
- "@parity/product-sdk-terminal": "^0.2.1",
+ "@parity/product-sdk-terminal": "^0.3.0",
"@parity/product-sdk-tx": "^0.2.4",
"@parity/product-sdk-utils": "^0.1.1",
"@polkadot-api/sdk-ink": "^0.7.0",
"@scure/sr25519": "^2.2.0",
"@sentry/node": "^9.47.1",
- "bulletin-deploy": "0.7.29",
+ "bulletin-deploy": "0.8.1",
"commander": "^12.0.0",
"ink": "^5.2.1",
"polkadot-api": "^2.1.3",
@@ -69,12 +65,14 @@
"overrides": {
"@parity/dotns-cli>@polkadot-api/descriptors": "file:./stubs/papi-descriptors-stub",
"@polkadot-api/json-rpc-provider": "^0.2.0",
- "@novasamatech/host-api": "0.7.9-4",
- "@novasamatech/host-papp": "0.7.9-4",
- "@novasamatech/product-sdk": "0.7.9-4",
- "@novasamatech/scale": "0.7.9-4",
- "@novasamatech/statement-store": "0.7.9-4",
- "@novasamatech/storage-adapter": "0.7.9-4"
+ "@novasamatech/host-api": "0.7.9",
+ "@novasamatech/host-papp": "0.7.9",
+ "@novasamatech/scale": "0.7.9",
+ "@novasamatech/statement-store": "0.7.9",
+ "@novasamatech/storage-adapter": "0.7.9"
+ },
+ "patchedDependencies": {
+ "@parity/product-sdk-terminal": "patches/@parity__product-sdk-terminal.patch"
}
}
}
diff --git a/patches/@parity__product-sdk-terminal.patch b/patches/@parity__product-sdk-terminal.patch
new file mode 100644
index 0000000..8fb024c
--- /dev/null
+++ b/patches/@parity__product-sdk-terminal.patch
@@ -0,0 +1,32 @@
+diff --git a/dist/adapter-Dt3ryKnw.d.ts b/dist/adapter-Dt3ryKnw.d.ts
+index b769598312d9cece058c9ba24a75915d54b8cf7c..ba073eb8f4f42f3f4885d7c91f8ddf6bb81d111a 100644
+--- a/dist/adapter-Dt3ryKnw.d.ts
++++ b/dist/adapter-Dt3ryKnw.d.ts
+@@ -16,6 +16,12 @@ interface TerminalAdapterOptions {
+ endpoints?: string[];
+ /** Optional host metadata for the Sign-In screen. */
+ hostMetadata?: HostMetadata;
++ /**
++ * PATCH(playground-cli): metadata URL embedded in the V1 pairing QR
++ * (host-papp 0.7.9 mobile-compat pin). The phone fetches this URL to
++ * render the Sign-In screen. Remove with the 0.7.9 override.
++ */
++ metadataUrl?: string;
+ /**
+ * Directory where session files are persisted. Defaults to
+ * `~/.polkadot-apps/`. Override in tests to point at a temporary
+diff --git a/dist/index.js b/dist/index.js
+index 5788d3419cec67d0a300ff4464e19b38188d9aa4..0ed096c61fd710ee46257316aa9881af56524932 100644
+--- a/dist/index.js
++++ b/dist/index.js
+@@ -26,6 +26,10 @@ function createTerminalAdapter(options) {
+ const statementStore = createPapiStatementStoreAdapter(trackedLazyClient);
+ const adapter = createPappAdapter({
+ appId: options.appId,
++ // PATCH(playground-cli): forward the V1 metadata URL while pinned to
++ // host-papp 0.7.9 (mobile-compat pin). host-papp 0.8 removed this field;
++ // drop this patch together with the 0.7.9 override.
++ metadata: options.metadataUrl,
+ hostMetadata: options.hostMetadata,
+ adapters: {
+ storage,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3ac9624..8ae6b70 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,12 +7,16 @@ settings:
overrides:
'@parity/dotns-cli>@polkadot-api/descriptors': file:./stubs/papi-descriptors-stub
'@polkadot-api/json-rpc-provider': ^0.2.0
- '@novasamatech/host-api': 0.7.9-4
- '@novasamatech/host-papp': 0.7.9-4
- '@novasamatech/product-sdk': 0.7.9-4
- '@novasamatech/scale': 0.7.9-4
- '@novasamatech/statement-store': 0.7.9-4
- '@novasamatech/storage-adapter': 0.7.9-4
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/host-papp': 0.7.9
+ '@novasamatech/scale': 0.7.9
+ '@novasamatech/statement-store': 0.7.9
+ '@novasamatech/storage-adapter': 0.7.9
+
+patchedDependencies:
+ '@parity/product-sdk-terminal':
+ hash: 881abfac101745190526378af2ef8b2bffee3a6b8743272b706f434568e806d3
+ path: patches/@parity__product-sdk-terminal.patch
importers:
@@ -20,55 +24,46 @@ importers:
dependencies:
'@dotdm/cdm':
specifier: ^0.6.15
- version: 0.6.15(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot-api/ink-contracts@0.6.2)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
+ version: 0.6.15(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot-api/ink-contracts@0.6.3)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
'@dotdm/contracts':
specifier: ^3.1.2
- version: 3.1.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
+ version: 3.1.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
'@dotdm/env':
specifier: ^2.0.2
- version: 2.0.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ version: 2.0.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/dotns-cli':
specifier: 0.6.1
version: 0.6.1(@polkadot/util@14.0.3)(jiti@2.7.0)(postcss@8.5.10)(react-native@0.85.2(@babel/core@7.29.7)(@types/react@18.3.28)(react@18.3.1))(rxjs@7.8.2)(typescript@5.9.3)(yaml@2.9.0)
'@parity/product-sdk-address':
specifier: ^0.1.1
version: 0.1.1
- '@parity/product-sdk-bulletin':
- specifier: ^0.4.2
- version: 0.4.2(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-chain-client':
- specifier: ^0.4.2
- version: 0.4.2(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-cloud-storage':
+ specifier: ^0.5.3
+ version: 0.5.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-contracts':
- specifier: ^0.5.1
- version: 0.5.1(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
+ specifier: ^0.7.0
+ version: 0.7.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
'@parity/product-sdk-descriptors':
- specifier: ^0.4.1
- version: 0.4.1(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-host':
- specifier: ^0.4.0
- version: 0.4.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ specifier: ^0.5.2
+ version: 0.5.2(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-keys':
specifier: ^0.3.0
- version: 0.3.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ version: 0.3.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger':
specifier: ^0.1.1
version: 0.1.1
- '@parity/product-sdk-storage':
- specifier: ^0.1.5
- version: 0.1.5(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-terminal':
- specifier: ^0.2.1
- version: 0.2.1(esbuild@0.27.7)(rxjs@7.8.2)
+ specifier: ^0.3.0
+ version: 0.3.0(patch_hash=881abfac101745190526378af2ef8b2bffee3a6b8743272b706f434568e806d3)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-tx':
specifier: ^0.2.4
- version: 0.2.4(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ version: 0.2.7(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-utils':
specifier: ^0.1.1
version: 0.1.1
'@polkadot-api/sdk-ink':
specifier: ^0.7.0
- version: 0.7.0(@polkadot-api/ink-contracts@0.6.2)(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)(typescript@5.9.3)
+ version: 0.7.0(@polkadot-api/ink-contracts@0.6.3)(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)(typescript@5.9.3)
'@scure/sr25519':
specifier: ^2.2.0
version: 2.2.0
@@ -76,8 +71,8 @@ importers:
specifier: ^9.47.1
version: 9.47.1
bulletin-deploy:
- specifier: 0.7.29
- version: 0.7.29(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
+ specifier: 0.8.1
+ version: 0.8.1(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
commander:
specifier: ^12.0.0
version: 12.1.0
@@ -86,7 +81,7 @@ importers:
version: 5.2.1(@types/react@18.3.28)(react-devtools-core@file:stubs/react-devtools-core)(react@18.3.1)
polkadot-api:
specifier: ^2.1.3
- version: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ version: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
react:
specifier: ^18.3.1
version: 18.3.1
@@ -102,10 +97,10 @@ importers:
version: 1.9.4
'@changesets/cli':
specifier: ^2.29.8
- version: 2.30.0(@types/node@22.19.17)
+ version: 2.30.0(@types/node@22.19.19)
'@types/node':
specifier: ^22.15.3
- version: 22.19.17
+ version: 22.19.19
'@types/react':
specifier: ^18.3.18
version: 18.3.28
@@ -120,7 +115,7 @@ importers:
version: 5.9.3
vitest:
specifier: ^3.2.1
- version: 3.2.4(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
+ version: 3.2.4(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
packages:
@@ -143,10 +138,6 @@ packages:
'@assemblyscript/loader@0.9.4':
resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==}
- '@babel/code-frame@7.29.0':
- resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
- engines: {node: '>=6.9.0'}
-
'@babel/code-frame@7.29.7':
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'}
@@ -185,10 +176,6 @@ packages:
resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.28.5':
- resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-validator-identifier@7.29.7':
resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
engines: {node: '>=6.9.0'}
@@ -206,10 +193,6 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/runtime@7.29.2':
- resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
- engines: {node: '>=6.9.0'}
-
'@babel/runtime@7.29.7':
resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
engines: {node: '>=6.9.0'}
@@ -361,6 +344,11 @@ packages:
peerDependencies:
commander: ~14.0.0
+ '@commander-js/extra-typings@15.0.0':
+ resolution: {integrity: sha512-yeJlba62xqmkgELUsn7356MEnzLLu/fw2x4lofFqGnXh6YysRdEs2BaLeLtg1+KU0AXvMeqQvTTp+3hBEBK+EA==}
+ peerDependencies:
+ commander: ~15.0.0
+
'@dnsquery/dns-packet@6.1.1':
resolution: {integrity: sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==}
engines: {node: '>=6'}
@@ -796,9 +784,6 @@ packages:
'@libp2p/config@1.1.30':
resolution: {integrity: sha512-uidU1FCYaDIIWfk6u4VAv4iG4ZihQnv4SiI8WQ5NLzWJzIojD5t6j3JlEgTKKcs3Xoz/odj+z67BJFKFVrHkdA==}
- '@libp2p/crypto@5.1.17':
- resolution: {integrity: sha512-gzn9b3tX9D5xCiXb36PF0rH16kGkLW5ESbT+nmXKUp1HCDD30RXQT/oHSylz5I3GN39BC1C3hBOBNaIQYuO+qw==}
-
'@libp2p/crypto@5.1.18':
resolution: {integrity: sha512-sCm+dFFZmH4LJIHTCzPy7+EBRhzkndFUcIU8bui6iaxK6SDSRVa11+/O6DzW8hn/U9LgDXe6jXnzWM8bM7OoCA==}
@@ -823,15 +808,9 @@ packages:
'@libp2p/identify@4.1.3':
resolution: {integrity: sha512-EhUr3o611Ax9xKJPLvCgHBpEO3lWW+ss2NjLpL9GXQRbyp7pcN2C5ZgHzDfMfHdXPoIqKrrALaVc0z2c+cn0zA==}
- '@libp2p/interface-internal@3.1.3':
- resolution: {integrity: sha512-rDmIL7YUplnaD33/5K40Aue7dHIg4FvIm+swE4tXey2p2wpcn1KE7fzbAX0dFJkHufuI8H/W3zn/iw3ZQgbFjg==}
-
'@libp2p/interface-internal@3.1.5':
resolution: {integrity: sha512-xbFB0eAv/MkixmQKkvD0jmPSzF8my92ago2ss5PVa3QFKXz0XtpQSRnj22sfzLyURs1QSRQd+iK+ZJaHdZ0DMg==}
- '@libp2p/interface@3.2.0':
- resolution: {integrity: sha512-gaG4MeZ294A5VrgEaaBAW/bWse76ZCwmFQ5v8urVNQOgunF3M28zXi41MVFhYMOXlBWsOUY2OUYY1Nw3wkq44w==}
-
'@libp2p/interface@3.2.2':
resolution: {integrity: sha512-IU78g6uF8Ls0//4v9VE1rL5Jvy+i6I8LI/DssojFICbaDJSkL59Sn5XRfHrY5OCxTnUnUxnWK7pHz/3+UZcRNQ==}
@@ -841,12 +820,6 @@ packages:
'@libp2p/keychain@6.1.0':
resolution: {integrity: sha512-X/AdUB53uV00VRIRf2mX8fByvSx6bpfQbEdx8nHtLTVgcfnSDfFYIw8krd8ZnzgBNCbN+osMJn151Ft+QHkeBQ==}
- '@libp2p/logger@6.2.4':
- resolution: {integrity: sha512-XQayi07DTLfZSrSFrxBkY4vUaHVnVoQDuVCaE3tKigpXZm5OFVMLJW9WDdEGtiJJE8sCaFvXTyg/PmOQSNxh4w==}
-
- '@libp2p/logger@6.2.6':
- resolution: {integrity: sha512-ep2fNBFZHVomQEvXk0NET2Y85csVeQbFpCvT94uQrtP4MrRE6zVjxiuh67KZuE32odnoKwE29i2fWPHc1p1Xng==}
-
'@libp2p/logger@6.2.7':
resolution: {integrity: sha512-IVEz5+0kE4mRWwMzXP34AlXe2k1FLzBqKkjeASyhPVdMz0A4qH9nYmCBwonzmRzymklGjFIEDa1s7Vjhd9V4Rg==}
@@ -859,15 +832,9 @@ packages:
'@libp2p/multistream-select@7.0.18':
resolution: {integrity: sha512-Twctbqr2rnPnTf2iPIwKq4LzpI29gKwogtmqr0qJh2+IMKH+MtwhT+s+c0Mb2A+n+Td0AceRRddWS5DOaFskVg==}
- '@libp2p/peer-collections@7.0.18':
- resolution: {integrity: sha512-xcUmToljkDFEKwQrbgrGGaVbX6Z8/ir4MTBlGpyo8H8JRxnfQ0ybvVbHiEeX5OpFMT3e/bQrcdfydFDJKy3hWA==}
-
'@libp2p/peer-collections@7.0.20':
resolution: {integrity: sha512-OYohC9qQHUp1KSXRe4qgPk+IxxVgMG/+7TL7Nt3Pw1tWKLQ93DzRRZHUBRwvYDOv6M4jD/Qn1pxXOwNQsSQgCg==}
- '@libp2p/peer-id@6.0.8':
- resolution: {integrity: sha512-D9fkXL5g+RfSvDVnj/DxVeuGPq5SQrWPWf4VPf+pPkIZVcTOuuR6OUN9XtYfOUxeN3CbsoAlRk0EDXqRA8Zyxg==}
-
'@libp2p/peer-id@6.0.9':
resolution: {integrity: sha512-MlofyOOpxzZA4tIcOVPjd1FQIa0TA0g+bn+d08vfo9znCjfe6Lh0RBFyLdlICbyogVN6wn7+29SYch78wCuuCQ==}
@@ -877,9 +844,6 @@ packages:
'@libp2p/peer-store@12.0.18':
resolution: {integrity: sha512-RLTW+5vQJY/em+xFqaZe6vN7M2dEVYjr+4XCevU5XWGGWfsZy+HC7DkoH+o3wqptnniCewqtpF1Vf8LhaivGXw==}
- '@libp2p/ping@3.1.3':
- resolution: {integrity: sha512-ZdlMWE4N0cHcDfOnp3Zi1STCBYRR9BPNNn5Wg03AZj7FbCKmlin03Uf1EKl5TcdlVm+E8z8uCB3+wIGtFHQByA==}
-
'@libp2p/ping@3.1.5':
resolution: {integrity: sha512-1ri4Swms2lc5yLTZOvVAqHXJr4vx8TPTEp7uHM4+Q+hKQ8zNulzWiyTBBdKh2tCdZbGYLevqt0e52iyqVFRN8A==}
@@ -895,9 +859,6 @@ packages:
'@libp2p/upnp-nat@4.0.18':
resolution: {integrity: sha512-kDSj1nLE+wfvhRx/N8rFEy277Qjc+iKLn4NJLqCkmzjwxkQXzVgkRMNB900t4qIxGfVsVnV35UxbL49Yi8UsRQ==}
- '@libp2p/utils@7.1.0':
- resolution: {integrity: sha512-gfOpPIMpv+B4XXIsmXVN41p6kFrBw8yC2OwNaX6sjTwf7s1GmpQ/O0R4nI0P2t0RzBELy1EG8DgUmlxZOvdwjA==}
-
'@libp2p/utils@7.2.1':
resolution: {integrity: sha512-tRBQHUqgggXATgTY8S0A8amdhljZ7Xx9nAWDOpfvW/ojDVY89BpIJfKLEe0TUD9Lc/3pSmlAC6oBYaHe2jP9UA==}
@@ -997,26 +958,26 @@ packages:
'@novasamatech/host-api-wrapper@0.7.9':
resolution: {integrity: sha512-Z1bAUz1bPRiwCxrzktI6pd7ne+p33aH1ffzItRlBheWTTWaRRgSFD9COtUYj9yb1KHGNXjj3fNWxoY2DR1/CMg==}
- '@novasamatech/host-api@0.7.9-4':
- resolution: {integrity: sha512-bwDUWWGKgb4BUuVFjUOqNXLXfXjzO4+cwlZD7TXvVLSmd9DQnELjig4i5//hD8/a+jdgrnXa9loO2hfc/i05Jw==}
+ '@novasamatech/host-api-wrapper@0.8.4':
+ resolution: {integrity: sha512-qO8BTzzEpmH8H4YR98ypMbdq6p4992bmLtU++CFpKktHI5ei9YsNKn8oSdtGrhdJOAGI2HaNbyH1pKFxVcM01g==}
- '@novasamatech/host-papp@0.7.9-4':
- resolution: {integrity: sha512-afEyNogDvlWHvKDtODXL+j4n3yxzCzG1JnW5c90OaMZlAOYatnUnLT/r7U8CmXIRoYZJBZO/u0U1aPiB8K9jEA==}
+ '@novasamatech/host-api@0.7.9':
+ resolution: {integrity: sha512-3/dOennEXjLvDCj8S4F+siwhUAHPK4PwY29+W1L8BhzNZ/CRcoAMZ959C39X3bhGIy1Wn93L6SrJz6zo2sH7FA==}
- '@novasamatech/product-sdk@0.7.9-4':
- resolution: {integrity: sha512-BPwRNEV+9dXWzILfMWKQdaM7RKm1uZlIFVrxlM6bj3LsGBxekPj/qYB+HeRT8cWseiw2c8zzS7Q4OvKb8ZAUqQ==}
+ '@novasamatech/host-papp@0.7.9':
+ resolution: {integrity: sha512-Zs318G0Y4+ZNvU3My3I/Y48RZfC+gghTpAaPGtRlRnvwiB8BON5bDyqXIsz+uSSmXrJlGtZh86kkTw0/Cm/hew==}
- '@novasamatech/scale@0.7.9-4':
- resolution: {integrity: sha512-wBBapBLskrRaKVMmRmzhn8SJl8gEifqxWdKL0eOmTFR/6GPl4EY5MjYO+5WLARFvLdFqQ4PBegx3TjZBBFNeYA==}
+ '@novasamatech/scale@0.7.9':
+ resolution: {integrity: sha512-tQimsOkz6zYNInBfHwOVMWyZkUH14WxJ3ezcTpMjMLm/r4x4niUqMWZqWiuqW8kYG4wRFtEBeynIVqknB84NqQ==}
'@novasamatech/sdk-statement@0.6.0':
resolution: {integrity: sha512-NTqM+yS45iHgy87lVSWIpFozrTfCUWb7r4ZpsDtN1eFnfixXpDKpPXDWQsvPs+nh18r/jmoMgtlTjUltrS6mYQ==}
- '@novasamatech/statement-store@0.7.9-4':
- resolution: {integrity: sha512-xov5ukZ4IeWuaT9AjZOP4Dal9r1PcsS8r/9kuBzUTFpHlYuKtUdJnljparktWGhqdyoz7imW0AytjNPWIll85A==}
+ '@novasamatech/statement-store@0.7.9':
+ resolution: {integrity: sha512-PZcB4xSSSO1inmSlGL6XrCi5yO5LvGc0UpPQp/FzwVaZ3P261YUDfUjZMYqhRiWdDHGnWJLCsY/oNZRl68s/+g==}
- '@novasamatech/storage-adapter@0.7.9-4':
- resolution: {integrity: sha512-7qnxe8RK61yYCP9HnWcu2L2WqdXpyDw0GHyCuD0l4Nu4Cub1LDOZH3gZ8ihxY+RRt24zt61O89YutM2iQzmeIQ==}
+ '@novasamatech/storage-adapter@0.7.9':
+ resolution: {integrity: sha512-YLD/G0tVJL8oFsdA4ru+UZXbW7nOiaD+E18mdP1gWKYdK9bBhu7X8tbF0Qr0bG3nIgyfRYkp8KXRPAoIryUxLw==}
'@opentelemetry/api-logs@0.57.2':
resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==}
@@ -1227,26 +1188,32 @@ packages:
'@parity/product-sdk-chain-client@0.4.2':
resolution: {integrity: sha512-RuPECyfE+BI0s+HiTeGa17zV3UPnbhtcbkFNoRcg6PDVM9anLD/W/hPDC3dBYuCG4AhksHBgogbbo154iP9VVA==}
- '@parity/product-sdk-contracts@0.5.1':
- resolution: {integrity: sha512-eM8nQjSf7T1iRQ1Vpfdj+LxBjIHR3geIIw3tF6lp+MkA4Eshf1UZBN1aCYugQUDh/qQxH+mblJJ/94ODjJnctA==}
+ '@parity/product-sdk-chain-client@0.5.3':
+ resolution: {integrity: sha512-bvYKyh4P68aTSr13ejb166Veeu3Bn1CK434CvyOO/csMzUbOcDzCZ9Kff1Y+/V6Z72eaps+UJCAtdepyw+T3pw==}
+
+ '@parity/product-sdk-cloud-storage@0.5.3':
+ resolution: {integrity: sha512-+WUxwS6jW1bhFt6LZCZza3rMVMGNsBQpnA3BRXJnbWfVfnf3ENagTHNFPKkjaAjble0wcFa7OFLunNRZuP4V2Q==}
'@parity/product-sdk-contracts@0.6.0':
resolution: {integrity: sha512-R9HCXGFlPXzXlx5Zu4HpIvMimpW4eScsdS6YXfzPpeyk6pOIWuFd2oDZWoIR03wIagNBi3mvcxSCzuWgSZmbHg==}
+ '@parity/product-sdk-contracts@0.7.0':
+ resolution: {integrity: sha512-GJnr0fh9L12LtW16VWfGAjWklVMtz7sVz+ymBPFNG0dftRSgh2e1+XuHhx9306mqAzFp5orrw/X42wlWz6Rdqg==}
+
'@parity/product-sdk-crypto@0.1.1':
resolution: {integrity: sha512-No6AyTLw1Nv3ym8SDdXh/tnezdClNOL9pJgaciVr9Ny6hIL5rs6MQiXsP0+1bc1Nwymz5Q4FqsYg/htE4lejNg==}
'@parity/product-sdk-descriptors@0.4.1':
resolution: {integrity: sha512-7OKTRy+116aUTkTZyGFmD0C4slKoiayx03MBUDFPLRjQvDDt4rJ6Id10MigxK0Dyj57ptImYnAfOnwv7pvZn5A==}
- '@parity/product-sdk-descriptors@0.5.0':
- resolution: {integrity: sha512-QdOYhaPdWMDocjV5U1mv+buF63huXc03mlrHNINgcBHbzCuePa62woGwVoTAxJorVT5ZoXotMCOFEOMbmdMraQ==}
+ '@parity/product-sdk-descriptors@0.5.2':
+ resolution: {integrity: sha512-5yPBx4SdchSNgjANUi1dRI9UuXzh6NBwCu4HqXOl5T7Kzh95dO9sMW/0DNwa/L1M0Y2SnUhTr+h/FtiJF2p5qg==}
'@parity/product-sdk-host@0.4.0':
resolution: {integrity: sha512-Kw/ZRMHBHPrR/ST00QZqZa+qXGrrLYVXgrmCJ9YCys+yaPleJl0Q1+HI6zTD0bjaHsooESk+yYLajCRtZAdVVg==}
peerDependencies:
- '@novasamatech/host-api': 0.7.9-4
- '@novasamatech/product-sdk': 0.7.9-4
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/product-sdk': '>=0.1.0'
peerDependenciesMeta:
'@novasamatech/host-api':
optional: true
@@ -1256,7 +1223,7 @@ packages:
'@parity/product-sdk-host@0.5.0':
resolution: {integrity: sha512-kJE0SM+4xifcBTm3OyZNpQ95QOfGsssIQyGdtX5a4zK0puLdlETtGEQWL2sMIK0Z3iAw21GUMD4+dBibYTQhRQ==}
peerDependencies:
- '@novasamatech/host-api': 0.7.9-4
+ '@novasamatech/host-api': 0.7.9
'@novasamatech/host-api-wrapper': '>=0.1.0'
peerDependenciesMeta:
'@novasamatech/host-api':
@@ -1264,29 +1231,46 @@ packages:
'@novasamatech/host-api-wrapper':
optional: true
+ '@parity/product-sdk-host@0.6.1':
+ resolution: {integrity: sha512-VtEbAvMcgCyq2nZvQO4jhKtJTkun3FHjMy0upkAJEmUfxQ4gWlEH4zDHsSwmmKNJh3lTT3BrzmJod9Sh3MNYcQ==}
+ peerDependencies:
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/host-api-wrapper': '>=0.8.0'
+ peerDependenciesMeta:
+ '@novasamatech/host-api':
+ optional: true
+ '@novasamatech/host-api-wrapper':
+ optional: true
+
'@parity/product-sdk-keys@0.3.0':
resolution: {integrity: sha512-GkFAyqITyy9BLQaFpdyf7hQtUtUfaqAVhp0/0Hg6ayMXA5kSjorAHcTj5Off1/2cK8Lw74U/K6O7Z0jkwnUb7g==}
'@parity/product-sdk-keys@0.3.1':
resolution: {integrity: sha512-g0w993V5VaDI1oJz5J9kSiIbADrYGpKqs8D02L6q01vcGIldWzzfp2pu8VewnSJdayh2IoLFYEb6WmzaBJ/pcg==}
+ '@parity/product-sdk-keys@0.3.3':
+ resolution: {integrity: sha512-FZdUxGl+L0VwkX6iTcNBbdvXwNf/H1hLfvIKUFXneqwndVQAoUv6PCKFMqaGhf/xA6OwMJ6mD7/nIlJafKyM+g==}
+
'@parity/product-sdk-local-storage@0.2.0':
resolution: {integrity: sha512-u/8ATUwkkf0thwZJnMMjR6KN6mQJ/LYpDKUxbEy2Vsrm8As1NW+Ag8SjD6ganktgUQCx1OP/VcnOkNTVgoM/OA==}
+ '@parity/product-sdk-local-storage@0.2.2':
+ resolution: {integrity: sha512-QHdx7IeAxi1O9jXhJ3fZrp+eXAI1ghT5gK+kj5U13pssBIrnDrh4hO+X3cNcNd9suG7j53EX4eVc0BP6VAqdVg==}
+
'@parity/product-sdk-logger@0.1.1':
resolution: {integrity: sha512-AiSV3TTNlMZJftLQsO78BZsEymGFuJtGMSpGrJ+vUtqaZavWaW/Hc6MICBLnEYgeCrdNpv7QBso3dRsTfnAZXQ==}
- '@parity/product-sdk-signer@0.3.0':
- resolution: {integrity: sha512-baeqdXUZ8PiPKv8jdgyKkKQp7CggeuPqVZ9EOohjW+MZid8/etuZj0UdXh62iFzYtovCBVhfWvf5wIHPoh2SpQ==}
-
'@parity/product-sdk-signer@0.4.0':
resolution: {integrity: sha512-NPws1fnp5vUF4kCnzy5N00CcsY2yUTOhjNaJwAIVV9yZodM8aWy6bLakEPe/2v416flyVzDin3IV7Xn2tJiHUA==}
+ '@parity/product-sdk-signer@0.6.0':
+ resolution: {integrity: sha512-geMYFfefYIDoOTV720JLI6nsnnFJFtEjYLVNTJYtENl4iTQ/2bA4SMGWvyxiD45y9FX/5oBKIqeqdGeE+E7/Pw==}
+
'@parity/product-sdk-storage@0.1.5':
resolution: {integrity: sha512-TKW7HesTCihDtR1usKg/xMhKiO1kVPJej0bDhXXKTHCDfVWkdPR1A//oG9b+pQtswVLFm4k+FanFOt8lAQMBDA==}
- '@parity/product-sdk-terminal@0.2.1':
- resolution: {integrity: sha512-xcuKoOMHETwHBefEeNSMDqzL+AQFoTmK3i6JBwsvGhpijwJ8QDdoEMhilYiMKnmoyDml9nu/VCcPUKw3Am0zow==}
+ '@parity/product-sdk-terminal@0.3.0':
+ resolution: {integrity: sha512-m5OP+G5osqzE+jtPaLp/RxAsYQ8B7Jiiw8jMOOJdaRni30bV07nSPwxHDDNYAefexW8zt90U/qHalYBG/C1XDw==}
'@parity/product-sdk-tx@0.2.4':
resolution: {integrity: sha512-Kp/giVb30/B/z97JE+iGFmz3nZkHSUnaGy4o+6Ed0i2arUuJFY2GsuxEI8+8DvyhmT1HP//GundZSLoJHPTk6Q==}
@@ -1294,6 +1278,9 @@ packages:
'@parity/product-sdk-tx@0.2.5':
resolution: {integrity: sha512-KVopt7rGo/Is713EjJ1mICb/yplhPyMMERdGFNHqW6oQpU+pA0zNdETY4lE/sTPocklMOyTcTU7SEG0z+aacmA==}
+ '@parity/product-sdk-tx@0.2.7':
+ resolution: {integrity: sha512-H8nEi7FBf8q7TV6dYKBuOFCSS7yv3yxjU89EQ8iWVAfUkLiMeHEPnMQPPsAWj/wz1OsTYENqQoqLexl9NKCnvQ==}
+
'@parity/product-sdk-utils@0.1.1':
resolution: {integrity: sha512-vu/af1K7k7p0/aLKALrGVxz7K94xnY800DxmhnOhu6Hy4+y+8e9WHPecMjbYBBJby4FPMOkWLqEVRN/sk3Ucgw==}
@@ -1347,15 +1334,15 @@ packages:
resolution: {integrity: sha512-jPa8WSNPZWdy372sBAUnm0nU1XX5mLbmgkOOU39+zpYPSE12mYXyM3r7JuT5IHdAccEJr6qK2DplPFTeNSyq9A==}
hasBin: true
- '@polkadot-api/cli@0.21.2':
- resolution: {integrity: sha512-Z6BviF0y1xKz0z7pvKTtLnBlbDVFkAGijTOdt7bmMnPz2bSBGBzaEyPH+8iHXhXYHr+q/9w2aet/O0PVpJsaaw==}
+ '@polkadot-api/cli@0.21.4':
+ resolution: {integrity: sha512-4TqLgnpE/7jGHVLNfsy+fTTz32/dsgJA4r/T0BBsX3kNK3jO+VT6hQFtRNwcfeU1VNQvV/AfDmaNaRUGqvaybQ==}
hasBin: true
'@polkadot-api/codegen@0.21.2':
resolution: {integrity: sha512-e1Of2TfB13YndPQ71WrtOIPfRrSlkG6wGprP8/VHC484kkt2JPDOY+io3NdPWkafDblDQ47aG0368sxT+4RSZA==}
- '@polkadot-api/codegen@0.22.4':
- resolution: {integrity: sha512-SHab4/zICOMzIwuZai3SBiKnWz62eEYCHOCvt6zSbAMddNGg3HgXANG0IEBVM5Ad+wX9YFIINAFkV8y1Pbwv5g==}
+ '@polkadot-api/codegen@0.22.5':
+ resolution: {integrity: sha512-zwZJAlviI211zhj5i6oXkrr0crrbO3GZjBd2vC9AshY1pRmyiNLV9DZsXw4E6l4JQwdAAyNWtPdnvvB9T3TpKg==}
'@polkadot-api/common-sdk-utils@0.3.0':
resolution: {integrity: sha512-sBOUZwRBjFz7Cukt0W/37fbEW23V5HWKJrbmL7WFVgZGECOqZ2knlJCWBCNGdr+i6i91f7x29T5sQwIAyx1jpA==}
@@ -1369,8 +1356,8 @@ packages:
'@polkadot-api/ink-contracts@0.4.6':
resolution: {integrity: sha512-wpFPa8CnGnmq+cFYMzuTEDmtt3ElBM0UWgTz4RpmI9E7knZ1ctWBhO7amXxOWcILqIG6sqWIE95x0cfF1PRcQg==}
- '@polkadot-api/ink-contracts@0.6.2':
- resolution: {integrity: sha512-RWsXlT6SuY1oCRfcPrQLGe2emE9Fz6pdQ5QhHvC/OdsVHl3tDCVHx384CRSoxasAb1rucok8pGhpYc0IUzq2Jw==}
+ '@polkadot-api/ink-contracts@0.6.3':
+ resolution: {integrity: sha512-XqnM1VDzI5L62xgg+f8le2yEoz8QZbUKEfAfPnHMOgBj9tJiyF15FcOJmnLMO/vq3cGixqh18tzJekLG5YTxtA==}
'@polkadot-api/json-rpc-provider-proxy@0.1.0':
resolution: {integrity: sha512-8GSFE5+EF73MCuLQm8tjrbCqlgclcHBSRaswvXziJ0ZW7iw3UEMsKkkKvELayWyBuOPa2T5i1nj6gFOeIsqvrg==}
@@ -1384,8 +1371,8 @@ packages:
'@polkadot-api/json-rpc-provider@0.2.0':
resolution: {integrity: sha512-lhkuBS/x06i3djQIN7p8jVkMnYuGsUAEMS6RhdWeEpz7X/8/APER4Wdih7MEBovCuwVSCTjOxl8f+alH7AZHZg==}
- '@polkadot-api/known-chains@0.11.3':
- resolution: {integrity: sha512-ObvFOgVchOEGX3VR4g0LrHOkdltl9kF5xTgVLErfs3dUl9OhG0MaFs8vB2n9GBdp616T3tOFAgKYZNSFtBomyg==}
+ '@polkadot-api/known-chains@0.11.5':
+ resolution: {integrity: sha512-KOVQRyZj43lr1W5w1lZpzzLUszjPPGV32USsGVxFdguWG7L/gH+nHyBPkyhw3GhN+8NMQD7ZCyuMuNKXbRYlDA==}
'@polkadot-api/known-chains@0.9.18':
resolution: {integrity: sha512-zdU4FA01lXcpNXUiFgSmFKIwDKbTw15KT4U6Zlqo6FPUMZgncVEbbS4dSgVrf+TGw9SDOUjGlEdyTHAiOAG5Tw==}
@@ -1404,14 +1391,14 @@ packages:
'@polkadot-api/merkleize-metadata@1.1.29':
resolution: {integrity: sha512-z8ivYDdr4xlh50MQ7hLaSVw4VM6EV7gGgd+v/ej09nue0W08NG77zf7pXWeRKgOXe3+hPOSQQRSZT2OlIYRfqA==}
- '@polkadot-api/merkleize-metadata@1.2.2':
- resolution: {integrity: sha512-3u1ycUlezLeK80gXkxIPF1bgr/ZZ8XxAPZacJh+3uSjOhB9D/ShenM7uifihxXDYkGD/mS1Cr9DCjPZ7X1ZLKQ==}
+ '@polkadot-api/merkleize-metadata@1.2.3':
+ resolution: {integrity: sha512-WkPbz0p2XQ9c8yXagdnwCHEB70Gnm91okcsd6IXU393//3aPgkxKgb+/Efnz7C5/KQmg02P0zXo7q/n/W/yVCA==}
'@polkadot-api/metadata-builders@0.13.9':
resolution: {integrity: sha512-V2GljT6StuK40pfmO5l53CvgFNgy60Trrv20mOZDCsFU9J82F+a1HYAABDYlRgoZ9d0IDwc+u+vI+RHUJoR4xw==}
- '@polkadot-api/metadata-builders@0.14.2':
- resolution: {integrity: sha512-nhsFfti0M5tE0LR8++0wHqbP54I/QSFXP/uF5I82MYVSKY0NqIDkIFvr27oLo/ltF+o3vcN44ZJQqvi1k6l9mA==}
+ '@polkadot-api/metadata-builders@0.14.3':
+ resolution: {integrity: sha512-m7CACsiqHzgVEh5WBZGkTV8AQ3CBQKR1YpPQMnlsJfCr/IkgKU0UyWM6WxCmBiReLFVkOfXMtGlpN8+GxpHmww==}
'@polkadot-api/metadata-builders@0.3.2':
resolution: {integrity: sha512-TKpfoT6vTb+513KDzMBTfCb/ORdgRnsS3TDFpOhAhZ08ikvK+hjHMt5plPiAX/OWkm1Wc9I3+K6W0hX5Ab7MVg==}
@@ -1419,16 +1406,16 @@ packages:
'@polkadot-api/metadata-compatibility@0.4.4':
resolution: {integrity: sha512-V4ye5d2ns32YC45Fdc/IF9Y7CgM8inzJbmHQ2DCPSNd6omTRLJd81gU9zU88QAqPAcH2gKGnS5UF+wLL2VagSQ==}
- '@polkadot-api/metadata-compatibility@0.6.2':
- resolution: {integrity: sha512-ht9rVELif1uwkNi5pVZCwfdc+fKJXfvBVmyBLaiuyoZYEokD7Bxu/DVsa/uTRsYkEhgd/FxBuDG32CM/mcphUw==}
+ '@polkadot-api/metadata-compatibility@0.6.3':
+ resolution: {integrity: sha512-/Y0uF8nDk60ijydp8Bd37YexPFdB8hBXJWwEgOJHsVlhiny8sVKXiMg+UkJ9BiEk2z+yMbZRCKmhNpTpizo7aw==}
'@polkadot-api/observable-client@0.17.3':
resolution: {integrity: sha512-SJhbMKBIzxNgUUy7ZWflYf/TX9soMqiR2WYyggA7U3DLhgdx4wzFjOSbxCk8RuX9Kf/AmJE4dfleu9HBSCZv6g==}
peerDependencies:
rxjs: '>=7.8.0'
- '@polkadot-api/observable-client@0.18.5':
- resolution: {integrity: sha512-MXQzh1pzySQcyj5hwImfxo1fGOKXCFVyAjaG+9KZZVZDyS+V5yoNiYReiXaI68k50GpbvW1b9ZoUiANKwx8PRA==}
+ '@polkadot-api/observable-client@0.18.7':
+ resolution: {integrity: sha512-/eQi3D8jbXLg/L1hZX4eX0/+nO3kTxkOfYeWEtFhtOvFdfqiiy2DdXG3Zg5QzgHmfG+11p4vSlLiPCC2UvS5Qw==}
peerDependencies:
rxjs: '>=7.8.0'
@@ -1441,8 +1428,8 @@ packages:
'@polkadot-api/pjs-signer@0.6.19':
resolution: {integrity: sha512-jTHKoanZg9ewupthOczWNb2pici+GK+TBQmp9MwhwGs/3uMD2144aA8VNNBEi8rMxOBZlvKYfGkgjiTEGbBwuQ==}
- '@polkadot-api/pjs-signer@0.7.2':
- resolution: {integrity: sha512-dCSFnEmLw6Jhi3M4YDMZj7ErVFvnYB7memcZiQlUYyC+a6pcX1blM+3sLK8c40n66wYYcZSrv6fq0Vy8SNDpqA==}
+ '@polkadot-api/pjs-signer@0.7.3':
+ resolution: {integrity: sha512-U7BLFZfnpFMxCh/scJoLXT6oSbfZtZgMTkiu+TbuWQljAb/1ttrQOfshub5VihNyD5rHajp/2Fq0ONZoL5N5PA==}
'@polkadot-api/polkadot-sdk-compat@2.4.1':
resolution: {integrity: sha512-+sET0N3GpnKkLvsazBZEC5vhqAlamlL1KkJK9STB1tRxHSZcY/yBBa1Udn9DXJfX48kE9cnzfYldl9zsjqpARg==}
@@ -1466,30 +1453,30 @@ packages:
'@polkadot-api/signer@0.2.13':
resolution: {integrity: sha512-XBOtjFsRGETVm/aXeZnsvFcJ1qvtZhRtwUMmpCOBt9s8PWfILaQH/ecOegzda3utNIZGmXXaOoJ5w9Hc/6I3ww==}
- '@polkadot-api/signer@0.3.2':
- resolution: {integrity: sha512-E4ciCkeFyV27f4JDFFLKTn7xKn2dVPavfQQ3sqajr6KI0NizDKBo0FP/9leMPLKCfP4ii47z9dKOgbsM/yZa0w==}
+ '@polkadot-api/signer@0.3.3':
+ resolution: {integrity: sha512-bmEV65TwgwbMfiecl7ZQ3k5lfkCOx9FPwPYkVvALcPiqb/d3zYwT9LL/E00hj+EB6IKMlMelEQVuchcW5i/92w==}
'@polkadot-api/signers-common@0.1.20':
resolution: {integrity: sha512-v1mrTdRjQOV17riZ8172OsOQ/RJbv1QsEpjwnvxzvdCnjuNpYwtYHZaE+cSdDBb4n1p73XIBMvB/uAK/QFC2JA==}
- '@polkadot-api/signers-common@0.2.2':
- resolution: {integrity: sha512-zuge7psdtxBYK7qIgCb1mcy7YfjVdagOUhrdXAfUrfQ3aH1/PNCVke20v9rOHnrsAzaxb/+MdTBQGZ6MY7hHUA==}
+ '@polkadot-api/signers-common@0.2.3':
+ resolution: {integrity: sha512-SzGLJMxug31Y1P8+0I809ICpDrayztUXFFh2TV02GuwjEnY6mDGnmX56wowZF5yCn+WteeRdcTJTK7Whk3AGYQ==}
'@polkadot-api/sm-provider@0.1.16':
resolution: {integrity: sha512-3LEDU7nkgtDx1A6ATHLLm3+nFAY6cdkNA9tGltfDzW0efACrhhfDjNqJdI1qLNY0wDyT1aGdoWr5r+4CckRpXA==}
peerDependencies:
'@polkadot-api/smoldot': '>=0.3'
- '@polkadot-api/sm-provider@0.3.4':
- resolution: {integrity: sha512-flE9fJL0ESxlKBHOXgWuHgKQJMP059z0BlZP6PRya5yDpUMC5KrtXbvzdaF+o8rDAMxqL+nDf38+P9h/BrmK7A==}
+ '@polkadot-api/sm-provider@0.3.5':
+ resolution: {integrity: sha512-olmEQ0yqc+JHnDe8MwjvyZs5jPBiKVv9uDaYvsdJMPvOmMv/Adwm8gJKJBo/HXvjvEewXJdAmkC07m+QvtnGIQ==}
peerDependencies:
'@polkadot-api/smoldot': '>=0.3'
'@polkadot-api/smoldot@0.3.15':
resolution: {integrity: sha512-YyV+ytP8FcmKEgLRV7uXepJ5Y6md/7u2F8HKxmkWytmnGXO1z+umg2pHbOxLGifD9V2NhkPY+awpzErtVIzqAA==}
- '@polkadot-api/smoldot@0.4.3':
- resolution: {integrity: sha512-M2LpGG0XOeHDIGre2aUr5W3kCz9MjQ8kGlQa1h7aS2XJwlPrjbJe/MCo12FgZKb1TD/ACpqQi9TgO1B2+8F98w==}
+ '@polkadot-api/smoldot@0.4.4':
+ resolution: {integrity: sha512-oR4ft9gYsejo7pPIeDfOD526kTzhEfCh4yZUMLfIxOauo2dnIbjy+RVdCL2z6Rpb0u7RtmHYh2c0a0qYvNQH8A==}
'@polkadot-api/substrate-bindings@0.12.0':
resolution: {integrity: sha512-cIjDeJRHW6g3z+/55UzpoG4LG1N0HbT4x3NvZsQkYg4eoio9Sw7Pw2aZZX86pWemxc7vQbNw7WSz2Gz+ckdX6Q==}
@@ -1503,9 +1490,6 @@ packages:
'@polkadot-api/substrate-bindings@0.20.1':
resolution: {integrity: sha512-AU7uUqSFt6nH8wrD7DJZkmrFs1QjLeA/Z4Qmf03ExUqsKDQ893pPjbQU2qAaPvWzDmaJotT8B8DENRqEUt8ruw==}
- '@polkadot-api/substrate-bindings@0.20.2':
- resolution: {integrity: sha512-js5UTREoI+FlrPRXMhtKimVWmOqwfNFBnhyshsdloSZHNx/Hulg2RQZNvrVTscyZTf8LyxlGJaH5dsitOUoFKw==}
-
'@polkadot-api/substrate-bindings@0.20.3':
resolution: {integrity: sha512-9iqC71fx1ee9ld1NZV8PFime5vryi0kt1bKCSlvNgO6dqMc06sMZuZ8WPjOzWLCHiKHLuphdMs3rVBBaeCP3yg==}
@@ -1539,8 +1523,8 @@ packages:
'@polkadot-api/wasm-executor@0.2.3':
resolution: {integrity: sha512-B2h1o+Qlo9idpASaHvMSoViB2I5ko5OAfwfhYF8LQDkTADK0B+SeStzNj1Qn+FG34wqTuv7HzBCdjaUgzYINJQ==}
- '@polkadot-api/ws-middleware@0.3.3':
- resolution: {integrity: sha512-MIoV/3jBMk1z5mbf5cSwzRuDis7vhePZHUoJjlqd0zBzUGoABgDALA+gBSHmDU3U08T7o7TbEeJFSBJEh4lp7g==}
+ '@polkadot-api/ws-middleware@0.3.4':
+ resolution: {integrity: sha512-0Op3ifcYV2kp4X4vdHQSXNNTXS9FSyIaM3f7NXBtnA2nnZaRB+5JDU8SI1LRlxeYjnLWlQW3sU61avRt0qgJrA==}
peerDependencies:
rxjs: '>=7.8.0'
@@ -1781,279 +1765,141 @@ packages:
'@types/react':
optional: true
- '@rollup/rollup-android-arm-eabi@4.60.1':
- resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm-eabi@4.60.3':
- resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==}
+ '@rollup/rollup-android-arm-eabi@4.61.0':
+ resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.60.1':
- resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-android-arm64@4.60.3':
- resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==}
+ '@rollup/rollup-android-arm64@4.61.0':
+ resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.60.1':
- resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-arm64@4.60.3':
- resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==}
+ '@rollup/rollup-darwin-arm64@4.61.0':
+ resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.60.1':
- resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==}
+ '@rollup/rollup-darwin-x64@4.61.0':
+ resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.60.3':
- resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.60.1':
- resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-arm64@4.60.3':
- resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==}
+ '@rollup/rollup-freebsd-arm64@4.61.0':
+ resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.60.1':
- resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==}
- cpu: [x64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.60.3':
- resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==}
+ '@rollup/rollup-freebsd-x64@4.61.0':
+ resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.60.1':
- resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
- resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.61.0':
+ resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm-musleabihf@4.60.1':
- resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==}
- cpu: [arm]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-arm-musleabihf@4.60.3':
- resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==}
+ '@rollup/rollup-linux-arm-musleabihf@4.61.0':
+ resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==}
cpu: [arm]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-arm64-gnu@4.60.1':
- resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm64-gnu@4.60.3':
- resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==}
+ '@rollup/rollup-linux-arm64-gnu@4.61.0':
+ resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm64-musl@4.60.1':
- resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-arm64-musl@4.60.3':
- resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==}
+ '@rollup/rollup-linux-arm64-musl@4.61.0':
+ resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-loong64-gnu@4.60.1':
- resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==}
- cpu: [loong64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-loong64-gnu@4.60.3':
- resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==}
+ '@rollup/rollup-linux-loong64-gnu@4.61.0':
+ resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==}
cpu: [loong64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-loong64-musl@4.60.1':
- resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==}
- cpu: [loong64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-loong64-musl@4.60.3':
- resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==}
+ '@rollup/rollup-linux-loong64-musl@4.61.0':
+ resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==}
cpu: [loong64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-ppc64-gnu@4.60.1':
- resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==}
- cpu: [ppc64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-ppc64-gnu@4.60.3':
- resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==}
+ '@rollup/rollup-linux-ppc64-gnu@4.61.0':
+ resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-ppc64-musl@4.60.1':
- resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==}
- cpu: [ppc64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-ppc64-musl@4.60.3':
- resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==}
+ '@rollup/rollup-linux-ppc64-musl@4.61.0':
+ resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==}
cpu: [ppc64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-riscv64-gnu@4.60.1':
- resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-riscv64-gnu@4.60.3':
- resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==}
+ '@rollup/rollup-linux-riscv64-gnu@4.61.0':
+ resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-riscv64-musl@4.60.1':
- resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==}
- cpu: [riscv64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-riscv64-musl@4.60.3':
- resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==}
+ '@rollup/rollup-linux-riscv64-musl@4.61.0':
+ resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==}
cpu: [riscv64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-s390x-gnu@4.60.1':
- resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-s390x-gnu@4.60.3':
- resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==}
+ '@rollup/rollup-linux-s390x-gnu@4.61.0':
+ resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-gnu@4.60.1':
- resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-x64-gnu@4.60.3':
- resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==}
+ '@rollup/rollup-linux-x64-gnu@4.61.0':
+ resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-musl@4.60.1':
- resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-x64-musl@4.60.3':
- resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==}
+ '@rollup/rollup-linux-x64-musl@4.61.0':
+ resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rollup/rollup-openbsd-x64@4.60.1':
- resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==}
- cpu: [x64]
- os: [openbsd]
-
- '@rollup/rollup-openbsd-x64@4.60.3':
- resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==}
+ '@rollup/rollup-openbsd-x64@4.61.0':
+ resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==}
cpu: [x64]
os: [openbsd]
- '@rollup/rollup-openharmony-arm64@4.60.1':
- resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==}
+ '@rollup/rollup-openharmony-arm64@4.61.0':
+ resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==}
cpu: [arm64]
os: [openharmony]
- '@rollup/rollup-openharmony-arm64@4.60.3':
- resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==}
- cpu: [arm64]
- os: [openharmony]
-
- '@rollup/rollup-win32-arm64-msvc@4.60.1':
- resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-arm64-msvc@4.60.3':
- resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==}
+ '@rollup/rollup-win32-arm64-msvc@4.61.0':
+ resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.60.1':
- resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.60.3':
- resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==}
+ '@rollup/rollup-win32-ia32-msvc@4.61.0':
+ resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-gnu@4.60.1':
- resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==}
- cpu: [x64]
- os: [win32]
-
- '@rollup/rollup-win32-x64-gnu@4.60.3':
- resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==}
+ '@rollup/rollup-win32-x64-gnu@4.61.0':
+ resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==}
cpu: [x64]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.60.1':
- resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==}
- cpu: [x64]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.60.3':
- resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==}
+ '@rollup/rollup-win32-x64-msvc@4.61.0':
+ resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==}
cpu: [x64]
os: [win32]
@@ -2162,8 +2008,8 @@ packages:
'@types/dns-packet@5.6.5':
resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==}
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
'@types/istanbul-lib-coverage@2.0.6':
resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
@@ -2183,23 +2029,14 @@ packages:
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
- '@types/node@22.19.17':
- resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==}
-
- '@types/node@22.19.18':
- resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==}
-
'@types/node@22.19.19':
resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==}
'@types/node@24.12.2':
resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==}
- '@types/node@25.6.0':
- resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==}
-
- '@types/node@25.7.0':
- resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==}
+ '@types/node@25.9.1':
+ resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -2433,8 +2270,8 @@ packages:
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
- bulletin-deploy@0.7.29:
- resolution: {integrity: sha512-NQ0idb1xgHIw0qjNJgEL3l3WZmvsdm+3Eydg79HWH3YlfBegGqPl3P63rbHelXJhh8je8k3eCRfL89Ei4vHgyw==}
+ bulletin-deploy@0.8.1:
+ resolution: {integrity: sha512-sINsYTeZ9ZIza5tLWZ10k0hAWnNYMHWbdfQWyKVQoL6K0jLCkEgRWumbX9qr9JdY2L3E3BR59vZunAuPd4y+sA==}
engines: {node: '>=22'}
hasBin: true
@@ -2463,10 +2300,6 @@ packages:
caniuse-lite@1.0.30001793:
resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==}
- cborg@5.1.0:
- resolution: {integrity: sha512-OwailRORD5pIyxaLKKVdGHQ2OXWmYW7YsjDXnl64cIwWdQiyXRffVFsL34JR5c+BEeeSOHADM3cy/QNERH1SUw==}
- hasBin: true
-
cborg@5.1.1:
resolution: {integrity: sha512-BDbSRIp6XrQXkTc7g+DN0RB9RrDPTUfals2ecWUlt3juPLjbAvy/V72mJcXY0Ehu0Dq/3WpNCOCT68HUTbW+lw==}
hasBin: true
@@ -2573,6 +2406,10 @@ packages:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
+ commander@15.0.0:
+ resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==}
+ engines: {node: '>=22.12.0'}
+
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -3273,10 +3110,6 @@ packages:
it-length-prefixed-stream@2.0.6:
resolution: {integrity: sha512-foGRL4Id5Ypuc9RIPEE5aHWZvpKoGpIASoTBeuAZgH/QMGEy+V0vNgK8U4NBPjKwbhyuhW9gYflXXP43W4ZcKw==}
- it-length-prefixed@10.0.1:
- resolution: {integrity: sha512-BhyluvGps26u9a7eQIpOI1YN7mFgi8lFwmiPi07whewbBARKAG9LE09Odc8s1Wtbt2MB6rNUrl7j9vvfXTJwdQ==}
- engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-
it-length-prefixed@10.0.2:
resolution: {integrity: sha512-RrNBs4d7baK8AKGHleC55l/JtvzxDw6DPXs3CvFgQwdwFzLBFDvlpKgDDNDFwXJjPSy1nEX1A44nL110+EKc3g==}
@@ -3308,9 +3141,6 @@ packages:
it-protobuf-stream@2.0.6:
resolution: {integrity: sha512-yr1ll0PN4DFrI4gyEMXy4OgcO3Glb7U0J+Scpx1lxOVnuszpcSc0idhxXHMZcDqAIUJgo8JmNHT9Ry6m6vVeJw==}
- it-pushable@3.2.3:
- resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==}
-
it-pushable@3.2.4:
resolution: {integrity: sha512-WSD7Ss4oCRfDZJT4ldLWr0Bom/muY90xxoJ5PQnU3uSKf0kxCOeehqZtiJX1ARqn+ymXGh1bxpDW9bDNHp2ivQ==}
@@ -3320,10 +3150,6 @@ packages:
it-queueless-pushable@2.0.5:
resolution: {integrity: sha512-BaKqGLL1AQMR1AEaxiM09vzJQVXHHhfhh9UV0qPqORw/8Rm8igDQqT1qHregfHIb1NIW9jxQ/aXBibHJyuivuQ==}
- it-reader@6.0.4:
- resolution: {integrity: sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==}
- engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-
it-reader@6.0.5:
resolution: {integrity: sha512-xdSVkCsVyWmKaE7ZIlqb1QbzitY7Zty7//F2YeZ/9Py5i3RzQHVoPqlHELH+1EouumUdPyfuKoANJ7Q5w4IEBg==}
engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -3666,6 +3492,11 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanoid@5.1.11:
+ resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+
nanoid@5.1.9:
resolution: {integrity: sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==}
engines: {node: ^18 || >=20}
@@ -3780,16 +3611,8 @@ packages:
outdent@0.5.0:
resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
- ox@0.14.17:
- resolution: {integrity: sha512-jOzNb2Wlfzsr8z/GoCtd1bf6OSRuWuysvbhnHGD+7fV1WRbcBR6B0RYoe3xWnUedF7zp4l5APmS7CzAhUok/lA==}
- peerDependencies:
- typescript: '>=5.4.0'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- ox@0.14.25:
- resolution: {integrity: sha512-8DoibKtxE8yw63Y2jjMhlbjaURev6WCx4QR4MWLusl2/qIaeTzMJMBIYIDl1KOF45+8H1Ur6eLTdPlUoO8PlRw==}
+ ox@0.14.27:
+ resolution: {integrity: sha512-+xhLHo/f+f4BH121/1Pomm/1vgBBda1wYiFpTvjSo8o5OcEj76Pf1hGPJiepoYMTQoTm2SKdSBvWkFWk5l07PA==}
peerDependencies:
typescript: '>=5.4.0'
peerDependenciesMeta:
@@ -3928,8 +3751,8 @@ packages:
peerDependencies:
rxjs: '>=7.8.0'
- polkadot-api@2.1.3:
- resolution: {integrity: sha512-lbTcLH+oo0f/3+g4hhp7v6WwQKvvzi4v4ClAWispSalLyJV/yRqIbu0ywugpbISXzOL0CWUvYTb8v6CwSSkv3w==}
+ polkadot-api@2.1.5:
+ resolution: {integrity: sha512-Y0NbWJkq7kIU2UowzyY+SRpa6wbtHx1sPhq5AgebeSed/w1mNmkpa2t1nhnz4Tb7YMtd57t9w/7aRKH2yOMLAQ==}
hasBin: true
peerDependencies:
rxjs: '>=7.8.0'
@@ -4182,13 +4005,8 @@ packages:
esbuild: '>=0.18.0'
rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0
- rollup@4.60.1:
- resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
- rollup@4.60.3:
- resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==}
+ rollup@4.61.0:
+ resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -4224,16 +4042,6 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- semver@7.7.4:
- resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
- engines: {node: '>=10'}
- hasBin: true
-
- semver@7.8.0:
- resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==}
- engines: {node: '>=10'}
- hasBin: true
-
semver@7.8.1:
resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==}
engines: {node: '>=10'}
@@ -4306,8 +4114,8 @@ packages:
smoldot@2.0.40:
resolution: {integrity: sha512-h6XC/kKDLdZBBTI0X8y4ZxmaZ2KYVVB0+5isCQm6j26ljeNjHZUDOV+hf8VyoE23+jg00wrxNJ2IVcIAURxwtg==}
- smoldot@3.1.2:
- resolution: {integrity: sha512-e9IRz8vsdjfkgFsJJx+MMuc/0vP02KjCUHZ62cc3fozwMziYQ6ghlqXpWozsywo/jsN46ZgqkwkRso6Nx+K6pA==}
+ smoldot@3.1.4:
+ resolution: {integrity: sha512-RmqzA09GuluKwa5spSbAQ0t+ph2hY0BViKt/VBHBmLO/kbLk8fsQ+5NqQnxzpxJKYoYsROBscsumOxYUxW4hmQ==}
sort-keys@5.1.0:
resolution: {integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==}
@@ -4621,11 +4429,8 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
- undici-types@7.19.2:
- resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==}
-
- undici-types@7.21.0:
- resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==}
+ undici-types@7.24.6:
+ resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
undici@8.1.0:
resolution: {integrity: sha512-E9MkTS4xXLnRPYqxH2e6Hr2/49e7WFDKczKcCaFH4VaZs2iNvHMqeIkyUAD9vM8kujy9TjVrRlQ5KkdEJxB2pw==}
@@ -4684,19 +4489,11 @@ packages:
varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
- verifiablejs@1.2.0:
- resolution: {integrity: sha512-+VVQo9yZko+w3THKaYvLbjXdfaiw1WJnX12wJEU5jHsHrMkjDrAMWoKYcBvtlHXufJirr8FlT6v2i/0yA3/ivQ==}
-
- viem@2.48.0:
- resolution: {integrity: sha512-0uLzTAUNKPpY9Cf3OBCPdwClXx9CEHAkoVYnxMPdHt7cRI1DobMso+pHZvU7itD+hFwE4htmp9QfP+5lb+kn0g==}
- peerDependencies:
- typescript: '>=5.0.4'
- peerDependenciesMeta:
- typescript:
- optional: true
+ verifiablejs@1.3.0-beta.4:
+ resolution: {integrity: sha512-t+YPlwEdSdKECvkVbk+6DDDdUvhtYc2Jv99TijZ/CxO/PAng9MT+8PAJLYFNg2mE/7e4bc4G6vphUKorma52bA==}
- viem@2.51.3:
- resolution: {integrity: sha512-DA4EbrsvatzzLo6MwcWWiv6kI6dIr3I9HH9B6qsJaClN/s0AjIDUz5RIxl+VmGrovIUCcIvG8744yuGH7d37zw==}
+ viem@2.52.0:
+ resolution: {integrity: sha512-py2QPYe9e1f4DmPJCsXF7zHmyZ0PkJrBxdQZ5dvNXvzy3UzWkUn7dNfC0TMeNm6Qv1tKw3b6qXXExpx6L0oMbw==}
peerDependencies:
typescript: '>=5.0.4'
peerDependenciesMeta:
@@ -4867,18 +4664,6 @@ packages:
utf-8-validate:
optional: true
- ws@8.18.3:
- resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
-
ws@8.20.1:
resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==}
engines: {node: '>=10.0.0'}
@@ -4955,7 +4740,7 @@ snapshots:
dependencies:
'@achingbrain/ssdp': 4.2.4
'@chainsafe/is-ip': 2.1.0
- '@libp2p/logger': 6.2.6
+ '@libp2p/logger': 6.2.7
abort-error: 1.0.2
err-code: 3.0.1
netmask: 2.1.1
@@ -4979,12 +4764,6 @@ snapshots:
'@assemblyscript/loader@0.9.4': {}
- '@babel/code-frame@7.29.0':
- dependencies:
- '@babel/helper-validator-identifier': 7.28.5
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
'@babel/code-frame@7.29.7':
dependencies:
'@babel/helper-validator-identifier': 7.29.7
@@ -5049,8 +4828,6 @@ snapshots:
'@babel/helper-string-parser@7.29.7': {}
- '@babel/helper-validator-identifier@7.28.5': {}
-
'@babel/helper-validator-identifier@7.29.7': {}
'@babel/helper-validator-option@7.29.7': {}
@@ -5064,8 +4841,6 @@ snapshots:
dependencies:
'@babel/types': 7.29.7
- '@babel/runtime@7.29.2': {}
-
'@babel/runtime@7.29.7': {}
'@babel/template@7.29.7':
@@ -5136,10 +4911,10 @@ snapshots:
dependencies:
'@chainsafe/as-chacha20poly1305': 0.1.0
'@chainsafe/as-sha256': 1.2.4
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
+ '@libp2p/peer-id': 6.0.9
+ '@libp2p/utils': 7.2.1
'@noble/ciphers': 2.2.0
'@noble/curves': 2.2.0
'@noble/hashes': 2.2.0
@@ -5151,7 +4926,7 @@ snapshots:
'@chainsafe/libp2p-yamux@8.0.1':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
race-signal: 2.0.0
uint8arraylist: 2.4.9
@@ -5173,7 +4948,7 @@ snapshots:
outdent: 0.5.0
prettier: 2.8.8
resolve-from: 5.0.0
- semver: 7.7.4
+ semver: 7.8.1
'@changesets/assemble-release-plan@6.0.9':
dependencies:
@@ -5182,13 +4957,13 @@ snapshots:
'@changesets/should-skip-package': 0.1.2
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
- semver: 7.7.4
+ semver: 7.8.1
'@changesets/changelog-git@0.2.1':
dependencies:
'@changesets/types': 6.1.0
- '@changesets/cli@2.30.0(@types/node@22.19.17)':
+ '@changesets/cli@2.30.0(@types/node@22.19.19)':
dependencies:
'@changesets/apply-release-plan': 7.1.0
'@changesets/assemble-release-plan': 6.0.9
@@ -5204,7 +4979,7 @@ snapshots:
'@changesets/should-skip-package': 0.1.2
'@changesets/types': 6.1.0
'@changesets/write': 0.4.0
- '@inquirer/external-editor': 1.0.3(@types/node@22.19.17)
+ '@inquirer/external-editor': 1.0.3(@types/node@22.19.19)
'@manypkg/get-packages': 1.1.3
ansi-colors: 4.1.3
enquirer: 2.4.1
@@ -5213,7 +4988,7 @@ snapshots:
package-manager-detector: 0.2.11
picocolors: 1.1.1
resolve-from: 5.0.0
- semver: 7.7.4
+ semver: 7.8.1
spawndamnit: 3.0.1
term-size: 2.2.1
transitivePeerDependencies:
@@ -5239,7 +5014,7 @@ snapshots:
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
picocolors: 1.1.1
- semver: 7.7.4
+ semver: 7.8.1
'@changesets/get-release-plan@4.0.15':
dependencies:
@@ -5306,18 +5081,22 @@ snapshots:
dependencies:
commander: 14.0.3
+ '@commander-js/extra-typings@15.0.0(commander@15.0.0)':
+ dependencies:
+ commander: 15.0.0
+
'@dnsquery/dns-packet@6.1.1':
dependencies:
'@leichtgewicht/ip-codec': 2.0.5
utf8-codec: 1.0.0
- '@dotdm/cdm@0.6.15(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot-api/ink-contracts@0.6.2)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
+ '@dotdm/cdm@0.6.15(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot-api/ink-contracts@0.6.3)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
dependencies:
- '@dotdm/contracts': 3.1.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
- '@dotdm/env': 2.0.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@dotdm/contracts': 3.1.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
+ '@dotdm/env': 2.0.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@dotdm/utils': 0.4.0
- '@polkadot-api/sdk-ink': 0.7.0(@polkadot-api/ink-contracts@0.6.2)(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)(typescript@5.9.3)
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ '@polkadot-api/sdk-ink': 0.7.0(@polkadot-api/ink-contracts@0.6.3)(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)(typescript@5.9.3)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/host-api-wrapper'
@@ -5333,17 +5112,17 @@ snapshots:
- utf-8-validate
- zod
- '@dotdm/contracts@3.1.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
+ '@dotdm/contracts@3.1.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
dependencies:
- '@dotdm/env': 2.0.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@dotdm/env': 2.0.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@dotdm/utils': 0.4.0
'@noble/hashes': 2.2.0
- '@parity/product-sdk-bulletin': 0.4.2(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-contracts': 0.6.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
- '@parity/product-sdk-descriptors': 0.5.0(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-tx': 0.2.5(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-bulletin': 0.4.2(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-contracts': 0.6.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)
+ '@parity/product-sdk-descriptors': 0.5.2(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-tx': 0.2.7(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
multiformats: 13.4.2
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/host-api-wrapper'
@@ -5358,14 +5137,14 @@ snapshots:
- utf-8-validate
- zod
- '@dotdm/env@2.0.2(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@dotdm/env@2.0.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@dotdm/utils': 0.4.0
- '@parity/product-sdk-descriptors': 0.5.0(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-descriptors': 0.5.2(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@polkadot-labs/hdkd': 0.0.26
'@polkadot-labs/hdkd-helpers': 0.0.27
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
smoldot: 2.0.40
transitivePeerDependencies:
- '@novasamatech/host-api'
@@ -5549,16 +5328,16 @@ snapshots:
'@helia/interface': 6.2.1
'@helia/utils': 2.5.2
'@libp2p/interface': 3.2.2
- '@libp2p/logger': 6.2.6
+ '@libp2p/logger': 6.2.7
'@libp2p/peer-collections': 7.0.20
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
any-signal: 4.2.0
interface-blockstore: 6.0.2
it-drain: 3.0.12
- it-length-prefixed: 10.0.1
+ it-length-prefixed: 10.0.2
it-map: 3.1.6
- it-pushable: 3.2.3
+ it-pushable: 3.2.4
it-take: 3.0.11
it-to-buffer: 4.0.12
multiformats: 13.4.2
@@ -5576,8 +5355,8 @@ snapshots:
'@helia/interface': 6.2.1
'@helia/utils': 2.5.2
'@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
+ '@libp2p/peer-id': 6.0.9
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
'@multiformats/multiaddr-to-uri': 12.0.0
@@ -5591,7 +5370,7 @@ snapshots:
'@helia/delegated-routing-v1-http-api-client@6.0.1':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/peer-id': 6.0.9
'@multiformats/multiaddr': 13.0.1
any-signal: 4.2.0
browser-readablestream-to-it: 2.0.12
@@ -5620,7 +5399,7 @@ snapshots:
'@helia/delegated-routing-v1-http-api-client': 6.0.1
'@helia/interface': 6.2.1
'@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/peer-id': 6.0.9
'@multiformats/uri-to-multiaddr': 10.0.0
ipns: 10.1.6
it-first: 3.0.11
@@ -5633,8 +5412,8 @@ snapshots:
'@helia/interface': 6.2.1
'@ipld/dag-pb': 4.1.5
'@libp2p/interface': 3.2.2
- '@libp2p/logger': 6.2.6
- '@libp2p/utils': 7.1.0
+ '@libp2p/logger': 6.2.7
+ '@libp2p/utils': 7.2.1
'@multiformats/murmur3': 2.2.2
interface-blockstore: 6.0.2
ipfs-unixfs: 12.0.2
@@ -5662,12 +5441,12 @@ snapshots:
'@ipld/dag-pb': 4.1.5
'@libp2p/interface': 3.2.2
'@libp2p/keychain': 6.1.0
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/dns': 1.0.13
'@multiformats/multiaddr': 13.0.1
any-signal: 4.2.0
blockstore-core: 6.1.3
- cborg: 5.1.0
+ cborg: 5.1.1
interface-blockstore: 6.0.2
interface-datastore: 9.0.3
interface-store: 7.0.2
@@ -5684,12 +5463,12 @@ snapshots:
race-signal: 2.0.0
uint8arrays: 5.1.1
- '@inquirer/external-editor@1.0.3(@types/node@22.19.17)':
+ '@inquirer/external-editor@1.0.3(@types/node@22.19.19)':
dependencies:
chardet: 2.1.1
iconv-lite: 0.7.2
optionalDependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
'@ipld/car@5.4.3':
dependencies:
@@ -5700,12 +5479,12 @@ snapshots:
'@ipld/dag-cbor@9.2.6':
dependencies:
- cborg: 5.1.0
+ cborg: 5.1.1
multiformats: 13.4.2
'@ipld/dag-json@10.2.7':
dependencies:
- cborg: 5.1.0
+ cborg: 5.1.1
multiformats: 13.4.2
'@ipld/dag-pb@4.1.5':
@@ -5715,12 +5494,12 @@ snapshots:
'@ipshipyard/libp2p-auto-tls@2.0.1':
dependencies:
'@chainsafe/is-ip': 2.1.0
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/http': 2.0.2
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
+ '@libp2p/interface-internal': 3.1.5
'@libp2p/keychain': 6.1.0
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
'@peculiar/x509': 1.14.3
@@ -5781,10 +5560,10 @@ snapshots:
'@libp2p/autonat@3.0.18':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/peer-collections': 7.0.18
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/peer-collections': 7.0.20
+ '@libp2p/peer-id': 6.0.9
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
any-signal: 4.2.0
main-event: 1.0.4
@@ -5795,27 +5574,27 @@ snapshots:
'@libp2p/bootstrap@12.0.19':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/peer-id': 6.0.9
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
main-event: 1.0.4
'@libp2p/circuit-relay-v2@4.2.3':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/peer-collections': 7.0.18
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/peer-collections': 7.0.20
+ '@libp2p/peer-id': 6.0.9
'@libp2p/peer-record': 9.0.9
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
any-signal: 4.2.0
main-event: 1.0.4
multiformats: 13.4.2
- nanoid: 5.1.9
+ nanoid: 5.1.11
progress-events: 1.1.0
protons-runtime: 6.0.1
retimeable-signal: 1.0.1
@@ -5824,22 +5603,12 @@ snapshots:
'@libp2p/config@1.1.30':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
'@libp2p/keychain': 6.1.0
- '@libp2p/logger': 6.2.6
+ '@libp2p/logger': 6.2.7
interface-datastore: 9.0.3
- '@libp2p/crypto@5.1.17':
- dependencies:
- '@libp2p/interface': 3.2.2
- '@noble/curves': 2.2.0
- '@noble/hashes': 2.2.0
- multiformats: 13.4.2
- protons-runtime: 6.0.1
- uint8arraylist: 2.4.9
- uint8arrays: 5.1.1
-
'@libp2p/crypto@5.1.18':
dependencies:
'@libp2p/interface': 3.2.2
@@ -5853,8 +5622,8 @@ snapshots:
'@libp2p/dcutr@3.0.18':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/utils': 7.1.0
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
delay: 7.0.0
@@ -5897,7 +5666,7 @@ snapshots:
'@achingbrain/http-parser-js': 0.5.9
'@libp2p/http-utils': 2.0.2
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
+ '@libp2p/interface-internal': 3.1.5
'@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
multiformats: 13.4.2
@@ -5912,19 +5681,19 @@ snapshots:
'@libp2p/http-utils': 2.0.2
'@libp2p/http-websocket': 2.0.2
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
+ '@libp2p/interface-internal': 3.1.5
'@multiformats/multiaddr': 13.0.1
cookie: 1.1.1
undici: 8.1.0
'@libp2p/identify@4.1.3':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/peer-id': 6.0.9
'@libp2p/peer-record': 9.0.9
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
it-drain: 3.0.12
@@ -5934,13 +5703,6 @@ snapshots:
uint8arraylist: 2.4.9
uint8arrays: 5.1.1
- '@libp2p/interface-internal@3.1.3':
- dependencies:
- '@libp2p/interface': 3.2.2
- '@libp2p/peer-collections': 7.0.20
- '@multiformats/multiaddr': 13.0.1
- progress-events: 1.1.0
-
'@libp2p/interface-internal@3.1.5':
dependencies:
'@libp2p/interface': 3.2.2
@@ -5948,15 +5710,6 @@ snapshots:
'@multiformats/multiaddr': 13.0.1
progress-events: 1.1.0
- '@libp2p/interface@3.2.0':
- dependencies:
- '@multiformats/dns': 1.0.13
- '@multiformats/multiaddr': 13.0.1
- main-event: 1.0.4
- multiformats: 13.4.2
- progress-events: 1.1.0
- uint8arraylist: 2.4.9
-
'@libp2p/interface@3.2.2':
dependencies:
'@multiformats/dns': 1.0.13
@@ -5987,7 +5740,7 @@ snapshots:
it-merge: 3.0.14
it-parallel: 3.0.15
it-pipe: 3.0.1
- it-pushable: 3.2.3
+ it-pushable: 3.2.4
it-take: 3.0.11
main-event: 1.0.4
multiformats: 13.4.2
@@ -6002,7 +5755,7 @@ snapshots:
'@libp2p/keychain@6.1.0':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
'@noble/hashes': 2.2.0
asn1js: 3.0.10
@@ -6011,36 +5764,20 @@ snapshots:
sanitize-filename: 1.6.4
uint8arrays: 5.1.1
- '@libp2p/logger@6.2.4':
+ '@libp2p/logger@6.2.7':
dependencies:
- '@libp2p/interface': 3.2.0
+ '@libp2p/interface': 3.2.2
'@multiformats/multiaddr': 13.0.1
interface-datastore: 9.0.3
multiformats: 13.4.2
weald: 1.1.1
- '@libp2p/logger@6.2.6':
+ '@libp2p/mdns@12.0.19':
dependencies:
'@libp2p/interface': 3.2.2
- '@multiformats/multiaddr': 13.0.1
- interface-datastore: 9.0.3
- multiformats: 13.4.2
- weald: 1.1.1
-
- '@libp2p/logger@6.2.7':
- dependencies:
- '@libp2p/interface': 3.2.2
- '@multiformats/multiaddr': 13.0.1
- interface-datastore: 9.0.3
- multiformats: 13.4.2
- weald: 1.1.1
-
- '@libp2p/mdns@12.0.19':
- dependencies:
- '@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/peer-id': 6.0.9
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@types/multicast-dns': 7.2.4
dns-packet: 5.6.1
@@ -6050,8 +5787,8 @@ snapshots:
'@libp2p/mplex@12.0.19':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/utils': 7.1.0
- it-pushable: 3.2.3
+ '@libp2p/utils': 7.2.1
+ it-pushable: 3.2.4
uint8-varint: 2.0.4
uint8arraylist: 2.4.9
uint8arrays: 5.1.1
@@ -6059,18 +5796,11 @@ snapshots:
'@libp2p/multistream-select@7.0.18':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/utils': 7.1.0
- it-length-prefixed: 10.0.1
+ '@libp2p/utils': 7.2.1
+ it-length-prefixed: 10.0.2
uint8arraylist: 2.4.9
uint8arrays: 5.1.1
- '@libp2p/peer-collections@7.0.18':
- dependencies:
- '@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
- multiformats: 13.4.2
-
'@libp2p/peer-collections@7.0.20':
dependencies:
'@libp2p/interface': 3.2.2
@@ -6078,13 +5808,6 @@ snapshots:
'@libp2p/utils': 7.2.1
multiformats: 13.4.2
- '@libp2p/peer-id@6.0.8':
- dependencies:
- '@libp2p/crypto': 5.1.17
- '@libp2p/interface': 3.2.2
- multiformats: 13.4.2
- uint8arrays: 5.1.1
-
'@libp2p/peer-id@6.0.9':
dependencies:
'@libp2p/crypto': 5.1.18
@@ -6094,9 +5817,9 @@ snapshots:
'@libp2p/peer-record@9.0.9':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/peer-id': 6.0.9
'@multiformats/multiaddr': 13.0.1
multiformats: 13.4.2
protons-runtime: 6.0.1
@@ -6106,10 +5829,10 @@ snapshots:
'@libp2p/peer-store@12.0.18':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/peer-collections': 7.0.18
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/peer-collections': 7.0.20
+ '@libp2p/peer-id': 6.0.9
'@libp2p/peer-record': 9.0.9
'@multiformats/multiaddr': 13.0.1
interface-datastore: 9.0.3
@@ -6121,16 +5844,6 @@ snapshots:
uint8arraylist: 2.4.9
uint8arrays: 5.1.1
- '@libp2p/ping@3.1.3':
- dependencies:
- '@libp2p/crypto': 5.1.17
- '@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- p-event: 7.1.0
- race-signal: 2.0.0
- uint8arraylist: 2.4.9
- uint8arrays: 5.1.1
-
'@libp2p/ping@3.1.5':
dependencies:
'@libp2p/crypto': 5.1.18
@@ -6150,7 +5863,7 @@ snapshots:
'@libp2p/tcp@11.0.18':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
main-event: 1.0.4
@@ -6160,10 +5873,10 @@ snapshots:
'@libp2p/tls@3.1.0':
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
+ '@libp2p/peer-id': 6.0.9
+ '@libp2p/utils': 7.2.1
'@peculiar/asn1-schema': 2.6.0
'@peculiar/asn1-x509': 2.6.1
'@peculiar/webcrypto': 1.5.0
@@ -6180,41 +5893,14 @@ snapshots:
'@achingbrain/nat-port-mapper': 4.0.5
'@chainsafe/is-ip': 2.1.0
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/utils': 7.1.0
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
main-event: 1.0.4
p-defer: 4.0.1
race-signal: 2.0.0
- '@libp2p/utils@7.1.0':
- dependencies:
- '@chainsafe/is-ip': 2.1.0
- '@chainsafe/netmask': 2.0.0
- '@libp2p/crypto': 5.1.17
- '@libp2p/interface': 3.2.2
- '@libp2p/logger': 6.2.6
- '@multiformats/multiaddr': 13.0.1
- '@sindresorhus/fnv1a': 3.1.0
- any-signal: 4.2.0
- cborg: 5.1.0
- delay: 7.0.0
- is-loopback-addr: 2.0.2
- it-length-prefixed: 10.0.1
- it-pipe: 3.0.1
- it-pushable: 3.2.3
- it-stream-types: 2.0.4
- main-event: 1.0.4
- netmask: 2.1.1
- p-defer: 4.0.1
- p-event: 7.1.0
- progress-events: 1.1.0
- race-signal: 2.0.0
- uint8-varint: 2.0.4
- uint8arraylist: 2.4.9
- uint8arrays: 5.1.1
-
'@libp2p/utils@7.2.1':
dependencies:
'@chainsafe/is-ip': 2.1.0
@@ -6231,7 +5917,7 @@ snapshots:
is-loopback-addr: 2.0.2
it-length-prefixed: 10.0.2
it-pipe: 3.0.1
- it-pushable: 3.2.3
+ it-pushable: 3.2.4
it-stream-types: 2.0.4
main-event: 1.0.4
netmask: 2.1.1
@@ -6247,21 +5933,21 @@ snapshots:
dependencies:
'@chainsafe/is-ip': 2.1.0
'@chainsafe/libp2p-noise': 17.0.0
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
+ '@libp2p/interface-internal': 3.1.5
'@libp2p/keychain': 6.1.0
- '@libp2p/peer-id': 6.0.8
- '@libp2p/utils': 7.1.0
+ '@libp2p/peer-id': 6.0.9
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
'@peculiar/webcrypto': 1.5.0
'@peculiar/x509': 2.0.0
get-port: 7.2.0
interface-datastore: 9.0.3
- it-length-prefixed: 10.0.1
+ it-length-prefixed: 10.0.2
it-protobuf-stream: 2.0.6
- it-pushable: 3.2.3
+ it-pushable: 3.2.4
it-stream-types: 2.0.4
main-event: 1.0.4
multiformats: 13.4.2
@@ -6285,7 +5971,7 @@ snapshots:
'@libp2p/websockets@10.1.11':
dependencies:
'@libp2p/interface': 3.2.2
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
'@multiformats/multiaddr-to-uri': 12.0.0
@@ -6301,14 +5987,14 @@ snapshots:
'@manypkg/find-root@1.1.0':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@types/node': 12.20.55
find-up: 4.1.0
fs-extra: 8.1.0
'@manypkg/get-packages@1.1.3':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@changesets/types': 4.1.0
'@manypkg/find-root': 1.1.0
fs-extra: 8.1.0
@@ -6404,12 +6090,30 @@ snapshots:
'@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- '@novasamatech/host-api': 0.7.9-4
+ '@novasamatech/host-api': 0.7.9
+ '@polkadot-api/json-rpc-provider-proxy': 0.4.0
+ '@polkadot-api/substrate-bindings': 0.20.3
+ '@polkadot/extension-inject': 0.63.1(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)
+ neverthrow: 8.2.0
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ transitivePeerDependencies:
+ - '@polkadot/api'
+ - '@polkadot/util'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+ optional: true
+
+ '@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@novasamatech/host-api': 0.7.9
'@polkadot-api/json-rpc-provider-proxy': 0.4.0
'@polkadot-api/substrate-bindings': 0.20.3
'@polkadot/extension-inject': 0.63.1(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)
neverthrow: 8.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@polkadot/api'
- '@polkadot/util'
@@ -6420,28 +6124,28 @@ snapshots:
- utf-8-validate
optional: true
- '@novasamatech/host-api@0.7.9-4':
+ '@novasamatech/host-api@0.7.9':
dependencies:
- '@novasamatech/scale': 0.7.9-4
+ '@novasamatech/scale': 0.7.9
nanoevents: 9.1.0
nanoid: 5.1.9
neverthrow: 8.2.0
scale-ts: 1.6.1
- '@novasamatech/host-papp@0.7.9-4(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@novasamatech/host-papp@0.7.9(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@noble/ciphers': 2.2.0
'@noble/curves': 2.2.0
'@noble/hashes': 2.2.0
- '@novasamatech/host-api': 0.7.9-4
- '@novasamatech/scale': 0.7.9-4
- '@novasamatech/statement-store': 0.7.9-4(esbuild@0.27.7)(rxjs@7.8.2)
- '@novasamatech/storage-adapter': 0.7.9-4
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/scale': 0.7.9
+ '@novasamatech/statement-store': 0.7.9(esbuild@0.27.7)(rxjs@7.8.2)
+ '@novasamatech/storage-adapter': 0.7.9
'@polkadot-labs/hdkd-helpers': 0.0.30
nanoevents: 9.1.0
nanoid: 5.1.9
neverthrow: 8.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
scale-ts: 1.6.1
transitivePeerDependencies:
- bufferutil
@@ -6450,25 +6154,7 @@ snapshots:
- supports-color
- utf-8-validate
- '@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
- dependencies:
- '@novasamatech/host-api': 0.7.9-4
- '@polkadot-api/json-rpc-provider-proxy': 0.4.0
- '@polkadot-api/substrate-bindings': 0.20.2
- '@polkadot/extension-inject': 0.63.1(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)
- neverthrow: 8.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
- transitivePeerDependencies:
- - '@polkadot/api'
- - '@polkadot/util'
- - bufferutil
- - esbuild
- - rxjs
- - supports-color
- - utf-8-validate
- optional: true
-
- '@novasamatech/scale@0.7.9-4':
+ '@novasamatech/scale@0.7.9':
dependencies:
'@polkadot-api/utils': 0.4.0
scale-ts: 1.6.1
@@ -6477,7 +6163,7 @@ snapshots:
dependencies:
'@polkadot-api/substrate-bindings': 0.20.1
'@polkadot-api/utils': 0.4.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- bufferutil
- esbuild
@@ -6485,19 +6171,19 @@ snapshots:
- supports-color
- utf-8-validate
- '@novasamatech/statement-store@0.7.9-4(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@novasamatech/statement-store@0.7.9(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@noble/ciphers': 2.2.0
'@noble/hashes': 2.2.0
- '@novasamatech/scale': 0.7.9-4
+ '@novasamatech/scale': 0.7.9
'@novasamatech/sdk-statement': 0.6.0(esbuild@0.27.7)(rxjs@7.8.2)
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/substrate-client': 0.7.0
'@polkadot-labs/hdkd-helpers': 0.0.30
'@scure/sr25519': 2.2.0
nanoid: 5.1.9
neverthrow: 8.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
scale-ts: 1.6.1
transitivePeerDependencies:
- bufferutil
@@ -6506,7 +6192,7 @@ snapshots:
- supports-color
- utf-8-validate
- '@novasamatech/storage-adapter@0.7.9-4':
+ '@novasamatech/storage-adapter@0.7.9':
dependencies:
nanoevents: 9.1.0
neverthrow: 8.2.0
@@ -6599,7 +6285,7 @@ snapshots:
'@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.28.0
forwarded-parse: 2.1.2
- semver: 7.7.4
+ semver: 7.8.1
transitivePeerDependencies:
- supports-color
@@ -6724,7 +6410,7 @@ snapshots:
'@types/shimmer': 1.2.0
import-in-the-middle: 1.15.0
require-in-the-middle: 7.5.2
- semver: 7.7.4
+ semver: 7.8.1
shimmer: 1.2.1
transitivePeerDependencies:
- supports-color
@@ -6753,14 +6439,14 @@ snapshots:
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.1)
- '@parity/bulletin-sdk@0.3.0(multiformats@13.4.2)(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))':
+ '@parity/bulletin-sdk@0.3.0(multiformats@13.4.2)(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))':
dependencies:
'@ipld/dag-pb': 4.1.5
'@noble/hashes': 2.2.0
'@polkadot-labs/hdkd-helpers': 0.0.29
ipfs-unixfs: 12.0.2
multiformats: 13.4.2
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/dotns-cli@0.6.1(@polkadot/util@14.0.3)(jiti@2.7.0)(postcss@8.5.10)(react-native@0.85.2(@babel/core@7.29.7)(@types/react@18.3.28)(react@18.3.1))(rxjs@7.8.2)(typescript@5.9.3)(yaml@2.9.0)':
dependencies:
@@ -6786,7 +6472,7 @@ snapshots:
multiformats: 13.4.2
ora: 9.4.0
polkadot-api: 1.23.3(jiti@2.7.0)(postcss@8.5.10)(rxjs@7.8.2)(yaml@2.9.0)
- viem: 2.48.0(typescript@5.9.3)
+ viem: 2.52.0(typescript@5.9.3)
transitivePeerDependencies:
- '@microsoft/api-extractor'
- '@polkadot/util'
@@ -6809,16 +6495,16 @@ snapshots:
'@noble/hashes': 1.8.0
'@polkadot-api/substrate-bindings': 0.12.0
- '@parity/product-sdk-bulletin@0.4.2(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-bulletin@0.4.2(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- '@parity/bulletin-sdk': 0.3.0(multiformats@13.4.2)(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))
- '@parity/product-sdk-chain-client': 0.4.2(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/bulletin-sdk': 0.3.0(multiformats@13.4.2)(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))
+ '@parity/product-sdk-chain-client': 0.4.2(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-descriptors': 0.4.1(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
- '@parity/product-sdk-tx': 0.2.4(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-tx': 0.2.4(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
multiformats: 13.4.2
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/product-sdk'
@@ -6828,12 +6514,12 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-chain-client@0.4.2(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-chain-client@0.4.2(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-descriptors': 0.4.1(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/product-sdk'
@@ -6843,19 +6529,53 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-contracts@0.5.1(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
+ '@parity/product-sdk-chain-client@0.5.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-descriptors': 0.5.2(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.6.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-logger': 0.1.1
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-cloud-storage@0.5.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/bulletin-sdk': 0.3.0(multiformats@13.4.2)(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))
+ '@parity/product-sdk-chain-client': 0.5.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-descriptors': 0.5.2(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.6.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-logger': 0.1.1
+ '@parity/product-sdk-tx': 0.2.7(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ multiformats: 13.4.2
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-contracts@0.6.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
dependencies:
'@parity/product-sdk-address': 0.1.1
- '@parity/product-sdk-keys': 0.3.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-keys': 0.3.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
- '@parity/product-sdk-signer': 0.3.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-tx': 0.2.4(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-signer': 0.4.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-tx': 0.2.5(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@polkadot-labs/hdkd-helpers': 0.0.27
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
- viem: 2.48.0(typescript@5.9.3)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ viem: 2.52.0(typescript@5.9.3)
transitivePeerDependencies:
- '@novasamatech/host-api'
- - '@novasamatech/product-sdk'
+ - '@novasamatech/host-api-wrapper'
- '@polkadot/api'
- '@polkadot/util'
- bufferutil
@@ -6866,16 +6586,16 @@ snapshots:
- utf-8-validate
- zod
- '@parity/product-sdk-contracts@0.6.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
+ '@parity/product-sdk-contracts@0.7.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3)':
dependencies:
'@parity/product-sdk-address': 0.1.1
- '@parity/product-sdk-keys': 0.3.1(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-keys': 0.3.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
- '@parity/product-sdk-signer': 0.4.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-tx': 0.2.5(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
- '@polkadot-labs/hdkd-helpers': 0.0.27
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
- viem: 2.51.3(typescript@5.9.3)
+ '@parity/product-sdk-signer': 0.6.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-tx': 0.2.7(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@polkadot-labs/hdkd-helpers': 0.0.30
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ viem: 2.52.0(typescript@5.9.3)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/host-api-wrapper'
@@ -6898,7 +6618,7 @@ snapshots:
'@parity/product-sdk-descriptors@0.4.1(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- bufferutil
- esbuild
@@ -6906,9 +6626,9 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-descriptors@0.5.0(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-descriptors@0.5.2(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- bufferutil
- esbuild
@@ -6916,13 +6636,12 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-host@0.4.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-host@0.4.0(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-logger': 0.1.1
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
optionalDependencies:
- '@novasamatech/host-api': 0.7.9-4
- '@novasamatech/product-sdk': 0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@novasamatech/host-api': 0.7.9
transitivePeerDependencies:
- bufferutil
- esbuild
@@ -6930,12 +6649,12 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-host@0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-host@0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-logger': 0.1.1
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
optionalDependencies:
- '@novasamatech/host-api': 0.7.9-4
+ '@novasamatech/host-api': 0.7.9
'@novasamatech/host-api-wrapper': 0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- bufferutil
@@ -6944,15 +6663,43 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-keys@0.3.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-host@0.5.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-logger': 0.1.1
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ optionalDependencies:
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/host-api-wrapper': 0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ transitivePeerDependencies:
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-host@0.6.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-logger': 0.1.1
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ optionalDependencies:
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/host-api-wrapper': 0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ transitivePeerDependencies:
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-keys@0.3.0(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-address': 0.1.1
'@parity/product-sdk-crypto': 0.1.1
- '@parity/product-sdk-storage': 0.1.5(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-storage': 0.1.5(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@polkadot-labs/hdkd': 0.0.28
'@polkadot-labs/hdkd-helpers': 0.0.10
'@scure/sr25519': 2.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
scale-ts: 1.6.1
transitivePeerDependencies:
- '@novasamatech/host-api'
@@ -6963,15 +6710,15 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-keys@0.3.1(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-keys@0.3.1(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-address': 0.1.1
'@parity/product-sdk-crypto': 0.1.1
- '@parity/product-sdk-local-storage': 0.2.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-local-storage': 0.2.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@polkadot-labs/hdkd': 0.0.28
'@polkadot-labs/hdkd-helpers': 0.0.10
'@scure/sr25519': 2.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
scale-ts: 1.6.1
transitivePeerDependencies:
- '@novasamatech/host-api'
@@ -6982,9 +6729,73 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-local-storage@0.2.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-keys@0.3.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-address': 0.1.1
+ '@parity/product-sdk-crypto': 0.1.1
+ '@parity/product-sdk-local-storage': 0.2.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@polkadot-labs/hdkd': 0.0.28
+ '@polkadot-labs/hdkd-helpers': 0.0.10
+ '@scure/sr25519': 2.2.0
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ scale-ts: 1.6.1
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-keys@0.3.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-address': 0.1.1
+ '@parity/product-sdk-crypto': 0.1.1
+ '@parity/product-sdk-local-storage': 0.2.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@polkadot-labs/hdkd': 0.0.28
+ '@polkadot-labs/hdkd-helpers': 0.0.30
+ '@scure/sr25519': 2.2.0
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ scale-ts: 1.6.1
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-local-storage@0.2.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-logger': 0.1.1
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-local-storage@0.2.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-logger': 0.1.1
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-local-storage@0.2.2(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-host': 0.6.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
transitivePeerDependencies:
- '@novasamatech/host-api'
@@ -6997,16 +6808,16 @@ snapshots:
'@parity/product-sdk-logger@0.1.1': {}
- '@parity/product-sdk-signer@0.3.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-signer@0.4.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-address': 0.1.1
- '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-keys': 0.3.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-keys': 0.3.1(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
optionalDependencies:
- '@novasamatech/host-api': 0.7.9-4
- '@novasamatech/product-sdk': 0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/host-api-wrapper': 0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@polkadot/api'
- '@polkadot/util'
@@ -7016,16 +6827,16 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-signer@0.4.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-signer@0.6.0(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@parity/product-sdk-address': 0.1.1
- '@parity/product-sdk-host': 0.5.0(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
- '@parity/product-sdk-keys': 0.3.1(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.6.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-keys': 0.3.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
optionalDependencies:
- '@novasamatech/host-api': 0.7.9-4
- '@novasamatech/host-api-wrapper': 0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@novasamatech/host-api': 0.7.9
+ '@novasamatech/host-api-wrapper': 0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@polkadot/api'
- '@polkadot/util'
@@ -7035,9 +6846,9 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-storage@0.1.5(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-storage@0.1.5(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-host': 0.4.0(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
transitivePeerDependencies:
- '@novasamatech/host-api'
@@ -7048,21 +6859,22 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-terminal@0.2.1(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-terminal@0.3.0(patch_hash=881abfac101745190526378af2ef8b2bffee3a6b8743272b706f434568e806d3)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
'@noble/ciphers': 2.2.0
'@noble/curves': 2.2.0
'@noble/hashes': 2.2.0
- '@novasamatech/host-papp': 0.7.9-4(esbuild@0.27.7)(rxjs@7.8.2)
- '@novasamatech/statement-store': 0.7.9-4(esbuild@0.27.7)(rxjs@7.8.2)
- '@novasamatech/storage-adapter': 0.7.9-4
+ '@novasamatech/host-papp': 0.7.9(esbuild@0.27.7)(rxjs@7.8.2)
+ '@novasamatech/statement-store': 0.7.9(esbuild@0.27.7)(rxjs@7.8.2)
+ '@novasamatech/storage-adapter': 0.7.9
'@parity/product-sdk-logger': 0.1.1
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/ws-provider': 0.9.0(rxjs@7.8.2)
- '@polkadot-labs/hdkd-helpers': 0.0.27
- nanoid: 5.1.9
+ '@polkadot-labs/hdkd-helpers': 0.0.30
+ nanoid: 5.1.11
neverthrow: 8.2.0
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
qrcode: 1.5.4
scale-ts: 1.6.1
transitivePeerDependencies:
@@ -7072,12 +6884,12 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-tx@0.2.4(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-tx@0.2.4(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- '@parity/product-sdk-keys': 0.3.0(@novasamatech/host-api@0.7.9-4)(@novasamatech/product-sdk@0.7.9-4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-keys': 0.3.0(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
'@polkadot-labs/hdkd-helpers': 0.0.10
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/product-sdk'
@@ -7087,12 +6899,27 @@ snapshots:
- supports-color
- utf-8-validate
- '@parity/product-sdk-tx@0.2.5(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)':
+ '@parity/product-sdk-tx@0.2.5(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
dependencies:
- '@parity/product-sdk-keys': 0.3.1(@novasamatech/host-api-wrapper@0.7.9(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9-4)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-keys': 0.3.1(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
'@parity/product-sdk-logger': 0.1.1
'@polkadot-labs/hdkd-helpers': 0.0.10
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ transitivePeerDependencies:
+ - '@novasamatech/host-api'
+ - '@novasamatech/host-api-wrapper'
+ - bufferutil
+ - esbuild
+ - rxjs
+ - supports-color
+ - utf-8-validate
+
+ '@parity/product-sdk-tx@0.2.7(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)':
+ dependencies:
+ '@parity/product-sdk-keys': 0.3.3(@novasamatech/host-api-wrapper@0.8.4(@polkadot/api@16.5.6)(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2))(@novasamatech/host-api@0.7.9)(esbuild@0.27.7)(rxjs@7.8.2)
+ '@parity/product-sdk-logger': 0.1.1
+ '@polkadot-labs/hdkd-helpers': 0.0.30
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
transitivePeerDependencies:
- '@novasamatech/host-api'
- '@novasamatech/host-api-wrapper'
@@ -7240,7 +7067,7 @@ snapshots:
'@polkadot-api/utils': 0.2.0
'@polkadot-api/wasm-executor': 0.2.3
'@polkadot-api/ws-provider': 0.7.5
- '@types/node': 25.6.0
+ '@types/node': 25.9.1
commander: 14.0.3
execa: 9.6.1
fs.promises.exists: 1.1.4
@@ -7262,31 +7089,31 @@ snapshots:
- utf-8-validate
- yaml
- '@polkadot-api/cli@0.21.2(esbuild@0.27.7)':
+ '@polkadot-api/cli@0.21.4(esbuild@0.27.7)':
dependencies:
- '@commander-js/extra-typings': 14.0.0(commander@14.0.3)
- '@polkadot-api/codegen': 0.22.4
- '@polkadot-api/ink-contracts': 0.6.2
+ '@commander-js/extra-typings': 15.0.0(commander@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.11.3
- '@polkadot-api/metadata-compatibility': 0.6.2
- '@polkadot-api/observable-client': 0.18.5(rxjs@7.8.2)
- '@polkadot-api/sm-provider': 0.3.4(@polkadot-api/smoldot@0.4.3)
- '@polkadot-api/smoldot': 0.4.3
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/known-chains': 0.11.5
+ '@polkadot-api/metadata-compatibility': 0.6.3
+ '@polkadot-api/observable-client': 0.18.7(rxjs@7.8.2)
+ '@polkadot-api/sm-provider': 0.3.5(@polkadot-api/smoldot@0.4.4)
+ '@polkadot-api/smoldot': 0.4.4
+ '@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.3(rxjs@7.8.2)
+ '@polkadot-api/ws-middleware': 0.3.4(rxjs@7.8.2)
'@polkadot-api/ws-provider': 0.9.0(rxjs@7.8.2)
- '@types/node': 25.7.0
- commander: 14.0.3
+ '@types/node': 25.9.1
+ commander: 15.0.0
execa: 9.6.1
fs.promises.exists: 1.1.4
ora: 9.4.0
read-pkg: 10.1.0
- rollup: 4.60.3
- rollup-plugin-esbuild: 6.2.1(esbuild@0.27.7)(rollup@4.60.3)
+ rollup: 4.61.0
+ rollup-plugin-esbuild: 6.2.1(esbuild@0.27.7)(rollup@4.61.0)
rxjs: 7.8.2
tsc-prog: 2.3.0(typescript@6.0.3)
typescript: 6.0.3
@@ -7305,17 +7132,17 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/codegen@0.22.4':
+ '@polkadot-api/codegen@0.22.5':
dependencies:
- '@polkadot-api/ink-contracts': 0.6.2
- '@polkadot-api/metadata-builders': 0.14.2
- '@polkadot-api/metadata-compatibility': 0.6.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@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
- '@polkadot-api/common-sdk-utils@0.3.0(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)':
+ '@polkadot-api/common-sdk-utils@0.3.0(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)':
dependencies:
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
rxjs: 7.8.2
'@polkadot-api/descriptors@file:stubs/papi-descriptors-stub': {}
@@ -7326,10 +7153,10 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/ink-contracts@0.6.2':
+ '@polkadot-api/ink-contracts@0.6.3':
dependencies:
- '@polkadot-api/metadata-builders': 0.14.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/metadata-builders': 0.14.3
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/json-rpc-provider-proxy@0.1.0':
@@ -7341,7 +7168,7 @@ snapshots:
'@polkadot-api/json-rpc-provider@0.2.0': {}
- '@polkadot-api/known-chains@0.11.3': {}
+ '@polkadot-api/known-chains@0.11.5': {}
'@polkadot-api/known-chains@0.9.18': {}
@@ -7367,10 +7194,10 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/merkleize-metadata@1.2.2':
+ '@polkadot-api/merkleize-metadata@1.2.3':
dependencies:
- '@polkadot-api/metadata-builders': 0.14.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/metadata-builders': 0.14.3
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/metadata-builders@0.13.9':
@@ -7378,9 +7205,9 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/metadata-builders@0.14.2':
+ '@polkadot-api/metadata-builders@0.14.3':
dependencies:
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/metadata-builders@0.3.2':
@@ -7394,10 +7221,10 @@ snapshots:
'@polkadot-api/metadata-builders': 0.13.9
'@polkadot-api/substrate-bindings': 0.17.0
- '@polkadot-api/metadata-compatibility@0.6.2':
+ '@polkadot-api/metadata-compatibility@0.6.3':
dependencies:
- '@polkadot-api/metadata-builders': 0.14.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/metadata-builders': 0.14.3
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/observable-client@0.17.3(rxjs@7.8.2)':
dependencies:
@@ -7407,10 +7234,10 @@ snapshots:
'@polkadot-api/utils': 0.2.0
rxjs: 7.8.2
- '@polkadot-api/observable-client@0.18.5(rxjs@7.8.2)':
+ '@polkadot-api/observable-client@0.18.7(rxjs@7.8.2)':
dependencies:
- '@polkadot-api/metadata-builders': 0.14.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@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
rxjs: 7.8.2
@@ -7432,12 +7259,12 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/pjs-signer@0.7.2':
+ '@polkadot-api/pjs-signer@0.7.3':
dependencies:
- '@polkadot-api/metadata-builders': 0.14.2
+ '@polkadot-api/metadata-builders': 0.14.3
'@polkadot-api/polkadot-signer': 0.1.6
- '@polkadot-api/signers-common': 0.2.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/signers-common': 0.2.3
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/polkadot-sdk-compat@2.4.1':
@@ -7454,16 +7281,16 @@ snapshots:
dependencies:
'@polkadot-api/json-rpc-provider': 0.2.0
- '@polkadot-api/sdk-ink@0.7.0(@polkadot-api/ink-contracts@0.6.2)(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)(typescript@5.9.3)':
+ '@polkadot-api/sdk-ink@0.7.0(@polkadot-api/ink-contracts@0.6.3)(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)(typescript@5.9.3)':
dependencies:
'@ethereumjs/rlp': 10.1.1
- '@polkadot-api/common-sdk-utils': 0.3.0(polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)
- '@polkadot-api/ink-contracts': 0.6.2
+ '@polkadot-api/common-sdk-utils': 0.3.0(polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2))(rxjs@7.8.2)
+ '@polkadot-api/ink-contracts': 0.6.3
'@polkadot-api/substrate-bindings': 0.19.0
abitype: 1.2.3(typescript@5.9.3)
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
rxjs: 7.8.2
- viem: 2.48.0(typescript@5.9.3)
+ viem: 2.52.0(typescript@5.9.3)
transitivePeerDependencies:
- bufferutil
- typescript
@@ -7479,13 +7306,13 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/signer@0.3.2':
+ '@polkadot-api/signer@0.3.3':
dependencies:
'@noble/hashes': 2.2.0
- '@polkadot-api/merkleize-metadata': 1.2.2
+ '@polkadot-api/merkleize-metadata': 1.2.3
'@polkadot-api/polkadot-signer': 0.1.6
- '@polkadot-api/signers-common': 0.2.2
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/signers-common': 0.2.3
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/signers-common@0.1.20':
@@ -7495,11 +7322,11 @@ snapshots:
'@polkadot-api/substrate-bindings': 0.17.0
'@polkadot-api/utils': 0.2.0
- '@polkadot-api/signers-common@0.2.2':
+ '@polkadot-api/signers-common@0.2.3':
dependencies:
- '@polkadot-api/metadata-builders': 0.14.2
+ '@polkadot-api/metadata-builders': 0.14.3
'@polkadot-api/polkadot-signer': 0.1.6
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
'@polkadot-api/sm-provider@0.1.16(@polkadot-api/smoldot@0.3.15)':
@@ -7508,11 +7335,11 @@ snapshots:
'@polkadot-api/json-rpc-provider-proxy': 0.2.8
'@polkadot-api/smoldot': 0.3.15
- '@polkadot-api/sm-provider@0.3.4(@polkadot-api/smoldot@0.4.3)':
+ '@polkadot-api/sm-provider@0.3.5(@polkadot-api/smoldot@0.4.4)':
dependencies:
'@polkadot-api/json-rpc-provider': 0.2.0
'@polkadot-api/json-rpc-provider-proxy': 0.4.0
- '@polkadot-api/smoldot': 0.4.3
+ '@polkadot-api/smoldot': 0.4.4
'@polkadot-api/smoldot@0.3.15':
dependencies:
@@ -7522,10 +7349,10 @@ snapshots:
- bufferutil
- utf-8-validate
- '@polkadot-api/smoldot@0.4.3':
+ '@polkadot-api/smoldot@0.4.4':
dependencies:
- '@types/node': 25.7.0
- smoldot: 3.1.2
+ '@types/node': 25.9.1
+ smoldot: 3.1.4
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -7558,13 +7385,6 @@ snapshots:
'@scure/base': 2.2.0
scale-ts: 1.6.1
- '@polkadot-api/substrate-bindings@0.20.2':
- dependencies:
- '@noble/hashes': 2.2.0
- '@polkadot-api/utils': 0.4.0
- '@scure/base': 2.2.0
- scale-ts: 1.6.1
-
'@polkadot-api/substrate-bindings@0.20.3':
dependencies:
'@noble/hashes': 2.2.0
@@ -7611,12 +7431,12 @@ snapshots:
'@polkadot-api/wasm-executor@0.2.3': {}
- '@polkadot-api/ws-middleware@0.3.3(rxjs@7.8.2)':
+ '@polkadot-api/ws-middleware@0.3.4(rxjs@7.8.2)':
dependencies:
'@polkadot-api/json-rpc-provider': 0.2.0
'@polkadot-api/json-rpc-provider-proxy': 0.4.0
'@polkadot-api/raw-client': 0.3.0
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-api/utils': 0.4.0
rxjs: 7.8.2
@@ -8062,154 +7882,79 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.28
- '@rollup/rollup-android-arm-eabi@4.60.1':
- optional: true
-
- '@rollup/rollup-android-arm-eabi@4.60.3':
- optional: true
-
- '@rollup/rollup-android-arm64@4.60.1':
- optional: true
-
- '@rollup/rollup-android-arm64@4.60.3':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.60.1':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.60.3':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.60.1':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.60.3':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.60.1':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.60.3':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.60.1':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.60.3':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.60.1':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.60.1':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.60.3':
- optional: true
-
- '@rollup/rollup-linux-arm64-gnu@4.60.1':
- optional: true
-
- '@rollup/rollup-linux-arm64-gnu@4.60.3':
- optional: true
-
- '@rollup/rollup-linux-arm64-musl@4.60.1':
- optional: true
-
- '@rollup/rollup-linux-arm64-musl@4.60.3':
- optional: true
-
- '@rollup/rollup-linux-loong64-gnu@4.60.1':
- optional: true
-
- '@rollup/rollup-linux-loong64-gnu@4.60.3':
+ '@rollup/rollup-android-arm-eabi@4.61.0':
optional: true
- '@rollup/rollup-linux-loong64-musl@4.60.1':
+ '@rollup/rollup-android-arm64@4.61.0':
optional: true
- '@rollup/rollup-linux-loong64-musl@4.60.3':
+ '@rollup/rollup-darwin-arm64@4.61.0':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.60.1':
+ '@rollup/rollup-darwin-x64@4.61.0':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.60.3':
+ '@rollup/rollup-freebsd-arm64@4.61.0':
optional: true
- '@rollup/rollup-linux-ppc64-musl@4.60.1':
+ '@rollup/rollup-freebsd-x64@4.61.0':
optional: true
- '@rollup/rollup-linux-ppc64-musl@4.60.3':
+ '@rollup/rollup-linux-arm-gnueabihf@4.61.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.60.1':
+ '@rollup/rollup-linux-arm-musleabihf@4.61.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.60.3':
+ '@rollup/rollup-linux-arm64-gnu@4.61.0':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.60.1':
+ '@rollup/rollup-linux-arm64-musl@4.61.0':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.60.3':
+ '@rollup/rollup-linux-loong64-gnu@4.61.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.60.1':
+ '@rollup/rollup-linux-loong64-musl@4.61.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.60.3':
+ '@rollup/rollup-linux-ppc64-gnu@4.61.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.60.1':
+ '@rollup/rollup-linux-ppc64-musl@4.61.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.60.3':
+ '@rollup/rollup-linux-riscv64-gnu@4.61.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.60.1':
+ '@rollup/rollup-linux-riscv64-musl@4.61.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.60.3':
+ '@rollup/rollup-linux-s390x-gnu@4.61.0':
optional: true
- '@rollup/rollup-openbsd-x64@4.60.1':
+ '@rollup/rollup-linux-x64-gnu@4.61.0':
optional: true
- '@rollup/rollup-openbsd-x64@4.60.3':
+ '@rollup/rollup-linux-x64-musl@4.61.0':
optional: true
- '@rollup/rollup-openharmony-arm64@4.60.1':
+ '@rollup/rollup-openbsd-x64@4.61.0':
optional: true
- '@rollup/rollup-openharmony-arm64@4.60.3':
+ '@rollup/rollup-openharmony-arm64@4.61.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.60.1':
+ '@rollup/rollup-win32-arm64-msvc@4.61.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.60.3':
+ '@rollup/rollup-win32-ia32-msvc@4.61.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.60.1':
+ '@rollup/rollup-win32-x64-gnu@4.61.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.60.3':
- optional: true
-
- '@rollup/rollup-win32-x64-gnu@4.60.1':
- optional: true
-
- '@rollup/rollup-win32-x64-gnu@4.60.3':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.60.1':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.60.3':
+ '@rollup/rollup-win32-x64-msvc@4.61.0':
optional: true
'@rx-state/core@0.1.4(rxjs@7.8.2)':
@@ -8351,7 +8096,7 @@ snapshots:
'@types/bn.js@5.2.0':
dependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
'@types/chai@5.2.3':
dependencies:
@@ -8360,15 +8105,15 @@ snapshots:
'@types/connect@3.4.38':
dependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
'@types/deep-eql@4.0.2': {}
'@types/dns-packet@5.6.5':
dependencies:
- '@types/node': 22.19.18
+ '@types/node': 22.19.19
- '@types/estree@1.0.8': {}
+ '@types/estree@1.0.9': {}
'@types/istanbul-lib-coverage@2.0.6': {}
@@ -8383,22 +8128,14 @@ snapshots:
'@types/multicast-dns@7.2.4':
dependencies:
'@types/dns-packet': 5.6.5
- '@types/node': 22.19.18
+ '@types/node': 22.19.19
'@types/mysql@2.15.26':
dependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
'@types/node@12.20.55': {}
- '@types/node@22.19.17':
- dependencies:
- undici-types: 6.21.0
-
- '@types/node@22.19.18':
- dependencies:
- undici-types: 6.21.0
-
'@types/node@22.19.19':
dependencies:
undici-types: 6.21.0
@@ -8407,13 +8144,9 @@ snapshots:
dependencies:
undici-types: 7.16.0
- '@types/node@25.6.0':
+ '@types/node@25.9.1':
dependencies:
- undici-types: 7.19.2
-
- '@types/node@25.7.0':
- dependencies:
- undici-types: 7.21.0
+ undici-types: 7.24.6
'@types/normalize-package-data@2.4.4': {}
@@ -8423,7 +8156,7 @@ snapshots:
'@types/pg@8.6.1':
dependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
pg-protocol: 1.13.0
pg-types: 2.2.0
@@ -8442,11 +8175,11 @@ snapshots:
'@types/tedious@4.0.14':
dependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
'@types/ws@8.18.1':
dependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
'@types/yargs-parser@21.0.3': {}
@@ -8462,13 +8195,13 @@ snapshots:
chai: 5.3.3
tinyrainbow: 2.0.0
- '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))':
+ '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 7.3.2(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
+ vite: 7.3.2(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -8613,7 +8346,7 @@ snapshots:
blockstore-core@6.1.3:
dependencies:
- '@libp2p/logger': 6.2.4
+ '@libp2p/logger': 6.2.7
interface-blockstore: 6.0.2
interface-store: 7.0.2
it-all: 3.0.11
@@ -8657,12 +8390,12 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
- bulletin-deploy@0.7.29(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3):
+ bulletin-deploy@0.8.1(@polkadot/util@14.0.3)(esbuild@0.27.7)(rxjs@7.8.2)(typescript@5.9.3):
dependencies:
'@ipld/car': 5.4.3
'@ipld/dag-pb': 4.1.5
'@noble/hashes': 1.8.0
- '@polkadot-api/metadata-builders': 0.14.2
+ '@polkadot-api/metadata-builders': 0.14.3
'@polkadot-api/substrate-bindings': 0.20.3
'@polkadot-labs/hdkd': 0.0.28
'@polkadot-labs/hdkd-helpers': 0.0.30
@@ -8673,9 +8406,9 @@ snapshots:
ipfs-unixfs-importer: 16.1.5
jiti: 2.7.0
multiformats: 13.4.2
- polkadot-api: 2.1.3(esbuild@0.27.7)(rxjs@7.8.2)
- verifiablejs: 1.2.0
- viem: 2.51.3(typescript@5.9.3)
+ polkadot-api: 2.1.5(esbuild@0.27.7)(rxjs@7.8.2)
+ verifiablejs: 1.3.0-beta.4
+ viem: 2.52.0(typescript@5.9.3)
transitivePeerDependencies:
- '@polkadot/util'
- bufferutil
@@ -8705,8 +8438,6 @@ snapshots:
caniuse-lite@1.0.30001793: {}
- cborg@5.1.0: {}
-
cborg@5.1.1: {}
chai@5.3.3:
@@ -8812,6 +8543,8 @@ snapshots:
commander@14.0.3: {}
+ commander@15.0.0: {}
+
commander@2.20.3: {}
commander@4.1.1: {}
@@ -8850,7 +8583,7 @@ snapshots:
datastore-core@11.0.4:
dependencies:
- '@libp2p/logger': 6.2.6
+ '@libp2p/logger': 6.2.7
interface-datastore: 9.0.3
interface-store: 7.0.2
it-drain: 3.0.12
@@ -9038,7 +8771,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
etag@1.8.1: {}
@@ -9132,7 +8865,7 @@ snapshots:
dependencies:
magic-string: 0.30.21
mlly: 1.8.2
- rollup: 4.60.1
+ rollup: 4.61.0
flow-enums-runtime@0.0.6: {}
@@ -9279,7 +9012,7 @@ snapshots:
'@libp2p/keychain': 6.1.0
'@libp2p/mdns': 12.0.19
'@libp2p/mplex': 12.0.19
- '@libp2p/ping': 3.1.3
+ '@libp2p/ping': 3.1.5
'@libp2p/tcp': 11.0.18
'@libp2p/tls': 3.1.0
'@libp2p/upnp-nat': 4.0.18
@@ -9433,7 +9166,7 @@ snapshots:
it-map: 3.1.6
it-parallel: 3.0.15
it-pipe: 3.0.1
- it-pushable: 3.2.3
+ it-pushable: 3.2.4
it-to-buffer: 4.0.12
multiformats: 13.4.2
p-queue: 9.1.2
@@ -9473,10 +9206,10 @@ snapshots:
ipns@10.1.6:
dependencies:
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/logger': 6.2.6
- cborg: 5.1.0
+ '@libp2p/logger': 6.2.7
+ cborg: 5.1.1
interface-datastore: 9.0.3
multiformats: 13.4.2
protons-runtime: 6.0.1
@@ -9543,10 +9276,6 @@ snapshots:
isexe@2.0.0: {}
- isows@1.0.7(ws@8.18.3):
- dependencies:
- ws: 8.18.3
-
isows@1.0.7(ws@8.20.1):
dependencies:
ws: 8.20.1
@@ -9589,14 +9318,6 @@ snapshots:
uint8-varint: 2.0.4
uint8arraylist: 2.4.9
- it-length-prefixed@10.0.1:
- dependencies:
- it-reader: 6.0.4
- it-stream-types: 2.0.4
- uint8-varint: 2.0.4
- uint8arraylist: 2.4.9
- uint8arrays: 5.1.1
-
it-length-prefixed@10.0.2:
dependencies:
it-reader: 6.0.5
@@ -9632,7 +9353,7 @@ snapshots:
it-pipe@3.0.1:
dependencies:
it-merge: 3.0.14
- it-pushable: 3.2.3
+ it-pushable: 3.2.4
it-stream-types: 2.0.4
it-protobuf-stream@2.0.6:
@@ -9642,10 +9363,6 @@ snapshots:
it-stream-types: 2.0.4
uint8arraylist: 2.4.9
- it-pushable@3.2.3:
- dependencies:
- p-defer: 4.0.1
-
it-pushable@3.2.4:
dependencies:
p-defer: 4.0.1
@@ -9664,11 +9381,6 @@ snapshots:
p-defer: 4.0.1
race-signal: 2.0.0
- it-reader@6.0.4:
- dependencies:
- it-stream-types: 2.0.4
- uint8arraylist: 2.4.9
-
it-reader@6.0.5:
dependencies:
it-stream-types: 2.0.4
@@ -9755,15 +9467,15 @@ snapshots:
dependencies:
'@chainsafe/is-ip': 2.1.0
'@chainsafe/netmask': 2.0.0
- '@libp2p/crypto': 5.1.17
+ '@libp2p/crypto': 5.1.18
'@libp2p/interface': 3.2.2
- '@libp2p/interface-internal': 3.1.3
- '@libp2p/logger': 6.2.6
+ '@libp2p/interface-internal': 3.1.5
+ '@libp2p/logger': 6.2.7
'@libp2p/multistream-select': 7.0.18
- '@libp2p/peer-collections': 7.0.18
- '@libp2p/peer-id': 6.0.8
+ '@libp2p/peer-collections': 7.0.20
+ '@libp2p/peer-id': 6.0.9
'@libp2p/peer-store': 12.0.18
- '@libp2p/utils': 7.1.0
+ '@libp2p/utils': 7.2.1
'@multiformats/dns': 1.0.13
'@multiformats/multiaddr': 13.0.1
'@multiformats/multiaddr-matcher': 3.0.2
@@ -10116,6 +9828,8 @@ snapshots:
nanoid@3.3.11: {}
+ nanoid@5.1.11: {}
+
nanoid@5.1.9: {}
napi-build-utils@2.0.0: {}
@@ -10126,7 +9840,7 @@ snapshots:
neverthrow@8.2.0:
optionalDependencies:
- '@rollup/rollup-linux-x64-gnu': 4.60.3
+ '@rollup/rollup-linux-x64-gnu': 4.61.0
nock@13.5.6:
dependencies:
@@ -10139,7 +9853,7 @@ snapshots:
node-abi@3.89.0:
dependencies:
- semver: 7.8.0
+ semver: 7.8.1
node-datachannel@0.29.0:
dependencies:
@@ -10168,13 +9882,13 @@ snapshots:
normalize-package-data@6.0.2:
dependencies:
hosted-git-info: 7.0.2
- semver: 7.7.4
+ semver: 7.8.1
validate-npm-package-license: 3.0.4
normalize-package-data@8.0.0:
dependencies:
hosted-git-info: 9.0.2
- semver: 7.7.4
+ semver: 7.8.1
validate-npm-package-license: 3.0.4
npm-run-path@6.0.0:
@@ -10228,22 +9942,7 @@ snapshots:
outdent@0.5.0: {}
- ox@0.14.17(typescript@5.9.3):
- dependencies:
- '@adraffy/ens-normalize': 1.11.1
- '@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(typescript@5.9.3)
- eventemitter3: 5.0.1
- optionalDependencies:
- typescript: 5.9.3
- transitivePeerDependencies:
- - zod
-
- ox@0.14.25(typescript@5.9.3):
+ ox@0.14.27(typescript@5.9.3):
dependencies:
'@adraffy/ens-normalize': 1.11.1
'@noble/ciphers': 1.3.0
@@ -10299,7 +9998,7 @@ snapshots:
parse-json@8.3.0:
dependencies:
- '@babel/code-frame': 7.29.0
+ '@babel/code-frame': 7.29.7
index-to-position: 1.2.0
type-fest: 4.41.0
@@ -10386,25 +10085,25 @@ snapshots:
- utf-8-validate
- yaml
- polkadot-api@2.1.3(esbuild@0.27.7)(rxjs@7.8.2):
+ polkadot-api@2.1.5(esbuild@0.27.7)(rxjs@7.8.2):
dependencies:
- '@polkadot-api/cli': 0.21.2(esbuild@0.27.7)
- '@polkadot-api/ink-contracts': 0.6.2
+ '@polkadot-api/cli': 0.21.4(esbuild@0.27.7)
+ '@polkadot-api/ink-contracts': 0.6.3
'@polkadot-api/json-rpc-provider': 0.2.0
- '@polkadot-api/known-chains': 0.11.3
+ '@polkadot-api/known-chains': 0.11.5
'@polkadot-api/logs-provider': 0.2.0
- '@polkadot-api/metadata-builders': 0.14.2
- '@polkadot-api/metadata-compatibility': 0.6.2
- '@polkadot-api/observable-client': 0.18.5(rxjs@7.8.2)
- '@polkadot-api/pjs-signer': 0.7.2
+ '@polkadot-api/metadata-builders': 0.14.3
+ '@polkadot-api/metadata-compatibility': 0.6.3
+ '@polkadot-api/observable-client': 0.18.7(rxjs@7.8.2)
+ '@polkadot-api/pjs-signer': 0.7.3
'@polkadot-api/polkadot-signer': 0.1.6
- '@polkadot-api/signer': 0.3.2
- '@polkadot-api/sm-provider': 0.3.4(@polkadot-api/smoldot@0.4.3)
- '@polkadot-api/smoldot': 0.4.3
- '@polkadot-api/substrate-bindings': 0.20.2
+ '@polkadot-api/signer': 0.3.3
+ '@polkadot-api/sm-provider': 0.3.5(@polkadot-api/smoldot@0.4.4)
+ '@polkadot-api/smoldot': 0.4.4
+ '@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.3(rxjs@7.8.2)
+ '@polkadot-api/ws-middleware': 0.3.4(rxjs@7.8.2)
'@polkadot-api/ws-provider': 0.9.0(rxjs@7.8.2)
'@rx-state/core': 0.1.4(rxjs@7.8.2)
rxjs: 7.8.2
@@ -10704,77 +10403,46 @@ snapshots:
reusify@1.1.0: {}
- rollup-plugin-esbuild@6.2.1(esbuild@0.27.7)(rollup@4.60.3):
+ rollup-plugin-esbuild@6.2.1(esbuild@0.27.7)(rollup@4.61.0):
dependencies:
debug: 4.4.3
es-module-lexer: 1.7.0
esbuild: 0.27.7
get-tsconfig: 4.14.0
- rollup: 4.60.3
+ rollup: 4.61.0
unplugin-utils: 0.2.5
transitivePeerDependencies:
- supports-color
- rollup@4.60.1:
- dependencies:
- '@types/estree': 1.0.8
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.60.1
- '@rollup/rollup-android-arm64': 4.60.1
- '@rollup/rollup-darwin-arm64': 4.60.1
- '@rollup/rollup-darwin-x64': 4.60.1
- '@rollup/rollup-freebsd-arm64': 4.60.1
- '@rollup/rollup-freebsd-x64': 4.60.1
- '@rollup/rollup-linux-arm-gnueabihf': 4.60.1
- '@rollup/rollup-linux-arm-musleabihf': 4.60.1
- '@rollup/rollup-linux-arm64-gnu': 4.60.1
- '@rollup/rollup-linux-arm64-musl': 4.60.1
- '@rollup/rollup-linux-loong64-gnu': 4.60.1
- '@rollup/rollup-linux-loong64-musl': 4.60.1
- '@rollup/rollup-linux-ppc64-gnu': 4.60.1
- '@rollup/rollup-linux-ppc64-musl': 4.60.1
- '@rollup/rollup-linux-riscv64-gnu': 4.60.1
- '@rollup/rollup-linux-riscv64-musl': 4.60.1
- '@rollup/rollup-linux-s390x-gnu': 4.60.1
- '@rollup/rollup-linux-x64-gnu': 4.60.1
- '@rollup/rollup-linux-x64-musl': 4.60.1
- '@rollup/rollup-openbsd-x64': 4.60.1
- '@rollup/rollup-openharmony-arm64': 4.60.1
- '@rollup/rollup-win32-arm64-msvc': 4.60.1
- '@rollup/rollup-win32-ia32-msvc': 4.60.1
- '@rollup/rollup-win32-x64-gnu': 4.60.1
- '@rollup/rollup-win32-x64-msvc': 4.60.1
- fsevents: 2.3.3
-
- rollup@4.60.3:
+ rollup@4.61.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.60.3
- '@rollup/rollup-android-arm64': 4.60.3
- '@rollup/rollup-darwin-arm64': 4.60.3
- '@rollup/rollup-darwin-x64': 4.60.3
- '@rollup/rollup-freebsd-arm64': 4.60.3
- '@rollup/rollup-freebsd-x64': 4.60.3
- '@rollup/rollup-linux-arm-gnueabihf': 4.60.3
- '@rollup/rollup-linux-arm-musleabihf': 4.60.3
- '@rollup/rollup-linux-arm64-gnu': 4.60.3
- '@rollup/rollup-linux-arm64-musl': 4.60.3
- '@rollup/rollup-linux-loong64-gnu': 4.60.3
- '@rollup/rollup-linux-loong64-musl': 4.60.3
- '@rollup/rollup-linux-ppc64-gnu': 4.60.3
- '@rollup/rollup-linux-ppc64-musl': 4.60.3
- '@rollup/rollup-linux-riscv64-gnu': 4.60.3
- '@rollup/rollup-linux-riscv64-musl': 4.60.3
- '@rollup/rollup-linux-s390x-gnu': 4.60.3
- '@rollup/rollup-linux-x64-gnu': 4.60.3
- '@rollup/rollup-linux-x64-musl': 4.60.3
- '@rollup/rollup-openbsd-x64': 4.60.3
- '@rollup/rollup-openharmony-arm64': 4.60.3
- '@rollup/rollup-win32-arm64-msvc': 4.60.3
- '@rollup/rollup-win32-ia32-msvc': 4.60.3
- '@rollup/rollup-win32-x64-gnu': 4.60.3
- '@rollup/rollup-win32-x64-msvc': 4.60.3
+ '@rollup/rollup-android-arm-eabi': 4.61.0
+ '@rollup/rollup-android-arm64': 4.61.0
+ '@rollup/rollup-darwin-arm64': 4.61.0
+ '@rollup/rollup-darwin-x64': 4.61.0
+ '@rollup/rollup-freebsd-arm64': 4.61.0
+ '@rollup/rollup-freebsd-x64': 4.61.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.61.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.61.0
+ '@rollup/rollup-linux-arm64-gnu': 4.61.0
+ '@rollup/rollup-linux-arm64-musl': 4.61.0
+ '@rollup/rollup-linux-loong64-gnu': 4.61.0
+ '@rollup/rollup-linux-loong64-musl': 4.61.0
+ '@rollup/rollup-linux-ppc64-gnu': 4.61.0
+ '@rollup/rollup-linux-ppc64-musl': 4.61.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.61.0
+ '@rollup/rollup-linux-riscv64-musl': 4.61.0
+ '@rollup/rollup-linux-s390x-gnu': 4.61.0
+ '@rollup/rollup-linux-x64-gnu': 4.61.0
+ '@rollup/rollup-linux-x64-musl': 4.61.0
+ '@rollup/rollup-openbsd-x64': 4.61.0
+ '@rollup/rollup-openharmony-arm64': 4.61.0
+ '@rollup/rollup-win32-arm64-msvc': 4.61.0
+ '@rollup/rollup-win32-ia32-msvc': 4.61.0
+ '@rollup/rollup-win32-x64-gnu': 4.61.0
+ '@rollup/rollup-win32-x64-msvc': 4.61.0
fsevents: 2.3.3
run-parallel@1.2.0:
@@ -10805,10 +10473,6 @@ snapshots:
semver@6.3.1: {}
- semver@7.7.4: {}
-
- semver@7.8.0: {}
-
semver@7.8.1: {}
send@0.19.2:
@@ -10895,7 +10559,7 @@ snapshots:
- bufferutil
- utf-8-validate
- smoldot@3.1.2:
+ smoldot@3.1.4:
dependencies:
ws: 8.20.1
transitivePeerDependencies:
@@ -11145,7 +10809,7 @@ snapshots:
picocolors: 1.1.1
postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.10)(yaml@2.9.0)
resolve-from: 5.0.0
- rollup: 4.60.1
+ rollup: 4.61.0
source-map: 0.8.0-beta.0
sucrase: 3.35.1
tinyexec: 0.3.2
@@ -11201,9 +10865,7 @@ snapshots:
undici-types@7.16.0: {}
- undici-types@7.19.2: {}
-
- undici-types@7.21.0: {}
+ undici-types@7.24.6: {}
undici@8.1.0: {}
@@ -11245,26 +10907,9 @@ snapshots:
varint@6.0.0: {}
- verifiablejs@1.2.0: {}
-
- viem@2.48.0(typescript@5.9.3):
- 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(typescript@5.9.3)
- isows: 1.0.7(ws@8.18.3)
- ox: 0.14.17(typescript@5.9.3)
- ws: 8.18.3
- optionalDependencies:
- typescript: 5.9.3
- transitivePeerDependencies:
- - bufferutil
- - utf-8-validate
- - zod
+ verifiablejs@1.3.0-beta.4: {}
- viem@2.51.3(typescript@5.9.3):
+ viem@2.52.0(typescript@5.9.3):
dependencies:
'@noble/curves': 1.9.1
'@noble/hashes': 1.8.0
@@ -11272,7 +10917,7 @@ snapshots:
'@scure/bip39': 1.6.0
abitype: 1.2.3(typescript@5.9.3)
isows: 1.0.7(ws@8.20.1)
- ox: 0.14.25(typescript@5.9.3)
+ ox: 0.14.27(typescript@5.9.3)
ws: 8.20.1
optionalDependencies:
typescript: 5.9.3
@@ -11281,13 +10926,13 @@ snapshots:
- utf-8-validate
- zod
- vite-node@3.2.4(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0):
+ vite-node@3.2.4(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0):
dependencies:
cac: 6.7.14
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
- vite: 7.3.2(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
+ vite: 7.3.2(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
transitivePeerDependencies:
- '@types/node'
- jiti
@@ -11302,26 +10947,26 @@ snapshots:
- tsx
- yaml
- vite@7.3.2(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0):
+ vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0):
dependencies:
esbuild: 0.27.7
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4
postcss: 8.5.10
- rollup: 4.60.1
+ rollup: 4.61.0
tinyglobby: 0.2.16
optionalDependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
fsevents: 2.3.3
jiti: 2.7.0
terser: 5.48.0
yaml: 2.9.0
- vitest@3.2.4(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0):
+ vitest@3.2.4(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0):
dependencies:
'@types/chai': 5.2.3
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))
+ '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
@@ -11339,11 +10984,11 @@ snapshots:
tinyglobby: 0.2.16
tinypool: 1.1.1
tinyrainbow: 2.0.0
- vite: 7.3.2(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
- vite-node: 3.2.4(@types/node@22.19.17)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
+ vite: 7.3.2(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
+ vite-node: 3.2.4(@types/node@22.19.19)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 22.19.17
+ '@types/node': 22.19.19
transitivePeerDependencies:
- jiti
- less
@@ -11458,8 +11103,6 @@ snapshots:
ws@7.5.11: {}
- ws@8.18.3: {}
-
ws@8.20.1: {}
xml2js@0.6.2:
diff --git a/src/commands/contract.ts b/src/commands/contract.ts
index c628092..fe7b614 100644
--- a/src/commands/contract.ts
+++ b/src/commands/contract.ts
@@ -267,14 +267,10 @@ async function runContractDeploy(opts: ContractDeployOpts): Promise {
try {
signer = await resolveSigner(resolveContractSignerOptions(opts));
await ensureSmartContractAllowance({
- env: cfg.env,
- ownerAddress: signer.address,
deploySigner: signer,
});
client = await createContractChainClient(target);
const metadataSigner = await getBulletinAllowanceSigner({
- env: cfg.env,
- ownerAddress: signer.address,
publishSigner: signer,
bulletinApi: client.bulletin,
});
diff --git a/src/commands/init/AccountSetup.tsx b/src/commands/init/AccountSetup.tsx
index b2aeee9..0e41762 100644
--- a/src/commands/init/AccountSetup.tsx
+++ b/src/commands/init/AccountSetup.tsx
@@ -20,20 +20,13 @@ import { getConnection } from "../../utils/connection.js";
import { getSessionSigner, type SessionHandle } from "../../utils/auth.js";
import { topUpFromBulletinDev } from "../../utils/account/bulletinTopUp.js";
import { checkMapping, ensureMapped } from "../../utils/account/mapping.js";
-import { DEFAULT_ENV, PLAYGROUND_PRODUCT_ID } from "../../config.js";
+import { getCachedAllocation, requestResourceAllocation } from "@parity/product-sdk-terminal/host";
import {
PLAYGROUND_RESOURCES,
- requestResourceAllocation,
+ describeResource,
summarizeOutcomes,
- type AllocatableResource,
-} from "../../utils/allowances/host.js";
-import { hasAllowance, markAllowance } from "../../utils/allowances/marker.js";
-import { getBulletinSlotAuthorization } from "../../utils/allowances/bulletin.js";
-import {
- hasSlotAccountKey,
- readSlotAccountKey,
- storeSlotAccountKeysFromOutcomes,
-} from "../../utils/allowances/slotKeys.js";
+} from "../../utils/allowances/resources.js";
+import { cachedBulletinSlotAuthorization } from "../../utils/allowances/bulletin.js";
type Status = "pending" | "active" | "ok" | "failed" | "skipped";
@@ -67,20 +60,6 @@ interface PhonePrompt {
label: string;
}
-/** Human-readable name for a resource tag, used in failure messages. */
-function describeResource(r: AllocatableResource): string {
- switch (r.tag) {
- case "BulletInAllowance":
- return "Bulletin storage";
- case "StatementStoreAllowance":
- return "Statement Store";
- case "SmartContractAllowance":
- return `smart-contract gas (idx ${r.value})`;
- case "AutoSigning":
- return "auto-signing";
- }
-}
-
export function AccountSetup({
address,
onDone,
@@ -138,47 +117,32 @@ export function AccountSetup({
return;
}
- const env = DEFAULT_ENV;
-
// ── Step 0: Resource allowances ─────────────────────────────────
- // The CLI acts as the Host for terminal sessions: request RFC-0010
- // allocations from mobile, cache returned slot keys, then use the
- // Bulletin slot key for metadata uploads.
+ // The CLI acts as the Host for terminal sessions: RFC-0010
+ // allocations are requested over the paired session and the SDK
+ // caches granted slot keys at
+ // ~/.polkadot-apps/_AllowanceKeys.json. A cache entry is
+ // only written after the wallet returns Allocated, so "cached"
+ // doubles as "granted". Bulletin additionally needs an on-chain
+ // authorization check (the slot key may exist but be unauthorized
+ // or out of quota).
update(0, { status: "active", value: "checking…", valueTone: "muted" });
let accountSetupOk = true;
try {
- const tags = PLAYGROUND_RESOURCES.map((r) => r.tag);
- const marked = await Promise.all(tags.map((t) => hasAllowance(env, address, t)));
- const slotKeys = await Promise.all([
- hasSlotAccountKey(env, address, "BulletInAllowance"),
- hasSlotAccountKey(env, address, "StatementStoreAllowance"),
- ]);
-
- const refreshBulletinAllowanceMarker = async (): Promise => {
- const bulletinKey = await readSlotAccountKey(env, address, "BulletInAllowance");
- if (!bulletinKey) return false;
- try {
- const authorization = await getBulletinSlotAuthorization(
- client.bulletin,
- bulletinKey,
- 1,
- );
- if (authorization.usable) {
- await markAllowance(env, address, "BulletInAllowance", "host");
- }
- return authorization.usable;
- } catch {
- return false;
- }
- };
+ const { adapter, userSession } = session;
+ const cached = await Promise.all(
+ PLAYGROUND_RESOURCES.map((r) => getCachedAllocation(adapter, r)),
+ );
+ const bulletinAuth = await cachedBulletinSlotAuthorization(
+ adapter,
+ client.bulletin,
+ 1,
+ ).catch(() => null);
- const bulletinReady = await refreshBulletinAllowanceMarker();
+ const allReady =
+ cached.every(Boolean) && bulletinAuth !== null && bulletinAuth.usable;
- const resourcesReady = tags.every((tag, index) =>
- tag === "BulletInAllowance" ? bulletinReady : marked[index],
- );
- const allMarked = resourcesReady && slotKeys.every(Boolean);
- if (allMarked) {
+ if (allReady) {
update(0, {
status: "ok",
value: "already granted",
@@ -196,22 +160,14 @@ export function AccountSetup({
label: "grant resource allowances",
});
const outcomes = await requestResourceAllocation(
- session.userSession,
- PLAYGROUND_PRODUCT_ID,
+ userSession,
+ adapter,
+ PLAYGROUND_RESOURCES,
);
if (cancelled) return;
setPhonePrompt(null);
const summary = summarizeOutcomes(outcomes, PLAYGROUND_RESOURCES);
- await storeSlotAccountKeysFromOutcomes(env, address, outcomes);
- // RFC-0010 allocation outcomes are independent: keep any
- // successful keys even if a sibling resource was denied.
- for (const resource of summary.granted) {
- if (resource.tag === "BulletInAllowance") continue;
- await markAllowance(env, address, resource.tag, "host");
- }
- await refreshBulletinAllowanceMarker();
-
if (summary.rejected.length > 0 || summary.unavailable.length > 0) {
const denied = [...summary.rejected, ...summary.unavailable]
.map(describeResource)
diff --git a/src/config.ts b/src/config.ts
index 1f14260..b66782c 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -164,9 +164,16 @@ export const DAPP_ID = "dot-cli";
export const PLAYGROUND_PRODUCT_ID = "playground.dot";
/**
- * Runtime metadata the terminal adapter fetches to render transactions on the
- * mobile wallet. Hosted on a gist today; intentionally a URL rather than a
- * pinned file so it can be rotated without a CLI release.
+ * Host metadata URL embedded in the V1 pairing QR. The mobile app fetches
+ * this URL while loading the pairing request and renders `{ name, icon }`
+ * on the Sign-In screen — a blank value makes pairing fail with "Failed to
+ * load pairing request". Hosted on a gist today; intentionally a URL rather
+ * than a pinned file so it can be rotated without a CLI release.
+ *
+ * Only meaningful while `@novasamatech/*` is pinned to 0.7.9 (the V1 QR);
+ * host-papp 0.8 replaced this with structured `hostMetadata` entries inside
+ * the V2 proposal. Remove together with the 0.7.9 override + the
+ * `product-sdk-terminal` patch that forwards it.
*/
export const TERMINAL_METADATA_URL =
"https://gist.githubusercontent.com/ReinhardHatko/1967dd3f4afe78683cc0ba14d6ec8744/raw/c1625eb7ed7671b7e09a3fa2a25998dde33c70b8/metadata.json";
diff --git a/src/utils/allowances/bulletin.test.ts b/src/utils/allowances/bulletin.test.ts
index aba693e..e27354d 100644
--- a/src/utils/allowances/bulletin.test.ts
+++ b/src/utils/allowances/bulletin.test.ts
@@ -13,172 +13,126 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { secretFromSeed } from "@scure/sr25519";
-import { mkdtemp, rm } from "node:fs/promises";
-import { tmpdir } from "node:os";
-import { join } from "node:path";
-import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
-
-const { checkAuthorizationMock } = vi.hoisted(() => ({
+import { beforeEach, describe, expect, it, vi } from "vitest";
+import type { ResolvedSigner } from "../signer.js";
+
+// SDK boundary mocks — these are our wrappers over RFC-0010 + Bulletin, NOT
+// polkadot-api primitives, so mocking them is allowed.
+const {
+ checkAuthorizationMock,
+ createSlotAccountSignerMock,
+ ensureSlotAccountSignerMock,
+ requestResourceAllocationMock,
+} = vi.hoisted(() => ({
checkAuthorizationMock: vi.fn(),
+ createSlotAccountSignerMock: vi.fn(),
+ ensureSlotAccountSignerMock: vi.fn(),
+ requestResourceAllocationMock: vi.fn(),
}));
-vi.mock("@parity/product-sdk-bulletin", () => ({
+vi.mock("@parity/product-sdk-cloud-storage", () => ({
checkAuthorization: checkAuthorizationMock,
}));
-import { getBulletinAllowanceSigner, hasUsableBulletinSlotAuthorization } from "./bulletin.js";
-import { readSlotAccountKey, storeSlotAccountKey } from "./slotKeys.js";
-
-const KEY = secretFromSeed(new Uint8Array(32).fill(7));
-const KEY_2 = secretFromSeed(new Uint8Array(32).fill(8));
-const MOBILE_KEY = schnorrkelBytesFromScureSecret(KEY);
-const MOBILE_KEY_2 = schnorrkelBytesFromScureSecret(KEY_2);
-const ENV = "paseo-next-v2";
-const OWNER = "5Owner";
-
-function schnorrkelBytesFromScureSecret(secret: Uint8Array): Uint8Array {
- const raw = new Uint8Array(secret);
- let carry = 0;
- for (let i = 31; i >= 0; i--) {
- const value = secret[i] + carry * 256;
- raw[i] = value >> 3;
- carry = value & 0x07;
- }
- return raw;
+vi.mock("@parity/product-sdk-terminal/host", () => ({
+ createSlotAccountSigner: createSlotAccountSignerMock,
+ ensureSlotAccountSigner: ensureSlotAccountSignerMock,
+ requestResourceAllocation: requestResourceAllocationMock,
+}));
+
+import {
+ cachedBulletinSlotAuthorization,
+ getBulletinAllowanceSigner,
+ getBulletinSlotAuthorization,
+} from "./bulletin.js";
+
+// A 32-byte public key (filled with 1) deterministically encodes to a known
+// SS58 — we only assert it is non-empty, since the encoding is the SDK's job.
+const PUBLIC_KEY = new Uint8Array(32).fill(1);
+const SLOT_SIGNER = { publicKey: PUBLIC_KEY } as any;
+
+const ENV_HINT = /playground init/;
+
+function sessionSigner(): ResolvedSigner {
+ return {
+ source: "session",
+ address: "5Owner",
+ signer: {} as any,
+ userSession: {} as any,
+ adapter: {} as any,
+ destroy() {},
+ };
}
-let root: string | null = null;
+function devSigner(): ResolvedSigner {
+ return {
+ source: "dev",
+ address: "5Dev",
+ signer: { publicKey: PUBLIC_KEY } as any,
+ destroy() {},
+ };
+}
-beforeEach(async () => {
- root = await mkdtemp(join(tmpdir(), "playground-cli-allowances-"));
- process.env.POLKADOT_ROOT = root;
+beforeEach(() => {
checkAuthorizationMock.mockReset();
+ createSlotAccountSignerMock.mockReset();
+ ensureSlotAccountSignerMock.mockReset();
+ requestResourceAllocationMock.mockReset();
});
-afterEach(async () => {
- delete process.env.POLKADOT_ROOT;
- if (root) await rm(root, { recursive: true, force: true });
- root = null;
-});
-
-describe("Bulletin allowance authorization", () => {
- it("checks the slot account address derived from the returned private key", async () => {
- checkAuthorizationMock.mockResolvedValue({
- authorized: true,
- remainingTransactions: 1,
- remainingBytes: 100n,
- expiration: 1,
- });
-
- await expect(hasUsableBulletinSlotAuthorization({} as any, KEY, 50)).resolves.toBe(true);
- expect(checkAuthorizationMock).toHaveBeenCalledWith(
- {},
- "5EsNLFaGe9XK5LzWH3i6eC2Wqv6YqZS1442N1C4yeSdP6uxy",
- );
+describe("getBulletinAllowanceSigner", () => {
+ it("passes through the local signer for dev/SURI deploys without any SDK calls", async () => {
+ const dev = devSigner();
+ const signer = await getBulletinAllowanceSigner({ publishSigner: dev });
+ expect(signer).toBe(dev.signer);
+ expect(ensureSlotAccountSignerMock).not.toHaveBeenCalled();
+ expect(requestResourceAllocationMock).not.toHaveBeenCalled();
});
- it("rejects missing transaction or byte allowance", async () => {
- checkAuthorizationMock.mockResolvedValueOnce({
- authorized: true,
- remainingTransactions: 0,
- remainingBytes: 100n,
- expiration: 1,
- });
- await expect(hasUsableBulletinSlotAuthorization({} as any, KEY, 50)).resolves.toBe(false);
-
- checkAuthorizationMock.mockResolvedValueOnce({
- authorized: true,
- remainingTransactions: 1,
- remainingBytes: 49n,
- expiration: 1,
- });
- await expect(hasUsableBulletinSlotAuthorization({} as any, KEY, 50)).resolves.toBe(false);
+ it("throws the init hint when there is no session/adapter", async () => {
+ await expect(
+ getBulletinAllowanceSigner({
+ publishSigner: {
+ source: "session",
+ address: "5Owner",
+ signer: {} as any,
+ destroy() {},
+ },
+ }),
+ ).rejects.toThrow(ENV_HINT);
});
- it("uses a cached slot key when it has enough Bulletin authorization", async () => {
- await storeSlotAccountKey(ENV, OWNER, "BulletInAllowance", KEY);
- checkAuthorizationMock.mockResolvedValueOnce({
+ it("returns the slot signer when its on-chain authorization is usable", async () => {
+ ensureSlotAccountSignerMock.mockResolvedValue(SLOT_SIGNER);
+ checkAuthorizationMock.mockResolvedValue({
authorized: true,
remainingTransactions: 1,
remainingBytes: 100n,
expiration: 1,
});
+
const signer = await getBulletinAllowanceSigner({
- env: ENV,
- ownerAddress: OWNER,
- publishSigner: {
- source: "session",
- address: OWNER,
- signer: {} as any,
- destroy() {},
- },
+ publishSigner: sessionSigner(),
bulletinApi: {} as any,
requiredBytes: 50,
});
- expect(signer.publicKey).toHaveLength(32);
+ expect(signer).toBe(SLOT_SIGNER);
+ expect(requestResourceAllocationMock).not.toHaveBeenCalled();
});
- it("normalizes and uses a mobile-returned slot key when none is cached", async () => {
- const owner = `${OWNER}-mobile`;
- const requestResourceAllocation = vi.fn(async () => ({
- isErr: () => false,
- value: [
- {
- tag: "Allocated",
- value: {
- tag: "BulletInAllowance",
- value: { slotAccountKey: MOBILE_KEY },
- },
- },
- ],
- }));
- checkAuthorizationMock.mockResolvedValueOnce({
- authorized: true,
- remainingTransactions: 1,
- remainingBytes: 100n,
- expiration: 1,
- });
- await expect(readSlotAccountKey(ENV, owner, "BulletInAllowance")).resolves.toBeNull();
+ it("returns the slot signer without checking authorization when no bulletinApi is supplied", async () => {
+ ensureSlotAccountSignerMock.mockResolvedValue(SLOT_SIGNER);
- const signer = await getBulletinAllowanceSigner({
- env: ENV,
- ownerAddress: owner,
- publishSigner: {
- source: "session",
- address: owner,
- signer: {} as any,
- userSession: { requestResourceAllocation } as any,
- destroy() {},
- },
- bulletinApi: {} as any,
- requiredBytes: 50,
- });
+ const signer = await getBulletinAllowanceSigner({ publishSigner: sessionSigner() });
- expect(requestResourceAllocation).toHaveBeenCalledWith({
- callingProductId: "playground.dot",
- resources: [{ tag: "BulletInAllowance", value: undefined }],
- onExisting: "Ignore",
- });
- expect(signer.publicKey).toHaveLength(32);
- await expect(readSlotAccountKey(ENV, owner, "BulletInAllowance")).resolves.toEqual(KEY);
+ expect(signer).toBe(SLOT_SIGNER);
+ expect(checkAuthorizationMock).not.toHaveBeenCalled();
});
- it("requests an additional Bulletin slot when cached authorization lacks quota", async () => {
- await storeSlotAccountKey(ENV, OWNER, "BulletInAllowance", KEY);
- const requestResourceAllocation = vi.fn(async () => ({
- isErr: () => false,
- value: [
- {
- tag: "Allocated",
- value: {
- tag: "BulletInAllowance",
- value: { slotAccountKey: MOBILE_KEY },
- },
- },
- ],
- }));
+ it("requests an Increase once when the slot is authorized but out of quota, then succeeds", async () => {
+ ensureSlotAccountSignerMock.mockResolvedValue(SLOT_SIGNER);
+ requestResourceAllocationMock.mockResolvedValue([]);
checkAuthorizationMock
.mockResolvedValueOnce({
authorized: true,
@@ -194,84 +148,42 @@ describe("Bulletin allowance authorization", () => {
});
const signer = await getBulletinAllowanceSigner({
- env: ENV,
- ownerAddress: OWNER,
- publishSigner: {
- source: "session",
- address: OWNER,
- signer: {} as any,
- userSession: { requestResourceAllocation } as any,
- destroy() {},
- },
+ publishSigner: sessionSigner(),
bulletinApi: {} as any,
requiredBytes: 50,
});
- expect(requestResourceAllocation).toHaveBeenCalledWith({
- callingProductId: "playground.dot",
- resources: [{ tag: "BulletInAllowance", value: undefined }],
- onExisting: "Increase",
- });
- expect(signer.publicKey).toHaveLength(32);
+ expect(signer).toBe(SLOT_SIGNER);
+ expect(requestResourceAllocationMock).toHaveBeenCalledTimes(1);
+ expect(requestResourceAllocationMock).toHaveBeenCalledWith(
+ expect.anything(),
+ expect.anything(),
+ [{ tag: "BulletInAllowance", value: undefined }],
+ { onExisting: "Increase" },
+ );
});
- it("syncs with mobile when the cached slot key is not authorized", async () => {
- await storeSlotAccountKey(ENV, OWNER, "BulletInAllowance", KEY);
- const requestResourceAllocation = vi.fn(async () => ({
- isErr: () => false,
- value: [
- {
- tag: "Allocated",
- value: {
- tag: "BulletInAllowance",
- value: { slotAccountKey: MOBILE_KEY_2 },
- },
- },
- ],
- }));
- checkAuthorizationMock
- .mockResolvedValueOnce({
- authorized: false,
- remainingTransactions: 0,
- remainingBytes: 0n,
- expiration: 0,
- })
- .mockResolvedValueOnce({
- authorized: true,
- remainingTransactions: 1,
- remainingBytes: 100n,
- expiration: 1,
- });
-
- const signer = await getBulletinAllowanceSigner({
- env: ENV,
- ownerAddress: OWNER,
- publishSigner: {
- source: "session",
- address: OWNER,
- signer: {} as any,
- userSession: { requestResourceAllocation } as any,
- destroy() {},
- },
- bulletinApi: {} as any,
- requiredBytes: 50,
+ it("throws the quota error when still unusable after an Increase", async () => {
+ ensureSlotAccountSignerMock.mockResolvedValue(SLOT_SIGNER);
+ requestResourceAllocationMock.mockResolvedValue([]);
+ checkAuthorizationMock.mockResolvedValue({
+ authorized: true,
+ remainingTransactions: 0,
+ remainingBytes: 100n,
+ expiration: 1,
});
- expect(requestResourceAllocation).toHaveBeenCalledWith({
- callingProductId: "playground.dot",
- resources: [{ tag: "BulletInAllowance", value: undefined }],
- onExisting: "Ignore",
- });
- expect(signer.publicKey).toHaveLength(32);
- await expect(readSlotAccountKey(ENV, OWNER, "BulletInAllowance")).resolves.toEqual(KEY_2);
+ await expect(
+ getBulletinAllowanceSigner({
+ publishSigner: sessionSigner(),
+ bulletinApi: {} as any,
+ requiredBytes: 50,
+ }),
+ ).rejects.toThrow(/does not have enough quota/);
});
- it("points back to mobile approval when the cached slot key is not authorized", async () => {
- await storeSlotAccountKey(ENV, OWNER, "BulletInAllowance", KEY);
- const requestResourceAllocation = vi.fn(async () => ({
- isErr: () => false,
- value: [{ tag: "Rejected", value: undefined }],
- }));
+ it("throws the not-authorized error when the slot is not authorized on-chain", async () => {
+ ensureSlotAccountSignerMock.mockResolvedValue(SLOT_SIGNER);
checkAuthorizationMock.mockResolvedValue({
authorized: false,
remainingTransactions: 0,
@@ -281,23 +193,54 @@ describe("Bulletin allowance authorization", () => {
await expect(
getBulletinAllowanceSigner({
- env: ENV,
- ownerAddress: OWNER,
- publishSigner: {
- source: "session",
- address: OWNER,
- signer: {} as any,
- userSession: { requestResourceAllocation } as any,
- destroy() {},
- },
+ publishSigner: sessionSigner(),
bulletinApi: {} as any,
requiredBytes: 50,
}),
- ).rejects.toThrow(/Re-run `playground init` and approve on your phone/);
- expect(requestResourceAllocation).toHaveBeenCalledWith({
- callingProductId: "playground.dot",
- resources: [{ tag: "BulletInAllowance", value: undefined }],
- onExisting: "Ignore",
+ ).rejects.toThrow(/not authorized on-chain yet/);
+ // Never authorized → no Increase attempt (Increase only fires when authorized).
+ expect(requestResourceAllocationMock).not.toHaveBeenCalled();
+ });
+});
+
+describe("cachedBulletinSlotAuthorization", () => {
+ it("returns null on a cache miss without touching the wire", async () => {
+ createSlotAccountSignerMock.mockResolvedValue(null);
+
+ const result = await cachedBulletinSlotAuthorization({} as any, {} as any, 1);
+
+ expect(result).toBeNull();
+ expect(checkAuthorizationMock).not.toHaveBeenCalled();
+ });
+
+ it("returns the on-chain authorization for a cached slot key", async () => {
+ createSlotAccountSignerMock.mockResolvedValue(SLOT_SIGNER);
+ checkAuthorizationMock.mockResolvedValue({
+ authorized: true,
+ remainingTransactions: 1,
+ remainingBytes: 100n,
+ expiration: 1,
});
+
+ const result = await cachedBulletinSlotAuthorization({} as any, {} as any, 50);
+
+ expect(result?.usable).toBe(true);
+ });
+});
+
+describe("getBulletinSlotAuthorization", () => {
+ it("encodes the signer public key and flags usability", async () => {
+ checkAuthorizationMock.mockResolvedValue({
+ authorized: true,
+ remainingTransactions: 1,
+ remainingBytes: 100n,
+ expiration: 1,
+ });
+
+ const result = await getBulletinSlotAuthorization({} as any, SLOT_SIGNER, 50);
+
+ expect(result.usable).toBe(true);
+ expect(result.address).toMatch(/^5/);
+ expect(checkAuthorizationMock).toHaveBeenCalledWith({}, result.address);
});
});
diff --git a/src/utils/allowances/bulletin.ts b/src/utils/allowances/bulletin.ts
index cd3c857..0e6f373 100644
--- a/src/utils/allowances/bulletin.ts
+++ b/src/utils/allowances/bulletin.ts
@@ -14,29 +14,31 @@
// limitations under the License.
import type { PolkadotSigner } from "polkadot-api";
-import { checkAuthorization, type BulletinApi } from "@parity/product-sdk-bulletin";
-import { PLAYGROUND_PRODUCT_ID, type Env } from "../../config.js";
-import type { ResolvedSigner } from "../signer.js";
+import { ss58Encode } from "@parity/product-sdk-address";
+import {
+ checkAuthorization,
+ type AuthorizationStatus,
+ type CloudStorageApi,
+} from "@parity/product-sdk-cloud-storage";
import {
createSlotAccountSigner,
- getSlotAccountAddress,
- readSlotAccountKey,
- storeSlotAccountKeysFromOutcomes,
-} from "./slotKeys.js";
-import { requestResourceAllocation, type AllocationOutcome } from "./host.js";
+ ensureSlotAccountSigner,
+ requestResourceAllocation,
+ type AllocatableResource,
+} from "@parity/product-sdk-terminal/host";
+import type { ResolvedSigner } from "../signer.js";
+
+const BULLETIN_RESOURCE: AllocatableResource = { tag: "BulletInAllowance", value: undefined };
+
+const INIT_HINT = 'Run "playground init" to grant allowances.';
export interface BulletinAllowanceSignerOptions {
- env: Env;
- ownerAddress: string;
publishSigner: ResolvedSigner;
- bulletinApi?: BulletinApi;
+ bulletinApi?: CloudStorageApi;
requiredBytes?: number;
}
-function hasUsableAuthorization(
- status: Awaited>,
- requiredBytes = 0,
-): boolean {
+function hasUsableAuthorization(status: AuthorizationStatus, requiredBytes = 0): boolean {
return (
status.authorized &&
status.remainingTransactions > 0 &&
@@ -45,86 +47,54 @@ function hasUsableAuthorization(
}
export interface BulletinSlotAuthorization {
- slotAccountKey: Uint8Array;
address: string;
- status: Awaited>;
+ status: AuthorizationStatus;
usable: boolean;
}
-export async function hasUsableBulletinSlotAuthorization(
- bulletinApi: BulletinApi,
- slotAccountKey: Uint8Array,
- requiredBytes = 0,
-): Promise {
- const authorization = await getBulletinSlotAuthorization(
- bulletinApi,
- slotAccountKey,
- requiredBytes,
- );
- return authorization.usable;
-}
-
+/** On-chain authorization status of a slot signer's account. */
export async function getBulletinSlotAuthorization(
- bulletinApi: BulletinApi,
- slotAccountKey: Uint8Array,
+ bulletinApi: CloudStorageApi,
+ slotSigner: PolkadotSigner,
requiredBytes = 0,
): Promise {
- const address = getSlotAccountAddress(slotAccountKey);
+ const address = ss58Encode(slotSigner.publicKey);
const status = await checkAuthorization(bulletinApi, address);
- return {
- slotAccountKey,
- address,
- status,
- usable: hasUsableAuthorization(status, requiredBytes),
- };
+ return { address, status, usable: hasUsableAuthorization(status, requiredBytes) };
}
-function allocatedBulletinKey(outcomes: AllocationOutcome[]): Uint8Array | null {
- for (const outcome of outcomes) {
- if (outcome.tag !== "Allocated") continue;
- const value = outcome.value as
- | { tag?: string; value?: { slotAccountKey?: Uint8Array } }
- | undefined;
- if (value?.tag !== "BulletInAllowance") continue;
- return value.value?.slotAccountKey instanceof Uint8Array
- ? value.value.slotAccountKey
- : null;
- }
- return null;
+/**
+ * Authorization status of the CACHED Bulletin slot key, without going over
+ * the wire to the phone. Returns null when no slot key is cached yet —
+ * callers treat that as "needs a grant". Used by `playground init` to decide
+ * whether to skip the approval dialog.
+ */
+export async function cachedBulletinSlotAuthorization(
+ adapter: NonNullable,
+ bulletinApi: CloudStorageApi,
+ requiredBytes = 0,
+): Promise {
+ const slotSigner = await createSlotAccountSigner(adapter, BULLETIN_RESOURCE);
+ if (!slotSigner) return null;
+ return getBulletinSlotAuthorization(bulletinApi, slotSigner, requiredBytes);
}
-async function requestBulletinAllowanceKey(
- { env, ownerAddress, publishSigner }: BulletinAllowanceSignerOptions,
- onExisting: "Ignore" | "Increase",
-): Promise {
- if (!publishSigner.userSession) {
- throw new Error(
- 'No Bulletin allowance account cached. Run "playground init" to grant allowances.',
- );
+function requireSession(publishSigner: ResolvedSigner) {
+ const { userSession, adapter } = publishSigner;
+ if (!userSession || !adapter) {
+ throw new Error(`No Bulletin allowance account available. ${INIT_HINT}`);
}
-
- const outcomes = await requestResourceAllocation(
- publishSigner.userSession,
- PLAYGROUND_PRODUCT_ID,
- [{ tag: "BulletInAllowance", value: undefined }],
- onExisting,
- );
- await storeSlotAccountKeysFromOutcomes(env, ownerAddress, outcomes);
-
- const key = allocatedBulletinKey(outcomes);
- const cached = await readSlotAccountKey(env, ownerAddress, "BulletInAllowance");
- if (cached) return cached;
-
- if (key) return key;
- const outcome = outcomes[0];
- throw new Error(
- `Bulletin allowance allocation ${outcome?.tag ?? "returned no outcome"}. Re-run \`playground init\` and approve on your phone.`,
- );
+ return { userSession, adapter };
}
+/**
+ * Resolve the signer used for Bulletin `TransactionStorage.store` calls
+ * (metadata uploads). Slot allocation, key caching and signer construction
+ * are all the SDK's (`@parity/product-sdk-terminal/host`); this function owns
+ * the QUOTA check: verify the slot's on-chain authorization and, when the
+ * allowance is exhausted, make a single `Increase` retry on the phone.
+ */
export async function getBulletinAllowanceSigner({
- env,
- ownerAddress,
publishSigner,
bulletinApi,
requiredBytes,
@@ -133,43 +103,33 @@ export async function getBulletinAllowanceSigner({
// supplied a local key and owns making sure it has Bulletin allowance.
if (publishSigner.source === "dev") return publishSigner.signer;
- let key = await readSlotAccountKey(env, ownerAddress, "BulletInAllowance");
- if (!key) {
- key = await requestBulletinAllowanceKey(
- { env, ownerAddress, publishSigner, bulletinApi, requiredBytes },
- "Ignore",
- );
- }
+ const { userSession, adapter } = requireSession(publishSigner);
- if (!bulletinApi) return createSlotAccountSigner(key);
+ // Cache hit → local sr25519 signer; miss → one phone approval.
+ let slotSigner = await ensureSlotAccountSigner(userSession, adapter, BULLETIN_RESOURCE);
+ if (!bulletinApi) return slotSigner;
- let authorization = await getBulletinSlotAuthorization(bulletinApi, key, requiredBytes);
- if (!authorization.usable && !authorization.status.authorized) {
- key = await requestBulletinAllowanceKey(
- { env, ownerAddress, publishSigner, bulletinApi, requiredBytes },
- "Ignore",
- );
- authorization = await getBulletinSlotAuthorization(bulletinApi, key, requiredBytes);
- }
+ let authorization = await getBulletinSlotAuthorization(bulletinApi, slotSigner, requiredBytes);
if (!authorization.usable && authorization.status.authorized) {
- key = await requestBulletinAllowanceKey(
- { env, ownerAddress, publishSigner, bulletinApi, requiredBytes },
- "Increase",
- );
- authorization = await getBulletinSlotAuthorization(bulletinApi, key, requiredBytes);
+ // Slot exists on-chain but quota is exhausted: ask for one more slot.
+ await requestResourceAllocation(userSession, adapter, [BULLETIN_RESOURCE], {
+ onExisting: "Increase",
+ });
+ slotSigner = await ensureSlotAccountSigner(userSession, adapter, BULLETIN_RESOURCE);
+ authorization = await getBulletinSlotAuthorization(bulletinApi, slotSigner, requiredBytes);
}
if (!authorization.usable) {
- const address = authorization.address;
+ const { address, status } = authorization;
throw new Error(
- authorization.status.authorized
+ status.authorized
? `Bulletin allowance for ${address} is live but does not have enough quota. Re-run \`playground init\` and approve on your phone.`
- : `Bulletin allowance account ${address} is not authorized. Re-run \`playground init\` and approve on your phone.`,
+ : `Bulletin allowance account ${address} is not authorized on-chain yet. Re-run \`playground init\` and approve on your phone.`,
);
}
- return createSlotAccountSigner(authorization.slotAccountKey);
+ return slotSigner;
}
export function isInvalidPaymentError(err: unknown): boolean {
diff --git a/src/utils/allowances/host.test.ts b/src/utils/allowances/host.test.ts
deleted file mode 100644
index 8bc36db..0000000
--- a/src/utils/allowances/host.test.ts
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import { describe, expect, it, vi } from "vitest";
-import {
- PLAYGROUND_RESOURCES,
- requestResourceAllocation,
- summarizeOutcomes,
- type AllocatableResource,
- type AllocationOutcome,
-} from "./host.js";
-
-describe("PLAYGROUND_RESOURCES", () => {
- it("requests mobile-granted Bulletin + StatementStore + SmartContract resources by default", () => {
- const tags = PLAYGROUND_RESOURCES.map((r) => r.tag);
- expect(tags).toContain("BulletInAllowance");
- expect(tags).toContain("StatementStoreAllowance");
- expect(tags).toContain("SmartContractAllowance");
- });
-
- it("uses derivation index 0 for the SmartContractAllowance (default product account)", () => {
- const smartContract = PLAYGROUND_RESOURCES.find((r) => r.tag === "SmartContractAllowance");
- expect(smartContract).toBeDefined();
- expect(smartContract?.value).toBe(0);
- });
-});
-
-describe("summarizeOutcomes", () => {
- const resources: AllocatableResource[] = [
- { tag: "BulletInAllowance", value: undefined },
- { tag: "StatementStoreAllowance", value: undefined },
- { tag: "SmartContractAllowance", value: 0 },
- ];
-
- it("buckets all three outcome shapes", () => {
- const outcomes: AllocationOutcome[] = [
- {
- tag: "Allocated",
- value: { tag: "BulletInAllowance", value: { slotAccountKey: new Uint8Array() } },
- },
- { tag: "Rejected", value: undefined },
- { tag: "NotAvailable", value: undefined },
- ];
- const { granted, rejected, unavailable } = summarizeOutcomes(outcomes, resources);
- expect(granted.map((r) => r.tag)).toEqual(["BulletInAllowance"]);
- expect(rejected.map((r) => r.tag)).toEqual(["StatementStoreAllowance"]);
- expect(unavailable.map((r) => r.tag)).toEqual(["SmartContractAllowance"]);
- });
-
- it("drops outcomes that have no matching resource (defensive against host mis-ordered responses)", () => {
- const outcomes: AllocationOutcome[] = [
- {
- tag: "Allocated",
- value: { tag: "BulletInAllowance", value: { slotAccountKey: new Uint8Array() } },
- },
- { tag: "Rejected", value: undefined },
- { tag: "NotAvailable", value: undefined },
- {
- tag: "Allocated",
- value: {
- tag: "AutoSigning",
- value: { productDerivationSecret: "", productRootPrivateKey: new Uint8Array() },
- },
- },
- ];
- const summary = summarizeOutcomes(outcomes, resources);
- expect(summary.granted.length + summary.rejected.length + summary.unavailable.length).toBe(
- 3,
- );
- });
-
- it("returns empty buckets when there are no outcomes", () => {
- const summary = summarizeOutcomes([], []);
- expect(summary.granted).toEqual([]);
- expect(summary.rejected).toEqual([]);
- expect(summary.unavailable).toEqual([]);
- });
-});
-
-describe("requestResourceAllocation", () => {
- it("forwards `callingProductId`, `resources`, and `onExisting: 'Ignore'` to the session", async () => {
- const calls: unknown[] = [];
- const fakeSession = {
- requestResourceAllocation: vi.fn(async (req: unknown) => {
- calls.push(req);
- return {
- isErr: () => false,
- value: [
- {
- tag: "Allocated",
- value: {
- tag: "BulletInAllowance",
- value: { slotAccountKey: new Uint8Array() },
- },
- },
- ],
- };
- }),
- } as unknown as Parameters[0];
-
- const outcomes = await requestResourceAllocation(fakeSession, "playground42.dot", [
- { tag: "BulletInAllowance", value: undefined },
- ]);
-
- expect(calls).toEqual([
- {
- callingProductId: "playground42.dot",
- resources: [{ tag: "BulletInAllowance", value: undefined }],
- onExisting: "Ignore",
- },
- ]);
- expect(outcomes[0].tag).toBe("Allocated");
- });
-
- it("throws a wrapped error when the session returns an error result", async () => {
- const fakeSession = {
- requestResourceAllocation: vi.fn(async () => ({
- isErr: () => true,
- error: new Error("statement store unreachable"),
- })),
- } as unknown as Parameters[0];
-
- await expect(
- requestResourceAllocation(fakeSession, "playground42.dot", []),
- ).rejects.toThrow(/statement store unreachable/);
- });
-
- it("uses PLAYGROUND_RESOURCES when no explicit list is supplied", async () => {
- let captured: { resources?: unknown } = {};
- const fakeSession = {
- requestResourceAllocation: vi.fn(async (req: { resources: unknown }) => {
- captured = req;
- return { isErr: () => false, value: [] };
- }),
- } as unknown as Parameters[0];
-
- await requestResourceAllocation(fakeSession, "playground42.dot");
- expect(captured.resources).toEqual(PLAYGROUND_RESOURCES);
- });
-});
diff --git a/src/utils/allowances/host.ts b/src/utils/allowances/host.ts
deleted file mode 100644
index 929580f..0000000
--- a/src/utils/allowances/host.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Thin wrapper over the RFC-0010 `host_request_resource_allocation` call.
- *
- * `@parity/product-sdk-terminal@0.2.1` does not yet re-export this API at its
- * package root, but the underlying `UserSession` (from `@novasamatech/host-papp`)
- * exposes `requestResourceAllocation()`. We call it directly here and gate the
- * shape locally so the rest of the CLI stays decoupled from the deep import
- * path. Replace this whole module with a `product-sdk-terminal` re-export once
- * the SDK surfaces the same call.
- *
- * Wire format (SCALE-derived, mirrors host-papp's
- * `dist/sso/sessionManager/scale/resourceAllocation.d.ts`):
- * request → { callingProductId, resources: AllocatableResource[], onExisting }
- * response → AllocationOutcome[] (one per resource, in order)
- *
- * The mobile app handles `hostRequestResourceAllocation` in
- * `AllowanceHostCalls.kt` and routes the user through an approval UI.
- */
-
-import type { UserSession } from "@parity/product-sdk-terminal";
-
-/**
- * Structural mirror of host-papp's `ApAllocatableResource` codec type. We
- * declare it locally because host-papp's package root doesn't re-export the
- * codec types yet — when it does (and product-sdk-terminal threads them
- * through) this can be replaced with a direct import.
- *
- * StatementStoreAllowance — write to the SSS (host_chat, allowance ring).
- * BulletInAllowance — write to Bulletin (TransactionStorage.store).
- * SmartContractAllowance — PGAS sponsoring for Revive contract calls.
- * The `value` is the derivation index of the
- * product account (0 for the default playground
- * account).
- * AutoSigning — surrender the product-account signing key to
- * the host so it can sign on the user's behalf
- * without per-call prompts. Not used today.
- */
-export type AllocatableResource =
- | { tag: "StatementStoreAllowance"; value: undefined }
- | { tag: "BulletInAllowance"; value: undefined }
- | { tag: "SmartContractAllowance"; value: number }
- | { tag: "AutoSigning"; value: undefined };
-
-/**
- * Outcome of one allocation. We don't read the inner `Allocated` payload
- * (allowance slot keys, derivation secrets) — the host stores them and uses
- * them transparently on subsequent calls. We just need the tag to know
- * whether the allocation succeeded.
- */
-export type AllocationOutcome =
- | { tag: "Allocated"; value: unknown }
- | { tag: "Rejected"; value: undefined }
- | { tag: "NotAvailable"; value: undefined };
-
-/** Tag-only view, handy for downstream code that doesn't care about payloads. */
-export type ResourceTag = AllocatableResource["tag"];
-
-export type OnExistingAllowancePolicy = "Ignore" | "Increase";
-
-/** Default mobile-granted resource set for the playground product. */
-export const PLAYGROUND_RESOURCES: AllocatableResource[] = [
- { tag: "BulletInAllowance", value: undefined },
- { tag: "StatementStoreAllowance", value: undefined },
- // derivation index 0 = playground42.dot's default product account.
- { tag: "SmartContractAllowance", value: 0 },
-];
-
-/**
- * Send a `host_request_resource_allocation` request over the user's active
- * session. The host (mobile wallet) prompts the user to approve and returns
- * one outcome per requested resource in order.
- *
- * Throws on transport-level failures (Statement Store unreachable, encryption
- * error, etc.). Per-resource refusals are reported as `Rejected`/`NotAvailable`
- * outcomes — callers inspect the array to decide whether to proceed.
- */
-export async function requestResourceAllocation(
- session: UserSession,
- productId: string,
- resources: AllocatableResource[] = PLAYGROUND_RESOURCES,
- onExisting: OnExistingAllowancePolicy = "Ignore",
-): Promise {
- const result = await session.requestResourceAllocation({
- callingProductId: productId,
- resources,
- onExisting,
- });
- if (result.isErr()) {
- throw new Error(`Resource allocation request failed: ${result.error.message}`);
- }
- return result.value as AllocationOutcome[];
-}
-
-export interface AllocationSummary {
- granted: AllocatableResource[];
- rejected: AllocatableResource[];
- unavailable: AllocatableResource[];
-}
-
-/**
- * Bucket allocation outcomes by tag. Order-sensitive: `outcomes[i]` maps to
- * `resources[i]`. Outcomes without a matching resource are silently dropped.
- */
-export function summarizeOutcomes(
- outcomes: AllocationOutcome[],
- resources: AllocatableResource[],
-): AllocationSummary {
- const granted: AllocatableResource[] = [];
- const rejected: AllocatableResource[] = [];
- const unavailable: AllocatableResource[] = [];
- outcomes.forEach((outcome, i) => {
- const resource = resources[i];
- if (!resource) return;
- if (outcome.tag === "Allocated") granted.push(resource);
- else if (outcome.tag === "Rejected") rejected.push(resource);
- else unavailable.push(resource);
- });
- return { granted, rejected, unavailable };
-}
diff --git a/src/utils/allowances/marker.test.ts b/src/utils/allowances/marker.test.ts
deleted file mode 100644
index 73fc3df..0000000
--- a/src/utils/allowances/marker.test.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
-import { tmpdir } from "node:os";
-import { join } from "node:path";
-import { afterEach, beforeEach, describe, expect, it } from "vitest";
-import { _internal, clearForEnv, hasAllowance, markAllowance } from "./marker.js";
-
-const ADDR = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
-
-let tempRoot: string;
-let originalPolkadotRoot: string | undefined;
-
-beforeEach(async () => {
- tempRoot = await mkdtemp(join(tmpdir(), "allowances-marker-"));
- originalPolkadotRoot = process.env.POLKADOT_ROOT;
- process.env.POLKADOT_ROOT = tempRoot;
-});
-
-afterEach(async () => {
- if (originalPolkadotRoot === undefined) {
- delete process.env.POLKADOT_ROOT;
- } else {
- process.env.POLKADOT_ROOT = originalPolkadotRoot;
- }
- await rm(tempRoot, { recursive: true, force: true });
-});
-
-describe("hasAllowance / markAllowance", () => {
- it("returns false when no marker file exists yet", async () => {
- expect(await hasAllowance("paseo-next-v2", ADDR, "BulletInAllowance")).toBe(false);
- });
-
- it("returns true after markAllowance for the same env+address+resource", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- expect(await hasAllowance("paseo-next-v2", ADDR, "BulletInAllowance")).toBe(true);
- });
-
- it("isolates markers per env (paseo-next vs paseo-next-v2)", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- expect(await hasAllowance("paseo-next", ADDR, "BulletInAllowance")).toBe(false);
- });
-
- it("isolates markers per resource (BulletIn vs StatementStore)", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- expect(await hasAllowance("paseo-next-v2", ADDR, "StatementStoreAllowance")).toBe(false);
- });
-
- it("isolates markers per address", async () => {
- const otherAddr = "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty";
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- expect(await hasAllowance("paseo-next-v2", otherAddr, "BulletInAllowance")).toBe(false);
- });
-
- it("persists multiple resources for the same address", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- await markAllowance("paseo-next-v2", ADDR, "StatementStoreAllowance");
- await markAllowance("paseo-next-v2", ADDR, "SmartContractAllowance");
- expect(await hasAllowance("paseo-next-v2", ADDR, "BulletInAllowance")).toBe(true);
- expect(await hasAllowance("paseo-next-v2", ADDR, "StatementStoreAllowance")).toBe(true);
- expect(await hasAllowance("paseo-next-v2", ADDR, "SmartContractAllowance")).toBe(true);
- });
-
- it("writes the marker file at $POLKADOT_ROOT/allowances.json", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- const path = _internal.getMarkerPath();
- expect(path).toBe(join(tempRoot, "allowances.json"));
- const raw = await readFile(path, "utf8");
- const parsed = JSON.parse(raw);
- expect(parsed.version).toBe(1);
- expect(parsed.envs["paseo-next-v2"][ADDR].BulletInAllowance.source).toBe("host");
- expect(typeof parsed.envs["paseo-next-v2"][ADDR].BulletInAllowance.grantedAt).toBe(
- "number",
- );
- });
-
- it("records `alice` as source when supplied (legacy testnet path)", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance", "alice");
- const parsed = JSON.parse(await readFile(_internal.getMarkerPath(), "utf8"));
- expect(parsed.envs["paseo-next-v2"][ADDR].BulletInAllowance.source).toBe("alice");
- });
-
- // The parse-error branch in `loadFile` is straightforward (try/catch around
- // JSON.parse, fall through to EMPTY). The dedicated test for that branch
- // was flaky against vitest's test-pool — multiple `it`s in the same file
- // appear to share fs state in a way that's not isolated by `mkdtemp` +
- // per-test `process.env.POLKADOT_ROOT` mutations. Skipping until a cleaner
- // isolation pattern lands; behavior is exercised in practice every time a
- // user edits the file by hand.
- it.skip("treats a corrupt marker file as empty (no throw, no data leaked)", async () => {
- await markAllowance("paseo-next-v2", "5seed", "BulletInAllowance");
- await writeFile(_internal.getMarkerPath(), "not json", { mode: 0o600 });
- expect(await hasAllowance("paseo-next-v2", ADDR, "BulletInAllowance")).toBe(false);
- });
-});
-
-describe("clearForEnv", () => {
- it("removes only markers for the given env", async () => {
- await markAllowance("paseo-next-v2", ADDR, "BulletInAllowance");
- await markAllowance("paseo-next", ADDR, "BulletInAllowance");
- await clearForEnv("paseo-next-v2");
- expect(await hasAllowance("paseo-next-v2", ADDR, "BulletInAllowance")).toBe(false);
- expect(await hasAllowance("paseo-next", ADDR, "BulletInAllowance")).toBe(true);
- });
-
- it("is a no-op when the env has no markers", async () => {
- await expect(clearForEnv("paseo-next-v2")).resolves.toBeUndefined();
- });
-});
diff --git a/src/utils/allowances/marker.ts b/src/utils/allowances/marker.ts
deleted file mode 100644
index d5eb11f..0000000
--- a/src/utils/allowances/marker.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Local cache of "we already asked the host for allowance X on env Y for
- * address Z". RFC-0010 provides no on-chain query for allowance status, so
- * we persist a marker after a successful grant. Slot-account resources also
- * need the secret key cached in `allowance-keys.json`; callers that need to
- * sign must check both files before skipping the host round-trip.
- *
- * Stored at `$POLKADOT_ROOT/allowances.json` (default `~/.polkadot/`), mode
- * 0600, sibling to `accounts.json`. Keyed `env → ss58Address → resourceTag`
- * so switching env doesn't surface markers from another env.
- */
-
-import { promises as fs } from "node:fs";
-import { homedir } from "node:os";
-import { join } from "node:path";
-import type { Env } from "../../config.js";
-import type { ResourceTag } from "./host.js";
-
-// Resolved lazily so tests can override `POLKADOT_ROOT` per case. Reading
-// `process.env` at module-load time would freeze the path before tests get a
-// chance to point it at a temp dir.
-function getRootDir(): string {
- return process.env.POLKADOT_ROOT ?? join(homedir(), ".polkadot");
-}
-
-function getMarkerPath(): string {
- return join(getRootDir(), "allowances.json");
-}
-
-interface ResourceEntry {
- grantedAt: number;
- /** "host" = RFC-0010 path, "alice" = legacy Alice-attested testnet path (retained for backfill). */
- source: "host" | "alice";
-}
-
-interface MarkerFile {
- version: 1;
- envs: Partial>>>>;
-}
-
-function emptyFile(): MarkerFile {
- return { version: 1, envs: {} };
-}
-
-async function loadFile(): Promise {
- let raw: string;
- try {
- raw = await fs.readFile(getMarkerPath(), "utf8");
- } catch (err: unknown) {
- if ((err as NodeJS.ErrnoException)?.code === "ENOENT") return emptyFile();
- throw err;
- }
- try {
- const parsed = JSON.parse(raw) as MarkerFile;
- if (parsed && parsed.version === 1 && parsed.envs && typeof parsed.envs === "object") {
- return parsed;
- }
- } catch {
- // Corrupt file — fall through and treat as empty. The next save
- // will overwrite. We intentionally don't surface the parse error
- // because the marker is best-effort UX, not load-bearing state.
- }
- return emptyFile();
-}
-
-async function saveFile(file: MarkerFile): Promise {
- await fs.mkdir(getRootDir(), { recursive: true, mode: 0o700 });
- await fs.writeFile(getMarkerPath(), JSON.stringify(file, null, 2), { mode: 0o600 });
-}
-
-export async function hasAllowance(
- env: Env,
- address: string,
- resource: ResourceTag,
-): Promise {
- const file = await loadFile();
- return Boolean(file.envs[env]?.[address]?.[resource]);
-}
-
-export async function markAllowance(
- env: Env,
- address: string,
- resource: ResourceTag,
- source: ResourceEntry["source"] = "host",
-): Promise {
- const file = await loadFile();
- const envBucket = file.envs[env] ?? {};
- const addrBucket = envBucket[address] ?? {};
- addrBucket[resource] = { grantedAt: Date.now(), source };
- envBucket[address] = addrBucket;
- file.envs[env] = envBucket;
- await saveFile(file);
-}
-
-export async function clearForEnv(env: Env): Promise {
- const file = await loadFile();
- if (!file.envs[env]) return;
- delete file.envs[env];
- await saveFile(file);
-}
-
-/** Visible for tests; not part of the public API. @internal */
-export const _internal = { getMarkerPath, loadFile, saveFile };
diff --git a/src/utils/allowances/resources.test.ts b/src/utils/allowances/resources.test.ts
new file mode 100644
index 0000000..97c6eaa
--- /dev/null
+++ b/src/utils/allowances/resources.test.ts
@@ -0,0 +1,65 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import type { ApAllocationOutcome } from "@parity/product-sdk-terminal/host";
+import { describe, expect, test } from "vitest";
+import { PLAYGROUND_RESOURCES, describeResource, summarizeOutcomes } from "./resources.js";
+
+// `ApAllocationOutcome`'s `Allocated.value` is the materialized resource
+// payload (not `undefined`), so we build minimal valid literals. Only the
+// `tag` matters to `summarizeOutcomes`; the inner payload is never read.
+const allocated: ApAllocationOutcome = {
+ tag: "Allocated",
+ value: { tag: "BulletInAllowance", value: { slotAccountKey: new Uint8Array(32) } },
+};
+const rejected: ApAllocationOutcome = { tag: "Rejected", value: undefined };
+const notAvailable: ApAllocationOutcome = { tag: "NotAvailable", value: undefined };
+
+describe("PLAYGROUND_RESOURCES", () => {
+ test("requests all three resources: Bulletin, StatementStore, SmartContract(0)", () => {
+ expect(PLAYGROUND_RESOURCES.map((r) => r.tag)).toEqual([
+ "BulletInAllowance",
+ "StatementStoreAllowance",
+ "SmartContractAllowance",
+ ]);
+ const sc = PLAYGROUND_RESOURCES.find((r) => r.tag === "SmartContractAllowance");
+ expect(sc?.value).toBe(0);
+ });
+});
+
+describe("summarizeOutcomes", () => {
+ test("buckets outcomes by tag, order-sensitive", () => {
+ const summary = summarizeOutcomes(
+ [allocated, rejected, notAvailable],
+ PLAYGROUND_RESOURCES,
+ );
+ expect(summary.granted.map((r) => r.tag)).toEqual(["BulletInAllowance"]);
+ expect(summary.rejected.map((r) => r.tag)).toEqual(["StatementStoreAllowance"]);
+ expect(summary.unavailable.map((r) => r.tag)).toEqual(["SmartContractAllowance"]);
+ });
+
+ test("drops outcomes without a matching resource", () => {
+ const summary = summarizeOutcomes([allocated, allocated], [PLAYGROUND_RESOURCES[0]]);
+ expect(summary.granted).toHaveLength(1);
+ });
+});
+
+describe("describeResource", () => {
+ test("human labels", () => {
+ expect(describeResource({ tag: "BulletInAllowance", value: undefined })).toMatch(
+ /bulletin/i,
+ );
+ });
+});
diff --git a/src/utils/allowances/resources.ts b/src/utils/allowances/resources.ts
new file mode 100644
index 0000000..67c3b2d
--- /dev/null
+++ b/src/utils/allowances/resources.ts
@@ -0,0 +1,77 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * CLI-local glue around `@parity/product-sdk-terminal/host`'s RFC-0010 types.
+ * The wire call, slot-key caching (`~/.polkadot-apps/_AllowanceKeys.json`)
+ * and slot signers all live in the SDK now — the only things kept here are the
+ * playground's resource set and pure display helpers.
+ */
+
+import type { AllocatableResource, ApAllocationOutcome } from "@parity/product-sdk-terminal/host";
+
+/**
+ * The full mobile-granted resource set for the playground product:
+ * Bulletin storage, Statement Store, and PGAS sponsoring for Revive
+ * contract calls (derivation index 0 = the default playground account).
+ * All three are requested in ONE `requestResourceAllocation` call so the
+ * user sees a single approval dialog during `playground init`.
+ */
+export const PLAYGROUND_RESOURCES: AllocatableResource[] = [
+ { tag: "BulletInAllowance", value: undefined },
+ { tag: "StatementStoreAllowance", value: undefined },
+ { tag: "SmartContractAllowance", value: 0 },
+];
+
+export interface AllocationSummary {
+ granted: AllocatableResource[];
+ rejected: AllocatableResource[];
+ unavailable: AllocatableResource[];
+}
+
+/**
+ * Bucket allocation outcomes by tag. Order-sensitive: `outcomes[i]` maps to
+ * `resources[i]`. Outcomes without a matching resource are silently dropped.
+ */
+export function summarizeOutcomes(
+ outcomes: ApAllocationOutcome[],
+ resources: AllocatableResource[],
+): AllocationSummary {
+ const granted: AllocatableResource[] = [];
+ const rejected: AllocatableResource[] = [];
+ const unavailable: AllocatableResource[] = [];
+ outcomes.forEach((outcome, i) => {
+ const resource = resources[i];
+ if (!resource) return;
+ if (outcome.tag === "Allocated") granted.push(resource);
+ else if (outcome.tag === "Rejected") rejected.push(resource);
+ else unavailable.push(resource);
+ });
+ return { granted, rejected, unavailable };
+}
+
+/** Human-readable name for a resource tag, used in failure messages. */
+export function describeResource(resource: AllocatableResource): string {
+ switch (resource.tag) {
+ case "BulletInAllowance":
+ return "Bulletin storage";
+ case "StatementStoreAllowance":
+ return "Statement Store";
+ case "SmartContractAllowance":
+ return `smart-contract gas (idx ${resource.value})`;
+ case "AutoSigning":
+ return "auto-signing";
+ }
+}
diff --git a/src/utils/allowances/slotKeys.test.ts b/src/utils/allowances/slotKeys.test.ts
deleted file mode 100644
index 962d4e2..0000000
--- a/src/utils/allowances/slotKeys.test.ts
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import { mkdtemp, readFile, rm } from "node:fs/promises";
-import { tmpdir } from "node:os";
-import { join } from "node:path";
-import { secretFromSeed } from "@scure/sr25519";
-import { afterEach, beforeEach, describe, expect, it } from "vitest";
-import {
- _internal,
- createSlotAccountSigner,
- extractSlotAccountKey,
- getOrCreateSlotAccountKey,
- hasSlotAccountKey,
- readSlotAccountKey,
- storeSlotAccountKey,
- storeSlotAccountKeysFromOutcomes,
-} from "./slotKeys.js";
-import type { AllocationOutcome } from "./host.js";
-
-const ADDR = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
-const KEY = secretFromSeed(new Uint8Array(32).fill(7));
-const KEY_2 = secretFromSeed(new Uint8Array(32).fill(8));
-const MINI_SECRET = new Uint8Array(32).fill(9);
-
-function schnorrkelBytesFromScureSecret(secret: Uint8Array): Uint8Array {
- const raw = new Uint8Array(secret);
- let carry = 0;
- for (let i = 31; i >= 0; i--) {
- const value = secret[i] + carry * 256;
- raw[i] = value >> 3;
- carry = value & 0x07;
- }
- return raw;
-}
-
-let tempRoot: string;
-let originalPolkadotRoot: string | undefined;
-
-beforeEach(async () => {
- tempRoot = await mkdtemp(join(tmpdir(), "allowances-keys-"));
- originalPolkadotRoot = process.env.POLKADOT_ROOT;
- process.env.POLKADOT_ROOT = tempRoot;
-});
-
-afterEach(async () => {
- if (originalPolkadotRoot === undefined) {
- delete process.env.POLKADOT_ROOT;
- } else {
- process.env.POLKADOT_ROOT = originalPolkadotRoot;
- }
- await rm(tempRoot, { recursive: true, force: true });
-});
-
-describe("slot account key cache", () => {
- it("stores and reads a key scoped by env/address/resource", async () => {
- await storeSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance", KEY);
-
- expect(await hasSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance")).toBe(true);
- expect(await readSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance")).toEqual(KEY);
- expect(await hasSlotAccountKey("paseo-next", ADDR, "BulletInAllowance")).toBe(false);
- expect(await hasSlotAccountKey("paseo-next-v2", ADDR, "StatementStoreAllowance")).toBe(
- false,
- );
- });
-
- it("writes the key file under $POLKADOT_ROOT", async () => {
- await storeSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance", KEY);
-
- expect(_internal.getKeyPath()).toBe(join(tempRoot, "allowance-keys.json"));
- const parsed = JSON.parse(await readFile(_internal.getKeyPath(), "utf8"));
- expect(parsed.envs["paseo-next-v2"][ADDR].BulletInAllowance.slotAccountKey).toMatch(
- /^0x[0-9a-f]+$/,
- );
- });
-
- it("extracts and stores normalized slot account keys from allocation outcomes", async () => {
- const mobileKey = schnorrkelBytesFromScureSecret(KEY);
- const mobileKey2 = schnorrkelBytesFromScureSecret(KEY_2);
- const outcomes: AllocationOutcome[] = [
- {
- tag: "Allocated",
- value: { tag: "BulletInAllowance", value: { slotAccountKey: mobileKey } },
- },
- {
- tag: "Allocated",
- value: { tag: "StatementStoreAllowance", value: { slotAccountKey: mobileKey2 } },
- },
- { tag: "Allocated", value: { tag: "SmartContractAllowance", value: undefined } },
- ];
-
- expect(extractSlotAccountKey(outcomes, "BulletInAllowance")).toEqual(KEY);
- await storeSlotAccountKeysFromOutcomes("paseo-next-v2", ADDR, outcomes);
- expect(await readSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance")).toEqual(KEY);
- expect(await readSlotAccountKey("paseo-next-v2", ADDR, "StatementStoreAllowance")).toEqual(
- KEY_2,
- );
- });
-
- it("preserves sibling slot keys when multiple resources are returned at once", async () => {
- // Regression guard: the previous implementation looped via
- // Promise.all(...storeSlotAccountKey) and each save read+wrote
- // the file, so concurrent saves clobbered each other's writes
- // and the second-returned sibling key would be dropped. The
- // batched read-modify-write must keep both keys.
- const otherKey = secretFromSeed(new Uint8Array(32).fill(13));
- const mobileKey = schnorrkelBytesFromScureSecret(KEY);
- const otherMobileKey = schnorrkelBytesFromScureSecret(otherKey);
- const outcomes: AllocationOutcome[] = [
- {
- tag: "Allocated",
- value: { tag: "BulletInAllowance", value: { slotAccountKey: mobileKey } },
- },
- {
- tag: "Allocated",
- value: {
- tag: "StatementStoreAllowance",
- value: { slotAccountKey: otherMobileKey },
- },
- },
- ];
-
- await storeSlotAccountKeysFromOutcomes("paseo-next-v2", ADDR, outcomes);
-
- expect(await readSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance")).toEqual(KEY);
- expect(await readSlotAccountKey("paseo-next-v2", ADDR, "StatementStoreAllowance")).toEqual(
- otherKey,
- );
- });
-
- it("creates a signer from a raw slot account key", async () => {
- const signer = createSlotAccountSigner(KEY);
-
- expect(signer.publicKey).toHaveLength(32);
- await expect(signer.signBytes(new Uint8Array([1, 2, 3]))).resolves.toHaveLength(64);
- });
-
- it("creates a signer from a 32-byte mini-secret slot account key", async () => {
- const signer = createSlotAccountSigner(MINI_SECRET);
-
- expect(signer.publicKey).toHaveLength(32);
- await expect(signer.signBytes(new Uint8Array([1, 2, 3]))).resolves.toHaveLength(64);
- });
-
- it("creates and then reuses a local slot key when none is cached", async () => {
- const first = await getOrCreateSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance");
- const second = await getOrCreateSlotAccountKey("paseo-next-v2", ADDR, "BulletInAllowance");
-
- expect(first).toHaveLength(64);
- expect(second).toEqual(first);
- });
-});
diff --git a/src/utils/allowances/slotKeys.ts b/src/utils/allowances/slotKeys.ts
deleted file mode 100644
index 6f579de..0000000
--- a/src/utils/allowances/slotKeys.ts
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Host-side cache for RFC-0010 slot-account keys.
- *
- * This is intentionally small and isolated so it can be replaced by a
- * product-sdk-terminal host/preimage helper once the SDK owns terminal
- * allowance-key persistence. Until then the CLI is the Host for terminal
- * sessions: it stores scoped allowance private keys from mobile or locally
- * generated slot keys that users authorize manually, then uses them to sign
- * Bulletin/SSS submissions.
- */
-
-import { randomBytes } from "node:crypto";
-import { promises as fs } from "node:fs";
-import { homedir } from "node:os";
-import { join } from "node:path";
-import { getPublicKey, secretFromSeed, sign } from "@scure/sr25519";
-import { AccountId } from "polkadot-api";
-import { toHex, fromHex } from "polkadot-api/utils";
-import { getPolkadotSigner } from "polkadot-api/signer";
-import type { PolkadotSigner } from "polkadot-api";
-import type { Env } from "../../config.js";
-import type { AllocationOutcome, ResourceTag } from "./host.js";
-
-export type SlotAccountResourceTag = Extract<
- ResourceTag,
- "BulletInAllowance" | "StatementStoreAllowance"
->;
-
-const SLOT_KEY_RESOURCES: readonly SlotAccountResourceTag[] = [
- "BulletInAllowance",
- "StatementStoreAllowance",
-];
-
-interface KeyEntry {
- slotAccountKey: `0x${string}`;
- storedAt: number;
-}
-
-interface KeyFile {
- version: 1;
- envs: Partial>>>>;
-}
-
-const EMPTY: KeyFile = { version: 1, envs: {} };
-
-function getRootDir(): string {
- return process.env.POLKADOT_ROOT ?? join(homedir(), ".polkadot");
-}
-
-function getKeyPath(): string {
- return join(getRootDir(), "allowance-keys.json");
-}
-
-async function loadFile(): Promise {
- let raw: string;
- try {
- raw = await fs.readFile(getKeyPath(), "utf8");
- } catch (err: unknown) {
- if ((err as NodeJS.ErrnoException)?.code === "ENOENT") return { ...EMPTY };
- throw err;
- }
- try {
- const parsed = JSON.parse(raw) as KeyFile;
- if (parsed && parsed.version === 1 && parsed.envs && typeof parsed.envs === "object") {
- return parsed;
- }
- } catch {
- // Treat a corrupt cache as empty. The Account Holder can return the
- // existing allocation key again under OnExisting=Ignore.
- }
- return { ...EMPTY };
-}
-
-async function saveFile(file: KeyFile): Promise {
- await fs.mkdir(getRootDir(), { recursive: true, mode: 0o700 });
- await fs.writeFile(getKeyPath(), `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
-}
-
-function isSlotAccountResource(tag: ResourceTag): tag is SlotAccountResourceTag {
- return SLOT_KEY_RESOURCES.includes(tag as SlotAccountResourceTag);
-}
-
-function normalizeSlotAccountKey(key: Uint8Array): Uint8Array {
- if (key.length !== 32 && key.length !== 64) {
- throw new Error(
- `Expected 32-byte sr25519 mini-secret or 64-byte slot account key, got ${key.length} bytes`,
- );
- }
- return new Uint8Array(key);
-}
-
-function encodeSchnorrkelScalarForScure(secret: Uint8Array): Uint8Array {
- const encoded = new Uint8Array(32);
- let carry = 0;
- for (let i = 0; i < 32; i++) {
- const value = secret[i] * 8 + carry;
- encoded[i] = value & 0xff;
- carry = value >> 8;
- }
- return encoded;
-}
-
-function normalizeSchnorrkelSecretKeyBytes(secret: Uint8Array): Uint8Array {
- const normalized = new Uint8Array(secret);
- normalized.set(encodeSchnorrkelScalarForScure(secret.subarray(0, 32)), 0);
- return normalized;
-}
-
-function normalizeAllocatedSlotAccountKey(key: Uint8Array): Uint8Array {
- const normalized = normalizeSlotAccountKey(key);
- if (normalized.length === 32) return normalized;
-
- // Account Protocol mobile implementations hand over schnorrkel
- // `SecretKey::to_bytes()` material. @scure/sr25519 signs with the
- // `to_ed25519_bytes()` scalar representation, so normalize the scalar
- // half before caching keys returned by `requestResourceAllocation`.
- return normalizeSchnorrkelSecretKeyBytes(normalized);
-}
-
-function slotAccountSigningSecret(key: Uint8Array): Uint8Array {
- const normalized = normalizeSlotAccountKey(key);
- return normalized.length === 32 ? secretFromSeed(normalized) : normalized;
-}
-
-export async function readSlotAccountKey(
- env: Env,
- address: string,
- resource: SlotAccountResourceTag,
-): Promise {
- const entry = (await loadFile()).envs[env]?.[address]?.[resource];
- if (!entry) return null;
- try {
- return normalizeSlotAccountKey(fromHex(entry.slotAccountKey));
- } catch {
- return null;
- }
-}
-
-export async function hasSlotAccountKey(
- env: Env,
- address: string,
- resource: SlotAccountResourceTag,
-): Promise {
- return (await readSlotAccountKey(env, address, resource)) !== null;
-}
-
-export async function storeSlotAccountKey(
- env: Env,
- address: string,
- resource: SlotAccountResourceTag,
- key: Uint8Array,
-): Promise {
- const file = await loadFile();
- const envBucket = file.envs[env] ?? {};
- const addrBucket = envBucket[address] ?? {};
- addrBucket[resource] = {
- slotAccountKey: toHex(normalizeSlotAccountKey(key)) as `0x${string}`,
- storedAt: Date.now(),
- };
- envBucket[address] = addrBucket;
- file.envs[env] = envBucket;
- await saveFile(file);
-}
-
-export async function getOrCreateSlotAccountKey(
- env: Env,
- address: string,
- resource: SlotAccountResourceTag,
-): Promise {
- const existing = await readSlotAccountKey(env, address, resource);
- if (existing) return existing;
- const key = secretFromSeed(randomBytes(32));
- await storeSlotAccountKey(env, address, resource, key);
- return key;
-}
-
-export function extractSlotAccountKey(
- outcomes: AllocationOutcome[],
- resource: SlotAccountResourceTag,
-): Uint8Array | null {
- for (const outcome of outcomes) {
- if (outcome.tag !== "Allocated") continue;
- const allocated = outcome.value as
- | { tag?: ResourceTag; value?: { slotAccountKey?: Uint8Array } }
- | undefined;
- if (allocated?.tag !== resource) continue;
- const key = allocated.value?.slotAccountKey;
- return key instanceof Uint8Array ? normalizeAllocatedSlotAccountKey(key) : null;
- }
- return null;
-}
-
-export async function storeSlotAccountKeysFromOutcomes(
- env: Env,
- address: string,
- outcomes: AllocationOutcome[],
-): Promise {
- // Single read-modify-write so two slot keys returned in one call
- // (e.g. BulletInAllowance + StatementStoreAllowance) can't race —
- // the old `Promise.all([...storeSlotAccountKey])` pattern had each
- // call load the file, mutate one resource, save the file; the
- // saves would interleave and the second write would clobber the
- // first slot key.
- const file = await loadFile();
- // One timestamp for the whole batch — these keys all came from the same
- // `requestResourceAllocation` round-trip and represent one cohort.
- const storedAt = Date.now();
- let mutated = false;
-
- for (const outcome of outcomes) {
- if (outcome.tag !== "Allocated") continue;
- const allocated = outcome.value as
- | { tag?: ResourceTag; value?: { slotAccountKey?: Uint8Array } }
- | undefined;
- if (!allocated?.tag || !isSlotAccountResource(allocated.tag)) continue;
- const key = allocated.value?.slotAccountKey;
- if (!(key instanceof Uint8Array)) continue;
-
- const envBucket = file.envs[env] ?? {};
- const addrBucket = envBucket[address] ?? {};
- addrBucket[allocated.tag] = {
- slotAccountKey: toHex(normalizeAllocatedSlotAccountKey(key)) as `0x${string}`,
- storedAt,
- };
- envBucket[address] = addrBucket;
- file.envs[env] = envBucket;
- mutated = true;
- }
-
- if (mutated) await saveFile(file);
-}
-
-export function createSlotAccountSigner(slotAccountKey: Uint8Array): PolkadotSigner {
- const secret = slotAccountSigningSecret(slotAccountKey);
- const publicKey = getPublicKey(secret);
- return getPolkadotSigner(publicKey, "Sr25519", (payload) => sign(secret, payload));
-}
-
-export function getSlotAccountAddress(slotAccountKey: Uint8Array): string {
- return AccountId().dec(getPublicKey(slotAccountSigningSecret(slotAccountKey)));
-}
-
-/** Visible for tests; not part of the public API. @internal */
-export const _internal = {
- getKeyPath,
- loadFile,
- saveFile,
- normalizeAllocatedSlotAccountKey,
- normalizeSchnorrkelSecretKeyBytes,
-};
diff --git a/src/utils/allowances/smartContracts.test.ts b/src/utils/allowances/smartContracts.test.ts
index d57e29a..d71f04f 100644
--- a/src/utils/allowances/smartContracts.test.ts
+++ b/src/utils/allowances/smartContracts.test.ts
@@ -13,104 +13,93 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { mkdtemp, rm } from "node:fs/promises";
-import { tmpdir } from "node:os";
-import { join } from "node:path";
-import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+import { beforeEach, describe, expect, it, vi } from "vitest";
import type { ResolvedSigner } from "../signer.js";
-import { hasAllowance, markAllowance } from "./marker.js";
-import { ensureSmartContractAllowance } from "./smartContracts.js";
-
-const ENV = "paseo-next-v2";
-const OWNER = "5Owner";
-let root: string | null = null;
+const { getCachedAllocationMock, requestResourceAllocationMock } = vi.hoisted(() => ({
+ getCachedAllocationMock: vi.fn(),
+ requestResourceAllocationMock: vi.fn(),
+}));
-beforeEach(async () => {
- root = await mkdtemp(join(tmpdir(), "playground-cli-smart-contract-allowance-"));
- process.env.POLKADOT_ROOT = root;
-});
+vi.mock("@parity/product-sdk-terminal/host", () => ({
+ getCachedAllocation: getCachedAllocationMock,
+ requestResourceAllocation: requestResourceAllocationMock,
+}));
-afterEach(async () => {
- delete process.env.POLKADOT_ROOT;
- if (root) await rm(root, { recursive: true, force: true });
- root = null;
-});
+import { ensureSmartContractAllowance } from "./smartContracts.js";
-function makeSigner(requestResourceAllocation?: ReturnType): ResolvedSigner {
+function sessionSigner(): ResolvedSigner {
return {
source: "session",
- address: OWNER,
+ address: "5Owner",
signer: {} as any,
- userSession: requestResourceAllocation ? ({ requestResourceAllocation } as any) : undefined,
+ userSession: {} as any,
+ adapter: {} as any,
destroy() {},
};
}
+beforeEach(() => {
+ getCachedAllocationMock.mockReset();
+ requestResourceAllocationMock.mockReset();
+});
+
describe("ensureSmartContractAllowance", () => {
- it("skips local dev signers", async () => {
+ it("skips local dev signers without any SDK calls", async () => {
const deploySigner: ResolvedSigner = {
source: "dev",
- address: OWNER,
+ address: "5Dev",
signer: {} as any,
destroy() {},
};
+ await expect(ensureSmartContractAllowance({ deploySigner })).resolves.toBeUndefined();
+ expect(getCachedAllocationMock).not.toHaveBeenCalled();
+ expect(requestResourceAllocationMock).not.toHaveBeenCalled();
+ });
+
+ it("throws the init hint when there is no session/adapter", async () => {
await expect(
- ensureSmartContractAllowance({ env: ENV, ownerAddress: OWNER, deploySigner }),
- ).resolves.toBeUndefined();
+ ensureSmartContractAllowance({
+ deploySigner: {
+ source: "session",
+ address: "5Owner",
+ signer: {} as any,
+ destroy() {},
+ },
+ }),
+ ).rejects.toThrow(/playground init/);
});
- it("uses an existing allowance marker without prompting mobile", async () => {
- const requestResourceAllocation = vi.fn();
- await markAllowance(ENV, OWNER, "SmartContractAllowance");
+ it("uses a cached allocation without going over the wire", async () => {
+ getCachedAllocationMock.mockResolvedValue({ tag: "SmartContractAllowance", dest: 0 });
- await ensureSmartContractAllowance({
- env: ENV,
- ownerAddress: OWNER,
- deploySigner: makeSigner(requestResourceAllocation),
- });
+ await ensureSmartContractAllowance({ deploySigner: sessionSigner() });
- expect(requestResourceAllocation).not.toHaveBeenCalled();
+ expect(requestResourceAllocationMock).not.toHaveBeenCalled();
});
- it("requests and marks a missing mobile smart-contract allowance", async () => {
- const requestResourceAllocation = vi.fn(async () => ({
- isErr: () => false,
- value: [
- {
- tag: "Allocated",
- value: { tag: "SmartContractAllowance", value: undefined },
- },
- ],
- }));
-
- await ensureSmartContractAllowance({
- env: ENV,
- ownerAddress: OWNER,
- deploySigner: makeSigner(requestResourceAllocation),
- });
-
- expect(requestResourceAllocation).toHaveBeenCalledWith({
- callingProductId: "playground.dot",
- resources: [{ tag: "SmartContractAllowance", value: 0 }],
- onExisting: "Ignore",
- });
- await expect(hasAllowance(ENV, OWNER, "SmartContractAllowance")).resolves.toBe(true);
+ it("requests a missing smart-contract allowance and succeeds on Allocated", async () => {
+ getCachedAllocationMock.mockResolvedValue(null);
+ requestResourceAllocationMock.mockResolvedValue([
+ { tag: "Allocated", value: { tag: "SmartContractAllowance", value: undefined } },
+ ]);
+
+ await ensureSmartContractAllowance({ deploySigner: sessionSigner() });
+
+ expect(requestResourceAllocationMock).toHaveBeenCalledWith(
+ expect.anything(),
+ expect.anything(),
+ [{ tag: "SmartContractAllowance", value: 0 }],
+ );
});
it("throws an actionable error when mobile denies the allowance", async () => {
- const requestResourceAllocation = vi.fn(async () => ({
- isErr: () => false,
- value: [{ tag: "Rejected", value: undefined }],
- }));
+ getCachedAllocationMock.mockResolvedValue(null);
+ requestResourceAllocationMock.mockResolvedValue([{ tag: "Rejected", value: undefined }]);
await expect(
- ensureSmartContractAllowance({
- env: ENV,
- ownerAddress: OWNER,
- deploySigner: makeSigner(requestResourceAllocation),
- }),
+ ensureSmartContractAllowance({ deploySigner: sessionSigner() }),
).rejects.toThrow(/Smart-contract gas allowance allocation Rejected/);
});
});
diff --git a/src/utils/allowances/smartContracts.ts b/src/utils/allowances/smartContracts.ts
index d7daf4f..0145279 100644
--- a/src/utils/allowances/smartContracts.ts
+++ b/src/utils/allowances/smartContracts.ts
@@ -13,10 +13,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { PLAYGROUND_PRODUCT_ID, type Env } from "../../config.js";
+import {
+ getCachedAllocation,
+ requestResourceAllocation,
+ type AllocatableResource,
+} from "@parity/product-sdk-terminal/host";
import type { ResolvedSigner } from "../signer.js";
-import { requestResourceAllocation, summarizeOutcomes, type AllocatableResource } from "./host.js";
-import { hasAllowance, markAllowance } from "./marker.js";
const SMART_CONTRACT_ALLOWANCE: AllocatableResource = {
tag: "SmartContractAllowance",
@@ -24,40 +26,35 @@ const SMART_CONTRACT_ALLOWANCE: AllocatableResource = {
};
export interface SmartContractAllowanceOptions {
- env: Env;
- ownerAddress: string;
deploySigner: ResolvedSigner;
}
+/**
+ * Make sure the session has a PGAS smart-contract allowance for the default
+ * playground product account. The SDK cache entry doubles as the grant
+ * marker — it's only written after the wallet returns `Allocated`.
+ */
export async function ensureSmartContractAllowance({
- env,
- ownerAddress,
deploySigner,
}: SmartContractAllowanceOptions): Promise {
if (deploySigner.source === "dev") return;
- if (await hasAllowance(env, ownerAddress, "SmartContractAllowance")) return;
-
- if (!deploySigner.userSession) {
+ const { userSession, adapter } = deploySigner;
+ if (!userSession || !adapter) {
throw new Error(
- 'No smart-contract gas allowance cached. Run "playground init" to grant allowances.',
+ 'No smart-contract gas allowance available. Run "playground init" to grant allowances.',
);
}
- const outcomes = await requestResourceAllocation(
- deploySigner.userSession,
- PLAYGROUND_PRODUCT_ID,
- [SMART_CONTRACT_ALLOWANCE],
- );
- const summary = summarizeOutcomes(outcomes, [SMART_CONTRACT_ALLOWANCE]);
+ if (await getCachedAllocation(adapter, SMART_CONTRACT_ALLOWANCE)) return;
- if (summary.granted.some((resource) => resource.tag === "SmartContractAllowance")) {
- await markAllowance(env, ownerAddress, "SmartContractAllowance", "host");
- return;
- }
+ const outcomes = await requestResourceAllocation(userSession, adapter, [
+ SMART_CONTRACT_ALLOWANCE,
+ ]);
+ const outcome = outcomes[0];
+ if (outcome?.tag === "Allocated") return;
- const outcome = outcomes[0]?.tag ?? "returned no outcome";
throw new Error(
- `Smart-contract gas allowance allocation ${outcome}. Re-run \`playground init\` and approve on your phone.`,
+ `Smart-contract gas allowance allocation ${outcome?.tag ?? "returned no outcome"}. Re-run \`playground init\` and approve on your phone.`,
);
}
diff --git a/src/utils/auth.test.ts b/src/utils/auth.test.ts
index 7f9e9e7..0ebeafa 100644
--- a/src/utils/auth.test.ts
+++ b/src/utils/auth.test.ts
@@ -27,6 +27,7 @@ import { join } from "node:path";
import {
clearLocalAppStorage,
deriveSessionAddresses,
+ isStaleSessionDecodeError,
waitForLogout,
type LogoutHandle,
type LogoutStatus,
@@ -467,3 +468,30 @@ describe("deriveSessionAddresses", () => {
);
});
});
+
+describe("isStaleSessionDecodeError", () => {
+ /**
+ * `loadSessions` shows STALE_SESSION_MESSAGE only for decode/shape
+ * failures (a session persisted by a pre-novasama-0.8 CLI). Transport
+ * failures must re-throw verbatim so connectivity problems aren't
+ * misreported as "log out and pair again".
+ */
+ it("classifies SCALE/decode failures as stale", () => {
+ expect(isStaleSessionDecodeError(new Error("SCALE: unexpected end of input"))).toBe(true);
+ expect(isStaleSessionDecodeError(new Error("failed to decode StoredUserSession"))).toBe(
+ true,
+ );
+ expect(isStaleSessionDecodeError(new Error("JSON Parse error: invalid byte"))).toBe(true);
+ });
+
+ it("lets transport-level failures through untouched", () => {
+ expect(isStaleSessionDecodeError(new Error("statement store unreachable"))).toBe(false);
+ expect(isStaleSessionDecodeError(new Error("WS halt (3)"))).toBe(false);
+ expect(isStaleSessionDecodeError(new Error("connection timed out"))).toBe(false);
+ });
+
+ it("handles non-Error throwables", () => {
+ expect(isStaleSessionDecodeError("scale codec mismatch")).toBe(true);
+ expect(isStaleSessionDecodeError(42)).toBe(false);
+ });
+});
diff --git a/src/utils/auth.ts b/src/utils/auth.ts
index 139cf0a..8bab22d 100644
--- a/src/utils/auth.ts
+++ b/src/utils/auth.ts
@@ -80,11 +80,52 @@ export interface SessionAddresses {
function createAdapter(): TerminalAdapter {
return createTerminalAdapter({
appId: DAPP_ID,
- metadataUrl: TERMINAL_METADATA_URL,
endpoints: getChainConfig().peopleEndpoints,
+ // `metadataUrl` exists via our patch on product-sdk-terminal (see
+ // patches/): it forwards into the V1 pairing QR's metadata field,
+ // which the phone fetches to render the Sign-In screen. Required
+ // while the @novasamatech 0.7.9 mobile-compat pin is active.
+ metadataUrl: TERMINAL_METADATA_URL,
});
}
+export const STALE_SESSION_MESSAGE =
+ 'Stored login session could not be read — it may have been written by a different app version. Run "playground logout" and then "playground init" to pair again.';
+
+/**
+ * Classify a `waitForSessions` failure: decode/shape failures (a stored
+ * session the current codec can't read) get the stale-session hint;
+ * transport-level failures (statement store unreachable) re-throw verbatim.
+ * Deliberately matches on message text — host-papp doesn't expose typed
+ * decode errors. Exported for tests.
+ *
+ * @internal
+ */
+export function isStaleSessionDecodeError(err: unknown): boolean {
+ const msg = err instanceof Error ? err.message : String(err);
+ return /decode|scale|unexpected|invalid|parse/i.test(msg);
+}
+
+/**
+ * `waitForSessions` with stale-session translation. Purely defensive on the
+ * current `@novasamatech@0.7.9` pin (its session format matches what released
+ * CLIs wrote), but any future wire/storage bump can leave sessions on disk
+ * the new codec can't decode — surface that as an actionable message instead
+ * of a raw SCALE/decode error.
+ */
+async function loadSessions(adapter: TerminalAdapter, timeoutMs?: number): Promise {
+ try {
+ return await waitForSessions(adapter, timeoutMs);
+ } catch (err) {
+ if (isStaleSessionDecodeError(err)) {
+ throw new Error(STALE_SESSION_MESSAGE, {
+ cause: err instanceof Error ? err : undefined,
+ });
+ }
+ throw err;
+ }
+}
+
function createPlaygroundSigner(session: UserSession): PolkadotSigner {
return createPlaygroundSessionSigner(session, {
productId: PLAYGROUND_PRODUCT_ID,
@@ -167,7 +208,7 @@ export interface LoginHandle {
export async function connect(): Promise {
const adapter = createAdapter();
- const sessions = await waitForSessions(adapter);
+ const sessions = await loadSessions(adapter);
if (sessions.length > 0) {
const addresses = deriveSessionAddresses(sessions[0]);
// `address` is kept for back-compat with callers that only need the
@@ -263,7 +304,7 @@ export async function waitForLogin(
},
);
if (authenticated) {
- const sessions = await waitForSessions(adapter, 3000);
+ const sessions = await loadSessions(adapter, 3000);
if (sessions.length > 0) {
const addresses = deriveSessionAddresses(sessions[0]);
address = addresses.productAddress;
@@ -307,6 +348,15 @@ export interface SessionHandle {
addresses: SessionAddresses;
signer: PolkadotSigner;
userSession: UserSession;
+ /**
+ * The live terminal adapter that owns the session. RFC-0010 host calls
+ * (`requestResourceAllocation`, `ensureSlotAccountSigner`, ...) from
+ * `@parity/product-sdk-terminal/host` take `(session, adapter)` — the
+ * adapter carries the appId + storage dir for the SDK's allowance cache.
+ * Owned by this handle: do NOT call `adapter.destroy()` directly, go
+ * through `destroy()`.
+ */
+ adapter: TerminalAdapter;
destroy(): void;
}
@@ -323,7 +373,7 @@ export interface SessionHandle {
export async function getSessionSigner(): Promise {
const adapter = createAdapter();
- const sessions = await waitForSessions(adapter, 3000);
+ const sessions = await loadSessions(adapter, 3000);
if (sessions.length === 0) {
// SDK destroy() is async and fire-and-forget is fine here because we
// have nothing else to await — pending statement-subscription
@@ -363,6 +413,7 @@ export async function getSessionSigner(): Promise {
addresses,
signer,
userSession: session,
+ adapter,
destroy,
};
}
@@ -394,7 +445,7 @@ export interface LogoutHandle {
*/
export async function findSession(): Promise {
const adapter = createAdapter();
- const sessions = await waitForSessions(adapter, 3000);
+ const sessions = await loadSessions(adapter, 3000);
if (sessions.length === 0) {
// Awaiting the async destroy() lets the SDK drain its pending
// statement-subscription unsubscribes before we return null. Wrapped
diff --git a/src/utils/contractManifest.test.ts b/src/utils/contractManifest.test.ts
index 26e10db..3ca937c 100644
--- a/src/utils/contractManifest.test.ts
+++ b/src/utils/contractManifest.test.ts
@@ -13,253 +13,80 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { describe, expect, it, beforeEach, vi } from "vitest";
-import type { CdmJson } from "@parity/product-sdk-contracts";
-import { getRegistryAddress } from "@dotdm/env";
-
-const { createContractFromClientMock, getAddressQueryMock } = vi.hoisted(() => ({
- createContractFromClientMock: vi.fn(),
- getAddressQueryMock: vi.fn(),
-}));
-
-vi.mock("@parity/product-sdk-contracts", () => ({
- createContractFromClient: (...args: unknown[]) => createContractFromClientMock(...args),
-}));
-
-vi.mock("@parity/product-sdk-descriptors/paseo-asset-hub", () => ({
- paseo_asset_hub: { genesis: "0xasset" },
-}));
-
+import { afterEach, describe, expect, it, vi } from "vitest";
import {
PLAYGROUND_REGISTRY_CONTRACT,
- resolveLiveContractAddresses,
- withLiveContractAddresses,
- withRequiredLiveContractAddresses,
+ suppressReviveTraceNoise,
+ withoutReviveTraceNoise,
} from "./contractManifest.js";
-const snapshotAddress = "0x1111111111111111111111111111111111111111";
-const liveAddress = "0x2222222222222222222222222222222222222222";
-const targetRegistryAddress = "0x5555555555555555555555555555555555555555";
-
-/**
- * Mock `Weight` for `QueryResult.gasRequired` — required (non-optional) on
- * the success branch since product-sdk-contracts@0.5.0's discriminated-union
- * shape. We don't assert on the value; it just needs to be present and shaped
- * correctly so the type narrows.
- */
-const OK_WEIGHT = { ref_time: 0n, proof_size: 0n };
+const TRACE_NOISE = "Incompatible runtime entry RuntimeCall(ReviveApi_trace_call)";
-function manifest(): CdmJson {
- return {
- targets: {
- target1: {
- "asset-hub": "wss://asset-hub.example",
- bulletin: "https://bulletin.example/ipfs",
- registry: targetRegistryAddress,
- },
- },
- dependencies: {
- target1: {
- [PLAYGROUND_REGISTRY_CONTRACT]: "latest",
- },
- },
- contracts: {
- target1: {
- [PLAYGROUND_REGISTRY_CONTRACT]: {
- version: 6,
- address: snapshotAddress,
- abi: [],
- metadataCid: "bafyregistry",
- },
- "@example/other": {
- version: 1,
- address: "0x3333333333333333333333333333333333333333",
- abi: [],
- metadataCid: "bafyother",
- },
- },
- },
- } as CdmJson;
-}
+afterEach(() => {
+ vi.restoreAllMocks();
+});
-beforeEach(() => {
- createContractFromClientMock.mockReset();
- getAddressQueryMock.mockReset();
- createContractFromClientMock.mockResolvedValue({
- getAddress: { query: getAddressQueryMock },
+describe("PLAYGROUND_REGISTRY_CONTRACT", () => {
+ it("is the playground registry library name", () => {
+ expect(PLAYGROUND_REGISTRY_CONTRACT).toBe("@w3s/playground-registry");
});
});
-describe("resolveLiveContractAddresses", () => {
- it("queries the configured CDM registry for requested libraries", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: true, value: liveAddress },
- gasRequired: OK_WEIGHT,
- });
+describe("withoutReviveTraceNoise", () => {
+ it("suppresses the known trace-call compat error while running fn", async () => {
+ const spy = vi.spyOn(console, "error").mockImplementation(() => {});
- const assetHub = {} as any;
- const addresses = await resolveLiveContractAddresses(
- assetHub,
- [PLAYGROUND_REGISTRY_CONTRACT],
- { registryAddress: targetRegistryAddress },
- );
+ const result = await withoutReviveTraceNoise(async () => {
+ console.error(`stack including ${TRACE_NOISE} here`);
+ return 42;
+ });
- expect(addresses).toEqual({ [PLAYGROUND_REGISTRY_CONTRACT]: liveAddress });
- expect(createContractFromClientMock).toHaveBeenCalledWith(
- assetHub,
- { genesis: "0xasset" },
- targetRegistryAddress,
- expect.arrayContaining([
- expect.objectContaining({ name: "getAddress", type: "function" }),
- ]),
- expect.any(Object),
- );
- expect(getAddressQueryMock).toHaveBeenCalledWith(PLAYGROUND_REGISTRY_CONTRACT);
+ expect(result).toBe(42);
+ expect(spy).not.toHaveBeenCalled();
});
- it("forwards defaultOrigin to createContractFromClient when provided", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: true, value: liveAddress },
- gasRequired: OK_WEIGHT,
- });
+ it("lets unrelated console.error through", async () => {
+ const spy = vi.spyOn(console, "error").mockImplementation(() => {});
- const assetHub = {} as any;
- const origin = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
- await resolveLiveContractAddresses(assetHub, [PLAYGROUND_REGISTRY_CONTRACT], {
- defaultOrigin: origin,
- registryAddress: targetRegistryAddress,
+ await withoutReviveTraceNoise(async () => {
+ console.error("a genuine error");
});
- expect(createContractFromClientMock).toHaveBeenCalledWith(
- assetHub,
- { genesis: "0xasset" },
- targetRegistryAddress,
- expect.any(Array),
- expect.objectContaining({ defaultOrigin: origin }),
- );
+ expect(spy).toHaveBeenCalledWith("a genuine error");
});
- it("omits libraries when the live registry has no address", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: false, value: snapshotAddress },
- gasRequired: OK_WEIGHT,
- });
-
+ it("restores the original console.error after fn throws", async () => {
+ const original = console.error;
await expect(
- resolveLiveContractAddresses({} as any, [PLAYGROUND_REGISTRY_CONTRACT], {
- registryAddress: targetRegistryAddress,
+ withoutReviveTraceNoise(async () => {
+ throw new Error("boom");
}),
- ).resolves.toEqual({});
- });
-
- it("falls back to CDM's package registry address when no registry is supplied", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: true, value: liveAddress },
- gasRequired: OK_WEIGHT,
- });
-
- await resolveLiveContractAddresses({} as any, [PLAYGROUND_REGISTRY_CONTRACT]);
-
- expect(createContractFromClientMock).toHaveBeenCalledWith(
- {},
- { genesis: "0xasset" },
- getRegistryAddress(),
- expect.any(Array),
- expect.any(Object),
- );
+ ).rejects.toThrow("boom");
+ expect(console.error).toBe(original);
});
});
-describe("withLiveContractAddresses", () => {
- it("patches only the resolved contract address and leaves the snapshot untouched", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: true, value: liveAddress },
- gasRequired: OK_WEIGHT,
- });
- const original = manifest();
-
- const patched = await withLiveContractAddresses(original, {} as any, [
- PLAYGROUND_REGISTRY_CONTRACT,
- ]);
-
- expect(patched).not.toBe(original);
- expect(patched.contracts?.target1[PLAYGROUND_REGISTRY_CONTRACT].address).toBe(liveAddress);
- expect(original.contracts?.target1[PLAYGROUND_REGISTRY_CONTRACT].address).toBe(
- snapshotAddress,
- );
- expect(patched.contracts?.target1["@example/other"].address).toBe(
- "0x3333333333333333333333333333333333333333",
- );
- });
-
- it("returns the original manifest when no live address is available", async () => {
- getAddressQueryMock.mockResolvedValue({ success: false, value: null });
- const original = manifest();
-
- await expect(
- withLiveContractAddresses(original, {} as any, [PLAYGROUND_REGISTRY_CONTRACT]),
- ).resolves.toBe(original);
- });
-
- it("throws when a required live address is unavailable", async () => {
- getAddressQueryMock.mockResolvedValue({ success: false, value: null });
-
- await expect(
- withRequiredLiveContractAddresses(manifest(), {} as any, [
- PLAYGROUND_REGISTRY_CONTRACT,
- ]),
- ).rejects.toThrow(/CDM meta-registry did not return live address/);
- });
+describe("suppressReviveTraceNoise", () => {
+ it("wraps query/tx/prepare so they swallow the trace noise", async () => {
+ const spy = vi.spyOn(console, "error").mockImplementation(() => {});
- it("forwards defaultOrigin through withLiveContractAddresses", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: true, value: liveAddress },
- gasRequired: OK_WEIGHT,
- });
-
- const assetHub = {} as any;
- const origin = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
- await withLiveContractAddresses(manifest(), assetHub, [PLAYGROUND_REGISTRY_CONTRACT], {
- defaultOrigin: origin,
- });
+ const contract = {
+ getAddress: {
+ query: async () => {
+ console.error(`leak ${TRACE_NOISE}`);
+ return "ok";
+ },
+ },
+ };
- expect(createContractFromClientMock).toHaveBeenCalledWith(
- assetHub,
- { genesis: "0xasset" },
- targetRegistryAddress,
- expect.any(Array),
- expect.objectContaining({ defaultOrigin: origin }),
- );
+ const wrapped = suppressReviveTraceNoise(contract);
+ await expect(wrapped.getAddress.query()).resolves.toBe("ok");
+ expect(spy).not.toHaveBeenCalled();
});
- it("forwards defaultOrigin through withRequiredLiveContractAddresses", async () => {
- getAddressQueryMock.mockResolvedValue({
- success: true,
- value: { isSome: true, value: liveAddress },
- gasRequired: OK_WEIGHT,
- });
-
- const assetHub = {} as any;
- const origin = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
- await withRequiredLiveContractAddresses(
- manifest(),
- assetHub,
- [PLAYGROUND_REGISTRY_CONTRACT],
- { defaultOrigin: origin },
- );
-
- expect(createContractFromClientMock).toHaveBeenCalledWith(
- assetHub,
- { genesis: "0xasset" },
- targetRegistryAddress,
- expect.any(Array),
- expect.objectContaining({ defaultOrigin: origin }),
- );
+ it("leaves non-method properties untouched", () => {
+ const contract = { address: "0xabc", getAddress: {} };
+ const wrapped = suppressReviveTraceNoise(contract);
+ expect(wrapped.address).toBe("0xabc");
});
});
diff --git a/src/utils/contractManifest.ts b/src/utils/contractManifest.ts
index d4fc327..2832024 100644
--- a/src/utils/contractManifest.ts
+++ b/src/utils/contractManifest.ts
@@ -13,43 +13,18 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import {
- createContractFromClient,
- type AbiEntry,
- type CdmJson,
-} from "@parity/product-sdk-contracts";
-import { paseo_asset_hub } from "@parity/product-sdk-descriptors/paseo-asset-hub";
-import { resolveTargetRegistryAddress } from "@dotdm/contracts";
-import { getRegistryAddress } from "@dotdm/env";
-import type { HexString, PolkadotClient } from "polkadot-api";
+/**
+ * Playground registry contract identity + Revive trace-noise suppression.
+ *
+ * Live contract-address resolution now lives natively in
+ * `@parity/product-sdk-contracts` (`ContractManager.fromLiveClient`), consumed
+ * from `registry.ts`. This module only owns the registry contract NAME and the
+ * helpers that hide the known `ReviveApi_trace_call` dry-run noise on Paseo
+ * Asset Hub.
+ */
export const PLAYGROUND_REGISTRY_CONTRACT = "@w3s/playground-registry";
-const LIVE_CONTRACTS = [PLAYGROUND_REGISTRY_CONTRACT] as const;
-
-// Keep this ABI local so live address resolution does not depend on CDM's
-// higher-level runtime package shape.
-const CDM_REGISTRY_ABI: AbiEntry[] = [
- {
- type: "function",
- name: "getAddress",
- inputs: [{ name: "contract_name", type: "string" }],
- outputs: [
- {
- name: "",
- type: "tuple",
- components: [
- { name: "isSome", type: "bool" },
- { name: "value", type: "address" },
- ],
- },
- ],
- stateMutability: "view",
- },
-];
-
-type OptionAddress = { isSome: boolean; value: HexString };
-
const REVIVE_TRACE_CALL_COMPAT_ERROR =
"Incompatible runtime entry RuntimeCall(ReviveApi_trace_call)";
@@ -98,111 +73,3 @@ export function suppressReviveTraceNoise(contract: T): T {
},
});
}
-
-function defaultTargetHash(manifest: CdmJson): string {
- const [targetHash] = Object.keys(manifest.targets);
- if (!targetHash) throw new Error("No targets found in cdm.json");
- return targetHash;
-}
-
-function defaultTarget(manifest: CdmJson): CdmJson["targets"][string] & { registry?: string } {
- const target = manifest.targets[defaultTargetHash(manifest)];
- if (!target) throw new Error("No targets found in cdm.json");
- return target;
-}
-
-function defaultRegistryAddress(manifest: CdmJson): HexString {
- return resolveTargetRegistryAddress(defaultTarget(manifest)) as HexString;
-}
-
-function patchContractAddresses(
- manifest: CdmJson,
- liveAddresses: Record,
-): CdmJson {
- if (Object.keys(liveAddresses).length === 0) return manifest;
-
- const patched = structuredClone(manifest);
- const contracts = patched.contracts?.[defaultTargetHash(patched)];
- if (!contracts) return manifest;
-
- for (const [library, address] of Object.entries(liveAddresses)) {
- const contract = contracts[library];
- if (contract) contract.address = address;
- }
-
- return patched;
-}
-
-/**
- * Options for the meta-registry lookup. `defaultOrigin` is forwarded to the
- * underlying contract handle so the read-only `getAddress` dry-run uses the
- * caller's logged-in account instead of the dev fallback (Alice). Without it,
- * `@parity/product-sdk-contracts` emits a misleading `[contracts] No origin
- * configured` warning even when the user has signed in via `dot init`.
- */
-export interface LiveContractLookupOptions {
- defaultOrigin?: string;
- registryAddress?: HexString;
-}
-
-export async function resolveLiveContractAddresses(
- assetHub: PolkadotClient,
- libraries: readonly string[] = LIVE_CONTRACTS,
- options: LiveContractLookupOptions = {},
-): Promise> {
- const registryAddress = options.registryAddress ?? (getRegistryAddress() as HexString);
- const registry = await createContractFromClient(
- assetHub,
- paseo_asset_hub,
- registryAddress,
- CDM_REGISTRY_ABI,
- { defaultOrigin: options.defaultOrigin },
- );
- const entries = await withoutReviveTraceNoise(() =>
- Promise.all(
- libraries.map(async (library): Promise => {
- const result = await registry.getAddress.query(library);
- if (!result.success) return [library, null];
- const address = result.value as OptionAddress;
- return [library, address.isSome ? address.value : null];
- }),
- ),
- );
-
- const addresses: Record = {};
- for (const [library, address] of entries) {
- if (address) addresses[library] = address;
- }
- return addresses;
-}
-
-export async function withLiveContractAddresses(
- manifest: CdmJson,
- assetHub: PolkadotClient,
- libraries: readonly string[] = LIVE_CONTRACTS,
- options: LiveContractLookupOptions = {},
-): Promise {
- const liveAddresses = await resolveLiveContractAddresses(assetHub, libraries, {
- ...options,
- registryAddress: options.registryAddress ?? defaultRegistryAddress(manifest),
- });
- return patchContractAddresses(manifest, liveAddresses);
-}
-
-export async function withRequiredLiveContractAddresses(
- manifest: CdmJson,
- assetHub: PolkadotClient,
- libraries: readonly string[] = LIVE_CONTRACTS,
- options: LiveContractLookupOptions = {},
-): Promise {
- const liveAddresses = await resolveLiveContractAddresses(assetHub, libraries, {
- ...options,
- registryAddress: options.registryAddress ?? defaultRegistryAddress(manifest),
- });
- const missing = libraries.filter((library) => !liveAddresses[library]);
- if (missing.length > 0) {
- throw new Error(`CDM meta-registry did not return live address for ${missing.join(", ")}`);
- }
-
- return patchContractAddresses(manifest, liveAddresses);
-}
diff --git a/src/utils/deploy/playground.test.ts b/src/utils/deploy/playground.test.ts
index 0f2f779..d87f4ca 100644
--- a/src/utils/deploy/playground.test.ts
+++ b/src/utils/deploy/playground.test.ts
@@ -28,7 +28,7 @@ const { captureWarningMock, withSpanMock, bulletinStorageSigner, getBulletinAllo
// Mock the metadata upload path so we never actually touch the network.
// The mock returns a fake CID that publish() treats as the metadata CID.
-vi.mock("@parity/product-sdk-bulletin", () => ({
+vi.mock("@parity/product-sdk-cloud-storage", () => ({
calculateCid: vi.fn(async () => ({ toString: (): string => "bafymeta" })),
}));
vi.mock("@parity/product-sdk-tx", () => ({
diff --git a/src/utils/deploy/playground.ts b/src/utils/deploy/playground.ts
index 60fecb3..4f06eb2 100644
--- a/src/utils/deploy/playground.ts
+++ b/src/utils/deploy/playground.ts
@@ -37,7 +37,7 @@ import { join } from "node:path";
import { createClient } from "polkadot-api";
import { getWsProvider } from "polkadot-api/ws";
import { paseo_bulletin as bulletin } from "@parity/product-sdk-descriptors/paseo-bulletin";
-import { calculateCid } from "@parity/product-sdk-bulletin";
+import { calculateCid } from "@parity/product-sdk-cloud-storage";
import { submitAndWatch, withRetry } from "@parity/product-sdk-tx";
import { getRegistryContract } from "../registry.js";
import { getConnection } from "../connection.js";
@@ -296,8 +296,6 @@ export async function publishToPlayground(
const cid = (await calculateCid(metadataBytes)).toString();
const storeTx = bulletinApi.tx.TransactionStorage.store({ data: metadataBytes });
let storageSigner = await getBulletinAllowanceSigner({
- env: options.env ?? getChainConfig().env,
- ownerAddress: options.publishSigner.address,
publishSigner: options.publishSigner,
bulletinApi,
requiredBytes: metadataBytes.length,
@@ -313,8 +311,6 @@ export async function publishToPlayground(
message: "Checking Bulletin storage allowance…",
});
storageSigner = await getBulletinAllowanceSigner({
- env: options.env ?? getChainConfig().env,
- ownerAddress: options.publishSigner.address,
publishSigner: options.publishSigner,
bulletinApi,
requiredBytes: metadataBytes.length,
diff --git a/src/utils/registry.test.ts b/src/utils/registry.test.ts
index 28c7513..c6f48ed 100644
--- a/src/utils/registry.test.ts
+++ b/src/utils/registry.test.ts
@@ -17,17 +17,14 @@ import { describe, expect, it, beforeEach, vi } from "vitest";
import type { ResolvedSigner } from "./signer.js";
import cdmJson from "../../cdm.json";
-const { fromClientMock, getContractMock, withRequiredLiveContractAddressesMock } = vi.hoisted(
- () => ({
- fromClientMock: vi.fn(),
- getContractMock: vi.fn(),
- withRequiredLiveContractAddressesMock: vi.fn(),
- }),
-);
+const { fromLiveClientMock, getContractMock } = vi.hoisted(() => ({
+ fromLiveClientMock: vi.fn(),
+ getContractMock: vi.fn(),
+}));
vi.mock("@parity/product-sdk-contracts", () => ({
ContractManager: {
- fromClient: (...args: unknown[]) => fromClientMock(...args),
+ fromLiveClient: (...args: unknown[]) => fromLiveClientMock(...args),
},
}));
@@ -35,14 +32,24 @@ vi.mock("@parity/product-sdk-descriptors/paseo-asset-hub", () => ({
paseo_asset_hub: { genesis: "0xasset" },
}));
+vi.mock("@parity/product-sdk-address", () => ({
+ ss58Encode: () => "5AliceReadOnlyOrigin",
+}));
+
+vi.mock("@parity/product-sdk-tx", () => ({
+ getDevPublicKey: () => new Uint8Array(32),
+}));
+
vi.mock("./contractManifest.js", () => ({
PLAYGROUND_REGISTRY_CONTRACT: "@w3s/playground-registry",
suppressReviveTraceNoise: (contract: unknown) => contract,
- withRequiredLiveContractAddresses: (...args: unknown[]) =>
- withRequiredLiveContractAddressesMock(...args),
+ // Pass-through wrapper so the live resolution runs unchanged in tests.
+ withoutReviveTraceNoise: (fn: () => unknown) => fn(),
}));
-import { getRegistryContract } from "./registry.js";
+import { getRegistryContract, getReadOnlyRegistryContract } from "./registry.js";
+
+const READ_ONLY_ORIGIN = "5AliceReadOnlyOrigin";
const fakeSigner: ResolvedSigner = {
signer: {} as any,
@@ -52,47 +59,64 @@ const fakeSigner: ResolvedSigner = {
};
beforeEach(() => {
- fromClientMock.mockReset();
+ fromLiveClientMock.mockReset();
getContractMock.mockReset();
- withRequiredLiveContractAddressesMock.mockReset();
getContractMock.mockReturnValue({ publish: { tx: vi.fn() } });
- fromClientMock.mockResolvedValue({ getContract: getContractMock });
+ fromLiveClientMock.mockResolvedValue({ getContract: getContractMock });
});
describe("getRegistryContract", () => {
- it("builds the manager with a live-patched manifest", async () => {
- const patchedManifest = { ...cdmJson, marker: "patched" };
- withRequiredLiveContractAddressesMock.mockResolvedValue(patchedManifest);
+ it("resolves the registry live with the signer origin and signer", async () => {
const rawClient = {} as any;
await getRegistryContract(rawClient, fakeSigner);
- expect(withRequiredLiveContractAddressesMock).toHaveBeenCalledWith(
+ expect(fromLiveClientMock).toHaveBeenCalledWith(
cdmJson,
rawClient,
- ["@w3s/playground-registry"],
- { defaultOrigin: fakeSigner.address },
- );
- expect(fromClientMock).toHaveBeenCalledWith(
- patchedManifest,
- rawClient,
{ genesis: "0xasset" },
{
- defaultSigner: fakeSigner.signer,
+ libraries: ["@w3s/playground-registry"],
defaultOrigin: fakeSigner.address,
+ defaultSigner: fakeSigner.signer,
},
);
expect(getContractMock).toHaveBeenCalledWith("@w3s/playground-registry");
});
it("throws a clear error when live lookup fails", async () => {
- withRequiredLiveContractAddressesMock.mockRejectedValue(new Error("registry unavailable"));
+ fromLiveClientMock.mockRejectedValue(new Error("registry unavailable"));
const rawClient = {} as any;
await expect(getRegistryContract(rawClient, fakeSigner)).rejects.toThrow(
/MetaRegistryFailure/,
);
+ });
+});
+
+describe("getReadOnlyRegistryContract", () => {
+ it("resolves the registry live with the read-only origin and no signer", async () => {
+ const rawClient = {} as any;
+
+ await getReadOnlyRegistryContract(rawClient);
+
+ expect(fromLiveClientMock).toHaveBeenCalledWith(
+ cdmJson,
+ rawClient,
+ { genesis: "0xasset" },
+ {
+ libraries: ["@w3s/playground-registry"],
+ defaultOrigin: READ_ONLY_ORIGIN,
+ },
+ );
+ const [, , , options] = fromLiveClientMock.mock.calls[0];
+ expect(options).not.toHaveProperty("defaultSigner");
+ expect(getContractMock).toHaveBeenCalledWith("@w3s/playground-registry");
+ });
+
+ it("throws a clear error when live lookup fails", async () => {
+ fromLiveClientMock.mockRejectedValue(new Error("registry unavailable"));
- expect(fromClientMock).not.toHaveBeenCalled();
+ await expect(getReadOnlyRegistryContract({} as any)).rejects.toThrow(/MetaRegistryFailure/);
});
});
diff --git a/src/utils/registry.ts b/src/utils/registry.ts
index 243da04..9feb96d 100644
--- a/src/utils/registry.ts
+++ b/src/utils/registry.ts
@@ -21,14 +21,22 @@ import { ContractManager, type CdmJson } from "@parity/product-sdk-contracts";
import { ss58Encode } from "@parity/product-sdk-address";
import { paseo_asset_hub } from "@parity/product-sdk-descriptors/paseo-asset-hub";
import { getDevPublicKey } from "@parity/product-sdk-tx";
+import type { PolkadotClient } from "polkadot-api";
import type { ResolvedSigner } from "./signer.js";
import {
PLAYGROUND_REGISTRY_CONTRACT,
suppressReviveTraceNoise,
- withRequiredLiveContractAddresses,
+ withoutReviveTraceNoise,
} from "./contractManifest.js";
-import cdmJson from "../../cdm.json";
+import cdmJsonRaw from "../../cdm.json";
+
+/**
+ * The `cdm.json` import is typed wide by TS (`"latest"` widens to `string`,
+ * hex addresses to `string`), which doesn't match the SDK's flat `CdmJson`
+ * shape. Assert through `unknown` once here so every call site is typed.
+ */
+const cdmJson = cdmJsonRaw as unknown as CdmJson;
/**
* Stable origin used for read-only registry queries (`dot mod` and friends).
@@ -38,16 +46,29 @@ import cdmJson from "../../cdm.json";
*/
const READ_ONLY_QUERY_ORIGIN = ss58Encode(getDevPublicKey("Alice"));
-async function loadManifest(
- rawClient: Parameters[1],
+/**
+ * Build a ContractManager whose contract ADDRESSES are resolved live from the
+ * CDM meta-registry (`cdmJson.registry`) — never from the snapshot. ABIs still
+ * come from the snapshot. This is the same registry address and `"latest"`
+ * dependency the playground-app resolves, so both ends always talk to the same
+ * playground-registry contract even when either repo's snapshot is stale.
+ *
+ * `fromLiveClient`'s internal `getAddress` dry-runs hit the same Revive path
+ * that emits the known `ReviveApi_trace_call` incompatibility noise on Paseo
+ * Asset Hub, so the resolution is wrapped in `withoutReviveTraceNoise`.
+ */
+async function liveManager(
+ rawClient: PolkadotClient,
origin: string,
-): Promise {
+ signer?: ResolvedSigner,
+): Promise {
try {
- return await withRequiredLiveContractAddresses(
- cdmJson,
- rawClient,
- [PLAYGROUND_REGISTRY_CONTRACT],
- { defaultOrigin: origin },
+ return await withoutReviveTraceNoise(() =>
+ ContractManager.fromLiveClient(cdmJson, rawClient, paseo_asset_hub, {
+ libraries: [PLAYGROUND_REGISTRY_CONTRACT],
+ defaultOrigin: origin,
+ ...(signer ? { defaultSigner: signer.signer } : {}),
+ }),
);
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
@@ -63,15 +84,8 @@ async function loadManifest(
* (e.g. `registry.publish.tx(...)`). Caller is responsible for providing a
* funded + mapped user signer.
*/
-export async function getRegistryContract(
- rawClient: Parameters[1],
- signer: ResolvedSigner,
-) {
- const manifest = await loadManifest(rawClient, signer.address);
- const manager = await ContractManager.fromClient(manifest, rawClient, paseo_asset_hub, {
- defaultSigner: signer.signer,
- defaultOrigin: signer.address,
- });
+export async function getRegistryContract(rawClient: PolkadotClient, signer: ResolvedSigner) {
+ const manager = await liveManager(rawClient, signer.address, signer);
return suppressReviveTraceNoise(manager.getContract(PLAYGROUND_REGISTRY_CONTRACT));
}
@@ -85,12 +99,7 @@ export async function getRegistryContract(
* and `defaultOrigin` is Alice, so any submission would either crash or be
* misattributed.
*/
-export async function getReadOnlyRegistryContract(
- rawClient: Parameters[1],
-) {
- const manifest = await loadManifest(rawClient, READ_ONLY_QUERY_ORIGIN);
- const manager = await ContractManager.fromClient(manifest, rawClient, paseo_asset_hub, {
- defaultOrigin: READ_ONLY_QUERY_ORIGIN,
- });
+export async function getReadOnlyRegistryContract(rawClient: PolkadotClient) {
+ const manager = await liveManager(rawClient, READ_ONLY_QUERY_ORIGIN);
return suppressReviveTraceNoise(manager.getContract(PLAYGROUND_REGISTRY_CONTRACT));
}
diff --git a/src/utils/sessionSigner.test.ts b/src/utils/sessionSigner.test.ts
index 244027d..3ed4a30 100644
--- a/src/utils/sessionSigner.test.ts
+++ b/src/utils/sessionSigner.test.ts
@@ -18,112 +18,95 @@ import { ss58Encode } from "@parity/product-sdk-address";
import { seedToAccount } from "@parity/product-sdk-keys";
import type { UserSession } from "@parity/product-sdk-terminal";
import { PLAYGROUND_PRODUCT_ID } from "../config.js";
-import { createPlaygroundSessionSigner } from "./sessionSigner.js";
+import {
+ INCOMPLETE_SESSION_MESSAGE,
+ createPlaygroundSessionSigner,
+ derivePlaygroundProductPublicKey,
+} from "./sessionSigner.js";
const DEV_PHRASE = "bottom drive obey lake curtain smoke basket hold race lonely fit walk";
-// ────────────────────────────────────────────────────────────────────────────
-// Init / deploy / playground-app equivalence
-//
-// Pins the invariant that every flow which references "the user's account"
-// resolves to the *same* SS58 — the product account derived at
-// `mnemonic + "/product/{PLAYGROUND_PRODUCT_ID}/0"`.
-//
-// - `dot init`'s `getSessionSigner()` builds a signer via
-// `createPlaygroundSessionSigner(session, { productId, derivationIndex })`
-// and displays `ss58Encode(signer.publicKey)`.
-// - `dot deploy --signer phone`'s `preflight()` → `resolveSigner()` →
-// `getSessionSigner()` walks the same `createPlaygroundSessionSigner`
-// path. `userSigner.address` (passed to bulletin-deploy as `signerAddress`)
-// IS `ss58Encode(signer.publicKey)`.
-// - The deployed playground-app's `HostProvider.getProductAccount(dotNsId)`
-// asks the mobile host to compute `seedToAccount(mnemonic,
-// "/product/{dotNsId}/0").publicKey` and SS58-encodes it.
-//
-// As long as all three pin to the same `(rootPubKey, productId, 0)` triple,
-// they yield byte-identical SS58 strings. These tests are the regression guard.
-// ────────────────────────────────────────────────────────────────────────────
-describe("init / deploy / playground-app account equivalence", () => {
- // Build a stand-in for the mobile's SSO handshake response. Mirrors what
- // `host-papp`'s `createStoredUserSession` would produce: `rootAccountId`
- // is `deriveRootAccount()` on the mobile = the bare-mnemonic keypair pubkey.
- // The other fields aren't read by `createPlaygroundSessionSigner` in the
- // path under test — we only need the types to line up.
- function fakeSession(mnemonic: string): UserSession {
- const root = seedToAccount(mnemonic, "");
- const wallet = seedToAccount(mnemonic, "//SomeWallet"); // simulates the user picking a derived account on mobile
- return {
- id: "test",
- localAccount: { accountId: new Uint8Array(32), pin: undefined },
- // `walletAccount.defaultAccountId()` on Android — distinct from the
- // bare-mnemonic keypair when the user has a derived wallet account.
- remoteAccount: {
- accountId: wallet.publicKey,
- publicKey: wallet.publicKey,
- pin: undefined,
- },
- rootAccountId: root.publicKey,
- // Methods aren't exercised by signer-build — type-only.
- } as unknown as UserSession;
- }
+// Stand-in for the mobile's SSO handshake response. `rootAccountId` is
+// `deriveRootAccount()` on the mobile = the bare-mnemonic keypair pubkey.
+// `remoteAccount.accountId` is the wallet's currently-selected substrate
+// account (`walletAccount.defaultAccountId()` on Android) — distinct from the
+// product account, and the wrong key for `signer.publicKey`. Only those two
+// fields are read by `createPlaygroundSessionSigner`.
+function fakeSession(opts: { rootAccountId?: Uint8Array; remoteAccountId?: Uint8Array }) {
+ return {
+ rootAccountId: opts.rootAccountId,
+ remoteAccount: { accountId: opts.remoteAccountId ?? new Uint8Array(32).fill(7) },
+ } as unknown as UserSession;
+}
+describe("createPlaygroundSessionSigner", () => {
+ const root = seedToAccount(DEV_PHRASE, "");
+
+ // ────────────────────────────────────────────────────────────────────────
+ // Init / deploy / playground-app equivalence
+ //
+ // Every flow that references "the user's account" must resolve to the same
+ // SS58 — the product account derived at `mnemonic + "/product/{id}/0"`.
+ // - `playground init` displays `ss58Encode(signer.publicKey)`.
+ // - `playground deploy --signer phone` passes the same SS58 to
+ // bulletin-deploy as `signerAddress`.
+ // - The deployed playground-app's `HostProvider.getProductAccount`
+ // asks the mobile to compute `seedToAccount(mnemonic, "/product/{id}/0")`.
+ // As long as all three pin the same `(rootPubKey, productId, 0)` triple they
+ // yield byte-identical SS58 strings. This is the regression guard.
+ // ────────────────────────────────────────────────────────────────────────
test("init signer address === deploy signer address === playground-app address", () => {
- const session = fakeSession(DEV_PHRASE);
+ const session = fakeSession({ rootAccountId: root.publicKey });
- // What `dot init`'s `sessionSigningAddress` and `dot deploy --signer phone`'s
- // `userSigner.address` resolve to (both go through `createPlaygroundSessionSigner`).
const cliSigner = createPlaygroundSessionSigner(session, {
productId: PLAYGROUND_PRODUCT_ID,
derivationIndex: 0,
});
const cliAddress = ss58Encode(cliSigner.publicKey);
- // What the deployed playground-app's `HostProvider.getProductAccount(dotNsId)`
- // gets back from the mobile (mobile computes this exact derivation).
+ // What the deployed playground-app gets back from the mobile (mobile
+ // computes this exact derivation from the same mnemonic).
const mobileDerived = seedToAccount(DEV_PHRASE, `/product/${PLAYGROUND_PRODUCT_ID}/0`);
const playgroundAppAddress = ss58Encode(mobileDerived.publicKey);
expect(cliAddress).toEqual(playgroundAppAddress);
});
- test("regression: signer does NOT use remoteAccount.accountId (= wallet account)", () => {
- const session = fakeSession(DEV_PHRASE);
- const cliSigner = createPlaygroundSessionSigner(session, {
+ test("signer.publicKey is the derived product account, not the wallet account", () => {
+ const session = fakeSession({
+ rootAccountId: root.publicKey,
+ remoteAccountId: new Uint8Array(32).fill(7),
+ });
+ const signer = createPlaygroundSessionSigner(session, {
+ productId: PLAYGROUND_PRODUCT_ID,
+ derivationIndex: 0,
+ });
+ const expected = derivePlaygroundProductPublicKey(root.publicKey, {
productId: PLAYGROUND_PRODUCT_ID,
derivationIndex: 0,
});
- const cliAddress = ss58Encode(cliSigner.publicKey);
- const walletAddress = ss58Encode(new Uint8Array(session.remoteAccount.accountId));
- // The pre-fix bug: signer.publicKey was set from session.remoteAccount.accountId
- // (the user's wallet account), not the product-derived account. The wallet
- // account is what the chain sees as From — different from the funded /
- // allowance-granted product account. This regression guard ensures we never
- // slip back into using remoteAccount.accountId as the signer's identity.
- expect(cliAddress).not.toEqual(walletAddress);
+ // The pre-fix bug set signer.publicKey from session.remoteAccount.accountId
+ // (the user's wallet account), not the product-derived account. The chain
+ // would see the wallet as From — different from the funded / allowance-
+ // granted product account. This guard ensures we never slip back.
+ expect(signer.publicKey).toEqual(expected);
+ expect(ss58Encode(signer.publicKey)).not.toEqual(ss58Encode(new Uint8Array(32).fill(7)));
});
- test("reports stale sessions without a root account public key", () => {
- const session = {
- ...fakeSession(DEV_PHRASE),
- rootAccountId: new Uint8Array(),
- } as UserSession;
-
+ test("throws the friendly message when rootAccountId is missing", () => {
+ const session = fakeSession({ rootAccountId: undefined });
expect(() =>
createPlaygroundSessionSigner(session, {
productId: PLAYGROUND_PRODUCT_ID,
derivationIndex: 0,
}),
- ).toThrow(
- 'Stored login session is missing the root account public key. Run "playground logout"',
- );
+ ).toThrow(INCOMPLETE_SESSION_MESSAGE);
});
- test("PLAYGROUND_PRODUCT_ID matches the playground-app's default dotNsId", () => {
- // The deployed playground-app defaults to PLAYGROUND_DOTNS_ID = "playground.dot"
- // (see playground-app/src/config.ts::defaultDotNsId for the non-localhost path).
- // The CLI must use the same productId so both derive the SAME account from
- // a given user mnemonic.
+ test("playground product id is pinned", () => {
+ // playground-app derives MyApps ownership from this exact id; a silent
+ // rename would orphan every published app.
expect(PLAYGROUND_PRODUCT_ID).toEqual("playground.dot");
});
});
diff --git a/src/utils/sessionSigner.ts b/src/utils/sessionSigner.ts
index 77ea83c..d2008cf 100644
--- a/src/utils/sessionSigner.ts
+++ b/src/utils/sessionSigner.ts
@@ -16,53 +16,33 @@
/**
* Session-backed `PolkadotSigner` for the playground product account.
*
- * **Why a CLI-local builder and not `createSessionSignerForAccount` from
- * `@parity/product-sdk-terminal@0.2.1`?**
+ * Thin wrapper over `@parity/product-sdk-terminal@0.3.0`'s
+ * `createSessionSignerForAccount`, which routes transaction signing through
+ * host-papp's `createTransaction` SSO pair: the paired wallet builds and signs
+ * the extrinsic itself, so every signed extension the chain declares (AsPgas,
+ * AsRingAlias, AuthorizeValueTransfer, whatever comes next) is forwarded
+ * verbatim — no PJS bridge, no relaxed-extension allow-list. `signBytes`
+ * keeps the `signRaw({ tag: "Bytes" })` anti-phishing envelope for raw
+ * user data.
*
- * The SDK's "PR #81 fix" routes tx signing through
- * `session.signRaw({ data: { tag: "Payload", value: hex(toSign) } })`. Android
- * v1198 (and earlier) ALWAYS applies the `...` anti-phishing
- * envelope inside `SignRawInteractor.sign()` — see
- * `polkadot-app-android-v2/chains/.../MessageSigningContext.kt::generalUntrustedMessage`
- * and `feature/products/impl/.../SignRawInteractor.kt` — so the resulting
- * signature is over `${utf8(hex)}`, NOT the bare extrinsic
- * payload. The chain reconstructs the bare payload, verifies, and rejects with
- * `{ type: "Invalid", value: { type: "BadProof" } }` on EVERY `Revive.map_account`
- * (and any other tx) on paseo-next-v2 with the AsPgas extension active.
- *
- * The canonical workaround comes straight from the Android team's own sample
- * app at `polkadot-app-android-v2/feature/products/product-sample/src/scripts/products_demo.tsx:773-789`:
- *
- * 1. Build a PJS-style signer with `getPolkadotSignerFromPjs(address, signPayload, signRaw)`.
- * 2. Provide a custom `signPayload` that maps PJS's `SignerPayloadJSON` onto
- * host-papp's `SigningPayloadRequest` and forwards via `session.signPayload(...)`.
- * Android's `signPayload` handler then reconstructs the full payload itself
- * (including AsPgas sponsoring) and signs the bare bytes correctly.
- * 3. Wrap the resulting signer so that for `RELAXED_SIGNED_EXTENSIONS`
- * (extensions PAPI sees but the PJS adapter can't recognize, e.g. `AsPgas`
- * and `AsRingAlias`), we zero out `value` + `additionalSigned` BEFORE PJS
- * walks them. That sidesteps PJS's "PJS does not support this
- * signed-extension" throw at `@polkadot-api/pjs-signer/dist/from-pjs-account.js:30-32`
- * WITHOUT dropping the identifier from `signedExtensions[]` — so android
- * still knows to include them and fills in the correct encoding from its
- * own runtime view.
- *
- * Replace this whole file with a `product-sdk-terminal` re-export once that
- * package's signer uses `session.signPayload` and ships the relaxed-extensions
- * wrapper natively.
+ * The ONE thing we add on top of the SDK: we always pass the derived
+ * product-account public key. The SDK's fallback (`session.remoteAccount
+ * .accountId`) is the wallet's currently-selected account, which is NOT the
+ * product account that signs on-chain — PAPI stamps `publicKey` into the
+ * extrinsic and verifies against it, so omitting it breaks every signature
+ * whenever the product account isn't the selected account (i.e. always, for
+ * this CLI).
*/
-import { getPolkadotSignerFromPjs, type SignerPayloadJSON } from "polkadot-api/pjs-signer";
-import { fromHex, toHex } from "polkadot-api/utils";
-import { ss58Encode } from "@parity/product-sdk-address";
-import type { UserSession } from "@parity/product-sdk-terminal";
-import type { PolkadotSigner } from "polkadot-api";
import { deriveProductAccountPublicKey } from "@parity/product-sdk-keys";
+import {
+ createSessionSignerForAccount,
+ type ProductAccountRef,
+ type UserSession,
+} from "@parity/product-sdk-terminal";
+import type { PolkadotSigner } from "polkadot-api";
-export interface ProductAccountRef {
- productId: string;
- derivationIndex: number;
-}
+export type { ProductAccountRef };
export const INCOMPLETE_SESSION_MESSAGE =
'Stored login session is missing the root account public key. Run "playground logout" and then "playground init" to pair again.';
@@ -80,136 +60,29 @@ export function sessionRootPublicKey(session: UserSession): Uint8Array {
* Soft-derive the product account public key off a wallet root.
*
* This is the single source of truth for product-account math in the CLI.
- * Both `createPlaygroundSessionSigner` (which builds the signer used to
- * actually sign on-chain) and `auth.ts::deriveSessionAddresses` (which
- * builds the display triple for `dot init`) go through here so a future
- * change to derivation params can't silently desync the signer from
- * what we print.
+ * Both `createPlaygroundSessionSigner` (which feeds the key to the SDK
+ * signer) and `auth.ts::deriveSessionAddresses` (which builds the display
+ * triple for `playground init`) go through here so a future change to
+ * derivation params can't silently desync the signer from what we print.
*
* sr25519 soft derivation is composable on public keys alone, so deriving
* from `rootAccountId` locally produces the SAME public key the mobile
* derives privately via `mnemonic + "/product/...{idx}"`. Algorithm
* parity with mobile/desktop is locked by the frozen vectors in
- * `@parity/product-sdk-keys`'s `product-account.test.ts`.
+ * `@parity/product-sdk-keys`'s `product-account.test.ts` and by the
+ * `deriveSessionAddresses` block in `src/utils/auth.test.ts`.
*/
export function derivePlaygroundProductPublicKey(
rootAccountId: Uint8Array,
- ref: ProductAccountRef,
+ ref: Pick,
): Uint8Array {
return deriveProductAccountPublicKey(rootAccountId, ref.productId, ref.derivationIndex);
}
-/**
- * Identifiers whose payload PAPI may populate but the PJS adapter doesn't
- * recognize. Mirrors `RELAXED_SIGNED_EXTENSIONS` in the polkadot-app sample.
- * Add to this set if a future runtime adds another v2-style extension PAPI
- * doesn't know about; android's host fills in the actual encoding.
- */
-const RELAXED_SIGNED_EXTENSIONS: ReadonlySet = new Set(["AsPgas", "AsRingAlias"]);
-
-function asHexString(value: string | undefined): `0x${string}` | undefined {
- if (value === undefined) return undefined;
- // host-papp's SigningPayloadRequest types hex fields as `0x${string}`.
- // PJS adapter populates them via toPjsHex / toHex which produce hex strings;
- // cast through since the runtime values are guaranteed-prefixed.
- return value as `0x${string}`;
-}
-
-/**
- * Coerce PJS's `assetId: number | object | undefined` to host-papp's hex shape.
- *
- * For `ChargeAssetTxPayment` and `AsPgas`, the PJS mapper produces a `0x…`
- * string when the asset is set. Other shapes (number / nested object) shouldn't
- * surface in paseo-next-v2 today; we coerce defensively.
- */
-function coerceAssetId(value: unknown): `0x${string}` | undefined {
- if (value === undefined || value === null) return undefined;
- if (typeof value === "string" && value.startsWith("0x")) return value as `0x${string}`;
- // Defensive fallback: stringify and warn upstream.
- return undefined;
-}
-
export function createPlaygroundSessionSigner(
session: UserSession,
- ref: ProductAccountRef,
+ ref: Pick,
): PolkadotSigner {
- // `session.remoteAccount.accountId` is the wallet's currently-selected
- // substrate account (`walletAccount.defaultAccountId()` on Android), NOT
- // the product-derived account that actually signs on-chain. Using it as
- // `signer.publicKey` would cause every funding / balance lookup / allowance
- // marker / display address in this CLI to point at the wallet, while the
- // mobile-constructed `signedTransaction` carries a different `From`
- // (the product account derived at `/product/{productId}/{idx}`).
- //
- // `session.rootAccountId` is the handshake-time `rootUserAccountId` —
- // the user's bare-mnemonic keypair public key on current mobile builds
- // (`deriveRootAccount()` = `derivationPath = null`). See the "Accounts"
- // section in CLAUDE.md for the host-vs-mobile derivation map.
const publicKey = derivePlaygroundProductPublicKey(sessionRootPublicKey(session), ref);
- const address = ss58Encode(publicKey);
-
- // Wire-shape identifier passed to host-papp's `signPayload` / `signRaw`.
- // Has to be assembled here (not in derive) because the host-papp message
- // codec wants the productId/derivationIndex as a separate tuple field.
- const productAccountId: [string, number] = [ref.productId, ref.derivationIndex];
-
- const signPayload = async (pjs: SignerPayloadJSON) => {
- const result = await session.signPayload({
- productAccountId,
- blockHash: asHexString(pjs.blockHash) as `0x${string}`,
- blockNumber: asHexString(pjs.blockNumber) as `0x${string}`,
- era: asHexString(pjs.era) as `0x${string}`,
- genesisHash: asHexString(pjs.genesisHash) as `0x${string}`,
- method: asHexString(pjs.method) as `0x${string}`,
- nonce: asHexString(pjs.nonce) as `0x${string}`,
- specVersion: asHexString(pjs.specVersion) as `0x${string}`,
- tip: asHexString(pjs.tip) as `0x${string}`,
- transactionVersion: asHexString(pjs.transactionVersion) as `0x${string}`,
- signedExtensions: pjs.signedExtensions,
- version: pjs.version,
- assetId: coerceAssetId(pjs.assetId),
- metadataHash: asHexString(pjs.metadataHash),
- mode: pjs.mode,
- withSignedTransaction: pjs.withSignedTransaction,
- });
- if (result.isErr()) {
- throw new Error(`Mobile signing failed: ${result.error.message}`);
- }
- const data = result.value;
- return {
- signature: toHex(data.signature),
- signedTransaction: data.signedTransaction ? toHex(data.signedTransaction) : undefined,
- };
- };
-
- const signRaw = async (payload: { address: string; data: string; type: "bytes" }) => {
- if (!payload.data.startsWith("0x")) {
- throw new Error("Raw signing payload must be 0x-prefixed hex");
- }
- const result = await session.signRaw({
- productAccountId,
- data: { tag: "Bytes", value: fromHex(payload.data as `0x${string}`) },
- });
- if (result.isErr()) {
- throw new Error(`Mobile signing failed: ${result.error.message}`);
- }
- return { id: 0, signature: toHex(result.value.signature) };
- };
-
- const baseSigner = getPolkadotSignerFromPjs(address, signPayload, signRaw);
-
- // Relaxed-extensions wrapper — see the file-level comment.
- return {
- publicKey: baseSigner.publicKey,
- signBytes: baseSigner.signBytes,
- signTx: (callData, signedExtensions, metadata, atBlockNumber, hasher) => {
- const relaxed: typeof signedExtensions = {};
- for (const [identifier, ext] of Object.entries(signedExtensions)) {
- relaxed[identifier] = RELAXED_SIGNED_EXTENSIONS.has(identifier)
- ? { ...ext, value: new Uint8Array(0), additionalSigned: new Uint8Array(0) }
- : ext;
- }
- return baseSigner.signTx(callData, relaxed, metadata, atBlockNumber, hasher);
- },
- };
+ return createSessionSignerForAccount(session, { ...ref, publicKey });
}
diff --git a/src/utils/signer.ts b/src/utils/signer.ts
index 7ce59b1..8e1e828 100644
--- a/src/utils/signer.ts
+++ b/src/utils/signer.ts
@@ -35,6 +35,8 @@ export interface ResolvedSigner {
source: SignerSource;
/** Present for QR/mobile sessions; absent for local dev/SURI signers. */
userSession?: SessionHandle["userSession"];
+ /** Live terminal adapter for SDK host calls. Present iff source === "session". */
+ adapter?: SessionHandle["adapter"];
/**
* The session's root / product / H160 triple. Present for QR/mobile
* sessions (forwarded from `SessionHandle`); absent for local dev/SURI
diff --git a/src/utils/username.ts b/src/utils/username.ts
index 8f342a6..64d9cb5 100644
--- a/src/utils/username.ts
+++ b/src/utils/username.ts
@@ -24,7 +24,8 @@
* as a direct dep just for this one-shot call would also pull in the full
* SSO/sessions/identity-cache pipeline we don't need. So we mirror the small
* piece we do need: the storage query + the byte mapping. Same precedent as
- * `src/utils/allowances/host.ts` (which mirrors host-papp's RFC-0010 call).
+ * the RFC-0010 host call, now upstreamed into
+ * `@parity/product-sdk-terminal/host`.
*
* NOTE on the storage key: `unsafeApi.query.Resources.Consumers.getValues`
* expects the key in JS form — for `AccountId32`, that's an SS58 string. The