@mysten-incubation/devstack 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dashboard-ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dashboard-ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dashboard-ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dashboard-ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/dashboard-ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dashboard-ui/assets/index-Bmi1UtAg.js +1356 -0
- package/dashboard-ui/assets/index-D5EShVt4.js +3 -0
- package/dashboard-ui/assets/index-Deml9drg.css +1 -0
- package/dashboard-ui/index.html +13 -0
- package/dist/api/define-capabilities.d.mts +14 -3
- package/dist/api/define-capabilities.mjs +18 -1
- package/dist/api/define-capabilities.mjs.map +1 -1
- package/dist/api/define-devstack.d.mts +1 -1
- package/dist/api/define-devstack.mjs +6 -26
- package/dist/api/define-devstack.mjs.map +1 -1
- package/dist/api/define-plugin.d.mts +1 -0
- package/dist/api/define-plugin.mjs +2 -0
- package/dist/api/inference-network.d.mts +132 -0
- package/dist/api/inference-network.mjs +105 -16
- package/dist/api/inference-network.mjs.map +1 -1
- package/dist/api/plugin-errors.d.mts +7 -0
- package/dist/api/run-stack.d.mts +20 -9
- package/dist/api/run-stack.mjs +56 -29
- package/dist/api/run-stack.mjs.map +1 -1
- package/dist/build-integrations/playwright/config.d.mts +6 -4
- package/dist/build-integrations/playwright/config.mjs +5 -3
- package/dist/build-integrations/playwright/config.mjs.map +1 -1
- package/dist/build-integrations/playwright/errors.d.mts +1 -1
- package/dist/build-integrations/playwright/global-setup.d.mts +43 -17
- package/dist/build-integrations/playwright/global-setup.mjs +250 -13
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
- package/dist/build-integrations/playwright/index.d.mts +5 -3
- package/dist/build-integrations/playwright/index.mjs +4 -2
- package/dist/build-integrations/playwright/stack-context.d.mts +0 -1
- package/dist/build-integrations/playwright/stack-context.mjs +24 -63
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
- package/dist/build-integrations/playwright/wallet-context.d.mts +7 -10
- package/dist/build-integrations/playwright/wallet-context.mjs +8 -13
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/cold-start-url.d.mts +5 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs +4 -3
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
- package/dist/build-integrations/runtime/conventional-routes.d.mts +51 -0
- package/dist/build-integrations/runtime/conventional-routes.mjs +92 -0
- package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -0
- package/dist/build-integrations/runtime/discover.d.mts +38 -30
- package/dist/build-integrations/runtime/discover.mjs +73 -70
- package/dist/build-integrations/runtime/discover.mjs.map +1 -1
- package/dist/build-integrations/runtime/endpoint-registry.d.mts +3 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs +3 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
- package/dist/build-integrations/runtime/index.d.mts +7 -2
- package/dist/build-integrations/runtime/index.mjs +9 -2
- package/dist/build-integrations/runtime/manifest-types.d.mts +2 -0
- package/dist/build-integrations/runtime/manifest-types.mjs +3 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.d.mts +29 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs +10 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs.map +1 -0
- package/dist/build-integrations/runtime/read-stack-context.d.mts +1 -1
- package/dist/build-integrations/runtime/read-stack-context.mjs +10 -4
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +48 -0
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs +42 -0
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -0
- package/dist/build-integrations/runtime/stack-context.d.mts +1 -1
- package/dist/build-integrations/runtime/wallet-paths.mjs +2 -0
- package/dist/build-integrations/vite/index.d.mts +51 -0
- package/dist/build-integrations/vite/index.mjs +73 -0
- package/dist/build-integrations/vite/index.mjs.map +1 -0
- package/dist/build-integrations/vitest/env.d.mts +4 -3
- package/dist/build-integrations/vitest/env.mjs +6 -4
- package/dist/build-integrations/vitest/env.mjs.map +1 -1
- package/dist/build-integrations/vitest/errors.d.mts +25 -4
- package/dist/build-integrations/vitest/errors.mjs +15 -2
- package/dist/build-integrations/vitest/errors.mjs.map +1 -1
- package/dist/build-integrations/vitest/index.d.mts +2 -2
- package/dist/build-integrations/vitest/index.mjs +3 -3
- package/dist/build-integrations/vitest/setup.d.mts +4 -2
- package/dist/build-integrations/vitest/setup.mjs +2 -2
- package/dist/build-integrations/vitest/setup.mjs.map +1 -1
- package/dist/build-integrations/vitest/stack-context.d.mts +0 -1
- package/dist/build-integrations/vitest/stack-context.mjs +33 -13
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
- package/dist/cli/bail.mjs +23 -0
- package/dist/cli/bail.mjs.map +1 -0
- package/dist/{surfaces/cli/commands → cli}/doctor-probes.mjs +26 -16
- package/dist/cli/doctor-probes.mjs.map +1 -0
- package/dist/cli/main.d.mts +15 -1
- package/dist/cli/main.mjs +166 -482
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/prune-direct.mjs +31 -201
- package/dist/cli/prune-direct.mjs.map +1 -1
- package/dist/cli/snapshot-reader.mjs +14 -11
- package/dist/cli/snapshot-reader.mjs.map +1 -1
- package/dist/cli/up-lifecycle.mjs +4 -1
- package/dist/cli/up-lifecycle.mjs.map +1 -1
- package/dist/cli/wirings/apply.mjs +95 -0
- package/dist/cli/wirings/apply.mjs.map +1 -0
- package/dist/cli/wirings/build-verb-layers.mjs +42 -0
- package/dist/cli/wirings/build-verb-layers.mjs.map +1 -0
- package/dist/cli/wirings/config-loader.mjs +69 -0
- package/dist/cli/wirings/config-loader.mjs.map +1 -0
- package/dist/cli/wirings/engine-command.mjs +30 -0
- package/dist/cli/wirings/engine-command.mjs.map +1 -0
- package/dist/cli/wirings/identity.mjs +72 -0
- package/dist/cli/wirings/identity.mjs.map +1 -0
- package/dist/cli/wirings/provide-file-system.mjs +7 -0
- package/dist/cli/wirings/provide-file-system.mjs.map +1 -0
- package/dist/cli/wirings/snapshot.mjs +177 -0
- package/dist/cli/wirings/snapshot.mjs.map +1 -0
- package/dist/cli/wirings/up.mjs +287 -0
- package/dist/cli/wirings/up.mjs.map +1 -0
- package/dist/cli/wirings/wipe.mjs +40 -0
- package/dist/cli/wirings/wipe.mjs.map +1 -0
- package/dist/contracts/capability-decl.d.mts +0 -2
- package/dist/contracts/codegenable.d.mts +43 -0
- package/dist/contracts/container-runtime.d.mts +26 -1
- package/dist/contracts/faucet-strategy.d.mts +25 -0
- package/dist/contracts/funding-strategy.d.mts +42 -0
- package/dist/contracts/plugin-expander.mjs +60 -0
- package/dist/contracts/plugin-expander.mjs.map +1 -0
- package/dist/contracts/projection.d.mts +5 -3
- package/dist/contracts/renderer.d.mts +23 -0
- package/dist/contracts/routable.d.mts +14 -1
- package/dist/contracts/snapshotable.d.mts +25 -3
- package/dist/contracts/wallet-protocol.d.mts +52 -0
- package/dist/contracts/wallet-protocol.mjs +52 -0
- package/dist/contracts/wallet-protocol.mjs.map +1 -0
- package/dist/index.d.mts +26 -25
- package/dist/index.mjs +20 -13
- package/dist/{runtime → orchestrators}/built-in-plugin-layers.mjs +10 -5
- package/dist/orchestrators/built-in-plugin-layers.mjs.map +1 -0
- package/dist/orchestrators/codegen/bindings.d.mts +1 -2
- package/dist/orchestrators/codegen/bindings.mjs +52 -186
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
- package/dist/orchestrators/codegen/emit.mjs +19 -1
- package/dist/orchestrators/codegen/emit.mjs.map +1 -1
- package/dist/orchestrators/codegen/errors.mjs +8 -3
- package/dist/orchestrators/codegen/errors.mjs.map +1 -1
- package/dist/orchestrators/codegen/format.mjs +47 -39
- package/dist/orchestrators/codegen/format.mjs.map +1 -1
- package/dist/orchestrators/codegen/gitignore.mjs +3 -1
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
- package/dist/orchestrators/codegen/output-location.mjs +41 -0
- package/dist/orchestrators/codegen/output-location.mjs.map +1 -0
- package/dist/orchestrators/codegen/paths.d.mts +1 -1
- package/dist/orchestrators/codegen/paths.mjs +40 -14
- package/dist/orchestrators/codegen/paths.mjs.map +1 -1
- package/dist/orchestrators/codegen/permissions.mjs +3 -1
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
- package/dist/orchestrators/codegen/service.mjs +157 -105
- package/dist/orchestrators/codegen/service.mjs.map +1 -1
- package/dist/orchestrators/lifecycle-prune/errors.mjs +31 -0
- package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -0
- package/dist/orchestrators/lifecycle-prune/index.mjs +350 -0
- package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs +26 -27
- package/dist/orchestrators/router/cleanup.mjs.map +1 -1
- package/dist/orchestrators/router/entrypoints.mjs +2 -2
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
- package/dist/orchestrators/router/file-provider.mjs +14 -5
- package/dist/orchestrators/router/file-provider.mjs.map +1 -1
- package/dist/orchestrators/router/hostname.mjs +19 -55
- package/dist/orchestrators/router/hostname.mjs.map +1 -1
- package/dist/orchestrators/router/index.mjs +11 -0
- package/dist/orchestrators/router/profile.mjs +2 -2
- package/dist/orchestrators/router/sentinels.mjs +26 -0
- package/dist/orchestrators/router/sentinels.mjs.map +1 -0
- package/dist/orchestrators/router/service.mjs +40 -37
- package/dist/orchestrators/router/service.mjs.map +1 -1
- package/dist/orchestrators/router/traefik-container.mjs +27 -16
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
- package/dist/{substrate/runtime → orchestrators}/run.mjs +26 -21
- package/dist/orchestrators/run.mjs.map +1 -0
- package/dist/orchestrators/runtime-composition.d.mts +1 -1
- package/dist/orchestrators/runtime-composition.mjs +123 -39
- package/dist/orchestrators/runtime-composition.mjs.map +1 -1
- package/dist/orchestrators/snapshot/capture-command.d.mts +1 -0
- package/dist/orchestrators/snapshot/capture-command.mjs +25 -0
- package/dist/orchestrators/snapshot/capture-command.mjs.map +1 -0
- package/dist/orchestrators/snapshot/capture.mjs +42 -28
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
- package/dist/orchestrators/snapshot/descriptor.mjs +35 -10
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
- package/dist/orchestrators/snapshot/identity-guard.mjs +1 -1
- package/dist/orchestrators/snapshot/index.mjs +13 -0
- package/dist/orchestrators/snapshot/integrity.d.mts +1 -1
- package/dist/orchestrators/snapshot/integrity.mjs +73 -17
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
- package/dist/orchestrators/snapshot/pending-marker.d.mts +1 -0
- package/dist/orchestrators/snapshot/pending-marker.mjs +99 -0
- package/dist/orchestrators/snapshot/pending-marker.mjs.map +1 -0
- package/dist/orchestrators/snapshot/phase-error.mjs +23 -0
- package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -0
- package/dist/orchestrators/snapshot/prune.mjs +20 -55
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
- package/dist/orchestrators/snapshot/recover-pending.d.mts +1 -0
- package/dist/orchestrators/snapshot/recover-pending.mjs +223 -0
- package/dist/orchestrators/snapshot/recover-pending.mjs.map +1 -0
- package/dist/orchestrators/snapshot/restore.mjs +118 -84
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
- package/dist/orchestrators/snapshot/service.mjs +53 -56
- package/dist/orchestrators/snapshot/service.mjs.map +1 -1
- package/dist/orchestrators/snapshot/state-document.d.mts +1 -0
- package/dist/orchestrators/snapshot/state-document.mjs +47 -7
- package/dist/orchestrators/snapshot/state-document.mjs.map +1 -1
- package/dist/orchestrators/snapshot/wipe.mjs +67 -10
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
- package/dist/plugins/account/codegen.mjs +9 -8
- package/dist/plugins/account/codegen.mjs.map +1 -1
- package/dist/plugins/account/errors.d.mts +33 -6
- package/dist/plugins/account/errors.mjs.map +1 -1
- package/dist/plugins/account/funding.d.mts +29 -19
- package/dist/plugins/account/funding.mjs +84 -66
- package/dist/plugins/account/funding.mjs.map +1 -1
- package/dist/plugins/account/index.d.mts +2 -4
- package/dist/plugins/account/index.mjs +64 -31
- package/dist/plugins/account/index.mjs.map +1 -1
- package/dist/plugins/account/keypair.mjs +6 -9
- package/dist/plugins/account/keypair.mjs.map +1 -1
- package/dist/plugins/account/lease.mjs +1 -0
- package/dist/plugins/account/lease.mjs.map +1 -1
- package/dist/plugins/account/registry.d.mts +14 -1
- package/dist/plugins/account/registry.mjs +18 -18
- package/dist/plugins/account/registry.mjs.map +1 -1
- package/dist/plugins/account/service.d.mts +23 -4
- package/dist/plugins/account/service.mjs +83 -45
- package/dist/plugins/account/service.mjs.map +1 -1
- package/dist/plugins/account/snapshot.mjs +2 -5
- package/dist/plugins/account/snapshot.mjs.map +1 -1
- package/dist/plugins/account/spans.mjs +16 -0
- package/dist/plugins/account/spans.mjs.map +1 -0
- package/dist/plugins/account/variants/keystore.mjs +6 -8
- package/dist/plugins/account/variants/keystore.mjs.map +1 -1
- package/dist/plugins/action/build-context.d.mts +3 -2
- package/dist/plugins/action/errors.d.mts +16 -12
- package/dist/plugins/action/errors.mjs.map +1 -1
- package/dist/plugins/action/execute.mjs +65 -103
- package/dist/plugins/action/execute.mjs.map +1 -1
- package/dist/plugins/action/index.d.mts +0 -2
- package/dist/plugins/action/index.mjs +17 -13
- package/dist/plugins/action/index.mjs.map +1 -1
- package/dist/plugins/action/service.mjs +38 -35
- package/dist/plugins/action/service.mjs.map +1 -1
- package/dist/plugins/action/spans.mjs +11 -0
- package/dist/plugins/action/spans.mjs.map +1 -0
- package/dist/plugins/coin/codegen.mjs +9 -8
- package/dist/plugins/coin/codegen.mjs.map +1 -1
- package/dist/plugins/coin/discovery.mjs +8 -4
- package/dist/plugins/coin/discovery.mjs.map +1 -1
- package/dist/plugins/coin/index.d.mts +11 -29
- package/dist/plugins/coin/index.mjs +56 -27
- package/dist/plugins/coin/index.mjs.map +1 -1
- package/dist/plugins/coin/metadata.mjs +8 -15
- package/dist/plugins/coin/metadata.mjs.map +1 -1
- package/dist/plugins/coin/mint.d.mts +30 -11
- package/dist/plugins/coin/mint.mjs +78 -74
- package/dist/plugins/coin/mint.mjs.map +1 -1
- package/dist/plugins/coin/registry.mjs +4 -7
- package/dist/plugins/coin/registry.mjs.map +1 -1
- package/dist/plugins/coin/service.d.mts +39 -1
- package/dist/plugins/coin/service.mjs +11 -4
- package/dist/plugins/coin/service.mjs.map +1 -1
- package/dist/plugins/coin/spans.mjs +20 -0
- package/dist/plugins/coin/spans.mjs.map +1 -0
- package/dist/plugins/dashboard/domain.mjs +402 -0
- package/dist/plugins/dashboard/domain.mjs.map +1 -0
- package/dist/plugins/dashboard/index.d.mts +29 -0
- package/dist/plugins/dashboard/index.mjs +91 -0
- package/dist/plugins/dashboard/index.mjs.map +1 -0
- package/dist/plugins/dashboard/origin-policy.mjs +36 -0
- package/dist/plugins/dashboard/origin-policy.mjs.map +1 -0
- package/dist/plugins/dashboard/routable.mjs +27 -0
- package/dist/plugins/dashboard/routable.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/builder.mjs +21 -0
- package/dist/plugins/dashboard/schema/builder.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/enums.mjs +72 -0
- package/dist/plugins/dashboard/schema/enums.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/root.mjs +351 -0
- package/dist/plugins/dashboard/schema/root.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/types.mjs +508 -0
- package/dist/plugins/dashboard/schema/types.mjs.map +1 -0
- package/dist/plugins/dashboard/schema.mjs +11 -0
- package/dist/plugins/dashboard/schema.mjs.map +1 -0
- package/dist/plugins/dashboard/server.mjs +166 -0
- package/dist/plugins/dashboard/server.mjs.map +1 -0
- package/dist/plugins/deepbook/deploy.mjs +53 -115
- package/dist/plugins/deepbook/deploy.mjs.map +1 -1
- package/dist/plugins/deepbook/errors.mjs +1 -0
- package/dist/plugins/deepbook/errors.mjs.map +1 -1
- package/dist/plugins/deepbook/faucet-strategy.mjs +47 -34
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/deepbook/hash.mjs +9 -0
- package/dist/plugins/deepbook/hash.mjs.map +1 -0
- package/dist/plugins/deepbook/index.d.mts +1 -10
- package/dist/plugins/deepbook/index.mjs +25 -22
- package/dist/plugins/deepbook/index.mjs.map +1 -1
- package/dist/plugins/deepbook/pyth/index.mjs +26 -55
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
- package/dist/plugins/deepbook/snapshot.mjs +17 -29
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
- package/dist/plugins/deepbook/spans.mjs +18 -0
- package/dist/plugins/deepbook/spans.mjs.map +1 -0
- package/dist/plugins/deepbook/type-strings.mjs +65 -0
- package/dist/plugins/deepbook/type-strings.mjs.map +1 -0
- package/dist/plugins/deepbook/types.d.mts +2 -3
- package/dist/plugins/deepbook/types.mjs.map +1 -1
- package/dist/plugins/faucet/dispatcher.d.mts +21 -2
- package/dist/plugins/faucet/dispatcher.mjs +1 -2
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
- package/dist/plugins/faucet/errors.d.mts +11 -24
- package/dist/plugins/faucet/errors.mjs.map +1 -1
- package/dist/plugins/faucet/http.mjs +33 -14
- package/dist/plugins/faucet/http.mjs.map +1 -1
- package/dist/plugins/faucet/index.d.mts +15 -5
- package/dist/plugins/faucet/index.mjs +3 -0
- package/dist/plugins/faucet/index.mjs.map +1 -1
- package/dist/plugins/faucet/spans.mjs +12 -0
- package/dist/plugins/faucet/spans.mjs.map +1 -0
- package/dist/plugins/host-service/errors.d.mts +1 -1
- package/dist/plugins/host-service/index.mjs +34 -8
- package/dist/plugins/host-service/index.mjs.map +1 -1
- package/dist/plugins/host-service/routable.mjs +2 -1
- package/dist/plugins/host-service/routable.mjs.map +1 -1
- package/dist/plugins/host-service/service.d.mts +21 -0
- package/dist/plugins/host-service/service.mjs +136 -81
- package/dist/plugins/host-service/service.mjs.map +1 -1
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs +23 -0
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -0
- package/dist/plugins/internal/codegen-helpers.mjs +18 -0
- package/dist/plugins/internal/codegen-helpers.mjs.map +1 -0
- package/dist/plugins/internal/funding-failure-error.mjs +32 -0
- package/dist/plugins/internal/funding-failure-error.mjs.map +1 -0
- package/dist/plugins/package/build.mjs +1 -1
- package/dist/plugins/package/build.mjs.map +1 -1
- package/dist/plugins/package/codegen.mjs +26 -0
- package/dist/plugins/package/codegen.mjs.map +1 -1
- package/dist/plugins/package/errors.d.mts +16 -6
- package/dist/plugins/package/errors.mjs.map +1 -1
- package/dist/plugins/package/index.d.mts +0 -4
- package/dist/plugins/package/index.mjs +27 -21
- package/dist/plugins/package/index.mjs.map +1 -1
- package/dist/plugins/package/mode-known.mjs +26 -12
- package/dist/plugins/package/mode-known.mjs.map +1 -1
- package/dist/plugins/package/mode-local.mjs +47 -41
- package/dist/plugins/package/mode-local.mjs.map +1 -1
- package/dist/plugins/package/publish-executor.mjs +55 -114
- package/dist/plugins/package/publish-executor.mjs.map +1 -1
- package/dist/plugins/package/registry.mjs +2 -1
- package/dist/plugins/package/registry.mjs.map +1 -1
- package/dist/plugins/package/service.mjs.map +1 -1
- package/dist/plugins/package/spans.mjs +14 -0
- package/dist/plugins/package/spans.mjs.map +1 -0
- package/dist/plugins/postgres/db-ensure.mjs +19 -12
- package/dist/plugins/postgres/db-ensure.mjs.map +1 -1
- package/dist/plugins/postgres/errors.d.mts +5 -0
- package/dist/plugins/postgres/errors.mjs.map +1 -1
- package/dist/plugins/postgres/index.mjs +10 -17
- package/dist/plugins/postgres/index.mjs.map +1 -1
- package/dist/plugins/postgres/service.mjs +58 -24
- package/dist/plugins/postgres/service.mjs.map +1 -1
- package/dist/plugins/postgres/snapshot.mjs.map +1 -1
- package/dist/plugins/postgres/spans.mjs +11 -0
- package/dist/plugins/postgres/spans.mjs.map +1 -0
- package/dist/plugins/router-entrypoints.mjs +4 -4
- package/dist/plugins/router-entrypoints.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +15 -13
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +15 -19
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
- package/dist/plugins/seal/codegen.d.mts +2 -3
- package/dist/plugins/seal/codegen.mjs.map +1 -1
- package/dist/plugins/seal/config-render.mjs +35 -8
- package/dist/plugins/seal/config-render.mjs.map +1 -1
- package/dist/plugins/seal/deploy.mjs +31 -39
- package/dist/plugins/seal/deploy.mjs.map +1 -1
- package/dist/plugins/seal/errors.d.mts +1 -3
- package/dist/plugins/seal/errors.mjs +7 -1
- package/dist/plugins/seal/errors.mjs.map +1 -1
- package/dist/plugins/seal/index.d.mts +1 -6
- package/dist/plugins/seal/index.mjs +40 -14
- package/dist/plugins/seal/index.mjs.map +1 -1
- package/dist/plugins/seal/key-manager.d.mts +1 -9
- package/dist/plugins/seal/key-manager.mjs +2 -18
- package/dist/plugins/seal/key-manager.mjs.map +1 -1
- package/dist/plugins/seal/key-server.mjs +37 -36
- package/dist/plugins/seal/key-server.mjs.map +1 -1
- package/dist/plugins/seal/keygen.mjs +16 -17
- package/dist/plugins/seal/keygen.mjs.map +1 -1
- package/dist/plugins/seal/mode/fork-known.mjs +36 -14
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
- package/dist/plugins/seal/mode/live.d.mts +6 -4
- package/dist/plugins/seal/mode/live.mjs +14 -21
- package/dist/plugins/seal/mode/live.mjs.map +1 -1
- package/dist/plugins/seal/mode/local-keygen.mjs +57 -21
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
- package/dist/plugins/seal/registry-publish.mjs +1 -0
- package/dist/plugins/seal/registry-publish.mjs.map +1 -1
- package/dist/plugins/seal/routable.mjs.map +1 -1
- package/dist/plugins/seal/service.mjs.map +1 -1
- package/dist/plugins/seal/spans.mjs +18 -0
- package/dist/plugins/seal/spans.mjs.map +1 -0
- package/dist/plugins/sui/auto-tick.mjs +17 -23
- package/dist/plugins/sui/auto-tick.mjs.map +1 -1
- package/dist/plugins/sui/chain-build-container.mjs +18 -0
- package/dist/plugins/sui/chain-build-container.mjs.map +1 -0
- package/dist/plugins/sui/chain-probe.d.mts +5 -5
- package/dist/plugins/sui/chain-probe.mjs +28 -58
- package/dist/plugins/sui/chain-probe.mjs.map +1 -1
- package/dist/plugins/sui/codegen.mjs +26 -0
- package/dist/plugins/sui/codegen.mjs.map +1 -1
- package/dist/plugins/sui/errors.d.mts +2 -29
- package/dist/plugins/sui/errors.mjs +1 -3
- package/dist/plugins/sui/errors.mjs.map +1 -1
- package/dist/plugins/sui/fork-faucet-strategy.d.mts +1 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs +55 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -0
- package/dist/plugins/sui/fork-orchestration.d.mts +1 -0
- package/dist/plugins/sui/fork-orchestration.mjs +170 -2
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
- package/dist/plugins/sui/fork-transaction.d.mts +2 -0
- package/dist/plugins/sui/fork-transaction.mjs +92 -28
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
- package/dist/plugins/sui/index.d.mts +33 -70
- package/dist/plugins/sui/index.mjs +58 -35
- package/dist/plugins/sui/index.mjs.map +1 -1
- package/dist/plugins/{faucet/strategies/sui-local.mjs → sui/local-faucet-strategy.mjs} +10 -7
- package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +7 -13
- package/dist/plugins/sui/mode/external.mjs.map +1 -1
- package/dist/plugins/sui/mode/fork.mjs +136 -59
- package/dist/plugins/sui/mode/fork.mjs.map +1 -1
- package/dist/plugins/sui/mode/live.mjs +10 -16
- package/dist/plugins/sui/mode/live.mjs.map +1 -1
- package/dist/plugins/sui/mode/local.mjs +37 -36
- package/dist/plugins/sui/mode/local.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared-boot.mjs +38 -115
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared.d.mts +1 -5
- package/dist/plugins/sui/mode/shared.mjs.map +1 -1
- package/dist/plugins/sui/mode/spec.d.mts +18 -0
- package/dist/plugins/sui/move-summary-runner.mjs +207 -0
- package/dist/plugins/sui/move-summary-runner.mjs.map +1 -0
- package/dist/plugins/sui/network-resolver.d.mts +4 -3
- package/dist/plugins/sui/service.mjs.map +1 -1
- package/dist/plugins/sui/snapshot.mjs +3 -0
- package/dist/plugins/sui/snapshot.mjs.map +1 -1
- package/dist/plugins/sui/spans.mjs +17 -0
- package/dist/plugins/sui/spans.mjs.map +1 -0
- package/dist/plugins/wallet/codegen.d.mts +0 -1
- package/dist/plugins/wallet/codegen.mjs +8 -9
- package/dist/plugins/wallet/codegen.mjs.map +1 -1
- package/dist/plugins/wallet/index.d.mts +6 -8
- package/dist/plugins/wallet/index.mjs +46 -35
- package/dist/plugins/wallet/index.mjs.map +1 -1
- package/dist/plugins/wallet/origin-policy.mjs +12 -28
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
- package/dist/plugins/wallet/pairing.mjs +6 -4
- package/dist/plugins/wallet/pairing.mjs.map +1 -1
- package/dist/plugins/wallet/protocol.d.mts +1 -0
- package/dist/plugins/wallet/protocol.mjs +5 -44
- package/dist/plugins/wallet/protocol.mjs.map +1 -1
- package/dist/plugins/wallet/routable.mjs +2 -8
- package/dist/plugins/wallet/routable.mjs.map +1 -1
- package/dist/plugins/wallet/server.mjs +36 -44
- package/dist/plugins/wallet/server.mjs.map +1 -1
- package/dist/plugins/wallet/service.d.mts +1 -5
- package/dist/plugins/wallet/service.mjs +22 -18
- package/dist/plugins/wallet/service.mjs.map +1 -1
- package/dist/plugins/wallet/spans.mjs +22 -0
- package/dist/plugins/wallet/spans.mjs.map +1 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +33 -8
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/walrus/codegen.d.mts +3 -3
- package/dist/plugins/walrus/codegen.mjs.map +1 -1
- package/dist/plugins/walrus/deploy-paths.mjs +21 -5
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
- package/dist/plugins/walrus/deploy.mjs +67 -69
- package/dist/plugins/walrus/deploy.mjs.map +1 -1
- package/dist/plugins/walrus/errors.mjs +1 -0
- package/dist/plugins/walrus/errors.mjs.map +1 -1
- package/dist/plugins/walrus/faucet-strategy.mjs +12 -7
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/walrus/index.d.mts +2 -13
- package/dist/plugins/walrus/index.mjs +18 -23
- package/dist/plugins/walrus/index.mjs.map +1 -1
- package/dist/plugins/walrus/mode/known-deploy.mjs +7 -5
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
- package/dist/plugins/walrus/mode/local-cluster.mjs +26 -7
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
- package/dist/plugins/walrus/routable.mjs +7 -23
- package/dist/plugins/walrus/routable.mjs.map +1 -1
- package/dist/plugins/walrus/service.mjs.map +1 -1
- package/dist/plugins/walrus/spans.mjs +18 -0
- package/dist/plugins/walrus/spans.mjs.map +1 -0
- package/dist/plugins/walrus/storage-nodes.d.mts +6 -2
- package/dist/plugins/walrus/storage-nodes.mjs +15 -8
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
- package/dist/plugins/walrus/wal-swap.mjs +58 -15
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
- package/dist/primitives/artifact-publisher.d.mts +1 -1
- package/dist/primitives/artifact-publisher.mjs +15 -0
- package/dist/primitives/artifact-publisher.mjs.map +1 -0
- package/dist/runtime/docker/client.mjs +17 -4
- package/dist/runtime/docker/client.mjs.map +1 -1
- package/dist/runtime/docker/container.mjs +219 -132
- package/dist/runtime/docker/container.mjs.map +1 -1
- package/dist/runtime/docker/errors.mjs +0 -6
- package/dist/runtime/docker/errors.mjs.map +1 -1
- package/dist/runtime/docker/exec.mjs +21 -18
- package/dist/runtime/docker/exec.mjs.map +1 -1
- package/dist/runtime/docker/image.mjs +36 -13
- package/dist/runtime/docker/image.mjs.map +1 -1
- package/dist/runtime/docker/index.mjs +14 -0
- package/dist/runtime/docker/inspect-and-decode.mjs +51 -0
- package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -0
- package/dist/runtime/docker/inventory.mjs +14 -11
- package/dist/runtime/docker/inventory.mjs.map +1 -1
- package/dist/runtime/docker/labels.mjs +38 -5
- package/dist/runtime/docker/labels.mjs.map +1 -1
- package/dist/runtime/docker/logs.d.mts +1 -1
- package/dist/runtime/docker/logs.mjs.map +1 -1
- package/dist/runtime/docker/network.mjs +83 -47
- package/dist/runtime/docker/network.mjs.map +1 -1
- package/dist/runtime/docker/render-run-args.mjs +82 -0
- package/dist/runtime/docker/render-run-args.mjs.map +1 -0
- package/dist/runtime/docker/service.d.mts +1 -1
- package/dist/runtime/docker/service.mjs +12 -7
- package/dist/runtime/docker/service.mjs.map +1 -1
- package/dist/runtime/docker/sweep.mjs +118 -43
- package/dist/runtime/docker/sweep.mjs.map +1 -1
- package/dist/runtime/docker/volume.mjs +2 -0
- package/dist/runtime/docker/volume.mjs.map +1 -1
- package/dist/runtime/docker/wrap.mjs +30 -1
- package/dist/runtime/docker/wrap.mjs.map +1 -1
- package/dist/substrate/cross-process.mjs +14 -8
- package/dist/substrate/cross-process.mjs.map +1 -1
- package/dist/substrate/event-time.mjs +33 -0
- package/dist/substrate/event-time.mjs.map +1 -0
- package/dist/substrate/events.d.mts +28 -8
- package/dist/substrate/identity.d.mts +2 -1
- package/dist/substrate/manifest.d.mts +68 -5
- package/dist/substrate/manifest.mjs +34 -5
- package/dist/substrate/manifest.mjs.map +1 -1
- package/dist/substrate/network.d.mts +3 -5
- package/dist/substrate/options.d.mts +0 -2
- package/dist/substrate/plugin.d.mts +13 -0
- package/dist/substrate/plugin.mjs +4 -2
- package/dist/substrate/plugin.mjs.map +1 -1
- package/dist/substrate/projection.d.mts +35 -3
- package/dist/substrate/runtime/artifact-publisher/index.mjs +19 -9
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -1
- package/dist/substrate/runtime/atomic-write.mjs +97 -32
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
- package/dist/substrate/runtime/cache/index.mjs +3 -0
- package/dist/substrate/runtime/cache/schema.mjs +2 -2
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
- package/dist/substrate/runtime/cache/service.mjs +9 -7
- package/dist/substrate/runtime/cache/service.mjs.map +1 -1
- package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -1
- package/dist/substrate/runtime/capability-sinks/index.mjs +3 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs +1 -1
- package/dist/substrate/runtime/capability-sinks/service.d.mts +61 -2
- package/dist/substrate/runtime/capability-sinks/service.mjs +21 -26
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -1
- package/dist/substrate/runtime/config-validation.d.mts +1 -13
- package/dist/substrate/runtime/config-validation.mjs +2 -91
- package/dist/substrate/runtime/config-validation.mjs.map +1 -1
- package/dist/substrate/runtime/container-runtime.d.mts +1 -0
- package/dist/substrate/runtime/container-runtime.mjs +2 -0
- package/dist/substrate/runtime/control-plane/domain.mjs +101 -0
- package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -0
- package/dist/substrate/runtime/control-plane/service.mjs +7 -0
- package/dist/substrate/runtime/control-plane/service.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +46 -19
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +30 -12
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/index.mjs +5 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +11 -2
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +1 -1
- package/dist/substrate/runtime/cross-process/index.mjs +11 -0
- package/dist/substrate/runtime/cross-process/live-clock.mjs +34 -0
- package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs +52 -10
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/lock.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/lock.mjs +23 -0
- package/dist/substrate/runtime/cross-process/lock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +64 -0
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/roster.mjs +97 -83
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/self-pid.mjs +8 -0
- package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +24 -28
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +41 -20
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
- package/dist/substrate/runtime/current-plugin.mjs +2 -2
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
- package/dist/substrate/runtime/errors.mjs +12 -6
- package/dist/substrate/runtime/errors.mjs.map +1 -1
- package/dist/substrate/runtime/format-unknown-error.mjs +30 -0
- package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -0
- package/dist/substrate/runtime/host-bind-mount-owner.mjs +10 -0
- package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -0
- package/dist/substrate/runtime/host-gateway.mjs +20 -0
- package/dist/substrate/runtime/host-gateway.mjs.map +1 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs +61 -50
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
- package/dist/substrate/runtime/http-probe.d.mts +1 -1
- package/dist/substrate/runtime/index.mjs +14 -0
- package/dist/substrate/runtime/lease-broker/index.d.mts +1 -1
- package/dist/substrate/runtime/lease-broker/index.mjs +2 -0
- package/dist/substrate/runtime/lease-broker/service.d.mts +1 -64
- package/dist/substrate/runtime/lease-broker/service.mjs +1 -1
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +22 -3
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/index.mjs +9 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +20 -3
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +1 -1
- package/dist/substrate/runtime/lifecycle/signals.mjs +5 -5
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/state-machine.mjs +1 -1
- package/dist/substrate/runtime/managed-container.d.mts +19 -1
- package/dist/substrate/runtime/managed-container.mjs +20 -1
- package/dist/substrate/runtime/managed-container.mjs.map +1 -1
- package/dist/substrate/runtime/manifest/index.mjs +3 -0
- package/dist/substrate/runtime/manifest/manifest.mjs +15 -11
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
- package/dist/substrate/runtime/mode-errors.mjs +20 -0
- package/dist/substrate/runtime/mode-errors.mjs.map +1 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +9 -13
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
- package/dist/substrate/runtime/observability/formatter-registry.mjs +19 -36
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -1
- package/dist/substrate/runtime/observability/ignore-with-log.d.mts +1 -0
- package/dist/substrate/runtime/observability/ignore-with-log.mjs +17 -0
- package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -0
- package/dist/substrate/runtime/observability/index.d.mts +1 -1
- package/dist/substrate/runtime/observability/index.mjs +13 -0
- package/dist/substrate/runtime/observability/log-store.d.mts +1 -0
- package/dist/substrate/runtime/observability/log-store.mjs +175 -0
- package/dist/substrate/runtime/observability/log-store.mjs.map +1 -0
- package/dist/substrate/runtime/observability/logger.d.mts +2 -1
- package/dist/substrate/runtime/observability/logger.mjs +5 -9
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
- package/dist/substrate/runtime/observability/output-truncate.mjs +35 -0
- package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs +9 -12
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
- package/dist/substrate/runtime/observability/redaction.d.mts +2 -13
- package/dist/substrate/runtime/observability/redaction.mjs +8 -14
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
- package/dist/substrate/runtime/observability/span-store.d.mts +1 -0
- package/dist/substrate/runtime/observability/span-store.mjs +110 -0
- package/dist/substrate/runtime/observability/span-store.mjs.map +1 -0
- package/dist/substrate/runtime/observability/spans.mjs +14 -14
- package/dist/substrate/runtime/observability/spans.mjs.map +1 -1
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +1 -1
- package/dist/substrate/runtime/passthrough-or-wrap.mjs +33 -0
- package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -0
- package/dist/substrate/runtime/paths.d.mts +1 -1
- package/dist/substrate/runtime/paths.mjs +4 -3
- package/dist/substrate/runtime/paths.mjs.map +1 -1
- package/dist/substrate/runtime/phase-preserving-produce.mjs +40 -0
- package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -0
- package/dist/substrate/runtime/port-broker/index.mjs +3 -0
- package/dist/substrate/runtime/port-broker/service.mjs +170 -126
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
- package/dist/substrate/runtime/probes.d.mts +7 -5
- package/dist/substrate/runtime/probes.mjs +3 -1
- package/dist/substrate/runtime/probes.mjs.map +1 -1
- package/dist/substrate/runtime/projection/index.mjs +4 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs +1 -2
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
- package/dist/substrate/runtime/projection/persisted.mjs +33 -15
- package/dist/substrate/runtime/projection/persisted.mjs.map +1 -1
- package/dist/substrate/runtime/projection/state-ref.mjs +26 -2
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
- package/dist/substrate/runtime/projection/update.mjs +88 -24
- package/dist/substrate/runtime/projection/update.mjs.map +1 -1
- package/dist/substrate/runtime/random-suffix.mjs +11 -0
- package/dist/substrate/runtime/random-suffix.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +59 -1
- package/dist/substrate/runtime/retry-policy.mjs +66 -1
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
- package/dist/substrate/runtime/routed-url.d.mts +1 -0
- package/dist/substrate/runtime/routed-url.mjs +79 -0
- package/dist/substrate/runtime/routed-url.mjs.map +1 -0
- package/dist/substrate/runtime/runtime-decode.d.mts +1 -1
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-http-server.mjs +2 -3
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-multimap/index.mjs +2 -0
- package/dist/substrate/runtime/scoped-multimap/service.mjs +52 -0
- package/dist/substrate/runtime/scoped-multimap/service.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-ref-map/index.mjs +2 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +2 -2
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -1
- package/dist/substrate/runtime/stage-and-swap/index.mjs +72 -4
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
- package/dist/substrate/runtime/state-store/index.d.mts +1 -0
- package/dist/substrate/runtime/state-store/index.mjs +3 -0
- package/dist/substrate/runtime/state-store/schema.d.mts +1 -0
- package/dist/substrate/runtime/state-store/schema.mjs +19 -14
- package/dist/substrate/runtime/state-store/schema.mjs.map +1 -1
- package/dist/substrate/runtime/state-store/service.d.mts +1 -0
- package/dist/substrate/runtime/state-store/service.mjs +145 -0
- package/dist/substrate/runtime/state-store/service.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs +33 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +1 -1
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
- package/dist/substrate/runtime/strategy-registry/index.mjs +4 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs +19 -33
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
- package/dist/substrate/runtime/subnet-broker.mjs +60 -0
- package/dist/substrate/runtime/subnet-broker.mjs.map +1 -0
- package/dist/substrate/runtime/sui-execute/index.d.mts +21 -1
- package/dist/substrate/runtime/sui-execute/index.mjs +84 -20
- package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -1
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.d.mts +1 -0
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs +32 -0
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +1 -0
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs +32 -0
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +1 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs +93 -19
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/acquire-node.mjs +181 -0
- package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/background-tasks.mjs +144 -0
- package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/command-loop.mjs +68 -0
- package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +151 -0
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/errors.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/errors.mjs +9 -0
- package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/index.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/index.mjs +3 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs +51 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs +250 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/state.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/state.mjs +22 -0
- package/dist/substrate/runtime/supervisor/state.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/teardown.mjs +57 -0
- package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/types.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/wiring.mjs +133 -0
- package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -0
- package/dist/substrate/runtime/typed-env.mjs +8 -0
- package/dist/substrate/runtime/typed-env.mjs.map +1 -0
- package/dist/substrate/state-store.d.mts +1 -0
- package/dist/substrate/versioned-doc-schema.mjs +17 -0
- package/dist/substrate/versioned-doc-schema.mjs.map +1 -0
- package/dist/substrate/versioned-doc-sync.mjs +94 -0
- package/dist/substrate/versioned-doc-sync.mjs.map +1 -0
- package/dist/surfaces/cli/command-tree.mjs.map +1 -1
- package/dist/surfaces/cli/commands/index.mjs +9 -0
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs +13 -0
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs +3 -2
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
- package/dist/surfaces/cli/commands/prune.mjs +34 -17
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
- package/dist/surfaces/cli/commands/status.mjs +2 -2
- package/dist/surfaces/cli/commands/status.mjs.map +1 -1
- package/dist/surfaces/cli/commands/supervisor-presence.mjs +5 -3
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
- package/dist/surfaces/cli/commands/wipe.mjs +38 -4
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
- package/dist/surfaces/cli/errors.mjs +1 -1
- package/dist/surfaces/cli/errors.mjs.map +1 -1
- package/dist/surfaces/cli/flags.mjs +0 -1
- package/dist/surfaces/cli/flags.mjs.map +1 -1
- package/dist/surfaces/cli/index.mjs +98 -18
- package/dist/surfaces/cli/index.mjs.map +1 -1
- package/dist/surfaces/cli/output.mjs +1 -0
- package/dist/surfaces/cli/output.mjs.map +1 -1
- package/dist/surfaces/cli/sysexits.mjs +2 -1
- package/dist/surfaces/cli/sysexits.mjs.map +1 -1
- package/dist/surfaces/tui/app.mjs +25 -3
- package/dist/surfaces/tui/app.mjs.map +1 -1
- package/dist/surfaces/tui/display-derivation.mjs +23 -74
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
- package/dist/surfaces/tui/event-log.mjs +35 -23
- package/dist/surfaces/tui/event-log.mjs.map +1 -1
- package/dist/surfaces/tui/input.mjs +5 -1
- package/dist/surfaces/tui/input.mjs.map +1 -1
- package/dist/surfaces/tui/plain-renderer.mjs +70 -34
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
- package/package.json +24 -4
- package/dist/contracts/liveness-classifier.d.mts +0 -19
- package/dist/contracts/network-resolver.d.mts +0 -15
- package/dist/contracts/network-resolver.mjs +0 -7
- package/dist/contracts/network-resolver.mjs.map +0 -1
- package/dist/orchestrators/codegen/extras.mjs +0 -16
- package/dist/orchestrators/codegen/extras.mjs.map +0 -1
- package/dist/plugins/deepbook/routable.mjs +0 -21
- package/dist/plugins/deepbook/routable.mjs.map +0 -1
- package/dist/plugins/faucet/service.d.mts +0 -20
- package/dist/plugins/faucet/strategies/sui-local.d.mts +0 -23
- package/dist/plugins/faucet/strategies/sui-local.mjs.map +0 -1
- package/dist/plugins/sui/seed-objects.d.mts +0 -18
- package/dist/plugins/sui/seed-objects.mjs +0 -25
- package/dist/plugins/sui/seed-objects.mjs.map +0 -1
- package/dist/runtime/built-in-plugin-layers.mjs.map +0 -1
- package/dist/substrate/runtime/context-helpers.mjs +0 -32
- package/dist/substrate/runtime/context-helpers.mjs.map +0 -1
- package/dist/substrate/runtime/run.mjs.map +0 -1
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +0 -30
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +0 -1
- package/dist/substrate/runtime/supervisor.d.mts +0 -1
- package/dist/substrate/runtime/supervisor.mjs +0 -831
- package/dist/substrate/runtime/supervisor.mjs.map +0 -1
- package/dist/surfaces/cli/commands/doctor-probes.mjs.map +0 -1
- /package/dist/{substrate/runtime/strategy-registry/faucet-capability-for.d.mts → plugins/faucet/http.d.mts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/deepbook/index.ts"],"sourcesContent":["// Deepbook plugin — barrel + factories.\n//\n// Architecture: Deepbook is a task plugin that resolves a managed\n// local deployment, a known deployment, or explicit caller-supplied\n// override ids, then emits bindings.\n//\n// Mode discipline:\n//\n// - `deepbook(opts)` — explicit mode selection.\n// Localnet can default to local when\n// passed local options.\n// - `deepbookFor(network).local` — local-branch managed deployment.\n// - `deepbookFor(network).override` — local-branch override for\n// caller-supplied deployment ids.\n// - `deepbookFor(network).known` — known-deployment branch (live +\n// fork networks; wraps an already-\n// deployed canonical instance).\n//\n// Capability decls emitted:\n//\n// Local mode:\n// 1. snapshotable — `deepbook/<name>` subtree.\n// 2. codegenable — `deepbook-network` bindings.\n//\n// Override mode:\n// 1. snapshotable — identity guard only.\n// 2. codegenable — `deepbook-network` bindings.\n//\n// Known mode:\n// 1. snapshotable — identity guard only.\n// 2. codegenable — `deepbook-network` bindings (mode='known').\n//\n// Resource id: `deepbook/<name>`. Plugin key: `deepbook:<name>`.\n\nimport { Effect } from 'effect';\n\nimport { defineModeNamespace } from '../../api/mode-narrowed-factory.ts';\nimport { definePlugin, resource, type ResourceValueOf } from '../../api/define-plugin.ts';\nimport { pluginErrorContributions } from '../../api/plugin-errors.ts';\nimport type { CodegenableDecl } from '../../contracts/codegenable.ts';\nimport type { SnapshotableDecl } from '../../contracts/snapshotable.ts';\nimport { ArtifactPublisherService } from '../../substrate/runtime/artifact-publisher/index.ts';\nimport { setCurrentPluginPhase } from '../../substrate/runtime/current-plugin.ts';\nimport { suiResource } from '../sui/index.ts';\nimport type { AccountValue } from '../account/service.ts';\nimport type { CoinValue } from '../coin/index.ts';\nimport type { LocalPackageResolved } from '../package/index.ts';\n\nimport { deepbookPluginKey } from './plugin-key.ts';\nimport {\n\tDEEPBOOK_ERROR_TAGS,\n\tdeepbookConfigError,\n\tdeepbookPluginError,\n\ttype DeepbookError,\n\ttype DeepbookPluginError,\n} from './errors.ts';\nimport { makeDeepbookCodegenable, type DeepbookBindings } from './codegen.ts';\nimport {\n\tmakeDeepbookDeepFundingContribution,\n\tmakeDeepbookDeepFundingStrategy,\n\ttype DeepbookDeepFundingStrategy,\n} from './faucet-strategy.ts';\nimport { makeKnownSnapshotable, makeLocalSnapshotable } from './snapshot.ts';\nimport {\n\tcreateDeepbookPools,\n\tseedDeepbookPools,\n\ttype DeepbookDeployment,\n\ttype ResolvedDeepbookPoolSpec,\n} from './deploy.ts';\nimport { initLocalPythFeeds } from './pyth/index.ts';\nimport type {\n\tAccountMemberAlias,\n\tDeepbookPackageMember,\n\tDeepbookPool,\n\tDeepbookPoolSpec,\n\tPythHandle,\n\tPythOptions,\n} from './types.ts';\n\n// ---------------------------------------------------------------------------\n// Resource — the resolved value all consumers read\n// ---------------------------------------------------------------------------\n\nexport type DeepbookResourceId<Name extends string> = `deepbook/${Name}`;\n\nconst makeDeepbookResource = <Name extends string>(name: Name) =>\n\tresource<DeepbookResourceId<Name>, DeepbookResolved>(\n\t\t`deepbook/${name}` as DeepbookResourceId<Name>,\n\t);\n\n/** The deepbook resolved value. Mode-asymmetric:\n *\n * - `adminCapId` is `null` for known-deployment mode.\n * - `margin` / `serverUrl` / `indexerUrl` / `marketMakerRunning`\n * are `null` when the corresponding sub-feature is not enabled. */\nexport interface DeepbookResolved {\n\treadonly mode: 'local' | 'override' | 'known';\n\treadonly chain: string;\n\treadonly packageId: string;\n\treadonly registryId: string;\n\treadonly adminCapId: string | null;\n\treadonly deepTreasuryId: string | null;\n\treadonly pools: ReadonlyArray<DeepbookPool>;\n\treadonly pyth: PythHandle | null;\n\treadonly margin: {\n\t\treadonly packageId: string;\n\t\treadonly registryId: string;\n\t} | null;\n\treadonly serverUrl: string | null;\n\treadonly indexerUrl: string | null;\n\treadonly marketMakerRunning: boolean;\n\treadonly deepFundingStrategy: DeepbookDeepFundingStrategy | null;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface DeepbookCommonOptions {\n\treadonly name?: string;\n}\n\n/** Override mode wraps an explicitly supplied deployment. It does not\n * publish or manage DeepBook locally. */\nexport interface DeepbookOverrideOptions extends DeepbookCommonOptions {\n\treadonly packageId: string;\n\treadonly registryId: string;\n\treadonly adminCapId: string;\n\treadonly chain?: string;\n}\n\n/** Local mode wraps an explicitly supplied local DeepBook package. */\nexport interface DeepbookLocalOptions<\n\tPublisher extends AccountMemberAlias = AccountMemberAlias,\n\tPackage extends DeepbookPackageMember = DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tPyth extends PythOptions | undefined = undefined,\n> extends DeepbookCommonOptions {\n\t/** Publisher account — Direct Member Ref (locked API decision). */\n\treadonly publisher: Publisher;\n\t/** Published DeepBook package member. The package must capture the\n\t * `registry::Registry` and `registry::DeepbookAdminCap` object ids. */\n\treadonly package: Package;\n\t/** Optional local mock-Pyth package + feed setup. */\n\treadonly pyth?: Pyth;\n\t/** Capture key for the package-created `registry::Registry`. */\n\treadonly registryIdKey?: string;\n\t/** Capture key for the package-created `registry::DeepbookAdminCap`. */\n\treadonly adminCapIdKey?: string;\n\t/** Optional capture key for a DEEP treasury object used by SDK bindings. */\n\treadonly deepTreasuryIdKey?: string;\n\t/** Pools to create after the DeepBook package publishes. Pass `[]`\n\t * only for composition tests or known-empty deployments. */\n\treadonly pools: Pools;\n}\n\nexport type DeepbookKnownNetwork = 'mainnet' | 'testnet';\n\ninterface DeepbookKnownCommonOptions extends DeepbookCommonOptions {\n\t/** Optional chain id pin (defaults to the configured network). */\n\treadonly chain?: string;\n}\n\ninterface DeepbookKnownNetworkOptions extends DeepbookKnownCommonOptions {\n\treadonly network: DeepbookKnownNetwork;\n\treadonly packageId?: string;\n\treadonly registryId?: string;\n}\n\ninterface DeepbookKnownExplicitOptions extends DeepbookKnownCommonOptions {\n\treadonly packageId: string;\n\treadonly registryId: string;\n\treadonly network?: DeepbookKnownNetwork;\n}\n\nexport type DeepbookKnownOptions = DeepbookKnownNetworkOptions | DeepbookKnownExplicitOptions;\n\nexport type DeepbookOptions<\n\tPublisher extends AccountMemberAlias = AccountMemberAlias,\n\tPyth extends PythOptions | undefined = PythOptions | undefined,\n> =\n\t| ({\n\t\t\treadonly mode: 'local';\n\t } & DeepbookLocalOptions<\n\t\t\tPublisher,\n\t\t\tDeepbookPackageMember,\n\t\t\tReadonlyArray<DeepbookPoolSpec>,\n\t\t\tPyth\n\t >)\n\t| ({ readonly mode: 'override' } & DeepbookOverrideOptions)\n\t| ({ readonly mode: 'known' } & DeepbookKnownOptions);\n\n// ---------------------------------------------------------------------------\n// Plugin construction — override\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_NAME = 'deepbook';\nconst deepbookErrorContributions = pluginErrorContributions(DEEPBOOK_ERROR_TAGS);\n\ntype DeepbookLocalEmptyPoolOptions<\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPyth extends PythOptions | undefined = undefined,\n> = Omit<DeepbookLocalOptions<Publisher, Package, readonly [], Pyth>, 'pools'> & {\n\treadonly pools: readonly [];\n};\n\nconst KNOWN_DEEPBOOK_DEPLOYMENTS: Record<\n\tDeepbookKnownNetwork,\n\t{\n\t\treadonly chain: string;\n\t\treadonly packageId: string;\n\t\treadonly registryId: string;\n\t\treadonly deepTreasuryId: string;\n\t\treadonly pyth: PythHandle;\n\t}\n> = {\n\ttestnet: {\n\t\tchain: 'sui:testnet',\n\t\tpackageId: '0x22be4cade64bf2d02412c7e8d0e8beea2f78828b948118d46735315409371a3c',\n\t\tregistryId: '0x7c256edbda983a2cd6f946655f4bf3f00a41043993781f8674a7046e8c0e11d1',\n\t\tdeepTreasuryId: '0x69fffdae0075f8f71f4fa793549c11079266910e8905169845af1f5d00e09dcb',\n\t\tpyth: {\n\t\t\tpackageId: null,\n\t\t\tstateId: '0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c',\n\t\t\twormholeStateId: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790',\n\t\t\tfeeds: [],\n\t\t},\n\t},\n\tmainnet: {\n\t\tchain: 'sui:mainnet',\n\t\tpackageId: '0xf48222c4e057fa468baf136bff8e12504209d43850c5778f76159292a96f621e',\n\t\tregistryId: '0xaf16199a2dff736e9f07a845f23c5da6df6f756eddb631aed9d24a93efc4549d',\n\t\tdeepTreasuryId: '0x032abf8948dda67a271bcc18e776dbbcfb0d58c8d288a700ff0d5521e57a1ffe',\n\t\tpyth: {\n\t\t\tpackageId: null,\n\t\t\tstateId: '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n\t\t\twormholeStateId: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n\t\t\tfeeds: [],\n\t\t},\n\t},\n};\n\ntype PoolCoinRefs<Pools extends ReadonlyArray<DeepbookPoolSpec>> =\n\tPools[number] extends DeepbookPoolSpec<infer Base, infer Quote> ? Base | Quote : never;\ntype PoolCoinRefTuple<Pools extends ReadonlyArray<DeepbookPoolSpec>> = Pools extends readonly []\n\t? readonly []\n\t: readonly PoolCoinRefs<Pools>[];\n\ntype PythRefs<Pyth extends PythOptions | undefined> =\n\tPyth extends PythOptions<infer Package, infer Pusher> ? readonly [Pusher, Package] : readonly [];\n\ntype LocalDependsOn<\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec>,\n\tPyth extends PythOptions | undefined,\n> = readonly [\n\ttypeof suiResource,\n\tPublisher,\n\tPackage,\n\t...PythRefs<Pyth>,\n\t...PoolCoinRefTuple<Pools>,\n];\n\nconst poolCoinRefs = <Pools extends ReadonlyArray<DeepbookPoolSpec>>(\n\tpools: Pools,\n): ReadonlyArray<PoolCoinRefs<Pools>> =>\n\tpools.flatMap((pool) => [pool.base.coin, pool.quote.coin]) as unknown as ReadonlyArray<\n\t\tPoolCoinRefs<Pools>\n\t>;\n\nconst pythRefs = <Pyth extends PythOptions | undefined>(pyth: Pyth): PythRefs<Pyth> =>\n\t(pyth === undefined ? [] : [pyth.pusher, pyth.package]) as unknown as PythRefs<Pyth>;\n\nconst localDependsOn = <\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec>,\n\tPyth extends PythOptions | undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): LocalDependsOn<Publisher, Package, Pools, Pyth> =>\n\t[\n\t\tsuiResource,\n\t\topts.publisher,\n\t\topts.package,\n\t\t...pythRefs(opts.pyth),\n\t\t...poolCoinRefs(opts.pools),\n\t] as unknown as LocalDependsOn<Publisher, Package, Pools, Pyth>;\n\nconst requireCapturedId = (\n\tpkg: LocalPackageResolved,\n\tkey: string,\n\tkind: 'registryId' | 'adminCapId',\n): Effect.Effect<string, DeepbookPluginError> => {\n\tconst value = pkg.captured[key];\n\tif (typeof value === 'string' && value.length > 0) {\n\t\treturn Effect.succeed(value);\n\t}\n\treturn Effect.fail(\n\t\tdeepbookPluginError(\n\t\t\t'publish',\n\t\t\t`deepbook local package '${pkg.name}' is missing captured ${kind} '${key}'.`,\n\t\t),\n\t);\n};\n\nconst resolvePoolSpecs = (\n\tpools: ReadonlyArray<DeepbookPoolSpec>,\n\tcoinValuesByRefId: ReadonlyMap<string, CoinValue>,\n): ReadonlyArray<ResolvedDeepbookPoolSpec> =>\n\tpools.map((pool) => {\n\t\tconst base = coinValuesByRefId.get(pool.base.coin.id) as CoinValue;\n\t\tconst quote = coinValuesByRefId.get(pool.quote.coin.id) as CoinValue;\n\t\treturn {\n\t\t\tname: pool.name,\n\t\t\tbase: pool.base.key,\n\t\t\tquote: pool.quote.key,\n\t\t\tbaseCoinType: base.fullCoinType,\n\t\t\tquoteCoinType: quote.fullCoinType,\n\t\t\t...(base.fundingStrategy === undefined ? {} : { baseFundingStrategy: base.fundingStrategy }),\n\t\t\t...(quote.fundingStrategy === undefined\n\t\t\t\t? {}\n\t\t\t\t: { quoteFundingStrategy: quote.fundingStrategy }),\n\t\t\ttickSize: pool.tickSize,\n\t\t\tlotSize: pool.lotSize,\n\t\t\tminSize: pool.minSize,\n\t\t\twhitelisted: pool.whitelisted ?? true,\n\t\t\tstablePool: pool.stablePool ?? false,\n\t\t\t...(pool.seed === undefined ? {} : { seed: pool.seed }),\n\t\t};\n\t});\n\nconst assertUniquePoolNames = (name: string, pools: ReadonlyArray<DeepbookPoolSpec>) => {\n\tconst seen = new Set<string>();\n\tfor (const pool of pools) {\n\t\tif (seen.has(pool.name)) {\n\t\t\tthrow deepbookConfigError(\n\t\t\t\t'pools',\n\t\t\t\t`deepbook({mode:'local', name:'${name}'}) has duplicate pool '${pool.name}'.`,\n\t\t\t\t'Give each local DeepBook pool a unique SDK key.',\n\t\t\t);\n\t\t}\n\t\tseen.add(pool.name);\n\t\tfor (const order of pool.seed?.orders ?? []) {\n\t\t\tif (order.quantity < pool.minSize) {\n\t\t\t\tthrow deepbookConfigError(\n\t\t\t\t\t'pools',\n\t\t\t\t\t`deepbook({mode:'local', name:'${name}'}) seed order for pool '${pool.name}' is below minSize.`,\n\t\t\t\t\t'Use a seed order quantity greater than or equal to the pool minSize.',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (order.quantity % pool.lotSize !== 0n) {\n\t\t\t\tthrow deepbookConfigError(\n\t\t\t\t\t'pools',\n\t\t\t\t\t`deepbook({mode:'local', name:'${name}'}) seed order for pool '${pool.name}' is not lot-aligned.`,\n\t\t\t\t\t'Use a seed order quantity divisible by the pool lotSize.',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (order.price % pool.tickSize !== 0n) {\n\t\t\t\tthrow deepbookConfigError(\n\t\t\t\t\t'pools',\n\t\t\t\t\t`deepbook({mode:'local', name:'${name}'}) seed order for pool '${pool.name}' is not tick-aligned.`,\n\t\t\t\t\t'Use a seed order price divisible by the pool tickSize.',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst buildOverridePlugin = (opts: DeepbookOverrideOptions) => {\n\tconst name = opts.name ?? DEFAULT_NAME;\n\tif (!opts.packageId || !opts.registryId || !opts.adminCapId) {\n\t\tthrow deepbookConfigError(\n\t\t\t'packageId',\n\t\t\t`deepbook({mode:'override', name:'${name}'}) requires packageId, registryId, and adminCapId.`,\n\t\t\t`Pass explicit deployment ids or use deepbook({mode:'known', network:'testnet'}).`,\n\t\t);\n\t}\n\tconst deepbookResource = makeDeepbookResource(name);\n\tconst snap = makeKnownSnapshotable({ name });\n\n\treturn definePlugin({\n\t\tid: deepbookResource.id,\n\t\tdependsOn: [suiResource] as const,\n\t\trole: 'task',\n\t\tpluginKey: deepbookPluginKey(name),\n\t\tstart: (deps) =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tconst [sui] = deps;\n\t\t\t\tconst chain = opts.chain ?? sui.chain;\n\t\t\t\tconst resolved: DeepbookResolved = {\n\t\t\t\t\tmode: 'override',\n\t\t\t\t\tchain,\n\t\t\t\t\tpackageId: opts.packageId,\n\t\t\t\t\tregistryId: opts.registryId,\n\t\t\t\t\tadminCapId: opts.adminCapId,\n\t\t\t\t\tdeepTreasuryId: null,\n\t\t\t\t\tpools: [],\n\t\t\t\t\tpyth: null,\n\t\t\t\t\tmargin: null,\n\t\t\t\t\tserverUrl: null,\n\t\t\t\t\tindexerUrl: null,\n\t\t\t\t\tmarketMakerRunning: false,\n\t\t\t\t\tdeepFundingStrategy: null,\n\t\t\t\t};\n\t\t\t\treturn resolved;\n\t\t\t}),\n\t\tcapabilities: ({ value: resolved }) => {\n\t\t\tconst bindings: DeepbookBindings = {\n\t\t\t\tname,\n\t\t\t\tchain: resolved.chain,\n\t\t\t\tpackageId: resolved.packageId,\n\t\t\t\tregistryId: resolved.registryId,\n\t\t\t\tadminCapId: resolved.adminCapId,\n\t\t\t\tdeepTreasuryId: resolved.deepTreasuryId,\n\t\t\t\tpools: [],\n\t\t\t\tpyth: null,\n\t\t\t\tmargin: null,\n\t\t\t\tserverUrl: null,\n\t\t\t\tindexerUrl: null,\n\t\t\t};\n\t\t\tconst codegen: CodegenableDecl<'deepbook-network'> = makeDeepbookCodegenable(bindings);\n\t\t\treturn [snap, codegen] as const;\n\t\t},\n\t\terrorContributions: deepbookErrorContributions,\n\t});\n};\n\nconst buildLocalPlugin = <\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n) => {\n\tconst name = opts.name ?? DEFAULT_NAME;\n\tif (!opts.package) {\n\t\tthrow deepbookConfigError(\n\t\t\t'packageId',\n\t\t\t`deepbook({mode:'local', name:'${name}'}) requires a DeepBook package ref.`,\n\t\t\t`Pass \\`package: <localPackageMember>\\` with captured registryId/adminCapId.`,\n\t\t);\n\t}\n\tassertUniquePoolNames(name, opts.pools);\n\n\tconst deepbookResource = makeDeepbookResource(name);\n\tconst dependsOn = localDependsOn(opts);\n\n\treturn definePlugin({\n\t\tid: deepbookResource.id,\n\t\tdependsOn,\n\t\trole: 'task',\n\t\tpluginKey: deepbookPluginKey(name),\n\t\tstart: (deps) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst [sui, publisher, deepbookPackage, ...extraValues] = deps as unknown as readonly [\n\t\t\t\t\tResourceValueOf<typeof suiResource>,\n\t\t\t\t\tAccountValue,\n\t\t\t\t\tLocalPackageResolved,\n\t\t\t\t\t...(AccountValue | LocalPackageResolved | CoinValue)[],\n\t\t\t\t];\n\t\t\t\tconst pythValueCount = opts.pyth === undefined ? 0 : 2;\n\t\t\t\tconst pythValues = extraValues.slice(0, pythValueCount);\n\t\t\t\tconst coinValues = extraValues.slice(pythValueCount) as CoinValue[];\n\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'deepbook.name': name,\n\t\t\t\t\t'deepbook.chain': sui.chain,\n\t\t\t\t\t'deepbook.publisher': publisher.address,\n\t\t\t\t});\n\t\t\t\tyield* setCurrentPluginPhase('reading deployment captures');\n\n\t\t\t\tconst registryId = yield* requireCapturedId(\n\t\t\t\t\tdeepbookPackage,\n\t\t\t\t\topts.registryIdKey ?? 'registryId',\n\t\t\t\t\t'registryId',\n\t\t\t\t);\n\t\t\t\tconst adminCapId = yield* requireCapturedId(\n\t\t\t\t\tdeepbookPackage,\n\t\t\t\t\topts.adminCapIdKey ?? 'adminCapId',\n\t\t\t\t\t'adminCapId',\n\t\t\t\t);\n\t\t\t\tconst deepTreasuryId =\n\t\t\t\t\topts.deepTreasuryIdKey === undefined\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: (deepbookPackage.captured[opts.deepTreasuryIdKey] ?? null);\n\t\t\t\tconst deployment: DeepbookDeployment = {\n\t\t\t\t\tpackageId: deepbookPackage.packageId,\n\t\t\t\t\tregistryId,\n\t\t\t\t\tadminCapId,\n\t\t\t\t\tdeepTreasuryId,\n\t\t\t\t};\n\t\t\t\tconst poolRefs = poolCoinRefs(opts.pools);\n\t\t\t\tconst coinValuesByRefId = new Map<string, CoinValue>();\n\t\t\t\tfor (let i = 0; i < poolRefs.length; i += 1) {\n\t\t\t\t\tconst ref = poolRefs[i];\n\t\t\t\t\tconst value = coinValues[i];\n\t\t\t\t\tif (ref !== undefined && value !== undefined) {\n\t\t\t\t\t\tcoinValuesByRefId.set(ref.id, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst poolSpecs = resolvePoolSpecs(opts.pools, coinValuesByRefId);\n\t\t\t\tconst artifactPublisher = yield* ArtifactPublisherService;\n\t\t\t\tyield* setCurrentPluginPhase(\n\t\t\t\t\topts.pyth === undefined ? 'creating pools' : 'initializing Pyth feeds',\n\t\t\t\t);\n\t\t\t\tconst pyth =\n\t\t\t\t\topts.pyth === undefined\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: yield* initLocalPythFeeds(\n\t\t\t\t\t\t\t\tartifactPublisher,\n\t\t\t\t\t\t\t\tsui.sdk,\n\t\t\t\t\t\t\t\tsui.chain,\n\t\t\t\t\t\t\t\tpythValues[0] as AccountValue,\n\t\t\t\t\t\t\t\t{ packageId: (pythValues[1] as LocalPackageResolved).packageId },\n\t\t\t\t\t\t\t\topts.pyth.feeds,\n\t\t\t\t\t\t\t);\n\t\t\t\tyield* setCurrentPluginPhase('creating pools');\n\t\t\t\tconst poolResult = yield* createDeepbookPools(\n\t\t\t\t\tartifactPublisher,\n\t\t\t\t\tsui.sdk,\n\t\t\t\t\tsui.chain,\n\t\t\t\t\tpublisher,\n\t\t\t\t\tdeployment,\n\t\t\t\t\tpoolSpecs,\n\t\t\t\t);\n\t\t\t\tyield* setCurrentPluginPhase('seeding pools');\n\t\t\t\tconst seedResults = yield* seedDeepbookPools(\n\t\t\t\t\tartifactPublisher,\n\t\t\t\t\tsui.sdk,\n\t\t\t\t\tsui.chain,\n\t\t\t\t\tpublisher,\n\t\t\t\t\tdeployment,\n\t\t\t\t\tpoolSpecs,\n\t\t\t\t\tpoolResult.pools,\n\t\t\t\t);\n\t\t\t\tyield* setCurrentPluginPhase(null);\n\n\t\t\t\tconst resolved: DeepbookResolved = {\n\t\t\t\t\tmode: 'local',\n\t\t\t\t\tchain: sui.chain,\n\t\t\t\t\tpackageId: deployment.packageId,\n\t\t\t\t\tregistryId: deployment.registryId,\n\t\t\t\t\tadminCapId: deployment.adminCapId,\n\t\t\t\t\tdeepTreasuryId,\n\t\t\t\t\tpools: poolResult.pools,\n\t\t\t\t\tpyth,\n\t\t\t\t\tmargin: null,\n\t\t\t\t\tserverUrl: null,\n\t\t\t\t\tindexerUrl: null,\n\t\t\t\t\tmarketMakerRunning: seedResults.length > 0,\n\t\t\t\t\tdeepFundingStrategy: null,\n\t\t\t\t};\n\t\t\t\treturn resolved;\n\t\t\t}).pipe(\n\t\t\t\tEffect.catch((err: unknown) => {\n\t\t\t\t\t// Typed plugin errors flow through; other errors\n\t\t\t\t\t// (substrate primitives) are wrapped under a\n\t\t\t\t\t// `'publish'` phase tag so the cascade walker keeps\n\t\t\t\t\t// the plugin attribution.\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof err === 'object' &&\n\t\t\t\t\t\terr !== null &&\n\t\t\t\t\t\t'_tag' in err &&\n\t\t\t\t\t\t(err._tag === 'DeepbookPluginError' ||\n\t\t\t\t\t\t\terr._tag === 'DeepbookConfigError' ||\n\t\t\t\t\t\t\terr._tag === 'ForkIncompatibleError')\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn Effect.fail(err as DeepbookError);\n\t\t\t\t\t}\n\t\t\t\t\treturn Effect.fail(\n\t\t\t\t\t\tdeepbookPluginError('publish', `deepbook acquire failed: ${String(err)}`),\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t),\n\t\tcapabilities: ({ value: resolved, runtime: acquireCtx }) => {\n\t\t\tconst snap: SnapshotableDecl = makeLocalSnapshotable({\n\t\t\t\tname,\n\t\t\t\tapp: acquireCtx.identity.app,\n\t\t\t\tstack: acquireCtx.identity.stack,\n\t\t\t\tindexerEnabled: false,\n\t\t\t\tserverEnabled: false,\n\t\t\t});\n\t\t\tconst bindings: DeepbookBindings = {\n\t\t\t\tname,\n\t\t\t\tchain: resolved.chain,\n\t\t\t\tpackageId: resolved.packageId,\n\t\t\t\tregistryId: resolved.registryId,\n\t\t\t\tadminCapId: resolved.adminCapId,\n\t\t\t\tdeepTreasuryId: resolved.deepTreasuryId,\n\t\t\t\tpools: resolved.pools.map((p) => ({\n\t\t\t\t\tname: p.name,\n\t\t\t\t\tpoolId: p.poolId,\n\t\t\t\t\tbase: p.base,\n\t\t\t\t\tquote: p.quote,\n\t\t\t\t\tbaseCoinType: p.baseCoinType,\n\t\t\t\t\tquoteCoinType: p.quoteCoinType,\n\t\t\t\t})),\n\t\t\t\tpyth: resolved.pyth\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpackageId: resolved.pyth.packageId,\n\t\t\t\t\t\t\tstateId: resolved.pyth.stateId,\n\t\t\t\t\t\t\twormholeStateId: resolved.pyth.wormholeStateId,\n\t\t\t\t\t\t\tfeeds: resolved.pyth.feeds.map((feed) => ({\n\t\t\t\t\t\t\t\tsymbol: feed.symbol,\n\t\t\t\t\t\t\t\tfeedId: feed.feedId,\n\t\t\t\t\t\t\t\tpriceInfoObjectId: feed.priceInfoObjectId,\n\t\t\t\t\t\t\t\tprice: feed.price.toString(),\n\t\t\t\t\t\t\t\texpo: feed.expo,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t\tmargin: resolved.margin,\n\t\t\t\tserverUrl: resolved.serverUrl,\n\t\t\t\tindexerUrl: resolved.indexerUrl,\n\t\t\t};\n\t\t\tconst codegen: CodegenableDecl<'deepbook-network'> = makeDeepbookCodegenable(bindings);\n\t\t\treturn [snap, codegen] as const;\n\t\t},\n\t\terrorContributions: deepbookErrorContributions,\n\t});\n};\n\nfunction buildLocalPluginPublic<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec>,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\nfunction buildLocalPluginPublic<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec>,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(opts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>) {\n\treturn buildLocalPlugin(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Plugin construction — known\n// ---------------------------------------------------------------------------\n\nconst buildKnownPlugin = (opts: DeepbookKnownOptions) => {\n\tconst name = opts.name ?? DEFAULT_NAME;\n\tconst known = opts.network ? KNOWN_DEEPBOOK_DEPLOYMENTS[opts.network] : null;\n\tconst packageId = opts.packageId ?? known?.packageId;\n\tconst registryId = opts.registryId ?? known?.registryId;\n\tif (!packageId || !registryId) {\n\t\tthrow deepbookConfigError(\n\t\t\t'packageId',\n\t\t\t`deepbook({mode:'known', name:'${name}'}) requires packageId and registryId, or network:'mainnet'|'testnet'.`,\n\t\t\t`Pass explicit ids or use deepbook({mode:'known', network:'testnet'}).`,\n\t\t);\n\t}\n\tconst deepbookResource = makeDeepbookResource(name);\n\tconst snap = makeKnownSnapshotable({ name });\n\n\treturn definePlugin({\n\t\tid: deepbookResource.id,\n\t\tdependsOn: [suiResource] as const,\n\t\trole: 'task',\n\t\tstart: (deps) =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tconst [sui] = deps;\n\t\t\t\tconst chain = opts.chain ?? known?.chain ?? sui.chain;\n\t\t\t\tconst resolved: DeepbookResolved = {\n\t\t\t\t\tmode: 'known',\n\t\t\t\t\tchain,\n\t\t\t\t\tpackageId,\n\t\t\t\t\tregistryId,\n\t\t\t\t\tadminCapId: null,\n\t\t\t\t\tdeepTreasuryId: known?.deepTreasuryId ?? null,\n\t\t\t\t\tpools: [],\n\t\t\t\t\tpyth: known?.pyth ?? null,\n\t\t\t\t\tmargin: null,\n\t\t\t\t\tserverUrl: null,\n\t\t\t\t\tindexerUrl: null,\n\t\t\t\t\tmarketMakerRunning: false,\n\t\t\t\t\tdeepFundingStrategy:\n\t\t\t\t\t\topts.network === 'testnet' && String(chain) === 'sui:testnet'\n\t\t\t\t\t\t\t? makeDeepbookDeepFundingStrategy({ suiSdk: sui.sdk })\n\t\t\t\t\t\t\t: null,\n\t\t\t\t};\n\t\t\t\treturn resolved;\n\t\t\t}),\n\t\tcapabilities: ({ value: resolved }) => {\n\t\t\tconst bindings: DeepbookBindings = {\n\t\t\t\tname,\n\t\t\t\tchain: resolved.chain,\n\t\t\t\tpackageId: resolved.packageId,\n\t\t\t\tregistryId: resolved.registryId,\n\t\t\t\tadminCapId: null,\n\t\t\t\tdeepTreasuryId: resolved.deepTreasuryId,\n\t\t\t\tpools: [],\n\t\t\t\tpyth: resolved.pyth\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpackageId: resolved.pyth.packageId,\n\t\t\t\t\t\t\tstateId: resolved.pyth.stateId,\n\t\t\t\t\t\t\twormholeStateId: resolved.pyth.wormholeStateId,\n\t\t\t\t\t\t\tfeeds: resolved.pyth.feeds.map((feed) => ({\n\t\t\t\t\t\t\t\tsymbol: feed.symbol,\n\t\t\t\t\t\t\t\tfeedId: feed.feedId,\n\t\t\t\t\t\t\t\tpriceInfoObjectId: feed.priceInfoObjectId,\n\t\t\t\t\t\t\t\tprice: feed.price.toString(),\n\t\t\t\t\t\t\t\texpo: feed.expo,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t\tmargin: null,\n\t\t\t\tserverUrl: null,\n\t\t\t\tindexerUrl: null,\n\t\t\t};\n\t\t\tconst deepFunding =\n\t\t\t\tresolved.deepFundingStrategy === null\n\t\t\t\t\t? []\n\t\t\t\t\t: [makeDeepbookDeepFundingContribution(resolved.deepFundingStrategy)];\n\t\t\treturn [snap, makeDeepbookCodegenable(bindings), ...deepFunding] as const;\n\t\t},\n\t\terrorContributions: deepbookErrorContributions,\n\t});\n};\n\n// ---------------------------------------------------------------------------\n// Default option resolution (env-driven)\n// ---------------------------------------------------------------------------\n\nconst resolveDefaultMode = <\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts?: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookOptions<Publisher, Pyth> => {\n\tconst env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\n\t\t?.env?.DEVSTACK_NETWORK;\n\tif (env === undefined || env === 'localnet') {\n\t\tif (!opts || !opts.publisher) {\n\t\t\tthrow deepbookConfigError(\n\t\t\t\t'publisher',\n\t\t\t\t`deepbook() on localnet requires \\`publisher\\` and \\`package\\` member refs.`,\n\t\t\t\t`Pass options via deepbook({mode:'local', publisher, package: deepbookPackage, ...}).`,\n\t\t\t);\n\t\t}\n\t\treturn { mode: 'local', ...opts };\n\t}\n\t// Non-local default: refuse — known mode requires explicit\n\t// packageId/registryId. The user passes them via\n\t// `deepbookFor(network).known({...})` or `deepbook({mode:'known',...})`.\n\tthrow deepbookConfigError(\n\t\t'mode',\n\t\t`deepbook(): cannot auto-default to known mode on network='${env}'.`,\n\t\t`Use deepbookFor(network).known({packageId, registryId, ...}).`,\n\t);\n};\n\n// ---------------------------------------------------------------------------\n// User-facing factories\n// ---------------------------------------------------------------------------\n\n/** Env-driven factory. Defaults to local mode on localnet when passed local\n * options. Explicit `override` and `known` modes bypass env inference. */\ntype DeepbookLocalMember<\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec>,\n\tPyth extends PythOptions | undefined = undefined,\n> = ReturnType<typeof buildLocalPlugin<Publisher, Package, Pools, Pyth>>;\ntype DeepbookOverrideMember = ReturnType<typeof buildOverridePlugin>;\ntype DeepbookKnownMember = ReturnType<typeof buildKnownPlugin>;\n\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: { readonly mode: 'local' } & DeepbookLocalEmptyPoolOptions<Publisher, Package, Pyth>,\n): DeepbookLocalMember<Publisher, Package, readonly [], Pyth>;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: { readonly mode: 'local' } & DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\nexport function deepbookCore(\n\topts: { readonly mode: 'override' } & DeepbookOverrideOptions,\n): DeepbookOverrideMember;\nexport function deepbookCore(\n\topts: { readonly mode: 'known' } & DeepbookKnownOptions,\n): DeepbookKnownMember;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalEmptyPoolOptions<Publisher, Package, Pyth>,\n): DeepbookLocalMember<Publisher, Package, readonly [], Pyth>;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts?: DeepbookLocalOptions<Publisher, Package, Pools, Pyth> | DeepbookOptions<Publisher, Pyth>,\n):\n\t| DeepbookLocalMember<Publisher, Package, Pools, Pyth>\n\t| DeepbookOverrideMember\n\t| DeepbookKnownMember {\n\tconst resolved: DeepbookOptions<Publisher, Pyth> =\n\t\topts !== undefined && 'mode' in opts\n\t\t\t? (opts as DeepbookOptions<Publisher, Pyth>)\n\t\t\t: resolveDefaultMode(\n\t\t\t\t\topts as DeepbookLocalOptions<Publisher, Package, Pools, Pyth> | undefined,\n\t\t\t\t);\n\tswitch (resolved.mode) {\n\t\tcase 'local':\n\t\t\treturn buildLocalPluginPublic(\n\t\t\t\tresolved as { readonly mode: 'local' } & DeepbookLocalOptions<\n\t\t\t\t\tPublisher,\n\t\t\t\t\tPackage,\n\t\t\t\t\tPools,\n\t\t\t\t\tPyth\n\t\t\t\t>,\n\t\t\t) as DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\n\t\tcase 'override':\n\t\t\treturn buildOverridePlugin(resolved);\n\t\tcase 'known':\n\t\t\treturn buildKnownPlugin(resolved);\n\t}\n}\n\n/** Mode-narrowed factory namespace.\n *\n * Usage:\n * const local = { mode: 'local', chain: 'sui:localnet' } as const;\n * deepbookFor(local).local({publisher, package, pools}) // OK\n * deepbookFor(local).override({packageId, registryId, adminCapId}) // OK\n * deepbookFor(local).known({...}) // OK\n *\n * const fork = { mode: 'fork', chain: 'sui:mainnet-fork', upstream: 'mainnet' } as const;\n * deepbookFor(fork).local({...}) // COMPILE ERROR\n * deepbookFor(fork).override({...}) // COMPILE ERROR\n *\n * The fork branch has NO `.local` or `.override` entry — `deepbookFor(forkNetwork).local`\n * is a compile-time refusal. */\nexport const deepbookFor = defineModeNamespace({\n\tlocal: {\n\t\tlocal: <\n\t\t\tconst Publisher extends AccountMemberAlias,\n\t\t\tconst Package extends DeepbookPackageMember,\n\t\t\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\t\t\tconst Pyth extends PythOptions | undefined = undefined,\n\t\t>(\n\t\t\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n\t\t) => buildLocalPluginPublic(opts),\n\t\toverride: (opts: DeepbookOverrideOptions) => buildOverridePlugin(opts),\n\t\tknown: (opts: DeepbookKnownOptions) => buildKnownPlugin(opts),\n\t},\n\tlive: {\n\t\tknown: (opts: DeepbookKnownOptions) => buildKnownPlugin(opts),\n\t},\n\tfork: {\n\t\t// `.override` intentionally absent — compile-time refusal.\n\t\tknown: (opts: DeepbookKnownOptions) => buildKnownPlugin(opts),\n\t},\n});\n\nexport { deepbookCore as deepbook };\n\n// ---------------------------------------------------------------------------\n// Re-exports for advanced callers\n// ---------------------------------------------------------------------------\n\nexport {\n\tDEEPBOOK_DEEP_FAUCET_STRATEGY_KEY,\n\tDEEPBOOK_TESTNET_DEEP_COIN_TYPE,\n\tmakeDeepbookDeepFundingContribution,\n\tmakeDeepbookDeepFundingStrategy,\n\ttype DeepbookDeepFundingStrategy,\n\ttype DeepbookDeepFundingStrategyOptions,\n} from './faucet-strategy.ts';\nexport {\n\tDEEPBOOK_ERROR_TAGS,\n\ttype DeepbookError,\n\ttype DeepbookPluginError,\n\ttype DeepbookConfigError,\n\ttype DeepbookPhase,\n} from './errors.ts';\nexport type { DeepbookBindings, DeepbookPoolBinding } from './codegen.ts';\nexport type {\n\tAccountMemberAlias,\n\tCoinMemberAlias,\n\tDeepbookPackageMember,\n\tDeepbookPool,\n\tDeepbookPoolCoin,\n\tDeepbookPoolSeedLiquidity,\n\tDeepbookPoolSeedOrder,\n\tDeepbookPoolSpec,\n\tPythFeed,\n\tPythHandle,\n\tPythOptions,\n\tPythPackageMember,\n\tPythPriceFeedId,\n} from './types.ts';\nexport {\n\tDEEP_PRICE_FEED_ID,\n\tpythPriceFeedId,\n\tSUI_PRICE_FEED_ID,\n\tUSDC_PRICE_FEED_ID,\n} from './types.ts';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/deepbook/index.ts"],"sourcesContent":["// Deepbook plugin — barrel + factories.\n//\n// Architecture: Deepbook is a task plugin that resolves a managed\n// local deployment, a known deployment, or explicit caller-supplied\n// override ids, then emits bindings.\n//\n// Mode discipline:\n//\n// - `deepbook(opts)` — explicit mode selection.\n// Localnet can default to local when\n// passed local options.\n// - `deepbookFor(network).local` — local-branch managed deployment.\n// - `deepbookFor(network).override` — local-branch override for\n// caller-supplied deployment ids.\n// - `deepbookFor(network).known` — known-deployment branch (live +\n// fork networks; wraps an already-\n// deployed canonical instance).\n//\n// Capability decls emitted:\n//\n// Local mode:\n// 1. snapshotable — `deepbook/<name>` subtree.\n// 2. codegenable — `deepbook-network` bindings.\n//\n// Override mode:\n// 1. snapshotable — identity guard only.\n// 2. codegenable — `deepbook-network` bindings.\n//\n// Known mode:\n// 1. snapshotable — identity guard only.\n// 2. codegenable — `deepbook-network` bindings (mode='known').\n//\n// Resource id: `deepbook/<name>`. Plugin key: `deepbook:<name>`.\n\nimport { Effect } from 'effect';\n\nimport { defineModeNamespace } from '../../api/mode-narrowed-factory.ts';\nimport { definePlugin, resource, type ResourceValueOf } from '../../api/define-plugin.ts';\nimport { pluginErrorContributions } from '../../api/plugin-errors.ts';\nimport type { CodegenableDecl } from '../../contracts/codegenable.ts';\nimport type { SnapshotableDecl } from '../../contracts/snapshotable.ts';\nimport { ArtifactPublisherService } from '../../substrate/runtime/artifact-publisher/index.ts';\nimport { setCurrentPluginPhase } from '../../substrate/runtime/current-plugin.ts';\nimport { passthroughOrWrap } from '../../substrate/runtime/passthrough-or-wrap.ts';\nimport { suiResource } from '../sui/index.ts';\nimport type { AccountValue } from '../account/index.ts';\nimport type { CoinValue } from '../coin/index.ts';\nimport type { LocalPackageResolved } from '../package/index.ts';\n\nimport { deepbookPluginKey } from './plugin-key.ts';\nimport { DeepbookSpans } from './spans.ts';\nimport {\n\tDEEPBOOK_ERROR_TAGS,\n\tdeepbookConfigError,\n\tdeepbookPluginError,\n\ttype DeepbookConfigError,\n\ttype DeepbookError,\n\ttype DeepbookPluginError,\n} from './errors.ts';\nimport { makeDeepbookCodegenable, type DeepbookBindings } from './codegen.ts';\nimport {\n\tmakeDeepbookDeepFundingContribution,\n\tmakeDeepbookDeepFundingStrategy,\n\ttype DeepbookDeepFundingStrategy,\n} from './faucet-strategy.ts';\nimport { makeKnownSnapshotable, makeLocalSnapshotable } from './snapshot.ts';\nimport {\n\tcreateDeepbookPools,\n\tseedDeepbookPools,\n\ttype DeepbookDeployment,\n\ttype ResolvedDeepbookPoolSpec,\n} from './deploy.ts';\nimport { initLocalPythFeeds } from './pyth/index.ts';\nimport type {\n\tAccountMemberAlias,\n\tDeepbookPackageMember,\n\tDeepbookPool,\n\tDeepbookPoolSpec,\n\tPythHandle,\n\tPythOptions,\n} from './types.ts';\n\n// ---------------------------------------------------------------------------\n// Resource — the resolved value all consumers read\n// ---------------------------------------------------------------------------\n\nexport type DeepbookResourceId<Name extends string> = `deepbook/${Name}`;\n\nconst makeDeepbookResource = <Name extends string>(name: Name) =>\n\tresource<DeepbookResourceId<Name>, DeepbookResolved>(\n\t\t`deepbook/${name}` as DeepbookResourceId<Name>,\n\t);\n\n/** The deepbook resolved value. Mode-asymmetric:\n *\n * - `adminCapId` is `null` for known-deployment mode.\n * - `margin` / `serverUrl` / `indexerUrl` / `marketMakerRunning`\n * are `null` when the corresponding sub-feature is not enabled. */\nexport interface DeepbookResolved {\n\treadonly mode: 'local' | 'override' | 'known';\n\treadonly chain: string;\n\treadonly packageId: string;\n\treadonly registryId: string;\n\treadonly adminCapId: string | null;\n\treadonly deepTreasuryId: string | null;\n\treadonly pools: ReadonlyArray<DeepbookPool>;\n\treadonly pyth: PythHandle | null;\n\treadonly margin: {\n\t\treadonly packageId: string;\n\t\treadonly registryId: string;\n\t} | null;\n\treadonly serverUrl: string | null;\n\treadonly indexerUrl: string | null;\n\treadonly marketMakerRunning: boolean;\n\treadonly deepFundingStrategy: DeepbookDeepFundingStrategy | null;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface DeepbookCommonOptions {\n\treadonly name?: string;\n}\n\n/** Override mode wraps an explicitly supplied deployment. It does not\n * publish or manage DeepBook locally. */\nexport interface DeepbookOverrideOptions extends DeepbookCommonOptions {\n\treadonly packageId: string;\n\treadonly registryId: string;\n\treadonly adminCapId: string;\n\treadonly chain?: string;\n}\n\n/** Local mode wraps an explicitly supplied local DeepBook package. */\nexport interface DeepbookLocalOptions<\n\tPublisher extends AccountMemberAlias = AccountMemberAlias,\n\tPackage extends DeepbookPackageMember = DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tPyth extends PythOptions | undefined = undefined,\n> extends DeepbookCommonOptions {\n\t/** Publisher account — Direct Member Ref (locked API decision). */\n\treadonly publisher: Publisher;\n\t/** Published DeepBook package member. The package must capture the\n\t * `registry::Registry` and `registry::DeepbookAdminCap` object ids. */\n\treadonly package: Package;\n\t/** Optional local mock-Pyth package + feed setup. */\n\treadonly pyth?: Pyth;\n\t/** Capture key for the package-created `registry::Registry`. */\n\treadonly registryIdKey?: string;\n\t/** Capture key for the package-created `registry::DeepbookAdminCap`. */\n\treadonly adminCapIdKey?: string;\n\t/** Optional capture key for a DEEP treasury object used by SDK bindings. */\n\treadonly deepTreasuryIdKey?: string;\n\t/** Pools to create after the DeepBook package publishes. Pass `[]`\n\t * only for composition tests or known-empty deployments. */\n\treadonly pools: Pools;\n}\n\nexport type DeepbookKnownNetwork = 'mainnet' | 'testnet';\n\ninterface DeepbookKnownCommonOptions extends DeepbookCommonOptions {\n\t/** Optional chain id pin (defaults to the configured network). */\n\treadonly chain?: string;\n}\n\ninterface DeepbookKnownNetworkOptions extends DeepbookKnownCommonOptions {\n\treadonly network: DeepbookKnownNetwork;\n\treadonly packageId?: string;\n\treadonly registryId?: string;\n}\n\ninterface DeepbookKnownExplicitOptions extends DeepbookKnownCommonOptions {\n\treadonly packageId: string;\n\treadonly registryId: string;\n\treadonly network?: DeepbookKnownNetwork;\n}\n\nexport type DeepbookKnownOptions = DeepbookKnownNetworkOptions | DeepbookKnownExplicitOptions;\n\nexport type DeepbookOptions<\n\tPublisher extends AccountMemberAlias = AccountMemberAlias,\n\tPyth extends PythOptions | undefined = PythOptions | undefined,\n> =\n\t| ({\n\t\t\treadonly mode: 'local';\n\t } & DeepbookLocalOptions<\n\t\t\tPublisher,\n\t\t\tDeepbookPackageMember,\n\t\t\tReadonlyArray<DeepbookPoolSpec>,\n\t\t\tPyth\n\t >)\n\t| ({ readonly mode: 'override' } & DeepbookOverrideOptions)\n\t| ({ readonly mode: 'known' } & DeepbookKnownOptions);\n\n// ---------------------------------------------------------------------------\n// Plugin construction — override\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_NAME = 'deepbook';\nconst deepbookErrorContributions = pluginErrorContributions(DEEPBOOK_ERROR_TAGS);\n\ntype DeepbookLocalEmptyPoolOptions<\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPyth extends PythOptions | undefined = undefined,\n> = Omit<DeepbookLocalOptions<Publisher, Package, readonly [], Pyth>, 'pools'> & {\n\treadonly pools: readonly [];\n};\n\nconst KNOWN_DEEPBOOK_DEPLOYMENTS: Record<\n\tDeepbookKnownNetwork,\n\t{\n\t\treadonly chain: string;\n\t\treadonly packageId: string;\n\t\treadonly registryId: string;\n\t\treadonly deepTreasuryId: string;\n\t\treadonly pyth: PythHandle;\n\t}\n> = {\n\ttestnet: {\n\t\tchain: 'sui:testnet',\n\t\tpackageId: '0x22be4cade64bf2d02412c7e8d0e8beea2f78828b948118d46735315409371a3c',\n\t\tregistryId: '0x7c256edbda983a2cd6f946655f4bf3f00a41043993781f8674a7046e8c0e11d1',\n\t\tdeepTreasuryId: '0x69fffdae0075f8f71f4fa793549c11079266910e8905169845af1f5d00e09dcb',\n\t\tpyth: {\n\t\t\tpackageId: null,\n\t\t\tstateId: '0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c',\n\t\t\twormholeStateId: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790',\n\t\t\tfeeds: [],\n\t\t},\n\t},\n\tmainnet: {\n\t\tchain: 'sui:mainnet',\n\t\tpackageId: '0xf48222c4e057fa468baf136bff8e12504209d43850c5778f76159292a96f621e',\n\t\tregistryId: '0xaf16199a2dff736e9f07a845f23c5da6df6f756eddb631aed9d24a93efc4549d',\n\t\tdeepTreasuryId: '0x032abf8948dda67a271bcc18e776dbbcfb0d58c8d288a700ff0d5521e57a1ffe',\n\t\tpyth: {\n\t\t\tpackageId: null,\n\t\t\tstateId: '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n\t\t\twormholeStateId: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n\t\t\tfeeds: [],\n\t\t},\n\t},\n};\n\ntype PoolCoinRefs<Pools extends ReadonlyArray<DeepbookPoolSpec>> =\n\tPools[number] extends DeepbookPoolSpec<infer Base, infer Quote> ? Base | Quote : never;\ntype PoolCoinRefTuple<Pools extends ReadonlyArray<DeepbookPoolSpec>> = Pools extends readonly []\n\t? readonly []\n\t: readonly PoolCoinRefs<Pools>[];\n\ntype PythRefs<Pyth extends PythOptions | undefined> =\n\tPyth extends PythOptions<infer Package, infer Pusher> ? readonly [Pusher, Package] : readonly [];\n\ntype LocalDependsOn<\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec>,\n\tPyth extends PythOptions | undefined,\n> = readonly [\n\ttypeof suiResource,\n\tPublisher,\n\tPackage,\n\t...PythRefs<Pyth>,\n\t...PoolCoinRefTuple<Pools>,\n];\n\nconst poolCoinRefs = <Pools extends ReadonlyArray<DeepbookPoolSpec>>(\n\tpools: Pools,\n): ReadonlyArray<PoolCoinRefs<Pools>> =>\n\tpools.flatMap((pool) => [pool.base.coin, pool.quote.coin]) as unknown as ReadonlyArray<\n\t\tPoolCoinRefs<Pools>\n\t>;\n\nconst pythRefs = <Pyth extends PythOptions | undefined>(pyth: Pyth): PythRefs<Pyth> =>\n\t(pyth === undefined ? [] : [pyth.pusher, pyth.package]) as unknown as PythRefs<Pyth>;\n\nconst localDependsOn = <\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec>,\n\tPyth extends PythOptions | undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): LocalDependsOn<Publisher, Package, Pools, Pyth> =>\n\t[\n\t\tsuiResource,\n\t\topts.publisher,\n\t\topts.package,\n\t\t...pythRefs(opts.pyth),\n\t\t...poolCoinRefs(opts.pools),\n\t] as unknown as LocalDependsOn<Publisher, Package, Pools, Pyth>;\n\nconst requireCapturedId = (\n\tpkg: LocalPackageResolved,\n\tkey: string,\n\tkind: 'registryId' | 'adminCapId',\n): Effect.Effect<string, DeepbookPluginError> => {\n\tconst value = pkg.captured[key];\n\tif (typeof value === 'string' && value.length > 0) {\n\t\treturn Effect.succeed(value);\n\t}\n\treturn Effect.fail(\n\t\tdeepbookPluginError(\n\t\t\t'publish',\n\t\t\t`deepbook local package '${pkg.name}' is missing captured ${kind} '${key}'.`,\n\t\t),\n\t);\n};\n\nconst requirePoolCoinValue = (\n\tcoinValuesByRefId: ReadonlyMap<string, CoinValue>,\n\tpoolName: string,\n\tside: 'base' | 'quote',\n\tcoinRefId: string,\n): Effect.Effect<CoinValue, DeepbookConfigError> => {\n\tconst value = coinValuesByRefId.get(coinRefId);\n\tif (value === undefined) {\n\t\t// Compose-time bug — `dependsOn`/`poolCoinRefs` dropped this coin.\n\t\t// Surface a typed config error naming the missing coin id rather\n\t\t// than letting a double-cast `undefined` slip into the resolved\n\t\t// pool spec. Lands on the typed E channel (not a sync throw, which\n\t\t// inside Effect.gen would become an uncaught DEFECT that\n\t\t// `passthroughOrWrap` could not see); `DeepbookConfigError` is in\n\t\t// `DEEPBOOK_ERROR_TAGS`, so the outer pipeline passes it through\n\t\t// untouched.\n\t\treturn Effect.fail(\n\t\t\tdeepbookConfigError(\n\t\t\t\t'pools',\n\t\t\t\t`deepbook: pool '${poolName}' ${side} coin '${coinRefId}' was not resolved by the dependency tuple.`,\n\t\t\t\t'This is a compose-time bug — ensure the coin member is included in `dependsOn`/`poolCoinRefs`.',\n\t\t\t),\n\t\t);\n\t}\n\treturn Effect.succeed(value);\n};\n\nconst resolvePoolSpecs = (\n\tpools: ReadonlyArray<DeepbookPoolSpec>,\n\tcoinValuesByRefId: ReadonlyMap<string, CoinValue>,\n): Effect.Effect<ReadonlyArray<ResolvedDeepbookPoolSpec>, DeepbookConfigError> =>\n\tEffect.forEach(pools, (pool) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst base = yield* requirePoolCoinValue(\n\t\t\t\tcoinValuesByRefId,\n\t\t\t\tpool.name,\n\t\t\t\t'base',\n\t\t\t\tpool.base.coin.id,\n\t\t\t);\n\t\t\tconst quote = yield* requirePoolCoinValue(\n\t\t\t\tcoinValuesByRefId,\n\t\t\t\tpool.name,\n\t\t\t\t'quote',\n\t\t\t\tpool.quote.coin.id,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tname: pool.name,\n\t\t\t\tbase: pool.base.key,\n\t\t\t\tquote: pool.quote.key,\n\t\t\t\tbaseCoinType: base.fullCoinType,\n\t\t\t\tquoteCoinType: quote.fullCoinType,\n\t\t\t\t...(base.fundingStrategy === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { baseFundingStrategy: base.fundingStrategy }),\n\t\t\t\t...(quote.fundingStrategy === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { quoteFundingStrategy: quote.fundingStrategy }),\n\t\t\t\ttickSize: pool.tickSize,\n\t\t\t\tlotSize: pool.lotSize,\n\t\t\t\tminSize: pool.minSize,\n\t\t\t\twhitelisted: pool.whitelisted ?? true,\n\t\t\t\tstablePool: pool.stablePool ?? false,\n\t\t\t\t...(pool.seed === undefined ? {} : { seed: pool.seed }),\n\t\t\t};\n\t\t}),\n\t);\n\nconst assertUniquePoolNames = (name: string, pools: ReadonlyArray<DeepbookPoolSpec>) => {\n\tconst seen = new Set<string>();\n\tfor (const pool of pools) {\n\t\tif (seen.has(pool.name)) {\n\t\t\tthrow deepbookConfigError(\n\t\t\t\t'pools',\n\t\t\t\t`deepbook({mode:'local', name:'${name}'}) has duplicate pool '${pool.name}'.`,\n\t\t\t\t'Give each local DeepBook pool a unique SDK key.',\n\t\t\t);\n\t\t}\n\t\tseen.add(pool.name);\n\t\tfor (const order of pool.seed?.orders ?? []) {\n\t\t\tif (order.quantity < pool.minSize) {\n\t\t\t\tthrow deepbookConfigError(\n\t\t\t\t\t'pools',\n\t\t\t\t\t`deepbook({mode:'local', name:'${name}'}) seed order for pool '${pool.name}' is below minSize.`,\n\t\t\t\t\t'Use a seed order quantity greater than or equal to the pool minSize.',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (order.quantity % pool.lotSize !== 0n) {\n\t\t\t\tthrow deepbookConfigError(\n\t\t\t\t\t'pools',\n\t\t\t\t\t`deepbook({mode:'local', name:'${name}'}) seed order for pool '${pool.name}' is not lot-aligned.`,\n\t\t\t\t\t'Use a seed order quantity divisible by the pool lotSize.',\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (order.price % pool.tickSize !== 0n) {\n\t\t\t\tthrow deepbookConfigError(\n\t\t\t\t\t'pools',\n\t\t\t\t\t`deepbook({mode:'local', name:'${name}'}) seed order for pool '${pool.name}' is not tick-aligned.`,\n\t\t\t\t\t'Use a seed order price divisible by the pool tickSize.',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst buildOverridePlugin = (opts: DeepbookOverrideOptions) => {\n\tconst name = opts.name ?? DEFAULT_NAME;\n\tif (!opts.packageId || !opts.registryId || !opts.adminCapId) {\n\t\tthrow deepbookConfigError(\n\t\t\t'packageId',\n\t\t\t`deepbook({mode:'override', name:'${name}'}) requires packageId, registryId, and adminCapId.`,\n\t\t\t`Pass explicit deployment ids or use deepbook({mode:'known', network:'testnet'}).`,\n\t\t);\n\t}\n\tconst deepbookResource = makeDeepbookResource(name);\n\tconst snap = makeKnownSnapshotable({ name });\n\n\treturn definePlugin({\n\t\tid: deepbookResource.id,\n\t\tdependsOn: [suiResource] as const,\n\t\trole: 'task',\n\t\tsection: 'service',\n\t\tpluginKey: deepbookPluginKey(name),\n\t\tstart: (deps) =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tconst [sui] = deps;\n\t\t\t\tconst chain = opts.chain ?? sui.chain;\n\t\t\t\tconst resolved: DeepbookResolved = {\n\t\t\t\t\tmode: 'override',\n\t\t\t\t\tchain,\n\t\t\t\t\tpackageId: opts.packageId,\n\t\t\t\t\tregistryId: opts.registryId,\n\t\t\t\t\tadminCapId: opts.adminCapId,\n\t\t\t\t\tdeepTreasuryId: null,\n\t\t\t\t\tpools: [],\n\t\t\t\t\tpyth: null,\n\t\t\t\t\tmargin: null,\n\t\t\t\t\tserverUrl: null,\n\t\t\t\t\tindexerUrl: null,\n\t\t\t\t\tmarketMakerRunning: false,\n\t\t\t\t\tdeepFundingStrategy: null,\n\t\t\t\t};\n\t\t\t\treturn resolved;\n\t\t\t}),\n\t\tcapabilities: ({ value: resolved }) => {\n\t\t\tconst bindings: DeepbookBindings = {\n\t\t\t\tname,\n\t\t\t\tchain: resolved.chain,\n\t\t\t\tpackageId: resolved.packageId,\n\t\t\t\tregistryId: resolved.registryId,\n\t\t\t\tadminCapId: resolved.adminCapId,\n\t\t\t\tdeepTreasuryId: resolved.deepTreasuryId,\n\t\t\t\tpools: [],\n\t\t\t\tpyth: null,\n\t\t\t\tmargin: null,\n\t\t\t\tserverUrl: null,\n\t\t\t\tindexerUrl: null,\n\t\t\t};\n\t\t\tconst codegen: CodegenableDecl<'deepbook-network'> = makeDeepbookCodegenable(bindings);\n\t\t\treturn [snap, codegen] as const;\n\t\t},\n\t\terrorContributions: deepbookErrorContributions,\n\t});\n};\n\nconst buildLocalPlugin = <\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n) => {\n\tconst name = opts.name ?? DEFAULT_NAME;\n\tif (!opts.package) {\n\t\tthrow deepbookConfigError(\n\t\t\t'packageId',\n\t\t\t`deepbook({mode:'local', name:'${name}'}) requires a DeepBook package ref.`,\n\t\t\t`Pass \\`package: <localPackageMember>\\` with captured registryId/adminCapId.`,\n\t\t);\n\t}\n\tassertUniquePoolNames(name, opts.pools);\n\n\tconst deepbookResource = makeDeepbookResource(name);\n\tconst dependsOn = localDependsOn(opts);\n\n\treturn definePlugin({\n\t\tid: deepbookResource.id,\n\t\tdependsOn,\n\t\trole: 'task',\n\t\tsection: 'service',\n\t\tpluginKey: deepbookPluginKey(name),\n\t\tstart: (deps) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst [sui, publisher, deepbookPackage, ...extraValues] = deps as unknown as readonly [\n\t\t\t\t\tResourceValueOf<typeof suiResource>,\n\t\t\t\t\tAccountValue,\n\t\t\t\t\tLocalPackageResolved,\n\t\t\t\t\t...(AccountValue | LocalPackageResolved | CoinValue)[],\n\t\t\t\t];\n\t\t\t\tconst pythValueCount = opts.pyth === undefined ? 0 : 2;\n\t\t\t\tconst pythValues = extraValues.slice(0, pythValueCount);\n\t\t\t\tconst coinValues = extraValues.slice(pythValueCount) as CoinValue[];\n\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t[DeepbookSpans.name]: name,\n\t\t\t\t\t[DeepbookSpans.chain]: sui.chain,\n\t\t\t\t\t[DeepbookSpans.publisher]: publisher.address,\n\t\t\t\t});\n\t\t\t\tyield* setCurrentPluginPhase('reading deployment captures');\n\n\t\t\t\tconst registryId = yield* requireCapturedId(\n\t\t\t\t\tdeepbookPackage,\n\t\t\t\t\topts.registryIdKey ?? 'registryId',\n\t\t\t\t\t'registryId',\n\t\t\t\t);\n\t\t\t\tconst adminCapId = yield* requireCapturedId(\n\t\t\t\t\tdeepbookPackage,\n\t\t\t\t\topts.adminCapIdKey ?? 'adminCapId',\n\t\t\t\t\t'adminCapId',\n\t\t\t\t);\n\t\t\t\tconst deepTreasuryId =\n\t\t\t\t\topts.deepTreasuryIdKey === undefined\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: (deepbookPackage.captured[opts.deepTreasuryIdKey] ?? null);\n\t\t\t\tconst deployment: DeepbookDeployment = {\n\t\t\t\t\tpackageId: deepbookPackage.packageId,\n\t\t\t\t\tregistryId,\n\t\t\t\t\tadminCapId,\n\t\t\t\t\tdeepTreasuryId,\n\t\t\t\t};\n\t\t\t\tconst poolRefs = poolCoinRefs(opts.pools);\n\t\t\t\tconst coinValuesByRefId = new Map<string, CoinValue>();\n\t\t\t\tfor (let i = 0; i < poolRefs.length; i += 1) {\n\t\t\t\t\tconst ref = poolRefs[i];\n\t\t\t\t\tconst value = coinValues[i];\n\t\t\t\t\tif (ref !== undefined && value !== undefined) {\n\t\t\t\t\t\tcoinValuesByRefId.set(ref.id, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst poolSpecs = yield* resolvePoolSpecs(opts.pools, coinValuesByRefId);\n\t\t\t\tconst artifactPublisher = yield* ArtifactPublisherService;\n\t\t\t\tyield* setCurrentPluginPhase(\n\t\t\t\t\topts.pyth === undefined ? 'creating pools' : 'initializing Pyth feeds',\n\t\t\t\t);\n\t\t\t\tconst pyth =\n\t\t\t\t\topts.pyth === undefined\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: yield* initLocalPythFeeds(\n\t\t\t\t\t\t\t\tartifactPublisher,\n\t\t\t\t\t\t\t\tsui.sdk,\n\t\t\t\t\t\t\t\tsui.chain,\n\t\t\t\t\t\t\t\tpythValues[0] as AccountValue,\n\t\t\t\t\t\t\t\t{ packageId: (pythValues[1] as LocalPackageResolved).packageId },\n\t\t\t\t\t\t\t\topts.pyth.feeds,\n\t\t\t\t\t\t\t);\n\t\t\t\tyield* setCurrentPluginPhase('creating pools');\n\t\t\t\tconst poolResult = yield* createDeepbookPools(\n\t\t\t\t\tartifactPublisher,\n\t\t\t\t\tsui.sdk,\n\t\t\t\t\tsui.chain,\n\t\t\t\t\tpublisher,\n\t\t\t\t\tdeployment,\n\t\t\t\t\tpoolSpecs,\n\t\t\t\t);\n\t\t\t\tyield* setCurrentPluginPhase('seeding pools');\n\t\t\t\tconst seedResults = yield* seedDeepbookPools(\n\t\t\t\t\tartifactPublisher,\n\t\t\t\t\tsui.sdk,\n\t\t\t\t\tsui.chain,\n\t\t\t\t\tpublisher,\n\t\t\t\t\tdeployment,\n\t\t\t\t\tpoolSpecs,\n\t\t\t\t\tpoolResult.pools,\n\t\t\t\t);\n\t\t\t\tyield* setCurrentPluginPhase(null);\n\n\t\t\t\tconst resolved: DeepbookResolved = {\n\t\t\t\t\tmode: 'local',\n\t\t\t\t\tchain: sui.chain,\n\t\t\t\t\tpackageId: deployment.packageId,\n\t\t\t\t\tregistryId: deployment.registryId,\n\t\t\t\t\tadminCapId: deployment.adminCapId,\n\t\t\t\t\tdeepTreasuryId,\n\t\t\t\t\tpools: poolResult.pools,\n\t\t\t\t\tpyth,\n\t\t\t\t\tmargin: null,\n\t\t\t\t\tserverUrl: null,\n\t\t\t\t\tindexerUrl: null,\n\t\t\t\t\tmarketMakerRunning: seedResults.length > 0,\n\t\t\t\t\tdeepFundingStrategy: null,\n\t\t\t\t};\n\t\t\t\treturn resolved;\n\t\t\t}).pipe(\n\t\t\t\t// The body's aggregate E channel includes substrate Effects\n\t\t\t\t// whose error shape is unknown to TS (ArtifactPublisher\n\t\t\t\t// produce bodies, dependency reads). `Effect.catchTags`\n\t\t\t\t// would need a statically-known tagged union; the\n\t\t\t\t// substrate's `passthroughOrWrap` runtime-checks the `_tag`\n\t\t\t\t// against `DEEPBOOK_ERROR_TAGS`, passing typed deepbook\n\t\t\t\t// errors through untouched and wrapping everything else\n\t\t\t\t// under `'publish'` so cascade attribution stays with the\n\t\t\t\t// plugin.\n\t\t\t\tpassthroughOrWrap.for<DeepbookError>()(DEEPBOOK_ERROR_TAGS, (err) =>\n\t\t\t\t\tdeepbookPluginError('publish', `deepbook acquire failed: ${String(err)}`, {\n\t\t\t\t\t\tcause: err,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\tcapabilities: ({ value: resolved }) => {\n\t\t\tconst snap: SnapshotableDecl = makeLocalSnapshotable({ name });\n\t\t\tconst bindings: DeepbookBindings = {\n\t\t\t\tname,\n\t\t\t\tchain: resolved.chain,\n\t\t\t\tpackageId: resolved.packageId,\n\t\t\t\tregistryId: resolved.registryId,\n\t\t\t\tadminCapId: resolved.adminCapId,\n\t\t\t\tdeepTreasuryId: resolved.deepTreasuryId,\n\t\t\t\tpools: resolved.pools.map((p) => ({\n\t\t\t\t\tname: p.name,\n\t\t\t\t\tpoolId: p.poolId,\n\t\t\t\t\tbase: p.base,\n\t\t\t\t\tquote: p.quote,\n\t\t\t\t\tbaseCoinType: p.baseCoinType,\n\t\t\t\t\tquoteCoinType: p.quoteCoinType,\n\t\t\t\t})),\n\t\t\t\tpyth: resolved.pyth\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpackageId: resolved.pyth.packageId,\n\t\t\t\t\t\t\tstateId: resolved.pyth.stateId,\n\t\t\t\t\t\t\twormholeStateId: resolved.pyth.wormholeStateId,\n\t\t\t\t\t\t\tfeeds: resolved.pyth.feeds.map((feed) => ({\n\t\t\t\t\t\t\t\tsymbol: feed.symbol,\n\t\t\t\t\t\t\t\tfeedId: feed.feedId,\n\t\t\t\t\t\t\t\tpriceInfoObjectId: feed.priceInfoObjectId,\n\t\t\t\t\t\t\t\tprice: feed.price.toString(),\n\t\t\t\t\t\t\t\texpo: feed.expo,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t\tmargin: resolved.margin,\n\t\t\t\tserverUrl: resolved.serverUrl,\n\t\t\t\tindexerUrl: resolved.indexerUrl,\n\t\t\t};\n\t\t\tconst codegen: CodegenableDecl<'deepbook-network'> = makeDeepbookCodegenable(bindings);\n\t\t\treturn [snap, codegen] as const;\n\t\t},\n\t\terrorContributions: deepbookErrorContributions,\n\t});\n};\n\nfunction buildLocalPluginPublic<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec>,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\nfunction buildLocalPluginPublic<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec>,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(opts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>) {\n\treturn buildLocalPlugin(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Plugin construction — known\n// ---------------------------------------------------------------------------\n\nconst buildKnownPlugin = (opts: DeepbookKnownOptions) => {\n\tconst name = opts.name ?? DEFAULT_NAME;\n\tconst known = opts.network ? KNOWN_DEEPBOOK_DEPLOYMENTS[opts.network] : null;\n\tconst packageId = opts.packageId ?? known?.packageId;\n\tconst registryId = opts.registryId ?? known?.registryId;\n\tif (!packageId || !registryId) {\n\t\tthrow deepbookConfigError(\n\t\t\t'packageId',\n\t\t\t`deepbook({mode:'known', name:'${name}'}) requires packageId and registryId, or network:'mainnet'|'testnet'.`,\n\t\t\t`Pass explicit ids or use deepbook({mode:'known', network:'testnet'}).`,\n\t\t);\n\t}\n\tconst deepbookResource = makeDeepbookResource(name);\n\tconst snap = makeKnownSnapshotable({ name });\n\n\treturn definePlugin({\n\t\tid: deepbookResource.id,\n\t\tdependsOn: [suiResource] as const,\n\t\trole: 'task',\n\t\tsection: 'service',\n\t\tpluginKey: deepbookPluginKey(name),\n\t\tstart: (deps) =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tconst [sui] = deps;\n\t\t\t\tconst chain = opts.chain ?? known?.chain ?? sui.chain;\n\t\t\t\tconst resolved: DeepbookResolved = {\n\t\t\t\t\tmode: 'known',\n\t\t\t\t\tchain,\n\t\t\t\t\tpackageId,\n\t\t\t\t\tregistryId,\n\t\t\t\t\tadminCapId: null,\n\t\t\t\t\tdeepTreasuryId: known?.deepTreasuryId ?? null,\n\t\t\t\t\tpools: [],\n\t\t\t\t\tpyth: known?.pyth ?? null,\n\t\t\t\t\tmargin: null,\n\t\t\t\t\tserverUrl: null,\n\t\t\t\t\tindexerUrl: null,\n\t\t\t\t\tmarketMakerRunning: false,\n\t\t\t\t\tdeepFundingStrategy:\n\t\t\t\t\t\topts.network === 'testnet' && String(chain) === 'sui:testnet'\n\t\t\t\t\t\t\t? makeDeepbookDeepFundingStrategy({ suiSdk: sui.sdk })\n\t\t\t\t\t\t\t: null,\n\t\t\t\t};\n\t\t\t\treturn resolved;\n\t\t\t}),\n\t\tcapabilities: ({ value: resolved }) => {\n\t\t\tconst bindings: DeepbookBindings = {\n\t\t\t\tname,\n\t\t\t\tchain: resolved.chain,\n\t\t\t\tpackageId: resolved.packageId,\n\t\t\t\tregistryId: resolved.registryId,\n\t\t\t\tadminCapId: null,\n\t\t\t\tdeepTreasuryId: resolved.deepTreasuryId,\n\t\t\t\tpools: [],\n\t\t\t\tpyth: resolved.pyth\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpackageId: resolved.pyth.packageId,\n\t\t\t\t\t\t\tstateId: resolved.pyth.stateId,\n\t\t\t\t\t\t\twormholeStateId: resolved.pyth.wormholeStateId,\n\t\t\t\t\t\t\tfeeds: resolved.pyth.feeds.map((feed) => ({\n\t\t\t\t\t\t\t\tsymbol: feed.symbol,\n\t\t\t\t\t\t\t\tfeedId: feed.feedId,\n\t\t\t\t\t\t\t\tpriceInfoObjectId: feed.priceInfoObjectId,\n\t\t\t\t\t\t\t\tprice: feed.price.toString(),\n\t\t\t\t\t\t\t\texpo: feed.expo,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t\tmargin: null,\n\t\t\t\tserverUrl: null,\n\t\t\t\tindexerUrl: null,\n\t\t\t};\n\t\t\tconst deepFunding =\n\t\t\t\tresolved.deepFundingStrategy === null\n\t\t\t\t\t? []\n\t\t\t\t\t: [makeDeepbookDeepFundingContribution(resolved.deepFundingStrategy)];\n\t\t\treturn [snap, makeDeepbookCodegenable(bindings), ...deepFunding] as const;\n\t\t},\n\t\terrorContributions: deepbookErrorContributions,\n\t});\n};\n\n// ---------------------------------------------------------------------------\n// Default option resolution (env-driven)\n// ---------------------------------------------------------------------------\n\nconst resolveDefaultMode = <\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts?: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookOptions<Publisher, Pyth> => {\n\tconst env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\n\t\t?.env?.DEVSTACK_NETWORK;\n\tif (env === undefined || env === 'localnet') {\n\t\tif (!opts || !opts.publisher) {\n\t\t\tthrow deepbookConfigError(\n\t\t\t\t'publisher',\n\t\t\t\t`deepbook() on localnet requires \\`publisher\\` and \\`package\\` member refs.`,\n\t\t\t\t`Pass options via deepbook({mode:'local', publisher, package: deepbookPackage, ...}).`,\n\t\t\t);\n\t\t}\n\t\treturn { mode: 'local', ...opts };\n\t}\n\t// Non-local default: refuse — known mode requires explicit\n\t// packageId/registryId. The user passes them via\n\t// `deepbookFor(network).known({...})` or `deepbook({mode:'known',...})`.\n\tthrow deepbookConfigError(\n\t\t'mode',\n\t\t`deepbook(): cannot auto-default to known mode on network='${env}'.`,\n\t\t`Use deepbookFor(network).known({packageId, registryId, ...}).`,\n\t);\n};\n\n// ---------------------------------------------------------------------------\n// User-facing factories\n// ---------------------------------------------------------------------------\n\n/** Env-driven factory. Defaults to local mode on localnet when passed local\n * options. Explicit `override` and `known` modes bypass env inference. */\ntype DeepbookLocalMember<\n\tPublisher extends AccountMemberAlias,\n\tPackage extends DeepbookPackageMember,\n\tPools extends ReadonlyArray<DeepbookPoolSpec>,\n\tPyth extends PythOptions | undefined = undefined,\n> = ReturnType<typeof buildLocalPlugin<Publisher, Package, Pools, Pyth>>;\ntype DeepbookOverrideMember = ReturnType<typeof buildOverridePlugin>;\ntype DeepbookKnownMember = ReturnType<typeof buildKnownPlugin>;\n\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: { readonly mode: 'local' } & DeepbookLocalEmptyPoolOptions<Publisher, Package, Pyth>,\n): DeepbookLocalMember<Publisher, Package, readonly [], Pyth>;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: { readonly mode: 'local' } & DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\nexport function deepbookCore(\n\topts: { readonly mode: 'override' } & DeepbookOverrideOptions,\n): DeepbookOverrideMember;\nexport function deepbookCore(\n\topts: { readonly mode: 'known' } & DeepbookKnownOptions,\n): DeepbookKnownMember;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalEmptyPoolOptions<Publisher, Package, Pyth>,\n): DeepbookLocalMember<Publisher, Package, readonly [], Pyth>;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n): DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\nexport function deepbookCore<\n\tconst Publisher extends AccountMemberAlias,\n\tconst Package extends DeepbookPackageMember,\n\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\tconst Pyth extends PythOptions | undefined = undefined,\n>(\n\topts?: DeepbookLocalOptions<Publisher, Package, Pools, Pyth> | DeepbookOptions<Publisher, Pyth>,\n):\n\t| DeepbookLocalMember<Publisher, Package, Pools, Pyth>\n\t| DeepbookOverrideMember\n\t| DeepbookKnownMember {\n\tconst resolved: DeepbookOptions<Publisher, Pyth> =\n\t\topts !== undefined && 'mode' in opts\n\t\t\t? (opts as DeepbookOptions<Publisher, Pyth>)\n\t\t\t: resolveDefaultMode(\n\t\t\t\t\topts as DeepbookLocalOptions<Publisher, Package, Pools, Pyth> | undefined,\n\t\t\t\t);\n\tswitch (resolved.mode) {\n\t\tcase 'local':\n\t\t\treturn buildLocalPluginPublic(\n\t\t\t\tresolved as { readonly mode: 'local' } & DeepbookLocalOptions<\n\t\t\t\t\tPublisher,\n\t\t\t\t\tPackage,\n\t\t\t\t\tPools,\n\t\t\t\t\tPyth\n\t\t\t\t>,\n\t\t\t) as DeepbookLocalMember<Publisher, Package, Pools, Pyth>;\n\t\tcase 'override':\n\t\t\treturn buildOverridePlugin(resolved);\n\t\tcase 'known':\n\t\t\treturn buildKnownPlugin(resolved);\n\t}\n}\n\n/** Mode-narrowed factory namespace.\n *\n * Usage:\n * const local = { mode: 'local', chain: 'sui:localnet' } as const;\n * deepbookFor(local).local({publisher, package, pools}) // OK\n * deepbookFor(local).override({packageId, registryId, adminCapId}) // OK\n * deepbookFor(local).known({...}) // OK\n *\n * const fork = { mode: 'fork', chain: 'sui:mainnet-fork', upstream: 'mainnet' } as const;\n * deepbookFor(fork).local({...}) // COMPILE ERROR\n * deepbookFor(fork).override({...}) // COMPILE ERROR\n *\n * The fork branch has NO `.local` or `.override` entry — `deepbookFor(forkNetwork).local`\n * is a compile-time refusal. */\nexport const deepbookFor = defineModeNamespace({\n\tlocal: {\n\t\tlocal: <\n\t\t\tconst Publisher extends AccountMemberAlias,\n\t\t\tconst Package extends DeepbookPackageMember,\n\t\t\tconst Pools extends ReadonlyArray<DeepbookPoolSpec> = readonly [],\n\t\t\tconst Pyth extends PythOptions | undefined = undefined,\n\t\t>(\n\t\t\topts: DeepbookLocalOptions<Publisher, Package, Pools, Pyth>,\n\t\t) => buildLocalPluginPublic(opts),\n\t\toverride: (opts: DeepbookOverrideOptions) => buildOverridePlugin(opts),\n\t\tknown: (opts: DeepbookKnownOptions) => buildKnownPlugin(opts),\n\t},\n\tlive: {\n\t\tknown: (opts: DeepbookKnownOptions) => buildKnownPlugin(opts),\n\t},\n\tfork: {\n\t\t// `.override` intentionally absent — compile-time refusal.\n\t\tknown: (opts: DeepbookKnownOptions) => buildKnownPlugin(opts),\n\t},\n});\n\nexport { deepbookCore as deepbook };\n\n// ---------------------------------------------------------------------------\n// Re-exports for advanced callers\n// ---------------------------------------------------------------------------\n\nexport {\n\tDEEPBOOK_DEEP_FAUCET_STRATEGY_KEY,\n\tDEEPBOOK_TESTNET_DEEP_COIN_TYPE,\n\tmakeDeepbookDeepFundingContribution,\n\tmakeDeepbookDeepFundingStrategy,\n\ttype DeepbookDeepFundingStrategy,\n\ttype DeepbookDeepFundingStrategyOptions,\n} from './faucet-strategy.ts';\nexport {\n\tDEEPBOOK_ERROR_TAGS,\n\ttype DeepbookError,\n\ttype DeepbookPluginError,\n\ttype DeepbookConfigError,\n\ttype DeepbookPhase,\n} from './errors.ts';\nexport type { DeepbookBindings, DeepbookPoolBinding } from './codegen.ts';\nexport type {\n\tAccountMemberAlias,\n\tCoinMemberAlias,\n\tDeepbookPackageMember,\n\tDeepbookPool,\n\tDeepbookPoolCoin,\n\tDeepbookPoolSeedLiquidity,\n\tDeepbookPoolSeedOrder,\n\tDeepbookPoolSpec,\n} from './types.ts';\nexport {\n\tDEEP_PRICE_FEED_ID,\n\tpythPriceFeedId,\n\tSUI_PRICE_FEED_ID,\n\tUSDC_PRICE_FEED_ID,\n} from './types.ts';\nexport { DeepbookSpans } from './spans.ts';\n"],"mappings":"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"}
|
|
@@ -1,26 +1,18 @@
|
|
|
1
|
-
import { chainId
|
|
2
|
-
import {
|
|
1
|
+
import { chainId } from "../../../substrate/brand.mjs";
|
|
2
|
+
import { probeManyLenient } from "../../../substrate/runtime/probes.mjs";
|
|
3
|
+
import { executeSuiTx, formatExecutedFailure } from "../../../substrate/runtime/sui-execute/index.mjs";
|
|
4
|
+
import { artifactPublishError } from "../../../primitives/artifact-publisher.mjs";
|
|
5
|
+
import { acquireOnChainArtifact } from "../../internal/acquire-on-chain-artifact.mjs";
|
|
6
|
+
import { DeepbookSpans } from "../spans.mjs";
|
|
3
7
|
import { deepbookPluginError } from "../errors.mjs";
|
|
8
|
+
import { stableContentHash } from "../hash.mjs";
|
|
4
9
|
import "../types.mjs";
|
|
5
|
-
import { Effect
|
|
6
|
-
import { createHash } from "node:crypto";
|
|
10
|
+
import { Effect } from "effect";
|
|
7
11
|
import { fromBase64, fromHex, toHex } from "@mysten/sui/utils";
|
|
8
12
|
import { Transaction } from "@mysten/sui/transactions";
|
|
9
13
|
//#region src/plugins/deepbook/pyth/index.ts
|
|
10
|
-
const CachedPythFeedSchema = Schema.Struct({
|
|
11
|
-
symbol: Schema.String,
|
|
12
|
-
feedId: Schema.String,
|
|
13
|
-
priceInfoObjectId: Schema.String,
|
|
14
|
-
price: Schema.String,
|
|
15
|
-
expo: Schema.Number
|
|
16
|
-
});
|
|
17
|
-
const CachedPythHandleSchema = Schema.Struct({
|
|
18
|
-
packageId: Schema.String,
|
|
19
|
-
feeds: Schema.Array(CachedPythFeedSchema)
|
|
20
|
-
});
|
|
21
14
|
const DEFAULT_EXPO = -8;
|
|
22
15
|
const PYTH_GAS_BUDGET = 2e8;
|
|
23
|
-
const stableContentHash = (input) => contentHash(createHash("sha256").update(input).digest("hex"));
|
|
24
16
|
const normalizeFeedId = (feedId) => feedId.replace(/^0x/i, "").toLowerCase();
|
|
25
17
|
const feedExpo = (feed) => feed.expo ?? DEFAULT_EXPO;
|
|
26
18
|
const toCachedFeed = (feed, priceInfoObjectId) => ({
|
|
@@ -56,16 +48,12 @@ const pythInputsHash = (pkg, signer, feeds) => stableContentHash([
|
|
|
56
48
|
].join("|")).sort()
|
|
57
49
|
].join("||"));
|
|
58
50
|
const buildVerifyProbe = (sdk, cached) => Effect.gen(function* () {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
64
|
-
if (raw === null || raw === void 0) return null;
|
|
65
|
-
}
|
|
51
|
+
if ((yield* probeManyLenient(cached.feeds.map((feed) => Effect.tryPromise({
|
|
52
|
+
try: () => sdk.core.getObject({ objectId: feed.priceInfoObjectId }),
|
|
53
|
+
catch: () => null
|
|
54
|
+
}).pipe(Effect.catch(() => Effect.succeed(null)))))).some((raw) => raw === null || raw === void 0)) return null;
|
|
66
55
|
return cached;
|
|
67
56
|
});
|
|
68
|
-
const transactionBuildClient = (sdk) => sdk.client;
|
|
69
57
|
const addI64 = (tx, packageId, value) => {
|
|
70
58
|
const raw = BigInt(value);
|
|
71
59
|
const negative = raw < 0n;
|
|
@@ -114,7 +102,6 @@ const addPriceInfo = (tx, packageId, feed, timestamp) => {
|
|
|
114
102
|
]
|
|
115
103
|
});
|
|
116
104
|
};
|
|
117
|
-
const priceObjectClient = (sdk) => sdk.client;
|
|
118
105
|
const feedIdBytesFromJson = (bytes) => {
|
|
119
106
|
if (typeof bytes === "string" && bytes.length > 0) try {
|
|
120
107
|
return fromBase64(bytes);
|
|
@@ -139,8 +126,8 @@ const feedIdFromJson = (json) => {
|
|
|
139
126
|
return normalizeFeedId(toHex(decoded));
|
|
140
127
|
};
|
|
141
128
|
const mapCreatedPriceObjects = async (sdk, objectIds) => {
|
|
142
|
-
const objects = await
|
|
143
|
-
objectIds,
|
|
129
|
+
const objects = await sdk.client.core.getObjects({
|
|
130
|
+
objectIds: [...objectIds],
|
|
144
131
|
include: { json: true }
|
|
145
132
|
});
|
|
146
133
|
const result = /* @__PURE__ */ new Map();
|
|
@@ -155,14 +142,13 @@ const pickCreatedPriceInfoObjects = (changes) => changes.filter((change) => chan
|
|
|
155
142
|
/** Create shared mock-Pyth PriceInfoObjects for local DeepBook feeds. */
|
|
156
143
|
const initLocalPythFeeds = (publisher, sdk, chain, signer, pkg, feeds) => Effect.gen(function* () {
|
|
157
144
|
if (feeds.length === 0) return null;
|
|
158
|
-
return fromCachedHandle(yield* publisher
|
|
145
|
+
return fromCachedHandle(yield* acquireOnChainArtifact(publisher, {
|
|
159
146
|
namespace: "deepbook/pyth",
|
|
160
147
|
chain: chainId(chain),
|
|
161
148
|
contentHash: pythInputsHash(pkg, signer, feeds),
|
|
162
|
-
verifySchema: CachedPythHandleSchema,
|
|
163
149
|
verify: (entry) => buildVerifyProbe(sdk, entry),
|
|
164
150
|
produce: Effect.gen(function* () {
|
|
165
|
-
const
|
|
151
|
+
const result = yield* executeSuiTx({
|
|
166
152
|
client: sdk.client,
|
|
167
153
|
signer,
|
|
168
154
|
build: async () => {
|
|
@@ -178,47 +164,32 @@ const initLocalPythFeeds = (publisher, sdk, chain, signer, pkg, feeds) => Effect
|
|
|
178
164
|
elements: priceInfos
|
|
179
165
|
})]
|
|
180
166
|
});
|
|
181
|
-
return tx.build({ client:
|
|
167
|
+
return tx.build({ client: sdk.client });
|
|
182
168
|
}
|
|
183
|
-
}).pipe(Effect.mapError((err) => ({
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
detail: `pyth feed transaction failed: ${err.message}`
|
|
187
|
-
})));
|
|
169
|
+
}).pipe(Effect.mapError((err) => artifactPublishError("produce-failed", `pyth feed transaction failed: ${err.message}`)));
|
|
170
|
+
if (result.$kind === "FailedTransaction") return yield* Effect.fail(artifactPublishError("produce-failed", `pyth feed transaction on-chain execution failed ` + formatExecutedFailure(result.FailedTransaction)));
|
|
171
|
+
const receipt = result.Transaction;
|
|
188
172
|
const created = pickCreatedPriceInfoObjects(receipt.objectChanges);
|
|
189
|
-
if (created.length !== feeds.length) return yield* Effect.fail({
|
|
190
|
-
_tag: "ArtifactPublishError",
|
|
191
|
-
reason: "produce-failed",
|
|
192
|
-
detail: `expected ${feeds.length} Pyth PriceInfoObject creations, got ${created.length} (digest=${receipt.digest}).`
|
|
193
|
-
});
|
|
173
|
+
if (created.length !== feeds.length) return yield* Effect.fail(artifactPublishError("produce-failed", `expected ${feeds.length} Pyth PriceInfoObject creations, got ${created.length} (digest=${receipt.digest}).`));
|
|
194
174
|
const idsByFeed = yield* Effect.tryPromise({
|
|
195
175
|
try: () => mapCreatedPriceObjects(sdk, created),
|
|
196
|
-
catch: (cause) => ({
|
|
197
|
-
_tag: "ArtifactPublishError",
|
|
198
|
-
reason: "produce-failed",
|
|
199
|
-
detail: `failed to read created Pyth PriceInfoObjects: ${cause instanceof Error ? cause.message : String(cause)}`
|
|
200
|
-
})
|
|
176
|
+
catch: (cause) => artifactPublishError("produce-failed", `failed to read created Pyth PriceInfoObjects: ${cause instanceof Error ? cause.message : String(cause)}`)
|
|
201
177
|
});
|
|
202
178
|
const cachedFeeds = [];
|
|
203
179
|
for (const feed of feeds) {
|
|
204
180
|
const priceInfoObjectId = idsByFeed.get(normalizeFeedId(feed.feedId));
|
|
205
|
-
if (priceInfoObjectId === void 0) return yield* Effect.fail({
|
|
206
|
-
_tag: "ArtifactPublishError",
|
|
207
|
-
reason: "produce-failed",
|
|
208
|
-
detail: `created Pyth PriceInfoObject for '${feed.symbol}' was not found by feed id.`
|
|
209
|
-
});
|
|
181
|
+
if (priceInfoObjectId === void 0) return yield* Effect.fail(artifactPublishError("produce-failed", `created Pyth PriceInfoObject for '${feed.symbol}' was not found by feed id.`));
|
|
210
182
|
cachedFeeds.push(toCachedFeed(feed, priceInfoObjectId));
|
|
211
183
|
}
|
|
212
184
|
return {
|
|
213
185
|
packageId: pkg.packageId,
|
|
214
186
|
feeds: cachedFeeds
|
|
215
187
|
};
|
|
216
|
-
})
|
|
217
|
-
register: () => Effect.void
|
|
188
|
+
})
|
|
218
189
|
}).pipe(Effect.mapError((err) => deepbookPluginError("pyth-feed", err._tag === "ArtifactPublishError" ? err.detail : String(err)))));
|
|
219
190
|
}).pipe(Effect.withSpan("devstack.plugin.deepbook.pyth.initFeeds", { attributes: {
|
|
220
|
-
|
|
221
|
-
|
|
191
|
+
[DeepbookSpans.pyth.packageId]: pkg.packageId,
|
|
192
|
+
[DeepbookSpans.pyth.feedCount]: feeds.length
|
|
222
193
|
} }));
|
|
223
194
|
//#endregion
|
|
224
195
|
export { initLocalPythFeeds };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["brandContentHash","brandChainId"],"sources":["../../../../src/plugins/deepbook/pyth/index.ts"],"sourcesContent":["// Pyth — internal module under the DeepBook plugin.\n//\n// Local mode uses the DeepBook sandbox's mock Pyth package shape: publish a\n// local Move package with `pyth::create_price_feeds`, then create shared\n// `PriceInfoObject`s for the requested feeds. This is intentionally not a\n// top-level devstack plugin; DeepBook owns the oracle wiring it needs.\n\nimport { createHash } from 'node:crypto';\n\nimport { Effect, Schema, type Scope } from 'effect';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { fromBase64, fromHex, toHex } from '@mysten/sui/utils';\n\nimport type { ArtifactPublisher } from '../../../primitives/artifact-publisher.ts';\nimport type {\n\tResolvedSigner,\n\tSuiExecuteClient,\n} from '../../../substrate/runtime/sui-execute/index.ts';\nimport { executeSuiTx } from '../../../substrate/runtime/sui-execute/index.ts';\nimport {\n\tchainId as brandChainId,\n\tcontentHash as brandContentHash,\n\ttype ContentHash,\n} from '../../../substrate/brand.ts';\nimport type { SuiSdkShim } from '../../sui/chain-probe.ts';\nimport { deepbookPluginError, type DeepbookPluginError } from '../errors.ts';\nimport type { PythFeed, PythHandle, PythPriceFeedId } from '../types.ts';\n\nexport interface PythDeployment {\n\treadonly packageId: string;\n}\n\ninterface CachedPythFeed {\n\treadonly symbol: string;\n\treadonly feedId: string;\n\treadonly priceInfoObjectId: string;\n\treadonly price: string;\n\treadonly expo: number;\n}\n\ninterface CachedPythHandle {\n\treadonly packageId: string;\n\treadonly feeds: ReadonlyArray<CachedPythFeed>;\n}\n\nconst CachedPythFeedSchema = Schema.Struct({\n\tsymbol: Schema.String,\n\tfeedId: Schema.String,\n\tpriceInfoObjectId: Schema.String,\n\tprice: Schema.String,\n\texpo: Schema.Number,\n});\n\nconst CachedPythHandleSchema = Schema.Struct({\n\tpackageId: Schema.String,\n\tfeeds: Schema.Array(CachedPythFeedSchema),\n});\n\nconst DEFAULT_EXPO = -8;\nconst PYTH_GAS_BUDGET = 200_000_000;\n\nconst stableContentHash = (input: string): ContentHash =>\n\tbrandContentHash(createHash('sha256').update(input).digest('hex'));\n\nconst normalizeFeedId = (feedId: string): string => feedId.replace(/^0x/i, '').toLowerCase();\n\nconst feedExpo = (feed: PythFeed): number => feed.expo ?? DEFAULT_EXPO;\n\nconst toCachedFeed = (feed: PythFeed, priceInfoObjectId: string): CachedPythFeed => ({\n\tsymbol: feed.symbol,\n\tfeedId: normalizeFeedId(feed.feedId),\n\tpriceInfoObjectId,\n\tprice: feed.initialPrice.toString(),\n\texpo: feedExpo(feed),\n});\n\nconst fromCachedHandle = (cached: CachedPythHandle): PythHandle => ({\n\tpackageId: cached.packageId,\n\tstateId: null,\n\twormholeStateId: null,\n\tfeeds: cached.feeds.map((feed) => ({\n\t\tsymbol: feed.symbol,\n\t\tfeedId: normalizeFeedId(feed.feedId) as PythPriceFeedId,\n\t\tpriceInfoObjectId: feed.priceInfoObjectId,\n\t\tprice: BigInt(feed.price),\n\t\texpo: feed.expo,\n\t})),\n});\n\nconst pythInputsHash = (\n\tpkg: PythDeployment,\n\tsigner: ResolvedSigner,\n\tfeeds: ReadonlyArray<PythFeed>,\n) =>\n\tstableContentHash(\n\t\t[\n\t\t\t'v1',\n\t\t\tpkg.packageId,\n\t\t\tsigner.address,\n\t\t\t...feeds\n\t\t\t\t.map((feed) =>\n\t\t\t\t\t[\n\t\t\t\t\t\tfeed.symbol,\n\t\t\t\t\t\tnormalizeFeedId(feed.feedId),\n\t\t\t\t\t\tfeed.initialPrice.toString(),\n\t\t\t\t\t\tfeedExpo(feed).toString(),\n\t\t\t\t\t\t(feed.confidence ?? 0n).toString(),\n\t\t\t\t\t\t(feed.emaPrice ?? feed.initialPrice).toString(),\n\t\t\t\t\t].join('|'),\n\t\t\t\t)\n\t\t\t\t.sort(),\n\t\t].join('||'),\n\t);\n\nconst buildVerifyProbe = (\n\tsdk: SuiSdkShim,\n\tcached: CachedPythHandle,\n): Effect.Effect<CachedPythHandle | null, never> =>\n\tEffect.gen(function* () {\n\t\tfor (const feed of cached.feeds) {\n\t\t\tconst raw = yield* Effect.tryPromise({\n\t\t\t\ttry: () => sdk.core.getObject({ objectId: feed.priceInfoObjectId }),\n\t\t\t\tcatch: () => null,\n\t\t\t}).pipe(Effect.catch(() => Effect.succeed(null)));\n\t\t\tif (raw === null || raw === undefined) return null;\n\t\t}\n\t\treturn cached;\n\t});\n\ntype SuiTransactionBuildClient = Parameters<Transaction['build']>[0] extends\n\t| { readonly client?: infer C }\n\t| undefined\n\t? C\n\t: never;\n\nconst transactionBuildClient = (sdk: SuiSdkShim): SuiTransactionBuildClient =>\n\tsdk.client as SuiTransactionBuildClient;\n\nconst addI64 = (tx: Transaction, packageId: string, value: bigint | number) => {\n\tconst raw = BigInt(value);\n\tconst negative = raw < 0n;\n\treturn tx.moveCall({\n\t\ttarget: `${packageId}::i64::new`,\n\t\targuments: [tx.pure.u64(negative ? -raw : raw), tx.pure.bool(negative)],\n\t});\n};\n\nconst addPriceInfo = (tx: Transaction, packageId: string, feed: PythFeed, timestamp: bigint) => {\n\tconst price = tx.moveCall({\n\t\ttarget: `${packageId}::price::new`,\n\t\targuments: [\n\t\t\taddI64(tx, packageId, feed.initialPrice),\n\t\t\ttx.pure.u64(feed.confidence ?? 0n),\n\t\t\taddI64(tx, packageId, BigInt(feedExpo(feed))),\n\t\t\ttx.pure.u64(timestamp),\n\t\t],\n\t});\n\tconst emaPrice = tx.moveCall({\n\t\ttarget: `${packageId}::price::new`,\n\t\targuments: [\n\t\t\taddI64(tx, packageId, feed.emaPrice ?? feed.initialPrice),\n\t\t\ttx.pure.u64(feed.confidence ?? 0n),\n\t\t\taddI64(tx, packageId, BigInt(feedExpo(feed))),\n\t\t\ttx.pure.u64(timestamp),\n\t\t],\n\t});\n\tconst priceIdentifier = tx.moveCall({\n\t\ttarget: `${packageId}::price_identifier::from_byte_vec`,\n\t\targuments: [tx.pure.vector('u8', Array.from(fromHex(normalizeFeedId(feed.feedId))))],\n\t});\n\tconst priceFeed = tx.moveCall({\n\t\ttarget: `${packageId}::price_feed::new`,\n\t\targuments: [priceIdentifier, price, emaPrice],\n\t});\n\treturn tx.moveCall({\n\t\ttarget: `${packageId}::price_info::new_price_info`,\n\t\targuments: [tx.pure.u64(timestamp), tx.pure.u64(timestamp), priceFeed],\n\t});\n};\n\nconst priceObjectClient = (\n\tsdk: SuiSdkShim,\n): {\n\treadonly getObjects: (args: {\n\t\treadonly objectIds: ReadonlyArray<string>;\n\t\treadonly include: { readonly json: boolean };\n\t}) => Promise<{\n\t\treadonly objects: ReadonlyArray<\n\t\t\t| Error\n\t\t\t| {\n\t\t\t\t\treadonly objectId: string;\n\t\t\t\t\treadonly json?: unknown;\n\t\t\t }\n\t\t>;\n\t}>;\n} =>\n\tsdk.client as {\n\t\treadonly getObjects: (args: {\n\t\t\treadonly objectIds: ReadonlyArray<string>;\n\t\t\treadonly include: { readonly json: boolean };\n\t\t}) => Promise<{\n\t\t\treadonly objects: ReadonlyArray<\n\t\t\t\t| Error\n\t\t\t\t| {\n\t\t\t\t\t\treadonly objectId: string;\n\t\t\t\t\t\treadonly json?: unknown;\n\t\t\t\t }\n\t\t\t>;\n\t\t}>;\n\t};\n\nconst feedIdBytesFromJson = (bytes: unknown): Uint8Array | null => {\n\tif (typeof bytes === 'string' && bytes.length > 0) {\n\t\ttry {\n\t\t\treturn fromBase64(bytes);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (!Array.isArray(bytes) || bytes.length === 0) return null;\n\tif (!bytes.every((byte): byte is number => Number.isInteger(byte) && byte >= 0 && byte <= 255)) {\n\t\treturn null;\n\t}\n\treturn Uint8Array.from(bytes);\n};\n\nexport const feedIdFromJson = (json: unknown): string | null => {\n\tif (typeof json !== 'object' || json === null) return null;\n\tconst priceInfo = (json as { readonly price_info?: unknown }).price_info;\n\tif (typeof priceInfo !== 'object' || priceInfo === null) return null;\n\tconst priceFeed = (priceInfo as { readonly price_feed?: unknown }).price_feed;\n\tif (typeof priceFeed !== 'object' || priceFeed === null) return null;\n\tconst priceIdentifier = (priceFeed as { readonly price_identifier?: unknown }).price_identifier;\n\tif (typeof priceIdentifier !== 'object' || priceIdentifier === null) return null;\n\tconst bytes = (priceIdentifier as { readonly bytes?: unknown }).bytes;\n\tconst decoded = feedIdBytesFromJson(bytes);\n\tif (decoded === null) return null;\n\treturn normalizeFeedId(toHex(decoded));\n};\n\nconst mapCreatedPriceObjects = async (\n\tsdk: SuiSdkShim,\n\tobjectIds: ReadonlyArray<string>,\n): Promise<ReadonlyMap<string, string>> => {\n\tconst objects = await priceObjectClient(sdk).getObjects({\n\t\tobjectIds,\n\t\tinclude: { json: true },\n\t});\n\tconst result = new Map<string, string>();\n\tfor (const object of objects.objects) {\n\t\tif (object instanceof Error) continue;\n\t\tconst feedId = feedIdFromJson(object.json);\n\t\tif (feedId !== null) result.set(feedId, object.objectId);\n\t}\n\treturn result;\n};\n\nconst pickCreatedPriceInfoObjects = (\n\tchanges: ReadonlyArray<{\n\t\treadonly objectId: string;\n\t\treadonly objectType?: string;\n\t\treadonly idOperation?: string;\n\t}>,\n): ReadonlyArray<string> =>\n\tchanges\n\t\t.filter(\n\t\t\t(change) =>\n\t\t\t\tchange.idOperation === 'Created' &&\n\t\t\t\tchange.objectType?.includes('::price_info::PriceInfoObject') === true,\n\t\t)\n\t\t.map((change) => change.objectId);\n\n/** Create shared mock-Pyth PriceInfoObjects for local DeepBook feeds. */\nexport const initLocalPythFeeds = (\n\tpublisher: ArtifactPublisher,\n\tsdk: SuiSdkShim,\n\tchain: string,\n\tsigner: ResolvedSigner,\n\tpkg: PythDeployment,\n\tfeeds: ReadonlyArray<PythFeed>,\n): Effect.Effect<PythHandle | null, DeepbookPluginError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tif (feeds.length === 0) return null;\n\n\t\tconst cached = yield* publisher\n\t\t\t.publish<CachedPythHandle, CachedPythHandle>({\n\t\t\t\tnamespace: 'deepbook/pyth',\n\t\t\t\tchain: brandChainId(chain),\n\t\t\t\tcontentHash: pythInputsHash(pkg, signer, feeds),\n\t\t\t\tverifySchema: CachedPythHandleSchema,\n\t\t\t\tverify: (entry) => buildVerifyProbe(sdk, entry),\n\t\t\t\tproduce: Effect.gen(function* () {\n\t\t\t\t\tconst receipt = yield* executeSuiTx({\n\t\t\t\t\t\tclient: sdk.client as SuiExecuteClient,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t\tbuild: async () => {\n\t\t\t\t\t\t\tconst tx = new Transaction();\n\t\t\t\t\t\t\ttx.setSender(signer.address);\n\t\t\t\t\t\t\ttx.setGasBudget(PYTH_GAS_BUDGET);\n\t\t\t\t\t\t\tconst timestamp = 0n;\n\t\t\t\t\t\t\tconst priceInfos = feeds.map((feed) =>\n\t\t\t\t\t\t\t\taddPriceInfo(tx, pkg.packageId, feed, timestamp),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttx.moveCall({\n\t\t\t\t\t\t\t\ttarget: `${pkg.packageId}::pyth::create_price_feeds`,\n\t\t\t\t\t\t\t\targuments: [\n\t\t\t\t\t\t\t\t\ttx.makeMoveVec({\n\t\t\t\t\t\t\t\t\t\ttype: `${pkg.packageId}::price_info::PriceInfo`,\n\t\t\t\t\t\t\t\t\t\telements: priceInfos,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn tx.build({ client: transactionBuildClient(sdk) });\n\t\t\t\t\t\t},\n\t\t\t\t\t}).pipe(\n\t\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t\t(err) =>\n\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\t_tag: 'ArtifactPublishError',\n\t\t\t\t\t\t\t\t\treason: 'produce-failed',\n\t\t\t\t\t\t\t\t\tdetail: `pyth feed transaction failed: ${err.message}`,\n\t\t\t\t\t\t\t\t}) as const,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst created = pickCreatedPriceInfoObjects(receipt.objectChanges);\n\t\t\t\t\tif (created.length !== feeds.length) {\n\t\t\t\t\t\treturn yield* Effect.fail({\n\t\t\t\t\t\t\t_tag: 'ArtifactPublishError' as const,\n\t\t\t\t\t\t\treason: 'produce-failed' as const,\n\t\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\t`expected ${feeds.length} Pyth PriceInfoObject creations, got ${created.length} ` +\n\t\t\t\t\t\t\t\t`(digest=${receipt.digest}).`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst idsByFeed = yield* Effect.tryPromise({\n\t\t\t\t\t\ttry: () => mapCreatedPriceObjects(sdk, created),\n\t\t\t\t\t\tcatch: (cause) =>\n\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t_tag: 'ArtifactPublishError',\n\t\t\t\t\t\t\t\treason: 'produce-failed',\n\t\t\t\t\t\t\t\tdetail: `failed to read created Pyth PriceInfoObjects: ${\n\t\t\t\t\t\t\t\t\tcause instanceof Error ? cause.message : String(cause)\n\t\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\t}) as const,\n\t\t\t\t\t});\n\t\t\t\t\tconst cachedFeeds: CachedPythFeed[] = [];\n\t\t\t\t\tfor (const feed of feeds) {\n\t\t\t\t\t\tconst priceInfoObjectId = idsByFeed.get(normalizeFeedId(feed.feedId));\n\t\t\t\t\t\tif (priceInfoObjectId === undefined) {\n\t\t\t\t\t\t\treturn yield* Effect.fail({\n\t\t\t\t\t\t\t\t_tag: 'ArtifactPublishError' as const,\n\t\t\t\t\t\t\t\treason: 'produce-failed' as const,\n\t\t\t\t\t\t\t\tdetail: `created Pyth PriceInfoObject for '${feed.symbol}' was not found by feed id.`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcachedFeeds.push(toCachedFeed(feed, priceInfoObjectId));\n\t\t\t\t\t}\n\t\t\t\t\treturn { packageId: pkg.packageId, feeds: cachedFeeds };\n\t\t\t\t}),\n\t\t\t\tregister: () => Effect.void,\n\t\t\t})\n\t\t\t.pipe(\n\t\t\t\tEffect.mapError(\n\t\t\t\t\t(err): DeepbookPluginError =>\n\t\t\t\t\t\tdeepbookPluginError(\n\t\t\t\t\t\t\t'pyth-feed',\n\t\t\t\t\t\t\terr._tag === 'ArtifactPublishError' ? err.detail : String(err),\n\t\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\treturn fromCachedHandle(cached);\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.deepbook.pyth.initFeeds', {\n\t\t\tattributes: {\n\t\t\t\t'pyth.packageId': pkg.packageId,\n\t\t\t\t'pyth.feed.count': feeds.length,\n\t\t\t},\n\t\t}),\n\t);\n\n// Compatibility exports for callers/tests that import the internal module.\nexport type { PythFeed, PythHandle, PythOptions } from '../types.ts';\nexport {\n\tDEEP_PRICE_FEED_ID,\n\tpythPriceFeedId,\n\tSUI_PRICE_FEED_ID,\n\tUSDC_PRICE_FEED_ID,\n} from '../types.ts';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["brandChainId"],"sources":["../../../../src/plugins/deepbook/pyth/index.ts"],"sourcesContent":["// Pyth — internal module under the DeepBook plugin.\n//\n// Local mode uses the DeepBook sandbox's mock Pyth package shape: publish a\n// local Move package with `pyth::create_price_feeds`, then create shared\n// `PriceInfoObject`s for the requested feeds. This is intentionally not a\n// top-level devstack plugin; DeepBook owns the oracle wiring it needs.\n\nimport { Effect, type Scope } from 'effect';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { fromBase64, fromHex, toHex } from '@mysten/sui/utils';\n\nimport {\n\tartifactPublishError,\n\ttype ArtifactPublisher,\n} from '../../../primitives/artifact-publisher.ts';\nimport { acquireOnChainArtifact } from '../../internal/acquire-on-chain-artifact.ts';\nimport type { ResolvedSigner } from '../../../substrate/runtime/sui-execute/index.ts';\nimport {\n\texecuteSuiTx,\n\tformatExecutedFailure,\n} from '../../../substrate/runtime/sui-execute/index.ts';\nimport { probeManyLenient } from '../../../substrate/runtime/probes.ts';\nimport { chainId as brandChainId } from '../../../substrate/brand.ts';\nimport type { SuiSdkShim } from '../../sui/index.ts';\nimport { deepbookPluginError, type DeepbookPluginError } from '../errors.ts';\nimport { stableContentHash } from '../hash.ts';\nimport { DeepbookSpans } from '../spans.ts';\nimport type { PythFeed, PythHandle, PythPriceFeedId } from '../types.ts';\n\nexport interface PythDeployment {\n\treadonly packageId: string;\n}\n\ninterface CachedPythFeed {\n\treadonly symbol: string;\n\treadonly feedId: string;\n\treadonly priceInfoObjectId: string;\n\treadonly price: string;\n\treadonly expo: number;\n}\n\ninterface CachedPythHandle {\n\treadonly packageId: string;\n\treadonly feeds: ReadonlyArray<CachedPythFeed>;\n}\n\nconst DEFAULT_EXPO = -8;\nconst PYTH_GAS_BUDGET = 200_000_000;\n\nconst normalizeFeedId = (feedId: string): string => feedId.replace(/^0x/i, '').toLowerCase();\n\nconst feedExpo = (feed: PythFeed): number => feed.expo ?? DEFAULT_EXPO;\n\nconst toCachedFeed = (feed: PythFeed, priceInfoObjectId: string): CachedPythFeed => ({\n\tsymbol: feed.symbol,\n\tfeedId: normalizeFeedId(feed.feedId),\n\tpriceInfoObjectId,\n\tprice: feed.initialPrice.toString(),\n\texpo: feedExpo(feed),\n});\n\nconst fromCachedHandle = (cached: CachedPythHandle): PythHandle => ({\n\tpackageId: cached.packageId,\n\tstateId: null,\n\twormholeStateId: null,\n\tfeeds: cached.feeds.map((feed) => ({\n\t\tsymbol: feed.symbol,\n\t\tfeedId: normalizeFeedId(feed.feedId) as PythPriceFeedId,\n\t\tpriceInfoObjectId: feed.priceInfoObjectId,\n\t\tprice: BigInt(feed.price),\n\t\texpo: feed.expo,\n\t})),\n});\n\nconst pythInputsHash = (\n\tpkg: PythDeployment,\n\tsigner: ResolvedSigner,\n\tfeeds: ReadonlyArray<PythFeed>,\n) =>\n\tstableContentHash(\n\t\t[\n\t\t\t'v1',\n\t\t\tpkg.packageId,\n\t\t\tsigner.address,\n\t\t\t...feeds\n\t\t\t\t.map((feed) =>\n\t\t\t\t\t[\n\t\t\t\t\t\tfeed.symbol,\n\t\t\t\t\t\tnormalizeFeedId(feed.feedId),\n\t\t\t\t\t\tfeed.initialPrice.toString(),\n\t\t\t\t\t\tfeedExpo(feed).toString(),\n\t\t\t\t\t\t(feed.confidence ?? 0n).toString(),\n\t\t\t\t\t\t(feed.emaPrice ?? feed.initialPrice).toString(),\n\t\t\t\t\t].join('|'),\n\t\t\t\t)\n\t\t\t\t.sort(),\n\t\t].join('||'),\n\t);\n\nconst buildVerifyProbe = (\n\tsdk: SuiSdkShim,\n\tcached: CachedPythHandle,\n): Effect.Effect<CachedPythHandle | null, never> =>\n\tEffect.gen(function* () {\n\t\tconst results = yield* probeManyLenient(\n\t\t\tcached.feeds.map((feed) =>\n\t\t\t\tEffect.tryPromise({\n\t\t\t\t\ttry: () => sdk.core.getObject({ objectId: feed.priceInfoObjectId }),\n\t\t\t\t\tcatch: () => null,\n\t\t\t\t}).pipe(Effect.catch(() => Effect.succeed(null))),\n\t\t\t),\n\t\t);\n\t\tif (results.some((raw) => raw === null || raw === undefined)) return null;\n\t\treturn cached;\n\t});\n\nconst addI64 = (tx: Transaction, packageId: string, value: bigint | number) => {\n\tconst raw = BigInt(value);\n\tconst negative = raw < 0n;\n\treturn tx.moveCall({\n\t\ttarget: `${packageId}::i64::new`,\n\t\targuments: [tx.pure.u64(negative ? -raw : raw), tx.pure.bool(negative)],\n\t});\n};\n\nconst addPriceInfo = (tx: Transaction, packageId: string, feed: PythFeed, timestamp: bigint) => {\n\tconst price = tx.moveCall({\n\t\ttarget: `${packageId}::price::new`,\n\t\targuments: [\n\t\t\taddI64(tx, packageId, feed.initialPrice),\n\t\t\ttx.pure.u64(feed.confidence ?? 0n),\n\t\t\taddI64(tx, packageId, BigInt(feedExpo(feed))),\n\t\t\ttx.pure.u64(timestamp),\n\t\t],\n\t});\n\tconst emaPrice = tx.moveCall({\n\t\ttarget: `${packageId}::price::new`,\n\t\targuments: [\n\t\t\taddI64(tx, packageId, feed.emaPrice ?? feed.initialPrice),\n\t\t\ttx.pure.u64(feed.confidence ?? 0n),\n\t\t\taddI64(tx, packageId, BigInt(feedExpo(feed))),\n\t\t\ttx.pure.u64(timestamp),\n\t\t],\n\t});\n\tconst priceIdentifier = tx.moveCall({\n\t\ttarget: `${packageId}::price_identifier::from_byte_vec`,\n\t\targuments: [tx.pure.vector('u8', Array.from(fromHex(normalizeFeedId(feed.feedId))))],\n\t});\n\tconst priceFeed = tx.moveCall({\n\t\ttarget: `${packageId}::price_feed::new`,\n\t\targuments: [priceIdentifier, price, emaPrice],\n\t});\n\treturn tx.moveCall({\n\t\ttarget: `${packageId}::price_info::new_price_info`,\n\t\targuments: [tx.pure.u64(timestamp), tx.pure.u64(timestamp), priceFeed],\n\t});\n};\n\nconst feedIdBytesFromJson = (bytes: unknown): Uint8Array | null => {\n\tif (typeof bytes === 'string' && bytes.length > 0) {\n\t\ttry {\n\t\t\treturn fromBase64(bytes);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (!Array.isArray(bytes) || bytes.length === 0) return null;\n\tif (!bytes.every((byte): byte is number => Number.isInteger(byte) && byte >= 0 && byte <= 255)) {\n\t\treturn null;\n\t}\n\treturn Uint8Array.from(bytes);\n};\n\nexport const feedIdFromJson = (json: unknown): string | null => {\n\tif (typeof json !== 'object' || json === null) return null;\n\tconst priceInfo = (json as { readonly price_info?: unknown }).price_info;\n\tif (typeof priceInfo !== 'object' || priceInfo === null) return null;\n\tconst priceFeed = (priceInfo as { readonly price_feed?: unknown }).price_feed;\n\tif (typeof priceFeed !== 'object' || priceFeed === null) return null;\n\tconst priceIdentifier = (priceFeed as { readonly price_identifier?: unknown }).price_identifier;\n\tif (typeof priceIdentifier !== 'object' || priceIdentifier === null) return null;\n\tconst bytes = (priceIdentifier as { readonly bytes?: unknown }).bytes;\n\tconst decoded = feedIdBytesFromJson(bytes);\n\tif (decoded === null) return null;\n\treturn normalizeFeedId(toHex(decoded));\n};\n\nconst mapCreatedPriceObjects = async (\n\tsdk: SuiSdkShim,\n\tobjectIds: ReadonlyArray<string>,\n): Promise<ReadonlyMap<string, string>> => {\n\tconst objects = await sdk.client.core.getObjects({\n\t\tobjectIds: [...objectIds],\n\t\tinclude: { json: true },\n\t});\n\tconst result = new Map<string, string>();\n\tfor (const object of objects.objects) {\n\t\tif (object instanceof Error) continue;\n\t\tconst feedId = feedIdFromJson(object.json);\n\t\tif (feedId !== null) result.set(feedId, object.objectId);\n\t}\n\treturn result;\n};\n\nconst pickCreatedPriceInfoObjects = (\n\tchanges: ReadonlyArray<{\n\t\treadonly objectId: string;\n\t\treadonly objectType?: string;\n\t\treadonly idOperation?: string;\n\t}>,\n): ReadonlyArray<string> =>\n\tchanges\n\t\t.filter(\n\t\t\t(change) =>\n\t\t\t\tchange.idOperation === 'Created' &&\n\t\t\t\tchange.objectType?.includes('::price_info::PriceInfoObject') === true,\n\t\t)\n\t\t.map((change) => change.objectId);\n\n/** Create shared mock-Pyth PriceInfoObjects for local DeepBook feeds. */\nexport const initLocalPythFeeds = (\n\tpublisher: ArtifactPublisher,\n\tsdk: SuiSdkShim,\n\tchain: string,\n\tsigner: ResolvedSigner,\n\tpkg: PythDeployment,\n\tfeeds: ReadonlyArray<PythFeed>,\n): Effect.Effect<PythHandle | null, DeepbookPluginError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tif (feeds.length === 0) return null;\n\n\t\tconst cached = yield* acquireOnChainArtifact<CachedPythHandle, CachedPythHandle>(publisher, {\n\t\t\tnamespace: 'deepbook/pyth',\n\t\t\tchain: brandChainId(chain),\n\t\t\tcontentHash: pythInputsHash(pkg, signer, feeds),\n\t\t\tverify: (entry) => buildVerifyProbe(sdk, entry),\n\t\t\tproduce: Effect.gen(function* () {\n\t\t\t\tconst result = yield* executeSuiTx({\n\t\t\t\t\tclient: sdk.client,\n\t\t\t\t\tsigner,\n\t\t\t\t\tbuild: async () => {\n\t\t\t\t\t\tconst tx = new Transaction();\n\t\t\t\t\t\ttx.setSender(signer.address);\n\t\t\t\t\t\ttx.setGasBudget(PYTH_GAS_BUDGET);\n\t\t\t\t\t\tconst timestamp = 0n;\n\t\t\t\t\t\tconst priceInfos = feeds.map((feed) =>\n\t\t\t\t\t\t\taddPriceInfo(tx, pkg.packageId, feed, timestamp),\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttx.moveCall({\n\t\t\t\t\t\t\ttarget: `${pkg.packageId}::pyth::create_price_feeds`,\n\t\t\t\t\t\t\targuments: [\n\t\t\t\t\t\t\t\ttx.makeMoveVec({\n\t\t\t\t\t\t\t\t\ttype: `${pkg.packageId}::price_info::PriceInfo`,\n\t\t\t\t\t\t\t\t\telements: priceInfos,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn tx.build({ client: sdk.client });\n\t\t\t\t\t},\n\t\t\t\t}).pipe(\n\t\t\t\t\tEffect.mapError((err) =>\n\t\t\t\t\t\tartifactPublishError(\n\t\t\t\t\t\t\t'produce-failed',\n\t\t\t\t\t\t\t`pyth feed transaction failed: ${err.message}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (result.$kind === 'FailedTransaction') {\n\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\tartifactPublishError(\n\t\t\t\t\t\t\t'produce-failed',\n\t\t\t\t\t\t\t`pyth feed transaction on-chain execution failed ` +\n\t\t\t\t\t\t\t\tformatExecutedFailure(result.FailedTransaction),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst receipt = result.Transaction;\n\n\t\t\t\tconst created = pickCreatedPriceInfoObjects(receipt.objectChanges);\n\t\t\t\tif (created.length !== feeds.length) {\n\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\tartifactPublishError(\n\t\t\t\t\t\t\t'produce-failed',\n\t\t\t\t\t\t\t`expected ${feeds.length} Pyth PriceInfoObject creations, got ${created.length} ` +\n\t\t\t\t\t\t\t\t`(digest=${receipt.digest}).`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst idsByFeed = yield* Effect.tryPromise({\n\t\t\t\t\ttry: () => mapCreatedPriceObjects(sdk, created),\n\t\t\t\t\tcatch: (cause) =>\n\t\t\t\t\t\tartifactPublishError(\n\t\t\t\t\t\t\t'produce-failed',\n\t\t\t\t\t\t\t`failed to read created Pyth PriceInfoObjects: ${\n\t\t\t\t\t\t\t\tcause instanceof Error ? cause.message : String(cause)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tconst cachedFeeds: CachedPythFeed[] = [];\n\t\t\t\tfor (const feed of feeds) {\n\t\t\t\t\tconst priceInfoObjectId = idsByFeed.get(normalizeFeedId(feed.feedId));\n\t\t\t\t\tif (priceInfoObjectId === undefined) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tartifactPublishError(\n\t\t\t\t\t\t\t\t'produce-failed',\n\t\t\t\t\t\t\t\t`created Pyth PriceInfoObject for '${feed.symbol}' was not found by feed id.`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tcachedFeeds.push(toCachedFeed(feed, priceInfoObjectId));\n\t\t\t\t}\n\t\t\t\treturn { packageId: pkg.packageId, feeds: cachedFeeds };\n\t\t\t}),\n\t\t}).pipe(\n\t\t\tEffect.mapError(\n\t\t\t\t(err): DeepbookPluginError =>\n\t\t\t\t\tdeepbookPluginError(\n\t\t\t\t\t\t'pyth-feed',\n\t\t\t\t\t\terr._tag === 'ArtifactPublishError' ? err.detail : String(err),\n\t\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\treturn fromCachedHandle(cached);\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.deepbook.pyth.initFeeds', {\n\t\t\tattributes: {\n\t\t\t\t[DeepbookSpans.pyth.packageId]: pkg.packageId,\n\t\t\t\t[DeepbookSpans.pyth.feedCount]: feeds.length,\n\t\t\t},\n\t\t}),\n\t);\n\n// Compatibility exports for callers/tests that import the internal module.\nexport type { PythFeed, PythHandle, PythOptions } from '../types.ts';\nexport {\n\tDEEP_PRICE_FEED_ID,\n\tpythPriceFeedId,\n\tSUI_PRICE_FEED_ID,\n\tUSDC_PRICE_FEED_ID,\n} from '../types.ts';\n"],"mappings":";;;;;;;;;;;;;AA8CA,MAAM,eAAe;AACrB,MAAM,kBAAkB;AAExB,MAAM,mBAAmB,WAA2B,OAAO,QAAQ,QAAQ,GAAG,CAAC,aAAa;AAE5F,MAAM,YAAY,SAA2B,KAAK,QAAQ;AAE1D,MAAM,gBAAgB,MAAgB,uBAA+C;CACpF,QAAQ,KAAK;CACb,QAAQ,gBAAgB,KAAK,OAAO;CACpC;CACA,OAAO,KAAK,aAAa,UAAU;CACnC,MAAM,SAAS,KAAK;CACpB;AAED,MAAM,oBAAoB,YAA0C;CACnE,WAAW,OAAO;CAClB,SAAS;CACT,iBAAiB;CACjB,OAAO,OAAO,MAAM,KAAK,UAAU;EAClC,QAAQ,KAAK;EACb,QAAQ,gBAAgB,KAAK,OAAO;EACpC,mBAAmB,KAAK;EACxB,OAAO,OAAO,KAAK,MAAM;EACzB,MAAM,KAAK;EACX,EAAE;CACH;AAED,MAAM,kBACL,KACA,QACA,UAEA,kBACC;CACC;CACA,IAAI;CACJ,OAAO;CACP,GAAG,MACD,KAAK,SACL;EACC,KAAK;EACL,gBAAgB,KAAK,OAAO;EAC5B,KAAK,aAAa,UAAU;EAC5B,SAAS,KAAK,CAAC,UAAU;GACxB,KAAK,cAAc,IAAI,UAAU;GACjC,KAAK,YAAY,KAAK,cAAc,UAAU;EAC/C,CAAC,KAAK,IAAI,CACX,CACA,MAAM;CACR,CAAC,KAAK,KAAK,CACZ;AAEF,MAAM,oBACL,KACA,WAEA,OAAO,IAAI,aAAa;AASvB,MAAI,OARmB,iBACtB,OAAO,MAAM,KAAK,SACjB,OAAO,WAAW;EACjB,WAAW,IAAI,KAAK,UAAU,EAAE,UAAU,KAAK,mBAAmB,CAAC;EACnE,aAAa;EACb,CAAC,CAAC,KAAK,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,CACjD,CACD,EACW,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,KAAA,EAAU,CAAE,QAAO;AACrE,QAAO;EACN;AAEH,MAAM,UAAU,IAAiB,WAAmB,UAA2B;CAC9E,MAAM,MAAM,OAAO,MAAM;CACzB,MAAM,WAAW,MAAM;AACvB,QAAO,GAAG,SAAS;EAClB,QAAQ,GAAG,UAAU;EACrB,WAAW,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE,GAAG,KAAK,KAAK,SAAS,CAAC;EACvE,CAAC;;AAGH,MAAM,gBAAgB,IAAiB,WAAmB,MAAgB,cAAsB;CAC/F,MAAM,QAAQ,GAAG,SAAS;EACzB,QAAQ,GAAG,UAAU;EACrB,WAAW;GACV,OAAO,IAAI,WAAW,KAAK,aAAa;GACxC,GAAG,KAAK,IAAI,KAAK,cAAc,GAAG;GAClC,OAAO,IAAI,WAAW,OAAO,SAAS,KAAK,CAAC,CAAC;GAC7C,GAAG,KAAK,IAAI,UAAU;GACtB;EACD,CAAC;CACF,MAAM,WAAW,GAAG,SAAS;EAC5B,QAAQ,GAAG,UAAU;EACrB,WAAW;GACV,OAAO,IAAI,WAAW,KAAK,YAAY,KAAK,aAAa;GACzD,GAAG,KAAK,IAAI,KAAK,cAAc,GAAG;GAClC,OAAO,IAAI,WAAW,OAAO,SAAS,KAAK,CAAC,CAAC;GAC7C,GAAG,KAAK,IAAI,UAAU;GACtB;EACD,CAAC;CACF,MAAM,kBAAkB,GAAG,SAAS;EACnC,QAAQ,GAAG,UAAU;EACrB,WAAW,CAAC,GAAG,KAAK,OAAO,MAAM,MAAM,KAAK,QAAQ,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;EACpF,CAAC;CACF,MAAM,YAAY,GAAG,SAAS;EAC7B,QAAQ,GAAG,UAAU;EACrB,WAAW;GAAC;GAAiB;GAAO;GAAS;EAC7C,CAAC;AACF,QAAO,GAAG,SAAS;EAClB,QAAQ,GAAG,UAAU;EACrB,WAAW;GAAC,GAAG,KAAK,IAAI,UAAU;GAAE,GAAG,KAAK,IAAI,UAAU;GAAE;GAAU;EACtE,CAAC;;AAGH,MAAM,uBAAuB,UAAsC;AAClE,KAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAC/C,KAAI;AACH,SAAO,WAAW,MAAM;SACjB;AACP,SAAO;;AAGT,KAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,EAAG,QAAO;AACxD,KAAI,CAAC,MAAM,OAAO,SAAyB,OAAO,UAAU,KAAK,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAC7F,QAAO;AAER,QAAO,WAAW,KAAK,MAAM;;AAG9B,MAAa,kBAAkB,SAAiC;AAC/D,KAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;CACtD,MAAM,YAAa,KAA2C;AAC9D,KAAI,OAAO,cAAc,YAAY,cAAc,KAAM,QAAO;CAChE,MAAM,YAAa,UAAgD;AACnE,KAAI,OAAO,cAAc,YAAY,cAAc,KAAM,QAAO;CAChE,MAAM,kBAAmB,UAAsD;AAC/E,KAAI,OAAO,oBAAoB,YAAY,oBAAoB,KAAM,QAAO;CAC5E,MAAM,QAAS,gBAAiD;CAChE,MAAM,UAAU,oBAAoB,MAAM;AAC1C,KAAI,YAAY,KAAM,QAAO;AAC7B,QAAO,gBAAgB,MAAM,QAAQ,CAAC;;AAGvC,MAAM,yBAAyB,OAC9B,KACA,cAC0C;CAC1C,MAAM,UAAU,MAAM,IAAI,OAAO,KAAK,WAAW;EAChD,WAAW,CAAC,GAAG,UAAU;EACzB,SAAS,EAAE,MAAM,MAAM;EACvB,CAAC;CACF,MAAM,yBAAS,IAAI,KAAqB;AACxC,MAAK,MAAM,UAAU,QAAQ,SAAS;AACrC,MAAI,kBAAkB,MAAO;EAC7B,MAAM,SAAS,eAAe,OAAO,KAAK;AAC1C,MAAI,WAAW,KAAM,QAAO,IAAI,QAAQ,OAAO,SAAS;;AAEzD,QAAO;;AAGR,MAAM,+BACL,YAMA,QACE,QACC,WACA,OAAO,gBAAgB,aACvB,OAAO,YAAY,SAAS,gCAAgC,KAAK,KAClE,CACA,KAAK,WAAW,OAAO,SAAS;;AAGnC,MAAa,sBACZ,WACA,KACA,OACA,QACA,KACA,UAEA,OAAO,IAAI,aAAa;AACvB,KAAI,MAAM,WAAW,EAAG,QAAO;AA8F/B,QAAO,iBAAiB,OA5FF,uBAA2D,WAAW;EAC3F,WAAW;EACX,OAAOA,QAAa,MAAM;EAC1B,aAAa,eAAe,KAAK,QAAQ,MAAM;EAC/C,SAAS,UAAU,iBAAiB,KAAK,MAAM;EAC/C,SAAS,OAAO,IAAI,aAAa;GAChC,MAAM,SAAS,OAAO,aAAa;IAClC,QAAQ,IAAI;IACZ;IACA,OAAO,YAAY;KAClB,MAAM,KAAK,IAAI,aAAa;AAC5B,QAAG,UAAU,OAAO,QAAQ;AAC5B,QAAG,aAAa,gBAAgB;KAChC,MAAM,YAAY;KAClB,MAAM,aAAa,MAAM,KAAK,SAC7B,aAAa,IAAI,IAAI,WAAW,MAAM,UAAU,CAChD;AACD,QAAG,SAAS;MACX,QAAQ,GAAG,IAAI,UAAU;MACzB,WAAW,CACV,GAAG,YAAY;OACd,MAAM,GAAG,IAAI,UAAU;OACvB,UAAU;OACV,CAAC,CACF;MACD,CAAC;AACF,YAAO,GAAG,MAAM,EAAE,QAAQ,IAAI,QAAQ,CAAC;;IAExC,CAAC,CAAC,KACF,OAAO,UAAU,QAChB,qBACC,kBACA,iCAAiC,IAAI,UACrC,CACD,CACD;AACD,OAAI,OAAO,UAAU,oBACpB,QAAO,OAAO,OAAO,KACpB,qBACC,kBACA,qDACC,sBAAsB,OAAO,kBAAkB,CAChD,CACD;GAEF,MAAM,UAAU,OAAO;GAEvB,MAAM,UAAU,4BAA4B,QAAQ,cAAc;AAClE,OAAI,QAAQ,WAAW,MAAM,OAC5B,QAAO,OAAO,OAAO,KACpB,qBACC,kBACA,YAAY,MAAM,OAAO,uCAAuC,QAAQ,OAAO,WACnE,QAAQ,OAAO,IAC3B,CACD;GAEF,MAAM,YAAY,OAAO,OAAO,WAAW;IAC1C,WAAW,uBAAuB,KAAK,QAAQ;IAC/C,QAAQ,UACP,qBACC,kBACA,iDACC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAEvD;IACF,CAAC;GACF,MAAM,cAAgC,EAAE;AACxC,QAAK,MAAM,QAAQ,OAAO;IACzB,MAAM,oBAAoB,UAAU,IAAI,gBAAgB,KAAK,OAAO,CAAC;AACrE,QAAI,sBAAsB,KAAA,EACzB,QAAO,OAAO,OAAO,KACpB,qBACC,kBACA,qCAAqC,KAAK,OAAO,6BACjD,CACD;AAEF,gBAAY,KAAK,aAAa,MAAM,kBAAkB,CAAC;;AAExD,UAAO;IAAE,WAAW,IAAI;IAAW,OAAO;IAAa;IACtD;EACF,CAAC,CAAC,KACF,OAAO,UACL,QACA,oBACC,aACA,IAAI,SAAS,yBAAyB,IAAI,SAAS,OAAO,IAAI,CAC9D,CACF,CACD,CAE8B;EAC9B,CAAC,KACF,OAAO,SAAS,2CAA2C,EAC1D,YAAY;EACV,cAAc,KAAK,YAAY,IAAI;EACnC,cAAc,KAAK,YAAY,MAAM;CACtC,EACD,CAAC,CACF"}
|
|
@@ -1,34 +1,22 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
//#region src/plugins/deepbook/snapshot.ts
|
|
3
|
-
/** Build the Snapshotable contribution for the local-mode plugin.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
subtrees: [`deepbook/${inputs.name}`],
|
|
21
|
-
managedContainers: managed,
|
|
22
|
-
quiesce: Effect.void,
|
|
23
|
-
preRestore: Effect.succeed({
|
|
24
|
-
kind: "deepbook",
|
|
25
|
-
name: inputs.name
|
|
26
|
-
}),
|
|
27
|
-
postRestore: Effect.void,
|
|
28
|
-
missingTolerance: "fine",
|
|
29
|
-
secretMaterial: false
|
|
30
|
-
};
|
|
31
|
-
};
|
|
3
|
+
/** Build the Snapshotable contribution for the local-mode plugin.
|
|
4
|
+
* Deepbook's deploy artifacts live on the host subtree; no managed
|
|
5
|
+
* containers participate (the indexer + server daemons aren't wired
|
|
6
|
+
* yet). When they land, add their `ContainerLabelTuple` here. */
|
|
7
|
+
const makeLocalSnapshotable = (inputs) => ({
|
|
8
|
+
kind: "snapshotable",
|
|
9
|
+
subtrees: [`deepbook/${inputs.name}`],
|
|
10
|
+
managedContainers: [],
|
|
11
|
+
quiesce: Effect.void,
|
|
12
|
+
preRestore: Effect.succeed({
|
|
13
|
+
kind: "deepbook",
|
|
14
|
+
name: inputs.name
|
|
15
|
+
}),
|
|
16
|
+
postRestore: Effect.void,
|
|
17
|
+
missingTolerance: "fine",
|
|
18
|
+
secretMaterial: false
|
|
19
|
+
});
|
|
32
20
|
/** Build the Snapshotable contribution for the known-deployment
|
|
33
21
|
* mode. No on-disk state, no managed containers — pure value
|
|
34
22
|
* producer. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../src/plugins/deepbook/snapshot.ts"],"sourcesContent":["// Deepbook plugin — Snapshotable contribution.\n//\n// What needs to survive snapshot:\n//\n// - Cached publish receipts under runtime/deepbook/<name>/cache/\n// (driven by the artifact publisher primitive's cache layer; the host-tree\n// subtree is `deepbook/<name>` and the artifact publisher cache lives inside it).\n// - Managed containers — the optional indexer + server use\n// labeled tuples drive the docker commit + save path.\n//\n// Architecture: the orchestrator is service-name-blind — it walks\n// the Snapshotable decls, sees `deepbook/<name>` as just a subtree\n// path, and treats the secret flag as opaque.\n\nimport { Effect } from 'effect';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../src/plugins/deepbook/snapshot.ts"],"sourcesContent":["// Deepbook plugin — Snapshotable contribution.\n//\n// What needs to survive snapshot:\n//\n// - Cached publish receipts under runtime/deepbook/<name>/cache/\n// (driven by the artifact publisher primitive's cache layer; the host-tree\n// subtree is `deepbook/<name>` and the artifact publisher cache lives inside it).\n// - Managed containers — the optional indexer + server use\n// labeled tuples drive the docker commit + save path.\n//\n// Architecture: the orchestrator is service-name-blind — it walks\n// the Snapshotable decls, sees `deepbook/<name>` as just a subtree\n// path, and treats the secret flag as opaque.\n\nimport { Effect } from 'effect';\n\nimport type { SnapshotableDecl } from '../../contracts/snapshotable.ts';\n\n/** Build the Snapshotable contribution for the local-mode plugin.\n * Deepbook's deploy artifacts live on the host subtree; no managed\n * containers participate (the indexer + server daemons aren't wired\n * yet). When they land, add their `ContainerLabelTuple` here. */\nexport const makeLocalSnapshotable = (inputs: { readonly name: string }): SnapshotableDecl => ({\n\tkind: 'snapshotable',\n\tsubtrees: [`deepbook/${inputs.name}`],\n\tmanagedContainers: [],\n\tquiesce: Effect.void,\n\tpreRestore: Effect.succeed({ kind: 'deepbook' as const, name: inputs.name }),\n\tpostRestore: Effect.void,\n\tmissingTolerance: 'fine',\n\tsecretMaterial: false,\n});\n\n/** Build the Snapshotable contribution for the known-deployment\n * mode. No on-disk state, no managed containers — pure value\n * producer. */\nexport const makeKnownSnapshotable = (inputs: { readonly name: string }): SnapshotableDecl => ({\n\tkind: 'snapshotable',\n\tsubtrees: [],\n\tpreRestore: Effect.succeed({ kind: 'deepbook' as const, name: inputs.name }),\n\tpostRestore: Effect.void,\n\tmissingTolerance: 'fine',\n\tsecretMaterial: false,\n});\n"],"mappings":";;;;;;AAsBA,MAAa,yBAAyB,YAAyD;CAC9F,MAAM;CACN,UAAU,CAAC,YAAY,OAAO,OAAO;CACrC,mBAAmB,EAAE;CACrB,SAAS,OAAO;CAChB,YAAY,OAAO,QAAQ;EAAE,MAAM;EAAqB,MAAM,OAAO;EAAM,CAAC;CAC5E,aAAa,OAAO;CACpB,kBAAkB;CAClB,gBAAgB;CAChB;;;;AAKD,MAAa,yBAAyB,YAAyD;CAC9F,MAAM;CACN,UAAU,EAAE;CACZ,YAAY,OAAO,QAAQ;EAAE,MAAM;EAAqB,MAAM,OAAO;EAAM,CAAC;CAC5E,aAAa,OAAO;CACpB,kBAAkB;CAClB,gBAAgB;CAChB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/plugins/deepbook/spans.ts
|
|
2
|
+
const DeepbookSpans = {
|
|
3
|
+
chain: "deepbook.chain",
|
|
4
|
+
fundAmount: "fund.amount",
|
|
5
|
+
fundCoin: "fund.coin",
|
|
6
|
+
name: "deepbook.name",
|
|
7
|
+
packageId: "deepbook.packageId",
|
|
8
|
+
poolCount: "deepbook.pool.count",
|
|
9
|
+
publisher: "deepbook.publisher",
|
|
10
|
+
pyth: {
|
|
11
|
+
feedCount: "pyth.feed.count",
|
|
12
|
+
packageId: "pyth.packageId"
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { DeepbookSpans };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=spans.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.mjs","names":[],"sources":["../../../src/plugins/deepbook/spans.ts"],"sourcesContent":["// Deepbook plugin span-attribute vocabulary. Plugin-local — substrate's\n// `SpanAttr` carries only engine-dimensional + http/process generic\n// keys; plugin-domain keys live next to the plugin that owns them.\n//\n// Callsite pattern: `Effect.annotateCurrentSpan({ [DeepbookSpans.name]:\n// value })`. Free-form string literals are a STYLE_GUIDE §16 violation.\n//\n// Pyth is a deepbook implementation detail (see `./pyth/`), so pyth\n// span keys live here under a nested `pyth` sub-object to keep\n// vocabulary discovery scoped to the owning plugin.\n\nexport const DeepbookSpans = {\n\tchain: 'deepbook.chain',\n\tfundAmount: 'fund.amount',\n\tfundCoin: 'fund.coin',\n\tname: 'deepbook.name',\n\tpackageId: 'deepbook.packageId',\n\tpoolCount: 'deepbook.pool.count',\n\tpublisher: 'deepbook.publisher',\n\tpyth: {\n\t\tfeedCount: 'pyth.feed.count',\n\t\tpackageId: 'pyth.packageId',\n\t},\n} as const;\n"],"mappings":";AAWA,MAAa,gBAAgB;CAC5B,OAAO;CACP,YAAY;CACZ,UAAU;CACV,MAAM;CACN,WAAW;CACX,WAAW;CACX,WAAW;CACX,MAAM;EACL,WAAW;EACX,WAAW;EACX;CACD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { normalizeStructTag } from "@mysten/sui/utils";
|
|
2
|
+
//#region src/plugins/deepbook/type-strings.ts
|
|
3
|
+
/** Parse the two positional generic arguments out of a
|
|
4
|
+
* `<pkg>::pool::Pool<Base, Quote>` object type. Returns `null` when the
|
|
5
|
+
* type is not a `::pool::Pool<…>` with exactly two top-level arguments
|
|
6
|
+
* (the SDK may pad the package address, so the module/wrapper suffix is
|
|
7
|
+
* matched on the `::pool::Pool<` marker rather than the full prefix). */
|
|
8
|
+
const parsePoolGenericArgs = (objectType) => {
|
|
9
|
+
if (!objectType.endsWith(">")) return null;
|
|
10
|
+
const markerIndex = objectType.indexOf("::pool::Pool<");
|
|
11
|
+
if (markerIndex === -1) return null;
|
|
12
|
+
const args = splitTopLevelGenericArgs(objectType.slice(markerIndex + 13, -1));
|
|
13
|
+
if (args.length !== 2) return null;
|
|
14
|
+
const [base, quote] = args;
|
|
15
|
+
if (base === void 0 || quote === void 0) return null;
|
|
16
|
+
return {
|
|
17
|
+
base,
|
|
18
|
+
quote
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/** Does `objectType` name a `Pool<Base, Quote>` whose generic arguments
|
|
22
|
+
* match `(baseCoinType, quoteCoinType)` POSITIONALLY? Each side is
|
|
23
|
+
* compared via `normalizeStructTag` so framework-address padding does
|
|
24
|
+
* not defeat the match and a reversed pair does not collide. */
|
|
25
|
+
const isPoolForPair = (objectType, baseCoinType, quoteCoinType) => {
|
|
26
|
+
const parsed = parsePoolGenericArgs(objectType);
|
|
27
|
+
if (parsed === null) return false;
|
|
28
|
+
const base = normalizeStructTagSafe(parsed.base);
|
|
29
|
+
const quote = normalizeStructTagSafe(parsed.quote);
|
|
30
|
+
const wantBase = normalizeStructTagSafe(baseCoinType);
|
|
31
|
+
const wantQuote = normalizeStructTagSafe(quoteCoinType);
|
|
32
|
+
if (base === null || quote === null || wantBase === null || wantQuote === null) return false;
|
|
33
|
+
return base === wantBase && quote === wantQuote;
|
|
34
|
+
};
|
|
35
|
+
/** Split a generic-argument list on top-level commas, respecting nested
|
|
36
|
+
* `<…>` so a generic coin type argument is not split mid-bracket. */
|
|
37
|
+
const splitTopLevelGenericArgs = (inner) => {
|
|
38
|
+
const args = [];
|
|
39
|
+
let depth = 0;
|
|
40
|
+
let start = 0;
|
|
41
|
+
for (let i = 0; i < inner.length; i += 1) {
|
|
42
|
+
const ch = inner[i];
|
|
43
|
+
if (ch === "<") depth += 1;
|
|
44
|
+
else if (ch === ">") depth -= 1;
|
|
45
|
+
else if (ch === "," && depth === 0) {
|
|
46
|
+
args.push(inner.slice(start, i).trim());
|
|
47
|
+
start = i + 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
args.push(inner.slice(start).trim());
|
|
51
|
+
return args;
|
|
52
|
+
};
|
|
53
|
+
/** `normalizeStructTag` throws on a malformed tag; coerce to a sentinel
|
|
54
|
+
* so a bad parse fails the positional compare rather than the caller. */
|
|
55
|
+
const normalizeStructTagSafe = (tag) => {
|
|
56
|
+
try {
|
|
57
|
+
return normalizeStructTag(tag);
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { isPoolForPair };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=type-strings.mjs.map
|