gate-evm-tools 1.0.28 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -18
- package/bin/cli.js +6 -0
- package/bin/delivery.cjs +52 -0
- package/bin/manifest-bootstrap.js +4 -15
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +26 -2
- package/dist/commands/check.js.map +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/batch.d.ts +26 -0
- package/dist/core/preparation/batch.d.ts.map +1 -0
- package/dist/core/preparation/batch.js +72 -0
- package/dist/core/preparation/batch.js.map +1 -0
- package/dist/core/preparation/evm.d.ts +61 -6
- package/dist/core/preparation/evm.d.ts.map +1 -1
- package/dist/core/preparation/evm.js +122 -34
- package/dist/core/preparation/evm.js.map +1 -1
- package/dist/core/preparation/evmManifestSync.d.ts +68 -0
- package/dist/core/preparation/evmManifestSync.d.ts.map +1 -0
- package/dist/core/preparation/evmManifestSync.js +154 -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 +17 -3
- package/dist/core/preparation/manifest.d.ts.map +1 -1
- package/dist/core/preparation/manifest.js +23 -28
- 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 +67 -20
- package/dist/core/preparation/normalize.js.map +1 -1
- package/dist/core/preparation/transparent.d.ts +23 -0
- package/dist/core/preparation/transparent.d.ts.map +1 -0
- package/dist/core/preparation/transparent.js +103 -0
- package/dist/core/preparation/transparent.js.map +1 -0
- package/dist/core/preparation/types.d.ts +54 -7
- package/dist/core/preparation/types.d.ts.map +1 -1
- package/dist/core/preparation/zksync.d.ts.map +1 -1
- package/dist/core/preparation/zksync.js +2 -0
- package/dist/core/preparation/zksync.js.map +1 -1
- package/dist/custody/credential.d.ts.map +1 -1
- package/dist/custody/credential.js +1 -6
- package/dist/custody/credential.js.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/deployment-evm/index.d.ts +4 -0
- package/dist/deployment-evm/index.d.ts.map +1 -0
- package/dist/deployment-evm/index.js +3 -0
- package/dist/deployment-evm/index.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -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 +13 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow/index.d.ts +10 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +6 -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/batch.js +76 -0
- package/dist-cjs/core/preparation/batch.js.map +1 -0
- package/dist-cjs/core/preparation/evm.js +128 -37
- package/dist-cjs/core/preparation/evm.js.map +1 -1
- package/dist-cjs/core/preparation/evmManifestSync.js +163 -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 +25 -30
- package/dist-cjs/core/preparation/manifest.js.map +1 -1
- package/dist-cjs/core/preparation/normalize.js +67 -20
- package/dist-cjs/core/preparation/normalize.js.map +1 -1
- package/dist-cjs/core/preparation/transparent.js +110 -0
- package/dist-cjs/core/preparation/transparent.js.map +1 -0
- package/dist-cjs/core/preparation/zksync.js +2 -0
- package/dist-cjs/core/preparation/zksync.js.map +1 -1
- package/dist-cjs/custody/credential.js +1 -6
- package/dist-cjs/custody/credential.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/deployment-evm/index.js +10 -0
- package/dist-cjs/deployment-evm/index.js.map +1 -0
- package/dist-cjs/sync/index.js +13 -0
- package/dist-cjs/sync/index.js.map +1 -1
- package/dist-cjs/workflow/index.js +22 -1
- package/dist-cjs/workflow/index.js.map +1 -1
- package/dist-runtime/config/hardhatAdapters.js +2 -1
- package/dist-runtime/config/hardhatAdapters.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 +42 -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 +159 -0
- package/dist-runtime/delivery/aggregate-channel.js.map +1 -0
- package/dist-runtime/delivery/aggregate-diagnostics.d.ts +14 -0
- package/dist-runtime/delivery/aggregate-diagnostics.js +73 -0
- package/dist-runtime/delivery/aggregate-diagnostics.js.map +1 -0
- package/dist-runtime/delivery/aggregate-inputs.d.ts +172 -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 +87 -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 +199 -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/business-extension.d.ts +10 -0
- package/dist-runtime/delivery/business-extension.js +38 -0
- package/dist-runtime/delivery/business-extension.js.map +1 -0
- package/dist-runtime/delivery/calldata-archive.d.ts +18 -0
- package/dist-runtime/delivery/calldata-archive.js +31 -0
- package/dist-runtime/delivery/calldata-archive.js.map +1 -0
- package/dist-runtime/delivery/calldata-details.d.ts +47 -0
- package/dist-runtime/delivery/calldata-details.js +94 -0
- package/dist-runtime/delivery/calldata-details.js.map +1 -0
- package/dist-runtime/delivery/calldata-format.d.ts +4 -0
- package/dist-runtime/delivery/calldata-format.js +17 -0
- package/dist-runtime/delivery/calldata-format.js.map +1 -0
- package/dist-runtime/delivery/calldata-preparations.d.ts +13 -0
- package/dist-runtime/delivery/calldata-preparations.js +85 -0
- package/dist-runtime/delivery/calldata-preparations.js.map +1 -0
- package/dist-runtime/delivery/calldata-review.d.ts +44 -0
- package/dist-runtime/delivery/calldata-review.js +131 -0
- package/dist-runtime/delivery/calldata-review.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 +222 -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 +851 -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 +124 -0
- package/dist-runtime/delivery/config.js.map +1 -0
- package/dist-runtime/delivery/configuration-definition.d.ts +31 -0
- package/dist-runtime/delivery/configuration-definition.js +343 -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 +86 -0
- package/dist-runtime/delivery/configuration.js.map +1 -0
- package/dist-runtime/delivery/contract-source.d.ts +14 -0
- package/dist-runtime/delivery/contract-source.js +138 -0
- package/dist-runtime/delivery/contract-source.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 +410 -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 +92 -0
- package/dist-runtime/delivery/development.js +406 -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 +82 -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-identity.d.ts +15 -0
- package/dist-runtime/delivery/execution-identity.js +33 -0
- package/dist-runtime/delivery/execution-identity.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 +83 -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 +194 -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 +278 -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/parameter-defaults.d.ts +10 -0
- package/dist-runtime/delivery/parameter-defaults.js +86 -0
- package/dist-runtime/delivery/parameter-defaults.js.map +1 -0
- package/dist-runtime/delivery/parameters.d.ts +55 -0
- package/dist-runtime/delivery/parameters.js +279 -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 +84 -0
- package/dist-runtime/delivery/planning.js +318 -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 +178 -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 +13 -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 +292 -0
- package/dist-runtime/delivery/production-finalization.js.map +1 -0
- package/dist-runtime/delivery/production-intent.d.ts +2 -0
- package/dist-runtime/delivery/production-intent.js +16 -0
- package/dist-runtime/delivery/production-intent.js.map +1 -0
- package/dist-runtime/delivery/production.d.ts +582 -0
- package/dist-runtime/delivery/production.js +445 -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 +87 -0
- package/dist-runtime/delivery/project-files.js.map +1 -0
- package/dist-runtime/delivery/project-rpc.d.ts +19 -0
- package/dist-runtime/delivery/project-rpc.js +138 -0
- package/dist-runtime/delivery/project-rpc.js.map +1 -0
- package/dist-runtime/delivery/project.d.ts +17 -0
- package/dist-runtime/delivery/project.js +170 -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/public-calldata.d.ts +25 -0
- package/dist-runtime/delivery/public-calldata.js +97 -0
- package/dist-runtime/delivery/public-calldata.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 +97 -0
- package/dist-runtime/delivery/release-graph.js +139 -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 +322 -0
- package/dist-runtime/delivery/release-history.js.map +1 -0
- package/dist-runtime/delivery/release-inputs.d.ts +33 -0
- package/dist-runtime/delivery/release-inputs.js +129 -0
- package/dist-runtime/delivery/release-inputs.js.map +1 -0
- package/dist-runtime/delivery/release.d.ts +196 -0
- package/dist-runtime/delivery/release.js +261 -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 +92 -0
- package/dist-runtime/delivery/safe.js +254 -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 +21 -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 +230 -0
- package/dist-runtime/delivery/setup.js.map +1 -0
- package/dist-runtime/delivery/source.d.ts +42 -0
- package/dist-runtime/delivery/source.js +139 -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/task-identity.d.ts +23 -0
- package/dist-runtime/delivery/task-identity.js +109 -0
- package/dist-runtime/delivery/task-identity.js.map +1 -0
- package/dist-runtime/delivery/toolchain.d.ts +3 -0
- package/dist-runtime/delivery/toolchain.js +52 -0
- package/dist-runtime/delivery/toolchain.js.map +1 -0
- package/dist-runtime/delivery/validation.d.ts +9 -0
- package/dist-runtime/delivery/validation.js +155 -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 +897 -0
- package/dist-runtime/vendor/plan-codec/index.d.cts +38 -0
- package/dist-runtime/vendor/plan-codec/provenance.json +25 -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 +44 -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/checkCodeRunner.js +7 -4
- package/dist-runtime/workflow/lib/checkCodeRunner.js.map +1 -1
- 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 +77 -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/create2.d.ts +5 -27
- package/dist-runtime/workflow/lib/create2.js +11 -79
- package/dist-runtime/workflow/lib/create2.js.map +1 -1
- package/dist-runtime/workflow/lib/deploymentInfo.d.ts +2 -0
- package/dist-runtime/workflow/lib/deploymentInfo.js +6 -0
- package/dist-runtime/workflow/lib/deploymentInfo.js.map +1 -1
- package/dist-runtime/workflow/lib/deploymentRecords.d.ts +2 -0
- package/dist-runtime/workflow/lib/deploymentRecords.js +1 -1
- package/dist-runtime/workflow/lib/deploymentRecords.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/externalExecutionScanner.js +2 -1
- package/dist-runtime/workflow/lib/externalExecutionScanner.js.map +1 -1
- package/dist-runtime/workflow/lib/gateTool.d.ts +6 -2
- package/dist-runtime/workflow/lib/gateTool.js +22 -12
- package/dist-runtime/workflow/lib/gateTool.js.map +1 -1
- package/dist-runtime/workflow/lib/gateToolSync.d.ts +4 -1
- package/dist-runtime/workflow/lib/gateToolSync.js +8 -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 +11 -22
- 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 +4 -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 +69 -139
- 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 +110 -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 +84 -49
- 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 +38 -0
- package/docs/configuration-runtime-observation.md +29 -0
- package/docs/create2-miner.md +100 -0
- package/docs/delivery-aggregate.md +29 -0
- package/docs/delivery-calldata.md +27 -0
- package/docs/delivery-custom-input-closure.md +51 -0
- package/docs/delivery-development.md +38 -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 +95 -0
- package/docs/delivery-parameters.md +65 -0
- package/docs/delivery-planning.md +140 -0
- package/docs/delivery-release.md +119 -0
- package/docs/delivery-safe.md +75 -0
- package/docs/delivery-setup.md +198 -0
- package/docs/delivery-source.md +67 -0
- package/docs/direct-package-acceptance.md +2 -0
- package/docs/openzeppelin-acceptance.md +86 -0
- package/docs/openzeppelin-baseline.json +27 -0
- package/docs/openzeppelin-integration.md +115 -0
- package/docs/plans/2026-10-28-openzeppelin-toolkit-consolidation.md +396 -0
- package/docs/plans/2026-11-02-transparent-proxy-delivery.md +78 -0
- package/docs/superpowers/plans/2026-08-17-custody-hardhat-signers.md +1 -1
- 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 +12 -4
- package/docs/workflow-runtime.md +6 -0
- package/package.json +148 -10
- 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 +2 -1
- package/runtime/config/openzeppelin.ts +3 -21
- package/runtime/delivery/abi.ts +225 -0
- package/runtime/delivery/aggregate-bootstrap.ts +31 -0
- package/runtime/delivery/aggregate-channel.ts +88 -0
- package/runtime/delivery/aggregate-diagnostics.ts +63 -0
- package/runtime/delivery/aggregate-inputs.ts +39 -0
- package/runtime/delivery/aggregate-source.ts +57 -0
- package/runtime/delivery/aggregate-worker.ts +143 -0
- package/runtime/delivery/aggregate.ts +139 -0
- package/runtime/delivery/bindings.ts +37 -0
- package/runtime/delivery/business-extension.ts +33 -0
- package/runtime/delivery/calldata-archive.ts +25 -0
- package/runtime/delivery/calldata-details.ts +90 -0
- package/runtime/delivery/calldata-format.ts +14 -0
- package/runtime/delivery/calldata-preparations.ts +76 -0
- package/runtime/delivery/calldata-review.ts +126 -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 +181 -0
- package/runtime/delivery/compiler-io.ts +10 -0
- package/runtime/delivery/compiler-pins.ts +143 -0
- package/runtime/delivery/compiler.ts +701 -0
- package/runtime/delivery/config.ts +116 -0
- package/runtime/delivery/configuration-definition.ts +160 -0
- package/runtime/delivery/configuration-hre.ts +130 -0
- package/runtime/delivery/configuration-runtime.ts +163 -0
- package/runtime/delivery/configuration.ts +67 -0
- package/runtime/delivery/contract-source.ts +112 -0
- package/runtime/delivery/create2.ts +57 -0
- package/runtime/delivery/custom-closure.ts +993 -0
- package/runtime/delivery/custom-format.ts +479 -0
- package/runtime/delivery/custom.ts +219 -0
- package/runtime/delivery/data.ts +94 -0
- package/runtime/delivery/development.ts +264 -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-identity.ts +32 -0
- package/runtime/delivery/execution-model.ts +102 -0
- package/runtime/delivery/execution-store.ts +411 -0
- package/runtime/delivery/existing-code.ts +45 -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 +204 -0
- package/runtime/delivery/journal.ts +205 -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/parameter-defaults.ts +75 -0
- package/runtime/delivery/parameters.ts +367 -0
- package/runtime/delivery/pending.ts +98 -0
- package/runtime/delivery/plan.ts +337 -0
- package/runtime/delivery/planning.ts +411 -0
- package/runtime/delivery/policy.ts +9 -0
- package/runtime/delivery/preparation.ts +240 -0
- package/runtime/delivery/production-environment.ts +7 -0
- package/runtime/delivery/production-finalization.ts +181 -0
- package/runtime/delivery/production-intent.ts +14 -0
- package/runtime/delivery/production.ts +415 -0
- package/runtime/delivery/project-files.ts +63 -0
- package/runtime/delivery/project-rpc.ts +116 -0
- package/runtime/delivery/project.ts +129 -0
- package/runtime/delivery/protocol.ts +94 -0
- package/runtime/delivery/public-calldata.ts +74 -0
- package/runtime/delivery/references.ts +106 -0
- package/runtime/delivery/release-graph.ts +79 -0
- package/runtime/delivery/release-history-capture.ts +32 -0
- package/runtime/delivery/release-history.ts +178 -0
- package/runtime/delivery/release-inputs.ts +107 -0
- package/runtime/delivery/release.ts +166 -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 +355 -0
- package/runtime/delivery/same-fork-baseline.ts +17 -0
- package/runtime/delivery/setup.ts +184 -0
- package/runtime/delivery/source.ts +130 -0
- package/runtime/delivery/target-fields.ts +7 -0
- package/runtime/delivery/task-identity.ts +85 -0
- package/runtime/delivery/toolchain.ts +48 -0
- package/runtime/delivery/validation.ts +252 -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 +897 -0
- package/runtime/vendor/plan-codec/index.d.cts +38 -0
- package/runtime/vendor/plan-codec/provenance.json +25 -0
- package/runtime/workflow/engine.ts +174 -0
- package/runtime/workflow/lib/authority.ts +3 -3
- package/runtime/workflow/lib/calls.ts +47 -37
- package/runtime/workflow/lib/canonicalData.ts +45 -0
- package/runtime/workflow/lib/checkCodeRunner.ts +7 -3
- package/runtime/workflow/lib/config.ts +1 -1
- package/runtime/workflow/lib/context.ts +77 -0
- package/runtime/workflow/lib/create2.ts +18 -121
- package/runtime/workflow/lib/deploymentInfo.ts +8 -0
- package/runtime/workflow/lib/deploymentRecords.ts +3 -1
- 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/externalExecutionScanner.ts +2 -1
- package/runtime/workflow/lib/gateTool.ts +22 -10
- package/runtime/workflow/lib/gateToolSync.ts +11 -3
- package/runtime/workflow/lib/operationNames.ts +32 -0
- package/runtime/workflow/lib/parameters.ts +8 -21
- 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 +6 -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 +42 -176
- 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 +99 -58
- package/runtime/workflow/steps/upgrade.ts +88 -57
- package/runtime/workflow/steps/view.ts +1 -1
- package/bin/workflow.cjs +0 -19
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { parseDeliveryRequest, type DeliveryRequest } from './protocol';
|
|
2
|
+
import { loadDeliveryTarget } from './config';
|
|
3
|
+
import { projectDefaultNetwork } from './project';
|
|
4
|
+
import { validateNetworkAlias } from './policy';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
/** Validate every explicit selector, then bind the network Hardhat is expected to select. */
|
|
8
|
+
export function resolveDeliveryRuntimeNetwork(input: {
|
|
9
|
+
root: string; request: DeliveryRequest; env?: NodeJS.ProcessEnv; argv?: string[];
|
|
10
|
+
}): string {
|
|
11
|
+
const env = input.env ?? process.env;
|
|
12
|
+
const argv = input.argv ?? process.argv;
|
|
13
|
+
const argumentsFor = (name: string): string[] => {
|
|
14
|
+
const values: string[] = [];
|
|
15
|
+
for (let index = 0; index < argv.length; index++) {
|
|
16
|
+
const argument = argv[index];
|
|
17
|
+
if (argument !== name && !argument.startsWith(`${name}=`)) continue;
|
|
18
|
+
const value = argument === name ? argv[++index] : argument.slice(name.length + 1);
|
|
19
|
+
if (!value || value.startsWith('-')) throw new Error(`${name} requires a value`);
|
|
20
|
+
values.push(value);
|
|
21
|
+
}
|
|
22
|
+
return values;
|
|
23
|
+
};
|
|
24
|
+
for (const [name, values, file] of [
|
|
25
|
+
['config', [env.HARDHAT_CONFIG, ...argumentsFor('--config')], 'hardhat.config.ts'],
|
|
26
|
+
['tsconfig', [env.HARDHAT_TSCONFIG, ...argumentsFor('--tsconfig')], 'tsconfig.json'],
|
|
27
|
+
] as const) {
|
|
28
|
+
for (const value of values) {
|
|
29
|
+
if (value === undefined) continue;
|
|
30
|
+
if (!value || path.resolve(input.root, value) !== path.resolve(input.root, file)) throw new Error(`Hardhat ${name} conflict with delivery project`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const networks = [env.HARDHAT_NETWORK, ...argumentsFor('--network')].filter((value): value is string => value !== undefined);
|
|
34
|
+
for (const value of networks) validateNetworkAlias(value, 'Hardhat network');
|
|
35
|
+
if (new Set(networks).size > 1) throw new Error('Hardhat network selector conflict with delivery context');
|
|
36
|
+
const runner = networks[0] ?? projectDefaultNetwork(input.root);
|
|
37
|
+
if (runner !== input.request.network && !(runner === 'hardhat' && input.request.mode === 'simulate')) throw new Error('Hardhat network conflict with delivery context');
|
|
38
|
+
return runner;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Must run before importing any OZ module. A context is routing data, never execution authority. */
|
|
42
|
+
export function configureDeliveryEnvironment(input: { root: string; env?: NodeJS.ProcessEnv; argv?: string[] }): string | undefined {
|
|
43
|
+
const env = input.env ?? process.env;
|
|
44
|
+
if (env.GATE_DELIVERY_CONTEXT === undefined) return undefined;
|
|
45
|
+
const request = parseDeliveryRequest(JSON.parse(env.GATE_DELIVERY_CONTEXT));
|
|
46
|
+
resolveDeliveryRuntimeNetwork({ ...input, request, env });
|
|
47
|
+
const target = loadDeliveryTarget(input.root, request.network, request.environment);
|
|
48
|
+
const dir = target.openzeppelin.manifestDir;
|
|
49
|
+
if (env.MANIFEST_DEFAULT_DIR && env.MANIFEST_DEFAULT_DIR !== dir) throw new Error('MANIFEST_DEFAULT_DIR conflict with delivery context');
|
|
50
|
+
if (env.GATE_WORKFLOW_TARGET && env.GATE_WORKFLOW_TARGET !== request.network) throw new Error('GATE_WORKFLOW_TARGET conflict with delivery context');
|
|
51
|
+
env.MANIFEST_DEFAULT_DIR = dir;
|
|
52
|
+
env.GATE_WORKFLOW_TARGET = request.network;
|
|
53
|
+
return dir;
|
|
54
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Recoverable file-only commit. SQLite supplies an OS-released cross-process mutex;
|
|
2
|
+
* the fsynced intent survives that mutex's rollback after a process crash. */
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {randomUUID,createHash} from 'node:crypto';
|
|
6
|
+
import {DatabaseSync} from 'node:sqlite';
|
|
7
|
+
import {canonicalJson,semanticHash,exactObject} from '../workflow/lib/canonicalData';
|
|
8
|
+
import {portablePath,safeId} from './protocol';
|
|
9
|
+
export interface DevelopmentFile {path:string;before:string|null;after:string}
|
|
10
|
+
export interface DevelopmentFileCommit {root:string;executionId:string;identity:string;files:DevelopmentFile[]}
|
|
11
|
+
export const byteHash=(bytes:string|Buffer)=>createHash('sha256').update(bytes).digest('hex');
|
|
12
|
+
export function developmentPath(root:string,relative:string):string {
|
|
13
|
+
portablePath(relative,'materialization path');let current=fs.realpathSync(root);
|
|
14
|
+
for(const part of relative.split('/')){current=path.join(current,part);if(fs.existsSync(current)){const s=fs.lstatSync(current);if(s.isSymbolicLink()||(!s.isDirectory()&&!s.isFile())||s.isFile()&&s.nlink!==1)throw Error('Unsafe materialization path');}}
|
|
15
|
+
return current;
|
|
16
|
+
}
|
|
17
|
+
export function fileBytes(root:string,relative:string):string|null {const file=developmentPath(root,relative);return fs.existsSync(file)?fs.readFileSync(file,'utf8'):null;}
|
|
18
|
+
function syncDir(directory:string){const fd=fs.openSync(directory,'r');try{fs.fsyncSync(fd);}finally{fs.closeSync(fd);}}
|
|
19
|
+
function mkdir(directory:string){if(fs.existsSync(directory))return;mkdir(path.dirname(directory));fs.mkdirSync(directory,{mode:0o700});syncDir(path.dirname(directory));}
|
|
20
|
+
export function atomicDevelopmentWrite(root:string,relative:string,bytes:string):void {
|
|
21
|
+
const file=developmentPath(root,relative);mkdir(path.dirname(file));const temp=`${file}.${randomUUID()}.tmp`;
|
|
22
|
+
const fd=fs.openSync(temp,'wx',0o600);try{fs.writeFileSync(fd,bytes);fs.fsyncSync(fd);}finally{fs.closeSync(fd);}
|
|
23
|
+
fs.renameSync(temp,file);syncDir(path.dirname(file));
|
|
24
|
+
}
|
|
25
|
+
export function readDevelopmentJournal(root:string,executionId:string):any|undefined {
|
|
26
|
+
const bytes=fileBytes(root,`.gate-delivery/materialization/${safeId(executionId,'executionId')}.json`);if(bytes===null)return;
|
|
27
|
+
const j=JSON.parse(bytes);exactObject(j,['version','executionId','identity','files','state','intentHash'],'materialization journal');
|
|
28
|
+
if(j.version!==1||j.executionId!==executionId||!['prepared','committed'].includes(j.state)||!Array.isArray(j.files)||!j.files.length)throw Error('Invalid materialization journal');
|
|
29
|
+
for(const f of j.files){exactObject(f,['path','before','after','beforeHash','afterHash'],'journal file');portablePath(f.path,'journal path');if((f.before!==null&&typeof f.before!=='string')||typeof f.after!=='string'||f.beforeHash!==(f.before===null?null:byteHash(f.before))||f.afterHash!==byteHash(f.after))throw Error('Invalid materialization journal bytes');}
|
|
30
|
+
if(new Set(j.files.map((f:any)=>f.path)).size!==j.files.length||j.intentHash!==semanticHash({version:j.version,executionId:j.executionId,identity:j.identity,files:j.files}))throw Error('Invalid materialization journal identity');return j;
|
|
31
|
+
}
|
|
32
|
+
export async function withDevelopmentFileLock<T>(root:string,work:()=>Promise<T>):Promise<T> {
|
|
33
|
+
const file=developmentPath(root,'.gate-delivery/materialization.sqlite');mkdir(path.dirname(file));const db=new DatabaseSync(file);
|
|
34
|
+
try{db.exec('PRAGMA busy_timeout=5000; PRAGMA synchronous=FULL; BEGIN IMMEDIATE');return await work();}finally{try{db.exec('ROLLBACK');}finally{db.close();}}
|
|
35
|
+
}
|
|
36
|
+
/** Caller holds no file lock. onFileCommitted is a progress notification, never acceptance authority. */
|
|
37
|
+
export async function commitDevelopmentFiles(input:DevelopmentFileCommit,onFileCommitted?:(path:string)=>void):Promise<any> {
|
|
38
|
+
return withDevelopmentFileLock(input.root,()=>commitDevelopmentFilesLocked(input,onFileCommitted));
|
|
39
|
+
}
|
|
40
|
+
export async function commitDevelopmentFilesLocked(input:DevelopmentFileCommit,onFileCommitted?:(path:string)=>void):Promise<any> {
|
|
41
|
+
safeId(input.executionId,'executionId');if(!/^[a-f0-9]{64}$/.test(input.identity)||!input.files.length)throw Error('Invalid materialization identity/files');
|
|
42
|
+
const files=input.files.map(f=>{exactObject(f,['path','before','after'],'materialization file');developmentPath(input.root,f.path);if((f.before!==null&&typeof f.before!=='string')||typeof f.after!=='string')throw Error('Invalid file bytes');return {...f,beforeHash:f.before===null?null:byteHash(f.before),afterHash:byteHash(f.after)};});
|
|
43
|
+
if(new Set(files.map(f=>f.path)).size!==files.length)throw Error('Duplicate materialization path');
|
|
44
|
+
const body={version:1,executionId:input.executionId,identity:input.identity,files},intentHash=semanticHash(body);
|
|
45
|
+
let journal=readDevelopmentJournal(input.root,input.executionId);
|
|
46
|
+
if(journal&&journal.intentHash!==intentHash)throw Error('Materialization identity/candidate conflict');
|
|
47
|
+
const journalPath=`.gate-delivery/materialization/${input.executionId}.json`;
|
|
48
|
+
// Validate the entire set before changing even the first file.
|
|
49
|
+
for(const f of files){const bytes=fileBytes(input.root,f.path);if(bytes!==f.before&&bytes!==f.after)throw Error(`Materialization byte conflict: ${f.path}`);if(journal?.state==='committed'&&bytes!==f.after)throw Error(`Committed materialization conflict: ${f.path}`);}
|
|
50
|
+
if(!journal){journal={...body,state:'prepared',intentHash};atomicDevelopmentWrite(input.root,journalPath,canonicalJson(journal)+'\n');}
|
|
51
|
+
for(const f of files){const current=fileBytes(input.root,f.path);if(current===f.after)continue;if(current!==f.before)throw Error(`Materialization byte conflict: ${f.path}`);atomicDevelopmentWrite(input.root,f.path,f.after);onFileCommitted?.(f.path);}
|
|
52
|
+
journal={...journal,state:'committed'};atomicDevelopmentWrite(input.root,journalPath,canonicalJson(journal)+'\n');return journal;
|
|
53
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Structural observation validation grants neither chain finality nor send authority. */
|
|
2
|
+
import { canonicalJson, deepFreeze, exactObject, nonempty } from '../workflow/lib/canonicalData';
|
|
3
|
+
import { strictData } from './data';
|
|
4
|
+
import type { DeliveryPlan } from './plan';
|
|
5
|
+
export type ObservationState = 'included-unfinalized' | 'finalized-success' | 'finalized-reverted';
|
|
6
|
+
export interface TransactionObservation {
|
|
7
|
+
observationId: string;
|
|
8
|
+
executionId: string;
|
|
9
|
+
planHash: string;
|
|
10
|
+
chainId: string;
|
|
11
|
+
target: string;
|
|
12
|
+
transaction: DeliveryPlan['transactions'][number];
|
|
13
|
+
transactionHash: string;
|
|
14
|
+
state: ObservationState;
|
|
15
|
+
blockNumber: string;
|
|
16
|
+
blockHash: string;
|
|
17
|
+
safe?: {
|
|
18
|
+
envelopeId: string;
|
|
19
|
+
innerCallIndex: number;
|
|
20
|
+
transactionIndex: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Trusted producer must verify exact transaction/chain inclusion, execution outcome,
|
|
24
|
+
* canonicality and configured finality. A user JSON object or receipt hash is not this capability.
|
|
25
|
+
* Hosts must supply this port from controlled code, never agent-supplied implementations. */
|
|
26
|
+
export interface TrustedObservationPort {
|
|
27
|
+
readObservation(observationId: string): Promise<TransactionObservation | undefined>;
|
|
28
|
+
}
|
|
29
|
+
export interface TrustedFinalizedProgressPort {
|
|
30
|
+
readFinalized(observationId: string): Promise<TransactionObservation | undefined>;
|
|
31
|
+
}
|
|
32
|
+
export function uint256(raw: unknown, label: string): string {
|
|
33
|
+
if (typeof raw !== 'string' || !/^(0|[1-9][0-9]*)$/.test(raw) || BigInt(raw) >= 2n ** 256n)
|
|
34
|
+
throw new Error(`Invalid canonical uint256 ${label}`);
|
|
35
|
+
return raw;
|
|
36
|
+
}
|
|
37
|
+
export function hash32(raw: unknown, label: string): string {
|
|
38
|
+
if (typeof raw !== 'string' || !/^0x[0-9a-f]{64}$/.test(raw))
|
|
39
|
+
throw new Error(`Invalid ${label}`);
|
|
40
|
+
return raw;
|
|
41
|
+
}
|
|
42
|
+
export function parseObservation(raw: unknown, plan: DeliveryPlan, index: number): TransactionObservation {
|
|
43
|
+
const data = strictData(raw);
|
|
44
|
+
const v = exactObject(data, ['observationId', 'executionId', 'planHash', 'chainId', 'target', 'transaction', 'transactionHash', 'state', 'blockNumber', 'blockHash', ...(Object.hasOwn(data as object, 'safe') ? ['safe'] : [])], 'transaction observation');
|
|
45
|
+
if (v.safe !== undefined) {
|
|
46
|
+
const m = exactObject(v.safe, ['envelopeId', 'innerCallIndex', 'transactionIndex'], 'Safe observation mapping');
|
|
47
|
+
if (typeof m.envelopeId !== 'string' || !/^[0-9a-f]{64}$/.test(m.envelopeId) || !Number.isSafeInteger(m.innerCallIndex) || Number(m.innerCallIndex) < 0)
|
|
48
|
+
throw Error('Invalid Safe observation mapping');
|
|
49
|
+
uint256(m.transactionIndex, 'Safe transactionIndex');
|
|
50
|
+
}
|
|
51
|
+
nonempty(v.observationId, 'observationId');
|
|
52
|
+
hash32(v.transactionHash, 'transactionHash');
|
|
53
|
+
hash32(v.blockHash, 'blockHash');
|
|
54
|
+
uint256(v.blockNumber, 'blockNumber');
|
|
55
|
+
if (!['included-unfinalized', 'finalized-success', 'finalized-reverted'].includes(String(v.state)))
|
|
56
|
+
throw new Error('Invalid observation state');
|
|
57
|
+
if (v.executionId !== plan.executionId || v.planHash !== plan.planHash || v.chainId !== plan.chainId || v.target !== plan.target || !plan.transactions[index] || canonicalJson(v.transaction) !== canonicalJson(plan.transactions[index]))
|
|
58
|
+
throw new Error('Observation plan identity/order mismatch');
|
|
59
|
+
return deepFreeze(v as unknown as TransactionObservation);
|
|
60
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/** Expand task-owned defaults before schema/provenance validation. Never a production override port. */
|
|
2
|
+
import { ownPath, pointerPart } from './data';
|
|
3
|
+
import { object } from './protocol';
|
|
4
|
+
import { canonicalJson, exactObject } from '../workflow/lib/canonicalData';
|
|
5
|
+
|
|
6
|
+
type Observations = { manual: Record<string, unknown>; computed: Record<string, unknown> };
|
|
7
|
+
const record = (value: unknown): value is Record<string, unknown> =>
|
|
8
|
+
value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
9
|
+
function observations(raw: unknown): Observations {
|
|
10
|
+
const value = exactObject(raw, ['manual', 'computed'], 'target provenance');
|
|
11
|
+
return { manual: object(value.manual, 'manual observations'), computed: object(value.computed, 'computed observations') };
|
|
12
|
+
}
|
|
13
|
+
function leaves(value: unknown, path = '', result = new Map<string, unknown>()): Map<string, unknown> {
|
|
14
|
+
const entries = value !== null && typeof value === 'object' ? Object.entries(value) : [];
|
|
15
|
+
if (!entries.length) result.set(path, value);
|
|
16
|
+
else for (const [key, child] of entries) leaves(child, `${path}/${pointerPart(key)}`, result);
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
function merge(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {
|
|
20
|
+
return Object.fromEntries([...new Set([...Object.keys(base), ...Object.keys(override)])].map(key => [key,
|
|
21
|
+
!Object.hasOwn(override, key) ? base[key]
|
|
22
|
+
: Object.hasOwn(base, key) && record(base[key]) && record(override[key]) ? merge(base[key], override[key])
|
|
23
|
+
: override[key],
|
|
24
|
+
]));
|
|
25
|
+
}
|
|
26
|
+
/** Only leaves actually inherited from defaults may inherit default observations. Arrays replace as a unit. */
|
|
27
|
+
function inheritedLeaves(base: unknown, override: unknown, path = '', result = new Set<string>()): Set<string> {
|
|
28
|
+
if (!record(base) || !record(override)) return result;
|
|
29
|
+
for (const [key, value] of Object.entries(base)) {
|
|
30
|
+
const child = `${path}/${pointerPart(key)}`;
|
|
31
|
+
if (!Object.hasOwn(override, key)) for (const pointer of leaves(value, child).keys()) result.add(pointer);
|
|
32
|
+
else if (record(value) && record(override[key])) inheritedLeaves(value, override[key], child, result);
|
|
33
|
+
}
|
|
34
|
+
// The empty root/container is itself a schema leaf.
|
|
35
|
+
if (!Object.keys(base).length && !Object.keys(override).length) result.add(path);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function resolveParameterTargets(rawValues: unknown, rawProvenance: unknown, networks: readonly string[]): {
|
|
40
|
+
params: Record<string, unknown>; observations: Record<string, Observations>; definitions: Record<string, unknown>;
|
|
41
|
+
} {
|
|
42
|
+
const values = object(rawValues, 'parameters.yaml', ['defaults', 'params']);
|
|
43
|
+
const params = object(ownPath(values, ['params'], 'target parameters'), 'target parameters');
|
|
44
|
+
const provenance = object(rawProvenance, 'parameters provenance', ['version', 'producers', 'defaults', 'targets']);
|
|
45
|
+
if (provenance.version !== 1) throw new Error('Unsupported provenance version');
|
|
46
|
+
const definitions = object(provenance.producers, 'producers'), targets = object(provenance.targets, 'provenance targets');
|
|
47
|
+
for (const name of [...Object.keys(params), ...Object.keys(targets)])
|
|
48
|
+
if (!networks.includes(name)) throw new Error('Unknown parameter target');
|
|
49
|
+
const observed = Object.fromEntries(Object.entries(targets).map(([name, value]) => [name, observations(value)]));
|
|
50
|
+
if (!Object.hasOwn(values, 'defaults')) {
|
|
51
|
+
if (Object.hasOwn(provenance, 'defaults')) throw new Error('Default provenance requires parameter defaults');
|
|
52
|
+
return { params, observations: observed, definitions };
|
|
53
|
+
}
|
|
54
|
+
const defaults = object(values.defaults, 'parameter defaults');
|
|
55
|
+
const shared = Object.hasOwn(provenance, 'defaults') ? observations(provenance.defaults) : { manual: {}, computed: {} };
|
|
56
|
+
const defaultLeaves = leaves(defaults);
|
|
57
|
+
for (const kind of ['manual', 'computed'] as const) for (const [path, raw] of Object.entries(shared[kind])) {
|
|
58
|
+
if (!defaultLeaves.has(path)) throw new Error(`Unused default parameter observation at ${path}`);
|
|
59
|
+
const observation = exactObject(raw, kind === 'manual' ? ['source', 'value'] : ['producer', 'version', 'inputs', 'output'], 'default observation');
|
|
60
|
+
if (canonicalJson(observation[kind === 'manual' ? 'value' : 'output']) !== canonicalJson(defaultLeaves.get(path)))
|
|
61
|
+
throw new Error(`Default observation mismatch at ${path}`);
|
|
62
|
+
}
|
|
63
|
+
const effective = Object.fromEntries(networks.map(name => {
|
|
64
|
+
const override = Object.hasOwn(params, name) ? object(params[name], 'network parameter overrides') : {};
|
|
65
|
+
return [name, merge(defaults, override)];
|
|
66
|
+
}));
|
|
67
|
+
const effectiveObservations = Object.fromEntries(networks.map(name => {
|
|
68
|
+
const override = Object.hasOwn(params, name) ? params[name] : {};
|
|
69
|
+
const inherited = inheritedLeaves(defaults, override), local = Object.hasOwn(observed, name) ? observed[name] : { manual: {}, computed: {} };
|
|
70
|
+
return [name, Object.fromEntries((['manual', 'computed'] as const).map(kind => [kind, {
|
|
71
|
+
...Object.fromEntries(Object.entries(shared[kind]).filter(([path]) => inherited.has(path))), ...local[kind],
|
|
72
|
+
}])) as Observations];
|
|
73
|
+
}));
|
|
74
|
+
return { params: effective, observations: effectiveObservations, definitions };
|
|
75
|
+
}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import Ajv from "ajv";
|
|
2
|
+
import {
|
|
3
|
+
deepFreeze,
|
|
4
|
+
semanticHash,
|
|
5
|
+
canonicalJson,
|
|
6
|
+
} from "../workflow/lib/canonicalData";
|
|
7
|
+
import { strictData, ownPath, pointerPart, pointerParts } from "./data";
|
|
8
|
+
export { strictData } from "./data";
|
|
9
|
+
|
|
10
|
+
type Schema = Record<string, any>;
|
|
11
|
+
type Policy =
|
|
12
|
+
| { kind: "copy"; target: string; path: string }
|
|
13
|
+
| { kind: "manual" }
|
|
14
|
+
| { kind: "computed"; producer: string; version: string };
|
|
15
|
+
export interface ManualObservation {
|
|
16
|
+
source: string;
|
|
17
|
+
value: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface ComputedObservation {
|
|
20
|
+
producer: string;
|
|
21
|
+
version: string;
|
|
22
|
+
inputs: unknown;
|
|
23
|
+
output: unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface ParameterInputs {
|
|
26
|
+
schema: Schema;
|
|
27
|
+
target: string;
|
|
28
|
+
values: unknown;
|
|
29
|
+
sources?: Record<string, unknown>;
|
|
30
|
+
manual?: Record<string, ManualObservation>;
|
|
31
|
+
computed?: Record<string, ComputedObservation>;
|
|
32
|
+
}
|
|
33
|
+
export interface TrustedParameterProducer {
|
|
34
|
+
version: string;
|
|
35
|
+
produce(inputs: unknown): unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface LeafProvenance {
|
|
38
|
+
target: string;
|
|
39
|
+
path: string;
|
|
40
|
+
policy: Policy["kind"];
|
|
41
|
+
valueIdentity: string;
|
|
42
|
+
observation: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
export interface ResolvedDeliveryParameters extends Required<ParameterInputs> {
|
|
45
|
+
version: 1;
|
|
46
|
+
provenance: LeafProvenance[];
|
|
47
|
+
identity: string;
|
|
48
|
+
}
|
|
49
|
+
const DIALECT = "http://json-schema.org/draft-07/schema#";
|
|
50
|
+
const KEYWORDS = new Set([
|
|
51
|
+
"$schema",
|
|
52
|
+
"title",
|
|
53
|
+
"description",
|
|
54
|
+
"type",
|
|
55
|
+
"properties",
|
|
56
|
+
"required",
|
|
57
|
+
"additionalProperties",
|
|
58
|
+
"items",
|
|
59
|
+
"minItems",
|
|
60
|
+
"maxItems",
|
|
61
|
+
"uniqueItems",
|
|
62
|
+
"minProperties",
|
|
63
|
+
"maxProperties",
|
|
64
|
+
"enum",
|
|
65
|
+
"const",
|
|
66
|
+
"minimum",
|
|
67
|
+
"maximum",
|
|
68
|
+
"exclusiveMinimum",
|
|
69
|
+
"exclusiveMaximum",
|
|
70
|
+
"multipleOf",
|
|
71
|
+
"minLength",
|
|
72
|
+
"maxLength",
|
|
73
|
+
"pattern",
|
|
74
|
+
"x-policy",
|
|
75
|
+
]);
|
|
76
|
+
const ajv = new Ajv({
|
|
77
|
+
strict: true,
|
|
78
|
+
allErrors: true,
|
|
79
|
+
coerceTypes: false,
|
|
80
|
+
useDefaults: false,
|
|
81
|
+
removeAdditional: false,
|
|
82
|
+
ownProperties: true,
|
|
83
|
+
});
|
|
84
|
+
ajv.addKeyword({ keyword: "x-policy", valid: true });
|
|
85
|
+
function checkedSchema(raw: Schema): Schema {
|
|
86
|
+
const schema = strictData(raw);
|
|
87
|
+
if (schema.$schema !== DIALECT)
|
|
88
|
+
throw new Error("Delivery schema requires explicit draft-07 dialect");
|
|
89
|
+
const visit = (s: Schema, root = false): void => {
|
|
90
|
+
if (!s || typeof s !== "object" || Array.isArray(s))
|
|
91
|
+
throw new Error("Delivery schema nodes must be objects");
|
|
92
|
+
for (const key of Object.keys(s))
|
|
93
|
+
if (!KEYWORDS.has(key))
|
|
94
|
+
throw new Error(`Unsupported delivery schema keyword ${key}`);
|
|
95
|
+
if (!root && s.$schema !== undefined)
|
|
96
|
+
throw new Error("Nested schema dialect unsupported");
|
|
97
|
+
if (
|
|
98
|
+
![
|
|
99
|
+
"object",
|
|
100
|
+
"array",
|
|
101
|
+
"string",
|
|
102
|
+
"boolean",
|
|
103
|
+
"integer",
|
|
104
|
+
"number",
|
|
105
|
+
"null",
|
|
106
|
+
].includes(s.type)
|
|
107
|
+
)
|
|
108
|
+
throw new Error("Each delivery schema node requires one explicit type");
|
|
109
|
+
if (s.type === "object") {
|
|
110
|
+
if (
|
|
111
|
+
s.additionalProperties !== false ||
|
|
112
|
+
!s.properties ||
|
|
113
|
+
typeof s.properties !== "object" ||
|
|
114
|
+
Array.isArray(s.properties)
|
|
115
|
+
)
|
|
116
|
+
throw new Error(
|
|
117
|
+
"Object schemas require properties and additionalProperties:false",
|
|
118
|
+
);
|
|
119
|
+
if (
|
|
120
|
+
Object.keys(s.properties).some((key) =>
|
|
121
|
+
["__proto__", "constructor", "prototype"].includes(key),
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
throw new Error(
|
|
125
|
+
"Delivery schemas explicitly disallow prototype-like property names",
|
|
126
|
+
);
|
|
127
|
+
Object.values(s.properties).forEach((child) => visit(child as Schema));
|
|
128
|
+
} else if (
|
|
129
|
+
s.properties !== undefined ||
|
|
130
|
+
s.additionalProperties !== undefined
|
|
131
|
+
)
|
|
132
|
+
throw new Error("Object keywords require object type");
|
|
133
|
+
if (s.type === "array") visit(s.items);
|
|
134
|
+
else if (s.items !== undefined)
|
|
135
|
+
throw new Error("items requires array type");
|
|
136
|
+
if (s["x-policy"] !== undefined) {
|
|
137
|
+
const p = s["x-policy"];
|
|
138
|
+
if (!p || typeof p !== "object" || Array.isArray(p))
|
|
139
|
+
throw new Error("Invalid parameter policy");
|
|
140
|
+
const keys =
|
|
141
|
+
p.kind === "copy"
|
|
142
|
+
? ["kind", "target", "path"]
|
|
143
|
+
: p.kind === "computed"
|
|
144
|
+
? ["kind", "producer", "version"]
|
|
145
|
+
: p.kind === "manual"
|
|
146
|
+
? ["kind"]
|
|
147
|
+
: [];
|
|
148
|
+
if (
|
|
149
|
+
!keys.length ||
|
|
150
|
+
Object.keys(p).sort().join() !== keys.sort().join() ||
|
|
151
|
+
keys.some((k) => typeof p[k] !== "string" || (k !== "path" && !p[k]))
|
|
152
|
+
)
|
|
153
|
+
throw new Error("Invalid parameter policy fields");
|
|
154
|
+
if (p.kind === "copy") pointerParts(p.path);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
visit(schema, true);
|
|
158
|
+
// Ajv's code generator rejects some prototype-like property names; refuse these schema
|
|
159
|
+
// names explicitly rather than silently omitting validation. strictData itself preserves them.
|
|
160
|
+
ajv.compile(schema);
|
|
161
|
+
return schema;
|
|
162
|
+
}
|
|
163
|
+
function attest(
|
|
164
|
+
input: Required<ParameterInputs>,
|
|
165
|
+
producers?: Record<string, TrustedParameterProducer>,
|
|
166
|
+
): LeafProvenance[] {
|
|
167
|
+
const schema = checkedSchema(input.schema),
|
|
168
|
+
validate = ajv.compile(schema);
|
|
169
|
+
if (!validate(input.values))
|
|
170
|
+
throw new Error(
|
|
171
|
+
`Delivery parameter schema: ${ajv.errorsText(validate.errors)}`,
|
|
172
|
+
);
|
|
173
|
+
if (!input.target || typeof input.target !== "string")
|
|
174
|
+
throw new Error("Parameter target required");
|
|
175
|
+
const provenance: LeafProvenance[] = [];
|
|
176
|
+
const usedManual = new Set<string>(),
|
|
177
|
+
usedComputed = new Set<string>();
|
|
178
|
+
const visit = (
|
|
179
|
+
s: Schema,
|
|
180
|
+
value: unknown,
|
|
181
|
+
path: string,
|
|
182
|
+
inherited?: { policy: Policy; root: string },
|
|
183
|
+
) => {
|
|
184
|
+
const selected = s["x-policy"]
|
|
185
|
+
? { policy: s["x-policy"] as Policy, root: path }
|
|
186
|
+
: inherited;
|
|
187
|
+
const entries =
|
|
188
|
+
value && typeof value === "object"
|
|
189
|
+
? Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
190
|
+
: [];
|
|
191
|
+
if (entries.length) {
|
|
192
|
+
for (const [key, v] of entries)
|
|
193
|
+
visit(
|
|
194
|
+
s.type === "array" ? s.items : s.properties[key],
|
|
195
|
+
v,
|
|
196
|
+
`${path}/${pointerPart(key)}`,
|
|
197
|
+
selected,
|
|
198
|
+
);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (!selected) throw new Error(`Missing parameter policy at ${path}`);
|
|
202
|
+
const p = selected.policy;
|
|
203
|
+
let observation: Record<string, unknown>;
|
|
204
|
+
if (p.kind === "copy") {
|
|
205
|
+
const sourcePath = p.path + path.slice(selected.root.length);
|
|
206
|
+
const source = ownPath(
|
|
207
|
+
input.sources,
|
|
208
|
+
[p.target, ...pointerParts(sourcePath)],
|
|
209
|
+
`Copy source ${p.target}${sourcePath}`,
|
|
210
|
+
);
|
|
211
|
+
if (canonicalJson(source) !== canonicalJson(value))
|
|
212
|
+
throw new Error(`Copy value mismatch at ${path}`);
|
|
213
|
+
observation = {
|
|
214
|
+
target: p.target,
|
|
215
|
+
path: sourcePath,
|
|
216
|
+
contentIdentity: semanticHash(source),
|
|
217
|
+
sourceIdentity: semanticHash(ownPath(input.sources, [p.target])),
|
|
218
|
+
};
|
|
219
|
+
} else if (p.kind === "manual") {
|
|
220
|
+
const o = ownPath(input.manual, [path]) as ManualObservation;
|
|
221
|
+
usedManual.add(path);
|
|
222
|
+
if (
|
|
223
|
+
!o ||
|
|
224
|
+
Object.keys(o).sort().join() !== "source,value" ||
|
|
225
|
+
typeof o.source !== "string" ||
|
|
226
|
+
!o.source ||
|
|
227
|
+
canonicalJson(o.value) !== canonicalJson(value)
|
|
228
|
+
)
|
|
229
|
+
throw new Error(`Manual observation mismatch at ${path}`);
|
|
230
|
+
observation = {
|
|
231
|
+
source: o.source,
|
|
232
|
+
contentIdentity: semanticHash(o.value),
|
|
233
|
+
};
|
|
234
|
+
} else {
|
|
235
|
+
const o = ownPath(input.computed, [path]) as ComputedObservation;
|
|
236
|
+
usedComputed.add(path);
|
|
237
|
+
if (
|
|
238
|
+
!o ||
|
|
239
|
+
Object.keys(o).sort().join() !== "inputs,output,producer,version" ||
|
|
240
|
+
o.producer !== p.producer ||
|
|
241
|
+
o.version !== p.version ||
|
|
242
|
+
canonicalJson(o.output) !== canonicalJson(value)
|
|
243
|
+
)
|
|
244
|
+
throw new Error(`Computed observation mismatch at ${path}`);
|
|
245
|
+
if (producers) {
|
|
246
|
+
const producer = ownPath(producers, [
|
|
247
|
+
p.producer,
|
|
248
|
+
]) as TrustedParameterProducer;
|
|
249
|
+
if (
|
|
250
|
+
producer.version !== p.version ||
|
|
251
|
+
canonicalJson(
|
|
252
|
+
strictData(producer.produce(deepFreeze(strictData(o.inputs)))),
|
|
253
|
+
) !== canonicalJson(value)
|
|
254
|
+
)
|
|
255
|
+
throw new Error(`Computed producer mismatch at ${path}`);
|
|
256
|
+
}
|
|
257
|
+
observation = {
|
|
258
|
+
producer: p.producer,
|
|
259
|
+
version: p.version,
|
|
260
|
+
inputIdentity: semanticHash(o.inputs),
|
|
261
|
+
outputIdentity: semanticHash(o.output),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
provenance.push({
|
|
265
|
+
target: input.target,
|
|
266
|
+
path,
|
|
267
|
+
policy: p.kind,
|
|
268
|
+
valueIdentity: semanticHash(value),
|
|
269
|
+
observation,
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
visit(schema, input.values, "");
|
|
273
|
+
for (const [observations, used] of [
|
|
274
|
+
[input.manual, usedManual],
|
|
275
|
+
[input.computed, usedComputed],
|
|
276
|
+
] as const)
|
|
277
|
+
if (Object.keys(observations).some((k) => !used.has(k)))
|
|
278
|
+
throw new Error("Unused parameter observation");
|
|
279
|
+
return provenance.sort((a, b) =>
|
|
280
|
+
a.path < b.path ? -1 : a.path > b.path ? 1 : 0,
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
/** Development only. Producers are a versioned trusted seam, not independent production authority. */
|
|
284
|
+
export function resolveDeliveryParameters(
|
|
285
|
+
raw: ParameterInputs & {
|
|
286
|
+
producers?: Record<string, TrustedParameterProducer>;
|
|
287
|
+
},
|
|
288
|
+
): ResolvedDeliveryParameters {
|
|
289
|
+
const allowed = [
|
|
290
|
+
"schema",
|
|
291
|
+
"target",
|
|
292
|
+
"values",
|
|
293
|
+
"sources",
|
|
294
|
+
"manual",
|
|
295
|
+
"computed",
|
|
296
|
+
"producers",
|
|
297
|
+
];
|
|
298
|
+
if (
|
|
299
|
+
!raw ||
|
|
300
|
+
typeof raw !== "object" ||
|
|
301
|
+
Array.isArray(raw) ||
|
|
302
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(raw)) ||
|
|
303
|
+
Object.getOwnPropertySymbols(raw).length
|
|
304
|
+
)
|
|
305
|
+
throw new Error("Parameter inputs require own data fields");
|
|
306
|
+
const detached: Record<string, unknown> = {};
|
|
307
|
+
for (const key of Object.getOwnPropertyNames(raw)) {
|
|
308
|
+
if (!allowed.includes(key))
|
|
309
|
+
throw new Error(
|
|
310
|
+
"Unsupported parameter input field (overrides are not accepted)",
|
|
311
|
+
);
|
|
312
|
+
detached[key] = ownPath(raw, [key], "parameter input");
|
|
313
|
+
}
|
|
314
|
+
raw = detached as unknown as typeof raw;
|
|
315
|
+
const input = strictData({
|
|
316
|
+
schema: raw.schema,
|
|
317
|
+
target: raw.target,
|
|
318
|
+
values: raw.values,
|
|
319
|
+
sources: raw.sources ?? {},
|
|
320
|
+
manual: raw.manual ?? {},
|
|
321
|
+
computed: raw.computed ?? {},
|
|
322
|
+
});
|
|
323
|
+
const provenance = attest(input, raw.producers ?? {});
|
|
324
|
+
const body = { version: 1 as const, ...input, provenance };
|
|
325
|
+
return deepFreeze({ ...body, identity: semanticHash(body) });
|
|
326
|
+
}
|
|
327
|
+
/** Read-only migration check, never a producer receipt or production authority. */
|
|
328
|
+
export function validateHistoricalParameterExtension(previous: ResolvedDeliveryParameters, current: ParameterInputs): ResolvedDeliveryParameters {
|
|
329
|
+
consumeDeliveryParameters(previous, previous.identity);
|
|
330
|
+
const input = strictData({schema: current.schema, target: current.target, values: current.values,
|
|
331
|
+
sources: current.sources ?? {}, manual: current.manual ?? {}, computed: current.computed ?? {}});
|
|
332
|
+
if (input.target !== previous.target) throw Error('Historical parameter target changed');
|
|
333
|
+
// A historical consumer cannot rerun or grant authority to a newly introduced producer.
|
|
334
|
+
for (const [pointer, observation] of Object.entries(input.computed)) {
|
|
335
|
+
if (canonicalJson(observation) !== canonicalJson(previous.computed[pointer] ?? null)) throw Error('Historical computed parameter changed; new development acceptance required');
|
|
336
|
+
}
|
|
337
|
+
const provenance = attest(input);
|
|
338
|
+
for (const leaf of previous.provenance) {
|
|
339
|
+
const next = provenance.find(candidate => candidate.path === leaf.path);
|
|
340
|
+
if (!next || canonicalJson(next) !== canonicalJson(leaf)) throw Error(`Historical parameter value/provenance changed: ${leaf.path}`);
|
|
341
|
+
}
|
|
342
|
+
const body = {version: 1 as const, ...input, provenance};
|
|
343
|
+
return deepFreeze({...body, identity: semanticHash(body)});
|
|
344
|
+
}
|
|
345
|
+
/** Consume a previously trusted identity; no fill-in, override, or producer invocation. */
|
|
346
|
+
export function consumeDeliveryParameters(
|
|
347
|
+
raw: ResolvedDeliveryParameters,
|
|
348
|
+
expectedIdentity: string,
|
|
349
|
+
): unknown {
|
|
350
|
+
if (arguments.length !== 2)
|
|
351
|
+
throw new Error(
|
|
352
|
+
"Production parameter consumption accepts no override arguments",
|
|
353
|
+
);
|
|
354
|
+
const result = strictData(raw);
|
|
355
|
+
if (
|
|
356
|
+
Object.keys(result).sort().join() !==
|
|
357
|
+
"computed,identity,manual,provenance,schema,sources,target,values,version" ||
|
|
358
|
+
result.version !== 1
|
|
359
|
+
)
|
|
360
|
+
throw new Error("Invalid resolved parameter envelope");
|
|
361
|
+
const { identity, ...body } = result;
|
|
362
|
+
if (identity !== expectedIdentity || identity !== semanticHash(body))
|
|
363
|
+
throw new Error("Resolved parameter identity mismatch");
|
|
364
|
+
if (canonicalJson(attest(result)) !== canonicalJson(result.provenance))
|
|
365
|
+
throw new Error("Resolved parameter provenance mismatch");
|
|
366
|
+
return deepFreeze(result.values);
|
|
367
|
+
}
|