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,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Interface,
|
|
3
|
+
ParamType,
|
|
4
|
+
Result,
|
|
5
|
+
isAddress,
|
|
6
|
+
getAddress,
|
|
7
|
+
type InterfaceAbi,
|
|
8
|
+
} from "ethers";
|
|
9
|
+
import { strictData, copyOwnData } from "./data";
|
|
10
|
+
import { DEFERRED } from "./references";
|
|
11
|
+
/** Explicit runtime return boundary. Only bigint and ethers Result extend own JSON data. */
|
|
12
|
+
export function normalizeRuntimeValue(value: unknown): unknown {
|
|
13
|
+
if (typeof value === "bigint") return value.toString(10);
|
|
14
|
+
if (value instanceof Result)
|
|
15
|
+
return value.toArray(true).map(normalizeRuntimeValue);
|
|
16
|
+
if (Array.isArray(value)) {
|
|
17
|
+
if (Object.getPrototypeOf(value) !== Array.prototype)
|
|
18
|
+
throw new Error("Invalid runtime array prototype");
|
|
19
|
+
// Check shape/descriptors before reading; bigint is deliberately normalized afterwards.
|
|
20
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
21
|
+
if (
|
|
22
|
+
Object.getOwnPropertySymbols(value).length ||
|
|
23
|
+
Object.keys(descriptors).length !== value.length + 1
|
|
24
|
+
)
|
|
25
|
+
throw new Error("Invalid runtime array");
|
|
26
|
+
return Array.from({ length: value.length }, (_, i) => {
|
|
27
|
+
const d = descriptors[String(i)];
|
|
28
|
+
if (!d || !d.enumerable || !("value" in d))
|
|
29
|
+
throw new Error("Invalid runtime array");
|
|
30
|
+
return normalizeRuntimeValue(d.value);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return strictData(value);
|
|
34
|
+
}
|
|
35
|
+
export function validateAbiValue(
|
|
36
|
+
type: ParamType,
|
|
37
|
+
value: unknown,
|
|
38
|
+
label = "ABI value",
|
|
39
|
+
allowDeferred = false,
|
|
40
|
+
): void {
|
|
41
|
+
value = copyOwnData(value, label, allowDeferred ? DEFERRED : undefined);
|
|
42
|
+
if (value === DEFERRED && allowDeferred) return;
|
|
43
|
+
const fail = () => {
|
|
44
|
+
throw new Error(`${label} must match ABI ${type.format("sighash")}`);
|
|
45
|
+
};
|
|
46
|
+
if (type.baseType === "array") {
|
|
47
|
+
if (
|
|
48
|
+
!Array.isArray(value) ||
|
|
49
|
+
(type.arrayLength !== -1 && value.length !== type.arrayLength)
|
|
50
|
+
)
|
|
51
|
+
return fail();
|
|
52
|
+
value.forEach((v, i) =>
|
|
53
|
+
validateAbiValue(type.arrayChildren!, v, `${label}[${i}]`, allowDeferred),
|
|
54
|
+
);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (type.baseType === "tuple") {
|
|
58
|
+
const components = type.components!;
|
|
59
|
+
if (Array.isArray(value)) {
|
|
60
|
+
if (value.length !== components.length) return fail();
|
|
61
|
+
components.forEach((c, i) =>
|
|
62
|
+
validateAbiValue(c, value[i], `${label}[${i}]`, allowDeferred),
|
|
63
|
+
);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!value || typeof value !== "object") return fail();
|
|
67
|
+
const names = components.map((c) => c.name);
|
|
68
|
+
if (
|
|
69
|
+
names.some((n) => !n) ||
|
|
70
|
+
new Set(names).size !== names.length ||
|
|
71
|
+
Object.keys(value).sort().join("\0") !== names.slice().sort().join("\0")
|
|
72
|
+
)
|
|
73
|
+
return fail();
|
|
74
|
+
components.forEach((c) =>
|
|
75
|
+
validateAbiValue(
|
|
76
|
+
c,
|
|
77
|
+
(value as Record<string, unknown>)[c.name],
|
|
78
|
+
`${label}.${c.name}`,
|
|
79
|
+
allowDeferred,
|
|
80
|
+
),
|
|
81
|
+
);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (type.type === "bool") {
|
|
85
|
+
if (typeof value !== "boolean") fail();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const integer = /^(u?int)([0-9]+)$/.exec(type.type);
|
|
89
|
+
if (integer) {
|
|
90
|
+
if (
|
|
91
|
+
!(typeof value === "number" && Number.isSafeInteger(value)) &&
|
|
92
|
+
!(typeof value === "string" && /^(0|-?[1-9][0-9]*)$/.test(value))
|
|
93
|
+
)
|
|
94
|
+
return fail();
|
|
95
|
+
const bits = BigInt(integer[2]),
|
|
96
|
+
signed = integer[1] === "int",
|
|
97
|
+
n = BigInt(value as string | number);
|
|
98
|
+
if (
|
|
99
|
+
n < (signed ? -(1n << (bits - 1n)) : 0n) ||
|
|
100
|
+
n > (signed ? (1n << (bits - 1n)) - 1n : (1n << bits) - 1n)
|
|
101
|
+
)
|
|
102
|
+
fail();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (type.type === "address") {
|
|
106
|
+
if (typeof value !== "string" || !isAddress(value)) fail();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (type.type === "string") {
|
|
110
|
+
if (typeof value !== "string") fail();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const bytes = /^bytes([0-9]*)$/.exec(type.type);
|
|
114
|
+
if (bytes) {
|
|
115
|
+
if (
|
|
116
|
+
typeof value !== "string" ||
|
|
117
|
+
!/^0x(?:[a-fA-F0-9]{2})*$/.test(value) ||
|
|
118
|
+
(bytes[1] && value.length !== 2 + 2 * Number(bytes[1]))
|
|
119
|
+
)
|
|
120
|
+
fail();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
throw new Error(`Unsupported ABI type ${type.type}`);
|
|
124
|
+
}
|
|
125
|
+
function boundary(value: unknown, allowDeferred: boolean): unknown {
|
|
126
|
+
return copyOwnData(value, "ABI input", allowDeferred ? DEFERRED : undefined);
|
|
127
|
+
}
|
|
128
|
+
export function validateAbiArguments(
|
|
129
|
+
abi: InterfaceAbi,
|
|
130
|
+
method: string | null,
|
|
131
|
+
args: unknown,
|
|
132
|
+
options: { allowDeferred?: boolean } = {},
|
|
133
|
+
): void {
|
|
134
|
+
const allow = options.allowDeferred === true;
|
|
135
|
+
const input = boundary(args, allow),
|
|
136
|
+
iface = new Interface(abi);
|
|
137
|
+
const fragment = method === null ? iface.deploy : iface.getFunction(method);
|
|
138
|
+
if (!fragment) throw new Error(`Unknown ABI method ${method}`);
|
|
139
|
+
if (input === DEFERRED)
|
|
140
|
+
throw new Error(
|
|
141
|
+
"Future state requires explicit ABI argument count and shape",
|
|
142
|
+
);
|
|
143
|
+
if (!Array.isArray(input) || input.length !== fragment.inputs.length)
|
|
144
|
+
throw new Error(
|
|
145
|
+
`ABI argument count mismatch for ${method ?? "constructor"}`,
|
|
146
|
+
);
|
|
147
|
+
fragment.inputs.forEach((type, i) =>
|
|
148
|
+
validateAbiValue(
|
|
149
|
+
type,
|
|
150
|
+
input[i],
|
|
151
|
+
`${method ?? "constructor"} args[${i}]`,
|
|
152
|
+
allow,
|
|
153
|
+
),
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
export function validateTransactionValue(
|
|
157
|
+
value: unknown,
|
|
158
|
+
allowDeferred = false,
|
|
159
|
+
): void {
|
|
160
|
+
validateAbiValue(
|
|
161
|
+
ParamType.from("uint256"),
|
|
162
|
+
value,
|
|
163
|
+
"transaction value",
|
|
164
|
+
allowDeferred,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function validateAbiResult(
|
|
169
|
+
abi: InterfaceAbi,
|
|
170
|
+
method: string,
|
|
171
|
+
raw: unknown,
|
|
172
|
+
allowDeferred = false,
|
|
173
|
+
): void {
|
|
174
|
+
const value = boundary(raw, allowDeferred),
|
|
175
|
+
fragment = new Interface(abi).getFunction(method);
|
|
176
|
+
if (!fragment) throw new Error("Unknown ABI method");
|
|
177
|
+
if (fragment.outputs.length === 1)
|
|
178
|
+
validateAbiValue(
|
|
179
|
+
fragment.outputs[0],
|
|
180
|
+
value,
|
|
181
|
+
"expected result",
|
|
182
|
+
allowDeferred,
|
|
183
|
+
);
|
|
184
|
+
else {
|
|
185
|
+
if (!Array.isArray(value) || value.length !== fragment.outputs.length)
|
|
186
|
+
throw new Error("ABI result count mismatch");
|
|
187
|
+
fragment.outputs.forEach((p, i) =>
|
|
188
|
+
validateAbiValue(p, value[i], `expected result[${i}]`, allowDeferred),
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function comparable(type: ParamType, value: any): unknown {
|
|
193
|
+
if (type.baseType === "array")
|
|
194
|
+
return value.map((v: unknown) => comparable(type.arrayChildren!, v));
|
|
195
|
+
if (type.baseType === "tuple")
|
|
196
|
+
return type.components!.map((p, i) =>
|
|
197
|
+
comparable(p, Array.isArray(value) ? value[i] : value[p.name]),
|
|
198
|
+
);
|
|
199
|
+
if (/^(u?int)[0-9]+$/.test(type.type)) return BigInt(value).toString();
|
|
200
|
+
if (type.type === "address") return getAddress(value).toLowerCase();
|
|
201
|
+
if (type.type.startsWith("bytes")) return value.toLowerCase();
|
|
202
|
+
return value;
|
|
203
|
+
}
|
|
204
|
+
export function stringifyRuntimeValue(value: unknown): string {
|
|
205
|
+
const data = normalizeRuntimeValue(value);
|
|
206
|
+
return typeof data === "string" ? data : JSON.stringify(data);
|
|
207
|
+
}
|
|
208
|
+
export function compareAbiResults(
|
|
209
|
+
abi: InterfaceAbi,
|
|
210
|
+
method: string,
|
|
211
|
+
actual: unknown,
|
|
212
|
+
expected: unknown,
|
|
213
|
+
): { actual: string; expected: string } {
|
|
214
|
+
const normalized = normalizeRuntimeValue(actual);
|
|
215
|
+
validateAbiResult(abi, method, normalized);
|
|
216
|
+
validateAbiResult(abi, method, expected);
|
|
217
|
+
const outputs = new Interface(abi).getFunction(method)!.outputs;
|
|
218
|
+
const encode = (v: any) =>
|
|
219
|
+
stringifyRuntimeValue(
|
|
220
|
+
outputs.length === 1
|
|
221
|
+
? comparable(outputs[0], v)
|
|
222
|
+
: outputs.map((p, i) => comparable(p, v[i])),
|
|
223
|
+
);
|
|
224
|
+
return { actual: encode(normalized), expected: encode(expected) };
|
|
225
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Private fixed-worker bootstrap. Never accepts caller config overrides. */
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import type { HardhatConfig } from 'hardhat/types';
|
|
4
|
+
let fork:Readonly<{network:string;chainId:number;url:string;blockNumber:number}>|undefined;
|
|
5
|
+
const policies=new WeakMap<object,HardhatConfig['networks']['hardhat']>();
|
|
6
|
+
export function establishOwnedFork(input:NonNullable<typeof fork>):void {
|
|
7
|
+
if(fork||require.main?.filename!==path.join(__dirname,'aggregate-worker.js')||!process.send||!process.connected)
|
|
8
|
+
throw new Error('Owned worker fork bootstrap required');
|
|
9
|
+
const url=new URL(input.url);
|
|
10
|
+
if(url.protocol!=='http:'||url.hostname!=='127.0.0.1'||!/^\/[a-f0-9-]{36}$/.test(url.pathname)||url.username||url.password||url.search||url.hash)
|
|
11
|
+
throw new Error('Owned source proxy required');
|
|
12
|
+
fork=Object.freeze({...input});
|
|
13
|
+
}
|
|
14
|
+
export function registerOwnedFork(extendConfig:typeof import('hardhat/config').extendConfig):void {
|
|
15
|
+
if(!fork)return;
|
|
16
|
+
extendConfig(config=>{
|
|
17
|
+
if(config.networks[fork!.network]?.chainId!==fork!.chainId)throw new Error('Owned fork target chain mismatch');
|
|
18
|
+
policies.set(config,config.networks.hardhat);
|
|
19
|
+
config.networks.hardhat={...config.networks.hardhat,chainId:fork!.chainId,
|
|
20
|
+
forking:{enabled:true,url:fork!.url,blockNumber:fork!.blockNumber,httpHeaders:{}}};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function originalRunnerPolicy(config:HardhatConfig):HardhatConfig['networks']['hardhat'] {
|
|
24
|
+
return policies.get(config)??config.networks.hardhat;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function assertOwnedTargetWorker():void {
|
|
28
|
+
if(!fork||require.main?.filename!==path.join(__dirname,'aggregate-worker.js')||!process.send||!process.connected)throw new Error('Owned target worker required');
|
|
29
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Finite private protocol. A nonce correlates an actual child; it is not process attestation. */
|
|
2
|
+
import {productionChildEnvironment} from './production-environment';
|
|
3
|
+
import {fork,type ChildProcess} from 'node:child_process';
|
|
4
|
+
import {randomUUID} from 'node:crypto';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import {strictData} from './data';
|
|
7
|
+
import {exactObject} from '../workflow/lib/canonicalData';
|
|
8
|
+
export class OwnedWorkerFailure extends Error {}
|
|
9
|
+
export type Command='stage'|'check'|'bind'|'close'|'abort';
|
|
10
|
+
export interface WorkerMessage {version:1;session:string;epoch:string;target:string;id:number;command:Command;data:unknown}
|
|
11
|
+
export function parseWorkerMessage(raw:unknown):WorkerMessage {
|
|
12
|
+
const x=exactObject(strictData(raw),['version','session','epoch','target','id','command','data'],'worker message');
|
|
13
|
+
if(x.version!==1||typeof x.session!=='string'||typeof x.epoch!=='string'||typeof x.target!=='string'||!Number.isSafeInteger(x.id)||Number(x.id)<1||!['stage','check','bind','close','abort'].includes(String(x.command)))throw new OwnedWorkerFailure('Invalid worker protocol');
|
|
14
|
+
return x as unknown as WorkerMessage;
|
|
15
|
+
}
|
|
16
|
+
export class OwnedWorker {
|
|
17
|
+
readonly #child:ChildProcess;
|
|
18
|
+
readonly epoch=randomUUID();
|
|
19
|
+
#id=0;#state:'new'|'staging'|'staged'|'checked'|'bound'|'closing'|'closed'|'failed'='new';
|
|
20
|
+
#pending?:{message:WorkerMessage;resolve:(v:any)=>void;reject:(e:Error)=>void;timer:NodeJS.Timeout};
|
|
21
|
+
#failure?:Error;
|
|
22
|
+
readonly #exit:Promise<void>;
|
|
23
|
+
#exited=false;
|
|
24
|
+
constructor(readonly root:string,readonly session:string,readonly target:string,readonly role:'source'|'target',readonly failAggregate:(error:Error)=>void){
|
|
25
|
+
const env=productionChildEnvironment(process.env);
|
|
26
|
+
for(const key of ['GATE_DELIVERY_CONTEXT','GATE_WORKFLOW_TARGET','MANIFEST_DEFAULT_DIR','HARDHAT_NETWORK','GATE_FORK_PROXY_HANDSHAKE','GATE_WORKFLOW_SIMULATION_FORK','GATE_WORKFLOW_SIMULATION_SOURCE_RPC'])delete env[key];
|
|
27
|
+
Object.assign(env,{HARDHAT_CONFIG:path.join(root,'hardhat.config.ts'),HARDHAT_TSCONFIG:path.join(root,'tsconfig.json'),HARDHAT_DISABLE_TELEMETRY_PROMPT:'true'});
|
|
28
|
+
this.#child=fork(path.join(__dirname,'aggregate-worker.js'),[],{cwd:root,env,execArgv:[],stdio:['ignore','ignore','ignore','ipc'],serialization:'json'});
|
|
29
|
+
this.#child.on('message',raw=>{
|
|
30
|
+
try{
|
|
31
|
+
const reply=parseWorkerMessage(raw),pending=this.#pending;
|
|
32
|
+
if(!pending||reply.session!==session||reply.target!==target||reply.epoch!==this.epoch||reply.id!==pending.message.id||reply.command!==pending.message.command)throw new OwnedWorkerFailure('Unexpected worker protocol reply');
|
|
33
|
+
const value=exactObject(reply.data,['ok','value'],'worker reply');
|
|
34
|
+
if(value.ok!==true){
|
|
35
|
+
const details=exactObject(value.value,['phase'],'worker failure');
|
|
36
|
+
const phases=['protocol','project-loader','source-open','source-configuration','fork-setup','target-configuration','compile','planning','staged-reread','barrier','configuration-seal','binding'];
|
|
37
|
+
if(!phases.includes(String(details.phase)))throw new Error('Invalid worker failure');
|
|
38
|
+
this.fail(new OwnedWorkerFailure('Owned worker failed during '+details.phase));return;
|
|
39
|
+
}
|
|
40
|
+
clearTimeout(pending.timer);this.#pending=undefined;pending.resolve(value.value);
|
|
41
|
+
}catch{this.fail(new OwnedWorkerFailure('Owned worker failed or sent an invalid reply'));}
|
|
42
|
+
});
|
|
43
|
+
this.#child.on('error',()=>this.fail(new OwnedWorkerFailure('Owned worker process failed')));
|
|
44
|
+
this.#child.on('disconnect',()=>{if(!['closing','closed','failed'].includes(this.#state))this.fail(new OwnedWorkerFailure('Unexpected worker disconnect'));});
|
|
45
|
+
this.#exit=new Promise(resolve=>this.#child.once('exit',(code,signal)=>{
|
|
46
|
+
this.#exited=true;
|
|
47
|
+
if(this.#state!=='closing'||code!==0||signal!==null)this.fail(new OwnedWorkerFailure('Unexpected worker exit'));
|
|
48
|
+
else this.#state='closed';
|
|
49
|
+
resolve();
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
get pid():number|undefined{return this.#child.pid;}
|
|
53
|
+
assertLive():void {if(this.#failure||this.#exited||!this.#child.connected)throw this.#failure??new OwnedWorkerFailure('Worker is not live');}
|
|
54
|
+
private fail(error:Error):void {
|
|
55
|
+
if(this.#failure)return;this.#failure=error;this.#state='failed';
|
|
56
|
+
if(this.#pending){clearTimeout(this.#pending.timer);this.#pending.reject(error);this.#pending=undefined;}
|
|
57
|
+
this.failAggregate(error);
|
|
58
|
+
}
|
|
59
|
+
async request(command:Command,data:unknown=null):Promise<any>{
|
|
60
|
+
this.assertLive();
|
|
61
|
+
const allowed=command==='stage'?this.#state==='new':command==='check'?this.#state==='staged':command==='bind'?this.role==='target'&&this.#state==='checked':command==='close'?(this.role==='source'?this.#state==='checked':this.#state==='bound'):false;
|
|
62
|
+
if(!allowed||this.#pending){const error=new OwnedWorkerFailure('Worker protocol order violation');this.fail(error);throw error;}
|
|
63
|
+
const next=command==='stage'?'staged':command==='check'?'checked':command==='bind'?'bound':'closed';
|
|
64
|
+
this.#state=command==='stage'?'staging':command==='close'?'closing':this.#state;
|
|
65
|
+
const message:WorkerMessage={version:1,session:this.session,epoch:this.epoch,target:this.target,id:++this.#id,command,data:strictData(data)};
|
|
66
|
+
const result=await new Promise<any>((resolve,reject)=>{
|
|
67
|
+
const timer=setTimeout(()=>this.fail(new OwnedWorkerFailure('Owned worker request timed out')),180000);
|
|
68
|
+
this.#pending={message,resolve,reject,timer};
|
|
69
|
+
this.#child.send(message,error=>{if(error)this.fail(new OwnedWorkerFailure('Owned worker channel failed'));});
|
|
70
|
+
});
|
|
71
|
+
if(command==='close'){
|
|
72
|
+
await this.reap(false);if(this.#failure)throw this.#failure;
|
|
73
|
+
}else{this.assertLive();this.#state=next as 'staged'|'checked'|'bound'|'closed';}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
async reap(abort=true):Promise<void>{
|
|
77
|
+
if(this.#exited)return;
|
|
78
|
+
if(abort){this.#state='failed';if(this.#pending){clearTimeout(this.#pending.timer);this.#pending.reject(new OwnedWorkerFailure('Aggregate aborted'));this.#pending=undefined;}this.#child.kill('SIGTERM');}
|
|
79
|
+
let timer:NodeJS.Timeout|undefined;
|
|
80
|
+
try{await Promise.race([this.#exit,new Promise<never>((_,reject)=>{timer=setTimeout(()=>reject(new OwnedWorkerFailure('Worker did not exit')),5000);})]);}
|
|
81
|
+
catch{this.#child.kill('SIGKILL');await Promise.race([this.#exit,new Promise<never>((_,reject)=>{timer=setTimeout(()=>reject(new OwnedWorkerFailure('Worker could not be reaped')),5000);})]);}
|
|
82
|
+
finally{if(timer)clearTimeout(timer);}
|
|
83
|
+
if(!this.#exited)throw new OwnedWorkerFailure('Worker exit unproven');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Actual multi-root codec projections; selected task order belongs to the canonical codec. */
|
|
2
|
+
import {readDeliverySource,readOwnedDeliverySource} from './source';
|
|
3
|
+
import type {DeliveryRequest} from './protocol';
|
|
4
|
+
import {canonicalJson,deepFreeze,semanticHash} from '../workflow/lib/canonicalData';
|
|
5
|
+
export function openAggregateSources(input:{workspaceRoot:string;projectRoot:string;requests:readonly DeliveryRequest[]}) {
|
|
6
|
+
const read=()=>{
|
|
7
|
+
const sources=input.requests.map(request=>readOwnedDeliverySource({workspaceRoot:input.workspaceRoot,projectRoot:input.projectRoot,request}));
|
|
8
|
+
const groups=new Map<string,typeof sources>();
|
|
9
|
+
for(const source of sources){const key=source.request.sourceRef.path+'\0'+source.request.sourceRef.taskId;const group=groups.get(key)??[];group.push(source);groups.set(key,group);}
|
|
10
|
+
const definitions=[];const tasks=new Map<string,unknown>(),lanes=new Map<string,unknown>();
|
|
11
|
+
let identity:string|undefined;
|
|
12
|
+
for(const group of groups.values()){
|
|
13
|
+
const first=group[0];
|
|
14
|
+
const projection=readDeliverySource({workspaceRoot:input.workspaceRoot,projectRoot:input.projectRoot,request:first.request,
|
|
15
|
+
sourceRoots:group.map(source=>source.invocation.task.planKey)});
|
|
16
|
+
if(group.some(source=>source.observation.sha256!==projection.observation.sha256))throw new Error('Handoff changed during multi-root source capture');
|
|
17
|
+
const definition=projection.sourceDefinition;
|
|
18
|
+
const currentIdentity=canonicalJson([definition.contract,definition.schema,definition.taskId,definition.flow??null]);
|
|
19
|
+
if(identity!==undefined&&identity!==currentIdentity)throw new Error('Conflicting aggregate handoff identity');
|
|
20
|
+
identity=currentIdentity;
|
|
21
|
+
for(const [key,lane] of Object.entries(definition.lanes)){
|
|
22
|
+
if(lanes.has(key)&&canonicalJson(lanes.get(key))!==canonicalJson(lane))throw new Error('Conflicting aggregate lane definition');
|
|
23
|
+
lanes.set(key,lane);
|
|
24
|
+
}
|
|
25
|
+
// Detect conflicting duplicates across documents without sorting/reconstructing any codec task list.
|
|
26
|
+
for(const task of projection.sourceDefinition.tasks){const key=first.request.sourceRef.taskId+'\0'+task.planKey;
|
|
27
|
+
if(tasks.has(key)&&canonicalJson(tasks.get(key))!==canonicalJson(task))throw new Error('Conflicting aggregate source definition');tasks.set(key,task);
|
|
28
|
+
}
|
|
29
|
+
definitions.push({path:first.request.sourceRef.path,definition:projection.sourceDefinition});
|
|
30
|
+
}
|
|
31
|
+
return {sources,definitions:deepFreeze(definitions)};
|
|
32
|
+
};
|
|
33
|
+
const initial=read();
|
|
34
|
+
return Object.freeze({...initial,sourceDefinitionHash:semanticHash(initial.definitions),assertUnchanged(){
|
|
35
|
+
const current=read();
|
|
36
|
+
if(canonicalJson(current.definitions)!==canonicalJson(initial.definitions))throw new Error('Aggregate source definition drift');
|
|
37
|
+
for(let i=0;i<current.sources.length;i++)if(canonicalJson(current.sources[i].invocation.task.scope)!==canonicalJson(initial.sources[i].invocation.task.scope))throw new Error('Aggregate invocation drift');
|
|
38
|
+
}});
|
|
39
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Package-owned EVM source read capability, using the workflow's reviewed allowlist. */
|
|
2
|
+
import http from 'node:http';
|
|
3
|
+
import {randomUUID} from 'node:crypto';
|
|
4
|
+
import {isAllowedSourceRpcMethod} from '../workflow/lib/sourceRpcPolicy';
|
|
5
|
+
import type {DeliveryRequest} from './protocol';
|
|
6
|
+
import type {HardhatRuntimeEnvironment} from 'hardhat/types';
|
|
7
|
+
export interface SourceHandshake {
|
|
8
|
+
version:1;session:string;epoch:string;target:string;proxyUrl:string;
|
|
9
|
+
snapshot:{version:1;sourceNetwork:string;chainId:number;blockNumber:number;blockHash:string;runner:{kind:'hardhat';version:'2.26.3'}};
|
|
10
|
+
}
|
|
11
|
+
export async function openOwnedSource(hre:HardhatRuntimeEnvironment,request:DeliveryRequest,session:string,epoch:string):Promise<{
|
|
12
|
+
handshake:SourceHandshake;check():Promise<void>;close():Promise<void>;
|
|
13
|
+
}> {
|
|
14
|
+
if(hre.network.name!==request.network)throw new Error('Source HRE network mismatch');
|
|
15
|
+
const provider=hre.network.provider;
|
|
16
|
+
const rpc=(method:string,params:unknown[]=[])=>provider.request({method,params});
|
|
17
|
+
const chainId=Number(BigInt(await rpc('eth_chainId') as string));
|
|
18
|
+
if(!Number.isSafeInteger(chainId)||chainId!==hre.network.config.chainId)throw new Error('Source chain identity mismatch');
|
|
19
|
+
const tag=request.fork?'0x'+request.fork.blockNumber.toString(16):'latest';
|
|
20
|
+
const block=await rpc('eth_getBlockByNumber',[tag,false]) as any;
|
|
21
|
+
if(!block||!/^0x[a-fA-F0-9]{64}$/.test(block.hash)||!/^0x[\da-f]+$/i.test(block.number))throw new Error('Source pinned block unavailable');
|
|
22
|
+
const blockNumber=Number(BigInt(block.number)),blockHash=block.hash.toLowerCase();
|
|
23
|
+
if(request.fork&&(request.fork.blockNumber!==blockNumber||request.fork.blockHash.toLowerCase()!==blockHash))throw new Error('Source pinned block mismatch');
|
|
24
|
+
const token=randomUUID(),endpoint='/'+token;
|
|
25
|
+
const reply=(res:http.ServerResponse,status:number,value:unknown)=>{const body=JSON.stringify(value);res.writeHead(status,{'content-type':'application/json','content-length':Buffer.byteLength(body)});res.end(body);};
|
|
26
|
+
const forward=async(raw:any)=>{
|
|
27
|
+
const error=(code:number,message:string)=>({jsonrpc:'2.0',id:raw?.id??null,error:{code,message}});
|
|
28
|
+
if(!raw||typeof raw!=='object'||Array.isArray(raw)||raw.jsonrpc!=='2.0'||typeof raw.method!=='string'||(raw.params!==undefined&&!Array.isArray(raw.params)))return error(-32600,'Invalid JSON-RPC request');
|
|
29
|
+
if(!isAllowedSourceRpcMethod(raw.method))return error(-32601,'Source RPC method is not allowed');
|
|
30
|
+
try{return {jsonrpc:'2.0',id:raw.id??null,result:await rpc(raw.method,raw.params??[])};}catch{return error(-32000,'Source RPC request failed');}
|
|
31
|
+
};
|
|
32
|
+
const server=http.createServer(async(req,res)=>{
|
|
33
|
+
if(req.method!=='POST'||req.url!==endpoint){reply(res,404,{error:'Unknown JSON-RPC endpoint'});return;}
|
|
34
|
+
try{
|
|
35
|
+
const chunks:Buffer[]=[];let size=0;
|
|
36
|
+
for await(const chunk of req){size+=chunk.length;if(size>10*1024*1024)throw new Error();chunks.push(Buffer.from(chunk));}
|
|
37
|
+
const raw=JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
38
|
+
reply(res,200,Array.isArray(raw)?await Promise.all(raw.map(forward)):await forward(raw));
|
|
39
|
+
}catch{reply(res,400,{error:'Invalid JSON-RPC payload'});}
|
|
40
|
+
});
|
|
41
|
+
await new Promise<void>((resolve,reject)=>{server.once('error',reject);server.listen(0,'127.0.0.1',resolve);});
|
|
42
|
+
const address=server.address();if(!address||typeof address==='string')throw new Error('Source proxy did not bind');
|
|
43
|
+
return {
|
|
44
|
+
handshake:{version:1,session,epoch,target:request.network,proxyUrl:`http://127.0.0.1:${address.port}${endpoint}`,
|
|
45
|
+
snapshot:{version:1,sourceNetwork:request.network,chainId,blockNumber,blockHash,runner:{kind:'hardhat',version:'2.26.3'}}},
|
|
46
|
+
async check(){
|
|
47
|
+
if(hre.network.provider!==provider||hre.network.name!==request.network)throw new Error('Source provider changed');
|
|
48
|
+
const [chain,current]=await Promise.all([rpc('eth_chainId'),rpc('eth_getBlockByNumber',['0x'+blockNumber.toString(16),false])]) as any[];
|
|
49
|
+
if(Number(BigInt(chain))!==chainId||current?.hash?.toLowerCase()!==blockHash||Number(BigInt(current.number))!==blockNumber)throw new Error('Source pinned block drift');
|
|
50
|
+
},
|
|
51
|
+
close:()=>new Promise<void>((resolve,reject)=>{server.close(error=>error?reject(error):resolve());server.closeAllConnections();}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/** Fixed package entry; business modules are loaded only after the private stage command. */
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import {createRequire} from 'node:module';
|
|
5
|
+
import {parseWorkerMessage,type WorkerMessage} from './aggregate-channel';
|
|
6
|
+
import {strictData} from './data';
|
|
7
|
+
import {canonicalJson,deepFreeze,semanticHash,exactObject} from '../workflow/lib/canonicalData';
|
|
8
|
+
import type {StagedDeliveryCollection,DeliveryCollection} from './planning';
|
|
9
|
+
import type {DeliveryConfigurationHandle,DeliveryConfigurationEvidence} from './configuration';
|
|
10
|
+
import type {DeliveryCompilerCollector,CompilerEvidence} from './compiler';
|
|
11
|
+
import type {openOwnedSource} from './aggregate-source';
|
|
12
|
+
|
|
13
|
+
if(!process.send||!process.connected||require.main!==module){console.error('Aggregate worker requires an owned channel');process.exit(1);}
|
|
14
|
+
let state:'new'|'staging'|'staged'|'checked'|'bound'|'closed'|'failed'='new',last=0;
|
|
15
|
+
let association:{session:string;epoch:string;target:string}|undefined;
|
|
16
|
+
let role:'source'|'target',config:DeliveryConfigurationHandle|undefined,stage:StagedDeliveryCollection|undefined;
|
|
17
|
+
let source:Awaited<ReturnType<typeof openOwnedSource>>|undefined,compiler:DeliveryCompilerCollector|undefined;
|
|
18
|
+
let stagedCompiler:CompilerEvidence|undefined,finalConfiguration:DeliveryConfigurationEvidence|undefined;
|
|
19
|
+
let busy=false,initial:any,contribution:any;
|
|
20
|
+
let phase='protocol';
|
|
21
|
+
async function cleanup(){stage?.close();config?.close();await source?.close();}
|
|
22
|
+
async function dispatch(message:WorkerMessage):Promise<unknown>{
|
|
23
|
+
if(!['stage','bind'].includes(message.command)&&message.data!==null)throw new Error('Unexpected worker command data');
|
|
24
|
+
if(message.command==='stage'){
|
|
25
|
+
if(state!=='new')throw new Error('Duplicate worker stage');
|
|
26
|
+
state='staging';initial=deepFreeze(strictData(message.data)) as any;
|
|
27
|
+
exactObject(initial,initial.role==='source'?['root','workspaceRoot','projectRoot','request','role','handshakePath']:['root','workspaceRoot','projectRoot','request','role','handshake','target','params','steps','deploymentId','businessRoot','executionId','sourceDefinitionHash'],'worker stage input');
|
|
28
|
+
const {parseDeliveryRequest}=require('./protocol') as typeof import('./protocol');
|
|
29
|
+
const request=parseDeliveryRequest(initial.request);role=initial.role;
|
|
30
|
+
if(!['source','target'].includes(role)||request.network!==message.target||request.mode!=='simulate')throw new Error('Worker target mismatch');
|
|
31
|
+
const root=fs.realpathSync(process.cwd());
|
|
32
|
+
if(root!==initial.root)throw new Error('Worker root mismatch');
|
|
33
|
+
process.env.GATE_DELIVERY_CONTEXT=JSON.stringify(request);
|
|
34
|
+
process.env.HARDHAT_NETWORK=role==='source'?request.network:'hardhat';
|
|
35
|
+
if(role==='target'){
|
|
36
|
+
const handshake=initial.handshake;
|
|
37
|
+
if(handshake?.version!==1||handshake.session!==message.session||handshake.target!==message.target||handshake.snapshot.chainId!==initial.target.chainId)throw new Error('Source handshake association mismatch');
|
|
38
|
+
require('./aggregate-bootstrap').establishOwnedFork({network:request.network,chainId:initial.target.chainId,url:handshake.proxyUrl,blockNumber:handshake.snapshot.blockNumber});
|
|
39
|
+
}
|
|
40
|
+
// This is the only project loader; same original project/config/module resolution.
|
|
41
|
+
const req=createRequire(path.join(root,'package.json'));
|
|
42
|
+
phase='project-loader';req('ts-node/register');
|
|
43
|
+
const hre=req('hardhat') as typeof import('hardhat');
|
|
44
|
+
if(role==='source'){
|
|
45
|
+
const {openOwnedSource}=require('./aggregate-source') as typeof import('./aggregate-source');
|
|
46
|
+
phase='source-open';source=await openOwnedSource(hre,request,message.session,message.epoch);
|
|
47
|
+
phase='source-configuration';config=require('./configuration').openDeliveryConfiguration({workspaceRoot:initial.workspaceRoot,projectRoot:initial.projectRoot,network:request.network});
|
|
48
|
+
fs.writeFileSync(initial.handshakePath,JSON.stringify(source.handshake),{flag:'wx',mode:0o600});
|
|
49
|
+
state='staged';return {ready:true,handshake:source.handshake};
|
|
50
|
+
}
|
|
51
|
+
const {stageDeliveryPlan}=require('./planning') as typeof import('./planning');
|
|
52
|
+
const {setupSimulationFork,verifySimulationForkSnapshot}=require('../workflow/lib/simulation') as typeof import('../workflow/lib/simulation');
|
|
53
|
+
const {impersonateWorkflowSimulationSigner}=require('../workflow/lib/signer') as typeof import('../workflow/lib/signer');
|
|
54
|
+
const {WorkflowState}=require('../workflow/lib/state') as typeof import('../workflow/lib/state');
|
|
55
|
+
const {qualifyDeliveryCompiler}=require('./compiler') as typeof import('./compiler');
|
|
56
|
+
phase='fork-setup';const simulation=await setupSimulationFork(hre,request.network,{snapshotJson:JSON.stringify(initial.handshake.snapshot),sourceRpcUrl:initial.handshake.proxyUrl});
|
|
57
|
+
await verifySimulationForkSnapshot(hre,simulation);
|
|
58
|
+
const operator=(request.devSigner??request.operator)!.toLowerCase();
|
|
59
|
+
const signer=await impersonateWorkflowSimulationSigner(hre,operator);
|
|
60
|
+
phase='target-configuration';config=require('./configuration').openDeliveryConfiguration({workspaceRoot:initial.workspaceRoot,projectRoot:initial.projectRoot,network:request.network});
|
|
61
|
+
phase='compile';compiler=await qualifyDeliveryCompiler(hre);
|
|
62
|
+
const header={version:1 as const,schema:'gate-delivery-plan' as const,deploymentId:initial.deploymentId,environment:request.environment,target:request.network,
|
|
63
|
+
chainId:String(initial.target.chainId),executionId:initial.executionId,operator,sourceDefinitionHash:initial.sourceDefinitionHash,runtimeIdentity:config!.snapshot.runtime.declared};
|
|
64
|
+
const context={root,taskDir:path.join(root,initial.businessRoot),taskId:initial.deploymentId,executionId:initial.executionId,targetId:request.network,target:initial.target,targetParams:initial.params,
|
|
65
|
+
existingDeploymentPolicies:{},config:{},mode:'simulate' as const,simulation,signer,signerAddress:operator,
|
|
66
|
+
runtime:{hre,localFork:{provider:hre.network.provider,impersonate:(address:string)=>impersonateWorkflowSimulationSigner(hre,address)}},
|
|
67
|
+
state:new WorkflowState(),externalCalls:[],operatorReceipts:[],reporter:{event(){},result(){}}};
|
|
68
|
+
const identities={read:async()=>header,readSourceBlock:async(blockNumber:number)=>{
|
|
69
|
+
const rpc=async(method:string,params:unknown[])=>{
|
|
70
|
+
const response=await fetch(initial.handshake.proxyUrl,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({jsonrpc:'2.0',id:1,method,params}),signal:AbortSignal.timeout(30000)});
|
|
71
|
+
const data=await response.json() as any;if(data.error)throw new Error('Source read failed');return data.result;
|
|
72
|
+
};
|
|
73
|
+
const [chain,block]=await Promise.all([rpc('eth_chainId',[]),rpc('eth_getBlockByNumber',['0x'+blockNumber.toString(16),false])]);
|
|
74
|
+
return {chainId:BigInt(chain).toString(),blockNumber:Number(BigInt(block.number)),blockHash:block.hash};
|
|
75
|
+
}};
|
|
76
|
+
phase='planning';stage=await stageDeliveryPlan({context,header,identities,steps:initial.steps,derivationSeed:initial.executionId});
|
|
77
|
+
if(!stage.snapshot.preparations.length){
|
|
78
|
+
phase='existing-code-artifacts';
|
|
79
|
+
const {collectExistingCodeArtifacts,requiredExistingAddresses}=require('./existing-code') as typeof import('./existing-code');
|
|
80
|
+
const {fileBytes}=require('./materialization') as typeof import('./materialization');
|
|
81
|
+
await collectExistingCodeArtifacts({target:request.network,addresses:requiredExistingAddresses({plan:stage.payload,verification:stage.snapshot.verification}),registry:JSON.parse(fileBytes(root,'contractInfo.json')??'{}'),metadata:JSON.parse(fileBytes(root,'deploymentInfo.json')??'{"version":1,"networks":{}}'),readArtifact:name=>hre.artifacts.readArtifact(name)});
|
|
82
|
+
}
|
|
83
|
+
phase='staged-reread';stagedCompiler=compiler.evidence();config!.assertUnchanged();
|
|
84
|
+
contribution={compiler:stagedCompiler,custom:stage.payload.customInputClosure,payloadHash:semanticHash(stage.payload),invariantHash:stage.invariantHash,snapshot:stage.snapshot};
|
|
85
|
+
state='staged';return {ready:true,...contribution,observation:{pid:process.pid,manifestDir:process.env.MANIFEST_DEFAULT_DIR,operator,executionId:initial.executionId}};
|
|
86
|
+
}
|
|
87
|
+
if(message.command==='check'){
|
|
88
|
+
phase='barrier';await (require('./compiler-io') as typeof import('./compiler-io')).yieldCompilerIo();
|
|
89
|
+
if(state!=='staged')throw new Error('Worker check order violation');
|
|
90
|
+
if(role==='source'){await source!.check();finalConfiguration=config!.seal() as DeliveryConfigurationEvidence;state='checked';return {configuration:finalConfiguration};}
|
|
91
|
+
await stage!.assertUnchanged();
|
|
92
|
+
if(canonicalJson(compiler!.evidence())!==canonicalJson(stagedCompiler))throw new Error('Compiler contribution drift');
|
|
93
|
+
phase='configuration-seal';finalConfiguration=config!.seal() as DeliveryConfigurationEvidence;
|
|
94
|
+
state='checked';return {configuration:finalConfiguration,...contribution};
|
|
95
|
+
}
|
|
96
|
+
if(message.command==='bind'){
|
|
97
|
+
if(state!=='checked'||role!=='target')throw new Error('Worker bind order violation');
|
|
98
|
+
const input=exactObject(message.data,['inputsHash'],'binding');
|
|
99
|
+
phase='binding';const result=stage!.bind(input.inputsHash as string);
|
|
100
|
+
const {inputsHash:_,planHash:__,...payload}=result.plan;
|
|
101
|
+
if(semanticHash(payload)!==contribution.payloadHash)throw new Error('Final binding changed staged payload');
|
|
102
|
+
state='bound';return result;
|
|
103
|
+
}
|
|
104
|
+
if(message.command==='close'){
|
|
105
|
+
if(!((role==='source'&&state==='checked')||(role==='target'&&state==='bound')))throw new Error('Worker close order violation');
|
|
106
|
+
await cleanup();state='closed';return {closed:true};
|
|
107
|
+
}
|
|
108
|
+
throw new Error('Unsupported worker command');
|
|
109
|
+
}
|
|
110
|
+
process.on('message',async raw=>{
|
|
111
|
+
let message:WorkerMessage;
|
|
112
|
+
try{
|
|
113
|
+
message=parseWorkerMessage(raw);
|
|
114
|
+
if(busy||state==='closed'||state==='failed'||message.id!==last+1)throw new Error('Worker protocol order violation');
|
|
115
|
+
if(!association){if(message.command!=='stage')throw new Error('Worker stage required');association={session:message.session,epoch:message.epoch,target:message.target};}
|
|
116
|
+
if(message.session!==association.session||message.epoch!==association.epoch||message.target!==association.target)throw new Error('Worker protocol association mismatch');
|
|
117
|
+
last=message.id;busy=true;
|
|
118
|
+
const value=await dispatch(message);
|
|
119
|
+
process.send!({...message,data:{ok:true,value}},(error:Error|null)=>{
|
|
120
|
+
if(error){state='failed';process.exit(1);}
|
|
121
|
+
if(state==='closed'){process.disconnect();process.exit(0);}
|
|
122
|
+
});
|
|
123
|
+
busy=false;
|
|
124
|
+
}catch(error){
|
|
125
|
+
state='failed';
|
|
126
|
+
const active=association;
|
|
127
|
+
|
|
128
|
+
if(active&&process.connected)await new Promise<void>(resolve=>process.send!({version:1,...active,id:last,command:(raw as any)?.command,data:{ok:false,value:{phase}}},()=>resolve()));
|
|
129
|
+
await cleanup().catch(()=>{});process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
process.on('disconnect',()=>{if(state!=='closed')process.exit(1);});
|
|
133
|
+
process.once('SIGTERM',()=>{state='failed';void cleanup().finally(()=>process.exit(1));});
|