@0xsequence/catapult 1.1.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/.eslintrc.json +29 -0
- package/.github/workflows/ci.yml +181 -0
- package/CONCEPT.md +24 -0
- package/README.md +772 -0
- package/contracts/checked-call.huff +65 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/common.d.ts +11 -0
- package/dist/commands/common.d.ts.map +1 -0
- package/dist/commands/common.js +73 -0
- package/dist/commands/common.js.map +1 -0
- package/dist/commands/dry.d.ts +3 -0
- package/dist/commands/dry.d.ts.map +1 -0
- package/dist/commands/dry.js +171 -0
- package/dist/commands/dry.js.map +1 -0
- package/dist/commands/etherscan.d.ts +3 -0
- package/dist/commands/etherscan.d.ts.map +1 -0
- package/dist/commands/etherscan.js +323 -0
- package/dist/commands/etherscan.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +22 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +259 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +96 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/utils.d.ts +3 -0
- package/dist/commands/utils.d.ts.map +1 -0
- package/dist/commands/utils.js +46 -0
- package/dist/commands/utils.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/deployer-events.spec.d.ts +2 -0
- package/dist/lib/__tests__/deployer-events.spec.d.ts.map +1 -0
- package/dist/lib/__tests__/deployer-events.spec.js +260 -0
- package/dist/lib/__tests__/deployer-events.spec.js.map +1 -0
- package/dist/lib/__tests__/deployer.spec.d.ts +2 -0
- package/dist/lib/__tests__/deployer.spec.d.ts.map +1 -0
- package/dist/lib/__tests__/deployer.spec.js +884 -0
- package/dist/lib/__tests__/deployer.spec.js.map +1 -0
- package/dist/lib/__tests__/network-utils.spec.d.ts +2 -0
- package/dist/lib/__tests__/network-utils.spec.d.ts.map +1 -0
- package/dist/lib/__tests__/network-utils.spec.js +140 -0
- package/dist/lib/__tests__/network-utils.spec.js.map +1 -0
- package/dist/lib/contracts/__tests__/repository.spec.d.ts +2 -0
- package/dist/lib/contracts/__tests__/repository.spec.d.ts.map +1 -0
- package/dist/lib/contracts/__tests__/repository.spec.js +321 -0
- package/dist/lib/contracts/__tests__/repository.spec.js.map +1 -0
- package/dist/lib/contracts/repository.d.ts +27 -0
- package/dist/lib/contracts/repository.d.ts.map +1 -0
- package/dist/lib/contracts/repository.js +241 -0
- package/dist/lib/contracts/repository.js.map +1 -0
- package/dist/lib/core/__tests__/engine.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/engine.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/engine.spec.js +1212 -0
- package/dist/lib/core/__tests__/engine.spec.js.map +1 -0
- package/dist/lib/core/__tests__/graph.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/graph.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/graph.spec.js +116 -0
- package/dist/lib/core/__tests__/graph.spec.js.map +1 -0
- package/dist/lib/core/__tests__/json-integration.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/json-integration.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/json-integration.spec.js +300 -0
- package/dist/lib/core/__tests__/json-integration.spec.js.map +1 -0
- package/dist/lib/core/__tests__/loader.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/loader.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/loader.spec.js +288 -0
- package/dist/lib/core/__tests__/loader.spec.js.map +1 -0
- package/dist/lib/core/__tests__/multi-platform-verification.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/multi-platform-verification.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/multi-platform-verification.spec.js +342 -0
- package/dist/lib/core/__tests__/multi-platform-verification.spec.js.map +1 -0
- package/dist/lib/core/__tests__/resolver.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/resolver.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/resolver.spec.js +1367 -0
- package/dist/lib/core/__tests__/resolver.spec.js.map +1 -0
- package/dist/lib/core/__tests__/static-action.spec.d.ts +2 -0
- package/dist/lib/core/__tests__/static-action.spec.d.ts.map +1 -0
- package/dist/lib/core/__tests__/static-action.spec.js +136 -0
- package/dist/lib/core/__tests__/static-action.spec.js.map +1 -0
- package/dist/lib/core/context.d.ts +29 -0
- package/dist/lib/core/context.d.ts.map +1 -0
- package/dist/lib/core/context.js +88 -0
- package/dist/lib/core/context.js.map +1 -0
- package/dist/lib/core/engine.d.ts +25 -0
- package/dist/lib/core/engine.d.ts.map +1 -0
- package/dist/lib/core/engine.js +1191 -0
- package/dist/lib/core/engine.js.map +1 -0
- package/dist/lib/core/graph.d.ts +18 -0
- package/dist/lib/core/graph.d.ts.map +1 -0
- package/dist/lib/core/graph.js +158 -0
- package/dist/lib/core/graph.js.map +1 -0
- package/dist/lib/core/loader.d.ts +25 -0
- package/dist/lib/core/loader.d.ts.map +1 -0
- package/dist/lib/core/loader.js +248 -0
- package/dist/lib/core/loader.js.map +1 -0
- package/dist/lib/core/resolver.d.ts +20 -0
- package/dist/lib/core/resolver.d.ts.map +1 -0
- package/dist/lib/core/resolver.js +307 -0
- package/dist/lib/core/resolver.js.map +1 -0
- package/dist/lib/deployer.d.ts +39 -0
- package/dist/lib/deployer.d.ts.map +1 -0
- package/dist/lib/deployer.js +533 -0
- package/dist/lib/deployer.js.map +1 -0
- package/dist/lib/events/__tests__/event-system.spec.d.ts +2 -0
- package/dist/lib/events/__tests__/event-system.spec.d.ts.map +1 -0
- package/dist/lib/events/__tests__/event-system.spec.js +256 -0
- package/dist/lib/events/__tests__/event-system.spec.js.map +1 -0
- package/dist/lib/events/cli-adapter.d.ts +13 -0
- package/dist/lib/events/cli-adapter.d.ts.map +1 -0
- package/dist/lib/events/cli-adapter.js +244 -0
- package/dist/lib/events/cli-adapter.js.map +1 -0
- package/dist/lib/events/emitter.d.ts +11 -0
- package/dist/lib/events/emitter.d.ts.map +1 -0
- package/dist/lib/events/emitter.js +29 -0
- package/dist/lib/events/emitter.js.map +1 -0
- package/dist/lib/events/index.d.ts +4 -0
- package/dist/lib/events/index.d.ts.map +1 -0
- package/dist/lib/events/index.js +20 -0
- package/dist/lib/events/index.js.map +1 -0
- package/dist/lib/events/types.d.ts +368 -0
- package/dist/lib/events/types.d.ts.map +1 -0
- package/dist/lib/events/types.js +3 -0
- package/dist/lib/events/types.js.map +1 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +44 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/network-loader.d.ts +3 -0
- package/dist/lib/network-loader.d.ts.map +1 -0
- package/dist/lib/network-loader.js +80 -0
- package/dist/lib/network-loader.js.map +1 -0
- package/dist/lib/network-match.d.ts +3 -0
- package/dist/lib/network-match.d.ts.map +1 -0
- package/dist/lib/network-match.js +62 -0
- package/dist/lib/network-match.js.map +1 -0
- package/dist/lib/network-utils.d.ts +4 -0
- package/dist/lib/network-utils.d.ts.map +1 -0
- package/dist/lib/network-utils.js +39 -0
- package/dist/lib/network-utils.js.map +1 -0
- package/dist/lib/parsers/__tests__/buildinfo.spec.d.ts +2 -0
- package/dist/lib/parsers/__tests__/buildinfo.spec.d.ts.map +1 -0
- package/dist/lib/parsers/__tests__/buildinfo.spec.js +132 -0
- package/dist/lib/parsers/__tests__/buildinfo.spec.js.map +1 -0
- package/dist/lib/parsers/__tests__/job.spec.d.ts +2 -0
- package/dist/lib/parsers/__tests__/job.spec.d.ts.map +1 -0
- package/dist/lib/parsers/__tests__/job.spec.js +318 -0
- package/dist/lib/parsers/__tests__/job.spec.js.map +1 -0
- package/dist/lib/parsers/__tests__/template.spec.d.ts +2 -0
- package/dist/lib/parsers/__tests__/template.spec.d.ts.map +1 -0
- package/dist/lib/parsers/__tests__/template.spec.js +126 -0
- package/dist/lib/parsers/__tests__/template.spec.js.map +1 -0
- package/dist/lib/parsers/artifact/__tests__/artifact.spec.d.ts +2 -0
- package/dist/lib/parsers/artifact/__tests__/artifact.spec.d.ts.map +1 -0
- package/dist/lib/parsers/artifact/__tests__/artifact.spec.js +128 -0
- package/dist/lib/parsers/artifact/__tests__/artifact.spec.js.map +1 -0
- package/dist/lib/parsers/artifact/foundry-1.2.d.ts +3 -0
- package/dist/lib/parsers/artifact/foundry-1.2.d.ts.map +1 -0
- package/dist/lib/parsers/artifact/foundry-1.2.js +82 -0
- package/dist/lib/parsers/artifact/foundry-1.2.js.map +1 -0
- package/dist/lib/parsers/artifact/index.d.ts +3 -0
- package/dist/lib/parsers/artifact/index.d.ts.map +1 -0
- package/dist/lib/parsers/artifact/index.js +17 -0
- package/dist/lib/parsers/artifact/index.js.map +1 -0
- package/dist/lib/parsers/artifact/types.d.ts +3 -0
- package/dist/lib/parsers/artifact/types.d.ts.map +1 -0
- package/dist/lib/parsers/artifact/types.js +3 -0
- package/dist/lib/parsers/artifact/types.js.map +1 -0
- package/dist/lib/parsers/buildinfo.d.ts +5 -0
- package/dist/lib/parsers/buildinfo.d.ts.map +1 -0
- package/dist/lib/parsers/buildinfo.js +85 -0
- package/dist/lib/parsers/buildinfo.js.map +1 -0
- package/dist/lib/parsers/constants.d.ts +4 -0
- package/dist/lib/parsers/constants.d.ts.map +1 -0
- package/dist/lib/parsers/constants.js +45 -0
- package/dist/lib/parsers/constants.js.map +1 -0
- package/dist/lib/parsers/index.d.ts +5 -0
- package/dist/lib/parsers/index.d.ts.map +1 -0
- package/dist/lib/parsers/index.js +21 -0
- package/dist/lib/parsers/index.js.map +1 -0
- package/dist/lib/parsers/job.d.ts +3 -0
- package/dist/lib/parsers/job.d.ts.map +1 -0
- package/dist/lib/parsers/job.js +74 -0
- package/dist/lib/parsers/job.js.map +1 -0
- package/dist/lib/parsers/template.d.ts +3 -0
- package/dist/lib/parsers/template.d.ts.map +1 -0
- package/dist/lib/parsers/template.js +91 -0
- package/dist/lib/parsers/template.js.map +1 -0
- package/dist/lib/std/templates/assured-deployment.yaml +45 -0
- package/dist/lib/std/templates/erc-2470.yaml +67 -0
- package/dist/lib/std/templates/min-balance.yaml +32 -0
- package/dist/lib/std/templates/nano-universal-deployer.yaml +59 -0
- package/dist/lib/std/templates/raw-erc-2470.yaml +59 -0
- package/dist/lib/std/templates/raw-nano-universal-deployer.yaml +51 -0
- package/dist/lib/std/templates/raw-sequence-universal-deployer-2.yaml +48 -0
- package/dist/lib/std/templates/sequence-universal-deployer-2.yaml +57 -0
- package/dist/lib/types/__tests__/json-request-action.spec.d.ts +2 -0
- package/dist/lib/types/__tests__/json-request-action.spec.d.ts.map +1 -0
- package/dist/lib/types/__tests__/json-request-action.spec.js +219 -0
- package/dist/lib/types/__tests__/json-request-action.spec.js.map +1 -0
- package/dist/lib/types/__tests__/read-json-value.spec.d.ts +2 -0
- package/dist/lib/types/__tests__/read-json-value.spec.d.ts.map +1 -0
- package/dist/lib/types/__tests__/read-json-value.spec.js +233 -0
- package/dist/lib/types/__tests__/read-json-value.spec.js.map +1 -0
- package/dist/lib/types/actions.d.ts +74 -0
- package/dist/lib/types/actions.d.ts.map +1 -0
- package/dist/lib/types/actions.js +18 -0
- package/dist/lib/types/actions.js.map +1 -0
- package/dist/lib/types/artifacts.d.ts +15 -0
- package/dist/lib/types/artifacts.d.ts.map +1 -0
- package/dist/lib/types/artifacts.js +3 -0
- package/dist/lib/types/artifacts.js.map +1 -0
- package/dist/lib/types/buildinfo.d.ts +112 -0
- package/dist/lib/types/buildinfo.d.ts.map +1 -0
- package/dist/lib/types/buildinfo.js +3 -0
- package/dist/lib/types/buildinfo.js.map +1 -0
- package/dist/lib/types/conditions.d.ts +17 -0
- package/dist/lib/types/conditions.d.ts.map +1 -0
- package/dist/lib/types/conditions.js +21 -0
- package/dist/lib/types/conditions.js.map +1 -0
- package/dist/lib/types/contracts.d.ts +14 -0
- package/dist/lib/types/contracts.d.ts.map +1 -0
- package/dist/lib/types/contracts.js +3 -0
- package/dist/lib/types/contracts.js.map +1 -0
- package/dist/lib/types/definitions.d.ts +51 -0
- package/dist/lib/types/definitions.d.ts.map +1 -0
- package/dist/lib/types/definitions.js +3 -0
- package/dist/lib/types/definitions.js.map +1 -0
- package/dist/lib/types/index.d.ts +9 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +25 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/types/network.d.ts +9 -0
- package/dist/lib/types/network.d.ts.map +1 -0
- package/dist/lib/types/network.js +3 -0
- package/dist/lib/types/network.js.map +1 -0
- package/dist/lib/types/project.d.ts +5 -0
- package/dist/lib/types/project.d.ts.map +1 -0
- package/dist/lib/types/project.js +3 -0
- package/dist/lib/types/project.js.map +1 -0
- package/dist/lib/types/task.d.ts +9 -0
- package/dist/lib/types/task.d.ts.map +1 -0
- package/dist/lib/types/task.js +3 -0
- package/dist/lib/types/task.js.map +1 -0
- package/dist/lib/types/values.d.ts +78 -0
- package/dist/lib/types/values.d.ts.map +1 -0
- package/dist/lib/types/values.js +3 -0
- package/dist/lib/types/values.js.map +1 -0
- package/dist/lib/utils/validation.d.ts +5 -0
- package/dist/lib/utils/validation.d.ts.map +1 -0
- package/dist/lib/utils/validation.js +77 -0
- package/dist/lib/utils/validation.js.map +1 -0
- package/dist/lib/validation/contract-references.d.ts +12 -0
- package/dist/lib/validation/contract-references.d.ts.map +1 -0
- package/dist/lib/validation/contract-references.js +112 -0
- package/dist/lib/validation/contract-references.js.map +1 -0
- package/dist/lib/validation/index.d.ts +1 -0
- package/dist/lib/validation/index.d.ts.map +1 -0
- package/dist/lib/validation/index.js +2 -0
- package/dist/lib/validation/index.js.map +1 -0
- package/dist/lib/verification/__tests__/etherscan.spec.d.ts +2 -0
- package/dist/lib/verification/__tests__/etherscan.spec.d.ts.map +1 -0
- package/dist/lib/verification/__tests__/etherscan.spec.js +565 -0
- package/dist/lib/verification/__tests__/etherscan.spec.js.map +1 -0
- package/dist/lib/verification/__tests__/sourcify.spec.d.ts +2 -0
- package/dist/lib/verification/__tests__/sourcify.spec.d.ts.map +1 -0
- package/dist/lib/verification/__tests__/sourcify.spec.js +212 -0
- package/dist/lib/verification/__tests__/sourcify.spec.js.map +1 -0
- package/dist/lib/verification/etherscan.d.ts +56 -0
- package/dist/lib/verification/etherscan.d.ts.map +1 -0
- package/dist/lib/verification/etherscan.js +340 -0
- package/dist/lib/verification/etherscan.js.map +1 -0
- package/dist/lib/verification/sourcify.d.ts +12 -0
- package/dist/lib/verification/sourcify.d.ts.map +1 -0
- package/dist/lib/verification/sourcify.js +227 -0
- package/dist/lib/verification/sourcify.js.map +1 -0
- package/eslint.config.js +48 -0
- package/examples/jobs/guards-v1.yaml +17 -0
- package/examples/jobs/sequence-seq-0001-patch.yaml +59 -0
- package/examples/jobs/sequence-v1.yaml +59 -0
- package/examples/templates/sequence-factory-v1.yaml +56 -0
- package/jest.config.js +25 -0
- package/package.json +68 -0
- package/src/cli.ts +17 -0
- package/src/commands/common.ts +61 -0
- package/src/commands/dry.ts +208 -0
- package/src/commands/etherscan.ts +360 -0
- package/src/commands/index.ts +5 -0
- package/src/commands/list.ts +249 -0
- package/src/commands/run.ts +136 -0
- package/src/commands/utils.ts +52 -0
- package/src/index.ts +67 -0
- package/src/lib/__tests__/deployer-events.spec.ts +338 -0
- package/src/lib/__tests__/deployer.spec.ts +1204 -0
- package/src/lib/__tests__/network-utils.spec.ts +181 -0
- package/src/lib/artifacts/__tests__/fixtures/contract1.json +19 -0
- package/src/lib/artifacts/__tests__/fixtures/contract2.json +19 -0
- package/src/lib/artifacts/__tests__/fixtures/duplicate-name.json +19 -0
- package/src/lib/artifacts/__tests__/fixtures/nested/nested-contract.json +18 -0
- package/src/lib/artifacts/__tests__/fixtures/not-an-artifact.json +8 -0
- package/src/lib/artifacts/__tests__/fixtures/readme.txt +2 -0
- package/src/lib/contracts/__tests__/repository.spec.ts +344 -0
- package/src/lib/contracts/repository.ts +313 -0
- package/src/lib/core/__tests__/engine.spec.ts +1514 -0
- package/src/lib/core/__tests__/graph.spec.ts +125 -0
- package/src/lib/core/__tests__/json-integration.spec.ts +360 -0
- package/src/lib/core/__tests__/loader.spec.ts +334 -0
- package/src/lib/core/__tests__/multi-platform-verification.spec.ts +406 -0
- package/src/lib/core/__tests__/resolver.spec.ts +1693 -0
- package/src/lib/core/__tests__/static-action.spec.ts +172 -0
- package/src/lib/core/context.ts +127 -0
- package/src/lib/core/engine.ts +1531 -0
- package/src/lib/core/graph.ts +252 -0
- package/src/lib/core/loader.ts +263 -0
- package/src/lib/core/resolver.ts +498 -0
- package/src/lib/deployer.ts +768 -0
- package/src/lib/events/__tests__/event-system.spec.ts +343 -0
- package/src/lib/events/cli-adapter.ts +325 -0
- package/src/lib/events/emitter.ts +62 -0
- package/src/lib/events/index.ts +3 -0
- package/src/lib/events/types.ts +469 -0
- package/src/lib/index.ts +14 -0
- package/src/lib/network-loader.ts +59 -0
- package/src/lib/network-utils.ts +64 -0
- package/src/lib/parsers/__tests__/buildinfo.spec.ts +122 -0
- package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-bytecode-buildinfo.json +62 -0
- package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-json.txt +2 -0
- package/src/lib/parsers/__tests__/fixtures/buildinfo/multi-contract-buildinfo.json +89 -0
- package/src/lib/parsers/__tests__/fixtures/buildinfo/no-contracts-buildinfo.json +17 -0
- package/src/lib/parsers/__tests__/fixtures/buildinfo/simple-buildinfo.json +63 -0
- package/src/lib/parsers/__tests__/fixtures/buildinfo/wrong-format.json +4 -0
- package/src/lib/parsers/__tests__/job.spec.ts +335 -0
- package/src/lib/parsers/__tests__/template.spec.ts +111 -0
- package/src/lib/parsers/artifact/__tests__/artifact.spec.ts +117 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/empty-bytecode.json +5 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/hardhat-artifact.json +67 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/invalid-bytecode.json +5 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/invalid-json.txt +11 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/minimal-artifact.json +5 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/missing-abi.json +4 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/missing-bytecode.json +11 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/missing-contract-name.json +11 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/simple-artifact.json +40 -0
- package/src/lib/parsers/artifact/__tests__/fixtures/wrong-types.json +7 -0
- package/src/lib/parsers/artifact/foundry-1.2.ts +72 -0
- package/src/lib/parsers/artifact/index.ts +27 -0
- package/src/lib/parsers/artifact/types.ts +9 -0
- package/src/lib/parsers/buildinfo.ts +127 -0
- package/src/lib/parsers/constants.ts +56 -0
- package/src/lib/parsers/index.ts +5 -0
- package/src/lib/parsers/job.ts +101 -0
- package/src/lib/parsers/template.ts +131 -0
- package/src/lib/std/templates/assured-deployment.yaml +45 -0
- package/src/lib/std/templates/erc-2470.yaml +67 -0
- package/src/lib/std/templates/min-balance.yaml +32 -0
- package/src/lib/std/templates/nano-universal-deployer.yaml +59 -0
- package/src/lib/std/templates/raw-erc-2470.yaml +59 -0
- package/src/lib/std/templates/raw-nano-universal-deployer.yaml +51 -0
- package/src/lib/std/templates/raw-sequence-universal-deployer-2.yaml +48 -0
- package/src/lib/std/templates/sequence-universal-deployer-2.yaml +57 -0
- package/src/lib/types/__tests__/json-request-action.spec.ts +243 -0
- package/src/lib/types/__tests__/read-json-value.spec.ts +264 -0
- package/src/lib/types/actions.ts +127 -0
- package/src/lib/types/artifacts.ts +21 -0
- package/src/lib/types/buildinfo.ts +116 -0
- package/src/lib/types/conditions.ts +50 -0
- package/src/lib/types/contracts.ts +23 -0
- package/src/lib/types/definitions.ts +68 -0
- package/src/lib/types/index.ts +8 -0
- package/src/lib/types/network.ts +22 -0
- package/src/lib/types/project.ts +9 -0
- package/src/lib/types/task.ts +9 -0
- package/src/lib/types/values.ts +116 -0
- package/src/lib/utils/validation.ts +116 -0
- package/src/lib/validation/contract-references.ts +210 -0
- package/src/lib/validation/index.ts +1 -0
- package/src/lib/verification/__tests__/etherscan.spec.ts +710 -0
- package/src/lib/verification/__tests__/sourcify.spec.ts +288 -0
- package/src/lib/verification/etherscan.ts +546 -0
- package/src/lib/verification/sourcify.ts +248 -0
- package/test_validation/artifacts/TestContract.json +9 -0
- package/test_validation/jobs/test-missing.yaml +16 -0
- package/test_validation/networks.yaml +3 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { EventEmitter } from 'events'
|
|
2
|
+
import { DeploymentEvent } from './types'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Type-safe event emitter for deployment events.
|
|
6
|
+
* Extends Node.js EventEmitter with typed event methods.
|
|
7
|
+
*/
|
|
8
|
+
export class DeploymentEventEmitter extends EventEmitter {
|
|
9
|
+
/**
|
|
10
|
+
* Emits a deployment event with automatic timestamp injection.
|
|
11
|
+
*/
|
|
12
|
+
public emitEvent(event: any): void {
|
|
13
|
+
const fullEvent = {
|
|
14
|
+
...event,
|
|
15
|
+
timestamp: new Date()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Emit on both the specific event type and a general 'event' channel
|
|
19
|
+
this.emit(event.type, fullEvent)
|
|
20
|
+
this.emit('event', fullEvent)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Type-safe event listener registration.
|
|
25
|
+
*/
|
|
26
|
+
public onEvent<T extends DeploymentEvent>(
|
|
27
|
+
eventType: T['type'],
|
|
28
|
+
listener: (event: T) => void
|
|
29
|
+
): this {
|
|
30
|
+
return this.on(eventType, listener)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Listen to all events.
|
|
35
|
+
*/
|
|
36
|
+
public onAnyEvent(listener: (event: DeploymentEvent) => void): this {
|
|
37
|
+
return this.on('event', listener)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* One-time event listener.
|
|
42
|
+
*/
|
|
43
|
+
public onceEvent<T extends DeploymentEvent>(
|
|
44
|
+
eventType: T['type'],
|
|
45
|
+
listener: (event: T) => void
|
|
46
|
+
): this {
|
|
47
|
+
return this.once(eventType, listener)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Remove event listener.
|
|
52
|
+
*/
|
|
53
|
+
public offEvent<T extends DeploymentEvent>(
|
|
54
|
+
eventType: T['type'],
|
|
55
|
+
listener: (event: T) => void
|
|
56
|
+
): this {
|
|
57
|
+
return this.off(eventType, listener)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Singleton instance for global access
|
|
62
|
+
export const deploymentEvents = new DeploymentEventEmitter()
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event system for structured logging throughout the deployment process.
|
|
3
|
+
* Replaces direct console.log calls with rich, structured events.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface BaseEvent {
|
|
7
|
+
type: string
|
|
8
|
+
timestamp: Date
|
|
9
|
+
level: 'info' | 'warn' | 'error' | 'debug'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Deployment lifecycle events
|
|
13
|
+
export interface DeploymentStartedEvent extends BaseEvent {
|
|
14
|
+
type: 'deployment_started'
|
|
15
|
+
level: 'info'
|
|
16
|
+
data: {
|
|
17
|
+
projectRoot: string
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface DeploymentCompletedEvent extends BaseEvent {
|
|
22
|
+
type: 'deployment_completed'
|
|
23
|
+
level: 'info'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface DeploymentFailedEvent extends BaseEvent {
|
|
27
|
+
type: 'deployment_failed'
|
|
28
|
+
level: 'error'
|
|
29
|
+
data: {
|
|
30
|
+
error: string
|
|
31
|
+
stack?: string
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Project loading events
|
|
36
|
+
export interface ProjectLoadingStartedEvent extends BaseEvent {
|
|
37
|
+
type: 'project_loading_started'
|
|
38
|
+
level: 'info'
|
|
39
|
+
data: {
|
|
40
|
+
projectRoot: string
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface ProjectLoadedEvent extends BaseEvent {
|
|
45
|
+
type: 'project_loaded'
|
|
46
|
+
level: 'info'
|
|
47
|
+
data: {
|
|
48
|
+
jobCount: number
|
|
49
|
+
templateCount: number
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Execution plan events
|
|
54
|
+
export interface ExecutionPlanEvent extends BaseEvent {
|
|
55
|
+
type: 'execution_plan'
|
|
56
|
+
level: 'info'
|
|
57
|
+
data: {
|
|
58
|
+
targetNetworks: Array<{
|
|
59
|
+
name: string
|
|
60
|
+
chainId: number
|
|
61
|
+
}>
|
|
62
|
+
jobExecutionOrder: string[]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Job execution events
|
|
67
|
+
export interface JobStartedEvent extends BaseEvent {
|
|
68
|
+
type: 'job_started'
|
|
69
|
+
level: 'info'
|
|
70
|
+
data: {
|
|
71
|
+
jobName: string
|
|
72
|
+
jobVersion: string
|
|
73
|
+
networkName: string
|
|
74
|
+
chainId: number
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface JobCompletedEvent extends BaseEvent {
|
|
79
|
+
type: 'job_completed'
|
|
80
|
+
level: 'info'
|
|
81
|
+
data: {
|
|
82
|
+
jobName: string
|
|
83
|
+
networkName: string
|
|
84
|
+
chainId: number
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface JobSkippedEvent extends BaseEvent {
|
|
89
|
+
type: 'job_skipped'
|
|
90
|
+
level: 'warn'
|
|
91
|
+
data: {
|
|
92
|
+
jobName: string
|
|
93
|
+
networkName: string
|
|
94
|
+
reason: string
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Action execution events
|
|
99
|
+
export interface ActionStartedEvent extends BaseEvent {
|
|
100
|
+
type: 'action_started'
|
|
101
|
+
level: 'info'
|
|
102
|
+
data: {
|
|
103
|
+
actionName: string
|
|
104
|
+
jobName: string
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface ActionSkippedEvent extends BaseEvent {
|
|
109
|
+
type: 'action_skipped'
|
|
110
|
+
level: 'info'
|
|
111
|
+
data: {
|
|
112
|
+
actionName: string
|
|
113
|
+
reason: string
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface ActionCompletedEvent extends BaseEvent {
|
|
118
|
+
type: 'action_completed'
|
|
119
|
+
level: 'info'
|
|
120
|
+
data: {
|
|
121
|
+
actionName: string
|
|
122
|
+
result: string
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface ActionFailedEvent extends BaseEvent {
|
|
127
|
+
type: 'action_failed'
|
|
128
|
+
level: 'error'
|
|
129
|
+
data: {
|
|
130
|
+
message: string
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface ActionInfoEvent extends BaseEvent {
|
|
135
|
+
type: 'action_info'
|
|
136
|
+
level: 'debug'
|
|
137
|
+
data: {
|
|
138
|
+
message: string
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface DebugInfoEvent extends BaseEvent {
|
|
143
|
+
type: 'debug_info'
|
|
144
|
+
level: 'debug'
|
|
145
|
+
data: {
|
|
146
|
+
message: string
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Template execution events
|
|
151
|
+
export interface TemplateEnteredEvent extends BaseEvent {
|
|
152
|
+
type: 'template_entered'
|
|
153
|
+
level: 'debug'
|
|
154
|
+
data: {
|
|
155
|
+
templateName: string
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface TemplateExitedEvent extends BaseEvent {
|
|
160
|
+
type: 'template_exited'
|
|
161
|
+
level: 'debug'
|
|
162
|
+
data: {
|
|
163
|
+
templateName: string
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface TemplateSetupStartedEvent extends BaseEvent {
|
|
168
|
+
type: 'template_setup_started'
|
|
169
|
+
level: 'debug'
|
|
170
|
+
data: {
|
|
171
|
+
templateName: string
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export interface TemplateSetupCompletedEvent extends BaseEvent {
|
|
176
|
+
type: 'template_setup_completed'
|
|
177
|
+
level: 'debug'
|
|
178
|
+
data: {
|
|
179
|
+
templateName: string
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export interface TemplateSetupSkippedEvent extends BaseEvent {
|
|
184
|
+
type: 'template_setup_skipped'
|
|
185
|
+
level: 'info'
|
|
186
|
+
data: {
|
|
187
|
+
templateName: string
|
|
188
|
+
reason: string
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface TemplateSkippedEvent extends BaseEvent {
|
|
193
|
+
type: 'template_skipped'
|
|
194
|
+
level: 'info'
|
|
195
|
+
data: {
|
|
196
|
+
templateName: string
|
|
197
|
+
reason: string
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Transaction events
|
|
202
|
+
export interface PrimitiveActionEvent extends BaseEvent {
|
|
203
|
+
type: 'primitive_action'
|
|
204
|
+
level: 'debug'
|
|
205
|
+
data: {
|
|
206
|
+
actionType: string
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export interface TransactionSentEvent extends BaseEvent {
|
|
211
|
+
type: 'transaction_sent'
|
|
212
|
+
level: 'info'
|
|
213
|
+
data: {
|
|
214
|
+
to: string
|
|
215
|
+
value: string
|
|
216
|
+
dataPreview: string
|
|
217
|
+
txHash: string
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export interface TransactionConfirmedEvent extends BaseEvent {
|
|
222
|
+
type: 'transaction_confirmed'
|
|
223
|
+
level: 'info'
|
|
224
|
+
data: {
|
|
225
|
+
txHash: string
|
|
226
|
+
blockNumber: number
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Contract lifecycle events
|
|
231
|
+
export interface ContractCreatedEvent extends BaseEvent {
|
|
232
|
+
type: 'contract_created'
|
|
233
|
+
level: 'info'
|
|
234
|
+
data: {
|
|
235
|
+
contractAddress: string
|
|
236
|
+
txHash: string
|
|
237
|
+
blockNumber: number
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Output events
|
|
242
|
+
export interface OutputStoredEvent extends BaseEvent {
|
|
243
|
+
type: 'output_stored'
|
|
244
|
+
level: 'debug'
|
|
245
|
+
data: {
|
|
246
|
+
outputKey: string
|
|
247
|
+
value: any
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface OutputFileWrittenEvent extends BaseEvent {
|
|
252
|
+
type: 'output_file_written'
|
|
253
|
+
level: 'info'
|
|
254
|
+
data: {
|
|
255
|
+
relativePath: string
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export interface NoOutputsEvent extends BaseEvent {
|
|
260
|
+
type: 'no_outputs'
|
|
261
|
+
level: 'warn'
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export interface OutputWritingStartedEvent extends BaseEvent {
|
|
265
|
+
type: 'output_writing_started'
|
|
266
|
+
level: 'info'
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Warning events
|
|
270
|
+
export interface DuplicateArtifactWarningEvent extends BaseEvent {
|
|
271
|
+
type: 'duplicate_artifact_warning'
|
|
272
|
+
level: 'warn'
|
|
273
|
+
data: {
|
|
274
|
+
contractName: string
|
|
275
|
+
path: string
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export interface MissingNetworkConfigWarningEvent extends BaseEvent {
|
|
280
|
+
type: 'missing_network_config_warning'
|
|
281
|
+
level: 'warn'
|
|
282
|
+
data: {
|
|
283
|
+
missingChainIds: number[]
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export interface ContextDisposalWarningEvent extends BaseEvent {
|
|
288
|
+
type: 'context_disposal_warning'
|
|
289
|
+
level: 'warn'
|
|
290
|
+
data: {
|
|
291
|
+
jobName: string
|
|
292
|
+
networkName: string
|
|
293
|
+
error: string
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export interface DeprecatedJobsSkippedEvent extends BaseEvent {
|
|
298
|
+
type: 'deprecated_jobs_skipped'
|
|
299
|
+
level: 'warn'
|
|
300
|
+
data: {
|
|
301
|
+
jobs: string[] | { name: string }[]
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Network events
|
|
306
|
+
export interface NetworkStartedEvent extends BaseEvent {
|
|
307
|
+
type: 'network_started'
|
|
308
|
+
level: 'info'
|
|
309
|
+
data: {
|
|
310
|
+
networkName: string
|
|
311
|
+
chainId: number
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Process error events
|
|
316
|
+
export interface UnhandledRejectionEvent extends BaseEvent {
|
|
317
|
+
type: 'unhandled_rejection'
|
|
318
|
+
level: 'error'
|
|
319
|
+
data: {
|
|
320
|
+
error: string
|
|
321
|
+
origin: string
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export interface UncaughtExceptionEvent extends BaseEvent {
|
|
326
|
+
type: 'uncaught_exception'
|
|
327
|
+
level: 'error'
|
|
328
|
+
data: {
|
|
329
|
+
error: Error
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export interface CLIErrorEvent extends BaseEvent {
|
|
334
|
+
type: 'cli_error'
|
|
335
|
+
level: 'error'
|
|
336
|
+
data: {
|
|
337
|
+
message: string
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export interface JobExecutionFailedEvent extends BaseEvent {
|
|
342
|
+
type: 'job_execution_failed'
|
|
343
|
+
level: 'error'
|
|
344
|
+
data: {
|
|
345
|
+
jobName: string
|
|
346
|
+
networkName: string
|
|
347
|
+
chainId: number
|
|
348
|
+
error: string
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export interface VerificationStartedEvent extends BaseEvent {
|
|
353
|
+
type: 'verification_started'
|
|
354
|
+
level: 'info'
|
|
355
|
+
data: {
|
|
356
|
+
actionName: string
|
|
357
|
+
address: string
|
|
358
|
+
contractName: string
|
|
359
|
+
platform: string
|
|
360
|
+
networkName: string
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export interface VerificationSubmittedEvent extends BaseEvent {
|
|
365
|
+
type: 'verification_submitted'
|
|
366
|
+
level: 'info'
|
|
367
|
+
data: {
|
|
368
|
+
actionName: string
|
|
369
|
+
platform: string
|
|
370
|
+
guid: string
|
|
371
|
+
message: string
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export interface VerificationCompletedEvent extends BaseEvent {
|
|
376
|
+
type: 'verification_completed'
|
|
377
|
+
level: 'info'
|
|
378
|
+
data: {
|
|
379
|
+
actionName: string
|
|
380
|
+
address: string
|
|
381
|
+
contractName: string
|
|
382
|
+
platform: string
|
|
383
|
+
message: string
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export interface VerificationFailedEvent extends BaseEvent {
|
|
388
|
+
type: 'verification_failed'
|
|
389
|
+
level: 'error'
|
|
390
|
+
data: {
|
|
391
|
+
actionName: string
|
|
392
|
+
address: string
|
|
393
|
+
contractName: string
|
|
394
|
+
platform: string
|
|
395
|
+
error: string
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export interface VerificationRetryEvent extends BaseEvent {
|
|
400
|
+
type: 'verification_retry'
|
|
401
|
+
level: 'info'
|
|
402
|
+
data: {
|
|
403
|
+
platform: string
|
|
404
|
+
attempt: number
|
|
405
|
+
maxRetries: number
|
|
406
|
+
error: string
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// End-of-run summary
|
|
411
|
+
export interface RunSummaryEvent extends BaseEvent {
|
|
412
|
+
type: 'run_summary'
|
|
413
|
+
level: 'info' | 'warn'
|
|
414
|
+
data: {
|
|
415
|
+
networkCount: number
|
|
416
|
+
jobCount: number
|
|
417
|
+
successCount: number
|
|
418
|
+
failedCount: number
|
|
419
|
+
skippedCount: number
|
|
420
|
+
keyContracts: Array<{ job: string; action: string; address: string }>
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Union type of all events
|
|
425
|
+
export type DeploymentEvent =
|
|
426
|
+
| DeploymentStartedEvent
|
|
427
|
+
| DeploymentCompletedEvent
|
|
428
|
+
| DeploymentFailedEvent
|
|
429
|
+
| ProjectLoadingStartedEvent
|
|
430
|
+
| ProjectLoadedEvent
|
|
431
|
+
| ExecutionPlanEvent
|
|
432
|
+
| JobStartedEvent
|
|
433
|
+
| JobCompletedEvent
|
|
434
|
+
| JobSkippedEvent
|
|
435
|
+
| ActionStartedEvent
|
|
436
|
+
| ActionSkippedEvent
|
|
437
|
+
| ActionCompletedEvent
|
|
438
|
+
| ActionFailedEvent
|
|
439
|
+
| ActionInfoEvent
|
|
440
|
+
| DebugInfoEvent
|
|
441
|
+
| TemplateEnteredEvent
|
|
442
|
+
| TemplateExitedEvent
|
|
443
|
+
| TemplateSetupStartedEvent
|
|
444
|
+
| TemplateSetupCompletedEvent
|
|
445
|
+
| TemplateSetupSkippedEvent
|
|
446
|
+
| TemplateSkippedEvent
|
|
447
|
+
| PrimitiveActionEvent
|
|
448
|
+
| TransactionSentEvent
|
|
449
|
+
| TransactionConfirmedEvent
|
|
450
|
+
| ContractCreatedEvent
|
|
451
|
+
| OutputStoredEvent
|
|
452
|
+
| OutputFileWrittenEvent
|
|
453
|
+
| NoOutputsEvent
|
|
454
|
+
| OutputWritingStartedEvent
|
|
455
|
+
| DuplicateArtifactWarningEvent
|
|
456
|
+
| MissingNetworkConfigWarningEvent
|
|
457
|
+
| ContextDisposalWarningEvent
|
|
458
|
+
| DeprecatedJobsSkippedEvent
|
|
459
|
+
| NetworkStartedEvent
|
|
460
|
+
| UnhandledRejectionEvent
|
|
461
|
+
| UncaughtExceptionEvent
|
|
462
|
+
| CLIErrorEvent
|
|
463
|
+
| JobExecutionFailedEvent
|
|
464
|
+
| VerificationStartedEvent
|
|
465
|
+
| VerificationSubmittedEvent
|
|
466
|
+
| VerificationCompletedEvent
|
|
467
|
+
| VerificationFailedEvent
|
|
468
|
+
| VerificationRetryEvent
|
|
469
|
+
| RunSummaryEvent
|
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Export all types
|
|
2
|
+
export * from './types'
|
|
3
|
+
|
|
4
|
+
// Export core classes
|
|
5
|
+
export * from './contracts/repository'
|
|
6
|
+
|
|
7
|
+
// Export all parsers
|
|
8
|
+
export * as parsers from './parsers'
|
|
9
|
+
|
|
10
|
+
// Export the deployer
|
|
11
|
+
export * from './deployer'
|
|
12
|
+
|
|
13
|
+
// This will be the main entry point for the lib
|
|
14
|
+
// Additional functionality will be added here as the lib grows
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as fs from 'fs/promises'
|
|
2
|
+
import * as path from 'path'
|
|
3
|
+
import { parse as parseYaml } from 'yaml'
|
|
4
|
+
import { Network } from './types'
|
|
5
|
+
|
|
6
|
+
function isValidNetwork(obj: unknown): obj is Network {
|
|
7
|
+
return (
|
|
8
|
+
typeof obj === 'object' &&
|
|
9
|
+
obj !== null &&
|
|
10
|
+
'name' in obj &&
|
|
11
|
+
'chainId' in obj &&
|
|
12
|
+
'rpcUrl' in obj &&
|
|
13
|
+
typeof (obj as Record<string, unknown>).name === 'string' &&
|
|
14
|
+
typeof (obj as Record<string, unknown>).chainId === 'number' &&
|
|
15
|
+
typeof (obj as Record<string, unknown>).rpcUrl === 'string' &&
|
|
16
|
+
// supports field is optional and should be an array of strings if present
|
|
17
|
+
(!('supports' in obj) ||
|
|
18
|
+
(Array.isArray((obj as Record<string, unknown>).supports) &&
|
|
19
|
+
((obj as Record<string, unknown>).supports as unknown[]).every((item: unknown) => typeof item === 'string'))) &&
|
|
20
|
+
// gasLimit field is optional and should be a number if present
|
|
21
|
+
(!('gasLimit' in obj) || typeof (obj as Record<string, unknown>).gasLimit === 'number') &&
|
|
22
|
+
// testnet field is optional and should be a boolean if present
|
|
23
|
+
(!('testnet' in obj) || typeof (obj as Record<string, unknown>).testnet === 'boolean')
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Loads and validates network configurations from a `networks.yaml` file in the project root.
|
|
29
|
+
* @param projectRoot The root directory of the project.
|
|
30
|
+
* @returns A promise that resolves to an array of Network objects.
|
|
31
|
+
* @throws An error if the file exists but is malformed or contains invalid network data.
|
|
32
|
+
*/
|
|
33
|
+
export async function loadNetworks(projectRoot: string): Promise<Network[]> {
|
|
34
|
+
const filePath = path.join(projectRoot, 'networks.yaml')
|
|
35
|
+
try {
|
|
36
|
+
const content = await fs.readFile(filePath, 'utf-8')
|
|
37
|
+
const parsed = parseYaml(content)
|
|
38
|
+
|
|
39
|
+
if (!Array.isArray(parsed)) {
|
|
40
|
+
throw new Error('networks.yaml must contain an array of network configurations.')
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const networks: Network[] = []
|
|
44
|
+
for (const item of parsed) {
|
|
45
|
+
if (!isValidNetwork(item)) {
|
|
46
|
+
throw new Error(`Invalid network configuration found in networks.yaml: ${JSON.stringify(item)}`)
|
|
47
|
+
}
|
|
48
|
+
networks.push(item)
|
|
49
|
+
}
|
|
50
|
+
return networks
|
|
51
|
+
} catch (error: unknown) {
|
|
52
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
|
|
53
|
+
// It's okay if the file doesn't exist, just return an empty array.
|
|
54
|
+
return []
|
|
55
|
+
}
|
|
56
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
57
|
+
throw new Error(`Failed to load or parse networks.yaml: ${message}`)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ethers } from 'ethers'
|
|
2
|
+
import { Network } from './types'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Attempts to detect network information from an RPC URL
|
|
6
|
+
* @param rpcUrl The RPC URL to query
|
|
7
|
+
* @returns Promise that resolves with detected network information
|
|
8
|
+
*/
|
|
9
|
+
export async function detectNetworkFromRpc(rpcUrl: string): Promise<Partial<Network>> {
|
|
10
|
+
// Detect network information from RPC URL
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
const provider = new ethers.JsonRpcProvider(rpcUrl)
|
|
14
|
+
|
|
15
|
+
// Create provider and get network information
|
|
16
|
+
const network = await provider.getNetwork()
|
|
17
|
+
|
|
18
|
+
// Network detected successfully
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
name: network.name,
|
|
22
|
+
chainId: Number(network.chainId),
|
|
23
|
+
rpcUrl: rpcUrl
|
|
24
|
+
}
|
|
25
|
+
} catch (error) {
|
|
26
|
+
// Failed to detect network
|
|
27
|
+
throw new Error(`Failed to detect network from RPC URL "${rpcUrl}": ${error instanceof Error ? error.message : String(error)}`)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Validates if a string is a valid RPC URL
|
|
33
|
+
* @param url The URL to validate
|
|
34
|
+
* @returns True if the URL appears to be a valid RPC URL
|
|
35
|
+
*/
|
|
36
|
+
export function isValidRpcUrl(url: string): boolean {
|
|
37
|
+
try {
|
|
38
|
+
// Basic URL validation
|
|
39
|
+
const urlObj = new URL(url)
|
|
40
|
+
|
|
41
|
+
// Check if it's http/https or a common RPC protocol
|
|
42
|
+
const isValidProtocol = urlObj.protocol === 'http:' ||
|
|
43
|
+
urlObj.protocol === 'https:' ||
|
|
44
|
+
url.startsWith('ws://') ||
|
|
45
|
+
url.startsWith('wss://')
|
|
46
|
+
|
|
47
|
+
if (!isValidProtocol) {
|
|
48
|
+
// Invalid protocol
|
|
49
|
+
return false
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check if it has a hostname
|
|
53
|
+
if (!urlObj.hostname) {
|
|
54
|
+
// Missing hostname
|
|
55
|
+
return false
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Valid RPC URL format
|
|
59
|
+
return true
|
|
60
|
+
} catch {
|
|
61
|
+
// Invalid RPC URL format
|
|
62
|
+
return false
|
|
63
|
+
}
|
|
64
|
+
}
|