gate-evm-tools 1.0.27 → 1.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/bin/cli.js +3 -0
- package/bin/delivery.cjs +51 -0
- package/bin/manifest-bootstrap.js +4 -15
- package/bin/workflow.cjs +1 -1
- package/dist/commands/plan/file-store.d.ts.map +1 -0
- package/dist/commands/plan/generate-deployment.d.ts +48 -0
- package/dist/commands/plan/generate-deployment.d.ts.map +1 -0
- package/dist/commands/plan/generate-deployment.js +211 -0
- package/dist/commands/plan/generate-deployment.js.map +1 -0
- package/dist/commands/plan/helpers.d.ts.map +1 -0
- package/dist/commands/plan/index.d.ts +3 -0
- package/dist/commands/plan/index.d.ts.map +1 -0
- package/dist/commands/plan/index.js +88 -0
- package/dist/commands/plan/index.js.map +1 -0
- package/dist/commands/sync.js +1 -1
- package/dist/commands/sync.js.map +1 -1
- package/dist/core/BytecodeChecker.d.ts.map +1 -1
- package/dist/core/BytecodeChecker.js +27 -8
- package/dist/core/BytecodeChecker.js.map +1 -1
- package/dist/core/preparation/artifacts.d.ts +2 -0
- package/dist/core/preparation/artifacts.d.ts.map +1 -1
- package/dist/core/preparation/artifacts.js +9 -3
- package/dist/core/preparation/artifacts.js.map +1 -1
- package/dist/core/preparation/evm.d.ts +38 -2
- package/dist/core/preparation/evm.d.ts.map +1 -1
- package/dist/core/preparation/evm.js +104 -32
- package/dist/core/preparation/evm.js.map +1 -1
- package/dist/core/preparation/evmManifestSync.d.ts +63 -0
- package/dist/core/preparation/evmManifestSync.d.ts.map +1 -0
- package/dist/core/preparation/evmManifestSync.js +146 -0
- package/dist/core/preparation/evmManifestSync.js.map +1 -0
- package/dist/core/preparation/index.d.ts +40 -2
- package/dist/core/preparation/index.d.ts.map +1 -1
- package/dist/core/preparation/index.js +3 -3
- package/dist/core/preparation/index.js.map +1 -1
- package/dist/core/preparation/manifest.d.ts +15 -3
- package/dist/core/preparation/manifest.d.ts.map +1 -1
- package/dist/core/preparation/manifest.js +21 -26
- package/dist/core/preparation/manifest.js.map +1 -1
- package/dist/core/preparation/normalize.d.ts.map +1 -1
- package/dist/core/preparation/normalize.js +14 -9
- package/dist/core/preparation/normalize.js.map +1 -1
- package/dist/core/preparation/types.d.ts +7 -2
- package/dist/core/preparation/types.d.ts.map +1 -1
- package/dist/custody/hardhat-runtime.d.ts.map +1 -1
- package/dist/custody/hardhat-runtime.js +2 -0
- package/dist/custody/hardhat-runtime.js.map +1 -1
- package/dist/custody/hardhat.d.ts +1 -0
- package/dist/custody/hardhat.d.ts.map +1 -1
- package/dist/custody/hardhat.js +1 -0
- package/dist/custody/hardhat.js.map +1 -1
- package/dist/custody/index.d.ts +1 -0
- package/dist/custody/index.d.ts.map +1 -1
- package/dist/custody/index.js +1 -0
- package/dist/custody/index.js.map +1 -1
- package/dist/custody/provider-wait.d.ts +13 -0
- package/dist/custody/provider-wait.d.ts.map +1 -0
- package/dist/custody/provider-wait.js +78 -0
- package/dist/custody/provider-wait.js.map +1 -0
- package/dist/delivery/policy.d.ts +6 -0
- package/dist/delivery/policy.d.ts.map +1 -0
- package/dist/delivery/policy.js +24 -0
- package/dist/delivery/policy.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/sync/index.d.ts +15 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +8 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/workflow/index.d.ts +6 -1
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +4 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist-cjs/core/BytecodeChecker.js +526 -0
- package/dist-cjs/core/BytecodeChecker.js.map +1 -0
- package/dist-cjs/core/legacyProxyArtifact.js +42 -0
- package/dist-cjs/core/legacyProxyArtifact.js.map +1 -0
- package/dist-cjs/core/preparation/artifacts.js +11 -4
- package/dist-cjs/core/preparation/artifacts.js.map +1 -1
- package/dist-cjs/core/preparation/evm.js +105 -32
- package/dist-cjs/core/preparation/evm.js.map +1 -1
- package/dist-cjs/core/preparation/evmManifestSync.js +155 -0
- package/dist-cjs/core/preparation/evmManifestSync.js.map +1 -0
- package/dist-cjs/core/preparation/index.js +3 -3
- package/dist-cjs/core/preparation/index.js.map +1 -1
- package/dist-cjs/core/preparation/manifest.js +23 -28
- package/dist-cjs/core/preparation/manifest.js.map +1 -1
- package/dist-cjs/core/preparation/normalize.js +14 -9
- package/dist-cjs/core/preparation/normalize.js.map +1 -1
- package/dist-cjs/custody/hardhat-runtime.js +2 -0
- package/dist-cjs/custody/hardhat-runtime.js.map +1 -1
- package/dist-cjs/custody/hardhat.js +3 -1
- package/dist-cjs/custody/hardhat.js.map +1 -1
- package/dist-cjs/custody/index.js +3 -1
- package/dist-cjs/custody/index.js.map +1 -1
- package/dist-cjs/custody/provider-wait.js +81 -0
- package/dist-cjs/custody/provider-wait.js.map +1 -0
- package/dist-cjs/delivery/policy.js +29 -0
- package/dist-cjs/delivery/policy.js.map +1 -0
- package/dist-cjs/sync/index.js +8 -0
- package/dist-cjs/sync/index.js.map +1 -1
- package/dist-cjs/workflow/index.js +12 -1
- package/dist-cjs/workflow/index.js.map +1 -1
- package/dist-runtime/config/hardhatAdapters.d.ts +2 -0
- package/dist-runtime/config/hardhatAdapters.js +8 -0
- package/dist-runtime/config/hardhatAdapters.js.map +1 -1
- package/dist-runtime/config/networks.d.ts +25 -1
- package/dist-runtime/config/networks.js +8 -2
- package/dist-runtime/config/networks.js.map +1 -1
- package/dist-runtime/config/openzeppelin.d.ts +2 -1
- package/dist-runtime/config/openzeppelin.js +2 -19
- package/dist-runtime/config/openzeppelin.js.map +1 -1
- package/dist-runtime/delivery/abi.d.ts +14 -0
- package/dist-runtime/delivery/abi.js +161 -0
- package/dist-runtime/delivery/abi.js.map +1 -0
- package/dist-runtime/delivery/aggregate-bootstrap.d.ts +12 -0
- package/dist-runtime/delivery/aggregate-bootstrap.js +40 -0
- package/dist-runtime/delivery/aggregate-bootstrap.js.map +1 -0
- package/dist-runtime/delivery/aggregate-channel.d.ts +28 -0
- package/dist-runtime/delivery/aggregate-channel.js +155 -0
- package/dist-runtime/delivery/aggregate-channel.js.map +1 -0
- package/dist-runtime/delivery/aggregate-inputs.d.ts +168 -0
- package/dist-runtime/delivery/aggregate-inputs.js +57 -0
- package/dist-runtime/delivery/aggregate-inputs.js.map +1 -0
- package/dist-runtime/delivery/aggregate-source.d.ts +25 -0
- package/dist-runtime/delivery/aggregate-source.js +79 -0
- package/dist-runtime/delivery/aggregate-source.js.map +1 -0
- package/dist-runtime/delivery/aggregate-worker.d.ts +1 -0
- package/dist-runtime/delivery/aggregate-worker.js +191 -0
- package/dist-runtime/delivery/aggregate-worker.js.map +1 -0
- package/dist-runtime/delivery/aggregate.d.ts +51 -0
- package/dist-runtime/delivery/aggregate.js +190 -0
- package/dist-runtime/delivery/aggregate.js.map +1 -0
- package/dist-runtime/delivery/bindings.d.ts +21 -0
- package/dist-runtime/delivery/bindings.js +53 -0
- package/dist-runtime/delivery/bindings.js.map +1 -0
- package/dist-runtime/delivery/check-code.d.ts +19 -0
- package/dist-runtime/delivery/check-code.js +63 -0
- package/dist-runtime/delivery/check-code.js.map +1 -0
- package/dist-runtime/delivery/closure-format.d.ts +77 -0
- package/dist-runtime/delivery/closure-format.js +225 -0
- package/dist-runtime/delivery/closure-format.js.map +1 -0
- package/dist-runtime/delivery/codec-pin.d.ts +2 -0
- package/dist-runtime/delivery/codec-pin.js +7 -0
- package/dist-runtime/delivery/codec-pin.js.map +1 -0
- package/dist-runtime/delivery/codec.d.ts +19 -0
- package/dist-runtime/delivery/codec.js +73 -0
- package/dist-runtime/delivery/codec.js.map +1 -0
- package/dist-runtime/delivery/compiler-dependency-pins.d.ts +7 -0
- package/dist-runtime/delivery/compiler-dependency-pins.js +1689 -0
- package/dist-runtime/delivery/compiler-dependency-pins.js.map +1 -0
- package/dist-runtime/delivery/compiler-files.d.ts +40 -0
- package/dist-runtime/delivery/compiler-files.js +220 -0
- package/dist-runtime/delivery/compiler-files.js.map +1 -0
- package/dist-runtime/delivery/compiler-io.d.ts +2 -0
- package/dist-runtime/delivery/compiler-io.js +13 -0
- package/dist-runtime/delivery/compiler-io.js.map +1 -0
- package/dist-runtime/delivery/compiler-pins.d.ts +10 -0
- package/dist-runtime/delivery/compiler-pins.js +147 -0
- package/dist-runtime/delivery/compiler-pins.js.map +1 -0
- package/dist-runtime/delivery/compiler.d.ts +188 -0
- package/dist-runtime/delivery/compiler.js +850 -0
- package/dist-runtime/delivery/compiler.js.map +1 -0
- package/dist-runtime/delivery/config.d.ts +48 -0
- package/dist-runtime/delivery/config.js +99 -0
- package/dist-runtime/delivery/config.js.map +1 -0
- package/dist-runtime/delivery/configuration-definition.d.ts +22 -0
- package/dist-runtime/delivery/configuration-definition.js +316 -0
- package/dist-runtime/delivery/configuration-definition.js.map +1 -0
- package/dist-runtime/delivery/configuration-hre.d.ts +17 -0
- package/dist-runtime/delivery/configuration-hre.js +198 -0
- package/dist-runtime/delivery/configuration-hre.js.map +1 -0
- package/dist-runtime/delivery/configuration-runtime.d.ts +36 -0
- package/dist-runtime/delivery/configuration-runtime.js +248 -0
- package/dist-runtime/delivery/configuration-runtime.js.map +1 -0
- package/dist-runtime/delivery/configuration.d.ts +35 -0
- package/dist-runtime/delivery/configuration.js +83 -0
- package/dist-runtime/delivery/configuration.js.map +1 -0
- package/dist-runtime/delivery/create2.d.ts +3 -0
- package/dist-runtime/delivery/create2.js +48 -0
- package/dist-runtime/delivery/create2.js.map +1 -0
- package/dist-runtime/delivery/custom-closure.d.ts +27 -0
- package/dist-runtime/delivery/custom-closure.js +818 -0
- package/dist-runtime/delivery/custom-closure.js.map +1 -0
- package/dist-runtime/delivery/custom-format.d.ts +35 -0
- package/dist-runtime/delivery/custom-format.js +383 -0
- package/dist-runtime/delivery/custom-format.js.map +1 -0
- package/dist-runtime/delivery/custom.d.ts +32 -0
- package/dist-runtime/delivery/custom.js +158 -0
- package/dist-runtime/delivery/custom.js.map +1 -0
- package/dist-runtime/delivery/data.d.ts +7 -0
- package/dist-runtime/delivery/data.js +86 -0
- package/dist-runtime/delivery/data.js.map +1 -0
- package/dist-runtime/delivery/development.d.ts +91 -0
- package/dist-runtime/delivery/development.js +395 -0
- package/dist-runtime/delivery/development.js.map +1 -0
- package/dist-runtime/delivery/engine.d.ts +9 -0
- package/dist-runtime/delivery/engine.js +23 -0
- package/dist-runtime/delivery/engine.js.map +1 -0
- package/dist-runtime/delivery/eoa-observation.d.ts +43 -0
- package/dist-runtime/delivery/eoa-observation.js +145 -0
- package/dist-runtime/delivery/eoa-observation.js.map +1 -0
- package/dist-runtime/delivery/eoa-signed.d.ts +2 -0
- package/dist-runtime/delivery/eoa-signed.js +74 -0
- package/dist-runtime/delivery/eoa-signed.js.map +1 -0
- package/dist-runtime/delivery/eoa.d.ts +81 -0
- package/dist-runtime/delivery/eoa.js +274 -0
- package/dist-runtime/delivery/eoa.js.map +1 -0
- package/dist-runtime/delivery/execution-db.d.ts +20 -0
- package/dist-runtime/delivery/execution-db.js +153 -0
- package/dist-runtime/delivery/execution-db.js.map +1 -0
- package/dist-runtime/delivery/execution-files.d.ts +9 -0
- package/dist-runtime/delivery/execution-files.js +138 -0
- package/dist-runtime/delivery/execution-files.js.map +1 -0
- package/dist-runtime/delivery/execution-model.d.ts +56 -0
- package/dist-runtime/delivery/execution-model.js +66 -0
- package/dist-runtime/delivery/execution-model.js.map +1 -0
- package/dist-runtime/delivery/execution-store.d.ts +48 -0
- package/dist-runtime/delivery/execution-store.js +361 -0
- package/dist-runtime/delivery/execution-store.js.map +1 -0
- package/dist-runtime/delivery/existing-code.d.ts +37 -0
- package/dist-runtime/delivery/existing-code.js +75 -0
- package/dist-runtime/delivery/existing-code.js.map +1 -0
- package/dist-runtime/delivery/export.d.ts +51 -0
- package/dist-runtime/delivery/export.js +69 -0
- package/dist-runtime/delivery/export.js.map +1 -0
- package/dist-runtime/delivery/forkAudit.d.ts +119 -0
- package/dist-runtime/delivery/forkAudit.js +473 -0
- package/dist-runtime/delivery/forkAudit.js.map +1 -0
- package/dist-runtime/delivery/hardhat.d.ts +3 -0
- package/dist-runtime/delivery/hardhat.js +45 -0
- package/dist-runtime/delivery/hardhat.js.map +1 -0
- package/dist-runtime/delivery/history-registration.d.ts +2 -0
- package/dist-runtime/delivery/history-registration.js +17 -0
- package/dist-runtime/delivery/history-registration.js.map +1 -0
- package/dist-runtime/delivery/identities.d.ts +22 -0
- package/dist-runtime/delivery/identities.js +97 -0
- package/dist-runtime/delivery/identities.js.map +1 -0
- package/dist-runtime/delivery/input-files.d.ts +5 -0
- package/dist-runtime/delivery/input-files.js +70 -0
- package/dist-runtime/delivery/input-files.js.map +1 -0
- package/dist-runtime/delivery/inputs.d.ts +62 -0
- package/dist-runtime/delivery/inputs.js +187 -0
- package/dist-runtime/delivery/inputs.js.map +1 -0
- package/dist-runtime/delivery/journal.d.ts +35 -0
- package/dist-runtime/delivery/journal.js +270 -0
- package/dist-runtime/delivery/journal.js.map +1 -0
- package/dist-runtime/delivery/manifest.d.ts +14 -0
- package/dist-runtime/delivery/manifest.js +68 -0
- package/dist-runtime/delivery/manifest.js.map +1 -0
- package/dist-runtime/delivery/materialization.d.ts +20 -0
- package/dist-runtime/delivery/materialization.js +138 -0
- package/dist-runtime/delivery/materialization.js.map +1 -0
- package/dist-runtime/delivery/observations.d.ts +31 -0
- package/dist-runtime/delivery/observations.js +38 -0
- package/dist-runtime/delivery/observations.js.map +1 -0
- package/dist-runtime/delivery/parameters.d.ts +53 -0
- package/dist-runtime/delivery/parameters.js +257 -0
- package/dist-runtime/delivery/parameters.js.map +1 -0
- package/dist-runtime/delivery/pending.d.ts +70 -0
- package/dist-runtime/delivery/pending.js +99 -0
- package/dist-runtime/delivery/pending.js.map +1 -0
- package/dist-runtime/delivery/plan.d.ts +50 -0
- package/dist-runtime/delivery/plan.js +209 -0
- package/dist-runtime/delivery/plan.js.map +1 -0
- package/dist-runtime/delivery/planning.d.ts +81 -0
- package/dist-runtime/delivery/planning.js +302 -0
- package/dist-runtime/delivery/planning.js.map +1 -0
- package/dist-runtime/delivery/policy.d.ts +4 -0
- package/dist-runtime/delivery/policy.js +9 -0
- package/dist-runtime/delivery/policy.js.map +1 -0
- package/dist-runtime/delivery/preparation.d.ts +6 -0
- package/dist-runtime/delivery/preparation.js +158 -0
- package/dist-runtime/delivery/preparation.js.map +1 -0
- package/dist-runtime/delivery/production-environment.d.ts +2 -0
- package/dist-runtime/delivery/production-environment.js +12 -0
- package/dist-runtime/delivery/production-environment.js.map +1 -0
- package/dist-runtime/delivery/production-finalization.d.ts +86 -0
- package/dist-runtime/delivery/production-finalization.js +278 -0
- package/dist-runtime/delivery/production-finalization.js.map +1 -0
- package/dist-runtime/delivery/production.d.ts +461 -0
- package/dist-runtime/delivery/production.js +396 -0
- package/dist-runtime/delivery/production.js.map +1 -0
- package/dist-runtime/delivery/project-files.d.ts +8 -0
- package/dist-runtime/delivery/project-files.js +82 -0
- package/dist-runtime/delivery/project-files.js.map +1 -0
- package/dist-runtime/delivery/project.d.ts +15 -0
- package/dist-runtime/delivery/project.js +157 -0
- package/dist-runtime/delivery/project.js.map +1 -0
- package/dist-runtime/delivery/protocol.d.ts +49 -0
- package/dist-runtime/delivery/protocol.js +112 -0
- package/dist-runtime/delivery/protocol.js.map +1 -0
- package/dist-runtime/delivery/references.d.ts +19 -0
- package/dist-runtime/delivery/references.js +84 -0
- package/dist-runtime/delivery/references.js.map +1 -0
- package/dist-runtime/delivery/release-graph.d.ts +93 -0
- package/dist-runtime/delivery/release-graph.js +106 -0
- package/dist-runtime/delivery/release-graph.js.map +1 -0
- package/dist-runtime/delivery/release-history-capture.d.ts +7 -0
- package/dist-runtime/delivery/release-history-capture.js +76 -0
- package/dist-runtime/delivery/release-history-capture.js.map +1 -0
- package/dist-runtime/delivery/release-history.d.ts +43 -0
- package/dist-runtime/delivery/release-history.js +246 -0
- package/dist-runtime/delivery/release-history.js.map +1 -0
- package/dist-runtime/delivery/release.d.ts +172 -0
- package/dist-runtime/delivery/release.js +209 -0
- package/dist-runtime/delivery/release.js.map +1 -0
- package/dist-runtime/delivery/safe-manifest.d.ts +9 -0
- package/dist-runtime/delivery/safe-manifest.js +13 -0
- package/dist-runtime/delivery/safe-manifest.js.map +1 -0
- package/dist-runtime/delivery/safe-observation.d.ts +30 -0
- package/dist-runtime/delivery/safe-observation.js +487 -0
- package/dist-runtime/delivery/safe-observation.js.map +1 -0
- package/dist-runtime/delivery/safe-prepare.d.ts +13 -0
- package/dist-runtime/delivery/safe-prepare.js +81 -0
- package/dist-runtime/delivery/safe-prepare.js.map +1 -0
- package/dist-runtime/delivery/safe.d.ts +91 -0
- package/dist-runtime/delivery/safe.js +243 -0
- package/dist-runtime/delivery/safe.js.map +1 -0
- package/dist-runtime/delivery/same-fork-baseline.d.ts +8 -0
- package/dist-runtime/delivery/same-fork-baseline.js +20 -0
- package/dist-runtime/delivery/same-fork-baseline.js.map +1 -0
- package/dist-runtime/delivery/setup.d.ts +31 -0
- package/dist-runtime/delivery/setup.js +215 -0
- package/dist-runtime/delivery/setup.js.map +1 -0
- package/dist-runtime/delivery/source.d.ts +41 -0
- package/dist-runtime/delivery/source.js +137 -0
- package/dist-runtime/delivery/source.js.map +1 -0
- package/dist-runtime/delivery/target-fields.d.ts +2 -0
- package/dist-runtime/delivery/target-fields.js +11 -0
- package/dist-runtime/delivery/target-fields.js.map +1 -0
- package/dist-runtime/delivery/validation.d.ts +9 -0
- package/dist-runtime/delivery/validation.js +150 -0
- package/dist-runtime/delivery/validation.js.map +1 -0
- package/dist-runtime/delivery/verification.d.ts +16 -0
- package/dist-runtime/delivery/verification.js +65 -0
- package/dist-runtime/delivery/verification.js.map +1 -0
- package/dist-runtime/migrate.js +1 -0
- package/dist-runtime/migrate.js.map +1 -1
- package/dist-runtime/miner/binary.d.ts +2 -0
- package/dist-runtime/miner/binary.js +54 -0
- package/dist-runtime/miner/binary.js.map +1 -0
- package/dist-runtime/miner/cli.d.ts +1 -0
- package/dist-runtime/miner/cli.js +131 -0
- package/dist-runtime/miner/cli.js.map +1 -0
- package/dist-runtime/miner/index.d.ts +5 -0
- package/dist-runtime/miner/index.js +13 -0
- package/dist-runtime/miner/index.js.map +1 -0
- package/dist-runtime/miner/request.d.ts +7 -0
- package/dist-runtime/miner/request.js +73 -0
- package/dist-runtime/miner/request.js.map +1 -0
- package/dist-runtime/miner/runner.d.ts +2 -0
- package/dist-runtime/miner/runner.js +131 -0
- package/dist-runtime/miner/runner.js.map +1 -0
- package/dist-runtime/miner/types.d.ts +89 -0
- package/dist-runtime/miner/types.js +3 -0
- package/dist-runtime/miner/types.js.map +1 -0
- package/dist-runtime/miner/verify.d.ts +2 -0
- package/dist-runtime/miner/verify.js +75 -0
- package/dist-runtime/miner/verify.js.map +1 -0
- package/dist-runtime/runtime-identity.json +2 -2
- package/dist-runtime/vendor/plan-codec/index.cjs +820 -0
- package/dist-runtime/vendor/plan-codec/index.d.cts +32 -0
- package/dist-runtime/vendor/plan-codec/provenance.json +24 -0
- package/dist-runtime/workflow/engine.d.ts +14 -0
- package/dist-runtime/workflow/engine.js +160 -0
- package/dist-runtime/workflow/engine.js.map +1 -0
- package/dist-runtime/workflow/lib/authority.d.ts +6 -3
- package/dist-runtime/workflow/lib/authority.js.map +1 -1
- package/dist-runtime/workflow/lib/calls.d.ts +1 -1
- package/dist-runtime/workflow/lib/calls.js +43 -34
- package/dist-runtime/workflow/lib/calls.js.map +1 -1
- package/dist-runtime/workflow/lib/canonicalData.d.ts +8 -0
- package/dist-runtime/workflow/lib/canonicalData.js +68 -0
- package/dist-runtime/workflow/lib/canonicalData.js.map +1 -0
- package/dist-runtime/workflow/lib/config.d.ts +3 -1
- package/dist-runtime/workflow/lib/config.js.map +1 -1
- package/dist-runtime/workflow/lib/context.d.ts +76 -0
- package/dist-runtime/workflow/lib/context.js +3 -0
- package/dist-runtime/workflow/lib/context.js.map +1 -0
- package/dist-runtime/workflow/lib/controlledMulticallAbi.d.ts +2 -0
- package/dist-runtime/workflow/lib/controlledMulticallAbi.js +10 -0
- package/dist-runtime/workflow/lib/controlledMulticallAbi.js.map +1 -0
- package/dist-runtime/workflow/lib/create2.d.ts +1 -1
- package/dist-runtime/workflow/lib/create2.js +9 -12
- package/dist-runtime/workflow/lib/create2.js.map +1 -1
- package/dist-runtime/workflow/lib/deployments.d.ts +5 -5
- package/dist-runtime/workflow/lib/deployments.js +5 -13
- package/dist-runtime/workflow/lib/deployments.js.map +1 -1
- package/dist-runtime/workflow/lib/evidencePorts.d.ts +55 -0
- package/dist-runtime/workflow/lib/evidencePorts.js +3 -0
- package/dist-runtime/workflow/lib/evidencePorts.js.map +1 -0
- package/dist-runtime/workflow/lib/executionPlan.d.ts +4 -42
- package/dist-runtime/workflow/lib/executionPlan.js +15 -210
- package/dist-runtime/workflow/lib/executionPlan.js.map +1 -1
- package/dist-runtime/workflow/lib/gateTool.d.ts +6 -2
- package/dist-runtime/workflow/lib/gateTool.js +20 -10
- package/dist-runtime/workflow/lib/gateTool.js.map +1 -1
- package/dist-runtime/workflow/lib/gateToolSync.d.ts +1 -1
- package/dist-runtime/workflow/lib/gateToolSync.js +3 -2
- package/dist-runtime/workflow/lib/gateToolSync.js.map +1 -1
- package/dist-runtime/workflow/lib/operationNames.d.ts +3 -0
- package/dist-runtime/workflow/lib/operationNames.js +34 -0
- package/dist-runtime/workflow/lib/operationNames.js.map +1 -0
- package/dist-runtime/workflow/lib/parameters.d.ts +1 -1
- package/dist-runtime/workflow/lib/parameters.js +9 -24
- package/dist-runtime/workflow/lib/parameters.js.map +1 -1
- package/dist-runtime/workflow/lib/pendingDeploymentReuse.js +18 -52
- package/dist-runtime/workflow/lib/pendingDeploymentReuse.js.map +1 -1
- package/dist-runtime/workflow/lib/pendingUupsBinding.d.ts +42 -0
- package/dist-runtime/workflow/lib/pendingUupsBinding.js +39 -0
- package/dist-runtime/workflow/lib/pendingUupsBinding.js.map +1 -0
- package/dist-runtime/workflow/lib/plan.d.ts +55 -0
- package/dist-runtime/workflow/lib/plan.js +324 -0
- package/dist-runtime/workflow/lib/plan.js.map +1 -0
- package/dist-runtime/workflow/lib/planCli.d.ts +14 -0
- package/dist-runtime/workflow/lib/planCli.js +279 -0
- package/dist-runtime/workflow/lib/planCli.js.map +1 -0
- package/dist-runtime/workflow/lib/preparationEvidence.d.ts +4 -0
- package/dist-runtime/workflow/lib/preparationEvidence.js +19 -0
- package/dist-runtime/workflow/lib/preparationEvidence.js.map +1 -0
- package/dist-runtime/workflow/lib/proxy.d.ts +3 -2
- package/dist-runtime/workflow/lib/proxy.js +3 -4
- package/dist-runtime/workflow/lib/proxy.js.map +1 -1
- package/dist-runtime/workflow/lib/runtime.d.ts +6 -0
- package/dist-runtime/workflow/lib/runtime.js +48 -0
- package/dist-runtime/workflow/lib/runtime.js.map +1 -0
- package/dist-runtime/workflow/lib/signer.d.ts +3 -2
- package/dist-runtime/workflow/lib/signer.js +18 -18
- package/dist-runtime/workflow/lib/signer.js.map +1 -1
- package/dist-runtime/workflow/lib/simulation.d.ts +13 -6
- package/dist-runtime/workflow/lib/simulation.js +39 -31
- package/dist-runtime/workflow/lib/simulation.js.map +1 -1
- package/dist-runtime/workflow/lib/state.js +3 -3
- package/dist-runtime/workflow/lib/state.js.map +1 -1
- package/dist-runtime/workflow/lib/staticValidation.d.ts +28 -0
- package/dist-runtime/workflow/lib/staticValidation.js +54 -10
- package/dist-runtime/workflow/lib/staticValidation.js.map +1 -1
- package/dist-runtime/workflow/lib/transactionPlanner.d.ts +62 -0
- package/dist-runtime/workflow/lib/transactionPlanner.js +258 -0
- package/dist-runtime/workflow/lib/transactionPlanner.js.map +1 -0
- package/dist-runtime/workflow/lib/typedValue.d.ts +3 -0
- package/dist-runtime/workflow/lib/typedValue.js +76 -0
- package/dist-runtime/workflow/lib/typedValue.js.map +1 -0
- package/dist-runtime/workflow/lib/validation.d.ts +23 -0
- package/dist-runtime/workflow/lib/validation.js +15 -0
- package/dist-runtime/workflow/lib/validation.js.map +1 -0
- package/dist-runtime/workflow/planAdd.d.ts +1 -0
- package/dist-runtime/workflow/planAdd.js +11 -0
- package/dist-runtime/workflow/planAdd.js.map +1 -0
- package/dist-runtime/workflow/planRead.d.ts +1 -0
- package/dist-runtime/workflow/planRead.js +11 -0
- package/dist-runtime/workflow/planRead.js.map +1 -0
- package/dist-runtime/workflow/planStatus.d.ts +1 -0
- package/dist-runtime/workflow/planStatus.js +11 -0
- package/dist-runtime/workflow/planStatus.js.map +1 -0
- package/dist-runtime/workflow/planWrite.d.ts +1 -0
- package/dist-runtime/workflow/planWrite.js +11 -0
- package/dist-runtime/workflow/planWrite.js.map +1 -0
- package/dist-runtime/workflow/run.d.ts +1 -40
- package/dist-runtime/workflow/run.js +68 -136
- package/dist-runtime/workflow/run.js.map +1 -1
- package/dist-runtime/workflow/staticValidate.js +8 -3
- package/dist-runtime/workflow/staticValidate.js.map +1 -1
- package/dist-runtime/workflow/steps/call.d.ts +1 -1
- package/dist-runtime/workflow/steps/check.d.ts +1 -1
- package/dist-runtime/workflow/steps/custom.d.ts +1 -1
- package/dist-runtime/workflow/steps/deploy.d.ts +1 -1
- package/dist-runtime/workflow/steps/deploy.js +58 -55
- package/dist-runtime/workflow/steps/deploy.js.map +1 -1
- package/dist-runtime/workflow/steps/upgrade.d.ts +1 -1
- package/dist-runtime/workflow/steps/upgrade.js +63 -41
- package/dist-runtime/workflow/steps/upgrade.js.map +1 -1
- package/dist-runtime/workflow/steps/view.d.ts +1 -1
- package/docs/compiler-qualification.md +32 -0
- package/docs/configuration-runtime-observation.md +29 -0
- package/docs/create2-miner.md +100 -0
- package/docs/delivery-aggregate.md +27 -0
- package/docs/delivery-custom-input-closure.md +51 -0
- package/docs/delivery-development.md +32 -0
- package/docs/delivery-eoa.md +46 -0
- package/docs/delivery-evm-manifest.md +20 -0
- package/docs/delivery-execution-store.md +33 -0
- package/docs/delivery-inputs.md +46 -0
- package/docs/delivery-parameters.md +65 -0
- package/docs/delivery-planning.md +140 -0
- package/docs/delivery-release.md +65 -0
- package/docs/delivery-safe.md +72 -0
- package/docs/delivery-setup.md +146 -0
- package/docs/delivery-source.md +67 -0
- package/docs/direct-package-acceptance.md +20 -0
- package/docs/external-infrastructure-acceptance.md +33 -0
- package/docs/network-runtime-acceptance.md +18 -0
- package/docs/plans/2026-09-09-workflow-extraction.md +16 -0
- package/docs/superpowers/plans/2026-07-22-manifest-bootstrap-transaction.md +50 -0
- package/docs/superpowers/plans/2026-07-22-manifest-review-remediation.md +49 -0
- package/docs/superpowers/plans/2026-08-17-custody-hardhat-signers.md +227 -0
- package/docs/superpowers/plans/2026-09-09-remove-template-infrastructure-contracts.md +11 -0
- package/docs/superpowers/plans/2026-09-24-scheme-aware-static-validation.md +193 -0
- package/docs/superpowers/plans/2026-10-28-create2-miner.md +82 -0
- package/docs/workflow-reference.md +1181 -0
- package/docs/workflow-runtime-acceptance.md +17 -0
- package/docs/workflow-runtime.md +56 -0
- package/package.json +134 -9
- package/resources/create2/LICENSE +21 -0
- package/resources/create2/README.md +9 -0
- package/resources/create2/darwin-arm64/smartflow_miner +0 -0
- package/resources/create2/darwin-x64/smartflow_miner +0 -0
- package/resources/create2/manifest.json +27 -0
- package/runtime/config/hardhatAdapters.ts +8 -0
- package/runtime/config/networks.ts +20 -11
- package/runtime/config/openzeppelin.ts +3 -21
- package/runtime/delivery/abi.ts +225 -0
- package/runtime/delivery/aggregate-bootstrap.ts +29 -0
- package/runtime/delivery/aggregate-channel.ts +85 -0
- package/runtime/delivery/aggregate-inputs.ts +39 -0
- package/runtime/delivery/aggregate-source.ts +53 -0
- package/runtime/delivery/aggregate-worker.ts +133 -0
- package/runtime/delivery/aggregate.ts +139 -0
- package/runtime/delivery/bindings.ts +37 -0
- package/runtime/delivery/check-code.ts +38 -0
- package/runtime/delivery/closure-format.ts +350 -0
- package/runtime/delivery/codec-pin.ts +3 -0
- package/runtime/delivery/codec.ts +50 -0
- package/runtime/delivery/compiler-dependency-pins.ts +1685 -0
- package/runtime/delivery/compiler-files.ts +179 -0
- package/runtime/delivery/compiler-io.ts +10 -0
- package/runtime/delivery/compiler-pins.ts +143 -0
- package/runtime/delivery/compiler.ts +700 -0
- package/runtime/delivery/config.ts +93 -0
- package/runtime/delivery/configuration-definition.ts +133 -0
- package/runtime/delivery/configuration-hre.ts +130 -0
- package/runtime/delivery/configuration-runtime.ts +163 -0
- package/runtime/delivery/configuration.ts +64 -0
- package/runtime/delivery/create2.ts +57 -0
- package/runtime/delivery/custom-closure.ts +993 -0
- package/runtime/delivery/custom-format.ts +464 -0
- package/runtime/delivery/custom.ts +219 -0
- package/runtime/delivery/data.ts +94 -0
- package/runtime/delivery/development.ts +262 -0
- package/runtime/delivery/engine.ts +29 -0
- package/runtime/delivery/eoa-observation.ts +106 -0
- package/runtime/delivery/eoa-signed.ts +55 -0
- package/runtime/delivery/eoa.ts +288 -0
- package/runtime/delivery/execution-db.ts +131 -0
- package/runtime/delivery/execution-files.ts +135 -0
- package/runtime/delivery/execution-model.ts +102 -0
- package/runtime/delivery/execution-store.ts +411 -0
- package/runtime/delivery/existing-code.ts +44 -0
- package/runtime/delivery/export.ts +99 -0
- package/runtime/delivery/forkAudit.ts +620 -0
- package/runtime/delivery/hardhat.ts +38 -0
- package/runtime/delivery/history-registration.ts +10 -0
- package/runtime/delivery/identities.ts +132 -0
- package/runtime/delivery/input-files.ts +46 -0
- package/runtime/delivery/inputs.ts +197 -0
- package/runtime/delivery/journal.ts +201 -0
- package/runtime/delivery/manifest.ts +54 -0
- package/runtime/delivery/materialization.ts +53 -0
- package/runtime/delivery/observations.ts +60 -0
- package/runtime/delivery/parameters.ts +349 -0
- package/runtime/delivery/pending.ts +98 -0
- package/runtime/delivery/plan.ts +337 -0
- package/runtime/delivery/planning.ts +397 -0
- package/runtime/delivery/policy.ts +9 -0
- package/runtime/delivery/preparation.ts +224 -0
- package/runtime/delivery/production-environment.ts +6 -0
- package/runtime/delivery/production-finalization.ts +172 -0
- package/runtime/delivery/production.ts +375 -0
- package/runtime/delivery/project-files.ts +58 -0
- package/runtime/delivery/project.ts +117 -0
- package/runtime/delivery/protocol.ts +94 -0
- package/runtime/delivery/references.ts +106 -0
- package/runtime/delivery/release-graph.ts +49 -0
- package/runtime/delivery/release-history-capture.ts +32 -0
- package/runtime/delivery/release-history.ts +120 -0
- package/runtime/delivery/release.ts +128 -0
- package/runtime/delivery/safe-manifest.ts +11 -0
- package/runtime/delivery/safe-observation.ts +626 -0
- package/runtime/delivery/safe-prepare.ts +101 -0
- package/runtime/delivery/safe.ts +344 -0
- package/runtime/delivery/same-fork-baseline.ts +16 -0
- package/runtime/delivery/setup.ts +172 -0
- package/runtime/delivery/source.ts +130 -0
- package/runtime/delivery/target-fields.ts +7 -0
- package/runtime/delivery/validation.ts +247 -0
- package/runtime/delivery/verification.ts +47 -0
- package/runtime/migrate.ts +1 -0
- package/runtime/miner/binary.ts +41 -0
- package/runtime/miner/cli.ts +87 -0
- package/runtime/miner/index.ts +5 -0
- package/runtime/miner/request.ts +54 -0
- package/runtime/miner/runner.ts +90 -0
- package/runtime/miner/types.ts +71 -0
- package/runtime/miner/verify.ts +61 -0
- package/runtime/vendor/plan-codec/index.cjs +820 -0
- package/runtime/vendor/plan-codec/index.d.cts +32 -0
- package/runtime/vendor/plan-codec/provenance.json +24 -0
- package/runtime/workflow/engine.ts +174 -0
- package/runtime/workflow/lib/authority.ts +3 -3
- package/runtime/workflow/lib/calls.ts +46 -37
- package/runtime/workflow/lib/canonicalData.ts +45 -0
- package/runtime/workflow/lib/config.ts +1 -1
- package/runtime/workflow/lib/context.ts +76 -0
- package/runtime/workflow/lib/controlledMulticallAbi.ts +6 -0
- package/runtime/workflow/lib/create2.ts +10 -12
- package/runtime/workflow/lib/deployments.ts +6 -14
- package/runtime/workflow/lib/evidencePorts.ts +20 -0
- package/runtime/workflow/lib/executionPlan.ts +17 -268
- package/runtime/workflow/lib/gateTool.ts +20 -8
- package/runtime/workflow/lib/gateToolSync.ts +3 -3
- package/runtime/workflow/lib/operationNames.ts +32 -0
- package/runtime/workflow/lib/parameters.ts +7 -23
- package/runtime/workflow/lib/pendingDeploymentReuse.ts +4 -56
- package/runtime/workflow/lib/pendingUupsBinding.ts +43 -0
- package/runtime/workflow/lib/plan.ts +334 -0
- package/runtime/workflow/lib/planCli.ts +279 -0
- package/runtime/workflow/lib/preparationEvidence.ts +14 -0
- package/runtime/workflow/lib/proxy.ts +5 -3
- package/runtime/workflow/lib/runtime.ts +46 -0
- package/runtime/workflow/lib/signer.ts +8 -5
- package/runtime/workflow/lib/simulation.ts +41 -17
- package/runtime/workflow/lib/state.ts +3 -3
- package/runtime/workflow/lib/staticValidation.ts +92 -11
- package/runtime/workflow/lib/transactionPlanner.ts +314 -0
- package/runtime/workflow/lib/typedValue.ts +46 -0
- package/runtime/workflow/lib/validation.ts +50 -0
- package/runtime/workflow/planAdd.ts +8 -0
- package/runtime/workflow/planRead.ts +8 -0
- package/runtime/workflow/planStatus.ts +8 -0
- package/runtime/workflow/planWrite.ts +8 -0
- package/runtime/workflow/run.ts +41 -174
- package/runtime/workflow/staticValidate.ts +8 -3
- package/runtime/workflow/steps/call.ts +1 -1
- package/runtime/workflow/steps/check.ts +1 -1
- package/runtime/workflow/steps/custom.ts +1 -1
- package/runtime/workflow/steps/deploy.ts +59 -59
- package/runtime/workflow/steps/upgrade.ts +71 -47
- package/runtime/workflow/steps/view.ts +1 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/** Owned multi-target input qualification. This grants no release-ready or broadcast authority. */
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {randomUUID} from 'node:crypto';
|
|
6
|
+
import {openDeliveryInputs,consumeDeliveryInputParameters,type DeliveryInputEvidence} from './inputs';
|
|
7
|
+
import {openAggregateSources} from './aggregate-inputs';
|
|
8
|
+
import {parseDeliveryRequest,safeId,type DeliveryRequest} from './protocol';
|
|
9
|
+
import {strictData} from './data';
|
|
10
|
+
import {inputDigest} from './input-files';
|
|
11
|
+
import {projectRoot} from './project-files';
|
|
12
|
+
import {RuntimeObservation} from './configuration-runtime';
|
|
13
|
+
import {OwnedWorker,OwnedWorkerFailure} from './aggregate-channel';
|
|
14
|
+
import {deepFreeze,canonicalJson,semanticHash,exactObject} from '../workflow/lib/canonicalData';
|
|
15
|
+
import type {DeliveryCollection} from './planning';
|
|
16
|
+
import type {DeliveryConfigurationEvidence} from './configuration';
|
|
17
|
+
import type {CompilerEvidence} from './compiler';
|
|
18
|
+
import type {CustomInputClosure} from './custom-closure';
|
|
19
|
+
export interface DeliveryAggregateOptions {
|
|
20
|
+
workspaceRoot:string;projectRoot:string;selection:'development'|'release'|'all';
|
|
21
|
+
targets:Array<{request:DeliveryRequest;executionId:string}>;
|
|
22
|
+
}
|
|
23
|
+
export interface DeliveryAggregate {
|
|
24
|
+
version:1;inputsHash:string;sourceDefinitionHash:string;
|
|
25
|
+
inputs:{business:DeliveryInputEvidence;sourceDefinitions:unknown;runtime:ReturnType<RuntimeObservation['observe']>;
|
|
26
|
+
targets:Array<{target:string;configuration:DeliveryConfigurationEvidence;sourceConfiguration:DeliveryConfigurationEvidence;compiler:CompilerEvidence;custom:CustomInputClosure|null}>;
|
|
27
|
+
files:Array<{path:string;digest:string}>};
|
|
28
|
+
collections:DeliveryCollection[];
|
|
29
|
+
/** Runtime diagnostics stay outside the immutable-input preimage. */
|
|
30
|
+
observations:Array<{target:string;pid:number;sourcePid:number;manifestDir:string;operator:string;executionId:string;payloadHash:string;invariantHash:string;exited:true}>;
|
|
31
|
+
}
|
|
32
|
+
function same(a:unknown,b:unknown,label:string):void{if(canonicalJson(a)!==canonicalJson(b))throw new Error(`${label} drift or mismatch`);}
|
|
33
|
+
/** Derives business data once; only actual worker channels can contribute staged authority. */
|
|
34
|
+
class DiscoveryReplayError extends Error {}
|
|
35
|
+
export async function collectDeliveryAggregate(raw:DeliveryAggregateOptions):Promise<Readonly<DeliveryAggregate>> {
|
|
36
|
+
try{return await collectOwnedAggregate(raw);}
|
|
37
|
+
catch(error){if(error instanceof OwnedWorkerFailure||error instanceof DiscoveryReplayError)throw error;throw new Error('Delivery aggregate input qualification failed');}
|
|
38
|
+
}
|
|
39
|
+
async function collectOwnedAggregate(raw:DeliveryAggregateOptions):Promise<Readonly<DeliveryAggregate>> {
|
|
40
|
+
const input=strictData(raw);
|
|
41
|
+
exactObject(input,['workspaceRoot','projectRoot','selection','targets'],'aggregate options');
|
|
42
|
+
if(!['development','release','all'].includes(input.selection)||!Array.isArray(input.targets)||!input.targets.length)throw new Error('Aggregate requires selected target requests');
|
|
43
|
+
const root=projectRoot(input.workspaceRoot,input.projectRoot),workspace=projectRoot(input.workspaceRoot,'.');
|
|
44
|
+
if(path.resolve(process.cwd())!==root)throw new Error('Aggregate must run from the original project root');
|
|
45
|
+
const targets=input.targets.map(value=>{
|
|
46
|
+
if(!value||Object.keys(value).some(k=>!['request','executionId','expected'].includes(k)))throw new Error('Invalid aggregate target');
|
|
47
|
+
if(Object.hasOwn(value,'expected'))throw new DiscoveryReplayError('Staged replay requires independently closed current inputs; use known-final collection');
|
|
48
|
+
const request=parseDeliveryRequest(value.request);safeId(value.executionId,'executionId');
|
|
49
|
+
if(request.mode!=='simulate'||request.purpose==='prod-execution')throw new Error('Aggregate input qualification requires simulation');
|
|
50
|
+
return {...value,request};
|
|
51
|
+
});
|
|
52
|
+
if(new Set(targets.map(x=>x.request.network)).size!==targets.length||new Set(targets.map(x=>x.executionId)).size!==targets.length)throw new Error('Aggregate target and execution IDs must be distinct');
|
|
53
|
+
// Every invocation gets its own actual environment/network/step/sourceRef validation.
|
|
54
|
+
const sourceOwner=openAggregateSources({workspaceRoot:workspace,projectRoot:input.projectRoot,requests:targets.map(x=>x.request)});
|
|
55
|
+
const {sources,definitions:sourceDefinitions,sourceDefinitionHash}=sourceOwner;
|
|
56
|
+
for(const source of sources){const scope=source.invocation.task.scope!.deployment as any,first=sources[0].invocation.task.scope!.deployment as any;
|
|
57
|
+
for(const key of ['deploymentId','developmentNetwork','releaseTargetNetworks','projectRoot'])same(scope[key],first[key],'Aggregate business scope');
|
|
58
|
+
}
|
|
59
|
+
let runtime:RuntimeObservation|undefined,business:ReturnType<typeof openDeliveryInputs>|undefined;
|
|
60
|
+
const workers:OwnedWorker[]=[];let failure:Error|undefined;
|
|
61
|
+
const session=randomUUID(),directory=fs.mkdtempSync(path.join(os.tmpdir(),'gate-delivery-aggregate-'));
|
|
62
|
+
const live=()=>{if(failure)throw failure;for(const worker of workers)worker.assertLive();};
|
|
63
|
+
const checkSources=()=>sourceOwner.assertUnchanged();
|
|
64
|
+
try{
|
|
65
|
+
runtime=new RuntimeObservation(root);
|
|
66
|
+
business=openDeliveryInputs({workspaceRoot:workspace,projectRoot:input.projectRoot,request:targets[0].request,selection:input.selection});
|
|
67
|
+
same(targets.map(x=>x.request.network),business.snapshot.targets.map(x=>x.id),'Selected target request order');
|
|
68
|
+
const receipts=targets.map(({request})=>business!.parameters(request.network));
|
|
69
|
+
const rows:any[]=[];
|
|
70
|
+
for(const [index,target] of targets.entries()){
|
|
71
|
+
live();checkSources();
|
|
72
|
+
const publicTarget=business.snapshot.targets[index];
|
|
73
|
+
if(publicTarget.environment!==target.request.environment)throw new Error('Selected request environment mismatch');
|
|
74
|
+
const common={root,workspaceRoot:workspace,projectRoot:input.projectRoot,request:target.request};
|
|
75
|
+
const source=new OwnedWorker(root,session,target.request.network,'source',error=>{failure??=error;});workers.push(source);
|
|
76
|
+
const handshakePath=path.join(directory,`${index}.json`);
|
|
77
|
+
const ready=await source.request('stage',{...common,role:'source',handshakePath});
|
|
78
|
+
if(ready.ready!==true||!fs.existsSync(handshakePath))throw new Error('Source handshake is not READY');
|
|
79
|
+
const bytes=fs.readFileSync(handshakePath,'utf8'),handshake=JSON.parse(bytes);
|
|
80
|
+
same(handshake,ready.handshake,'Source handshake');
|
|
81
|
+
if(handshake.version!==1||handshake.session!==session||handshake.epoch!==source.epoch||handshake.target!==target.request.network)throw new Error('Source handshake association mismatch');
|
|
82
|
+
const worker=new OwnedWorker(root,session,target.request.network,'target',error=>{failure??=error;});workers.push(worker);
|
|
83
|
+
const staged=await worker.request('stage',{...common,role:'target',handshake,target:publicTarget,params:business.values(publicTarget.id),steps:business.snapshot.steps,
|
|
84
|
+
deploymentId:business.snapshot.deploymentId,businessRoot:business.snapshot.businessRoot,executionId:target.executionId,sourceDefinitionHash});
|
|
85
|
+
if(staged.ready!==true)throw new Error('Target stage is not READY');
|
|
86
|
+
rows.push({target:publicTarget.id,source,worker,staged});
|
|
87
|
+
}
|
|
88
|
+
// Producer/evaluation ports terminate before the final union. No producer runs below this point.
|
|
89
|
+
checkSources();const sealed=business.seal() as DeliveryInputEvidence;
|
|
90
|
+
for(const [index,receipt] of receipts.entries())same(consumeDeliveryInputParameters(receipt),sealed.parameters[index].resolved.values,'Owned parameter receipt');
|
|
91
|
+
const contributions:DeliveryAggregate['inputs']['targets']=[];
|
|
92
|
+
for(const row of rows){
|
|
93
|
+
live();
|
|
94
|
+
const checked=await row.worker.request('check');
|
|
95
|
+
same(checked.compiler,row.staged.compiler,'Compiler stage');same(checked.custom,row.staged.custom,'Target custom closure');same(checked.payloadHash,row.staged.payloadHash,'Staged payload');same(checked.invariantHash,row.staged.invariantHash,'Staged invariant');
|
|
96
|
+
const sourceChecked=await row.source.request('check');
|
|
97
|
+
contributions.push({target:row.target,configuration:checked.configuration,sourceConfiguration:sourceChecked.configuration,compiler:checked.compiler,custom:checked.custom});
|
|
98
|
+
}
|
|
99
|
+
checkSources();runtime.assertUnchanged();const parentRuntime=runtime.observe();
|
|
100
|
+
const files=new Map<string,string>();
|
|
101
|
+
const add=(path:string,digest:string)=>{if(files.has(path)&&files.get(path)!==digest)throw new Error('Conflicting aggregate immutable input');files.set(path,digest);};
|
|
102
|
+
for(const file of sealed.files)add(file.path,file.digest);
|
|
103
|
+
for(const parameter of sealed.parameters)for(const file of parameter.closure?.files??[])add(file.path,file.digest);
|
|
104
|
+
for(const row of contributions){
|
|
105
|
+
for(const file of row.custom?.files??[])add(file.path,file.digest);
|
|
106
|
+
for(const artifact of row.compiler.artifacts){add(artifact.path,inputDigest(artifact.contents));add(artifact.debugPath,inputDigest(artifact.debugContents));}
|
|
107
|
+
for(const build of row.compiler.builds)add(build.path,inputDigest(build.contents));
|
|
108
|
+
for(const job of row.compiler.jobs)for(const file of job.sources)add(file.path,file.digest);
|
|
109
|
+
for(const file of row.compiler.toolchain.modules)add(file.path,file.digest);
|
|
110
|
+
for(const config of [row.configuration,row.sourceConfiguration]){
|
|
111
|
+
for(const file of config.files)add(file.path,file.digest);
|
|
112
|
+
for(const file of config.runtime.modules)add(file.path,file.digest);
|
|
113
|
+
for(const pkg of [config.runtime.package,...config.runtime.dependencies])for(const file of pkg.payload)add(`${pkg.lockLocation}/${file.path}`,file.digest);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const union=[...files].sort(([a],[b])=>a.localeCompare(b,'en')).map(([path,digest])=>({path,digest}));
|
|
117
|
+
// No runtime state, observation, plan hash or randomized compiler exact evidence enters this preimage.
|
|
118
|
+
const inputsHash=semanticHash({version:1,business:sealed,sourceDefinitions,runtime:parentRuntime,files:union,
|
|
119
|
+
targets:contributions.map(row=>({target:row.target,configuration:row.configuration.configurationRuntimeHash,sourceConfiguration:row.sourceConfiguration.configurationRuntimeHash,compiler:row.compiler.stableDigest,custom:row.custom}))});
|
|
120
|
+
live();
|
|
121
|
+
const collections:DeliveryCollection[]=[];
|
|
122
|
+
for(const row of rows){
|
|
123
|
+
const collection=await row.worker.request('bind',{inputsHash}) as DeliveryCollection;
|
|
124
|
+
if(collection.plan.inputsHash!==inputsHash||collection.plan.sourceDefinitionHash!==sourceDefinitionHash)throw new Error('Final target identity mismatch');
|
|
125
|
+
const {inputsHash:_,planHash:__,...payload}=collection.plan;
|
|
126
|
+
same(semanticHash(payload),row.staged.payloadHash,'Final staged payload');collections.push(collection);
|
|
127
|
+
}
|
|
128
|
+
// No externally reachable plan exists until every actual child has exited successfully.
|
|
129
|
+
for(const row of rows){if(failure)throw failure;await row.worker.request('close');await row.source.request('close');}
|
|
130
|
+
if(failure)throw failure;
|
|
131
|
+
return deepFreeze({version:1,inputsHash,sourceDefinitionHash,inputs:{business:sealed,sourceDefinitions,runtime:parentRuntime,targets:contributions,files:union},collections,
|
|
132
|
+
observations:rows.map(row=>({target:row.target,...row.staged.observation,sourcePid:row.source.pid,payloadHash:row.staged.payloadHash,invariantHash:row.staged.invariantHash,exited:true}))}) as DeliveryAggregate;
|
|
133
|
+
}finally{
|
|
134
|
+
business?.close();runtime?.close();
|
|
135
|
+
const results=await Promise.allSettled(workers.map(worker=>worker.reap()));
|
|
136
|
+
fs.rmSync(directory,{recursive:true,force:true});
|
|
137
|
+
if(results.some(x=>x.status==='rejected'))throw new Error('Aggregate worker cleanup failed');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ExecutionBindings } from '../workflow/lib/context';
|
|
2
|
+
import { canonicalData, exactObject, nonempty, deepFreeze } from '../workflow/lib/canonicalData';
|
|
3
|
+
export interface DerivedBindings { executionId: string; derivationSeed: string; values: Record<string, string> }
|
|
4
|
+
export function parseDerivedBindings(raw: unknown): DerivedBindings {
|
|
5
|
+
const input = exactObject(raw, ['executionId', 'derivationSeed', 'values'], 'derived bindings');
|
|
6
|
+
const values = canonicalData(input.values) as Record<string, unknown>;
|
|
7
|
+
if (!values || typeof values !== 'object' || Array.isArray(values)) throw new Error('derived values must be an object');
|
|
8
|
+
for (const [key, value] of Object.entries(values)) { nonempty(key, 'derived key'); nonempty(value, 'derived value'); }
|
|
9
|
+
return deepFreeze({ executionId: nonempty(input.executionId, 'executionId'), derivationSeed: nonempty(input.derivationSeed, 'derivationSeed'), values: values as Record<string, string> });
|
|
10
|
+
}
|
|
11
|
+
export class DeliveryExecutionBindings implements ExecutionBindings {
|
|
12
|
+
readonly derivationSeed: string;
|
|
13
|
+
private readonly executionId: string;
|
|
14
|
+
private readonly expected?: DerivedBindings;
|
|
15
|
+
private readonly values: Record<string, string> = Object.create(null);
|
|
16
|
+
private sealed = false;
|
|
17
|
+
constructor(input: { executionId: string; derivationSeed: string; expected?: DerivedBindings }) {
|
|
18
|
+
this.executionId = nonempty(input.executionId, 'executionId'); this.derivationSeed = nonempty(input.derivationSeed, 'derivationSeed');
|
|
19
|
+
this.expected = input.expected && parseDerivedBindings(input.expected);
|
|
20
|
+
if (this.expected && (this.expected.executionId !== this.executionId || this.expected.derivationSeed !== this.derivationSeed)) throw new Error('derived binding identity mismatch');
|
|
21
|
+
}
|
|
22
|
+
recordOrAssertDerivedValue(key: string, value: string): void {
|
|
23
|
+
if (this.sealed) throw new Error('derived bindings are sealed');
|
|
24
|
+
nonempty(key, 'derived key'); nonempty(value, 'derived value');
|
|
25
|
+
if (Object.hasOwn(this.values, key)) throw new Error(`duplicate derived binding ${key}`);
|
|
26
|
+
if (this.expected) {
|
|
27
|
+
if (!Object.hasOwn(this.expected.values, key)) throw new Error(`unexpected derived binding ${key}`);
|
|
28
|
+
if (this.expected.values[key] !== value) throw new Error(`derived binding ${key} differs`);
|
|
29
|
+
}
|
|
30
|
+
this.values[key] = value;
|
|
31
|
+
}
|
|
32
|
+
seal(): DerivedBindings {
|
|
33
|
+
if (this.expected && Object.keys(this.expected.values).some(key => !Object.hasOwn(this.values, key))) throw new Error('missing expected derived bindings');
|
|
34
|
+
this.sealed = true;
|
|
35
|
+
return parseDerivedBindings({ executionId: this.executionId, derivationSeed: this.derivationSeed, values: this.values });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import {spawn} from 'node:child_process';
|
|
4
|
+
import {randomUUID} from 'node:crypto';
|
|
5
|
+
import {canonicalData,canonicalJson} from '../workflow/lib/canonicalData';
|
|
6
|
+
import {byteHash,developmentPath,atomicDevelopmentWrite} from './materialization';
|
|
7
|
+
export interface ExpectedDevelopmentCode {key:string;contract:string;address:string}
|
|
8
|
+
/** The checker incrementally merges output. A fresh private output file is mandatory. */
|
|
9
|
+
export function validateDevelopmentCheckReport(raw:unknown,target:string,expected:readonly ExpectedDevelopmentCode[]):unknown {
|
|
10
|
+
const value=canonicalData(raw) as any;
|
|
11
|
+
if(!expected.length||new Set(expected.map(e=>e.key)).size!==expected.length)throw Error('Empty expected CheckCode set or key collision');
|
|
12
|
+
if(!value||Array.isArray(value)||canonicalJson(Object.keys(value))!==canonicalJson([target]))throw Error('CheckCode target mismatch');
|
|
13
|
+
const entries=value[target];if(!entries||Array.isArray(entries)||canonicalJson(Object.keys(entries).sort())!==canonicalJson(expected.map(e=>e.key).sort()))throw Error('CheckCode missing/extra entries');
|
|
14
|
+
for(const e of expected){const row=entries[e.key];if(!row||row.contract!==e.contract||row.scheme!=='evm'||typeof row.address!=='string'||row.address.toLowerCase()!==e.address.toLowerCase()||row.matches!==true||row.error!==null||typeof row.reason!=='string'||!Number.isSafeInteger(row.onChainBytecodeLength)||row.onChainBytecodeLength<=0||!Number.isSafeInteger(row.localBytecodeLength)||row.localBytecodeLength<=0)throw Error(`CheckCode identity/match failure: ${e.key}`);}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
function command(root:string,cmd:string,args:string[],env:NodeJS.ProcessEnv,log:string):Promise<void> {
|
|
18
|
+
return new Promise((resolve,reject)=>{const output=fs.createWriteStream(log,{flags:'wx',mode:0o600});const child=spawn(cmd,args,{cwd:root,env,stdio:['ignore','pipe','pipe']});child.stdout.pipe(output,{end:false});child.stderr.pipe(output,{end:false});child.on('error',error=>{output.end();reject(error);});child.on('close',code=>{output.end(()=>code===0?resolve():reject(Error(`CheckCode command failed (${code}): ${cmd}; see ${log}`)));});});
|
|
19
|
+
}
|
|
20
|
+
export async function runDevelopmentCheckCode(input:{root:string;target:string;executionId:string;planHash:string;manifestDir:string;registry:string;metadata:string;effective:Record<string,Record<string,string>>;expected:ExpectedDevelopmentCode[];assertArtifacts:()=>Promise<unknown>}):Promise<unknown> {
|
|
21
|
+
const relative=`.gate-delivery/check-code/${input.executionId}/${randomUUID()}`,directory=developmentPath(input.root,relative);fs.mkdirSync(directory,{recursive:true,mode:0o700});
|
|
22
|
+
const effective=canonicalJson(input.effective)+'\n';atomicDevelopmentWrite(input.root,`${relative}/effective.json`,effective);
|
|
23
|
+
const raw=path.join(directory,`${input.target}.raw.json`),env:NodeJS.ProcessEnv={...process.env,HARDHAT_NETWORK:input.target,GATE_WORKFLOW_TARGET:input.target,MANIFEST_DEFAULT_DIR:input.manifestDir};
|
|
24
|
+
// Configuration's runtime loader selects the actual named target, never a fork.
|
|
25
|
+
delete env.GATE_DELIVERY_CONTEXT;
|
|
26
|
+
const snapshot=async()=>{
|
|
27
|
+
if(fs.readFileSync(path.join(input.root,'contractInfo.json'),'utf8')!==input.registry||fs.readFileSync(path.join(input.root,'deploymentInfo.json'),'utf8')!==input.metadata)throw Error('Registry/metadata changed during CheckCode');
|
|
28
|
+
return await input.assertArtifacts();
|
|
29
|
+
};
|
|
30
|
+
await snapshot();await command(input.root,'npm',['run','compile','--','--network',input.target],env,path.join(directory,'compile.log'));await snapshot();
|
|
31
|
+
if(fs.existsSync(raw))throw Error('CheckCode raw output must be fresh');
|
|
32
|
+
await command(input.root,process.execPath,[path.join(input.root,'node_modules/gate-evm-tools/bin/cli.js'),'check','--scheme','evm','--network',input.target,'--config',path.join(directory,'effective.json'),'--output',raw],env,path.join(directory,'check.log'));
|
|
33
|
+
const artifacts=await snapshot();
|
|
34
|
+
if(!fs.existsSync(raw))throw Error('CheckCode completed without raw output');
|
|
35
|
+
const stat=fs.lstatSync(raw);if(!stat.isFile()||stat.isSymbolicLink()||stat.nlink!==1)throw Error('Invalid CheckCode raw output');
|
|
36
|
+
const bytes=fs.readFileSync(raw);validateDevelopmentCheckReport(JSON.parse(bytes.toString('utf8')),input.target,input.expected);
|
|
37
|
+
return {version:1,executionId:input.executionId,planHash:input.planHash,target:input.target,rawFile:`${relative}/${input.target}.raw.json`,rawHash:byteHash(bytes),registryHash:byteHash(input.registry),metadataHash:byteHash(input.metadata),effectiveHash:byteHash(effective),artifacts};
|
|
38
|
+
}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/** Pure parser for the collector's existing sealed closure format. Numeric compiler enums are pinned to TypeScript 5.9.3. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { strictData } from './data';
|
|
4
|
+
import { portablePath } from './protocol';
|
|
5
|
+
import { canonicalJson, deepFreeze, digest, exactObject, semanticHash } from '../workflow/lib/canonicalData';
|
|
6
|
+
const policy = 'gate-custom-cjs@1' as const;
|
|
7
|
+
const hash = (bytes: Buffer | string) => createHash('sha256').update(bytes).digest('hex');
|
|
8
|
+
export interface ClosureFile {
|
|
9
|
+
path: string;
|
|
10
|
+
kind: "module" | "json" | "data" | "config" | "metadata";
|
|
11
|
+
digest: string;
|
|
12
|
+
emittedDigest: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ClosureEdge {
|
|
15
|
+
importer: string;
|
|
16
|
+
specifier: string;
|
|
17
|
+
target: string;
|
|
18
|
+
kind: "runtime" | "config";
|
|
19
|
+
}
|
|
20
|
+
export interface ClosurePackage {
|
|
21
|
+
lockLocation: string;
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
integrity: string;
|
|
25
|
+
source: { kind: "registry" | "tarball"; identity: string };
|
|
26
|
+
metadataDigest: string;
|
|
27
|
+
resolution: Record<string, unknown>;
|
|
28
|
+
payload: { path: string; digest: string }[];
|
|
29
|
+
payloadDigest: string;
|
|
30
|
+
}
|
|
31
|
+
export interface HostAdapter {
|
|
32
|
+
kind: "isolated-cjs" | "hardhat-2.26.3-ts-node-10.9.2";
|
|
33
|
+
preload: { path: string; digest: string } | null;
|
|
34
|
+
packages: { name: string; version: string; metadataDigest: string }[];
|
|
35
|
+
}
|
|
36
|
+
export interface CustomInputClosure {
|
|
37
|
+
version: 1;
|
|
38
|
+
policy: typeof policy;
|
|
39
|
+
roots: string[];
|
|
40
|
+
files: ClosureFile[];
|
|
41
|
+
edges: ClosureEdge[];
|
|
42
|
+
packages: ClosurePackage[];
|
|
43
|
+
compiler: {
|
|
44
|
+
version: string;
|
|
45
|
+
options: Record<string, unknown>;
|
|
46
|
+
config: string | null;
|
|
47
|
+
};
|
|
48
|
+
hostAdapter: HostAdapter;
|
|
49
|
+
resolver: {
|
|
50
|
+
policy: "node-default-cjs";
|
|
51
|
+
version: string;
|
|
52
|
+
flags: string[];
|
|
53
|
+
environment: "empty";
|
|
54
|
+
};
|
|
55
|
+
closureHash: string;
|
|
56
|
+
}
|
|
57
|
+
export const closureRuntimeOptions = {
|
|
58
|
+
target: 9,
|
|
59
|
+
module: 1,
|
|
60
|
+
esModuleInterop: true,
|
|
61
|
+
resolveJsonModule: true,
|
|
62
|
+
isolatedModules: true,
|
|
63
|
+
sourceMap: false,
|
|
64
|
+
inlineSourceMap: false,
|
|
65
|
+
importHelpers: false,
|
|
66
|
+
removeComments: false,
|
|
67
|
+
newLine: 1,
|
|
68
|
+
};
|
|
69
|
+
export function parseCustomInputClosure(raw: unknown): CustomInputClosure {
|
|
70
|
+
const e = exactObject(
|
|
71
|
+
strictData(raw),
|
|
72
|
+
[
|
|
73
|
+
"version",
|
|
74
|
+
"policy",
|
|
75
|
+
"roots",
|
|
76
|
+
"files",
|
|
77
|
+
"edges",
|
|
78
|
+
"packages",
|
|
79
|
+
"compiler",
|
|
80
|
+
"hostAdapter",
|
|
81
|
+
"resolver",
|
|
82
|
+
"closureHash",
|
|
83
|
+
],
|
|
84
|
+
"custom input closure"
|
|
85
|
+
);
|
|
86
|
+
const { closureHash, ...body } = e;
|
|
87
|
+
if (
|
|
88
|
+
e.version !== 1 ||
|
|
89
|
+
e.policy !== policy ||
|
|
90
|
+
digest(closureHash, "closure") !== semanticHash(body)
|
|
91
|
+
)
|
|
92
|
+
throw new Error("Custom closure identity mismatch");
|
|
93
|
+
if (
|
|
94
|
+
!Array.isArray(e.roots) ||
|
|
95
|
+
!e.roots.length ||
|
|
96
|
+
!Array.isArray(e.files) ||
|
|
97
|
+
!Array.isArray(e.edges) ||
|
|
98
|
+
!Array.isArray(e.packages)
|
|
99
|
+
)
|
|
100
|
+
throw new Error("Missing custom closure entries");
|
|
101
|
+
const kinds = new Map<string, ClosureFile["kind"]>();
|
|
102
|
+
for (const raw of e.files) {
|
|
103
|
+
const f = exactObject(
|
|
104
|
+
raw,
|
|
105
|
+
["path", "kind", "digest", "emittedDigest"],
|
|
106
|
+
"closure file"
|
|
107
|
+
);
|
|
108
|
+
portablePath(f.path, "closure file");
|
|
109
|
+
digest(f.digest, "file");
|
|
110
|
+
if (
|
|
111
|
+
kinds.has(f.path as string) ||
|
|
112
|
+
typeof f.kind !== "string" ||
|
|
113
|
+
!["module", "json", "data", "config", "metadata"].includes(f.kind)
|
|
114
|
+
)
|
|
115
|
+
throw new Error("Invalid closure file");
|
|
116
|
+
kinds.set(f.path as string, f.kind as ClosureFile["kind"]);
|
|
117
|
+
if (f.kind === "module") digest(f.emittedDigest, "emitted module");
|
|
118
|
+
else if (f.emittedDigest !== null)
|
|
119
|
+
throw new Error("Invalid nonmodule emission");
|
|
120
|
+
}
|
|
121
|
+
if (
|
|
122
|
+
new Set(e.roots).size !== e.roots.length ||
|
|
123
|
+
e.roots.some((r) => typeof r !== "string" || kinds.get(r) !== "module")
|
|
124
|
+
)
|
|
125
|
+
throw new Error("Missing closure root");
|
|
126
|
+
// Config JSON can also be imported at runtime, which promotes its file kind to json.
|
|
127
|
+
const configFile = (name: string) =>
|
|
128
|
+
name.endsWith(".json") &&
|
|
129
|
+
["config", "json"].includes(kinds.get(name) ?? "");
|
|
130
|
+
const edgeKeys = new Set<string>();
|
|
131
|
+
for (const raw of e.edges) {
|
|
132
|
+
const edge = exactObject(
|
|
133
|
+
raw,
|
|
134
|
+
["importer", "specifier", "target", "kind"],
|
|
135
|
+
"closure edge"
|
|
136
|
+
);
|
|
137
|
+
if (
|
|
138
|
+
typeof edge.importer !== "string" ||
|
|
139
|
+
typeof edge.target !== "string" ||
|
|
140
|
+
typeof edge.specifier !== "string" ||
|
|
141
|
+
!edge.specifier ||
|
|
142
|
+
(edge.kind !== "runtime" && edge.kind !== "config")
|
|
143
|
+
)
|
|
144
|
+
throw new Error("Invalid closure edge");
|
|
145
|
+
const key = canonicalJson([edge.importer, edge.specifier, edge.kind]);
|
|
146
|
+
if (edgeKeys.has(key)) throw new Error("Duplicate closure edge");
|
|
147
|
+
edgeKeys.add(key);
|
|
148
|
+
if (
|
|
149
|
+
edge.kind === "runtime"
|
|
150
|
+
? kinds.get(edge.importer) !== "module" ||
|
|
151
|
+
!["module", "json"].includes(kinds.get(edge.target) ?? "")
|
|
152
|
+
: !configFile(edge.importer) || !configFile(edge.target)
|
|
153
|
+
)
|
|
154
|
+
throw new Error("Invalid closure edge file relationship");
|
|
155
|
+
}
|
|
156
|
+
const files = e.files as ClosureFile[];
|
|
157
|
+
const packages = new Map<string, ClosurePackage>();
|
|
158
|
+
for (const raw of e.packages) {
|
|
159
|
+
const p = exactObject(
|
|
160
|
+
raw,
|
|
161
|
+
[
|
|
162
|
+
"lockLocation",
|
|
163
|
+
"name",
|
|
164
|
+
"version",
|
|
165
|
+
"integrity",
|
|
166
|
+
"source",
|
|
167
|
+
"metadataDigest",
|
|
168
|
+
"resolution",
|
|
169
|
+
"payload",
|
|
170
|
+
"payloadDigest",
|
|
171
|
+
],
|
|
172
|
+
"closure package"
|
|
173
|
+
);
|
|
174
|
+
portablePath(p.lockLocation, "lock location");
|
|
175
|
+
digest(p.metadataDigest, "metadata");
|
|
176
|
+
digest(p.payloadDigest, "payload");
|
|
177
|
+
const s = exactObject(p.source, ["kind", "identity"], "package source");
|
|
178
|
+
if (s.kind !== "registry" && s.kind !== "tarball")
|
|
179
|
+
throw new Error("Invalid package source");
|
|
180
|
+
digest(s.identity, "source");
|
|
181
|
+
if (
|
|
182
|
+
typeof p.name !== "string" ||
|
|
183
|
+
typeof p.version !== "string" ||
|
|
184
|
+
typeof p.integrity !== "string" ||
|
|
185
|
+
!/^sha(?:256|384|512)-[A-Za-z0-9+/]+={0,2}$/.test(p.integrity) ||
|
|
186
|
+
Buffer.from(p.integrity.split("-")[1], "base64").length !==
|
|
187
|
+
Number(p.integrity.slice(3).split("-")[0]) / 8 ||
|
|
188
|
+
!/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(p.version) ||
|
|
189
|
+
!Array.isArray(p.payload) ||
|
|
190
|
+
semanticHash(p.payload) !== p.payloadDigest
|
|
191
|
+
)
|
|
192
|
+
throw new Error("Invalid package closure");
|
|
193
|
+
if (
|
|
194
|
+
!p.resolution ||
|
|
195
|
+
typeof p.resolution !== "object" ||
|
|
196
|
+
Array.isArray(p.resolution) ||
|
|
197
|
+
Object.keys(p.resolution).some(
|
|
198
|
+
(k) => !["type", "main", "exports", "imports"].includes(k)
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
throw new Error("Invalid package resolution metadata");
|
|
202
|
+
if (s.kind === "tarball" && s.identity !== hash(p.integrity))
|
|
203
|
+
throw new Error("Invalid tarball content identity");
|
|
204
|
+
const payloadNames = new Set<string>();
|
|
205
|
+
for (const raw of p.payload) {
|
|
206
|
+
const f = exactObject(raw, ["path", "digest"], "payload file");
|
|
207
|
+
const name = portablePath(f.path, "payload path");
|
|
208
|
+
digest(f.digest, "payload file");
|
|
209
|
+
if (payloadNames.has(name)) throw new Error("Duplicate payload path");
|
|
210
|
+
payloadNames.add(name);
|
|
211
|
+
}
|
|
212
|
+
const location = p.lockLocation as string;
|
|
213
|
+
if (
|
|
214
|
+
packages.has(location) ||
|
|
215
|
+
location
|
|
216
|
+
.split("/node_modules/")
|
|
217
|
+
.at(-1)!
|
|
218
|
+
.replace(/^node_modules\//, "") !== p.name ||
|
|
219
|
+
!location.split("/").includes("node_modules")
|
|
220
|
+
)
|
|
221
|
+
throw new Error("Invalid package lock location");
|
|
222
|
+
if (
|
|
223
|
+
!files.some(
|
|
224
|
+
(file) =>
|
|
225
|
+
file.path === `${location}/package.json` &&
|
|
226
|
+
file.digest === p.metadataDigest
|
|
227
|
+
) ||
|
|
228
|
+
!(p.payload as ClosurePackage["payload"]).some(
|
|
229
|
+
(file) =>
|
|
230
|
+
file.path === "package.json" && file.digest === p.metadataDigest
|
|
231
|
+
)
|
|
232
|
+
)
|
|
233
|
+
throw new Error("Package metadata missing from payload/closure");
|
|
234
|
+
packages.set(location, p as unknown as ClosurePackage);
|
|
235
|
+
}
|
|
236
|
+
for (const file of files) {
|
|
237
|
+
const parts = file.path.split("/"),
|
|
238
|
+
index = parts.lastIndexOf("node_modules");
|
|
239
|
+
if (index < 0) continue;
|
|
240
|
+
const location = parts
|
|
241
|
+
.slice(0, index + (parts[index + 1]?.startsWith("@") ? 3 : 2))
|
|
242
|
+
.join("/");
|
|
243
|
+
const identity = packages.get(location);
|
|
244
|
+
if (
|
|
245
|
+
!identity?.payload.some(
|
|
246
|
+
(entry) =>
|
|
247
|
+
entry.path === file.path.slice(location.length + 1) &&
|
|
248
|
+
entry.digest === file.digest
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
throw new Error("Package file missing from locked payload");
|
|
252
|
+
}
|
|
253
|
+
const compiler = exactObject(
|
|
254
|
+
e.compiler,
|
|
255
|
+
["version", "options", "config"],
|
|
256
|
+
"closure compiler"
|
|
257
|
+
);
|
|
258
|
+
if (
|
|
259
|
+
compiler.version !== "5.9.3" ||
|
|
260
|
+
(compiler.config !== null &&
|
|
261
|
+
(typeof compiler.config !== "string" || !configFile(compiler.config)))
|
|
262
|
+
)
|
|
263
|
+
throw new Error("Unsupported closure compiler/adapter");
|
|
264
|
+
const options = exactObject(
|
|
265
|
+
compiler.options,
|
|
266
|
+
[
|
|
267
|
+
...Object.keys(closureRuntimeOptions),
|
|
268
|
+
...(compiler.options &&
|
|
269
|
+
typeof compiler.options === "object" &&
|
|
270
|
+
Object.hasOwn(compiler.options, "useDefineForClassFields")
|
|
271
|
+
? ["useDefineForClassFields"]
|
|
272
|
+
: []),
|
|
273
|
+
],
|
|
274
|
+
"effective compiler options"
|
|
275
|
+
);
|
|
276
|
+
for (const [key, value] of Object.entries(closureRuntimeOptions)) {
|
|
277
|
+
if (!["target", "esModuleInterop"].includes(key) && options[key] !== value)
|
|
278
|
+
throw new Error("Unsupported effective compiler option");
|
|
279
|
+
}
|
|
280
|
+
if (
|
|
281
|
+
typeof options.esModuleInterop !== "boolean" ||
|
|
282
|
+
typeof options.target !== "number" ||
|
|
283
|
+
![0,1,2,3,4,5,6,7,8,9,10,11,99,100].includes(options.target) ||
|
|
284
|
+
[0,100].includes(options.target) ||
|
|
285
|
+
(Object.hasOwn(options, "useDefineForClassFields") &&
|
|
286
|
+
typeof options.useDefineForClassFields !== "boolean")
|
|
287
|
+
)
|
|
288
|
+
throw new Error("Invalid effective compiler options");
|
|
289
|
+
const adapter = exactObject(
|
|
290
|
+
e.hostAdapter,
|
|
291
|
+
["kind", "preload", "packages"],
|
|
292
|
+
"host adapter"
|
|
293
|
+
);
|
|
294
|
+
if (
|
|
295
|
+
(adapter.kind !== "isolated-cjs" &&
|
|
296
|
+
adapter.kind !== "hardhat-2.26.3-ts-node-10.9.2") ||
|
|
297
|
+
!Array.isArray(adapter.packages)
|
|
298
|
+
)
|
|
299
|
+
throw new Error("Unsupported host adapter");
|
|
300
|
+
if (
|
|
301
|
+
adapter.kind === "isolated-cjs" &&
|
|
302
|
+
(adapter.preload !== null || adapter.packages.length)
|
|
303
|
+
)
|
|
304
|
+
throw new Error("Invalid isolated loader");
|
|
305
|
+
if (adapter.preload !== null) {
|
|
306
|
+
const p = exactObject(adapter.preload, ["path", "digest"], "preload");
|
|
307
|
+
portablePath(p.path, "preload");
|
|
308
|
+
digest(p.digest, "preload");
|
|
309
|
+
}
|
|
310
|
+
for (const raw of adapter.packages) {
|
|
311
|
+
const p = exactObject(
|
|
312
|
+
raw,
|
|
313
|
+
["name", "version", "metadataDigest"],
|
|
314
|
+
"adapter package"
|
|
315
|
+
);
|
|
316
|
+
digest(p.metadataDigest, "adapter metadata");
|
|
317
|
+
}
|
|
318
|
+
if (adapter.kind === "hardhat-2.26.3-ts-node-10.9.2") {
|
|
319
|
+
if (
|
|
320
|
+
adapter.preload === null ||
|
|
321
|
+
(adapter.preload as { path: string }).path !==
|
|
322
|
+
"node_modules/ts-node/register/index.js" ||
|
|
323
|
+
canonicalJson(
|
|
324
|
+
(adapter.packages as HostAdapter["packages"]).map((p) => [
|
|
325
|
+
p.name,
|
|
326
|
+
p.version,
|
|
327
|
+
])
|
|
328
|
+
) !==
|
|
329
|
+
canonicalJson([
|
|
330
|
+
["ts-node", "10.9.2"],
|
|
331
|
+
["hardhat", "2.26.3"],
|
|
332
|
+
])
|
|
333
|
+
)
|
|
334
|
+
throw new Error("Invalid pinned preload adapter");
|
|
335
|
+
}
|
|
336
|
+
const resolver = exactObject(
|
|
337
|
+
e.resolver,
|
|
338
|
+
["policy", "version", "flags", "environment"],
|
|
339
|
+
"resolver"
|
|
340
|
+
);
|
|
341
|
+
if (
|
|
342
|
+
resolver.policy !== "node-default-cjs" ||
|
|
343
|
+
typeof resolver.version !== "string" ||
|
|
344
|
+
!/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(resolver.version) ||
|
|
345
|
+
resolver.environment !== "empty" ||
|
|
346
|
+
canonicalJson(resolver.flags) !== canonicalJson(["--preserve-symlinks"])
|
|
347
|
+
)
|
|
348
|
+
throw new Error("Unsupported resolver policy");
|
|
349
|
+
return deepFreeze(e as unknown as CustomInputClosure);
|
|
350
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// Reviewed vendor identity. Refresh explicitly after rebuilding from committed canonical sources.
|
|
2
|
+
export const PLAN_CODEC_PROVENANCE_SHA256 = '63bc721e90943e08478a67a72d1bef8ce69a034552f225b90ee2c6e5396785ce';
|
|
3
|
+
export const PLAN_CODEC_SOURCE_COMMIT = '9b175e7906ca6735aeca92b50ce7cf716d980f17';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { PLAN_CODEC_PROVENANCE_SHA256, PLAN_CODEC_SOURCE_COMMIT } from './codec-pin';
|
|
5
|
+
import type * as Canonical from '../vendor/plan-codec/index.cjs';
|
|
6
|
+
|
|
7
|
+
const sha256 = (bytes: Buffer): string => createHash('sha256').update(bytes).digest('hex');
|
|
8
|
+
function regularBytes(directory: string, name: string): Buffer {
|
|
9
|
+
const file = path.join(directory, name);
|
|
10
|
+
const stat = fs.lstatSync(file);
|
|
11
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1) throw new Error(`Unsafe codec artifact: ${name}`);
|
|
12
|
+
return fs.readFileSync(file);
|
|
13
|
+
}
|
|
14
|
+
/** The reviewed pin protects provenance as well as the bundle. No checkout or network is used. */
|
|
15
|
+
export function verifyPlanCodec(directory: string): void {
|
|
16
|
+
if (fs.lstatSync(directory).isSymbolicLink()) throw new Error('Unsafe codec directory');
|
|
17
|
+
const bytes = regularBytes(directory, 'provenance.json');
|
|
18
|
+
if (sha256(bytes) !== PLAN_CODEC_PROVENANCE_SHA256) throw new Error('Plan codec provenance digest mismatch');
|
|
19
|
+
const manifest = JSON.parse(bytes.toString('utf8'));
|
|
20
|
+
if (manifest.formatVersion !== 1 || manifest.name !== 'gateflow-plan-read-only' || manifest.version !== 1
|
|
21
|
+
|| manifest.schema !== 'gateflow-plan/v2' || manifest.definitionContract !== 'gateflow-plan/definition@1'
|
|
22
|
+
|| manifest.sourceCommit !== PLAN_CODEC_SOURCE_COMMIT) throw new Error('Unsupported plan codec provenance');
|
|
23
|
+
for (const name of ['index.cjs', 'index.d.cts']) {
|
|
24
|
+
if (sha256(regularBytes(directory, name)) !== manifest.artifacts[name]) throw new Error(`Plan codec artifact digest mismatch: ${name}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function loadPlanCodec(): typeof Canonical {
|
|
28
|
+
const directory = path.join(__dirname, '..', 'vendor', 'plan-codec');
|
|
29
|
+
verifyPlanCodec(directory);
|
|
30
|
+
return require(path.join(directory, 'index.cjs')) as typeof Canonical;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface PlanCodecObservation {
|
|
34
|
+
schema: 'gateflow-plan/v2'; definitionContract: 'gateflow-plan/definition@1'; sourceCommit: string;
|
|
35
|
+
provenanceHash: string; bundleHash: string; declarationHash: string;
|
|
36
|
+
}
|
|
37
|
+
/** Own the actual loader seam, including a cached bundle's continued file/module association. */
|
|
38
|
+
export function openPlanCodecObservation(): {readonly snapshot: Readonly<PlanCodecObservation>; assertUnchanged():void; seal():Readonly<PlanCodecObservation>; close():void} {
|
|
39
|
+
const directory=path.join(__dirname,'..','vendor','plan-codec');
|
|
40
|
+
const loaded=loadPlanCodec(),entry=path.join(directory,'index.cjs');
|
|
41
|
+
const observe=():Readonly<PlanCodecObservation>=>{
|
|
42
|
+
verifyPlanCodec(directory);
|
|
43
|
+
if(require.cache[entry]?.exports!==loaded)throw new Error('Plan codec loaded module drift');
|
|
44
|
+
return Object.freeze({schema:'gateflow-plan/v2',definitionContract:'gateflow-plan/definition@1',sourceCommit:PLAN_CODEC_SOURCE_COMMIT,
|
|
45
|
+
provenanceHash:sha256(regularBytes(directory,'provenance.json')),bundleHash:sha256(regularBytes(directory,'index.cjs')),declarationHash:sha256(regularBytes(directory,'index.d.cts'))});
|
|
46
|
+
};
|
|
47
|
+
const snapshot=observe();let open=true;
|
|
48
|
+
const check=()=>{if(!open)throw new Error('Plan codec observation closed');if(JSON.stringify(observe())!==JSON.stringify(snapshot))throw new Error('Plan codec observation drift');};
|
|
49
|
+
return Object.freeze({snapshot,assertUnchanged(){try{check();}catch(error){open=false;throw error;}},seal(){try{check();return snapshot;}finally{open=false;}},close(){open=false;}});
|
|
50
|
+
}
|