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,279 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import {
|
|
4
|
+
PLAN_FILE,
|
|
5
|
+
assertPortableInput,
|
|
6
|
+
emptyPlan,
|
|
7
|
+
parsePlan,
|
|
8
|
+
planSummary,
|
|
9
|
+
readPlanFile,
|
|
10
|
+
renderPlan,
|
|
11
|
+
type Plan,
|
|
12
|
+
type PlanSection,
|
|
13
|
+
type PlanTask,
|
|
14
|
+
} from "./plan";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* `plan-read` / `plan-write` / `plan-add`.
|
|
18
|
+
*
|
|
19
|
+
* The three exist so the plan never has to be hand-written. In a document that
|
|
20
|
+
* two runtimes both produce and consume, the fields most likely to be wrong are
|
|
21
|
+
* exactly the mechanical ones -- revision accounting, the section headings, the
|
|
22
|
+
* block syntax, the forbidden-field rules -- and those are the ones a command
|
|
23
|
+
* can own outright. The LLM's job is the objective and the acceptance criteria;
|
|
24
|
+
* the file's shape is not its job.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const parseArgs = (argv: string[]): Map<string, string> => {
|
|
28
|
+
const values = new Map<string, string>();
|
|
29
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
30
|
+
const item = argv[index];
|
|
31
|
+
if (!item.startsWith("--")) continue;
|
|
32
|
+
const equalAt = item.indexOf("=");
|
|
33
|
+
const key = item.slice(2, equalAt > 2 ? equalAt : undefined);
|
|
34
|
+
const next = argv[index + 1];
|
|
35
|
+
// A trailing flag with no value is a switch, not a malformed option.
|
|
36
|
+
if (equalAt < 0 && (!next || next.startsWith("--"))) {
|
|
37
|
+
values.set(key, "true");
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const value = equalAt > 2 ? item.slice(equalAt + 1) : next;
|
|
41
|
+
if (!value || value.startsWith("--")) throw new Error(`--${key} requires a value`);
|
|
42
|
+
if (values.has(key)) throw new Error(`--${key} may be provided only once`);
|
|
43
|
+
values.set(key, value.trim());
|
|
44
|
+
if (equalAt < 0) index += 1;
|
|
45
|
+
}
|
|
46
|
+
return values;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const readJsonInput = (values: Map<string, string>, root: string): unknown => {
|
|
50
|
+
const inline = values.get("input");
|
|
51
|
+
const file = values.get("inputFile");
|
|
52
|
+
if (inline && file) throw new Error("--input and --inputFile are mutually exclusive");
|
|
53
|
+
if (file) {
|
|
54
|
+
const absolute = path.isAbsolute(file) ? file : path.join(root, file);
|
|
55
|
+
if (!fs.existsSync(absolute)) throw new Error(`--inputFile not found: ${file}`);
|
|
56
|
+
return JSON.parse(fs.readFileSync(absolute, "utf8"));
|
|
57
|
+
}
|
|
58
|
+
if (inline) return JSON.parse(inline);
|
|
59
|
+
throw new Error("--input or --inputFile is required");
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const asRecord = (value: unknown, label: string): Record<string, unknown> => {
|
|
63
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
64
|
+
throw new Error(`${label} must be a JSON object`);
|
|
65
|
+
}
|
|
66
|
+
return value as Record<string, unknown>;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const parseSections = (value: unknown): Record<PlanSection, "enabled" | "disabled"> => {
|
|
70
|
+
const record = value === undefined ? {} : asRecord(value, "sections");
|
|
71
|
+
const read = (key: PlanSection, fallback: "enabled" | "disabled") => {
|
|
72
|
+
const raw = record[key] ?? fallback;
|
|
73
|
+
if (raw !== "enabled" && raw !== "disabled") {
|
|
74
|
+
throw new Error(`sections.${key} must be "enabled" or "disabled"`);
|
|
75
|
+
}
|
|
76
|
+
return raw;
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
development: read("development", "enabled"),
|
|
80
|
+
audit: read("audit", "enabled"),
|
|
81
|
+
deployment: read("deployment", "enabled"),
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** A task from the caller, without the fields the writer owns. */
|
|
86
|
+
const toTask = (value: unknown, where: string): PlanTask => {
|
|
87
|
+
const record = asRecord(value, where);
|
|
88
|
+
return {
|
|
89
|
+
planKey: String(record.planKey ?? ""),
|
|
90
|
+
title: String(record.title ?? ""),
|
|
91
|
+
objective: String(record.objective ?? ""),
|
|
92
|
+
acceptance: Array.isArray(record.acceptance) ? record.acceptance.map(String) : [],
|
|
93
|
+
dependsOn: Array.isArray(record.dependsOn) ? record.dependsOn.map(String) : [],
|
|
94
|
+
status: (record.status ?? "pending") as PlanTask["status"],
|
|
95
|
+
...(record.scope !== undefined ? { scope: asRecord(record.scope, `${where}.scope`) } : {}),
|
|
96
|
+
...(record.parameters !== undefined
|
|
97
|
+
? { parameters: (() => {
|
|
98
|
+
if (!Array.isArray(record.parameters)) throw new Error(`${where}.parameters must be an array`);
|
|
99
|
+
return record.parameters;
|
|
100
|
+
})() }
|
|
101
|
+
: {}),
|
|
102
|
+
...(record.expectedArtifacts !== undefined
|
|
103
|
+
? { expectedArtifacts: (record.expectedArtifacts as unknown[]).map(String) }
|
|
104
|
+
: {}),
|
|
105
|
+
...(record.allowedChanges !== undefined
|
|
106
|
+
? { allowedChanges: (record.allowedChanges as unknown[]).map(String) }
|
|
107
|
+
: {}),
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const sectionOf = (value: unknown): PlanSection => {
|
|
112
|
+
const section = String(value ?? "development");
|
|
113
|
+
if (section !== "development" && section !== "audit" && section !== "deployment") {
|
|
114
|
+
throw new Error(`--section must be development, audit or deployment (got "${section}")`);
|
|
115
|
+
}
|
|
116
|
+
return section;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export const runPlanReadCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
|
|
120
|
+
const values = parseArgs(argv);
|
|
121
|
+
const plan = readPlanFile(root, values.get("path") || PLAN_FILE);
|
|
122
|
+
return values.has("full")
|
|
123
|
+
? { ...planSummary(plan), plan: renderPlan(plan) }
|
|
124
|
+
: planSummary(plan);
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Replace the plan. `revision` is not taken from the caller: the writer owns it,
|
|
129
|
+
* because it is the one number every consumer depends on and the one easiest to
|
|
130
|
+
* get wrong by hand. It advances only when the execution contract changes.
|
|
131
|
+
*/
|
|
132
|
+
export const runPlanWriteCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
|
|
133
|
+
const values = parseArgs(argv);
|
|
134
|
+
const input = asRecord(readJsonInput(values, root), "--input");
|
|
135
|
+
assertPortableInput(input, "--input");
|
|
136
|
+
const relative = values.get("path") || PLAN_FILE;
|
|
137
|
+
const sections = parseSections(input.sections);
|
|
138
|
+
const tasksInput = input.tasks;
|
|
139
|
+
const tasks: Record<PlanSection, PlanTask[]> = { development: [], audit: [], deployment: [] };
|
|
140
|
+
if (tasksInput !== undefined) {
|
|
141
|
+
const record = asRecord(tasksInput, "tasks");
|
|
142
|
+
for (const section of ["development", "audit", "deployment"] as const) {
|
|
143
|
+
const list = record[section];
|
|
144
|
+
if (list === undefined) continue;
|
|
145
|
+
if (!Array.isArray(list)) throw new Error(`tasks.${section} must be an array`);
|
|
146
|
+
tasks[section] = list.map((item, index) => toTask(item, `tasks.${section}[${index}]`));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const existing = fs.existsSync(path.join(root, relative)) ? readPlanFile(root, relative) : undefined;
|
|
151
|
+
|
|
152
|
+
const previousContracts = existing
|
|
153
|
+
? new Map((["development", "audit", "deployment"] as const)
|
|
154
|
+
.flatMap((section) => existing.tasks[section])
|
|
155
|
+
.map((task) => [task.planKey, contractOf(task)]))
|
|
156
|
+
: new Map<string, string>();
|
|
157
|
+
const nextAll = (["development", "audit", "deployment"] as const).flatMap((section) => tasks[section]);
|
|
158
|
+
let revision = existing ? existing.revision : 1;
|
|
159
|
+
if (existing) {
|
|
160
|
+
const changed = nextAll.length !== previousContracts.size
|
|
161
|
+
|| nextAll.some((task) => previousContracts.get(task.planKey) !== contractOf(task))
|
|
162
|
+
|| JSON.stringify(existing.sections) !== JSON.stringify(sections);
|
|
163
|
+
if (changed) revision = existing.revision + 1;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const plan: Plan = {
|
|
167
|
+
schema: "gateflow-plan/v1",
|
|
168
|
+
taskId: String(input.taskId ?? existing?.taskId ?? ""),
|
|
169
|
+
revision,
|
|
170
|
+
title: String(input.title ?? existing?.title ?? ""),
|
|
171
|
+
sections,
|
|
172
|
+
updatedAt: new Date().toISOString(),
|
|
173
|
+
tasks,
|
|
174
|
+
};
|
|
175
|
+
// The writer is the one place the document is produced, so the whole plan is
|
|
176
|
+
// validated on the way out -- same checks an import would run.
|
|
177
|
+
const text = renderPlan(plan);
|
|
178
|
+
const validated = parsePlan(text);
|
|
179
|
+
fs.mkdirSync(path.dirname(path.join(root, relative)), { recursive: true });
|
|
180
|
+
fs.writeFileSync(path.join(root, relative), text);
|
|
181
|
+
|
|
182
|
+
const added = nextAll.filter((task) => !previousContracts.has(task.planKey)).map((task) => task.planKey);
|
|
183
|
+
const removed = [...previousContracts.keys()].filter((key) => !nextAll.some((task) => task.planKey === key));
|
|
184
|
+
return {
|
|
185
|
+
...planSummary(validated),
|
|
186
|
+
path: relative,
|
|
187
|
+
revisionBumped: !existing || revision !== existing.revision,
|
|
188
|
+
added,
|
|
189
|
+
// Reported, never silently applied: dropping a task from the file makes it
|
|
190
|
+
// look like it never existed to the other entry point.
|
|
191
|
+
removed,
|
|
192
|
+
...(removed.length > 0
|
|
193
|
+
? { warning: `tasks were dropped from the plan: ${removed.join(", ")}. Cancelling (status=cancelled) is usually what you want instead.` }
|
|
194
|
+
: {}),
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/** Append one task, advancing the revision. The common case, so it gets a verb. */
|
|
199
|
+
export const runPlanAddCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
|
|
200
|
+
const values = parseArgs(argv);
|
|
201
|
+
const input = asRecord(readJsonInput(values, root), "--input");
|
|
202
|
+
assertPortableInput(input, "--input");
|
|
203
|
+
const relative = values.get("path") || PLAN_FILE;
|
|
204
|
+
const plan = readPlanFile(root, relative);
|
|
205
|
+
const section = sectionOf(input.section);
|
|
206
|
+
const task = toTask(input.task ?? input, "task");
|
|
207
|
+
if (plan.sections[section] === "disabled") {
|
|
208
|
+
throw new Error(`section "${section}" is disabled; enable it before adding tasks`);
|
|
209
|
+
}
|
|
210
|
+
const existingKeys = (["development", "audit", "deployment"] as const)
|
|
211
|
+
.flatMap((item) => plan.tasks[item])
|
|
212
|
+
.map((item) => item.planKey);
|
|
213
|
+
if (existingKeys.includes(task.planKey)) {
|
|
214
|
+
throw new Error(`planKey "${task.planKey}" already exists; plan keys are stable identities, not labels`);
|
|
215
|
+
}
|
|
216
|
+
const next: Plan = {
|
|
217
|
+
...plan,
|
|
218
|
+
revision: plan.revision + 1,
|
|
219
|
+
updatedAt: new Date().toISOString(),
|
|
220
|
+
tasks: { ...plan.tasks, [section]: [...plan.tasks[section], task] },
|
|
221
|
+
};
|
|
222
|
+
const text = renderPlan(next);
|
|
223
|
+
parsePlan(text);
|
|
224
|
+
fs.writeFileSync(path.join(root, relative), text);
|
|
225
|
+
return { ...planSummary(next), path: relative, section, added: task.planKey };
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
export const contractOf = (task: PlanTask): string => JSON.stringify({
|
|
229
|
+
objective: task.objective,
|
|
230
|
+
acceptance: task.acceptance,
|
|
231
|
+
dependsOn: task.dependsOn,
|
|
232
|
+
scope: task.scope ?? null,
|
|
233
|
+
parameters: task.parameters ?? null,
|
|
234
|
+
expectedArtifacts: task.expectedArtifacts ?? null,
|
|
235
|
+
allowedChanges: task.allowedChanges ?? null,
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Status moves the protocol allows. Progress is not a contract change, so it
|
|
240
|
+
* never advances the revision -- otherwise every completed task would look
|
|
241
|
+
* like a re-plan to the other entry point.
|
|
242
|
+
*/
|
|
243
|
+
const STATUS_MOVES: Record<PlanTask["status"], readonly PlanTask["status"][]> = {
|
|
244
|
+
pending: ["ready", "running", "cancelled"],
|
|
245
|
+
ready: ["running", "cancelled"],
|
|
246
|
+
running: ["completed", "failed"],
|
|
247
|
+
failed: ["ready", "running", "cancelled"],
|
|
248
|
+
completed: ["pending"],
|
|
249
|
+
cancelled: [],
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
/** Move one task's status: `--task <planKey> --to <status>`. */
|
|
253
|
+
export const runPlanStatusCli = (argv: string[], root: string = process.cwd()): Record<string, unknown> => {
|
|
254
|
+
const values = parseArgs(argv);
|
|
255
|
+
const relative = values.get("path") || PLAN_FILE;
|
|
256
|
+
const planKey = values.get("task");
|
|
257
|
+
const to = values.get("to") as PlanTask["status"] | undefined;
|
|
258
|
+
if (!planKey) throw new Error("--task <planKey> is required");
|
|
259
|
+
if (!to || !(to in STATUS_MOVES)) throw new Error(`--to must be one of ${Object.keys(STATUS_MOVES).join(", ")}`);
|
|
260
|
+
const plan = readPlanFile(root, relative);
|
|
261
|
+
const all = (["development", "audit", "deployment"] as const).flatMap((section) => plan.tasks[section]);
|
|
262
|
+
const task = all.find((item) => item.planKey === planKey);
|
|
263
|
+
if (!task) throw new Error(`task "${planKey}" not found`);
|
|
264
|
+
const from = task.status;
|
|
265
|
+
if (from === to) return { ...planSummary(plan), path: relative, planKey, from, to, changed: false };
|
|
266
|
+
if (!STATUS_MOVES[from].includes(to)) throw new Error(`task "${planKey}" cannot move from ${from} to ${to}`);
|
|
267
|
+
if (to === "running") {
|
|
268
|
+
const blocked = task.dependsOn.filter((key) => all.find((item) => item.planKey === key)?.status !== "completed");
|
|
269
|
+
if (blocked.length > 0) throw new Error(`task "${planKey}" depends on unfinished task(s): ${blocked.join(", ")}`);
|
|
270
|
+
}
|
|
271
|
+
task.status = to;
|
|
272
|
+
const next: Plan = { ...plan, updatedAt: new Date().toISOString() };
|
|
273
|
+
const text = renderPlan(next);
|
|
274
|
+
parsePlan(text);
|
|
275
|
+
fs.writeFileSync(path.join(root, relative), text);
|
|
276
|
+
return { ...planSummary(next), path: relative, planKey, from, to, changed: true };
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
export { emptyPlan };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import type { WorkflowContext } from './context';
|
|
3
|
+
import type { DeploymentChange } from './deploymentRecords';
|
|
4
|
+
import type { PreparedGateToolWorkflow } from './gateTool';
|
|
5
|
+
export function recordPreparedDeployment(context: WorkflowContext, change: DeploymentChange, prepared: PreparedGateToolWorkflow, derivedKeys: string[]): void {
|
|
6
|
+
if (!context.preparations) return;
|
|
7
|
+
const ref = (file: string) => path.isAbsolute(file) ? path.relative(context.root, file).split(path.sep).join('/') : file;
|
|
8
|
+
const planPath = ref(prepared.planPath);
|
|
9
|
+
// Step structs use optional undefined properties; immutable journal input is explicit JSON data.
|
|
10
|
+
const clean = Object.fromEntries(Object.entries(change).filter(([, value]) => value !== undefined));
|
|
11
|
+
clean.gateTool = { outputPath: planPath, data: prepared.plan };
|
|
12
|
+
context.preparations.prepare({ stepId: change.stepId, change: clean as unknown as DeploymentChange,
|
|
13
|
+
prepared: { ...prepared, requestPath: ref(prepared.requestPath), planPath }, derivedKeys });
|
|
14
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { keccak256, toUtf8Bytes } from "ethers";
|
|
2
|
-
import {
|
|
2
|
+
import type { Provider } from "ethers";
|
|
3
3
|
import {
|
|
4
4
|
getERC1967Admin,
|
|
5
5
|
getERC1967Implementation,
|
|
@@ -31,9 +31,10 @@ export const deriveImplementationSalt = (
|
|
|
31
31
|
);
|
|
32
32
|
|
|
33
33
|
export const getImplementationAddress = async (
|
|
34
|
+
provider: Pick<Provider, "getStorage">,
|
|
34
35
|
proxyAddress: string,
|
|
35
36
|
): Promise<string> => {
|
|
36
|
-
const implementation = await getERC1967Implementation(
|
|
37
|
+
const implementation = await getERC1967Implementation(provider, proxyAddress);
|
|
37
38
|
if (!implementation) {
|
|
38
39
|
throw new Error(`Proxy ${proxyAddress} has no ERC-1967 implementation`);
|
|
39
40
|
}
|
|
@@ -41,5 +42,6 @@ export const getImplementationAddress = async (
|
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
export const getProxyAdminAddress = async (
|
|
45
|
+
provider: Pick<Provider, "getStorage">,
|
|
44
46
|
proxyAddress: string,
|
|
45
|
-
): Promise<string | undefined> => getERC1967Admin(
|
|
47
|
+
): Promise<string | undefined> => getERC1967Admin(provider, proxyAddress);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Signer } from "ethers";
|
|
2
|
+
import type { WorkflowHre, WorkflowRuntime } from "./context";
|
|
3
|
+
|
|
4
|
+
export const assertLocalForkHre = (hre: WorkflowHre): void => {
|
|
5
|
+
if (hre.network.name !== "hardhat" && hre.network.name !== "zkFork") {
|
|
6
|
+
throw new Error("Simulation requires an explicit local fork network");
|
|
7
|
+
}
|
|
8
|
+
const url = (hre.network.config as { url?: string }).url;
|
|
9
|
+
if (url !== undefined) {
|
|
10
|
+
let parsed: URL;
|
|
11
|
+
try { parsed = new URL(url); } catch { throw new Error("Local fork RPC must use a loopback URL"); }
|
|
12
|
+
if (
|
|
13
|
+
parsed.protocol !== "http:"
|
|
14
|
+
|| !["127.0.0.1", "localhost", "[::1]"].includes(parsed.hostname)
|
|
15
|
+
|| parsed.username || parsed.password
|
|
16
|
+
) {
|
|
17
|
+
throw new Error("Local fork RPC must use a loopback URL");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const assertLocalForkRuntime = (runtime: WorkflowRuntime): void => {
|
|
23
|
+
if (!runtime?.hre || !runtime.localFork) {
|
|
24
|
+
throw new Error("Simulation requires an explicit local fork capability");
|
|
25
|
+
}
|
|
26
|
+
assertLocalForkHre(runtime.hre);
|
|
27
|
+
if (runtime.localFork.provider !== runtime.hre.network.provider) {
|
|
28
|
+
throw new Error("Simulation local fork capability does not match the runtime provider");
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const assertLocalForkSigner = (runtime: WorkflowRuntime, signer: Signer): void => {
|
|
33
|
+
if (signer.provider !== runtime.hre.ethers.provider) {
|
|
34
|
+
throw new Error("Simulation signer must be connected to the explicit local fork provider");
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const impersonateLocalForkSigner = async (
|
|
39
|
+
runtime: WorkflowRuntime,
|
|
40
|
+
address: string,
|
|
41
|
+
): Promise<Signer> => {
|
|
42
|
+
assertLocalForkRuntime(runtime);
|
|
43
|
+
const signer = await runtime.localFork!.impersonate(address);
|
|
44
|
+
assertLocalForkSigner(runtime, signer);
|
|
45
|
+
return signer;
|
|
46
|
+
};
|
|
@@ -6,7 +6,8 @@ import {
|
|
|
6
6
|
createZkSyncSigner,
|
|
7
7
|
resolveWalletCredential,
|
|
8
8
|
} from "gate-evm-tools/custody";
|
|
9
|
-
import {
|
|
9
|
+
import type { WorkflowHre } from "./context";
|
|
10
|
+
import { assertLocalForkHre } from "./runtime";
|
|
10
11
|
import { assertExecutionSignerAddress } from "./signerIdentity";
|
|
11
12
|
import type { WorkflowMode } from "./simulation";
|
|
12
13
|
|
|
@@ -47,11 +48,11 @@ export const resolveSimulationSignerAddress = (options: WorkflowSignerOptions):
|
|
|
47
48
|
};
|
|
48
49
|
|
|
49
50
|
export const impersonateWorkflowSimulationSigner = async (
|
|
51
|
+
hre: WorkflowHre,
|
|
50
52
|
signerAddress: string,
|
|
51
53
|
): Promise<Signer> => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
54
|
+
assertLocalForkHre(hre);
|
|
55
|
+
const { ethers, network } = hre;
|
|
55
56
|
await network.provider.request({
|
|
56
57
|
method: "hardhat_impersonateAccount",
|
|
57
58
|
params: [signerAddress],
|
|
@@ -70,11 +71,13 @@ export const impersonateWorkflowSimulationSigner = async (
|
|
|
70
71
|
};
|
|
71
72
|
|
|
72
73
|
export const resolveWorkflowSigner = async (
|
|
74
|
+
hre: WorkflowHre,
|
|
73
75
|
mode: WorkflowMode,
|
|
74
76
|
options: WorkflowSignerOptions = {},
|
|
75
77
|
): Promise<Signer> => {
|
|
78
|
+
const { ethers, network } = hre;
|
|
76
79
|
if (mode === "simulate") {
|
|
77
|
-
return impersonateWorkflowSimulationSigner(resolveSimulationSignerAddress(options));
|
|
80
|
+
return impersonateWorkflowSimulationSigner(hre, resolveSimulationSignerAddress(options));
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
const executionCredential = mode === "execute"
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { isAddress } from "ethers";
|
|
2
|
-
import {
|
|
2
|
+
import type { Provider } from "ethers";
|
|
3
|
+
import type { WorkflowHre } from "./context";
|
|
4
|
+
import { assertLocalForkHre } from "./runtime";
|
|
5
|
+
import { isAllowedSourceRpcMethod } from "./sourceRpcPolicy";
|
|
3
6
|
import {
|
|
4
7
|
CapturedChainSnapshotV1,
|
|
5
8
|
ForkSnapshotV1,
|
|
@@ -15,6 +18,7 @@ export type WorkflowMode = "execute" | "simulate" | "verify";
|
|
|
15
18
|
|
|
16
19
|
export interface SimulationFork {
|
|
17
20
|
snapshot?: ForkSnapshotV1;
|
|
21
|
+
sourceRpcUrl?: string;
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
type WithoutVersion<T> = T extends unknown ? Omit<T, "version"> : never;
|
|
@@ -43,8 +47,8 @@ export const resolveWorkflowMode = (
|
|
|
43
47
|
return mode;
|
|
44
48
|
};
|
|
45
49
|
|
|
46
|
-
const sourceProxyUrl = (): string => {
|
|
47
|
-
const value =
|
|
50
|
+
const sourceProxyUrl = (sourceRpcUrl: string | undefined): string => {
|
|
51
|
+
const value = sourceRpcUrl?.trim();
|
|
48
52
|
if (!value) throw new Error("Simulation source-chain proxy URL is missing");
|
|
49
53
|
let parsed: URL;
|
|
50
54
|
try {
|
|
@@ -72,6 +76,7 @@ const rpcRequest = async <T>(
|
|
|
72
76
|
method: string,
|
|
73
77
|
params: unknown[],
|
|
74
78
|
): Promise<T> => {
|
|
79
|
+
if (!isAllowedSourceRpcMethod(method)) throw new Error(`Source RPC method is not read-only: ${method}`);
|
|
75
80
|
let response: Response;
|
|
76
81
|
try {
|
|
77
82
|
response = await fetch(url, {
|
|
@@ -148,6 +153,7 @@ const requiredInfrastructureAddress = (
|
|
|
148
153
|
};
|
|
149
154
|
|
|
150
155
|
export const assertCurrentStateInfrastructure = async (
|
|
156
|
+
provider: Pick<Provider, "getCode" | "getStorage">,
|
|
151
157
|
targetId: string,
|
|
152
158
|
target: SimulationInfrastructureTarget,
|
|
153
159
|
snapshot: CapturedChainSnapshotV1 | undefined,
|
|
@@ -174,7 +180,7 @@ export const assertCurrentStateInfrastructure = async (
|
|
|
174
180
|
},
|
|
175
181
|
];
|
|
176
182
|
const code = await Promise.all(infrastructure.map((entry) => (
|
|
177
|
-
|
|
183
|
+
provider.getCode(entry.address, snapshot.blockNumber)
|
|
178
184
|
)));
|
|
179
185
|
for (const [index, entry] of infrastructure.entries()) {
|
|
180
186
|
if (!code[index] || code[index] === "0x") {
|
|
@@ -186,19 +192,21 @@ export const assertCurrentStateInfrastructure = async (
|
|
|
186
192
|
};
|
|
187
193
|
|
|
188
194
|
export const assertSimulationSourceInfrastructure = async (
|
|
195
|
+
provider: Pick<Provider, "getCode" | "getStorage">,
|
|
189
196
|
targetId: string,
|
|
190
197
|
target: SimulationInfrastructureTarget,
|
|
191
198
|
simulation: SimulationFork,
|
|
192
|
-
): Promise<void> => assertCurrentStateInfrastructure(targetId, target, simulation.snapshot);
|
|
199
|
+
): Promise<void> => assertCurrentStateInfrastructure(provider, targetId, target, simulation.snapshot);
|
|
193
200
|
|
|
194
201
|
export const assertCurrentStateUupsSourceState = async (
|
|
202
|
+
provider: Pick<Provider, "getCode" | "getStorage">,
|
|
195
203
|
snapshot: CapturedChainSnapshotV1 | undefined,
|
|
196
204
|
proxy: string,
|
|
197
205
|
): Promise<void> => {
|
|
198
206
|
if (!snapshot) return;
|
|
199
207
|
const [proxyCode, oldImplementation] = await Promise.all([
|
|
200
|
-
|
|
201
|
-
getERC1967Implementation(
|
|
208
|
+
provider.getCode(proxy, snapshot.blockNumber),
|
|
209
|
+
getERC1967Implementation(provider, proxy, snapshot.blockNumber),
|
|
202
210
|
]);
|
|
203
211
|
if (!proxyCode || proxyCode === "0x") {
|
|
204
212
|
throw new Error(
|
|
@@ -210,7 +218,7 @@ export const assertCurrentStateUupsSourceState = async (
|
|
|
210
218
|
`UUPS proxy ${proxy} has no implementation at captured block ${snapshot.blockNumber}`,
|
|
211
219
|
);
|
|
212
220
|
}
|
|
213
|
-
const implementationCode = await
|
|
221
|
+
const implementationCode = await provider.getCode(
|
|
214
222
|
oldImplementation,
|
|
215
223
|
snapshot.blockNumber,
|
|
216
224
|
);
|
|
@@ -222,18 +230,22 @@ export const assertCurrentStateUupsSourceState = async (
|
|
|
222
230
|
};
|
|
223
231
|
|
|
224
232
|
export const assertSimulationUupsSourceState = async (
|
|
233
|
+
provider: Pick<Provider, "getCode" | "getStorage">,
|
|
225
234
|
simulation: SimulationFork,
|
|
226
235
|
proxy: string,
|
|
227
|
-
): Promise<void> => assertCurrentStateUupsSourceState(simulation.snapshot, proxy);
|
|
236
|
+
): Promise<void> => assertCurrentStateUupsSourceState(provider, simulation.snapshot, proxy);
|
|
228
237
|
|
|
229
238
|
export const verifySimulationForkSnapshot = async (
|
|
239
|
+
hre: WorkflowHre,
|
|
230
240
|
simulation: SimulationFork,
|
|
231
241
|
): Promise<void> => {
|
|
242
|
+
assertLocalForkHre(hre);
|
|
243
|
+
const { network } = hre;
|
|
232
244
|
const snapshot = simulation.snapshot;
|
|
233
245
|
if (!snapshot) return;
|
|
234
246
|
const [sourceBlock, localBlock, sourceZkSyncBlockDetails] = await Promise.all([
|
|
235
247
|
rpcRequest<unknown>(
|
|
236
|
-
sourceProxyUrl(),
|
|
248
|
+
sourceProxyUrl(simulation.sourceRpcUrl),
|
|
237
249
|
"eth_getBlockByNumber",
|
|
238
250
|
[blockTag(snapshot.blockNumber), false],
|
|
239
251
|
),
|
|
@@ -243,7 +255,7 @@ export const verifySimulationForkSnapshot = async (
|
|
|
243
255
|
}),
|
|
244
256
|
snapshot.runner.kind === "anvil-zksync"
|
|
245
257
|
? rpcRequest<unknown>(
|
|
246
|
-
sourceProxyUrl(),
|
|
258
|
+
sourceProxyUrl(simulation.sourceRpcUrl),
|
|
247
259
|
"zks_getBlockDetails",
|
|
248
260
|
[snapshot.blockNumber],
|
|
249
261
|
)
|
|
@@ -307,7 +319,19 @@ export const simulationForkEvidence = (
|
|
|
307
319
|
};
|
|
308
320
|
};
|
|
309
321
|
|
|
310
|
-
export
|
|
322
|
+
export interface SimulationForkOptions {
|
|
323
|
+
snapshotJson?: string;
|
|
324
|
+
sourceRpcUrl?: string;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Legacy/launcher helper. The shared step engine never resets or launches a fork.
|
|
328
|
+
export const setupSimulationFork = async (
|
|
329
|
+
hre: WorkflowHre,
|
|
330
|
+
targetId: string,
|
|
331
|
+
options: SimulationForkOptions,
|
|
332
|
+
): Promise<SimulationFork> => {
|
|
333
|
+
assertLocalForkHre(hre);
|
|
334
|
+
const { config: hardhatConfig, network } = hre;
|
|
311
335
|
const targetNetwork = (
|
|
312
336
|
hardhatConfig.networks as Record<string, { zksync?: boolean }>
|
|
313
337
|
)[targetId];
|
|
@@ -321,7 +345,7 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
|
|
|
321
345
|
);
|
|
322
346
|
}
|
|
323
347
|
const snapshot = parseForkSnapshotJson(
|
|
324
|
-
|
|
348
|
+
options.snapshotJson,
|
|
325
349
|
targetId,
|
|
326
350
|
);
|
|
327
351
|
if (
|
|
@@ -353,7 +377,7 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
|
|
|
353
377
|
);
|
|
354
378
|
}
|
|
355
379
|
assertBlockHash(forkBlock, snapshot, "Local EraVM");
|
|
356
|
-
return { snapshot };
|
|
380
|
+
return { snapshot, sourceRpcUrl: sourceProxyUrl(options.sourceRpcUrl) };
|
|
357
381
|
}
|
|
358
382
|
if (network.name !== "hardhat") {
|
|
359
383
|
throw new Error("Simulation mode must run with --network hardhat");
|
|
@@ -362,13 +386,13 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
|
|
|
362
386
|
return {};
|
|
363
387
|
}
|
|
364
388
|
const snapshot = parseForkSnapshotJson(
|
|
365
|
-
|
|
389
|
+
options.snapshotJson,
|
|
366
390
|
targetId,
|
|
367
391
|
);
|
|
368
392
|
if (snapshot.runner.kind !== "hardhat") {
|
|
369
393
|
throw new Error(`EVM target "${targetId}" requires a Hardhat fork snapshot`);
|
|
370
394
|
}
|
|
371
|
-
const forkRpcUrl = sourceProxyUrl();
|
|
395
|
+
const forkRpcUrl = sourceProxyUrl(options.sourceRpcUrl);
|
|
372
396
|
const sourceBlock = await rpcRequest<unknown>(
|
|
373
397
|
forkRpcUrl,
|
|
374
398
|
"eth_getBlockByNumber",
|
|
@@ -411,5 +435,5 @@ export const setupSimulationFork = async (targetId: string): Promise<SimulationF
|
|
|
411
435
|
params: ["0x1"],
|
|
412
436
|
});
|
|
413
437
|
|
|
414
|
-
return { snapshot };
|
|
438
|
+
return { snapshot, sourceRpcUrl: sourceProxyUrl(options.sourceRpcUrl) };
|
|
415
439
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export class WorkflowState {
|
|
2
|
-
private readonly values: Record<string, unknown> =
|
|
2
|
+
private readonly values: Record<string, unknown> = Object.create(null);
|
|
3
3
|
|
|
4
4
|
set(key: string, value: unknown): void {
|
|
5
5
|
this.values[key] = value;
|
|
@@ -10,7 +10,7 @@ export class WorkflowState {
|
|
|
10
10
|
let current: unknown = this.values;
|
|
11
11
|
|
|
12
12
|
for (const part of parts) {
|
|
13
|
-
if (typeof current !== "object" || current === null || !(part
|
|
13
|
+
if (typeof current !== "object" || current === null || !Object.hasOwn(current, part)) {
|
|
14
14
|
throw new Error(`State reference not found: state.${pathExpression}`);
|
|
15
15
|
}
|
|
16
16
|
current = (current as Record<string, unknown>)[part];
|
|
@@ -20,6 +20,6 @@ export class WorkflowState {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
snapshot(): Record<string, unknown> {
|
|
23
|
-
return
|
|
23
|
+
return Object.assign(Object.create(null), this.values);
|
|
24
24
|
}
|
|
25
25
|
}
|