@mysten-incubation/devstack 0.0.1 → 0.1.0
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 +7 -3
- 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 +40 -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,7 +1,14 @@
|
|
|
1
|
+
import { FUNDING_BALANCE_READ_TIMEOUT_MS } from "../../substrate/runtime/retry-policy.mjs";
|
|
1
2
|
import { LeaseBrokerService } from "../../substrate/runtime/lease-broker/service.mjs";
|
|
3
|
+
import "../../substrate/runtime/lease-broker/index.mjs";
|
|
4
|
+
import { SuiSpans } from "../sui/spans.mjs";
|
|
5
|
+
import { extractExecuteDigest } from "../../substrate/runtime/sui-execute/index.mjs";
|
|
6
|
+
import "../sui/index.mjs";
|
|
7
|
+
import { AccountSpans } from "./spans.mjs";
|
|
2
8
|
import { accountAcquireError, accountSignError } from "./errors.mjs";
|
|
3
9
|
import { withAddressLease } from "./lease.mjs";
|
|
4
10
|
import { DEFAULT_EPHEMERAL_FUND_MIST, SUI_FULL_COIN_TYPE, applyCrossCuttingFunding, fundEphemeralDefault } from "./funding.mjs";
|
|
11
|
+
import "./keypair.mjs";
|
|
5
12
|
import { resolveEphemeralVariant } from "./variants/ephemeral.mjs";
|
|
6
13
|
import { resolveKeystoreVariant } from "./variants/keystore.mjs";
|
|
7
14
|
import { resolveEnvVariant } from "./variants/env.mjs";
|
|
@@ -81,10 +88,27 @@ const validateAccountName = (name) => {
|
|
|
81
88
|
}));
|
|
82
89
|
return Effect.void;
|
|
83
90
|
};
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
/** Sum an owner's coin balances for `coinType` via `listCoins`. Used in
|
|
92
|
+
* fork mode, where `getBalance` / `listBalances` panic under the fork
|
|
93
|
+
* guard — `listCoins` is the only balance-bearing read fork mode allows. */
|
|
94
|
+
const sumBalanceViaListCoins = async (sdk, owner, coinType) => {
|
|
95
|
+
let total = 0n;
|
|
96
|
+
let cursor = null;
|
|
97
|
+
do {
|
|
98
|
+
const page = await sdk.core.listCoins({
|
|
99
|
+
owner,
|
|
100
|
+
coinType: coinType ?? "0x2::sui::SUI",
|
|
101
|
+
cursor,
|
|
102
|
+
limit: 200
|
|
103
|
+
});
|
|
104
|
+
for (const coin of page.objects) total += BigInt(coin.balance);
|
|
105
|
+
cursor = page.hasNextPage ? page.cursor : null;
|
|
106
|
+
} while (cursor !== null);
|
|
107
|
+
return total;
|
|
108
|
+
};
|
|
109
|
+
const makeFundingBalanceReader = (sdk, forkMode) => ({ readBalance: ({ owner, coinType }) => Effect.promise(async () => {
|
|
86
110
|
try {
|
|
87
|
-
return balanceAmountFromSdkResponse(await sdk.core.getBalance({
|
|
111
|
+
return forkMode ? await sumBalanceViaListCoins(sdk, owner, coinType) : balanceAmountFromSdkResponse(await sdk.core.getBalance({
|
|
88
112
|
owner,
|
|
89
113
|
coinType
|
|
90
114
|
}));
|
|
@@ -92,7 +116,7 @@ const makeFundingBalanceReader = (sdk) => ({ readBalance: ({ owner, coinType })
|
|
|
92
116
|
return null;
|
|
93
117
|
}
|
|
94
118
|
}).pipe(Effect.timeoutOrElse({
|
|
95
|
-
duration: `${
|
|
119
|
+
duration: `${FUNDING_BALANCE_READ_TIMEOUT_MS} millis`,
|
|
96
120
|
orElse: () => Effect.succeed(null)
|
|
97
121
|
})) });
|
|
98
122
|
const balanceAmountFromSdkResponse = (response) => {
|
|
@@ -163,32 +187,43 @@ const signPersonalWith = (signer, msg, accountName, address) => Effect.tryPromis
|
|
|
163
187
|
* the narrowed `TxResult` shape consumers depend on. The SDK
|
|
164
188
|
* response carries a discriminated union; the result we surface
|
|
165
189
|
* always carries a digest plus the include-projected sub-fields. */
|
|
166
|
-
const projectTxResult = (raw, accountName, address) => {
|
|
190
|
+
const projectTxResult = (raw, accountName, address) => Effect.gen(function* () {
|
|
167
191
|
const r = raw;
|
|
168
|
-
if (r.$kind === "FailedTransaction")
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
192
|
+
if (r.$kind === "FailedTransaction") {
|
|
193
|
+
const failed = r.FailedTransaction ?? {};
|
|
194
|
+
if (failed.digest === void 0) return yield* Effect.fail(accountSignError({
|
|
195
|
+
phase: "no-digest",
|
|
196
|
+
accountName,
|
|
197
|
+
address,
|
|
198
|
+
message: `Account '${accountName}': executeTransaction returned a FailedTransaction without a digest — protocol violation, got ${JSON.stringify(r).slice(0, 200)}`
|
|
199
|
+
}));
|
|
200
|
+
const errorRaw = failed.status?.error;
|
|
201
|
+
const executionError = typeof errorRaw === "string" ? errorRaw : typeof errorRaw === "object" && errorRaw !== null && "message" in errorRaw && typeof errorRaw.message === "string" ? errorRaw.message : void 0;
|
|
202
|
+
return {
|
|
203
|
+
$kind: "FailedTransaction",
|
|
204
|
+
FailedTransaction: {
|
|
205
|
+
digest: failed.digest,
|
|
206
|
+
...executionError !== void 0 ? { executionError } : {}
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
}
|
|
174
210
|
const tx = r.Transaction;
|
|
175
|
-
if (tx?.digest === void 0) return Effect.fail(accountSignError({
|
|
176
|
-
phase: "
|
|
211
|
+
if (tx?.digest === void 0) return yield* Effect.fail(accountSignError({
|
|
212
|
+
phase: "no-digest",
|
|
177
213
|
accountName,
|
|
178
214
|
address,
|
|
179
|
-
message: `Account '${accountName}': executeTransaction returned
|
|
215
|
+
message: `Account '${accountName}': executeTransaction returned a malformed envelope — expected $kind:'Transaction'|'FailedTransaction' with a digest, got ${JSON.stringify(r).slice(0, 200)}`
|
|
180
216
|
}));
|
|
181
|
-
return
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
};
|
|
217
|
+
return {
|
|
218
|
+
$kind: "Transaction",
|
|
219
|
+
Transaction: {
|
|
220
|
+
digest: tx.digest,
|
|
221
|
+
effects: tx.effects ?? null,
|
|
222
|
+
objectChanges: projectObjectChanges(tx.effects, tx.objectTypes ?? {}),
|
|
223
|
+
balanceChanges: tx.balanceChanges ?? []
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
});
|
|
192
227
|
const projectObjectChanges = (effects, objectTypes) => {
|
|
193
228
|
const changedObjects = typeof effects === "object" && effects !== null && "changedObjects" in effects ? effects.changedObjects : void 0;
|
|
194
229
|
if (changedObjects === void 0) return [];
|
|
@@ -247,13 +282,13 @@ const buildClosures = (args) => {
|
|
|
247
282
|
const withTransactionSigner = (body) => withAddressLease(broker, accountName, resolved.address, Effect.gen(function* () {
|
|
248
283
|
return yield* body(transactionSigner);
|
|
249
284
|
})).pipe(Effect.withSpan("devstack.plugin.account.transactionSigner", { attributes: {
|
|
250
|
-
|
|
251
|
-
|
|
285
|
+
[AccountSpans.name]: accountName,
|
|
286
|
+
[AccountSpans.address]: resolved.address
|
|
252
287
|
} }));
|
|
253
288
|
return {
|
|
254
289
|
signAndExecute: (tx) => withTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(Effect.withSpan("devstack.plugin.account.signAndExecute", { attributes: {
|
|
255
|
-
|
|
256
|
-
|
|
290
|
+
[AccountSpans.name]: accountName,
|
|
291
|
+
[AccountSpans.address]: resolved.address
|
|
257
292
|
} })),
|
|
258
293
|
withTransactionSigner,
|
|
259
294
|
signTransaction: refuse,
|
|
@@ -301,20 +336,20 @@ const buildClosures = (args) => {
|
|
|
301
336
|
const withTransactionSigner = (body) => withAddressLease(broker, accountName, resolved.address, Effect.gen(function* () {
|
|
302
337
|
return yield* body(transactionSigner);
|
|
303
338
|
})).pipe(Effect.withSpan("devstack.plugin.account.transactionSigner", { attributes: {
|
|
304
|
-
|
|
305
|
-
|
|
339
|
+
[AccountSpans.name]: accountName,
|
|
340
|
+
[AccountSpans.address]: resolved.address
|
|
306
341
|
} }));
|
|
307
342
|
const signTransaction = (tx) => withTransactionSigner((locked) => locked.signTransaction(tx)).pipe(Effect.withSpan("devstack.plugin.account.signTransaction", { attributes: {
|
|
308
|
-
|
|
309
|
-
|
|
343
|
+
[AccountSpans.name]: accountName,
|
|
344
|
+
[AccountSpans.address]: resolved.address
|
|
310
345
|
} }));
|
|
311
346
|
const signPersonalMessage = (msg) => withAddressLease(broker, accountName, resolved.address, signPersonalWith(signer, msg, accountName, resolved.address)).pipe(Effect.withSpan("devstack.plugin.account.signPersonalMessage", { attributes: {
|
|
312
|
-
|
|
313
|
-
|
|
347
|
+
[AccountSpans.name]: accountName,
|
|
348
|
+
[AccountSpans.address]: resolved.address
|
|
314
349
|
} }));
|
|
315
350
|
const signAndExecute = (tx) => withTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(Effect.withSpan("devstack.plugin.account.signAndExecute", { attributes: {
|
|
316
|
-
|
|
317
|
-
|
|
351
|
+
[AccountSpans.name]: accountName,
|
|
352
|
+
[AccountSpans.address]: resolved.address
|
|
318
353
|
} }));
|
|
319
354
|
return {
|
|
320
355
|
signAndExecute,
|
|
@@ -328,17 +363,17 @@ const buildClosures = (args) => {
|
|
|
328
363
|
const acquireAccount = (opts, ctx) => Effect.gen(function* () {
|
|
329
364
|
yield* validateAccountName(opts.name);
|
|
330
365
|
yield* Effect.annotateCurrentSpan({
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
366
|
+
[AccountSpans.name]: opts.name,
|
|
367
|
+
[AccountSpans.variant]: opts.kind,
|
|
368
|
+
[SuiSpans.mode]: ctx.sui.mode
|
|
334
369
|
});
|
|
335
370
|
const resolved = yield* resolveVariant(opts, ctx);
|
|
336
371
|
yield* Effect.annotateCurrentSpan({
|
|
337
|
-
|
|
338
|
-
|
|
372
|
+
[AccountSpans.address]: resolved.address,
|
|
373
|
+
[AccountSpans.scheme]: resolved.scheme
|
|
339
374
|
});
|
|
340
375
|
const broker = yield* LeaseBrokerService;
|
|
341
|
-
const balanceReader = makeFundingBalanceReader(ctx.sui.sdk);
|
|
376
|
+
const balanceReader = makeFundingBalanceReader(ctx.sui.sdk, ctx.sui.mode === "fork");
|
|
342
377
|
const defaultFunding = opts.kind === "ephemeral" && opts.funding === void 0 ? {
|
|
343
378
|
coin: "SUI",
|
|
344
379
|
fullCoinType: SUI_FULL_COIN_TYPE,
|
|
@@ -347,7 +382,7 @@ const acquireAccount = (opts, ctx) => Effect.gen(function* () {
|
|
|
347
382
|
const requestedFunding = defaultFunding === null ? ctx.projectedFunding ?? [] : [defaultFunding, ...ctx.projectedFunding ?? []];
|
|
348
383
|
const appliedDefaultFunding = [];
|
|
349
384
|
if (defaultFunding !== null) {
|
|
350
|
-
yield* fundEphemeralDefault({
|
|
385
|
+
const outcome = yield* fundEphemeralDefault({
|
|
351
386
|
accountName: opts.name,
|
|
352
387
|
address: resolved.address,
|
|
353
388
|
amountMist: defaultFunding.amount,
|
|
@@ -357,7 +392,10 @@ const acquireAccount = (opts, ctx) => Effect.gen(function* () {
|
|
|
357
392
|
broker,
|
|
358
393
|
balanceReader
|
|
359
394
|
});
|
|
360
|
-
if (
|
|
395
|
+
if (outcome !== "skipped") appliedDefaultFunding.push({
|
|
396
|
+
...defaultFunding,
|
|
397
|
+
outcome
|
|
398
|
+
});
|
|
361
399
|
}
|
|
362
400
|
const source = opts.kind === "impersonate" ? "impersonate" : "real";
|
|
363
401
|
const closures = buildClosures({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.mjs","names":[],"sources":["../../../src/plugins/account/service.ts"],"sourcesContent":["// Account plugin — service body (main acquire Effect).\n//\n// What this file does:\n//\n// 1. Validate the account name (12-account.md \"Name shape\"\n// invariant) — strict charset, length-bounded. Loud-fail at\n// the factory boundary.\n// 2. Dispatch on the variant discriminator to the right resolver\n// under `variants/`.\n// 3. Coordinate the funding pass (default + cross-cutting).\n// 4. Project the resolved keypair into the user-facing\n// `AccountValue` shape (sign + execute closures).\n//\n// What it does NOT do:\n//\n// - Talk to the chain or the faucet directly — the variant\n// resolvers + the funding helpers own those wires.\n// - Wire the capabilities — that's the barrel's job (`index.ts`).\n//\n// Distilled-doc invariant (\"Acquisition vs signing error split\"):\n// the acquire body emits ONLY `AccountAcquireError`; the resolved\n// value's sign/execute closures emit `AccountSignError`. The two\n// channels never mix.\n//\n// Per-address serialization (architecture invariant): concurrent\n// account-bound transactions for the same address MUST serialize\n// across build + sign + execute. `Transaction.build({ client })`\n// resolves gas/object versions, so taking the lease only while\n// signing still lets two callers build stale object references. The\n// substrate's `LeaseBrokerService` is the L0 primitive: each\n// transaction scope opens a fresh lease keyed by `account:<address>`.\n// The public sign helpers are implemented in terms of that scope so\n// they keep the historical per-address behavior.\n\nimport { Effect } from 'effect';\n\nimport type { Signer, SignatureWithBytes } from '@mysten/sui/cryptography';\n\nimport {\n\taccountAcquireError,\n\taccountSignError,\n\ttype AccountAcquireError,\n\ttype AccountSignError,\n} from './errors.ts';\nimport { type ResolvedKeypair } from './keypair.ts';\nimport {\n\tapplyCrossCuttingFunding,\n\tfundEphemeralDefault,\n\tDEFAULT_EPHEMERAL_FUND_MIST,\n\tSUI_FULL_COIN_TYPE,\n\ttype AccountFunding,\n\ttype AccountFundingResult,\n\ttype FundingBalanceReader,\n\ttype ProjectedFunding,\n\ttype ProjectedFundingEntry,\n} from './funding.ts';\nimport { resolveEphemeralVariant } from './variants/ephemeral.ts';\nimport { resolveKeystoreVariant } from './variants/keystore.ts';\nimport { resolveEnvVariant } from './variants/env.ts';\nimport { resolveInlineVariant } from './variants/inline.ts';\nimport { resolveSignerVariant } from './variants/signer.ts';\nimport { resolveImpersonateVariant } from './variants/impersonate.ts';\nimport type { SuiSdkShim } from '../sui/chain-probe.ts';\nimport type { StrategyRegistryService } from '../../substrate/runtime/strategy-registry/service.ts';\nimport type { ChainId } from '../../substrate/brand.ts';\nimport type { TransactionSignerScope } from '../../substrate/runtime/sui-execute/index.ts';\nimport {\n\tLeaseBrokerService,\n\ttype LeaseBroker,\n} from '../../substrate/runtime/lease-broker/index.ts';\nimport type { ForkAdminSurface } from '../sui/index.ts';\nimport { withAddressLease } from './lease.ts';\n\n// -----------------------------------------------------------------------------\n// User-facing options shape\n// -----------------------------------------------------------------------------\n\n/** Account variant discriminated union. The user-facing factory\n * takes one of these shapes (or omits `opts` entirely for the\n * default ephemeral form). */\nexport type AccountOptions<Funding extends AccountFunding = AccountFunding> =\n\t| {\n\t\t\treadonly kind: 'ephemeral';\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'keystore';\n\t\t\treadonly path: string;\n\t\t\treadonly aliasOrAddress: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'env';\n\t\t\treadonly key: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'inline';\n\t\t\treadonly privateKey: string | Uint8Array;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'signer';\n\t\t\treadonly signer: {\n\t\t\t\treadonly toSuiAddress: () => string;\n\t\t\t\treadonly getKeyScheme: () => string;\n\t\t\t\treadonly getPublicKey: () => { readonly toRawBytes: () => Uint8Array };\n\t\t\t\treadonly signTransaction: (\n\t\t\t\t\ttx: Uint8Array,\n\t\t\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t\t\t\treadonly signPersonalMessage: (\n\t\t\t\t\tmsg: Uint8Array,\n\t\t\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t\t\t};\n\t\t\treadonly addressOverride?: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'impersonate';\n\t\t\treadonly address: string;\n\t\t\treadonly funding?: Funding;\n\t };\n\nexport type ResolvedAccountOptions<Funding extends AccountFunding = AccountFunding> =\n\tAccountOptions<Funding> & { readonly name: string };\n\n// -----------------------------------------------------------------------------\n// Resolved value (the Tag's resolved-shape)\n// -----------------------------------------------------------------------------\n\n/** Per-account resolved value — the typed handle the Account tag\n * publishes.\n *\n * Architecture-distilled finding (12-account.md \"Tighten the\n * resolved-account type\"): the `source` discriminator is mandatory\n * so consumers can branch on impersonation. Impersonation accounts\n * carry a zero-buffer publicKey — the discriminator is the\n * trustworthy signal. */\nexport interface AccountValue {\n\treadonly name: string;\n\treadonly address: string;\n\treadonly scheme: 'ed25519' | 'secp256k1' | 'secp256r1';\n\treadonly publicKey: Uint8Array;\n\t/** Source discriminator — `'real'` for ephemeral / keystore / env\n\t * / inline / signer; `'impersonate'` for the fork-only variant. */\n\treadonly source: 'real' | 'impersonate';\n\t/** Sign + execute (the canonical execution surface — per-address\n\t * serialized, post-submit transaction-wait included, bounded\n\t * retry on the \"dependent package not found on-chain\" race).\n\t *\n\t * For impersonation accounts, routes through Sui's fork\n\t * admin `impersonate` surface; for real signers, routes\n\t * through the SDK's executeTransaction surface. */\n\treadonly signAndExecute: (tx: Uint8Array) => Effect.Effect<TxResult, AccountSignError>;\n\t/** Run a full account-bound transaction critical section.\n\t * Callers that must serialize `Transaction.build({ client })`\n\t * together with signing/execution use the signer passed to this\n\t * callback; the callback runs while the per-address lease is held. */\n\treadonly withTransactionSigner: <A, E, R>(\n\t\tbody: (signer: AccountTransactionSigner) => Effect.Effect<A, E, R>,\n\t) => Effect.Effect<A, E, R>;\n\t/** Sign-only — real signers honor this; impersonation accounts\n\t * throw synchronously (see `variants/impersonate.ts`). */\n\treadonly signTransaction: (\n\t\ttx: Uint8Array,\n\t) => Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError>;\n\treadonly signPersonalMessage: (\n\t\tmsg: Uint8Array,\n\t) => Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError>;\n\treadonly funding: AccountFundingResult;\n}\n\n/** Submit result projection — kept narrow so downstream consumers\n * don't depend on the full @mysten/sui execute envelope. */\nexport interface TxResult {\n\treadonly digest: string;\n\treadonly effects: unknown;\n\treadonly objectChanges: ReadonlyArray<unknown>;\n\treadonly balanceChanges: ReadonlyArray<unknown>;\n}\n\nexport interface AccountTransactionSigner extends TransactionSignerScope<AccountSignError> {\n\treadonly signAndExecute: AccountValue['signAndExecute'];\n}\n\n// -----------------------------------------------------------------------------\n// Name validation\n// -----------------------------------------------------------------------------\n\n/** Architecture-distilled invariant: name flows into the resource id, an\n * on-disk path, a manifest key, container labels, and generated\n * TypeScript exports. Keep the public name identifier-safe instead\n * of accepting path-safe spellings that codegen later rejects. */\nconst ACCOUNT_NAME_RE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ACCOUNT_NAME_HINT =\n\t'letters, digits, and underscores; must start with a letter; max 64 chars; cannot be a TypeScript reserved word';\nconst TS_RESERVED_BINDING_NAMES = new Set([\n\t'as',\n\t'async',\n\t'await',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'from',\n\t'function',\n\t'if',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'let',\n\t'new',\n\t'null',\n\t'of',\n\t'return',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield',\n]);\n\nconst accountNameInvalidReason = (name: string): string | null => {\n\tif (!ACCOUNT_NAME_RE.test(name)) {\n\t\treturn `must match ${ACCOUNT_NAME_RE.source}`;\n\t}\n\tif (TS_RESERVED_BINDING_NAMES.has(name)) {\n\t\treturn 'cannot be a TypeScript reserved word';\n\t}\n\treturn null;\n};\n\nexport const assertAccountName = (name: string): void => {\n\tconst reason = accountNameInvalidReason(name);\n\tif (reason !== null) {\n\t\tthrow new TypeError(`Account name '${name}' is invalid — ${reason}. ${ACCOUNT_NAME_HINT}`);\n\t}\n};\n\nexport const validateAccountName = (name: string): Effect.Effect<void, AccountAcquireError> => {\n\tconst reason = accountNameInvalidReason(name);\n\tif (reason !== null) {\n\t\treturn Effect.fail(\n\t\t\taccountAcquireError({\n\t\t\t\tphase: 'validate-name',\n\t\t\t\taccountName: name,\n\t\t\t\tvariant: 'ephemeral',\n\t\t\t\tmessage: `Account name '${name}' is invalid — ${reason}.`,\n\t\t\t\thint: ACCOUNT_NAME_HINT,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.void;\n};\n\n// -----------------------------------------------------------------------------\n// Variant dispatch\n// -----------------------------------------------------------------------------\n\n/** Sui mode + sdk shim — the slice of the resolved `SuiClient` the\n * account service actually consumes. Kept narrow so the variants +\n * funding helpers stay typed at the resolved-fields level (mode,\n * chain, sdk) rather than at the wide `SuiClient` shape. */\nexport interface AccountSuiShim {\n\treadonly mode: 'local' | 'local-rpc' | 'live' | 'fork';\n\treadonly chain: ChainId;\n\t/** SDK shim — exposes `executeTransaction` + `waitForTransaction`\n\t * for the signAndExecute pipeline. */\n\treadonly sdk: SuiSdkShim;\n\treadonly fork?: ForkAdminSurface | null;\n}\n\n/** Per-acquire context — supplied by the barrel from resolved plugin\n * dependencies and per-stack identity.\n *\n * `projectedFunding` carries the funding entries already resolved\n * from each `opts.funding[i].coin` dependency and projected to\n * `{fullCoinType, amount}` BEFORE handing off to `acquireAccount`.\n * The acquire body never sees the raw member refs — keeps the\n * cross-cutting funding dispatch substrate-name-blind. */\nexport interface AccountAcquireContext {\n\treadonly sui: AccountSuiShim;\n\treadonly runtimeRoot: string;\n\treadonly app: string;\n\treadonly stack: string;\n\treadonly emitAutoPromotionEvent: () => Effect.Effect<void>;\n\t/** Projected cross-cutting funding entries. Empty when `opts.funding`\n\t * is absent. The barrel stamps each resolved coin dependency's\n\t * `fullCoinType` here. */\n\treadonly projectedFunding?: ProjectedFunding;\n}\n\nconst FUNDING_BALANCE_TIMEOUT_MS = 5_000;\n\nconst makeFundingBalanceReader = (sdk: SuiSdkShim): FundingBalanceReader => ({\n\treadBalance: ({ owner, coinType }) =>\n\t\tEffect.promise(async () => {\n\t\t\ttry {\n\t\t\t\treturn balanceAmountFromSdkResponse(await sdk.core.getBalance({ owner, coinType }));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}).pipe(\n\t\t\tEffect.timeoutOrElse({\n\t\t\t\tduration: `${FUNDING_BALANCE_TIMEOUT_MS} millis`,\n\t\t\t\torElse: () => Effect.succeed(null),\n\t\t\t}),\n\t\t),\n});\n\nconst balanceAmountFromSdkResponse = (response: unknown): bigint | null => {\n\tconst outer =\n\t\ttypeof response === 'object' && response !== null && 'balance' in response\n\t\t\t? (response as { readonly balance?: unknown }).balance\n\t\t\t: response;\n\tconst value =\n\t\ttypeof outer === 'object' && outer !== null && 'balance' in outer\n\t\t\t? (outer as { readonly balance?: unknown }).balance\n\t\t\t: outer;\n\tif (typeof value === 'bigint') return value;\n\tif (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) return BigInt(value);\n\tif (typeof value === 'string' && /^\\d+$/.test(value)) return BigInt(value);\n\treturn null;\n};\n\n/** Dispatch on the variant discriminator. */\nconst resolveVariant = (\n\topts: ResolvedAccountOptions,\n\tctx: AccountAcquireContext,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> => {\n\tswitch (opts.kind) {\n\t\tcase 'ephemeral':\n\t\t\treturn resolveEphemeralVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\t// Architecture-distilled (12-account.md \"Cross-component\n\t\t\t\t// references\"): persisted key lives under the stack's\n\t\t\t\t// runtime tree. Path shape mirrors the on-disk convention.\n\t\t\t\tsecretFilePath: `${ctx.runtimeRoot}/account/${opts.name}.key`,\n\t\t\t});\n\t\tcase 'keystore':\n\t\t\treturn resolveKeystoreVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tpath: opts.path,\n\t\t\t\taliasOrAddress: opts.aliasOrAddress,\n\t\t\t});\n\t\tcase 'env':\n\t\t\treturn resolveEnvVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tvarName: opts.key,\n\t\t\t});\n\t\tcase 'inline':\n\t\t\treturn resolveInlineVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tprivateKey: opts.privateKey,\n\t\t\t});\n\t\tcase 'signer':\n\t\t\treturn resolveSignerVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tsigner: opts.signer,\n\t\t\t\t...(opts.addressOverride !== undefined ? { addressOverride: opts.addressOverride } : {}),\n\t\t\t});\n\t\tcase 'impersonate':\n\t\t\treturn resolveImpersonateVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\taddress: opts.address,\n\t\t\t\tsuiMode: ctx.sui.mode,\n\t\t\t});\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Sign + execute closures\n// -----------------------------------------------------------------------------\n\n/** Promote a Promise-returning sign call into the typed-error\n * channel. The `signer.signTransaction` / `signPersonalMessage`\n * helpers on `@mysten/sui` `Signer` instances are async; the\n * bring-your-own-signer variant uses the same shape. */\nconst signWith = (\n\tsigner: {\n\t\treadonly signTransaction: (\n\t\t\ttx: Uint8Array,\n\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t},\n\ttx: Uint8Array,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError> =>\n\tEffect.tryPromise({\n\t\ttry: () => signer.signTransaction(tx),\n\t\tcatch: (cause): AccountSignError =>\n\t\t\taccountSignError({\n\t\t\t\tphase: 'sign',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': signer.signTransaction() rejected.`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n\nconst signPersonalWith = (\n\tsigner: {\n\t\treadonly signPersonalMessage: (\n\t\t\tmsg: Uint8Array,\n\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t},\n\tmsg: Uint8Array,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError> =>\n\tEffect.tryPromise({\n\t\ttry: () => signer.signPersonalMessage(msg),\n\t\tcatch: (cause): AccountSignError =>\n\t\t\taccountSignError({\n\t\t\t\tphase: 'sign',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': signer.signPersonalMessage() rejected.`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n\n/** Project the raw `@mysten/sui` executeTransaction response into\n * the narrowed `TxResult` shape consumers depend on. The SDK\n * response carries a discriminated union; the result we surface\n * always carries a digest plus the include-projected sub-fields. */\nconst projectTxResult = (\n\traw: unknown,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<TxResult, AccountSignError> => {\n\t// Defensive shape: the SDK's TransactionResult is\n\t// `{$kind, Transaction?, FailedTransaction?}` — `Transaction.digest`\n\t// is the canonical id we need. We do best-effort projection here\n\t// rather than schema-decode (the shape is wide + the SDK pins it).\n\tconst r = raw as {\n\t\t$kind?: 'Transaction' | 'FailedTransaction';\n\t\tTransaction?: {\n\t\t\tdigest?: string;\n\t\t\teffects?: unknown;\n\t\t\tobjectTypes?: Readonly<Record<string, string>>;\n\t\t\tbalanceChanges?: ReadonlyArray<unknown>;\n\t\t};\n\t\tFailedTransaction?: {\n\t\t\tdigest?: string;\n\t\t};\n\t};\n\tif (r.$kind === 'FailedTransaction') {\n\t\treturn Effect.fail(\n\t\t\taccountSignError({\n\t\t\t\tphase: 'submit',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': transaction execution failed on-chain (digest=${r.FailedTransaction?.digest ?? '<unknown>'}).`,\n\t\t\t}),\n\t\t);\n\t}\n\tconst tx = r.Transaction;\n\tif (tx?.digest === undefined) {\n\t\treturn Effect.fail(\n\t\t\taccountSignError({\n\t\t\t\tphase: 'submit',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': executeTransaction returned no digest. Raw shape=${JSON.stringify(r).slice(0, 200)}.`,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.succeed({\n\t\tdigest: tx.digest,\n\t\teffects: tx.effects ?? null,\n\t\tobjectChanges: projectObjectChanges(tx.effects, tx.objectTypes ?? {}),\n\t\tbalanceChanges: tx.balanceChanges ?? [],\n\t});\n};\n\nconst extractExecuteDigest = (raw: unknown): string | undefined => {\n\tconst r = raw as {\n\t\t$kind?: 'Transaction' | 'FailedTransaction';\n\t\tTransaction?: { readonly digest?: string };\n\t\tFailedTransaction?: { readonly digest?: string };\n\t};\n\treturn r.$kind === 'FailedTransaction' ? r.FailedTransaction?.digest : r.Transaction?.digest;\n};\n\nconst projectObjectChanges = (\n\teffects: unknown,\n\tobjectTypes: Readonly<Record<string, string>>,\n): ReadonlyArray<unknown> => {\n\tconst changedObjects =\n\t\ttypeof effects === 'object' && effects !== null && 'changedObjects' in effects\n\t\t\t? (\n\t\t\t\t\teffects as {\n\t\t\t\t\t\treadonly changedObjects?: ReadonlyArray<{\n\t\t\t\t\t\t\treadonly objectId?: string;\n\t\t\t\t\t\t\treadonly outputState?: string;\n\t\t\t\t\t\t\treadonly idOperation?: string;\n\t\t\t\t\t\t}>;\n\t\t\t\t\t}\n\t\t\t\t).changedObjects\n\t\t\t: undefined;\n\tif (changedObjects === undefined) return [];\n\treturn changedObjects\n\t\t.filter(\n\t\t\t(\n\t\t\t\tchange,\n\t\t\t): change is {\n\t\t\t\treadonly objectId: string;\n\t\t\t\treadonly outputState?: string;\n\t\t\t\treadonly idOperation?: string;\n\t\t\t} => typeof change.objectId === 'string',\n\t\t)\n\t\t.map((change) => {\n\t\t\tconst objectType = objectTypes[change.objectId];\n\t\t\tconst entry: {\n\t\t\t\ttype: 'published' | 'created' | 'mutated';\n\t\t\t\tobjectId: string;\n\t\t\t\tobjectType?: string;\n\t\t\t\toutputState?: string;\n\t\t\t\tidOperation?: string;\n\t\t\t} = {\n\t\t\t\ttype:\n\t\t\t\t\tchange.outputState === 'PackageWrite'\n\t\t\t\t\t\t? 'published'\n\t\t\t\t\t\t: change.idOperation === 'Created'\n\t\t\t\t\t\t\t? 'created'\n\t\t\t\t\t\t\t: 'mutated',\n\t\t\t\tobjectId: change.objectId,\n\t\t\t};\n\t\t\tif (objectType !== undefined) entry.objectType = objectType;\n\t\t\tif (change.outputState !== undefined) entry.outputState = change.outputState;\n\t\t\tif (change.idOperation !== undefined) entry.idOperation = change.idOperation;\n\t\t\treturn entry;\n\t\t});\n};\n\ninterface BuildClosuresArgs {\n\treadonly accountName: string;\n\treadonly resolved: ResolvedKeypair;\n\treadonly sui: AccountSuiShim;\n\treadonly broker: LeaseBroker;\n\treadonly source: 'real' | 'impersonate';\n}\n\nconst buildClosures = (\n\targs: BuildClosuresArgs,\n): Pick<\n\tAccountValue,\n\t'signAndExecute' | 'withTransactionSigner' | 'signTransaction' | 'signPersonalMessage'\n> => {\n\tconst { accountName, resolved, sui, broker, source } = args;\n\n\t// Impersonation accounts MUST NOT sign — the synthetic signer's\n\t// signTransaction throws synchronously (architecture invariant).\n\t// signAndExecute routes through sui-fork's empty-signature\n\t// execution path while still holding the per-address lease.\n\tif (source === 'impersonate') {\n\t\tconst refuse = <A>(): Effect.Effect<A, AccountSignError> =>\n\t\t\tEffect.fail(\n\t\t\t\taccountSignError({\n\t\t\t\t\tphase: 'impersonation-bypass-attempt',\n\t\t\t\t\taccountName,\n\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\tmessage: `Account '${accountName}' is an impersonation account — sign/execute must route through Sui's fork admin surface.`,\n\t\t\t\t}),\n\t\t\t);\n\t\tconst unlockedSignAndExecute: AccountTransactionSigner['signAndExecute'] = (tx) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst fork = sui.fork ?? null;\n\t\t\t\tif (fork === null) {\n\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': impersonation requires a fork-mode Sui client.`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst submitted = yield* fork.impersonate(resolved.address, tx).pipe(\n\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t(cause): AccountSignError =>\n\t\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\t\tmessage: `Account '${accountName}': fork impersonation submit failed.`,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tyield* Effect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tsui.sdk.core.waitForTransaction({\n\t\t\t\t\t\t\tdigest: submitted.digest,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'await-finality',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': waitForTransaction(${submitted.digest}) failed.`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\treturn yield* projectTxResult(submitted.raw, accountName, resolved.address);\n\t\t\t});\n\t\tconst transactionSigner: AccountTransactionSigner = {\n\t\t\tsignTransaction: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t\tsignAndExecute: unlockedSignAndExecute,\n\t\t};\n\t\tconst withTransactionSigner: AccountValue['withTransactionSigner'] = (body) =>\n\t\t\twithAddressLease(\n\t\t\t\tbroker,\n\t\t\t\taccountName,\n\t\t\t\tresolved.address,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\treturn yield* body(transactionSigner);\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\tEffect.withSpan('devstack.plugin.account.transactionSigner', {\n\t\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t\t}),\n\t\t\t);\n\t\treturn {\n\t\t\tsignAndExecute: (tx) =>\n\t\t\t\twithTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(\n\t\t\t\t\tEffect.withSpan('devstack.plugin.account.signAndExecute', {\n\t\t\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\twithTransactionSigner,\n\t\t\tsignTransaction: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t\tsignPersonalMessage: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t};\n\t}\n\n\t// Both real-keypair and bring-your-own-signer paths satisfy the\n\t// minimal `signTransaction` / `signPersonalMessage` shape (the\n\t// SDK's `Signer` and the BYO `signer` declaration agree on it).\n\tconst signer = resolved.signer as Pick<Signer, 'signTransaction' | 'signPersonalMessage'>;\n\n\tconst unlockedSignTransaction: AccountTransactionSigner['signTransaction'] = (tx) =>\n\t\tsignWith(signer, tx, accountName, resolved.address);\n\n\tconst unlockedSignAndExecute: AccountTransactionSigner['signAndExecute'] = (tx) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst signed: SignatureWithBytes = yield* unlockedSignTransaction(tx);\n\t\t\tconst raw = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\tsui.sdk.core.executeTransaction({\n\t\t\t\t\t\ttransaction: tx,\n\t\t\t\t\t\tsignatures: [signed.signature],\n\t\t\t\t\t\tinclude: { effects: true, objectTypes: true },\n\t\t\t\t\t}),\n\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\taccountSignError({\n\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\taccountName,\n\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\tmessage: `Account '${accountName}': executeTransaction transport failed.`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t});\n\t\t\tconst digest = extractExecuteDigest(raw);\n\t\t\tif (digest !== undefined) {\n\t\t\t\tyield* Effect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tsui.sdk.core.waitForTransaction({\n\t\t\t\t\t\t\tdigest,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'await-finality',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': waitForTransaction(${digest}) failed.`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst result = yield* projectTxResult(raw, accountName, resolved.address);\n\t\t\treturn result;\n\t\t});\n\n\tconst transactionSigner: AccountTransactionSigner = {\n\t\tsignTransaction: unlockedSignTransaction,\n\t\tsignAndExecute: unlockedSignAndExecute,\n\t};\n\n\tconst withTransactionSigner: AccountValue['withTransactionSigner'] = (body) =>\n\t\twithAddressLease(\n\t\t\tbroker,\n\t\t\taccountName,\n\t\t\tresolved.address,\n\t\t\tEffect.gen(function* () {\n\t\t\t\treturn yield* body(transactionSigner);\n\t\t\t}),\n\t\t).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.transactionSigner', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\tconst signTransaction: AccountValue['signTransaction'] = (tx) =>\n\t\twithTransactionSigner((locked) => locked.signTransaction(tx)).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signTransaction', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\tconst signPersonalMessage: AccountValue['signPersonalMessage'] = (msg) =>\n\t\twithAddressLease(\n\t\t\tbroker,\n\t\t\taccountName,\n\t\t\tresolved.address,\n\t\t\tsignPersonalWith(signer, msg, accountName, resolved.address),\n\t\t).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signPersonalMessage', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\tconst signAndExecute: AccountValue['signAndExecute'] = (tx) =>\n\t\twithTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signAndExecute', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\treturn { signAndExecute, withTransactionSigner, signTransaction, signPersonalMessage };\n};\n\n// -----------------------------------------------------------------------------\n// Acquire orchestration\n// -----------------------------------------------------------------------------\n\n/** Acquire an account. Coordinates variant dispatch + funding +\n * the resolved-value projection. */\nexport const acquireAccount = (\n\topts: ResolvedAccountOptions,\n\tctx: AccountAcquireContext,\n): Effect.Effect<AccountValue, AccountAcquireError, StrategyRegistryService | LeaseBrokerService> =>\n\tEffect.gen(function* () {\n\t\tyield* validateAccountName(opts.name);\n\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'account.name': opts.name,\n\t\t\t'account.variant': opts.kind,\n\t\t\t'sui.mode': ctx.sui.mode,\n\t\t});\n\n\t\t// --- variant dispatch ----------------------------------------\n\t\tconst resolved = yield* resolveVariant(opts, ctx);\n\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'account.address': resolved.address,\n\t\t\t'account.scheme': resolved.scheme,\n\t\t});\n\n\t\t// --- lease broker handle (captured once; both funding and the\n\t\t// resolved-value closures share this handle so concurrent\n\t\t// callers serialize through the substrate broker's per-key\n\t\t// FIFO queue) -------------------------------------------\n\t\tconst broker = yield* LeaseBrokerService;\n\t\tconst balanceReader = makeFundingBalanceReader(ctx.sui.sdk);\n\n\t\tconst defaultFunding: ProjectedFundingEntry | null =\n\t\t\topts.kind === 'ephemeral' && opts.funding === undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcoin: 'SUI',\n\t\t\t\t\t\tfullCoinType: SUI_FULL_COIN_TYPE,\n\t\t\t\t\t\tamount: DEFAULT_EPHEMERAL_FUND_MIST,\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\tconst requestedFunding =\n\t\t\tdefaultFunding === null\n\t\t\t\t? (ctx.projectedFunding ?? [])\n\t\t\t\t: [defaultFunding, ...(ctx.projectedFunding ?? [])];\n\t\tconst appliedDefaultFunding: ProjectedFundingEntry[] = [];\n\n\t\t// --- default funding (bare ephemeral only) -------------------\n\t\tif (defaultFunding !== null) {\n\t\t\tyield* fundEphemeralDefault({\n\t\t\t\taccountName: opts.name,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tamountMist: defaultFunding.amount,\n\t\t\t\tsuiMode: ctx.sui.mode,\n\t\t\t\tchainId: ctx.sui.chain,\n\t\t\t\temitAutoPromotionEvent: ctx.emitAutoPromotionEvent,\n\t\t\t\tbroker,\n\t\t\t\tbalanceReader,\n\t\t\t});\n\t\t\tif (defaultFunding.amount > 0n) {\n\t\t\t\tappliedDefaultFunding.push(defaultFunding);\n\t\t\t}\n\t\t}\n\n\t\tconst source: AccountValue['source'] = opts.kind === 'impersonate' ? 'impersonate' : 'real';\n\t\tconst closures = buildClosures({\n\t\t\taccountName: opts.name,\n\t\t\tresolved,\n\t\t\tsui: ctx.sui,\n\t\t\tbroker,\n\t\t\tsource,\n\t\t});\n\n\t\t// --- project the resolved value ------------------------------\n\t\tconst value: AccountValue = {\n\t\t\tname: opts.name,\n\t\t\taddress: resolved.address,\n\t\t\tscheme: resolved.scheme,\n\t\t\tpublicKey: resolved.publicKey,\n\t\t\tsource,\n\t\t\tfunding: {\n\t\t\t\trequested: requestedFunding,\n\t\t\t\tapplied: appliedDefaultFunding,\n\t\t\t},\n\t\t\t...closures,\n\t\t};\n\n\t\t// --- cross-cutting funding (all variants) --------------------\n\t\t//\n\t\t// The barrel pre-projects each user-supplied `CoinMember` to\n\t\t// `{fullCoinType, amount}` from resolved dependencies so this\n\t\t// dispatch stays substrate-name-blind. The resolved account\n\t\t// handle is passed so strategy providers without admin\n\t\t// capabilities can sign account-owned funding swaps. Missing /\n\t\t// empty `projectedFunding` is a no-op (matches the \"Optional\n\t\t// Faucet is a noop\" invariant).\n\t\tconst projected = ctx.projectedFunding ?? [];\n\t\tlet appliedCrossCuttingFunding: ProjectedFunding = [];\n\t\tif (projected.length > 0) {\n\t\t\tappliedCrossCuttingFunding = yield* applyCrossCuttingFunding({\n\t\t\t\taccountName: opts.name,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tvariant: opts.kind,\n\t\t\t\taccount: value,\n\t\t\t\tfunding: projected,\n\t\t\t\tchainId: ctx.sui.chain,\n\t\t\t\tbroker,\n\t\t\t\tbalanceReader,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\t...value,\n\t\t\tfunding: {\n\t\t\t\trequested: requestedFunding,\n\t\t\t\tapplied: [...appliedDefaultFunding, ...appliedCrossCuttingFunding],\n\t\t\t},\n\t\t};\n\t});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.mjs","names":[],"sources":["../../../src/plugins/account/service.ts"],"sourcesContent":["// Account plugin — service body (main acquire Effect).\n//\n// What this file does:\n//\n// 1. Validate the account name (12-account.md \"Name shape\"\n// invariant) — strict charset, length-bounded. Loud-fail at\n// the factory boundary.\n// 2. Dispatch on the variant discriminator to the right resolver\n// under `variants/`.\n// 3. Coordinate the funding pass (default + cross-cutting).\n// 4. Project the resolved keypair into the user-facing\n// `AccountValue` shape (sign + execute closures).\n//\n// What it does NOT do:\n//\n// - Talk to the chain or the faucet directly — the variant\n// resolvers + the funding helpers own those wires.\n// - Wire the capabilities — that's the barrel's job (`index.ts`).\n//\n// Distilled-doc invariant (\"Acquisition vs signing error split\"):\n// the acquire body emits ONLY `AccountAcquireError`; the resolved\n// value's sign/execute closures emit `AccountSignError`. The two\n// channels never mix.\n//\n// Per-address serialization (architecture invariant): concurrent\n// account-bound transactions for the same address MUST serialize\n// across build + sign + execute. `Transaction.build({ client })`\n// resolves gas/object versions, so taking the lease only while\n// signing still lets two callers build stale object references. The\n// substrate's `LeaseBrokerService` is the L0 primitive: each\n// transaction scope opens a fresh lease keyed by `account:<address>`.\n// The public sign helpers are implemented in terms of that scope so\n// they keep the historical per-address behavior.\n\nimport { Effect } from 'effect';\n\nimport type { Signer, SignatureWithBytes } from '@mysten/sui/cryptography';\n\nimport {\n\taccountAcquireError,\n\taccountSignError,\n\ttype AccountAcquireError,\n\ttype AccountSignError,\n} from './errors.ts';\nimport { type ResolvedKeypair } from './keypair.ts';\nimport {\n\tapplyCrossCuttingFunding,\n\tfundEphemeralDefault,\n\tDEFAULT_EPHEMERAL_FUND_MIST,\n\tSUI_FULL_COIN_TYPE,\n\ttype AccountFunding,\n\ttype AccountFundingResult,\n\ttype AppliedFunding,\n\ttype AppliedFundingEntry,\n\ttype FundingBalanceReader,\n\ttype ProjectedFunding,\n\ttype ProjectedFundingEntry,\n} from './funding.ts';\nimport { resolveEphemeralVariant } from './variants/ephemeral.ts';\nimport { resolveKeystoreVariant } from './variants/keystore.ts';\nimport { resolveEnvVariant } from './variants/env.ts';\nimport { resolveInlineVariant } from './variants/inline.ts';\nimport { resolveSignerVariant } from './variants/signer.ts';\nimport { resolveImpersonateVariant } from './variants/impersonate.ts';\nimport type { StrategyRegistryService } from '../../substrate/runtime/strategy-registry/service.ts';\nimport type { ChainId } from '../../substrate/brand.ts';\nimport {\n\textractExecuteDigest,\n\ttype ExecutedFailure,\n\ttype TransactionSignerScope,\n} from '../../substrate/runtime/sui-execute/index.ts';\nimport {\n\tLeaseBrokerService,\n\ttype LeaseBroker,\n} from '../../substrate/runtime/lease-broker/index.ts';\nimport { FUNDING_BALANCE_READ_TIMEOUT_MS } from '../../substrate/runtime/retry-policy.ts';\nimport { type ForkAdminSurface, type SuiSdkShim, SuiSpans } from '../sui/index.ts';\nimport { withAddressLease } from './lease.ts';\nimport { AccountSpans } from './spans.ts';\n\n// -----------------------------------------------------------------------------\n// User-facing options shape\n// -----------------------------------------------------------------------------\n\n/** Account variant discriminated union. The user-facing factory\n * takes one of these shapes (or omits `opts` entirely for the\n * default ephemeral form). */\nexport type AccountOptions<Funding extends AccountFunding = AccountFunding> =\n\t| {\n\t\t\treadonly kind: 'ephemeral';\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'keystore';\n\t\t\treadonly path: string;\n\t\t\treadonly aliasOrAddress: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'env';\n\t\t\treadonly key: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'inline';\n\t\t\treadonly privateKey: string | Uint8Array;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'signer';\n\t\t\treadonly signer: {\n\t\t\t\treadonly toSuiAddress: () => string;\n\t\t\t\treadonly getKeyScheme: () => string;\n\t\t\t\treadonly getPublicKey: () => { readonly toRawBytes: () => Uint8Array };\n\t\t\t\treadonly signTransaction: (\n\t\t\t\t\ttx: Uint8Array,\n\t\t\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t\t\t\treadonly signPersonalMessage: (\n\t\t\t\t\tmsg: Uint8Array,\n\t\t\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t\t\t};\n\t\t\treadonly addressOverride?: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'impersonate';\n\t\t\treadonly address: string;\n\t\t\treadonly funding?: Funding;\n\t };\n\nexport type ResolvedAccountOptions<Funding extends AccountFunding = AccountFunding> =\n\tAccountOptions<Funding> & { readonly name: string };\n\n// -----------------------------------------------------------------------------\n// Resolved value (the Tag's resolved-shape)\n// -----------------------------------------------------------------------------\n\n/** Per-account resolved value — the typed handle the Account tag\n * publishes.\n *\n * Architecture-distilled finding (12-account.md \"Tighten the\n * resolved-account type\"): the `source` discriminator is mandatory\n * so consumers can branch on impersonation. Impersonation accounts\n * carry a zero-buffer publicKey — the discriminator is the\n * trustworthy signal. */\nexport interface AccountValue {\n\treadonly name: string;\n\treadonly address: string;\n\treadonly scheme: 'ed25519' | 'secp256k1' | 'secp256r1';\n\treadonly publicKey: Uint8Array;\n\t/** Source discriminator — `'real'` for ephemeral / keystore / env\n\t * / inline / signer; `'impersonate'` for the fork-only variant. */\n\treadonly source: 'real' | 'impersonate';\n\t/** Sign + execute (the canonical execution surface — per-address\n\t * serialized, post-submit transaction-wait included, bounded\n\t * retry on the \"dependent package not found on-chain\" race).\n\t *\n\t * For impersonation accounts, routes through Sui's fork\n\t * admin `impersonate` surface; for real signers, routes\n\t * through the SDK's executeTransaction surface. */\n\treadonly signAndExecute: (\n\t\ttx: Uint8Array,\n\t) => Effect.Effect<SignAndExecuteResult, AccountSignError>;\n\t/** Run a full account-bound transaction critical section.\n\t * Callers that must serialize `Transaction.build({ client })`\n\t * together with signing/execution use the signer passed to this\n\t * callback; the callback runs while the per-address lease is held. */\n\treadonly withTransactionSigner: <A, E, R>(\n\t\tbody: (signer: AccountTransactionSigner) => Effect.Effect<A, E, R>,\n\t) => Effect.Effect<A, E, R>;\n\t/** Sign-only — real signers honor this; impersonation accounts\n\t * throw synchronously (see `variants/impersonate.ts`). */\n\treadonly signTransaction: (\n\t\ttx: Uint8Array,\n\t) => Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError>;\n\treadonly signPersonalMessage: (\n\t\tmsg: Uint8Array,\n\t) => Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError>;\n\treadonly funding: AccountFundingResult;\n}\n\n/** Submit result projection — kept narrow so downstream consumers\n * don't depend on the full @mysten/sui execute envelope. Populated\n * only when the on-chain execution succeeded (the `'Transaction'`\n * variant of `SignAndExecuteResult`). */\nexport interface TxResult {\n\treadonly digest: string;\n\treadonly effects: unknown;\n\treadonly objectChanges: ReadonlyArray<unknown>;\n\treadonly balanceChanges: ReadonlyArray<unknown>;\n}\n\n/** Outcome of `signAndExecute`. Mirrors the SDK's discriminated\n * `SuiClientTypes.TransactionResult` shape — on-chain failures are\n * a RETURN VALUE (callers dispatch on `$kind`), NOT an error. Only\n * transport / lifecycle failures (sign refused, RPC unreachable,\n * finality wait broke) surface through `AccountSignError`.\n *\n * The on-chain `FailedTransaction` projection is the substrate\n * `ExecutedFailure` shape — single source of truth lives in\n * `substrate/runtime/sui-execute/index.ts`. An envelope without a\n * digest fails at projection with `AccountSignError(phase: 'no-digest')`. */\nexport type SignAndExecuteResult =\n\t| { readonly $kind: 'Transaction'; readonly Transaction: TxResult }\n\t| { readonly $kind: 'FailedTransaction'; readonly FailedTransaction: ExecutedFailure };\n\nexport interface AccountTransactionSigner extends TransactionSignerScope<AccountSignError> {\n\treadonly signAndExecute: AccountValue['signAndExecute'];\n}\n\n// -----------------------------------------------------------------------------\n// Name validation\n// -----------------------------------------------------------------------------\n\n/** Architecture-distilled invariant: name flows into the resource id, an\n * on-disk path, a manifest key, container labels, and generated\n * TypeScript exports. Keep the public name identifier-safe instead\n * of accepting path-safe spellings that codegen later rejects. */\nconst ACCOUNT_NAME_RE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ACCOUNT_NAME_HINT =\n\t'letters, digits, and underscores; must start with a letter; max 64 chars; cannot be a TypeScript reserved word';\nconst TS_RESERVED_BINDING_NAMES = new Set([\n\t'as',\n\t'async',\n\t'await',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'from',\n\t'function',\n\t'if',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'let',\n\t'new',\n\t'null',\n\t'of',\n\t'return',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield',\n]);\n\nconst accountNameInvalidReason = (name: string): string | null => {\n\tif (!ACCOUNT_NAME_RE.test(name)) {\n\t\treturn `must match ${ACCOUNT_NAME_RE.source}`;\n\t}\n\tif (TS_RESERVED_BINDING_NAMES.has(name)) {\n\t\treturn 'cannot be a TypeScript reserved word';\n\t}\n\treturn null;\n};\n\nexport const assertAccountName = (name: string): void => {\n\tconst reason = accountNameInvalidReason(name);\n\tif (reason !== null) {\n\t\tthrow new TypeError(`Account name '${name}' is invalid — ${reason}. ${ACCOUNT_NAME_HINT}`);\n\t}\n};\n\nexport const validateAccountName = (name: string): Effect.Effect<void, AccountAcquireError> => {\n\tconst reason = accountNameInvalidReason(name);\n\tif (reason !== null) {\n\t\treturn Effect.fail(\n\t\t\taccountAcquireError({\n\t\t\t\tphase: 'validate-name',\n\t\t\t\taccountName: name,\n\t\t\t\tvariant: 'ephemeral',\n\t\t\t\tmessage: `Account name '${name}' is invalid — ${reason}.`,\n\t\t\t\thint: ACCOUNT_NAME_HINT,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.void;\n};\n\n// -----------------------------------------------------------------------------\n// Variant dispatch\n// -----------------------------------------------------------------------------\n\n/** Sui mode + sdk shim — the slice of the resolved `SuiClient` the\n * account service actually consumes. Kept narrow so the variants +\n * funding helpers stay typed at the resolved-fields level (mode,\n * chain, sdk) rather than at the wide `SuiClient` shape. */\nexport interface AccountSuiShim {\n\treadonly mode: 'local' | 'local-rpc' | 'live' | 'fork';\n\treadonly chain: ChainId;\n\t/** SDK shim — exposes `executeTransaction` + `waitForTransaction`\n\t * for the signAndExecute pipeline. */\n\treadonly sdk: SuiSdkShim;\n\treadonly fork?: ForkAdminSurface | null;\n}\n\n/** Per-acquire context — supplied by the barrel from resolved plugin\n * dependencies and per-stack identity.\n *\n * `projectedFunding` carries the funding entries already resolved\n * from each `opts.funding[i].coin` dependency and projected to\n * `{fullCoinType, amount}` BEFORE handing off to `acquireAccount`.\n * The acquire body never sees the raw member refs — keeps the\n * cross-cutting funding dispatch substrate-name-blind. */\nexport interface AccountAcquireContext {\n\treadonly sui: AccountSuiShim;\n\treadonly runtimeRoot: string;\n\treadonly app: string;\n\treadonly stack: string;\n\treadonly emitAutoPromotionEvent: () => Effect.Effect<void>;\n\t/** Projected cross-cutting funding entries. Empty when `opts.funding`\n\t * is absent. The barrel stamps each resolved coin dependency's\n\t * `fullCoinType` here. */\n\treadonly projectedFunding?: ProjectedFunding;\n}\n\n/** Sum an owner's coin balances for `coinType` via `listCoins`. Used in\n * fork mode, where `getBalance` / `listBalances` panic under the fork\n * guard — `listCoins` is the only balance-bearing read fork mode allows. */\nconst sumBalanceViaListCoins = async (\n\tsdk: SuiSdkShim,\n\towner: string,\n\tcoinType: string | undefined,\n): Promise<bigint> => {\n\tlet total = 0n;\n\tlet cursor: string | null = null;\n\tdo {\n\t\tconst page = await sdk.core.listCoins({\n\t\t\towner,\n\t\t\tcoinType: coinType ?? '0x2::sui::SUI',\n\t\t\tcursor,\n\t\t\tlimit: 200,\n\t\t});\n\t\tfor (const coin of page.objects) {\n\t\t\ttotal += BigInt(coin.balance);\n\t\t}\n\t\tcursor = page.hasNextPage ? page.cursor : null;\n\t} while (cursor !== null);\n\treturn total;\n};\n\nconst makeFundingBalanceReader = (sdk: SuiSdkShim, forkMode: boolean): FundingBalanceReader => ({\n\treadBalance: ({ owner, coinType }) =>\n\t\tEffect.promise(async () => {\n\t\t\ttry {\n\t\t\t\t// Fork mode forbids getBalance/listBalances (they panic under the\n\t\t\t\t// fork guard); sum coins via the fork-safe listCoins instead.\n\t\t\t\treturn forkMode\n\t\t\t\t\t? await sumBalanceViaListCoins(sdk, owner, coinType)\n\t\t\t\t\t: balanceAmountFromSdkResponse(await sdk.core.getBalance({ owner, coinType }));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}).pipe(\n\t\t\tEffect.timeoutOrElse({\n\t\t\t\tduration: `${FUNDING_BALANCE_READ_TIMEOUT_MS} millis`,\n\t\t\t\torElse: () => Effect.succeed(null),\n\t\t\t}),\n\t\t),\n});\n\nconst balanceAmountFromSdkResponse = (response: unknown): bigint | null => {\n\tconst outer =\n\t\ttypeof response === 'object' && response !== null && 'balance' in response\n\t\t\t? (response as { readonly balance?: unknown }).balance\n\t\t\t: response;\n\tconst value =\n\t\ttypeof outer === 'object' && outer !== null && 'balance' in outer\n\t\t\t? (outer as { readonly balance?: unknown }).balance\n\t\t\t: outer;\n\tif (typeof value === 'bigint') return value;\n\tif (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) return BigInt(value);\n\tif (typeof value === 'string' && /^\\d+$/.test(value)) return BigInt(value);\n\treturn null;\n};\n\n/** Dispatch on the variant discriminator. */\nconst resolveVariant = (\n\topts: ResolvedAccountOptions,\n\tctx: AccountAcquireContext,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> => {\n\tswitch (opts.kind) {\n\t\tcase 'ephemeral':\n\t\t\treturn resolveEphemeralVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\t// Architecture-distilled (12-account.md \"Cross-component\n\t\t\t\t// references\"): persisted key lives under the stack's\n\t\t\t\t// runtime tree. Path shape mirrors the on-disk convention.\n\t\t\t\tsecretFilePath: `${ctx.runtimeRoot}/account/${opts.name}.key`,\n\t\t\t});\n\t\tcase 'keystore':\n\t\t\treturn resolveKeystoreVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tpath: opts.path,\n\t\t\t\taliasOrAddress: opts.aliasOrAddress,\n\t\t\t});\n\t\tcase 'env':\n\t\t\treturn resolveEnvVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tvarName: opts.key,\n\t\t\t});\n\t\tcase 'inline':\n\t\t\treturn resolveInlineVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tprivateKey: opts.privateKey,\n\t\t\t});\n\t\tcase 'signer':\n\t\t\treturn resolveSignerVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tsigner: opts.signer,\n\t\t\t\t...(opts.addressOverride !== undefined ? { addressOverride: opts.addressOverride } : {}),\n\t\t\t});\n\t\tcase 'impersonate':\n\t\t\treturn resolveImpersonateVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\taddress: opts.address,\n\t\t\t\tsuiMode: ctx.sui.mode,\n\t\t\t});\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Sign + execute closures\n// -----------------------------------------------------------------------------\n\n/** Promote a Promise-returning sign call into the typed-error\n * channel. The `signer.signTransaction` / `signPersonalMessage`\n * helpers on `@mysten/sui` `Signer` instances are async; the\n * bring-your-own-signer variant uses the same shape. */\nconst signWith = (\n\tsigner: {\n\t\treadonly signTransaction: (\n\t\t\ttx: Uint8Array,\n\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t},\n\ttx: Uint8Array,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError> =>\n\tEffect.tryPromise({\n\t\ttry: () => signer.signTransaction(tx),\n\t\tcatch: (cause): AccountSignError =>\n\t\t\taccountSignError({\n\t\t\t\tphase: 'sign',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': signer.signTransaction() rejected.`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n\nconst signPersonalWith = (\n\tsigner: {\n\t\treadonly signPersonalMessage: (\n\t\t\tmsg: Uint8Array,\n\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t},\n\tmsg: Uint8Array,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError> =>\n\tEffect.tryPromise({\n\t\ttry: () => signer.signPersonalMessage(msg),\n\t\tcatch: (cause): AccountSignError =>\n\t\t\taccountSignError({\n\t\t\t\tphase: 'sign',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': signer.signPersonalMessage() rejected.`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n\n/** Project the raw `@mysten/sui` executeTransaction response into\n * the narrowed `TxResult` shape consumers depend on. The SDK\n * response carries a discriminated union; the result we surface\n * always carries a digest plus the include-projected sub-fields. */\nconst projectTxResult = (\n\traw: unknown,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<SignAndExecuteResult, AccountSignError> =>\n\tEffect.gen(function* () {\n\t\t// The SDK's `SuiClientTypes.TransactionResult` is a discriminated\n\t\t// union — `{$kind: 'Transaction', Transaction: {...}}` or\n\t\t// `{$kind: 'FailedTransaction', FailedTransaction: {...}}` —\n\t\t// where each variant carries a non-optional `digest`. Mirror the\n\t\t// shape on-channel so callers dispatch on `$kind`; on-chain\n\t\t// failures are a RETURN VALUE, not an error.\n\t\tconst r = raw as {\n\t\t\t$kind?: 'Transaction' | 'FailedTransaction';\n\t\t\tTransaction?: {\n\t\t\t\tdigest?: string;\n\t\t\t\teffects?: unknown;\n\t\t\t\tobjectTypes?: Readonly<Record<string, string>>;\n\t\t\t\tbalanceChanges?: ReadonlyArray<unknown>;\n\t\t\t};\n\t\t\tFailedTransaction?: {\n\t\t\t\tdigest?: string;\n\t\t\t\tstatus?: { readonly error?: string | { readonly message?: string } };\n\t\t\t};\n\t\t};\n\t\tif (r.$kind === 'FailedTransaction') {\n\t\t\tconst failed = r.FailedTransaction ?? {};\n\t\t\tif (failed.digest === undefined) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\taccountSignError({\n\t\t\t\t\t\tphase: 'no-digest',\n\t\t\t\t\t\taccountName,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`Account '${accountName}': executeTransaction returned a FailedTransaction ` +\n\t\t\t\t\t\t\t`without a digest — protocol violation, got ` +\n\t\t\t\t\t\t\t`${JSON.stringify(r).slice(0, 200)}`,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst errorRaw = failed.status?.error;\n\t\t\tconst executionError =\n\t\t\t\ttypeof errorRaw === 'string'\n\t\t\t\t\t? errorRaw\n\t\t\t\t\t: typeof errorRaw === 'object' &&\n\t\t\t\t\t\t errorRaw !== null &&\n\t\t\t\t\t\t 'message' in errorRaw &&\n\t\t\t\t\t\t typeof errorRaw.message === 'string'\n\t\t\t\t\t\t? errorRaw.message\n\t\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\t$kind: 'FailedTransaction',\n\t\t\t\tFailedTransaction: {\n\t\t\t\t\tdigest: failed.digest,\n\t\t\t\t\t...(executionError !== undefined ? { executionError } : {}),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst tx = r.Transaction;\n\t\tif (tx?.digest === undefined) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\taccountSignError({\n\t\t\t\t\tphase: 'no-digest',\n\t\t\t\t\taccountName,\n\t\t\t\t\taddress,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Account '${accountName}': executeTransaction returned a malformed envelope — ` +\n\t\t\t\t\t\t`expected $kind:'Transaction'|'FailedTransaction' with a digest, got ` +\n\t\t\t\t\t\t`${JSON.stringify(r).slice(0, 200)}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\t$kind: 'Transaction',\n\t\t\tTransaction: {\n\t\t\t\tdigest: tx.digest,\n\t\t\t\teffects: tx.effects ?? null,\n\t\t\t\tobjectChanges: projectObjectChanges(tx.effects, tx.objectTypes ?? {}),\n\t\t\t\tbalanceChanges: tx.balanceChanges ?? [],\n\t\t\t},\n\t\t};\n\t});\n\nconst projectObjectChanges = (\n\teffects: unknown,\n\tobjectTypes: Readonly<Record<string, string>>,\n): ReadonlyArray<unknown> => {\n\tconst changedObjects =\n\t\ttypeof effects === 'object' && effects !== null && 'changedObjects' in effects\n\t\t\t? (\n\t\t\t\t\teffects as {\n\t\t\t\t\t\treadonly changedObjects?: ReadonlyArray<{\n\t\t\t\t\t\t\treadonly objectId?: string;\n\t\t\t\t\t\t\treadonly outputState?: string;\n\t\t\t\t\t\t\treadonly idOperation?: string;\n\t\t\t\t\t\t}>;\n\t\t\t\t\t}\n\t\t\t\t).changedObjects\n\t\t\t: undefined;\n\tif (changedObjects === undefined) return [];\n\treturn changedObjects\n\t\t.filter(\n\t\t\t(\n\t\t\t\tchange,\n\t\t\t): change is {\n\t\t\t\treadonly objectId: string;\n\t\t\t\treadonly outputState?: string;\n\t\t\t\treadonly idOperation?: string;\n\t\t\t} => typeof change.objectId === 'string',\n\t\t)\n\t\t.map((change) => {\n\t\t\tconst objectType = objectTypes[change.objectId];\n\t\t\tconst entry: {\n\t\t\t\ttype: 'published' | 'created' | 'mutated';\n\t\t\t\tobjectId: string;\n\t\t\t\tobjectType?: string;\n\t\t\t\toutputState?: string;\n\t\t\t\tidOperation?: string;\n\t\t\t} = {\n\t\t\t\ttype:\n\t\t\t\t\tchange.outputState === 'PackageWrite'\n\t\t\t\t\t\t? 'published'\n\t\t\t\t\t\t: change.idOperation === 'Created'\n\t\t\t\t\t\t\t? 'created'\n\t\t\t\t\t\t\t: 'mutated',\n\t\t\t\tobjectId: change.objectId,\n\t\t\t};\n\t\t\tif (objectType !== undefined) entry.objectType = objectType;\n\t\t\tif (change.outputState !== undefined) entry.outputState = change.outputState;\n\t\t\tif (change.idOperation !== undefined) entry.idOperation = change.idOperation;\n\t\t\treturn entry;\n\t\t});\n};\n\ninterface BuildClosuresArgs {\n\treadonly accountName: string;\n\treadonly resolved: ResolvedKeypair;\n\treadonly sui: AccountSuiShim;\n\treadonly broker: LeaseBroker;\n\treadonly source: 'real' | 'impersonate';\n}\n\nconst buildClosures = (\n\targs: BuildClosuresArgs,\n): Pick<\n\tAccountValue,\n\t'signAndExecute' | 'withTransactionSigner' | 'signTransaction' | 'signPersonalMessage'\n> => {\n\tconst { accountName, resolved, sui, broker, source } = args;\n\n\t// Impersonation accounts MUST NOT sign — the synthetic signer's\n\t// signTransaction throws synchronously (architecture invariant).\n\t// signAndExecute routes through sui-fork's empty-signature\n\t// execution path while still holding the per-address lease.\n\tif (source === 'impersonate') {\n\t\tconst refuse = <A>(): Effect.Effect<A, AccountSignError> =>\n\t\t\tEffect.fail(\n\t\t\t\taccountSignError({\n\t\t\t\t\tphase: 'impersonation-bypass-attempt',\n\t\t\t\t\taccountName,\n\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\tmessage: `Account '${accountName}' is an impersonation account — sign/execute must route through Sui's fork admin surface.`,\n\t\t\t\t}),\n\t\t\t);\n\t\tconst unlockedSignAndExecute: AccountTransactionSigner['signAndExecute'] = (tx) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst fork = sui.fork ?? null;\n\t\t\t\tif (fork === null) {\n\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': impersonation requires a fork-mode Sui client.`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst submitted = yield* fork.impersonate(resolved.address, tx).pipe(\n\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t(cause): AccountSignError =>\n\t\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\t\tmessage: `Account '${accountName}': fork impersonation submit failed.`,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tyield* Effect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tsui.sdk.core.waitForTransaction({\n\t\t\t\t\t\t\tdigest: submitted.digest,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'await-finality',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': waitForTransaction(${submitted.digest}) failed.`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\treturn yield* projectTxResult(submitted.raw, accountName, resolved.address);\n\t\t\t});\n\t\tconst transactionSigner: AccountTransactionSigner = {\n\t\t\tsignTransaction: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t\tsignAndExecute: unlockedSignAndExecute,\n\t\t};\n\t\tconst withTransactionSigner: AccountValue['withTransactionSigner'] = (body) =>\n\t\t\twithAddressLease(\n\t\t\t\tbroker,\n\t\t\t\taccountName,\n\t\t\t\tresolved.address,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\treturn yield* body(transactionSigner);\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\tEffect.withSpan('devstack.plugin.account.transactionSigner', {\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t[AccountSpans.name]: accountName,\n\t\t\t\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\treturn {\n\t\t\tsignAndExecute: (tx) =>\n\t\t\t\twithTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(\n\t\t\t\t\tEffect.withSpan('devstack.plugin.account.signAndExecute', {\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t[AccountSpans.name]: accountName,\n\t\t\t\t\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\twithTransactionSigner,\n\t\t\tsignTransaction: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t\tsignPersonalMessage: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t};\n\t}\n\n\t// Both real-keypair and bring-your-own-signer paths satisfy the\n\t// minimal `signTransaction` / `signPersonalMessage` shape (the\n\t// SDK's `Signer` and the BYO `signer` declaration agree on it).\n\tconst signer = resolved.signer as Pick<Signer, 'signTransaction' | 'signPersonalMessage'>;\n\n\tconst unlockedSignTransaction: AccountTransactionSigner['signTransaction'] = (tx) =>\n\t\tsignWith(signer, tx, accountName, resolved.address);\n\n\tconst unlockedSignAndExecute: AccountTransactionSigner['signAndExecute'] = (tx) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst signed: SignatureWithBytes = yield* unlockedSignTransaction(tx);\n\t\t\tconst raw = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\tsui.sdk.core.executeTransaction({\n\t\t\t\t\t\ttransaction: tx,\n\t\t\t\t\t\tsignatures: [signed.signature],\n\t\t\t\t\t\tinclude: { effects: true, objectTypes: true },\n\t\t\t\t\t}),\n\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\taccountSignError({\n\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\taccountName,\n\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\tmessage: `Account '${accountName}': executeTransaction transport failed.`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t});\n\t\t\tconst digest = extractExecuteDigest(raw);\n\t\t\tif (digest !== undefined) {\n\t\t\t\tyield* Effect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tsui.sdk.core.waitForTransaction({\n\t\t\t\t\t\t\tdigest,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'await-finality',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': waitForTransaction(${digest}) failed.`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn yield* projectTxResult(raw, accountName, resolved.address);\n\t\t});\n\n\tconst transactionSigner: AccountTransactionSigner = {\n\t\tsignTransaction: unlockedSignTransaction,\n\t\tsignAndExecute: unlockedSignAndExecute,\n\t};\n\n\tconst withTransactionSigner: AccountValue['withTransactionSigner'] = (body) =>\n\t\twithAddressLease(\n\t\t\tbroker,\n\t\t\taccountName,\n\t\t\tresolved.address,\n\t\t\tEffect.gen(function* () {\n\t\t\t\treturn yield* body(transactionSigner);\n\t\t\t}),\n\t\t).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.transactionSigner', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[AccountSpans.name]: accountName,\n\t\t\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\tconst signTransaction: AccountValue['signTransaction'] = (tx) =>\n\t\twithTransactionSigner((locked) => locked.signTransaction(tx)).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signTransaction', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[AccountSpans.name]: accountName,\n\t\t\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\tconst signPersonalMessage: AccountValue['signPersonalMessage'] = (msg) =>\n\t\twithAddressLease(\n\t\t\tbroker,\n\t\t\taccountName,\n\t\t\tresolved.address,\n\t\t\tsignPersonalWith(signer, msg, accountName, resolved.address),\n\t\t).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signPersonalMessage', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[AccountSpans.name]: accountName,\n\t\t\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\tconst signAndExecute: AccountValue['signAndExecute'] = (tx) =>\n\t\twithTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signAndExecute', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[AccountSpans.name]: accountName,\n\t\t\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\treturn { signAndExecute, withTransactionSigner, signTransaction, signPersonalMessage };\n};\n\n// -----------------------------------------------------------------------------\n// Acquire orchestration\n// -----------------------------------------------------------------------------\n\n/** Acquire an account. Coordinates variant dispatch + funding +\n * the resolved-value projection. */\nexport const acquireAccount = (\n\topts: ResolvedAccountOptions,\n\tctx: AccountAcquireContext,\n): Effect.Effect<AccountValue, AccountAcquireError, StrategyRegistryService | LeaseBrokerService> =>\n\tEffect.gen(function* () {\n\t\tyield* validateAccountName(opts.name);\n\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t[AccountSpans.name]: opts.name,\n\t\t\t[AccountSpans.variant]: opts.kind,\n\t\t\t[SuiSpans.mode]: ctx.sui.mode,\n\t\t});\n\n\t\t// --- variant dispatch ----------------------------------------\n\t\tconst resolved = yield* resolveVariant(opts, ctx);\n\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t[AccountSpans.address]: resolved.address,\n\t\t\t[AccountSpans.scheme]: resolved.scheme,\n\t\t});\n\n\t\t// --- lease broker handle (captured once; both funding and the\n\t\t// resolved-value closures share this handle so concurrent\n\t\t// callers serialize through the substrate broker's per-key\n\t\t// FIFO queue) -------------------------------------------\n\t\tconst broker = yield* LeaseBrokerService;\n\t\tconst balanceReader = makeFundingBalanceReader(ctx.sui.sdk, ctx.sui.mode === 'fork');\n\n\t\tconst defaultFunding: ProjectedFundingEntry | null =\n\t\t\topts.kind === 'ephemeral' && opts.funding === undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcoin: 'SUI',\n\t\t\t\t\t\tfullCoinType: SUI_FULL_COIN_TYPE,\n\t\t\t\t\t\tamount: DEFAULT_EPHEMERAL_FUND_MIST,\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\tconst requestedFunding =\n\t\t\tdefaultFunding === null\n\t\t\t\t? (ctx.projectedFunding ?? [])\n\t\t\t\t: [defaultFunding, ...(ctx.projectedFunding ?? [])];\n\t\tconst appliedDefaultFunding: AppliedFundingEntry[] = [];\n\n\t\t// --- default funding (bare ephemeral only) -------------------\n\t\tif (defaultFunding !== null) {\n\t\t\t// Outcome distinguishes a real faucet call (`'funded'`) from\n\t\t\t// the pre-existing-balance short-circuit (`'already-satisfied'`),\n\t\t\t// so the registry projection doesn't mislabel a no-faucet-call\n\t\t\t// entry as funded. `'skipped'` (zero amount) drops out entirely\n\t\t\t// per the same invariant as the cross-cutting pass.\n\t\t\tconst outcome = yield* fundEphemeralDefault({\n\t\t\t\taccountName: opts.name,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tamountMist: defaultFunding.amount,\n\t\t\t\tsuiMode: ctx.sui.mode,\n\t\t\t\tchainId: ctx.sui.chain,\n\t\t\t\temitAutoPromotionEvent: ctx.emitAutoPromotionEvent,\n\t\t\t\tbroker,\n\t\t\t\tbalanceReader,\n\t\t\t});\n\t\t\tif (outcome !== 'skipped') {\n\t\t\t\tappliedDefaultFunding.push({ ...defaultFunding, outcome });\n\t\t\t}\n\t\t}\n\n\t\tconst source: AccountValue['source'] = opts.kind === 'impersonate' ? 'impersonate' : 'real';\n\t\tconst closures = buildClosures({\n\t\t\taccountName: opts.name,\n\t\t\tresolved,\n\t\t\tsui: ctx.sui,\n\t\t\tbroker,\n\t\t\tsource,\n\t\t});\n\n\t\t// --- project the resolved value ------------------------------\n\t\tconst value: AccountValue = {\n\t\t\tname: opts.name,\n\t\t\taddress: resolved.address,\n\t\t\tscheme: resolved.scheme,\n\t\t\tpublicKey: resolved.publicKey,\n\t\t\tsource,\n\t\t\tfunding: {\n\t\t\t\trequested: requestedFunding,\n\t\t\t\tapplied: appliedDefaultFunding,\n\t\t\t},\n\t\t\t...closures,\n\t\t};\n\n\t\t// --- cross-cutting funding (all variants) --------------------\n\t\t//\n\t\t// The barrel pre-projects each user-supplied `CoinMember` to\n\t\t// `{fullCoinType, amount}` from resolved dependencies so this\n\t\t// dispatch stays substrate-name-blind. The resolved account\n\t\t// handle is passed so strategy providers without admin\n\t\t// capabilities can sign account-owned funding swaps. Missing /\n\t\t// empty `projectedFunding` is a no-op (matches the \"Optional\n\t\t// Faucet is a noop\" invariant).\n\t\tconst projected = ctx.projectedFunding ?? [];\n\t\tlet appliedCrossCuttingFunding: AppliedFunding = [];\n\t\tif (projected.length > 0) {\n\t\t\tappliedCrossCuttingFunding = yield* applyCrossCuttingFunding({\n\t\t\t\taccountName: opts.name,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tvariant: opts.kind,\n\t\t\t\taccount: value,\n\t\t\t\tfunding: projected,\n\t\t\t\tchainId: ctx.sui.chain,\n\t\t\t\tbroker,\n\t\t\t\tbalanceReader,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\t...value,\n\t\t\tfunding: {\n\t\t\t\trequested: requestedFunding,\n\t\t\t\tapplied: [...appliedDefaultFunding, ...appliedCrossCuttingFunding],\n\t\t\t},\n\t\t};\n\t});\n"],"mappings":"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"}
|
|
@@ -2,12 +2,9 @@ import { Effect } from "effect";
|
|
|
2
2
|
//#region src/plugins/account/snapshot.ts
|
|
3
3
|
/** Build the Snapshotable contribution for a resolved variant.
|
|
4
4
|
*
|
|
5
|
-
* Only the `ephemeral` variant declares a persisted subtree
|
|
6
|
-
*
|
|
7
|
-
* open question) would target a single path; today's "wipe whole
|
|
8
|
-
* stack" recipe doesn't need this granularity but the seam is here. */
|
|
5
|
+
* Only the `ephemeral` variant declares a persisted subtree, scoped
|
|
6
|
+
* to a single account's key path. */
|
|
9
7
|
const makeAccountSnapshotable = (parts) => {
|
|
10
|
-
parts.app, parts.stack, parts.accountName;
|
|
11
8
|
if (parts.variant !== "ephemeral") return {
|
|
12
9
|
kind: "snapshotable",
|
|
13
10
|
subtrees: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../src/plugins/account/snapshot.ts"],"sourcesContent":["// Account plugin — Snapshotable contribution.\n//\n// Architecture §3 + 12-account.md \"Cross-component references\":\n// Account's persisted secret material lives under the runtime tree\n// at `runtime/account/<name>.key` (bech32 secret, 0o600 inside a\n// 0o700 parent). The runtime-rooted tar already captures this via\n// the substrate's auto-included subtree convention — Account just\n// declares the SECRET-MATERIAL flag so the substrate preserves the\n// permissions bits on round-trip.\n//\n// Distilled-doc invariant (\"Restrictive file permissions\"): the\n// 0o600 / 0o700 mode bits are load-bearing. The `secretMaterial:\n// true` flag drives the substrate's mode-bit preservation;\n// re-tightening on warm-start is the runtime's job (snapshot only\n// captures + restores).\n//\n// Variants that do NOT persist secret material (`keystore`, `env`,\n// `inline`, `signer`, `impersonate`) emit an EMPTY snapshot decl\n// with `missingTolerance: 'fine'` so cross-variant restores are\n// clean no-ops.\n\nimport { Effect } from 'effect';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../src/plugins/account/snapshot.ts"],"sourcesContent":["// Account plugin — Snapshotable contribution.\n//\n// Architecture §3 + 12-account.md \"Cross-component references\":\n// Account's persisted secret material lives under the runtime tree\n// at `runtime/account/<name>.key` (bech32 secret, 0o600 inside a\n// 0o700 parent). The runtime-rooted tar already captures this via\n// the substrate's auto-included subtree convention — Account just\n// declares the SECRET-MATERIAL flag so the substrate preserves the\n// permissions bits on round-trip.\n//\n// Distilled-doc invariant (\"Restrictive file permissions\"): the\n// 0o600 / 0o700 mode bits are load-bearing. The `secretMaterial:\n// true` flag drives the substrate's mode-bit preservation;\n// re-tightening on warm-start is the runtime's job (snapshot only\n// captures + restores).\n//\n// Variants that do NOT persist secret material (`keystore`, `env`,\n// `inline`, `signer`, `impersonate`) emit an EMPTY snapshot decl\n// with `missingTolerance: 'fine'` so cross-variant restores are\n// clean no-ops.\n\nimport { Effect } from 'effect';\n\nimport type { SnapshotableDecl } from '../../contracts/snapshotable.ts';\nimport type { AccountVariantKind } from './errors.ts';\n\n/** Build the Snapshotable contribution for a resolved variant.\n *\n * Only the `ephemeral` variant declares a persisted subtree, scoped\n * to a single account's key path. */\nexport const makeAccountSnapshotable = (parts: {\n\treadonly accountName: string;\n\treadonly variant: AccountVariantKind;\n\treadonly app: string;\n\treadonly stack: string;\n}): SnapshotableDecl => {\n\tif (parts.variant !== 'ephemeral') {\n\t\treturn {\n\t\t\tkind: 'snapshotable',\n\t\t\tsubtrees: [],\n\t\t\tmissingTolerance: 'fine',\n\t\t};\n\t}\n\n\treturn {\n\t\tkind: 'snapshotable',\n\t\t// Per-account secret file under the runtime tree. The\n\t\t// substrate's runtime-tar already covers `runtime/account/`\n\t\t// inclusively; this opt-in extra is symmetric with Sui's\n\t\t// `sui-fork/` subtree declaration.\n\t\tsubtrees: [`account/${parts.accountName}.key`],\n\t\tmissingTolerance: 'fine',\n\t\tsecretMaterial: true,\n\t\t// Pre-restore identity guard: assert the snapshot was taken\n\t\t// under the same `(app, stack, name)` triplet. The substrate's\n\t\t// identity walker reads this opaquely.\n\t\tpreRestore: Effect.succeed({\n\t\t\tkind: 'account-secret',\n\t\t\taccount: parts.accountName,\n\t\t\tapp: parts.app,\n\t\t\tstack: parts.stack,\n\t\t}),\n\t\tpostRestore: Effect.void,\n\t};\n};\n"],"mappings":";;;;;;AA8BA,MAAa,2BAA2B,UAKhB;AACvB,KAAI,MAAM,YAAY,YACrB,QAAO;EACN,MAAM;EACN,UAAU,EAAE;EACZ,kBAAkB;EAClB;AAGF,QAAO;EACN,MAAM;EAKN,UAAU,CAAC,WAAW,MAAM,YAAY,MAAM;EAC9C,kBAAkB;EAClB,gBAAgB;EAIhB,YAAY,OAAO,QAAQ;GAC1B,MAAM;GACN,SAAS,MAAM;GACf,KAAK,MAAM;GACX,OAAO,MAAM;GACb,CAAC;EACF,aAAa,OAAO;EACpB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/plugins/account/spans.ts
|
|
2
|
+
const AccountSpans = {
|
|
3
|
+
address: "account.address",
|
|
4
|
+
fundAmountMist: "fund.amount.mist",
|
|
5
|
+
fundCrossCuttingCount: "fund.cross-cutting.count",
|
|
6
|
+
fundCrossCuttingEntries: "fund.cross-cutting.entries",
|
|
7
|
+
fundingFrom: "account.funding.from",
|
|
8
|
+
fundingTo: "account.funding.to",
|
|
9
|
+
name: "account.name",
|
|
10
|
+
scheme: "account.scheme",
|
|
11
|
+
variant: "account.variant"
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { AccountSpans };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=spans.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.mjs","names":[],"sources":["../../../src/plugins/account/spans.ts"],"sourcesContent":["// Account 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({ [AccountSpans.name]:\n// value })`. Free-form string literals are a STYLE_GUIDE §16 violation.\n\nexport const AccountSpans = {\n\taddress: 'account.address',\n\tfundAmountMist: 'fund.amount.mist',\n\tfundCrossCuttingCount: 'fund.cross-cutting.count',\n\tfundCrossCuttingEntries: 'fund.cross-cutting.entries',\n\tfundingFrom: 'account.funding.from',\n\tfundingTo: 'account.funding.to',\n\tname: 'account.name',\n\tscheme: 'account.scheme',\n\tvariant: 'account.variant',\n} as const;\n"],"mappings":";AAOA,MAAa,eAAe;CAC3B,SAAS;CACT,gBAAgB;CAChB,uBAAuB;CACvB,yBAAyB;CACzB,aAAa;CACb,WAAW;CACX,MAAM;CACN,QAAQ;CACR,SAAS;CACT"}
|
|
@@ -29,11 +29,10 @@ const resolveKeystoreVariant = (args) => Effect.gen(function* () {
|
|
|
29
29
|
phase: "load-keystore",
|
|
30
30
|
accountName: args.name,
|
|
31
31
|
variant: "keystore",
|
|
32
|
-
message: issue.message === "failed to parse JSON" ? `Account '${args.name}': keystore at '${args.path}' is not valid JSON.` : `Account '${args.name}': keystore at '${args.path}' did not match the expected schema (array of bech32 strings)
|
|
33
|
-
cause: issue.cause
|
|
32
|
+
message: issue.message === "failed to parse JSON" ? `Account '${args.name}': keystore at '${args.path}' is not valid JSON.` : `Account '${args.name}': keystore at '${args.path}' did not match the expected schema (array of bech32 strings).`
|
|
34
33
|
})
|
|
35
34
|
});
|
|
36
|
-
const aliasIdx = yield* resolveAliasIndex(`${args.path.replace(/\.keystore$/, "")}.aliases`, args.aliasOrAddress).pipe(Effect.orElseSucceed(() => -1));
|
|
35
|
+
const aliasIdx = yield* resolveAliasIndex(`${args.path.replace(/\.keystore$/, "")}.aliases`, args.aliasOrAddress, args.name).pipe(Effect.orElseSucceed(() => -1));
|
|
37
36
|
if (aliasIdx >= 0 && aliasIdx < rows.length) {
|
|
38
37
|
const bech32 = rows[aliasIdx];
|
|
39
38
|
return yield* decodeBech32Secret(bech32, args.name, "keystore");
|
|
@@ -51,12 +50,12 @@ const resolveKeystoreVariant = (args) => Effect.gen(function* () {
|
|
|
51
50
|
hint: "Check the sibling sui.aliases file for the alias spelling, or pass the on-chain address (0x-prefixed) directly."
|
|
52
51
|
}));
|
|
53
52
|
});
|
|
54
|
-
const resolveAliasIndex = (aliasesPath, want) => Effect.gen(function* () {
|
|
53
|
+
const resolveAliasIndex = (aliasesPath, want, accountName) => Effect.gen(function* () {
|
|
55
54
|
return (yield* decodeJsonText(AliasesShape, yield* Effect.tryPromise({
|
|
56
55
|
try: () => promises.readFile(aliasesPath, "utf-8"),
|
|
57
56
|
catch: (cause) => accountAcquireError({
|
|
58
57
|
phase: "load-keystore",
|
|
59
|
-
accountName
|
|
58
|
+
accountName,
|
|
60
59
|
variant: "keystore",
|
|
61
60
|
message: `aliases file '${aliasesPath}' missing or unreadable`,
|
|
62
61
|
cause
|
|
@@ -65,10 +64,9 @@ const resolveAliasIndex = (aliasesPath, want) => Effect.gen(function* () {
|
|
|
65
64
|
source: aliasesPath,
|
|
66
65
|
mkError: (issue) => accountAcquireError({
|
|
67
66
|
phase: "load-keystore",
|
|
68
|
-
accountName
|
|
67
|
+
accountName,
|
|
69
68
|
variant: "keystore",
|
|
70
|
-
message: issue.message === "failed to parse JSON" ? `aliases file '${aliasesPath}' is not valid JSON` : `aliases file '${aliasesPath}' did not match the expected schema
|
|
71
|
-
cause: issue.cause
|
|
69
|
+
message: issue.message === "failed to parse JSON" ? `aliases file '${aliasesPath}' is not valid JSON` : `aliases file '${aliasesPath}' did not match the expected schema`
|
|
72
70
|
})
|
|
73
71
|
})).findIndex((row) => row.alias === want);
|
|
74
72
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keystore.mjs","names":["fs"],"sources":["../../../../src/plugins/account/variants/keystore.ts"],"sourcesContent":["// Account variant — keystore (read from Sui CLI keystore file).\n//\n// Distilled-doc surface: read a `suiprivkey1...` entry by alias or\n// by address from a CLI-shape keystore file. Devstack NEVER copies\n// the keystore — only reads. Persistence stays with the user's\n// CLI tooling.\n//\n// Keystore file shape (canonical sui-cli output):\n// `<path>` — a JSON array of bech32 `suiprivkey1...` strings\n// `<path>.aliases` — a sibling JSON array of `{alias, public_key_base64}`\n// entries; the array's index matches the keystore.\n//\n// Lookup precedence: alias match first (case-sensitive), then by-address\n// match (the resolver decodes each bech32 row, derives the address,\n// and compares). The address path is intentionally O(n) — keystores\n// are small and the alternative is a side-table the CLI doesn't\n// maintain.\n\nimport { Effect, Schema } from 'effect';\nimport { promises as fs } from 'node:fs';\n\nimport { decodeJsonText } from '../../../substrate/runtime/runtime-decode.ts';\nimport { accountAcquireError, type AccountAcquireError } from '../errors.ts';\nimport { decodeBech32Secret, type ResolvedKeypair } from '../keypair.ts';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nexport interface KeystoreVariantArgs {\n\treadonly name: string;\n\t/** Absolute path to the keystore file. Defaults at the factory\n\t * boundary to `~/.sui/sui_config/sui.keystore`. */\n\treadonly path: string;\n\t/** Alias name (from the sibling `sui.aliases` file) OR the\n\t * on-chain address — the resolver tries alias first, then a\n\t * by-address lookup. */\n\treadonly aliasOrAddress: string;\n}\n\nconst AliasesShape = Schema.Array(\n\tSchema.Struct({\n\t\talias: Schema.String,\n\t\t// Optional because some CLI versions omit it for newer rows;\n\t\t// we only need the alias for the alias-path.\n\t\tpublic_key_base64: Schema.optional(Schema.String),\n\t}),\n);\n\nconst KeystoreShape = Schema.Array(Schema.String);\n\n/** Resolve the keystore variant. */\nexport const resolveKeystoreVariant = (\n\targs: KeystoreVariantArgs,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> =>\n\tEffect.gen(function* () {\n\t\t// --- read + parse the keystore ----------------------------------\n\t\tconst raw = yield* Effect.tryPromise({\n\t\t\ttry: () => fs.readFile(args.path, 'utf-8'),\n\t\t\tcatch: (cause): AccountAcquireError =>\n\t\t\t\taccountAcquireError({\n\t\t\t\t\tphase: 'load-keystore',\n\t\t\t\t\taccountName: args.name,\n\t\t\t\t\tvariant: 'keystore',\n\t\t\t\t\tmessage: `Account '${args.name}': failed to read keystore at '${args.path}'.`,\n\t\t\t\t\thint: 'Verify the path exists and is readable. The Sui CLI default is `~/.sui/sui_config/sui.keystore`.',\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tconst rows = yield* decodeJsonText(KeystoreShape, raw, {\n\t\t\tsource: args.path,\n\t\t\tmkError: (issue): AccountAcquireError =>\n\t\t\t\taccountAcquireError({\n\t\t\t\t\tphase: 'load-keystore',\n\t\t\t\t\taccountName: args.name,\n\t\t\t\t\tvariant: 'keystore',\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tissue.message === 'failed to parse JSON'\n\t\t\t\t\t\t\t? `Account '${args.name}': keystore at '${args.path}' is not valid JSON.`\n\t\t\t\t\t\t\t: `Account '${args.name}': keystore at '${args.path}' did not match the expected schema (array of bech32 strings).`,\n\t\t\t\t
|
|
1
|
+
{"version":3,"file":"keystore.mjs","names":["fs"],"sources":["../../../../src/plugins/account/variants/keystore.ts"],"sourcesContent":["// Account variant — keystore (read from Sui CLI keystore file).\n//\n// Distilled-doc surface: read a `suiprivkey1...` entry by alias or\n// by address from a CLI-shape keystore file. Devstack NEVER copies\n// the keystore — only reads. Persistence stays with the user's\n// CLI tooling.\n//\n// Keystore file shape (canonical sui-cli output):\n// `<path>` — a JSON array of bech32 `suiprivkey1...` strings\n// `<path>.aliases` — a sibling JSON array of `{alias, public_key_base64}`\n// entries; the array's index matches the keystore.\n//\n// Lookup precedence: alias match first (case-sensitive), then by-address\n// match (the resolver decodes each bech32 row, derives the address,\n// and compares). The address path is intentionally O(n) — keystores\n// are small and the alternative is a side-table the CLI doesn't\n// maintain.\n\nimport { Effect, Schema } from 'effect';\nimport { promises as fs } from 'node:fs';\n\nimport { decodeJsonText } from '../../../substrate/runtime/runtime-decode.ts';\nimport { accountAcquireError, type AccountAcquireError } from '../errors.ts';\nimport { decodeBech32Secret, type ResolvedKeypair } from '../keypair.ts';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nexport interface KeystoreVariantArgs {\n\treadonly name: string;\n\t/** Absolute path to the keystore file. Defaults at the factory\n\t * boundary to `~/.sui/sui_config/sui.keystore`. */\n\treadonly path: string;\n\t/** Alias name (from the sibling `sui.aliases` file) OR the\n\t * on-chain address — the resolver tries alias first, then a\n\t * by-address lookup. */\n\treadonly aliasOrAddress: string;\n}\n\nconst AliasesShape = Schema.Array(\n\tSchema.Struct({\n\t\talias: Schema.String,\n\t\t// Optional because some CLI versions omit it for newer rows;\n\t\t// we only need the alias for the alias-path.\n\t\tpublic_key_base64: Schema.optional(Schema.String),\n\t}),\n);\n\nconst KeystoreShape = Schema.Array(Schema.String);\n\n/** Resolve the keystore variant. */\nexport const resolveKeystoreVariant = (\n\targs: KeystoreVariantArgs,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> =>\n\tEffect.gen(function* () {\n\t\t// --- read + parse the keystore ----------------------------------\n\t\tconst raw = yield* Effect.tryPromise({\n\t\t\ttry: () => fs.readFile(args.path, 'utf-8'),\n\t\t\tcatch: (cause): AccountAcquireError =>\n\t\t\t\taccountAcquireError({\n\t\t\t\t\tphase: 'load-keystore',\n\t\t\t\t\taccountName: args.name,\n\t\t\t\t\tvariant: 'keystore',\n\t\t\t\t\tmessage: `Account '${args.name}': failed to read keystore at '${args.path}'.`,\n\t\t\t\t\thint: 'Verify the path exists and is readable. The Sui CLI default is `~/.sui/sui_config/sui.keystore`.',\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tconst rows = yield* decodeJsonText(KeystoreShape, raw, {\n\t\t\tsource: args.path,\n\t\t\t// Secret-leak guard: the keystore file IS an array of\n\t\t\t// `suiprivkey1...` private keys, so a malformed-array\n\t\t\t// `ParseError` renders the offending secret rows into its\n\t\t\t// message/tree. We deliberately DROP the raw `cause`; the typed\n\t\t\t// `message` already distinguishes \"not valid JSON\" from a schema\n\t\t\t// mismatch, which is the only actionable diagnostic here.\n\t\t\t// (Mirrors the `decodeBech32Secret` guard in `../keypair.ts`.)\n\t\t\tmkError: (issue): AccountAcquireError =>\n\t\t\t\taccountAcquireError({\n\t\t\t\t\tphase: 'load-keystore',\n\t\t\t\t\taccountName: args.name,\n\t\t\t\t\tvariant: 'keystore',\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tissue.message === 'failed to parse JSON'\n\t\t\t\t\t\t\t? `Account '${args.name}': keystore at '${args.path}' is not valid JSON.`\n\t\t\t\t\t\t\t: `Account '${args.name}': keystore at '${args.path}' did not match the expected schema (array of bech32 strings).`,\n\t\t\t\t}),\n\t\t});\n\n\t\t// --- alias path -------------------------------------------------\n\t\t// Best-effort: missing aliases file is not fatal — fall through\n\t\t// to the by-address path.\n\t\tconst aliasesPath = `${args.path.replace(/\\.keystore$/, '')}.aliases`;\n\t\tconst aliasIdx = yield* resolveAliasIndex(aliasesPath, args.aliasOrAddress, args.name).pipe(\n\t\t\tEffect.orElseSucceed(() => -1),\n\t\t);\n\t\tif (aliasIdx >= 0 && aliasIdx < rows.length) {\n\t\t\tconst bech32 = rows[aliasIdx]!;\n\t\t\treturn yield* decodeBech32Secret(bech32, args.name, 'keystore');\n\t\t}\n\n\t\t// --- by-address path -------------------------------------------\n\t\t// Normalize the lookup key to a lowercased 0x-prefixed string so\n\t\t// comparisons match regardless of caller casing.\n\t\tconst wantAddr = normalizeAddress(args.aliasOrAddress);\n\t\tfor (const bech32 of rows) {\n\t\t\tconst addr = yield* tryDeriveAddress(bech32).pipe(Effect.orElseSucceed(() => null));\n\t\t\tif (addr !== null && normalizeAddress(addr) === wantAddr) {\n\t\t\t\treturn yield* decodeBech32Secret(bech32, args.name, 'keystore');\n\t\t\t}\n\t\t}\n\n\t\treturn yield* Effect.fail(\n\t\t\taccountAcquireError({\n\t\t\t\tphase: 'load-keystore',\n\t\t\t\taccountName: args.name,\n\t\t\t\tvariant: 'keystore',\n\t\t\t\tmessage: `Account '${args.name}': keystore at '${args.path}' has no entry matching alias-or-address '${args.aliasOrAddress}'.`,\n\t\t\t\thint: 'Check the sibling sui.aliases file for the alias spelling, or pass the on-chain address (0x-prefixed) directly.',\n\t\t\t}),\n\t\t);\n\t});\n\nconst resolveAliasIndex = (\n\taliasesPath: string,\n\twant: string,\n\taccountName: string,\n): Effect.Effect<number, AccountAcquireError> =>\n\tEffect.gen(function* () {\n\t\tconst raw = yield* Effect.tryPromise({\n\t\t\ttry: () => fs.readFile(aliasesPath, 'utf-8'),\n\t\t\tcatch: (cause): AccountAcquireError =>\n\t\t\t\taccountAcquireError({\n\t\t\t\t\tphase: 'load-keystore',\n\t\t\t\t\taccountName,\n\t\t\t\t\tvariant: 'keystore',\n\t\t\t\t\tmessage: `aliases file '${aliasesPath}' missing or unreadable`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tconst aliases = yield* decodeJsonText(AliasesShape, raw, {\n\t\t\tsource: aliasesPath,\n\t\t\t// Secret-leak guard: drop the raw `cause`. The aliases file holds\n\t\t\t// public keys rather than secrets, but a malformed-array\n\t\t\t// `ParseError` embeds whatever rows the file contained, and the\n\t\t\t// resolver is pointed at a sibling of the secret keystore — so we\n\t\t\t// keep the same scrub the keystore-array path uses above. The\n\t\t\t// typed `message` already names the only actionable distinction.\n\t\t\tmkError: (issue): AccountAcquireError =>\n\t\t\t\taccountAcquireError({\n\t\t\t\t\tphase: 'load-keystore',\n\t\t\t\t\taccountName,\n\t\t\t\t\tvariant: 'keystore',\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tissue.message === 'failed to parse JSON'\n\t\t\t\t\t\t\t? `aliases file '${aliasesPath}' is not valid JSON`\n\t\t\t\t\t\t\t: `aliases file '${aliasesPath}' did not match the expected schema`,\n\t\t\t\t}),\n\t\t});\n\t\treturn aliases.findIndex((row) => row.alias === want);\n\t});\n\n/** Derive the on-chain address from a bech32 secret without\n * surfacing a typed error — used by the by-address scan, which\n * swallows per-row failures and moves on. */\nconst tryDeriveAddress = (bech32: string): Effect.Effect<string, Error> =>\n\tEffect.try({\n\t\ttry: () => {\n\t\t\tconst parsed = decodeSuiPrivateKey(bech32);\n\t\t\tif (parsed.scheme !== 'ED25519') {\n\t\t\t\tthrow new Error(`scheme ${parsed.scheme} not yet derivable here`);\n\t\t\t}\n\t\t\treturn Ed25519Keypair.fromSecretKey(parsed.secretKey).toSuiAddress();\n\t\t},\n\t\tcatch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n\t});\n\nconst normalizeAddress = (addr: string): string => {\n\tconst lower = addr.toLowerCase();\n\treturn lower.startsWith('0x') ? lower : `0x${lower}`;\n};\n"],"mappings":";;;;;;;;AAsCA,MAAM,eAAe,OAAO,MAC3B,OAAO,OAAO;CACb,OAAO,OAAO;CAGd,mBAAmB,OAAO,SAAS,OAAO,OAAO;CACjD,CAAC,CACF;AAED,MAAM,gBAAgB,OAAO,MAAM,OAAO,OAAO;;AAGjD,MAAa,0BACZ,SAEA,OAAO,IAAI,aAAa;CAcvB,MAAM,OAAO,OAAO,eAAe,eAAe,OAZ/B,OAAO,WAAW;EACpC,WAAWA,SAAG,SAAS,KAAK,MAAM,QAAQ;EAC1C,QAAQ,UACP,oBAAoB;GACnB,OAAO;GACP,aAAa,KAAK;GAClB,SAAS;GACT,SAAS,YAAY,KAAK,KAAK,iCAAiC,KAAK,KAAK;GAC1E,MAAM;GACN;GACA,CAAC;EACH,CAAC,EACqD;EACtD,QAAQ,KAAK;EAQb,UAAU,UACT,oBAAoB;GACnB,OAAO;GACP,aAAa,KAAK;GAClB,SAAS;GACT,SACC,MAAM,YAAY,yBACf,YAAY,KAAK,KAAK,kBAAkB,KAAK,KAAK,wBAClD,YAAY,KAAK,KAAK,kBAAkB,KAAK,KAAK;GACtD,CAAC;EACH,CAAC;CAMF,MAAM,WAAW,OAAO,kBAAkB,GADnB,KAAK,KAAK,QAAQ,eAAe,GAAG,CAAC,WACL,KAAK,gBAAgB,KAAK,KAAK,CAAC,KACtF,OAAO,oBAAoB,GAAG,CAC9B;AACD,KAAI,YAAY,KAAK,WAAW,KAAK,QAAQ;EAC5C,MAAM,SAAS,KAAK;AACpB,SAAO,OAAO,mBAAmB,QAAQ,KAAK,MAAM,WAAW;;CAMhE,MAAM,WAAW,iBAAiB,KAAK,eAAe;AACtD,MAAK,MAAM,UAAU,MAAM;EAC1B,MAAM,OAAO,OAAO,iBAAiB,OAAO,CAAC,KAAK,OAAO,oBAAoB,KAAK,CAAC;AACnF,MAAI,SAAS,QAAQ,iBAAiB,KAAK,KAAK,SAC/C,QAAO,OAAO,mBAAmB,QAAQ,KAAK,MAAM,WAAW;;AAIjE,QAAO,OAAO,OAAO,KACpB,oBAAoB;EACnB,OAAO;EACP,aAAa,KAAK;EAClB,SAAS;EACT,SAAS,YAAY,KAAK,KAAK,kBAAkB,KAAK,KAAK,4CAA4C,KAAK,eAAe;EAC3H,MAAM;EACN,CAAC,CACF;EACA;AAEH,MAAM,qBACL,aACA,MACA,gBAEA,OAAO,IAAI,aAAa;AA+BvB,SAAO,OAnBgB,eAAe,cAAc,OAXjC,OAAO,WAAW;EACpC,WAAWA,SAAG,SAAS,aAAa,QAAQ;EAC5C,QAAQ,UACP,oBAAoB;GACnB,OAAO;GACP;GACA,SAAS;GACT,SAAS,iBAAiB,YAAY;GACtC;GACA,CAAC;EACH,CAAC,EACuD;EACxD,QAAQ;EAOR,UAAU,UACT,oBAAoB;GACnB,OAAO;GACP;GACA,SAAS;GACT,SACC,MAAM,YAAY,yBACf,iBAAiB,YAAY,uBAC7B,iBAAiB,YAAY;GACjC,CAAC;EACH,CAAC,EACa,WAAW,QAAQ,IAAI,UAAU,KAAK;EACpD;;;;AAKH,MAAM,oBAAoB,WACzB,OAAO,IAAI;CACV,WAAW;EACV,MAAM,SAAS,oBAAoB,OAAO;AAC1C,MAAI,OAAO,WAAW,UACrB,OAAM,IAAI,MAAM,UAAU,OAAO,OAAO,yBAAyB;AAElE,SAAO,eAAe,cAAc,OAAO,UAAU,CAAC,cAAc;;CAErE,QAAQ,UAAW,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;CAC5E,CAAC;AAEH,MAAM,oBAAoB,SAAyB;CAClD,MAAM,QAAQ,KAAK,aAAa;AAChC,QAAO,MAAM,WAAW,KAAK,GAAG,QAAQ,KAAK"}
|
|
@@ -20,8 +20,9 @@ import { Transaction } from "@mysten/sui/transactions";
|
|
|
20
20
|
* `ActionReceipt`. Folds the SDK boundary cast +
|
|
21
21
|
* `include: {effects, objectTypes}` execute + finality wait +
|
|
22
22
|
* envelope projection into a single call. Errors surface as
|
|
23
|
-
* `ActionError` (phase `sign` for
|
|
24
|
-
* `
|
|
23
|
+
* `ActionError` (phase `sign` for build / sign / submit transport
|
|
24
|
+
* failures; `execute-failed` for an on-chain `FailedTransaction`
|
|
25
|
+
* outcome). */
|
|
25
26
|
interface ActionBuildContext {
|
|
26
27
|
/** Resolved SuiClient. suiResource is part of action's hard upstream so
|
|
27
28
|
* this is always populated. */
|