@mysten-incubation/devstack 0.0.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/LICENSE +189 -0
- package/README.md +94 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/api/define-capabilities.d.mts +25 -0
- package/dist/api/define-capabilities.mjs +19 -0
- package/dist/api/define-capabilities.mjs.map +1 -0
- package/dist/api/define-devstack-with.d.mts +41 -0
- package/dist/api/define-devstack-with.mjs +24 -0
- package/dist/api/define-devstack-with.mjs.map +1 -0
- package/dist/api/define-devstack.d.mts +62 -0
- package/dist/api/define-devstack.mjs +108 -0
- package/dist/api/define-devstack.mjs.map +1 -0
- package/dist/api/define-plugin.d.mts +1 -0
- package/dist/api/inference-network.mjs +122 -0
- package/dist/api/inference-network.mjs.map +1 -0
- package/dist/api/mode-narrowed-factory.d.mts +26 -0
- package/dist/api/mode-narrowed-factory.mjs +8 -0
- package/dist/api/mode-narrowed-factory.mjs.map +1 -0
- package/dist/api/plugin-errors.mjs +10 -0
- package/dist/api/plugin-errors.mjs.map +1 -0
- package/dist/api/run-stack.d.mts +82 -0
- package/dist/api/run-stack.mjs +127 -0
- package/dist/api/run-stack.mjs.map +1 -0
- package/dist/build-integrations/playwright/config.d.mts +92 -0
- package/dist/build-integrations/playwright/config.mjs +71 -0
- package/dist/build-integrations/playwright/config.mjs.map +1 -0
- package/dist/build-integrations/playwright/errors.d.mts +82 -0
- package/dist/build-integrations/playwright/errors.mjs +43 -0
- package/dist/build-integrations/playwright/errors.mjs.map +1 -0
- package/dist/build-integrations/playwright/global-setup.d.mts +64 -0
- package/dist/build-integrations/playwright/global-setup.mjs +44 -0
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -0
- package/dist/build-integrations/playwright/index.d.mts +6 -0
- package/dist/build-integrations/playwright/index.mjs +6 -0
- package/dist/build-integrations/playwright/stack-context.d.mts +95 -0
- package/dist/build-integrations/playwright/stack-context.mjs +277 -0
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -0
- package/dist/build-integrations/playwright/wallet-context.d.mts +87 -0
- package/dist/build-integrations/playwright/wallet-context.mjs +148 -0
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -0
- package/dist/build-integrations/runtime/cold-start-url.d.mts +67 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs +56 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -0
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs +10 -0
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -0
- package/dist/build-integrations/runtime/discover.d.mts +78 -0
- package/dist/build-integrations/runtime/discover.mjs +124 -0
- package/dist/build-integrations/runtime/discover.mjs.map +1 -0
- package/dist/build-integrations/runtime/endpoint-registry.d.mts +26 -0
- package/dist/build-integrations/runtime/endpoint-registry.mjs +41 -0
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -0
- package/dist/build-integrations/runtime/errors.d.mts +64 -0
- package/dist/build-integrations/runtime/errors.mjs +51 -0
- package/dist/build-integrations/runtime/errors.mjs.map +1 -0
- package/dist/build-integrations/runtime/index.d.mts +7 -0
- package/dist/build-integrations/runtime/index.mjs +6 -0
- package/dist/build-integrations/runtime/read-stack-context.d.mts +38 -0
- package/dist/build-integrations/runtime/read-stack-context.mjs +130 -0
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -0
- package/dist/build-integrations/runtime/stack-context.d.mts +53 -0
- package/dist/build-integrations/vitest/config.d.mts +62 -0
- package/dist/build-integrations/vitest/config.mjs +80 -0
- package/dist/build-integrations/vitest/config.mjs.map +1 -0
- package/dist/build-integrations/vitest/env.d.mts +48 -0
- package/dist/build-integrations/vitest/env.mjs +50 -0
- package/dist/build-integrations/vitest/env.mjs.map +1 -0
- package/dist/build-integrations/vitest/errors.d.mts +44 -0
- package/dist/build-integrations/vitest/errors.mjs +18 -0
- package/dist/build-integrations/vitest/errors.mjs.map +1 -0
- package/dist/build-integrations/vitest/index.d.mts +6 -0
- package/dist/build-integrations/vitest/index.mjs +6 -0
- package/dist/build-integrations/vitest/setup.d.mts +53 -0
- package/dist/build-integrations/vitest/setup.mjs +56 -0
- package/dist/build-integrations/vitest/setup.mjs.map +1 -0
- package/dist/build-integrations/vitest/stack-context.d.mts +58 -0
- package/dist/build-integrations/vitest/stack-context.mjs +67 -0
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -0
- package/dist/cli/main.d.mts +5 -0
- package/dist/cli/main.mjs +586 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/prune-direct.mjs +216 -0
- package/dist/cli/prune-direct.mjs.map +1 -0
- package/dist/cli/snapshot-reader.mjs +73 -0
- package/dist/cli/snapshot-reader.mjs.map +1 -0
- package/dist/cli/up-lifecycle.mjs +28 -0
- package/dist/cli/up-lifecycle.mjs.map +1 -0
- package/dist/contracts/capability-decl.d.mts +42 -0
- package/dist/contracts/chain-probe.d.mts +26 -0
- package/dist/contracts/chain-probe.mjs +8 -0
- package/dist/contracts/chain-probe.mjs.map +1 -0
- package/dist/contracts/codegenable.d.mts +43 -0
- package/dist/contracts/container-runtime.d.mts +245 -0
- package/dist/contracts/liveness-classifier.d.mts +19 -0
- package/dist/contracts/network-resolver.d.mts +15 -0
- package/dist/contracts/network-resolver.mjs +7 -0
- package/dist/contracts/network-resolver.mjs.map +1 -0
- package/dist/contracts/projection.d.mts +15 -0
- package/dist/contracts/routable.d.mts +53 -0
- package/dist/contracts/snapshotable.d.mts +39 -0
- package/dist/contracts/strategy-contributor.d.mts +26 -0
- package/dist/index.d.mts +89 -0
- package/dist/index.mjs +37 -0
- package/dist/orchestrators/codegen/bindings.d.mts +2 -0
- package/dist/orchestrators/codegen/bindings.mjs +340 -0
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -0
- package/dist/orchestrators/codegen/emit.mjs +56 -0
- package/dist/orchestrators/codegen/emit.mjs.map +1 -0
- package/dist/orchestrators/codegen/errors.d.mts +1 -0
- package/dist/orchestrators/codegen/errors.mjs +66 -0
- package/dist/orchestrators/codegen/errors.mjs.map +1 -0
- package/dist/orchestrators/codegen/extras.mjs +16 -0
- package/dist/orchestrators/codegen/extras.mjs.map +1 -0
- package/dist/orchestrators/codegen/format.mjs +109 -0
- package/dist/orchestrators/codegen/format.mjs.map +1 -0
- package/dist/orchestrators/codegen/gitignore.mjs +67 -0
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -0
- package/dist/orchestrators/codegen/paths.d.mts +1 -0
- package/dist/orchestrators/codegen/paths.mjs +33 -0
- package/dist/orchestrators/codegen/paths.mjs.map +1 -0
- package/dist/orchestrators/codegen/permissions.mjs +6 -0
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -0
- package/dist/orchestrators/codegen/service.d.mts +1 -0
- package/dist/orchestrators/codegen/service.mjs +276 -0
- package/dist/orchestrators/codegen/service.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs +58 -0
- package/dist/orchestrators/router/cleanup.mjs.map +1 -0
- package/dist/orchestrators/router/cors.mjs +31 -0
- package/dist/orchestrators/router/cors.mjs.map +1 -0
- package/dist/orchestrators/router/entrypoints.d.mts +1 -0
- package/dist/orchestrators/router/entrypoints.mjs +80 -0
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -0
- package/dist/orchestrators/router/errors.d.mts +1 -0
- package/dist/orchestrators/router/errors.mjs +103 -0
- package/dist/orchestrators/router/errors.mjs.map +1 -0
- package/dist/orchestrators/router/file-provider.d.mts +1 -0
- package/dist/orchestrators/router/file-provider.mjs +320 -0
- package/dist/orchestrators/router/file-provider.mjs.map +1 -0
- package/dist/orchestrators/router/hostname.d.mts +1 -0
- package/dist/orchestrators/router/hostname.mjs +107 -0
- package/dist/orchestrators/router/hostname.mjs.map +1 -0
- package/dist/orchestrators/router/index.d.mts +1 -0
- package/dist/orchestrators/router/profile.d.mts +1 -0
- package/dist/orchestrators/router/profile.mjs +109 -0
- package/dist/orchestrators/router/profile.mjs.map +1 -0
- package/dist/orchestrators/router/service.d.mts +3 -0
- package/dist/orchestrators/router/service.mjs +421 -0
- package/dist/orchestrators/router/service.mjs.map +1 -0
- package/dist/orchestrators/router/traefik-container.d.mts +1 -0
- package/dist/orchestrators/router/traefik-container.mjs +229 -0
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -0
- package/dist/orchestrators/runtime-composition.d.mts +10 -0
- package/dist/orchestrators/runtime-composition.mjs +168 -0
- package/dist/orchestrators/runtime-composition.mjs.map +1 -0
- package/dist/orchestrators/snapshot/capture.d.mts +1 -0
- package/dist/orchestrators/snapshot/capture.mjs +350 -0
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -0
- package/dist/orchestrators/snapshot/descriptor.d.mts +1 -0
- package/dist/orchestrators/snapshot/descriptor.mjs +109 -0
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -0
- package/dist/orchestrators/snapshot/identity-guard.d.mts +1 -0
- package/dist/orchestrators/snapshot/identity-guard.mjs +132 -0
- package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -0
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs +207 -0
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -0
- package/dist/orchestrators/snapshot/index.d.mts +1 -0
- package/dist/orchestrators/snapshot/integrity.d.mts +1 -0
- package/dist/orchestrators/snapshot/integrity.mjs +74 -0
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -0
- package/dist/orchestrators/snapshot/prune.d.mts +1 -0
- package/dist/orchestrators/snapshot/prune.mjs +110 -0
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -0
- package/dist/orchestrators/snapshot/restore.d.mts +1 -0
- package/dist/orchestrators/snapshot/restore.mjs +404 -0
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -0
- package/dist/orchestrators/snapshot/service.d.mts +1 -0
- package/dist/orchestrators/snapshot/service.mjs +296 -0
- package/dist/orchestrators/snapshot/service.mjs.map +1 -0
- package/dist/orchestrators/snapshot/state-document.mjs +18 -0
- package/dist/orchestrators/snapshot/state-document.mjs.map +1 -0
- package/dist/orchestrators/snapshot/wipe.d.mts +1 -0
- package/dist/orchestrators/snapshot/wipe.mjs +59 -0
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -0
- package/dist/plugins/account/codegen.d.mts +12 -0
- package/dist/plugins/account/codegen.mjs +22 -0
- package/dist/plugins/account/codegen.mjs.map +1 -0
- package/dist/plugins/account/errors.d.mts +44 -0
- package/dist/plugins/account/errors.mjs +16 -0
- package/dist/plugins/account/errors.mjs.map +1 -0
- package/dist/plugins/account/funding.d.mts +94 -0
- package/dist/plugins/account/funding.mjs +199 -0
- package/dist/plugins/account/funding.mjs.map +1 -0
- package/dist/plugins/account/index.d.mts +54 -0
- package/dist/plugins/account/index.mjs +151 -0
- package/dist/plugins/account/index.mjs.map +1 -0
- package/dist/plugins/account/keypair.d.mts +32 -0
- package/dist/plugins/account/keypair.mjs +99 -0
- package/dist/plugins/account/keypair.mjs.map +1 -0
- package/dist/plugins/account/lease.mjs +21 -0
- package/dist/plugins/account/lease.mjs.map +1 -0
- package/dist/plugins/account/registry.d.mts +33 -0
- package/dist/plugins/account/registry.mjs +36 -0
- package/dist/plugins/account/registry.mjs.map +1 -0
- package/dist/plugins/account/service.d.mts +104 -0
- package/dist/plugins/account/service.mjs +405 -0
- package/dist/plugins/account/service.mjs.map +1 -0
- package/dist/plugins/account/snapshot.mjs +33 -0
- package/dist/plugins/account/snapshot.mjs.map +1 -0
- package/dist/plugins/account/variants/env.mjs +24 -0
- package/dist/plugins/account/variants/env.mjs.map +1 -0
- package/dist/plugins/account/variants/ephemeral.mjs +72 -0
- package/dist/plugins/account/variants/ephemeral.mjs.map +1 -0
- package/dist/plugins/account/variants/impersonate.d.mts +16 -0
- package/dist/plugins/account/variants/impersonate.mjs +48 -0
- package/dist/plugins/account/variants/impersonate.mjs.map +1 -0
- package/dist/plugins/account/variants/inline.mjs +13 -0
- package/dist/plugins/account/variants/inline.mjs.map +1 -0
- package/dist/plugins/account/variants/keystore.mjs +93 -0
- package/dist/plugins/account/variants/keystore.mjs.map +1 -0
- package/dist/plugins/account/variants/signer.mjs +31 -0
- package/dist/plugins/account/variants/signer.mjs.map +1 -0
- package/dist/plugins/action/build-context.d.mts +41 -0
- package/dist/plugins/action/discriminator.d.mts +20 -0
- package/dist/plugins/action/discriminator.mjs +13 -0
- package/dist/plugins/action/discriminator.mjs.map +1 -0
- package/dist/plugins/action/errors.d.mts +31 -0
- package/dist/plugins/action/errors.mjs +13 -0
- package/dist/plugins/action/errors.mjs.map +1 -0
- package/dist/plugins/action/execute.d.mts +2 -0
- package/dist/plugins/action/execute.mjs +145 -0
- package/dist/plugins/action/execute.mjs.map +1 -0
- package/dist/plugins/action/index.d.mts +56 -0
- package/dist/plugins/action/index.mjs +82 -0
- package/dist/plugins/action/index.mjs.map +1 -0
- package/dist/plugins/action/service.d.mts +26 -0
- package/dist/plugins/action/service.mjs +84 -0
- package/dist/plugins/action/service.mjs.map +1 -0
- package/dist/plugins/coin/address-resolution.d.mts +34 -0
- package/dist/plugins/coin/address-resolution.mjs +80 -0
- package/dist/plugins/coin/address-resolution.mjs.map +1 -0
- package/dist/plugins/coin/codegen.d.mts +16 -0
- package/dist/plugins/coin/codegen.mjs +21 -0
- package/dist/plugins/coin/codegen.mjs.map +1 -0
- package/dist/plugins/coin/discovery.d.mts +26 -0
- package/dist/plugins/coin/discovery.mjs +112 -0
- package/dist/plugins/coin/discovery.mjs.map +1 -0
- package/dist/plugins/coin/errors.d.mts +48 -0
- package/dist/plugins/coin/errors.mjs +13 -0
- package/dist/plugins/coin/errors.mjs.map +1 -0
- package/dist/plugins/coin/index.d.mts +95 -0
- package/dist/plugins/coin/index.mjs +172 -0
- package/dist/plugins/coin/index.mjs.map +1 -0
- package/dist/plugins/coin/metadata.d.mts +15 -0
- package/dist/plugins/coin/metadata.mjs +99 -0
- package/dist/plugins/coin/metadata.mjs.map +1 -0
- package/dist/plugins/coin/mint.d.mts +34 -0
- package/dist/plugins/coin/mint.mjs +164 -0
- package/dist/plugins/coin/mint.mjs.map +1 -0
- package/dist/plugins/coin/registry.d.mts +1 -0
- package/dist/plugins/coin/registry.mjs +37 -0
- package/dist/plugins/coin/registry.mjs.map +1 -0
- package/dist/plugins/coin/service.d.mts +47 -0
- package/dist/plugins/coin/service.mjs +51 -0
- package/dist/plugins/coin/service.mjs.map +1 -0
- package/dist/plugins/coin/snapshot.mjs +19 -0
- package/dist/plugins/coin/snapshot.mjs.map +1 -0
- package/dist/plugins/coin/type-strings.mjs +49 -0
- package/dist/plugins/coin/type-strings.mjs.map +1 -0
- package/dist/plugins/deepbook/codegen.d.mts +39 -0
- package/dist/plugins/deepbook/codegen.mjs +15 -0
- package/dist/plugins/deepbook/codegen.mjs.map +1 -0
- package/dist/plugins/deepbook/deploy.mjs +437 -0
- package/dist/plugins/deepbook/deploy.mjs.map +1 -0
- package/dist/plugins/deepbook/errors.d.mts +29 -0
- package/dist/plugins/deepbook/errors.mjs +26 -0
- package/dist/plugins/deepbook/errors.mjs.map +1 -0
- package/dist/plugins/deepbook/faucet-strategy.d.mts +8 -0
- package/dist/plugins/deepbook/faucet-strategy.mjs +81 -0
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -0
- package/dist/plugins/deepbook/index.d.mts +171 -0
- package/dist/plugins/deepbook/index.mjs +359 -0
- package/dist/plugins/deepbook/index.mjs.map +1 -0
- package/dist/plugins/deepbook/plugin-key.mjs +7 -0
- package/dist/plugins/deepbook/plugin-key.mjs.map +1 -0
- package/dist/plugins/deepbook/pyth/index.mjs +226 -0
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -0
- package/dist/plugins/deepbook/routable.mjs +21 -0
- package/dist/plugins/deepbook/routable.mjs.map +1 -0
- package/dist/plugins/deepbook/snapshot.mjs +49 -0
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -0
- package/dist/plugins/deepbook/types.d.mts +125 -0
- package/dist/plugins/deepbook/types.mjs +12 -0
- package/dist/plugins/deepbook/types.mjs.map +1 -0
- package/dist/plugins/faucet/dispatcher.d.mts +9 -0
- package/dist/plugins/faucet/dispatcher.mjs +13 -0
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -0
- package/dist/plugins/faucet/errors.d.mts +86 -0
- package/dist/plugins/faucet/errors.mjs +19 -0
- package/dist/plugins/faucet/errors.mjs.map +1 -0
- package/dist/plugins/faucet/http.mjs +127 -0
- package/dist/plugins/faucet/http.mjs.map +1 -0
- package/dist/plugins/faucet/index.d.mts +43 -0
- package/dist/plugins/faucet/index.mjs +42 -0
- package/dist/plugins/faucet/index.mjs.map +1 -0
- package/dist/plugins/faucet/service.d.mts +20 -0
- package/dist/plugins/faucet/strategies/sui-local.d.mts +23 -0
- package/dist/plugins/faucet/strategies/sui-local.mjs +29 -0
- package/dist/plugins/faucet/strategies/sui-local.mjs.map +1 -0
- package/dist/plugins/host-service/errors.d.mts +27 -0
- package/dist/plugins/host-service/errors.mjs +14 -0
- package/dist/plugins/host-service/errors.mjs.map +1 -0
- package/dist/plugins/host-service/index.d.mts +10 -0
- package/dist/plugins/host-service/index.mjs +48 -0
- package/dist/plugins/host-service/index.mjs.map +1 -0
- package/dist/plugins/host-service/routable.mjs +24 -0
- package/dist/plugins/host-service/routable.mjs.map +1 -0
- package/dist/plugins/host-service/service.d.mts +49 -0
- package/dist/plugins/host-service/service.mjs +375 -0
- package/dist/plugins/host-service/service.mjs.map +1 -0
- package/dist/plugins/package/build.d.mts +1 -0
- package/dist/plugins/package/build.mjs +24 -0
- package/dist/plugins/package/build.mjs.map +1 -0
- package/dist/plugins/package/codegen.d.mts +19 -0
- package/dist/plugins/package/codegen.mjs +41 -0
- package/dist/plugins/package/codegen.mjs.map +1 -0
- package/dist/plugins/package/dep-resolution.mjs +10 -0
- package/dist/plugins/package/dep-resolution.mjs.map +1 -0
- package/dist/plugins/package/errors.d.mts +34 -0
- package/dist/plugins/package/errors.mjs +13 -0
- package/dist/plugins/package/errors.mjs.map +1 -0
- package/dist/plugins/package/index.d.mts +109 -0
- package/dist/plugins/package/index.mjs +207 -0
- package/dist/plugins/package/index.mjs.map +1 -0
- package/dist/plugins/package/mode-known.mjs +41 -0
- package/dist/plugins/package/mode-known.mjs.map +1 -0
- package/dist/plugins/package/mode-local.d.mts +1 -0
- package/dist/plugins/package/mode-local.mjs +183 -0
- package/dist/plugins/package/mode-local.mjs.map +1 -0
- package/dist/plugins/package/publish-executor.mjs +202 -0
- package/dist/plugins/package/publish-executor.mjs.map +1 -0
- package/dist/plugins/package/publish-output.d.mts +28 -0
- package/dist/plugins/package/publish-output.mjs +45 -0
- package/dist/plugins/package/publish-output.mjs.map +1 -0
- package/dist/plugins/package/registry.d.mts +25 -0
- package/dist/plugins/package/registry.mjs +30 -0
- package/dist/plugins/package/registry.mjs.map +1 -0
- package/dist/plugins/package/service.mjs +20 -0
- package/dist/plugins/package/service.mjs.map +1 -0
- package/dist/plugins/package/snapshot.mjs +25 -0
- package/dist/plugins/package/snapshot.mjs.map +1 -0
- package/dist/plugins/postgres/codegen.mjs +42 -0
- package/dist/plugins/postgres/codegen.mjs.map +1 -0
- package/dist/plugins/postgres/connection.d.mts +33 -0
- package/dist/plugins/postgres/connection.mjs +19 -0
- package/dist/plugins/postgres/connection.mjs.map +1 -0
- package/dist/plugins/postgres/db-ensure.mjs +100 -0
- package/dist/plugins/postgres/db-ensure.mjs.map +1 -0
- package/dist/plugins/postgres/errors.d.mts +55 -0
- package/dist/plugins/postgres/errors.mjs +29 -0
- package/dist/plugins/postgres/errors.mjs.map +1 -0
- package/dist/plugins/postgres/index.d.mts +37 -0
- package/dist/plugins/postgres/index.mjs +75 -0
- package/dist/plugins/postgres/index.mjs.map +1 -0
- package/dist/plugins/postgres/routable.mjs +33 -0
- package/dist/plugins/postgres/routable.mjs.map +1 -0
- package/dist/plugins/postgres/service.d.mts +50 -0
- package/dist/plugins/postgres/service.mjs +145 -0
- package/dist/plugins/postgres/service.mjs.map +1 -0
- package/dist/plugins/postgres/snapshot.d.mts +1 -0
- package/dist/plugins/postgres/snapshot.mjs +32 -0
- package/dist/plugins/postgres/snapshot.mjs.map +1 -0
- package/dist/plugins/router-entrypoints.mjs +21 -0
- package/dist/plugins/router-entrypoints.mjs.map +1 -0
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +59 -0
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -0
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +132 -0
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -0
- package/dist/plugins/seal/codegen.d.mts +19 -0
- package/dist/plugins/seal/codegen.mjs +16 -0
- package/dist/plugins/seal/codegen.mjs.map +1 -0
- package/dist/plugins/seal/config-render.mjs +82 -0
- package/dist/plugins/seal/config-render.mjs.map +1 -0
- package/dist/plugins/seal/deploy.mjs +198 -0
- package/dist/plugins/seal/deploy.mjs.map +1 -0
- package/dist/plugins/seal/errors.d.mts +52 -0
- package/dist/plugins/seal/errors.mjs +19 -0
- package/dist/plugins/seal/errors.mjs.map +1 -0
- package/dist/plugins/seal/index.d.mts +161 -0
- package/dist/plugins/seal/index.mjs +235 -0
- package/dist/plugins/seal/index.mjs.map +1 -0
- package/dist/plugins/seal/key-manager.d.mts +22 -0
- package/dist/plugins/seal/key-manager.mjs +22 -0
- package/dist/plugins/seal/key-manager.mjs.map +1 -0
- package/dist/plugins/seal/key-server.mjs +175 -0
- package/dist/plugins/seal/key-server.mjs.map +1 -0
- package/dist/plugins/seal/keygen.mjs +96 -0
- package/dist/plugins/seal/keygen.mjs.map +1 -0
- package/dist/plugins/seal/mode/fork-known.d.mts +8 -0
- package/dist/plugins/seal/mode/fork-known.mjs +23 -0
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -0
- package/dist/plugins/seal/mode/live.d.mts +18 -0
- package/dist/plugins/seal/mode/live.mjs +64 -0
- package/dist/plugins/seal/mode/live.mjs.map +1 -0
- package/dist/plugins/seal/mode/local-keygen.mjs +180 -0
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -0
- package/dist/plugins/seal/plugin-key.mjs +7 -0
- package/dist/plugins/seal/plugin-key.mjs.map +1 -0
- package/dist/plugins/seal/registry-publish.d.mts +43 -0
- package/dist/plugins/seal/registry-publish.mjs +9 -0
- package/dist/plugins/seal/registry-publish.mjs.map +1 -0
- package/dist/plugins/seal/routable.mjs +57 -0
- package/dist/plugins/seal/routable.mjs.map +1 -0
- package/dist/plugins/seal/service.mjs +17 -0
- package/dist/plugins/seal/service.mjs.map +1 -0
- package/dist/plugins/seal/snapshot.mjs +51 -0
- package/dist/plugins/seal/snapshot.mjs.map +1 -0
- package/dist/plugins/sui/auto-tick.mjs +45 -0
- package/dist/plugins/sui/auto-tick.mjs.map +1 -0
- package/dist/plugins/sui/chain-build-container.d.mts +1 -0
- package/dist/plugins/sui/chain-probe.d.mts +85 -0
- package/dist/plugins/sui/chain-probe.mjs +104 -0
- package/dist/plugins/sui/chain-probe.mjs.map +1 -0
- package/dist/plugins/sui/codegen.d.mts +14 -0
- package/dist/plugins/sui/codegen.mjs +26 -0
- package/dist/plugins/sui/codegen.mjs.map +1 -0
- package/dist/plugins/sui/errors.d.mts +74 -0
- package/dist/plugins/sui/errors.mjs +28 -0
- package/dist/plugins/sui/errors.mjs.map +1 -0
- package/dist/plugins/sui/fork-orchestration.mjs +24 -0
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -0
- package/dist/plugins/sui/fork-transaction.mjs +96 -0
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -0
- package/dist/plugins/sui/index.d.mts +318 -0
- package/dist/plugins/sui/index.mjs +182 -0
- package/dist/plugins/sui/index.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +60 -0
- package/dist/plugins/sui/mode/external.mjs.map +1 -0
- package/dist/plugins/sui/mode/fork.mjs +283 -0
- package/dist/plugins/sui/mode/fork.mjs.map +1 -0
- package/dist/plugins/sui/mode/live.mjs +103 -0
- package/dist/plugins/sui/mode/live.mjs.map +1 -0
- package/dist/plugins/sui/mode/local.mjs +293 -0
- package/dist/plugins/sui/mode/local.mjs.map +1 -0
- package/dist/plugins/sui/mode/shared-boot.mjs +254 -0
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -0
- package/dist/plugins/sui/mode/shared.d.mts +103 -0
- package/dist/plugins/sui/mode/shared.mjs +12 -0
- package/dist/plugins/sui/mode/shared.mjs.map +1 -0
- package/dist/plugins/sui/mode/spec.d.mts +94 -0
- package/dist/plugins/sui/network-resolver.d.mts +23 -0
- package/dist/plugins/sui/routable.mjs +88 -0
- package/dist/plugins/sui/routable.mjs.map +1 -0
- package/dist/plugins/sui/seed-objects.d.mts +18 -0
- package/dist/plugins/sui/seed-objects.mjs +25 -0
- package/dist/plugins/sui/seed-objects.mjs.map +1 -0
- package/dist/plugins/sui/service.mjs +38 -0
- package/dist/plugins/sui/service.mjs.map +1 -0
- package/dist/plugins/sui/snapshot.mjs +53 -0
- package/dist/plugins/sui/snapshot.mjs.map +1 -0
- package/dist/plugins/wallet/codegen.d.mts +33 -0
- package/dist/plugins/wallet/codegen.mjs +34 -0
- package/dist/plugins/wallet/codegen.mjs.map +1 -0
- package/dist/plugins/wallet/errors.d.mts +66 -0
- package/dist/plugins/wallet/errors.mjs +16 -0
- package/dist/plugins/wallet/errors.mjs.map +1 -0
- package/dist/plugins/wallet/index.d.mts +63 -0
- package/dist/plugins/wallet/index.mjs +126 -0
- package/dist/plugins/wallet/index.mjs.map +1 -0
- package/dist/plugins/wallet/origin-policy.d.mts +1 -0
- package/dist/plugins/wallet/origin-policy.mjs +65 -0
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -0
- package/dist/plugins/wallet/pairing.d.mts +11 -0
- package/dist/plugins/wallet/pairing.mjs +125 -0
- package/dist/plugins/wallet/pairing.mjs.map +1 -0
- package/dist/plugins/wallet/protocol.d.mts +1 -0
- package/dist/plugins/wallet/protocol.mjs +96 -0
- package/dist/plugins/wallet/protocol.mjs.map +1 -0
- package/dist/plugins/wallet/routable.mjs +32 -0
- package/dist/plugins/wallet/routable.mjs.map +1 -0
- package/dist/plugins/wallet/server.d.mts +12 -0
- package/dist/plugins/wallet/server.mjs +317 -0
- package/dist/plugins/wallet/server.mjs.map +1 -0
- package/dist/plugins/wallet/service.d.mts +68 -0
- package/dist/plugins/wallet/service.mjs +97 -0
- package/dist/plugins/wallet/service.mjs.map +1 -0
- package/dist/plugins/wallet/snapshot.d.mts +1 -0
- package/dist/plugins/wallet/snapshot.mjs +14 -0
- package/dist/plugins/wallet/snapshot.mjs.map +1 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +42 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -0
- package/dist/plugins/walrus/codegen.d.mts +38 -0
- package/dist/plugins/walrus/codegen.mjs +34 -0
- package/dist/plugins/walrus/codegen.mjs.map +1 -0
- package/dist/plugins/walrus/deploy-paths.mjs +14 -0
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -0
- package/dist/plugins/walrus/deploy.d.mts +1 -0
- package/dist/plugins/walrus/deploy.mjs +224 -0
- package/dist/plugins/walrus/deploy.mjs.map +1 -0
- package/dist/plugins/walrus/errors.d.mts +38 -0
- package/dist/plugins/walrus/errors.mjs +26 -0
- package/dist/plugins/walrus/errors.mjs.map +1 -0
- package/dist/plugins/walrus/faucet-strategy.d.mts +12 -0
- package/dist/plugins/walrus/faucet-strategy.mjs +62 -0
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -0
- package/dist/plugins/walrus/index.d.mts +177 -0
- package/dist/plugins/walrus/index.mjs +284 -0
- package/dist/plugins/walrus/index.mjs.map +1 -0
- package/dist/plugins/walrus/mode/known-deploy.d.mts +25 -0
- package/dist/plugins/walrus/mode/known-deploy.mjs +71 -0
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -0
- package/dist/plugins/walrus/mode/local-cluster.d.mts +34 -0
- package/dist/plugins/walrus/mode/local-cluster.mjs +153 -0
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -0
- package/dist/plugins/walrus/plugin-key.mjs +7 -0
- package/dist/plugins/walrus/plugin-key.mjs.map +1 -0
- package/dist/plugins/walrus/registry-publish.d.mts +24 -0
- package/dist/plugins/walrus/registry-publish.mjs +7 -0
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -0
- package/dist/plugins/walrus/routable.mjs +99 -0
- package/dist/plugins/walrus/routable.mjs.map +1 -0
- package/dist/plugins/walrus/service.mjs +20 -0
- package/dist/plugins/walrus/service.mjs.map +1 -0
- package/dist/plugins/walrus/snapshot.mjs +53 -0
- package/dist/plugins/walrus/snapshot.mjs.map +1 -0
- package/dist/plugins/walrus/storage-nodes.d.mts +15 -0
- package/dist/plugins/walrus/storage-nodes.mjs +154 -0
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -0
- package/dist/plugins/walrus/wal-swap.d.mts +2 -0
- package/dist/plugins/walrus/wal-swap.mjs +58 -0
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -0
- package/dist/primitives/artifact-publisher.d.mts +12 -0
- package/dist/primitives/cache.d.mts +1 -0
- package/dist/runtime/built-in-plugin-layers.mjs +49 -0
- package/dist/runtime/built-in-plugin-layers.mjs.map +1 -0
- package/dist/runtime/docker/client.d.mts +2 -0
- package/dist/runtime/docker/client.mjs +54 -0
- package/dist/runtime/docker/client.mjs.map +1 -0
- package/dist/runtime/docker/container.d.mts +1 -0
- package/dist/runtime/docker/container.mjs +562 -0
- package/dist/runtime/docker/container.mjs.map +1 -0
- package/dist/runtime/docker/errors.d.mts +1 -0
- package/dist/runtime/docker/errors.mjs +187 -0
- package/dist/runtime/docker/errors.mjs.map +1 -0
- package/dist/runtime/docker/exec.d.mts +1 -0
- package/dist/runtime/docker/exec.mjs +63 -0
- package/dist/runtime/docker/exec.mjs.map +1 -0
- package/dist/runtime/docker/image.d.mts +1 -0
- package/dist/runtime/docker/image.mjs +278 -0
- package/dist/runtime/docker/image.mjs.map +1 -0
- package/dist/runtime/docker/index.d.mts +1 -0
- package/dist/runtime/docker/inventory.d.mts +1 -0
- package/dist/runtime/docker/inventory.mjs +167 -0
- package/dist/runtime/docker/inventory.mjs.map +1 -0
- package/dist/runtime/docker/labels.d.mts +1 -0
- package/dist/runtime/docker/labels.mjs +97 -0
- package/dist/runtime/docker/labels.mjs.map +1 -0
- package/dist/runtime/docker/logs.d.mts +1 -0
- package/dist/runtime/docker/logs.mjs +34 -0
- package/dist/runtime/docker/logs.mjs.map +1 -0
- package/dist/runtime/docker/network.d.mts +1 -0
- package/dist/runtime/docker/network.mjs +168 -0
- package/dist/runtime/docker/network.mjs.map +1 -0
- package/dist/runtime/docker/service.d.mts +9 -0
- package/dist/runtime/docker/service.mjs +266 -0
- package/dist/runtime/docker/service.mjs.map +1 -0
- package/dist/runtime/docker/sweep.d.mts +1 -0
- package/dist/runtime/docker/sweep.mjs +220 -0
- package/dist/runtime/docker/sweep.mjs.map +1 -0
- package/dist/runtime/docker/volume.d.mts +1 -0
- package/dist/runtime/docker/volume.mjs +24 -0
- package/dist/runtime/docker/volume.mjs.map +1 -0
- package/dist/runtime/docker/wrap.d.mts +1 -0
- package/dist/runtime/docker/wrap.mjs +131 -0
- package/dist/runtime/docker/wrap.mjs.map +1 -0
- package/dist/substrate/brand.d.mts +24 -0
- package/dist/substrate/brand.mjs +14 -0
- package/dist/substrate/brand.mjs.map +1 -0
- package/dist/substrate/cross-process.d.mts +1 -0
- package/dist/substrate/cross-process.mjs +28 -0
- package/dist/substrate/cross-process.mjs.map +1 -0
- package/dist/substrate/events.d.mts +117 -0
- package/dist/substrate/identity.d.mts +13 -0
- package/dist/substrate/lifecycle.d.mts +12 -0
- package/dist/substrate/manifest.d.mts +39 -0
- package/dist/substrate/manifest.mjs +33 -0
- package/dist/substrate/manifest.mjs.map +1 -0
- package/dist/substrate/network.d.mts +34 -0
- package/dist/substrate/options.d.mts +23 -0
- package/dist/substrate/plugin.d.mts +101 -0
- package/dist/substrate/plugin.mjs +61 -0
- package/dist/substrate/plugin.mjs.map +1 -0
- package/dist/substrate/projection.d.mts +100 -0
- package/dist/substrate/runtime/artifact-publisher/index.mjs +76 -0
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -0
- package/dist/substrate/runtime/atomic-write.mjs +106 -0
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -0
- package/dist/substrate/runtime/cache/index.d.mts +1 -0
- package/dist/substrate/runtime/cache/schema.d.mts +1 -0
- package/dist/substrate/runtime/cache/schema.mjs +22 -0
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -0
- package/dist/substrate/runtime/cache/service.d.mts +1 -0
- package/dist/substrate/runtime/cache/service.mjs +89 -0
- package/dist/substrate/runtime/cache/service.mjs.map +1 -0
- package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -0
- package/dist/substrate/runtime/capability-sinks/layer.d.mts +1 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs +31 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs.map +1 -0
- package/dist/substrate/runtime/capability-sinks/service.d.mts +36 -0
- package/dist/substrate/runtime/capability-sinks/service.mjs +74 -0
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -0
- package/dist/substrate/runtime/config-validation.d.mts +38 -0
- package/dist/substrate/runtime/config-validation.mjs +137 -0
- package/dist/substrate/runtime/config-validation.mjs.map +1 -0
- package/dist/substrate/runtime/context-helpers.mjs +32 -0
- package/dist/substrate/runtime/context-helpers.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +128 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +136 -0
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +49 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +9 -0
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs +119 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/roster.mjs +275 -0
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +117 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/stack-lock.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +142 -0
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -0
- package/dist/substrate/runtime/current-plugin.mjs +15 -0
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -0
- package/dist/substrate/runtime/errors.d.mts +1 -0
- package/dist/substrate/runtime/errors.mjs +76 -0
- package/dist/substrate/runtime/errors.mjs.map +1 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs +364 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -0
- package/dist/substrate/runtime/http-probe.d.mts +35 -0
- package/dist/substrate/runtime/http-probe.mjs +65 -0
- package/dist/substrate/runtime/http-probe.mjs.map +1 -0
- package/dist/substrate/runtime/lease-broker/index.d.mts +1 -0
- package/dist/substrate/runtime/lease-broker/service.d.mts +64 -0
- package/dist/substrate/runtime/lease-broker/service.mjs +155 -0
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +138 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/index.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +31 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +133 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs +34 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +43 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/signals.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/signals.mjs +64 -0
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/state-machine.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/state-machine.mjs +38 -0
- package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +27 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -0
- package/dist/substrate/runtime/managed-container.d.mts +30 -0
- package/dist/substrate/runtime/managed-container.mjs +32 -0
- package/dist/substrate/runtime/managed-container.mjs.map +1 -0
- package/dist/substrate/runtime/manifest/manifest.mjs +73 -0
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -0
- package/dist/substrate/runtime/mode-errors.d.mts +36 -0
- package/dist/substrate/runtime/observability/cascade-formatter.d.mts +1 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +135 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -0
- package/dist/substrate/runtime/observability/formatter-registry.d.mts +1 -0
- package/dist/substrate/runtime/observability/formatter-registry.mjs +65 -0
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -0
- package/dist/substrate/runtime/observability/index.d.mts +3 -0
- package/dist/substrate/runtime/observability/logger.d.mts +58 -0
- package/dist/substrate/runtime/observability/logger.mjs +89 -0
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -0
- package/dist/substrate/runtime/observability/pretty-error.d.mts +1 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs +119 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -0
- package/dist/substrate/runtime/observability/process-lines.d.mts +31 -0
- package/dist/substrate/runtime/observability/process-lines.mjs +40 -0
- package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -0
- package/dist/substrate/runtime/observability/redaction.d.mts +28 -0
- package/dist/substrate/runtime/observability/redaction.mjs +45 -0
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -0
- package/dist/substrate/runtime/observability/spans.d.mts +1 -0
- package/dist/substrate/runtime/observability/spans.mjs +87 -0
- package/dist/substrate/runtime/observability/spans.mjs.map +1 -0
- package/dist/substrate/runtime/observability/subprocess-capture.d.mts +2 -0
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +82 -0
- package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -0
- package/dist/substrate/runtime/paths.d.mts +17 -0
- package/dist/substrate/runtime/paths.mjs +61 -0
- package/dist/substrate/runtime/paths.mjs.map +1 -0
- package/dist/substrate/runtime/port-broker/index.d.mts +1 -0
- package/dist/substrate/runtime/port-broker/service.d.mts +1 -0
- package/dist/substrate/runtime/port-broker/service.mjs +319 -0
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -0
- package/dist/substrate/runtime/post-acquire-tasks.d.mts +1 -0
- package/dist/substrate/runtime/post-acquire-tasks.mjs +34 -0
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -0
- package/dist/substrate/runtime/probes.d.mts +51 -0
- package/dist/substrate/runtime/probes.mjs +84 -0
- package/dist/substrate/runtime/probes.mjs.map +1 -0
- package/dist/substrate/runtime/process-supervisor.d.mts +57 -0
- package/dist/substrate/runtime/process-supervisor.mjs +73 -0
- package/dist/substrate/runtime/process-supervisor.mjs.map +1 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs +44 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -0
- package/dist/substrate/runtime/projection/persisted.mjs +195 -0
- package/dist/substrate/runtime/projection/persisted.mjs.map +1 -0
- package/dist/substrate/runtime/projection/state-ref.mjs +48 -0
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -0
- package/dist/substrate/runtime/projection/update.mjs +200 -0
- package/dist/substrate/runtime/projection/update.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +18 -0
- package/dist/substrate/runtime/retry-policy.mjs +16 -0
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -0
- package/dist/substrate/runtime/run.mjs +86 -0
- package/dist/substrate/runtime/run.mjs.map +1 -0
- package/dist/substrate/runtime/runtime-decode.d.mts +32 -0
- package/dist/substrate/runtime/runtime-decode.mjs +53 -0
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-http-server.mjs +36 -0
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +83 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -0
- package/dist/substrate/runtime/stage-and-swap/index.d.mts +1 -0
- package/dist/substrate/runtime/stage-and-swap/index.mjs +131 -0
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -0
- package/dist/substrate/runtime/state-store/schema.mjs +36 -0
- package/dist/substrate/runtime/state-store/schema.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +22 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +30 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/index.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/service.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs +67 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -0
- package/dist/substrate/runtime/sui-execute/index.d.mts +11 -0
- package/dist/substrate/runtime/sui-execute/index.mjs +144 -0
- package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -0
- package/dist/substrate/runtime/sui-move-build/index.d.mts +1 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs +283 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor.d.mts +1 -0
- package/dist/substrate/runtime/supervisor.mjs +831 -0
- package/dist/substrate/runtime/supervisor.mjs.map +1 -0
- package/dist/surfaces/cli/command-tree.mjs +276 -0
- package/dist/surfaces/cli/command-tree.mjs.map +1 -0
- package/dist/surfaces/cli/commands/config.mjs +31 -0
- package/dist/surfaces/cli/commands/config.mjs.map +1 -0
- package/dist/surfaces/cli/commands/confirm-node.mjs +26 -0
- package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -0
- package/dist/surfaces/cli/commands/confirm.mjs +26 -0
- package/dist/surfaces/cli/commands/confirm.mjs.map +1 -0
- package/dist/surfaces/cli/commands/doctor-probes.mjs +452 -0
- package/dist/surfaces/cli/commands/doctor-probes.mjs.map +1 -0
- package/dist/surfaces/cli/commands/doctor.mjs +38 -0
- package/dist/surfaces/cli/commands/doctor.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs +347 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune.mjs +178 -0
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -0
- package/dist/surfaces/cli/commands/snapshot.mjs +141 -0
- package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -0
- package/dist/surfaces/cli/commands/status.mjs +95 -0
- package/dist/surfaces/cli/commands/status.mjs.map +1 -0
- package/dist/surfaces/cli/commands/supervisor-presence.mjs +33 -0
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -0
- package/dist/surfaces/cli/commands/wipe.mjs +28 -0
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -0
- package/dist/surfaces/cli/envelope.mjs +43 -0
- package/dist/surfaces/cli/envelope.mjs.map +1 -0
- package/dist/surfaces/cli/errors.mjs +110 -0
- package/dist/surfaces/cli/errors.mjs.map +1 -0
- package/dist/surfaces/cli/flags.mjs +56 -0
- package/dist/surfaces/cli/flags.mjs.map +1 -0
- package/dist/surfaces/cli/index.mjs +418 -0
- package/dist/surfaces/cli/index.mjs.map +1 -0
- package/dist/surfaces/cli/output.mjs +115 -0
- package/dist/surfaces/cli/output.mjs.map +1 -0
- package/dist/surfaces/cli/sysexits.mjs +139 -0
- package/dist/surfaces/cli/sysexits.mjs.map +1 -0
- package/dist/surfaces/tui/app.mjs +104 -0
- package/dist/surfaces/tui/app.mjs.map +1 -0
- package/dist/surfaces/tui/dashboard.mjs +261 -0
- package/dist/surfaces/tui/dashboard.mjs.map +1 -0
- package/dist/surfaces/tui/display-derivation.mjs +395 -0
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -0
- package/dist/surfaces/tui/errors.mjs +11 -0
- package/dist/surfaces/tui/errors.mjs.map +1 -0
- package/dist/surfaces/tui/event-log.mjs +155 -0
- package/dist/surfaces/tui/event-log.mjs.map +1 -0
- package/dist/surfaces/tui/heartbeat.mjs +33 -0
- package/dist/surfaces/tui/heartbeat.mjs.map +1 -0
- package/dist/surfaces/tui/index.mjs +50 -0
- package/dist/surfaces/tui/index.mjs.map +1 -0
- package/dist/surfaces/tui/input.mjs +104 -0
- package/dist/surfaces/tui/input.mjs.map +1 -0
- package/dist/surfaces/tui/mode-detect.mjs +32 -0
- package/dist/surfaces/tui/mode-detect.mjs.map +1 -0
- package/dist/surfaces/tui/mount-ink.mjs +31 -0
- package/dist/surfaces/tui/mount-ink.mjs.map +1 -0
- package/dist/surfaces/tui/plain-renderer.mjs +170 -0
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -0
- package/dist/surfaces/tui/resource-table.mjs +507 -0
- package/dist/surfaces/tui/resource-table.mjs.map +1 -0
- package/images/_shared/signal-forward.sh +77 -0
- package/images/postgres/Dockerfile +32 -0
- package/images/seal/Dockerfile +68 -0
- package/images/seal/entrypoint.sh +65 -0
- package/images/sui/Dockerfile +73 -0
- package/images/sui/entrypoint.sh +244 -0
- package/images/sui-fork/Dockerfile +53 -0
- package/images/sui-fork/entrypoint.sh +51 -0
- package/images/walrus/Dockerfile +122 -0
- package/images/walrus/deploy-walrus.sh +305 -0
- package/images/walrus/run-walrus.sh +53 -0
- package/package.json +94 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { LeaseBrokerService } from "../../substrate/runtime/lease-broker/service.mjs";
|
|
2
|
+
import { accountAcquireError, accountSignError } from "./errors.mjs";
|
|
3
|
+
import { withAddressLease } from "./lease.mjs";
|
|
4
|
+
import { DEFAULT_EPHEMERAL_FUND_MIST, SUI_FULL_COIN_TYPE, applyCrossCuttingFunding, fundEphemeralDefault } from "./funding.mjs";
|
|
5
|
+
import { resolveEphemeralVariant } from "./variants/ephemeral.mjs";
|
|
6
|
+
import { resolveKeystoreVariant } from "./variants/keystore.mjs";
|
|
7
|
+
import { resolveEnvVariant } from "./variants/env.mjs";
|
|
8
|
+
import { resolveInlineVariant } from "./variants/inline.mjs";
|
|
9
|
+
import { resolveSignerVariant } from "./variants/signer.mjs";
|
|
10
|
+
import { resolveImpersonateVariant } from "./variants/impersonate.mjs";
|
|
11
|
+
import { Effect } from "effect";
|
|
12
|
+
//#region src/plugins/account/service.ts
|
|
13
|
+
/** Architecture-distilled invariant: name flows into the resource id, an
|
|
14
|
+
* on-disk path, a manifest key, container labels, and generated
|
|
15
|
+
* TypeScript exports. Keep the public name identifier-safe instead
|
|
16
|
+
* of accepting path-safe spellings that codegen later rejects. */
|
|
17
|
+
const ACCOUNT_NAME_RE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;
|
|
18
|
+
const ACCOUNT_NAME_HINT = "letters, digits, and underscores; must start with a letter; max 64 chars; cannot be a TypeScript reserved word";
|
|
19
|
+
const TS_RESERVED_BINDING_NAMES = new Set([
|
|
20
|
+
"as",
|
|
21
|
+
"async",
|
|
22
|
+
"await",
|
|
23
|
+
"break",
|
|
24
|
+
"case",
|
|
25
|
+
"catch",
|
|
26
|
+
"class",
|
|
27
|
+
"const",
|
|
28
|
+
"continue",
|
|
29
|
+
"debugger",
|
|
30
|
+
"default",
|
|
31
|
+
"delete",
|
|
32
|
+
"do",
|
|
33
|
+
"else",
|
|
34
|
+
"enum",
|
|
35
|
+
"export",
|
|
36
|
+
"extends",
|
|
37
|
+
"false",
|
|
38
|
+
"finally",
|
|
39
|
+
"for",
|
|
40
|
+
"from",
|
|
41
|
+
"function",
|
|
42
|
+
"if",
|
|
43
|
+
"import",
|
|
44
|
+
"in",
|
|
45
|
+
"instanceof",
|
|
46
|
+
"let",
|
|
47
|
+
"new",
|
|
48
|
+
"null",
|
|
49
|
+
"of",
|
|
50
|
+
"return",
|
|
51
|
+
"super",
|
|
52
|
+
"switch",
|
|
53
|
+
"this",
|
|
54
|
+
"throw",
|
|
55
|
+
"true",
|
|
56
|
+
"try",
|
|
57
|
+
"typeof",
|
|
58
|
+
"var",
|
|
59
|
+
"void",
|
|
60
|
+
"while",
|
|
61
|
+
"with",
|
|
62
|
+
"yield"
|
|
63
|
+
]);
|
|
64
|
+
const accountNameInvalidReason = (name) => {
|
|
65
|
+
if (!ACCOUNT_NAME_RE.test(name)) return `must match ${ACCOUNT_NAME_RE.source}`;
|
|
66
|
+
if (TS_RESERVED_BINDING_NAMES.has(name)) return "cannot be a TypeScript reserved word";
|
|
67
|
+
return null;
|
|
68
|
+
};
|
|
69
|
+
const assertAccountName = (name) => {
|
|
70
|
+
const reason = accountNameInvalidReason(name);
|
|
71
|
+
if (reason !== null) throw new TypeError(`Account name '${name}' is invalid — ${reason}. ${ACCOUNT_NAME_HINT}`);
|
|
72
|
+
};
|
|
73
|
+
const validateAccountName = (name) => {
|
|
74
|
+
const reason = accountNameInvalidReason(name);
|
|
75
|
+
if (reason !== null) return Effect.fail(accountAcquireError({
|
|
76
|
+
phase: "validate-name",
|
|
77
|
+
accountName: name,
|
|
78
|
+
variant: "ephemeral",
|
|
79
|
+
message: `Account name '${name}' is invalid — ${reason}.`,
|
|
80
|
+
hint: ACCOUNT_NAME_HINT
|
|
81
|
+
}));
|
|
82
|
+
return Effect.void;
|
|
83
|
+
};
|
|
84
|
+
const FUNDING_BALANCE_TIMEOUT_MS = 5e3;
|
|
85
|
+
const makeFundingBalanceReader = (sdk) => ({ readBalance: ({ owner, coinType }) => Effect.promise(async () => {
|
|
86
|
+
try {
|
|
87
|
+
return balanceAmountFromSdkResponse(await sdk.core.getBalance({
|
|
88
|
+
owner,
|
|
89
|
+
coinType
|
|
90
|
+
}));
|
|
91
|
+
} catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}).pipe(Effect.timeoutOrElse({
|
|
95
|
+
duration: `${FUNDING_BALANCE_TIMEOUT_MS} millis`,
|
|
96
|
+
orElse: () => Effect.succeed(null)
|
|
97
|
+
})) });
|
|
98
|
+
const balanceAmountFromSdkResponse = (response) => {
|
|
99
|
+
const outer = typeof response === "object" && response !== null && "balance" in response ? response.balance : response;
|
|
100
|
+
const value = typeof outer === "object" && outer !== null && "balance" in outer ? outer.balance : outer;
|
|
101
|
+
if (typeof value === "bigint") return value;
|
|
102
|
+
if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) return BigInt(value);
|
|
103
|
+
if (typeof value === "string" && /^\d+$/.test(value)) return BigInt(value);
|
|
104
|
+
return null;
|
|
105
|
+
};
|
|
106
|
+
/** Dispatch on the variant discriminator. */
|
|
107
|
+
const resolveVariant = (opts, ctx) => {
|
|
108
|
+
switch (opts.kind) {
|
|
109
|
+
case "ephemeral": return resolveEphemeralVariant({
|
|
110
|
+
name: opts.name,
|
|
111
|
+
secretFilePath: `${ctx.runtimeRoot}/account/${opts.name}.key`
|
|
112
|
+
});
|
|
113
|
+
case "keystore": return resolveKeystoreVariant({
|
|
114
|
+
name: opts.name,
|
|
115
|
+
path: opts.path,
|
|
116
|
+
aliasOrAddress: opts.aliasOrAddress
|
|
117
|
+
});
|
|
118
|
+
case "env": return resolveEnvVariant({
|
|
119
|
+
name: opts.name,
|
|
120
|
+
varName: opts.key
|
|
121
|
+
});
|
|
122
|
+
case "inline": return resolveInlineVariant({
|
|
123
|
+
name: opts.name,
|
|
124
|
+
privateKey: opts.privateKey
|
|
125
|
+
});
|
|
126
|
+
case "signer": return resolveSignerVariant({
|
|
127
|
+
name: opts.name,
|
|
128
|
+
signer: opts.signer,
|
|
129
|
+
...opts.addressOverride !== void 0 ? { addressOverride: opts.addressOverride } : {}
|
|
130
|
+
});
|
|
131
|
+
case "impersonate": return resolveImpersonateVariant({
|
|
132
|
+
name: opts.name,
|
|
133
|
+
address: opts.address,
|
|
134
|
+
suiMode: ctx.sui.mode
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
/** Promote a Promise-returning sign call into the typed-error
|
|
139
|
+
* channel. The `signer.signTransaction` / `signPersonalMessage`
|
|
140
|
+
* helpers on `@mysten/sui` `Signer` instances are async; the
|
|
141
|
+
* bring-your-own-signer variant uses the same shape. */
|
|
142
|
+
const signWith = (signer, tx, accountName, address) => Effect.tryPromise({
|
|
143
|
+
try: () => signer.signTransaction(tx),
|
|
144
|
+
catch: (cause) => accountSignError({
|
|
145
|
+
phase: "sign",
|
|
146
|
+
accountName,
|
|
147
|
+
address,
|
|
148
|
+
message: `Account '${accountName}': signer.signTransaction() rejected.`,
|
|
149
|
+
cause
|
|
150
|
+
})
|
|
151
|
+
});
|
|
152
|
+
const signPersonalWith = (signer, msg, accountName, address) => Effect.tryPromise({
|
|
153
|
+
try: () => signer.signPersonalMessage(msg),
|
|
154
|
+
catch: (cause) => accountSignError({
|
|
155
|
+
phase: "sign",
|
|
156
|
+
accountName,
|
|
157
|
+
address,
|
|
158
|
+
message: `Account '${accountName}': signer.signPersonalMessage() rejected.`,
|
|
159
|
+
cause
|
|
160
|
+
})
|
|
161
|
+
});
|
|
162
|
+
/** Project the raw `@mysten/sui` executeTransaction response into
|
|
163
|
+
* the narrowed `TxResult` shape consumers depend on. The SDK
|
|
164
|
+
* response carries a discriminated union; the result we surface
|
|
165
|
+
* always carries a digest plus the include-projected sub-fields. */
|
|
166
|
+
const projectTxResult = (raw, accountName, address) => {
|
|
167
|
+
const r = raw;
|
|
168
|
+
if (r.$kind === "FailedTransaction") return Effect.fail(accountSignError({
|
|
169
|
+
phase: "submit",
|
|
170
|
+
accountName,
|
|
171
|
+
address,
|
|
172
|
+
message: `Account '${accountName}': transaction execution failed on-chain (digest=${r.FailedTransaction?.digest ?? "<unknown>"}).`
|
|
173
|
+
}));
|
|
174
|
+
const tx = r.Transaction;
|
|
175
|
+
if (tx?.digest === void 0) return Effect.fail(accountSignError({
|
|
176
|
+
phase: "submit",
|
|
177
|
+
accountName,
|
|
178
|
+
address,
|
|
179
|
+
message: `Account '${accountName}': executeTransaction returned no digest. Raw shape=${JSON.stringify(r).slice(0, 200)}.`
|
|
180
|
+
}));
|
|
181
|
+
return Effect.succeed({
|
|
182
|
+
digest: tx.digest,
|
|
183
|
+
effects: tx.effects ?? null,
|
|
184
|
+
objectChanges: projectObjectChanges(tx.effects, tx.objectTypes ?? {}),
|
|
185
|
+
balanceChanges: tx.balanceChanges ?? []
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
const extractExecuteDigest = (raw) => {
|
|
189
|
+
const r = raw;
|
|
190
|
+
return r.$kind === "FailedTransaction" ? r.FailedTransaction?.digest : r.Transaction?.digest;
|
|
191
|
+
};
|
|
192
|
+
const projectObjectChanges = (effects, objectTypes) => {
|
|
193
|
+
const changedObjects = typeof effects === "object" && effects !== null && "changedObjects" in effects ? effects.changedObjects : void 0;
|
|
194
|
+
if (changedObjects === void 0) return [];
|
|
195
|
+
return changedObjects.filter((change) => typeof change.objectId === "string").map((change) => {
|
|
196
|
+
const objectType = objectTypes[change.objectId];
|
|
197
|
+
const entry = {
|
|
198
|
+
type: change.outputState === "PackageWrite" ? "published" : change.idOperation === "Created" ? "created" : "mutated",
|
|
199
|
+
objectId: change.objectId
|
|
200
|
+
};
|
|
201
|
+
if (objectType !== void 0) entry.objectType = objectType;
|
|
202
|
+
if (change.outputState !== void 0) entry.outputState = change.outputState;
|
|
203
|
+
if (change.idOperation !== void 0) entry.idOperation = change.idOperation;
|
|
204
|
+
return entry;
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
const buildClosures = (args) => {
|
|
208
|
+
const { accountName, resolved, sui, broker, source } = args;
|
|
209
|
+
if (source === "impersonate") {
|
|
210
|
+
const refuse = () => Effect.fail(accountSignError({
|
|
211
|
+
phase: "impersonation-bypass-attempt",
|
|
212
|
+
accountName,
|
|
213
|
+
address: resolved.address,
|
|
214
|
+
message: `Account '${accountName}' is an impersonation account — sign/execute must route through Sui's fork admin surface.`
|
|
215
|
+
}));
|
|
216
|
+
const unlockedSignAndExecute = (tx) => Effect.gen(function* () {
|
|
217
|
+
const fork = sui.fork ?? null;
|
|
218
|
+
if (fork === null) return yield* Effect.fail(accountSignError({
|
|
219
|
+
phase: "submit",
|
|
220
|
+
accountName,
|
|
221
|
+
address: resolved.address,
|
|
222
|
+
message: `Account '${accountName}': impersonation requires a fork-mode Sui client.`
|
|
223
|
+
}));
|
|
224
|
+
const submitted = yield* fork.impersonate(resolved.address, tx).pipe(Effect.mapError((cause) => accountSignError({
|
|
225
|
+
phase: "submit",
|
|
226
|
+
accountName,
|
|
227
|
+
address: resolved.address,
|
|
228
|
+
message: `Account '${accountName}': fork impersonation submit failed.`,
|
|
229
|
+
cause
|
|
230
|
+
})));
|
|
231
|
+
yield* Effect.tryPromise({
|
|
232
|
+
try: () => sui.sdk.core.waitForTransaction({ digest: submitted.digest }),
|
|
233
|
+
catch: (cause) => accountSignError({
|
|
234
|
+
phase: "await-finality",
|
|
235
|
+
accountName,
|
|
236
|
+
address: resolved.address,
|
|
237
|
+
message: `Account '${accountName}': waitForTransaction(${submitted.digest}) failed.`,
|
|
238
|
+
cause
|
|
239
|
+
})
|
|
240
|
+
});
|
|
241
|
+
return yield* projectTxResult(submitted.raw, accountName, resolved.address);
|
|
242
|
+
});
|
|
243
|
+
const transactionSigner = {
|
|
244
|
+
signTransaction: refuse,
|
|
245
|
+
signAndExecute: unlockedSignAndExecute
|
|
246
|
+
};
|
|
247
|
+
const withTransactionSigner = (body) => withAddressLease(broker, accountName, resolved.address, Effect.gen(function* () {
|
|
248
|
+
return yield* body(transactionSigner);
|
|
249
|
+
})).pipe(Effect.withSpan("devstack.plugin.account.transactionSigner", { attributes: {
|
|
250
|
+
"account.name": accountName,
|
|
251
|
+
"account.address": resolved.address
|
|
252
|
+
} }));
|
|
253
|
+
return {
|
|
254
|
+
signAndExecute: (tx) => withTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(Effect.withSpan("devstack.plugin.account.signAndExecute", { attributes: {
|
|
255
|
+
"account.name": accountName,
|
|
256
|
+
"account.address": resolved.address
|
|
257
|
+
} })),
|
|
258
|
+
withTransactionSigner,
|
|
259
|
+
signTransaction: refuse,
|
|
260
|
+
signPersonalMessage: refuse
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const signer = resolved.signer;
|
|
264
|
+
const unlockedSignTransaction = (tx) => signWith(signer, tx, accountName, resolved.address);
|
|
265
|
+
const unlockedSignAndExecute = (tx) => Effect.gen(function* () {
|
|
266
|
+
const signed = yield* unlockedSignTransaction(tx);
|
|
267
|
+
const raw = yield* Effect.tryPromise({
|
|
268
|
+
try: () => sui.sdk.core.executeTransaction({
|
|
269
|
+
transaction: tx,
|
|
270
|
+
signatures: [signed.signature],
|
|
271
|
+
include: {
|
|
272
|
+
effects: true,
|
|
273
|
+
objectTypes: true
|
|
274
|
+
}
|
|
275
|
+
}),
|
|
276
|
+
catch: (cause) => accountSignError({
|
|
277
|
+
phase: "submit",
|
|
278
|
+
accountName,
|
|
279
|
+
address: resolved.address,
|
|
280
|
+
message: `Account '${accountName}': executeTransaction transport failed.`,
|
|
281
|
+
cause
|
|
282
|
+
})
|
|
283
|
+
});
|
|
284
|
+
const digest = extractExecuteDigest(raw);
|
|
285
|
+
if (digest !== void 0) yield* Effect.tryPromise({
|
|
286
|
+
try: () => sui.sdk.core.waitForTransaction({ digest }),
|
|
287
|
+
catch: (cause) => accountSignError({
|
|
288
|
+
phase: "await-finality",
|
|
289
|
+
accountName,
|
|
290
|
+
address: resolved.address,
|
|
291
|
+
message: `Account '${accountName}': waitForTransaction(${digest}) failed.`,
|
|
292
|
+
cause
|
|
293
|
+
})
|
|
294
|
+
});
|
|
295
|
+
return yield* projectTxResult(raw, accountName, resolved.address);
|
|
296
|
+
});
|
|
297
|
+
const transactionSigner = {
|
|
298
|
+
signTransaction: unlockedSignTransaction,
|
|
299
|
+
signAndExecute: unlockedSignAndExecute
|
|
300
|
+
};
|
|
301
|
+
const withTransactionSigner = (body) => withAddressLease(broker, accountName, resolved.address, Effect.gen(function* () {
|
|
302
|
+
return yield* body(transactionSigner);
|
|
303
|
+
})).pipe(Effect.withSpan("devstack.plugin.account.transactionSigner", { attributes: {
|
|
304
|
+
"account.name": accountName,
|
|
305
|
+
"account.address": resolved.address
|
|
306
|
+
} }));
|
|
307
|
+
const signTransaction = (tx) => withTransactionSigner((locked) => locked.signTransaction(tx)).pipe(Effect.withSpan("devstack.plugin.account.signTransaction", { attributes: {
|
|
308
|
+
"account.name": accountName,
|
|
309
|
+
"account.address": resolved.address
|
|
310
|
+
} }));
|
|
311
|
+
const signPersonalMessage = (msg) => withAddressLease(broker, accountName, resolved.address, signPersonalWith(signer, msg, accountName, resolved.address)).pipe(Effect.withSpan("devstack.plugin.account.signPersonalMessage", { attributes: {
|
|
312
|
+
"account.name": accountName,
|
|
313
|
+
"account.address": resolved.address
|
|
314
|
+
} }));
|
|
315
|
+
const signAndExecute = (tx) => withTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(Effect.withSpan("devstack.plugin.account.signAndExecute", { attributes: {
|
|
316
|
+
"account.name": accountName,
|
|
317
|
+
"account.address": resolved.address
|
|
318
|
+
} }));
|
|
319
|
+
return {
|
|
320
|
+
signAndExecute,
|
|
321
|
+
withTransactionSigner,
|
|
322
|
+
signTransaction,
|
|
323
|
+
signPersonalMessage
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
/** Acquire an account. Coordinates variant dispatch + funding +
|
|
327
|
+
* the resolved-value projection. */
|
|
328
|
+
const acquireAccount = (opts, ctx) => Effect.gen(function* () {
|
|
329
|
+
yield* validateAccountName(opts.name);
|
|
330
|
+
yield* Effect.annotateCurrentSpan({
|
|
331
|
+
"account.name": opts.name,
|
|
332
|
+
"account.variant": opts.kind,
|
|
333
|
+
"sui.mode": ctx.sui.mode
|
|
334
|
+
});
|
|
335
|
+
const resolved = yield* resolveVariant(opts, ctx);
|
|
336
|
+
yield* Effect.annotateCurrentSpan({
|
|
337
|
+
"account.address": resolved.address,
|
|
338
|
+
"account.scheme": resolved.scheme
|
|
339
|
+
});
|
|
340
|
+
const broker = yield* LeaseBrokerService;
|
|
341
|
+
const balanceReader = makeFundingBalanceReader(ctx.sui.sdk);
|
|
342
|
+
const defaultFunding = opts.kind === "ephemeral" && opts.funding === void 0 ? {
|
|
343
|
+
coin: "SUI",
|
|
344
|
+
fullCoinType: SUI_FULL_COIN_TYPE,
|
|
345
|
+
amount: DEFAULT_EPHEMERAL_FUND_MIST
|
|
346
|
+
} : null;
|
|
347
|
+
const requestedFunding = defaultFunding === null ? ctx.projectedFunding ?? [] : [defaultFunding, ...ctx.projectedFunding ?? []];
|
|
348
|
+
const appliedDefaultFunding = [];
|
|
349
|
+
if (defaultFunding !== null) {
|
|
350
|
+
yield* fundEphemeralDefault({
|
|
351
|
+
accountName: opts.name,
|
|
352
|
+
address: resolved.address,
|
|
353
|
+
amountMist: defaultFunding.amount,
|
|
354
|
+
suiMode: ctx.sui.mode,
|
|
355
|
+
chainId: ctx.sui.chain,
|
|
356
|
+
emitAutoPromotionEvent: ctx.emitAutoPromotionEvent,
|
|
357
|
+
broker,
|
|
358
|
+
balanceReader
|
|
359
|
+
});
|
|
360
|
+
if (defaultFunding.amount > 0n) appliedDefaultFunding.push(defaultFunding);
|
|
361
|
+
}
|
|
362
|
+
const source = opts.kind === "impersonate" ? "impersonate" : "real";
|
|
363
|
+
const closures = buildClosures({
|
|
364
|
+
accountName: opts.name,
|
|
365
|
+
resolved,
|
|
366
|
+
sui: ctx.sui,
|
|
367
|
+
broker,
|
|
368
|
+
source
|
|
369
|
+
});
|
|
370
|
+
const value = {
|
|
371
|
+
name: opts.name,
|
|
372
|
+
address: resolved.address,
|
|
373
|
+
scheme: resolved.scheme,
|
|
374
|
+
publicKey: resolved.publicKey,
|
|
375
|
+
source,
|
|
376
|
+
funding: {
|
|
377
|
+
requested: requestedFunding,
|
|
378
|
+
applied: appliedDefaultFunding
|
|
379
|
+
},
|
|
380
|
+
...closures
|
|
381
|
+
};
|
|
382
|
+
const projected = ctx.projectedFunding ?? [];
|
|
383
|
+
let appliedCrossCuttingFunding = [];
|
|
384
|
+
if (projected.length > 0) appliedCrossCuttingFunding = yield* applyCrossCuttingFunding({
|
|
385
|
+
accountName: opts.name,
|
|
386
|
+
address: resolved.address,
|
|
387
|
+
variant: opts.kind,
|
|
388
|
+
account: value,
|
|
389
|
+
funding: projected,
|
|
390
|
+
chainId: ctx.sui.chain,
|
|
391
|
+
broker,
|
|
392
|
+
balanceReader
|
|
393
|
+
});
|
|
394
|
+
return {
|
|
395
|
+
...value,
|
|
396
|
+
funding: {
|
|
397
|
+
requested: requestedFunding,
|
|
398
|
+
applied: [...appliedDefaultFunding, ...appliedCrossCuttingFunding]
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
});
|
|
402
|
+
//#endregion
|
|
403
|
+
export { acquireAccount, assertAccountName };
|
|
404
|
+
|
|
405
|
+
//# sourceMappingURL=service.mjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
//#region src/plugins/account/snapshot.ts
|
|
3
|
+
/** Build the Snapshotable contribution for a resolved variant.
|
|
4
|
+
*
|
|
5
|
+
* Only the `ephemeral` variant declares a persisted subtree. The
|
|
6
|
+
* subtree is per-account so wipe-single-account (12-account.md
|
|
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. */
|
|
9
|
+
const makeAccountSnapshotable = (parts) => {
|
|
10
|
+
parts.app, parts.stack, parts.accountName;
|
|
11
|
+
if (parts.variant !== "ephemeral") return {
|
|
12
|
+
kind: "snapshotable",
|
|
13
|
+
subtrees: [],
|
|
14
|
+
missingTolerance: "fine"
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
kind: "snapshotable",
|
|
18
|
+
subtrees: [`account/${parts.accountName}.key`],
|
|
19
|
+
missingTolerance: "fine",
|
|
20
|
+
secretMaterial: true,
|
|
21
|
+
preRestore: Effect.succeed({
|
|
22
|
+
kind: "account-secret",
|
|
23
|
+
account: parts.accountName,
|
|
24
|
+
app: parts.app,
|
|
25
|
+
stack: parts.stack
|
|
26
|
+
}),
|
|
27
|
+
postRestore: Effect.void
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { makeAccountSnapshotable };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=snapshot.mjs.map
|
|
@@ -0,0 +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 { ContainerLabelTuple, 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. The\n * subtree is per-account so wipe-single-account (12-account.md\n * open question) would target a single path; today's \"wipe whole\n * stack\" recipe doesn't need this granularity but the seam is here. */\nexport const makeAccountSnapshotable = (parts: {\n\treadonly accountName: string;\n\treadonly variant: AccountVariantKind;\n\treadonly app: string;\n\treadonly stack: string;\n}): SnapshotableDecl => {\n\tconst _labels: ContainerLabelTuple = {\n\t\tapp: parts.app,\n\t\tstack: parts.stack,\n\t\tplugin: 'account',\n\t\trole: parts.accountName,\n\t};\n\t// Account is value-producing — no managed container. We retain\n\t// the label tuple in the file for symmetry with Sui's snapshot\n\t// decl (and for the future `wipe-single-account` recipe).\n\tvoid _labels;\n\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 and serves as the\n\t\t// authoritative path for the future per-account wipe.\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":";;;;;;;;AAgCA,MAAa,2BAA2B,UAKhB;AAEjB,OAAM,KACJ,MAAM,OAEP,MAAM;AAOb,KAAI,MAAM,YAAY,YACrB,QAAO;EACN,MAAM;EACN,UAAU,EAAE;EACZ,kBAAkB;EAClB;AAGF,QAAO;EACN,MAAM;EAMN,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,24 @@
|
|
|
1
|
+
import { accountAcquireError } from "../errors.mjs";
|
|
2
|
+
import { decodeBech32Secret } from "../keypair.mjs";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
//#region src/plugins/account/variants/env.ts
|
|
5
|
+
/** Resolve the env variant.
|
|
6
|
+
*
|
|
7
|
+
* Stub: the actual env-read happens inside `Effect.sync` against
|
|
8
|
+
* the resolved-once process env. The decode path then funnels into
|
|
9
|
+
* `decodeBech32Secret`. */
|
|
10
|
+
const resolveEnvVariant = (args) => Effect.gen(function* () {
|
|
11
|
+
return yield* decodeBech32Secret(yield* Effect.sync(() => {
|
|
12
|
+
return globalThis.process?.env?.[args.varName];
|
|
13
|
+
}).pipe(Effect.flatMap((v) => v === void 0 || v === "" ? Effect.fail(accountAcquireError({
|
|
14
|
+
phase: "read-env",
|
|
15
|
+
accountName: args.name,
|
|
16
|
+
variant: "env",
|
|
17
|
+
message: `Account '${args.name}': env var '${args.varName}' is missing or empty.`,
|
|
18
|
+
hint: `Set ${args.varName}=suiprivkey1... in the process environment.`
|
|
19
|
+
})) : Effect.succeed(v))), args.name, "env");
|
|
20
|
+
});
|
|
21
|
+
//#endregion
|
|
22
|
+
export { resolveEnvVariant };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=env.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.mjs","names":[],"sources":["../../../../src/plugins/account/variants/env.ts"],"sourcesContent":["// Account variant — env (read bech32 secret from a process env var).\n//\n// Distilled-doc surface: scoped to CI / vault-injected configurations.\n// The env-var NAME is taken verbatim from the user's options — the\n// VALUE is never logged, spanned, or surfaced in error messages\n// (security invariant: only the variable name is referenced).\n\nimport { Effect } from 'effect';\n\nimport { accountAcquireError, type AccountAcquireError } from '../errors.ts';\nimport { decodeBech32Secret, type ResolvedKeypair } from '../keypair.ts';\n\nexport interface EnvVariantArgs {\n\treadonly name: string;\n\t/** The `process.env` variable name holding the bech32 secret. */\n\treadonly varName: string;\n}\n\n/** Resolve the env variant.\n *\n * Stub: the actual env-read happens inside `Effect.sync` against\n * the resolved-once process env. The decode path then funnels into\n * `decodeBech32Secret`. */\nexport const resolveEnvVariant = (\n\targs: EnvVariantArgs,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> =>\n\tEffect.gen(function* () {\n\t\t// Stub: read env, refuse empty / missing.\n\t\tconst bech32 = yield* Effect.sync((): string | undefined => {\n\t\t\tconst proc = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n\t\t\t\t.process;\n\t\t\treturn proc?.env?.[args.varName];\n\t\t}).pipe(\n\t\t\tEffect.flatMap((v) =>\n\t\t\t\tv === undefined || v === ''\n\t\t\t\t\t? Effect.fail(\n\t\t\t\t\t\t\taccountAcquireError({\n\t\t\t\t\t\t\t\tphase: 'read-env',\n\t\t\t\t\t\t\t\taccountName: args.name,\n\t\t\t\t\t\t\t\tvariant: 'env',\n\t\t\t\t\t\t\t\t// Reference the variable's NAME only — never the value.\n\t\t\t\t\t\t\t\tmessage: `Account '${args.name}': env var '${args.varName}' is missing or empty.`,\n\t\t\t\t\t\t\t\thint: `Set ${args.varName}=suiprivkey1... in the process environment.`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.succeed(v),\n\t\t\t),\n\t\t);\n\t\treturn yield* decodeBech32Secret(bech32, args.name, 'env');\n\t});\n"],"mappings":";;;;;;;;;AAuBA,MAAa,qBACZ,SAEA,OAAO,IAAI,aAAa;AAsBvB,QAAO,OAAO,mBAAmB,OApBX,OAAO,WAA+B;AAG3D,SAFc,WACZ,SACW,MAAM,KAAK;GACvB,CAAC,KACF,OAAO,SAAS,MACf,MAAM,KAAA,KAAa,MAAM,KACtB,OAAO,KACP,oBAAoB;EACnB,OAAO;EACP,aAAa,KAAK;EAClB,SAAS;EAET,SAAS,YAAY,KAAK,KAAK,cAAc,KAAK,QAAQ;EAC1D,MAAM,OAAO,KAAK,QAAQ;EAC1B,CAAC,CACF,GACA,OAAO,QAAQ,EAAE,CACpB,CACD,EACwC,KAAK,MAAM,MAAM;EACzD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { accountAcquireError } from "../errors.mjs";
|
|
2
|
+
import { decodeBech32Secret, generateEd25519Keypair } from "../keypair.mjs";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import * as nodeFs from "node:fs/promises";
|
|
6
|
+
//#region src/plugins/account/variants/ephemeral.ts
|
|
7
|
+
const isErrnoCode = (cause, code) => typeof cause === "object" && cause !== null && "code" in cause && cause.code === code;
|
|
8
|
+
const bestEffortChmod = (path, mode) => Effect.promise(() => nodeFs.chmod(path, mode)).pipe(Effect.ignore);
|
|
9
|
+
const readPersistedKeypair = (args, message) => Effect.gen(function* () {
|
|
10
|
+
const raw = yield* Effect.tryPromise({
|
|
11
|
+
try: () => nodeFs.readFile(args.secretFilePath, "utf8"),
|
|
12
|
+
catch: (cause) => accountAcquireError({
|
|
13
|
+
phase: "read-persisted-keypair",
|
|
14
|
+
accountName: args.name,
|
|
15
|
+
variant: "ephemeral",
|
|
16
|
+
message,
|
|
17
|
+
cause
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
yield* bestEffortChmod(args.secretFilePath, 384);
|
|
21
|
+
return yield* decodeBech32Secret(raw.trim(), args.name, "ephemeral");
|
|
22
|
+
});
|
|
23
|
+
const readPersistedKeypairIfPresent = (args) => readPersistedKeypair(args, `Account '${args.name}': failed to read persisted ephemeral keypair at ${args.secretFilePath}.`).pipe(Effect.catch((cause) => isErrnoCode(cause.cause, "ENOENT") ? Effect.succeed(null) : Effect.fail(cause)));
|
|
24
|
+
const persistGeneratedSecret = (args, secret) => Effect.tryPromise({
|
|
25
|
+
try: async () => {
|
|
26
|
+
await nodeFs.mkdir(dirname(args.secretFilePath), {
|
|
27
|
+
recursive: true,
|
|
28
|
+
mode: 448
|
|
29
|
+
});
|
|
30
|
+
await nodeFs.chmod(dirname(args.secretFilePath), 448).catch(() => {});
|
|
31
|
+
try {
|
|
32
|
+
await nodeFs.writeFile(args.secretFilePath, secret, {
|
|
33
|
+
flag: "wx",
|
|
34
|
+
mode: 384
|
|
35
|
+
});
|
|
36
|
+
return "wrote";
|
|
37
|
+
} catch (cause) {
|
|
38
|
+
if (isErrnoCode(cause, "EEXIST")) return "exists";
|
|
39
|
+
throw cause;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
catch: (cause) => accountAcquireError({
|
|
43
|
+
phase: "persist-keypair",
|
|
44
|
+
accountName: args.name,
|
|
45
|
+
variant: "ephemeral",
|
|
46
|
+
message: `Account '${args.name}': failed to persist ephemeral keypair at ${args.secretFilePath}.`,
|
|
47
|
+
cause
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
/** Resolve the ephemeral variant — read or generate an Ed25519 keypair.
|
|
51
|
+
*
|
|
52
|
+
* First-time writes use O_EXCL so parallel acquires for the same
|
|
53
|
+
* account cannot both publish different addresses; the loser re-reads
|
|
54
|
+
* the winner's file and returns the persisted identity. */
|
|
55
|
+
const resolveEphemeralVariant = (args) => Effect.gen(function* () {
|
|
56
|
+
const persisted = yield* readPersistedKeypairIfPresent(args);
|
|
57
|
+
if (persisted !== null) return persisted;
|
|
58
|
+
const generated = yield* generateEd25519Keypair(args.name);
|
|
59
|
+
if (generated.bech32Secret === null) return yield* Effect.fail(accountAcquireError({
|
|
60
|
+
phase: "generate-keypair",
|
|
61
|
+
accountName: args.name,
|
|
62
|
+
variant: "ephemeral",
|
|
63
|
+
message: `Account '${args.name}': generated keypair did not expose a bech32 secret.`
|
|
64
|
+
}));
|
|
65
|
+
if ((yield* persistGeneratedSecret(args, generated.bech32Secret)) === "exists") return yield* readPersistedKeypair(args, `Account '${args.name}': lost ephemeral keypair write race at ${args.secretFilePath} and failed to read the winner.`);
|
|
66
|
+
yield* bestEffortChmod(args.secretFilePath, 384);
|
|
67
|
+
return generated;
|
|
68
|
+
});
|
|
69
|
+
//#endregion
|
|
70
|
+
export { resolveEphemeralVariant };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=ephemeral.mjs.map
|