diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6feaca1e1..fad3fa811 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,5 +3,6 @@ Closes # . ### Pre-review checklist - [ ] All code has been formatted using our config (`make format`) -- [ ] Any new API features or modification of existing behavior is covered as defined in our [test plan](https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/test-plan.md) -- [ ] The changelog has been updated under the `## Unreleased` header, using the appropriate sub-headings (`### Added`, `### Removed`, `### Fixed`), and the links to the appropriate issues/PRs have been included +- [ ] Any new API features or modification of existing behavior are covered with tests +- [ ] The template (`templates/ctl-scaffold`) has been [updated](https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/development.md#maintaining-the-template) +- [ ] The changelog has been updated under the `## Unreleased` header, using the appropriate sub-headings (`### Added`, `### Changed`, `### Removed`, `### Fixed`), and the links to the appropriate issues/PRs have been included diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 20a4e0441..f0250567f 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -16,10 +16,8 @@ jobs: - name: Install and Build run: | npm install -g spago - npm install -g purescript@0.14.5 - npm install -g purescript-docs-search - spago docs --no-search - purescript-docs-search build-index --package-name cardano-transaction-lib + npm install -g purescript@0.15.8 + spago docs - name: Deploy uses: JamesIves/github-pages-deploy-action@v4.3.3 with: diff --git a/.gitignore b/.gitignore index a1c3cf9e5..a8bba0b04 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,11 @@ output.js .idea/ test-data/chrome-user-data test-data/preview +test-data/preprod +test-data/mainnet test-data/keys tmp node_modules +plutip-server/dist-newstyle/ +plutip-server/dist/ +plutip-server/.stack-work/ diff --git a/.mlc_config.json b/.mlc_config.json index 92232ab40..b7e3f107c 100644 --- a/.mlc_config.json +++ b/.mlc_config.json @@ -2,6 +2,12 @@ "ignorePatterns": [ { "pattern": "^https://gerowallet.io" + }, + { + "pattern": "^https://singularitynet.io" + }, + { + "pattern": "^https://iohk.io" } ], "aliveStatusCodes": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 6851822fa..d451909cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,46 +7,245 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -- [[v5.0.0]](#v500) +- [[Unreleased]](#unreleased) - [Added](#added) - [Changed](#changed) - - [Removed](#removed) - [Fixed](#fixed) - - [Runtime Dependencies](#runtime-dependencies) -- [[v4.0.2] - 2023-01-17](#v402---2023-01-17) - - [Fixed](#fixed-1) -- [[v4.0.1] - 2022-12-20](#v401---2022-12-20) + - [Removed](#removed) +- [[v7.0.0]](#v700) - [Added](#added-1) -- [[v4.0.0] - 2022-12-15](#v400---2022-12-15) - - [Added](#added-2) - [Changed](#changed-1) + - [Fixed](#fixed-1) - [Removed](#removed-1) - - [Fixed](#fixed-2) - - [Runtime Dependencies](#runtime-dependencies-1) -- [[3.0.0] - 2022-11-21](#300---2022-11-21) - - [Added](#added-3) +- [[v6.0.0]](#v600) + - [Added](#added-2) - [Changed](#changed-2) + - [Fixed](#fixed-2) - [Removed](#removed-2) - - [Fixed](#fixed-3) - - [Runtime Dependencies](#runtime-dependencies-2) -- [[2.0.0] - 2022-09-12](#200---2022-09-12) - - [Added](#added-4) +- [[v5.0.0]](#v500) + - [Added](#added-3) - [Changed](#changed-3) - [Removed](#removed-3) + - [Fixed](#fixed-3) + - [Runtime Dependencies](#runtime-dependencies) +- [[v4.0.2] - 2023-01-17](#v402---2023-01-17) - [Fixed](#fixed-4) -- [[2.0.0-alpha] - 2022-07-05](#200-alpha---2022-07-05) +- [[v4.0.1] - 2022-12-20](#v401---2022-12-20) + - [Added](#added-4) +- [[v4.0.0] - 2022-12-15](#v400---2022-12-15) - [Added](#added-5) - - [Removed](#removed-4) - [Changed](#changed-4) + - [Removed](#removed-4) - [Fixed](#fixed-5) -- [[1.1.0] - 2022-06-30](#110---2022-06-30) + - [Runtime Dependencies](#runtime-dependencies-1) +- [[3.0.0] - 2022-11-21](#300---2022-11-21) + - [Added](#added-6) + - [Changed](#changed-5) + - [Removed](#removed-5) - [Fixed](#fixed-6) -- [[1.0.1] - 2022-06-17](#101---2022-06-17) + - [Runtime Dependencies](#runtime-dependencies-2) +- [[2.0.0] - 2022-09-12](#200---2022-09-12) + - [Added](#added-7) + - [Changed](#changed-6) + - [Removed](#removed-6) - [Fixed](#fixed-7) +- [[2.0.0-alpha] - 2022-07-05](#200-alpha---2022-07-05) + - [Added](#added-8) + - [Removed](#removed-7) + - [Changed](#changed-7) + - [Fixed](#fixed-8) +- [[1.1.0] - 2022-06-30](#110---2022-06-30) + - [Fixed](#fixed-9) +- [[1.0.1] - 2022-06-17](#101---2022-06-17) + - [Fixed](#fixed-10) - [[1.0.0] - 2022-06-10](#100---2022-06-10) +## [Unreleased] + +### Added + +### Changed + +- Replaced custom CIP-30 wrapper code with [`purescript-cip30-typesafe`](https://github.com/mlabs-haskell/purescript-cip30-typesafe/) - ([#1583](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1583)) + +### Fixed + +### Removed + +- `ModifyTx` error: made conversion functions total and removed the need to handle it + +## [v7.0.0] + +### Added + +- [esbuild](https://esbuild.github.io/) bundler support. + - To update your package to use esbuild, add new `devDependencies` to your `package.json`: + +```diff ++ "esbuild": "0.18.11", ++ "esbuild-plugin-polyfill-node": "^0.3.0", ++ "esbuild-plugin-wasm": "^1.1.0", +``` + +Then consult with [the template's build scripts](./templates/ctl-scaffold/esbuild/) - also see the new [Makefile](./templates/ctl-scaffold/Makefile) setup and [NPM scripts](./templates/ctl-scaffold/package.json). + +### Changed + +- PureScript compiler version has been updated to v0.15.8. ([#1521](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1521)) + - PureScript v0.15.x outputs and expects ES modules (instead of CommonJS), which means that FFI code in dependent projects should be updated to use [ES module-style imports and exports](https://nodejs.org/api/esm.html), and consumers of CTL-based bundles should expect ES modules as well. + - Due to limitations of ES modules (inability to patch at runtime), CTL now uses vendored versions of CSL for node and the browser: + +```diff +- "@emurgo/cardano-serialization-lib-browser": "11.2.1", +- "@emurgo/cardano-serialization-lib-nodejs": "11.2.1", ++ "@mlabs-haskell/cardano-serialization-lib-gc-browser": "^1.0.6", ++ "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": "^1.0.6", +``` + + - Our vendored version of `json-bigint` should be updated: + +```diff +- "@mlabs-haskell/json-bigint": "1.0.0", ++ "@mlabs-haskell/json-bigint": "2.0.0", +``` + + - `utf-8-validate` NPM package has been added (used during bundling): + +```diff ++ "utf-8-validate": "^5.0.10", +``` + +- WebPack bundling machinery updates: + +```diff +- "webpack": "5.67.0", +- "webpack-cli": "4.10", +- "webpack-dev-server": "4.7.4" ++ "webpack": "5.88.1", ++ "webpack-cli": "5.1.4", ++ "webpack-dev-server": "4.15.1" +``` + +- Nix machinery refactorings ([#1521](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1521)): + - `buildPursDependencies` is a new function that allows to build everything except the source files of a project itself. It allows to skip rebuilding all the dependencies when using Nix every time. `buildPursProject` calls `buildPursDependencies` automatically. + - `censorCodes` and `strictComp` arguments have been removed from `purescriptProject` and added to `buildPursDependencies` and `buildPursProject` for more granular control. + - `runPursTest`: new `psEntryPoint` argument, for PureScript-level entry point function ("main" by default). + - `runE2ETest`: new `runnerMain` and `runnerPsEntryPoint` arguments to control which module should be the runner. + - `runE2ETest`: new arguments for configuring the E2E test suite: `envFile`, `emptySettingsFile` and `testTimeout`. + - `bundlePursProjectEsbuild` is a bundling function that uses newly introduced `esbuild`. + - `bundlePursProject` is renamed to `bundlePursProjectWebpack` +- `Data.BigInt` (`purescript-bigints`) dependency was replaced with `JS.BigInt` (`purescript-js-bigints`), that uses native JavaScript BigInt instead of `BigInteger.js` library. You can remove `big-integer` NPM dependency from your project, if you don't use it elsewhere. ([#1551](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1551)) + +### Fixed + +### Removed + +- Temporarily removed `buildSearchablePursDocs` and `launchSearchablePursDocs` from nix machinery - see [#1578](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1578) for context. Use `buildPursDocs` for now. ([#1521](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1521)) + +## [v6.0.0] + +### Added + +- `mkUnbalancedTxE`, `balanceTxE` and `balanceTxWithConstraintsE` as + non-throwing versions of `mkUnbalancedTx`, `balanceTx` and + `balanceTxWithConstraints` ([#1545](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1545) +- `explainMkUnbalancedTxError` and `explainBalanceTxError`, which prettyprint + `MkUnbalancedTxError` and `BalanceTxError` for a more human-readable output. ([#1545](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1545) +- `Contract.Time.getCurrentEra` and `Contract.Time.normalizeTimeInterval`, + providing an improved interface for eras and time ranges + ([#1542](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1542)). +- Added `extraSources` and `data` features to CTL's Nix build function ([#1516](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1516)) +- Added several `Ring`-like numeric instances for `Coin` ([#1485](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1485)) +- Added `ToData` and `FromData` instances for `PoolPubKeyHash` ([#1483](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1483)) +- **[IMPORTANT]** New machinery to achieve better synchronization between wallets and query layer has been added. This affects all CTL-based apps when light wallet browser extensions are in use. See [here](./doc/query-layers.md) for more info ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- **Local Blockfrost runtime** based on [run-your-own version of Blockfrost](https://github.com/blockfrost/blockfrost-backend-ryo/) - see [here](./doc/blockfrost.md#running-blockfrost-locally) for more info ([#1395](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1395)) +- **Lace wallet support** - ([#1477](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1477)) +- Automatic retries for `503 Service Unavailable` Kupo request errors. Retry attempts happen with exponentially increasing intervals ([#1436](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1436)) +- New functions in the assertion library to track changes in CIP-30 wallet total balance - see `Contract.Test.Assert` ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- Added `start-runtime` npm script to the template, to simplify UX ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- Configuration options for Kupo in `buildCtlRuntime` ([`deferDbIndexes`](https://cardanosolutions.github.io/kupo/#section/Getting-started/-defer-db-indexes) and [`pruneUtxo`](https://cardanosolutions.github.io/kupo/#section/Getting-started/-prune-utxo)) ([#1448](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1448)) +- `Contract.JsSdk` module containing helper functions for developers who want to use CTL from JS. See also: [this new guide](./doc/using-from-js.md) ([#1453](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1453)) +- New [docs for contract environment](./doc/contract-environment.md) ([#1453](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1453)) +- Cluster configuration options to `PlutipConfig`: `epochSize`, `maxTxSize` and `raiseExUnitsToMax` - see [Plutip docs](./doc/plutip-testing.md) ([#1494](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1494)) +- [HD wallet support](./doc/key-management.md) with mnemonic seed phrases ([#1498](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1498)) +- Ogmios-specific functions for Local TX Monitor Ouroboros Mini-Protocol in `Contract.Backend.Ogmios` ([#1508](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1508/)) +- New `mustSendChangeWithDatum` balancer constraint that adds datum to all change outputs ([#1510](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1510/)) +- Support for generic CIP-30 wallets by name ([#1524](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1524)) +- Full additional utxos support for Blockfrost backend ([#1537](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1537)) +- New `submitTxE`, an error returning variant of `submitTx` +- Allow providing a custom set of UTxOs for collateral selection, overriding the wallet (`mustUseCollateralUtxos` balancer constraint) ([#1513](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1513)) + +### Changed + +- **[IMPORTANT]** Ogmios has been updated and it must be started with `--include-transaction-cbor`. CTL relies on CBOR variants being available in the responses. +- **[IMPORTANT]** It is no more recommended to use `utxosAt` to get UTxOs at light wallet addresses. It may be a source of application bugs in some cases due to how wallets operate. Please see *Synchronization and wallet UTxO locking* section [here](./doc/query-layers.md) ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `scriptCurrencySymbol` no longer returns `Maybe` + ([#1538](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1538) +- Slot to/from POSIXTime conversion functions now live outside of `Effect` ([#1490](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1490)) +- All uses of `utxosAt` call have been replaced with `getWalletUtxos` in the balancer ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- Naming changes in `Contract.Test.Assert` for consistency with other functions ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)): + - `checkNewUtxosAtAddress` -> `assertNewUtxosAtAddress` + - `assertLovelaceDeltaAtAddress` -> `checkLovelaceDeltaAtAddress` + - `assertValueDeltaAtAddress` -> `checkValueDeltaAtAddress` +- New fields added to `ContractParams`: `ContractTimeParams` and `ContractSynchronizationParams`. Default values are `Contract.Config.defaultTimeParams` and `Contract.Config.defaultSynchronizationParams` . See [docs on query layers configuration](./doc/query-layers.md) for more info. ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `getWalletBalance` is now implemented via `getWalletUtxos` ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `PoolPubKeyHash` is now a wrapper over `PubKeyHash` instead of `Ed25519KeyHash` ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `Contract.Wallet.Key.publicKeyFromPrivateKey` uses `PublicKey` type from public API ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `Contract.Test.Blockfrost.executeContractTestsWithBlockfrost` does not require optional `CtlBackendParams` value (it is now constructed from environment variables). +- `plutip-server` has been moved from [Plutip repo](https://github.com/mlabs-haskell/plutip) to CTL ([#1415](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1415)) +- `UnattachedUnbalancedTx` has been renamed and moved to `Contract.UnbalancedTx.UnbalancedTx`, the old `UnbalancedTx` type has been removed as not needed. `mkUnbalancedTx` function has been moved to `Contract.UnbalancedTx` ([#1462](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1462)) +- Default NodeJS stable version is now v18 ([#1453](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1453)) +- Do not require light wallet collateral for all interactions ([#1477](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1477)) +- Removed re-exports of wallet-related functions from `Contract.Utxos` and `Contract.Address` (use `Contract.Wallet`) ([#1477](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1477)) +- `ownPaymentPubKeysHashes` renamed to `ownPaymentPubKeyHashes`, `ownStakePubKeysHashes` renamed to `ownStakePubKeyHashes` and both moved to `Contract.Wallet` ([#1477](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1477)) +- `runContractTestsWithKeyDir` now exposed from `Contract.Test` + ([#1549](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1549)) +- Pretty-printing improvements: UTxO lists and combined input/output/mint/fee values are now being pretty-printed instead `Show`n in the balancer ([#1531](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1531)) +- `mkUnbalancedTx`, `balanceTx` and `balanceTxWithConstraints` now throw instead + of returning in `Either` ([#1545](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1545)) +- `mkUnbalancedTx` isn't exported from `Contract.ScriptLookups` anymore; get it + from `Contract.UnbalancedTx` instead. + ([#1545](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1545)) +- Types changed: `TxEvaluationFailure`, `PoolParametersR`, due to ogmios update ([#1532](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1532)). +- Updated versions of `ctl-runtime` services: Ogmios to 6.0.0, Blockfrost to v1.7.0. + +### Fixed + +- `UseMnemonic` and `ConnectToGenericCip30` constructors now exported from + `Contract.Config` + ([#1546])(https://github.com/Plutonomicon/cardano-transaction-lib/pull/1546)) +- `waitUntilSlot` can now be used with a slot far in the future ([#1490](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1490)) +- `Unable to convert Slot to POSIXTime` error of `waitUntilSlot` doesn't omit important error details anymore ([#1458](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1458)) +- Performance issues when using Eternl in multi-address mode ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `ConnectToNuFi` now reexported in `Contract.Wallet` ([#1435](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1435)) +- Fix a bug in UTxO selection in `Cip30Mock` (that affected `Cip30Mock` users) ([1437](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1437)) +- Fixed `bundlePursProject` crashing if build output directory exists ([#1438](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1438)) +- Better reporting for WebSocket errors ([#1403](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1403)) +- `Contract.Test.Assert`: handle exceptions coming from callbacks that calculate expected values (in `checkLovelaceDeltaAtAddress`, `checkTokenDeltaAtAddress`, `checkLovelaceDeltaInWallet` and `checkTokenDeltaInWallet`), propagate original error messages correctly ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- Fixed collateral selection - sort the UTxOs by ADA value in descending order, before selecting them for collateral, to ensure that if a combination that satisfies the requirements is possible, it will be selected. The bug affected CIP-30 wallets. ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- Output correct reward address in CIP-30 mock ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- Add a single-slot wait at Plutip startup before attempting to query any wallet UTxOs ([#1470](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1470)) +- Index `Reward` redeemers properly ([#1419](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1419), [#1462](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1462)) +- A problem with collateral selection not respecting `mustNotSpendUtxosWithOutRefs` ([#1509](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1509)) +- A problem with too many change UTxOs being generated ([#1530](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1530)) +- A problem where tx evaluation with additional utxos failed with an Ogmios `AdditionalUtxoOverlap` exception if some additional utxos got confirmed in the meantime ([#1537](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1537)) +- `Contract.PlutusData.redeemerHash` definition ([#1565](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1565)) + +### Removed + +- `mkUnbalancedTxM` and `balanceTxM` + ([#1547](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1547)) +- `E2E_SKIP_JQUERY_DOWNLOAD` configuration variable for [E2E test suite](./doc/e2e-testing.md). It is not needed, because it's expected value can be determined from the environment, and thus it can be an implementation detail ([#1440](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1440)) +- `reindexSpentScriptRedeemers` function from the public API - if there is a need to modify the `Transaction` in a way that breaks redeemer indices, it should be done before balancing ([#1462](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1462)) +- Typed scripts and constraints interface. In practice, it means that the following types now have no type-level arguments: `TxConstraints`, `ScriptLookups`. +- Removed error variants (no more needed) ([#1545](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1545)): + - `ImpossibleError` + - `CannotConvertPaymentPubKeyHash`, `CannotHashMintingPolicy`, `CannotHashValidator` and `CannotHashDatum` variants of `MkUnbalancedTxError` + - `InvalidInContext` + - `CannotGetBigIntFromNumber'` and `CannotGetBigNumFromBigInt'` variants of `PosixTimeToSlotError` + ## [v5.0.0] ### Added @@ -69,7 +268,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - `startPlutipCluster` error message now includes cluster startup failure details. ([#1407](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1407)) - `PlutipTest` is now known as `Contract.Test.ContractTest`. It has been semantically untied from Plutip, because we now have another test runner for tests that rely on particular funds distributions - [Blockfrost](./doc/blockfrost.md). See `Contract.Test.Blockfrost.runContractTestsWithBlockfrost` ([#1260](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1260)) - `Contract.Staking.getPoolParameters` has been moved to `Contract.Backend.Ogmios.getPoolParameters`. This function only runs with Ogmios backend, because Blockfrost [does not provide](https://github.com/blockfrost/blockfrost-backend-ryo/issues/82) all the required values ([#1260](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1260)) -- Use of [CIP-40](https://cips.cardano.org/cips/cip40/) collateral output is now enabled with CIP-30 wallets ([#1260](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1260)). +- Use of [CIP-40](https://cips.cardano.org/cip/CIP-0040/) collateral output is now enabled with CIP-30 wallets ([#1260](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1260)). - `reindexSpentScriptRedeemers` is no longer in Contract (it's pure) ([#1260](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1260)) ### Removed @@ -126,7 +325,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Fixed -- Added missing `stakePoolTargetNum` ("`nOpt`") protocol parameter (see [CIP-9](https://cips.cardano.org/cips/cip9/)) ([#571](https://github.com/Plutonomicon/cardano-transaction-lib/issues/571)) +- Added missing `stakePoolTargetNum` ("`nOpt`") protocol parameter (see [CIP-9](https://cips.cardano.org/cip/CIP-0009)) ([#571](https://github.com/Plutonomicon/cardano-transaction-lib/issues/571)) - CIP-30 `signData` response handling ([#1289](https://github.com/Plutonomicon/cardano-transaction-lib/pull/1289)) ### Runtime Dependencies @@ -281,7 +480,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Constraint for attaching a reference input to a transaction: `mustReferenceOutput` ([#946](https://github.com/Plutonomicon/cardano-transaction-lib/pull/946)) - `DatumPresence` data type, which tags paying constraints that accept datum, to mark whether the datum should be inline or hashed in the transaction output. ([#931](https://github.com/Plutonomicon/cardano-transaction-lib/pull/931)) - Utility conversion functions `serializeData` and `deserializeData` between `PlutusData` and `CborBytes` to `Contract.PlutusData`. ([#1001](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1001)) -- Added [CIP-30](https://cips.cardano.org/cips/cip30/) methods: `getNetworkId`, `getChangeAddress`, `getRewardAddresses`, `getUnusedAddresses`, `signData`, `isWalletAvailable`, `isEnabled`, `apiVersion`, `name` and `icon` to `Contract.Wallet` ([#974](https://github.com/Plutonomicon/cardano-transaction-lib/issues/974)) +- Added [CIP-30](https://cips.cardano.org/cip/CIP-0030) methods: `getNetworkId`, `getChangeAddress`, `getRewardAddresses`, `getUnusedAddresses`, `signData`, `isWalletAvailable`, `isEnabled`, `apiVersion`, `name` and `icon` to `Contract.Wallet` ([#974](https://github.com/Plutonomicon/cardano-transaction-lib/issues/974)) ### Changed diff --git a/Makefile b/Makefile index 7411277c7..5519cd407 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,61 @@ SHELL := bash .ONESHELL: -.PHONY: run-dev run-build check-format format query-testnet-tip clean check-explicit-exports +.PHONY: esbuild-bundle esbuild-serve webpack-bundle webpack-serve check-format format query-testnet-tip clean check-explicit-exports spago-build create-bundle-entrypoint create-html-entrypoint delete-bundle-entrypoint .SHELLFLAGS := -eu -o pipefail -c ps-sources := $(shell fd --no-ignore-parent -epurs) nix-sources := $(shell fd --no-ignore-parent -enix --exclude='spago*') -js-sources := $(shell fd --no-ignore-parent -ejs) -ps-entrypoint := Ctl.Examples.ByUrl # points to one of the example PureScript modules in examples/ -ps-bundle = spago bundle-module -m ${ps-entrypoint} --to output.js +js-sources := $(shell fd --no-ignore-parent -ejs -ecjs) + +### Bundler setup + +# The main Purescript module +ps-entrypoint := Ctl.Examples.ByUrl +# The entry point function in the main PureScript module +ps-entrypoint-function := main +# Whether to bundle for the browser +browser-runtime := 1 # Use "1" for true and "" for false + preview-node-ipc = $(shell docker volume inspect store_node-preview-ipc | jq -r '.[0].Mountpoint') +preprod-node-ipc = $(shell docker volume inspect store_node-preprod-ipc | jq -r '.[0].Mountpoint') +serve-port := 4008 + +spago-build: + @spago build + +create-bundle-entrypoint: + @mkdir -p dist/ + @echo 'import("../output/${ps-entrypoint}/index.js").then(m => m.${ps-entrypoint-function}());' > ./dist/entrypoint.js + +delete-bundle-entrypoint: + @rm -f ./dist/entrypoint.js -run-dev: - @${ps-bundle} && BROWSER_RUNTIME=1 webpack-dev-server --progress +create-html-entrypoint: + @mkdir -p dist/ + @cat << EOF > dist/index.html + + + + + EOF -run-build: - @${ps-bundle} && BROWSER_RUNTIME=1 webpack --mode=production +esbuild-bundle: spago-build create-bundle-entrypoint + @mkdir -p dist/ + BROWSER_RUNTIME=${browser-runtime} node esbuild/bundle.js ./dist/entrypoint.js dist/index.js + @make delete-bundle-entrypoint + +esbuild-serve: spago-build create-bundle-entrypoint create-html-entrypoint + BROWSER_RUNTIME=1 node esbuild/serve.js ./dist/entrypoint.js dist/index.js dist/ ${serve-port} + +webpack-bundle: spago-build create-bundle-entrypoint + BROWSER_RUNTIME=${browser-runtime} webpack --mode=production \ + -o dist/ --env entry=./dist/entrypoint.js + @make delete-bundle-entrypoint + +webpack-serve: spago-build create-bundle-entrypoint create-html-entrypoint + BROWSER_RUNTIME=1 webpack-dev-server --progress \ + --port ${serve-port} \ + -o dist/ --env entry=./dist/entrypoint.js .ONESHELL: check-explicit-exports: @@ -34,8 +75,8 @@ check-whitespace: check-format: check-explicit-exports check-examples-imports check-whitespace @purs-tidy check ${ps-sources} @nixpkgs-fmt --check ${nix-sources} - @prettier --loglevel warn -c ${js-sources} - @eslint --quiet ${js-sources} + @prettier --log-level warn -c ${js-sources} + @eslint --quiet ${js-sources} --parser-options 'sourceType: module' format: @purs-tidy format-in-place ${ps-sources} @@ -50,6 +91,10 @@ query-preview-testnet-tip: CARDANO_NODE_SOCKET_PATH=${preview-node-ipc}/node.socket cardano-cli query tip \ --testnet-magic 2 +query-preprod-testnet-tip: + CARDANO_NODE_SOCKET_PATH=${preprod-node-ipc}/node.socket cardano-cli query tip \ + --testnet-magic 1 + run-ci-actions: nix build -L .#checks.x86_64-linux.formatting-check nix build -L .#checks.x86_64-linux.template-deps-json @@ -61,7 +106,6 @@ run-ci-actions: nix build -L .#checks.x86_64-linux.ctl-staking-test nix build -L .#checks.x86_64-linux.examples-imports-check - clean: @ rm -r .psc-ide-port || true @ rm -rf .psci_modules || true @@ -70,3 +114,4 @@ clean: @ rm -rf .spago2nix || true @ rm -rf node_modules || true @ rm -rf output || true + @ rm -rf dist || true diff --git a/README.md b/README.md index 518e93b81..c2d164a06 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ - [Architecture](#architecture) - [Additional resources/tools:](#additional-resourcestools) - [Available support channels info](#available-support-channels-info) +- [Funding acknowledgements](#funding-acknowledgements) +- [Use in production](#use-in-production) @@ -36,8 +38,11 @@ Please explore our documentation to discover how to use CTL, how to set up its r - [CTL's runtime dependencies](./doc/runtime.md) - [Blockfrost support](./doc/blockfrost.md) - [Getting started writing CTL contracts](./doc/getting-started.md) +- [Managing contract environment](./doc/contract-environment.md) +- [Using CTL from JS](./doc/using-from-js.md) +- [Importing Plutus Scripts](./doc/importing-scripts.md) - [Migrating from Plutus to CTL](./doc/plutus-comparison.md) -- [Testing overview](./doc/testing.md) +- [Overview of testing approaches](./doc/testing.md) - [Testing contracts with Plutip](./doc/plutip-testing.md) - [End-to-end testing with headless browsers](./doc/e2e-testing.md) - [Utilities for testing](./doc/test-utils.md) @@ -45,9 +50,12 @@ Please explore our documentation to discover how to use CTL, how to set up its r - [Transaction balancing](./doc/balancing.md) - [Transaction chaining](./doc/tx-chaining.md) - [Ada staking support](./doc/staking.md) +- [Key management](./doc/key-management.md) - [SECP256k1 support (CIP-49)](./doc/secp256k1-support.md) +- [Custom query layers](./doc/custom-query-layers.md) - [FAQs](./doc/faq.md) - [Feature overview video](./doc/video-intro.md) +- [Comparison with other frameworks (Lucid)](./doc/comparisons.md) - [Development workflows for CTL](./doc/development.md) You can also access [PureScript documentation for CTL and its dependencies](https://plutonomicon.github.io/cardano-transaction-lib/) for the most recent `develop` version, or [generate it yourself](./doc/development.md#generating-ps-documentation). @@ -62,7 +70,7 @@ Support is planned for the following light wallets: - [x] [Lode](https://lodewallet.io/) - [x] [Eternl (formerly CCvault)](https://eternl.io/) - [x] [NuFi](https://nu.fi/) -- [ ] [Lace](https://www.lace.io/) +- [x] [Lace](https://www.lace.io/) - [ ] [Typhon](https://typhonwallet.io/) - [ ] [Yoroi](https://yoroi-wallet.com/) @@ -73,8 +81,8 @@ Support is planned for the following light wallets: - [x] **Stage 3** Once we have a simple working transaction, we will seek to build a Plutus smart contract transaction with datum from scratch - [x] **Stage 4** Once we can construct Plutus smart contract transactions, we will seek to build a library/DSL/interface such that transactions can be built using constraints and lookups - as close as possible to a cut-and-paste solution from Plutus' `Contract` monad code in Haskell (but with no guarantee that code changes are not necessary) - [x] **Stage 4.1** Investigate supporting compatibility with the Vasil hardfork and improvements to our initial `Contract` API -- [ ] **Stage 5** Once we have a basic `Contract`-style API, we will further refine its public interface, expand wallet support (see [below](#light-wallet-support)), expose a test interface (**DONE** - see [here](doc/plutip-testing.md)), provide a more ergonomic JS/TS API, support stake validators (**DONE**), and support CIP workflows on the public testnet (**In progress**) -- [ ] **Stage 6** Once CTL's `Contract` interface has been stabilized, we will add support for even more wallets and attempt to deprecate CTL's currently required Haskell server (**DONE**) +- [x] **Stage 5** Once we have a basic `Contract`-style API, we will further refine its public interface, expand wallet support (see [below](#light-wallet-support)), expose a test interface (**DONE** - see [here](doc/plutip-testing.md)), provide a more ergonomic JS/TS API, support stake validators (**DONE**), and support CIP workflows on the public testnet (**In progress**) +- [x] **Stage 6** Once CTL's `Contract` interface has been stabilized, we will add support for even more wallets and attempt to deprecate CTL's currently required Haskell server (**DONE**) ## Architecture @@ -84,12 +92,10 @@ CTL is directly inspired by the Plutus Application Backend (PAB). Unlike PAB, ho - This is handled by `cardano-serialization-lib`, a Rust library available as WASM 2. How do we query the chain? - This has been solved using Ogmios & Kupo - - We [will support](https://cardano.ideascale.com/c/idea/420791) an alternative [BlockFrost](https://blockfrost.io/) backend as well in the future -3. How do we query for datums (i.e. the datums themselves and not just their hashes)? - - `Kupo` solves this problem -4. How do we get wallet data? + - Thanks to [Catalyst](https://cardano.ideascale.com/c/idea/420791), we now support an alternative [BlockFrost](https://blockfrost.io/) backend as well +3. How do we get wallet data? - This is done via browser-based light wallet integration in the browser based on CIP-30 -5. How closely should we follow Plutus' `Contract` API? +4. How closely should we follow Plutus' `Contract` API? - CTL's `Contract` model is **significantly** less restrictive than Plutus' and allows for arbitrary effects within the `Contract` monad - Certain features cannot be directly translated into Purescript from Haskell due to differences between the two languages - Some of the Plutus conventions do not make sense for us, due to differences between on-chain and off-chain @@ -109,3 +115,26 @@ You can find help, more information and ongoing discusion about the project here - [Plutonomicon Discord](https://discord.gg/JhbexnV9Pc) - #ctl channel at MLabs' Slack + +## Funding acknowledgements + +CTL is being developed by MLabs. The following companies/funds have contributed significant resources to development: + +- [IOHK](https://iohk.io/en/about/) +- [Catalyst Fund8](https://cardano.ideascale.com/c/idea/396607) +- [Catalyst Fund9](https://cardano.ideascale.com/c/idea/420791) +- [Catalyst Fund10](https://cardano.ideascale.com/c/idea/101478) +- [MLabs](https://mlabs.city/) +- [Indigo Protocol](https://indigoprotocol.io/) +- [Equine](https://www.equine.gg/) +- [Liqwid Labs](https://liqwid.finance/) +- [PlayerMint](https://www.playermint.com/) +- Ardana + +## Use in production + +- [Indigo Protocol](https://indigoprotocol.io/) +- [Liqwid](https://liqwid.finance/) +- [Clarity](https://clarity.community/) +- [PlayerMint](https://www.playermint.com/) +- [SingularityNet](https://singularitynet.io/) diff --git a/doc/babbage-features.md b/doc/babbage-features.md index cd123757a..02a32211a 100644 --- a/doc/babbage-features.md +++ b/doc/babbage-features.md @@ -14,7 +14,7 @@ This document is a reference/explainer for the new CTL APIs introduced for Babba ## Reference Inputs -[Reference inputs](https://cips.cardano.org/cips/cip31/#referenceinputs) allow looking at an output without spending it in Plutus scripts. +[Reference inputs](https://cips.cardano.org/cip/CIP-0031#reference-inputs) allow looking at an output without spending it in Plutus scripts. There are two ways to use an input as a reference in the constraints API: @@ -28,7 +28,7 @@ There are two ways to use an input as a reference in the constraints API: ## Reference Scripts -[Reference Scripts](https://developers.cardano.org/docs/governance/cardano-improvement-proposals/cip-0033/) allows the use of scripts without attaching them to the transaction (and using a reference instead). +[Reference Scripts](https://cips.cardano.org/cip/CIP-0033) allows the use of scripts without attaching them to the transaction (and using a reference instead). Reference scripts can be utilized in CTL by first creating a reference point for the script to be used later via `mustPayToScriptWithScriptRef` (or its variants). @@ -40,7 +40,7 @@ Then, `mustSpendScriptOutputUsingScriptRef` (or its variants) can be used to use ## Inline Data -[CIP-32](https://developers.cardano.org/docs/governance/cardano-improvement-proposals/cip-0032/) introduces the inline data feature that allows storing datum values directly in transaction outputs, instead of just the hashes. +[CIP-32](https://cips.cardano.org/cip/CIP-0032) introduces the inline data feature that allows storing datum values directly in transaction outputs, instead of just the hashes. In CTL, alternating between datum storage options can be achieved by specifying a `DatumPresence` value with constraints that accept it, like `mustPayToPubKeyWithDatum`. @@ -48,6 +48,6 @@ In CTL, alternating between datum storage options can be achieved by specifying ## Collateral Output -[CIP-40](https://cips.cardano.org/cips/cip40/) introduces explicit collateral output. On validation failure, previously the entire collateral was consumed. Now, if excess collateral is supplied, even with native assets, the surplus can be returned on validation failure. +[CIP-40](https://cips.cardano.org/cip/CIP-0040) introduces explicit collateral output. On validation failure, previously the entire collateral was consumed. Now, if excess collateral is supplied, even with native assets, the surplus can be returned on validation failure. Collateral output is automatically added to transactions in CTL. To trigger a collateral return, the `mustNotBeValid` constraint should be explicitly specified, otherwise a script error would be detected earlier and the transaction will not be sent. diff --git a/doc/balancing.md b/doc/balancing.md index a78527ea5..961e357a4 100644 --- a/doc/balancing.md +++ b/doc/balancing.md @@ -4,6 +4,8 @@ - [Configuring balancing process](#configuring-balancing-process) - [Balancer constraints](#balancer-constraints) - [Concurrent spending](#concurrent-spending) + - [Balancing a Tx for other wallet](#balancing-a-tx-for-other-wallet) + - [Synchronization](#synchronization) - [Balancing process limitations](#balancing-process-limitations) @@ -16,17 +18,27 @@ Transaction balancing in Cardano is the process of finding a set of inputs and o CTL allows tweaking the default balancer behavior by letting the user impose constraints on the UTxO set that is used in the process (`balanceTxWithConstraints`): -- providing additional UTxOs to use: `mustUseUtxosAtAddresses` / `mustUseUtxosAtAddress` / `mustUseAdditionalUtxos` -- overriding change address: `mustSendChangeToAddress` -- prevent certain UTxOs from being spent: `mustNotSpendUtxosWithOutRefs` / `mustNotSpendUtxoWithOutRef` -- distribute token outputs equally between change UTxOs: `mustGenChangeOutsWithMaxTokenQuantity` +- Using arbitrary address as user's own (for transaction balancing): `mustUseUtxosAtAddresses` / `mustUseUtxosAtAddress` +- Providing additional UTxOs to use: `mustUseAdditionalUtxos` +- Bypassing wallet's collateral selection and selecting collateral UTxOs from a given set: `mustUseCollateralUtxos` +- Overriding change address: `mustSendChangeToAddress` +- Preventing certain UTxOs from being spent: `mustNotSpendUtxosWithOutRefs` / `mustNotSpendUtxoWithOutRef` +- Distributing token outputs equally between change UTxOs: `mustGenChangeOutsWithMaxTokenQuantity` ## Concurrent spending -Attempting to spend UTxOs concurrently leads to some of the transactions being rejected. To ensure that no concurrent spending is happening, CTL uses it's own UTxO locking machinery. `balanceTxs` and `balanceTxsWithConstraints` functions can be used to construct multiple transactions at once, ensuring that the sets of inputs do not intersect. +Attempting to spend UTxOs concurrently leads to some of the transactions being rejected. To ensure that no concurrent spending is happening, CTL uses it's own UTxO locking machinery. `balanceTxs` or `balanceTxsWithConstraints` can be used to construct multiple transactions at once, ensuring that the sets of inputs do not intersect. Obviously, the number of available UTxOs must be greater than the number of transactions. CTL will throw an exception if it's not the case. +## Balancing a Tx for other wallet + +Setting `mustUseUtxosAtAddress`, `mustSendChangeToAddress` and `mustUseCollateralUtxos` at the same time allows to build a transaction without any connection to the current wallet. For example, it's possible to balance it on server-side and send to the user to sign, or balance a Tx on one user's side while leaving fees at the expense of some other user. + +## Synchronization + +Before balancing, CTL tries to synchronize the wallet state with the query layer, i.e. waits until all UTxOs that the wallet returns are visible in the query layer. Thus the situation when the query layer refuses to validate a Tx (either during ex-units evaluation or on Tx submission) is only possible due to a rollback or a synchronization timeout. Please see [our docs for query layer synchronization](./query-layers.md). + ## Balancing process limitations It may be surprising at first, but balancing a transaction on Cardano is generally undecidable. diff --git a/doc/blockfrost.md b/doc/blockfrost.md index 1cfdca254..8239f4fa1 100644 --- a/doc/blockfrost.md +++ b/doc/blockfrost.md @@ -4,14 +4,19 @@ - [Setting up a Blockfrost-powered test suite](#setting-up-a-blockfrost-powered-test-suite) - - [1. Getting an API key](#1-getting-an-api-key) - - [2. Generating private keys](#2-generating-private-keys) - - [3. Funding your address](#3-funding-your-address) - - [4. Setting up a directory for temporary keys](#4-setting-up-a-directory-for-temporary-keys) - - [5. Providing an API endpoint URL](#5-providing-an-api-endpoint-url) - - [6. Setting Tx confirmation delay](#6-setting-tx-confirmation-delay) - - [7. Test suite setup on PureScript side](#7-test-suite-setup-on-purescript-side) + - [Getting an API key](#getting-an-api-key) + - [Generating private keys](#generating-private-keys) + - [Funding your address](#funding-your-address) + - [Setting up a directory for temporary keys](#setting-up-a-directory-for-temporary-keys) + - [Providing an API endpoint URL](#providing-an-api-endpoint-url) + - [Setting Tx confirmation delay](#setting-tx-confirmation-delay) + - [Test suite setup on PureScript side](#test-suite-setup-on-purescript-side) - [Running `Contract`s with Blockfrost](#running-contracts-with-blockfrost) +- [Running Blockfrost locally](#running-blockfrost-locally) + - [Configuration](#configuration) + - [Contract parameters](#contract-parameters) + - [Test suite](#test-suite) + - [Synchronization](#synchronization) - [Limitations](#limitations) - [Performance](#performance) - [Transaction chaining](#transaction-chaining) @@ -28,21 +33,23 @@ For testing, we offer an automated test engine that allows to run any `ContractT ## Setting up a Blockfrost-powered test suite +In this section, we show how to set up a test suite that uses public Blockfrost deployment to run `Contract`s and prints the report nicely using [Mote](https://github.com/garyb/purescript-mote). + Public Blockfrost instances have endpoints for different networks. By default, the test suite is configured to run on `preview`. The configuration is stored in environment variables defined in [`test/blockfrost.env` file](../test/blockfrost.env), or a similar one in your project if it is initialized from the template. Here's how to populate this configuration file to be ready for use: -### 1. Getting an API key +### Getting an API key Go to https://blockfrost.io to generate a new API key and specify it as `BLOCKFROST_API_KEY` in the config. -### 2. Generating private keys +### Generating private keys -Follow https://developers.cardano.org/docs/stake-pool-course/handbook/keys-addresses/ to generate a private payment key (and, optionally, a stake key). +Follow https://developers.cardano.org/docs/stake-pool-course/handbook/keys-addresses/ to generate a private payment key (and, optionally, a stake key). You can use [this script](https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/scripts/generate-keys.sh) for convenience instead of following instructions in this section manually. -It should look like this: +The generated keys should look like this: ```json { @@ -62,7 +69,7 @@ For public testnets, get it from [cardano-configurations repo](https://github.co The common values are 1 for `preprod` and 2 for `preview`. -### 3. Funding your address +### Funding your address Fund your address using the [testnet faucet](https://docs.cardano.org/cardano-testnet/tools/faucet). Make sure you are sending the funds in the correct network. @@ -70,7 +77,7 @@ Point the test suite to your keys by setting `PRIVATE_PAYMENT_KEY_FILE` and `PRI If you are going to use an enterprise address (without a staking credential component), then do not provide the staking key file. The choice of using either type of addresses does not affect anything, because the test suite will be using the address only to distribute funds to other, temporary addresses. -### 4. Setting up a directory for temporary keys +### Setting up a directory for temporary keys During testing, the test engine will move funds around according to the UTxO distribution specifications provided via `Contract.Test.withWallets` calls in the test bodies. It will generate private keys as needed on the fly. The private keys will be stored in a special directory, to prevent loss of funds in case the test suite suddently exits. Set `BACKUP_KEYS_DIR` to an existing directory where you would like the keys to be stored. @@ -78,7 +85,7 @@ In this directory, keys will be stored in subdirs named as addresses that are de Each test run generates fresh keys that will be stored indefinitely, and it's up to the user to decide when to delete the corresponding directories. The reason why the keys are not being disposed of automatically is because there may be some on-chain state uniquely tied to them that the user may not want to lose access to. -### 5. Providing an API endpoint URL +### Providing an API endpoint URL Blockfrost dashboard provides endpoint URLs for your projects. @@ -91,10 +98,10 @@ export BLOCKFROST_SECURE=true # Use HTTPS export BLOCKFROST_PATH="/api/v0" ``` -### 6. Setting Tx confirmation delay +### Setting Tx confirmation delay We introduce an artificial delay after Tx confirmation to ensure that the changes propagate to Blockfrost's query layer. -Blockfrost does not update the query layer state atomically (proxied Ogmios eval-tx endpoint seems to lag behind the DB), and we have no way to query it, so this is the best workaround we can have. +Blockfrost does not update the query layer state atomically (proxied Ogmios eval-tx endpoint [seems to lag behind the DB](https://github.com/blockfrost/blockfrost-backend-ryo/issues/86)), and we have no way to query it, so this is the best workaround we can have. If the tests are failing because the effects of the transaction do not seem to propagate (the symptom is unexpected errors from Ogmios), it is possible to increase the delay by setting the environment variable for the test suite: ```bash @@ -109,24 +116,25 @@ If there's a problem with UTxO set syncrhonization, most commonly Blockfrost ret [TRACE] 2023-02-16T12:26:13.019Z { body: "{\"error\":\"Bad Request\",\"message\":\"\\\"transaction submit error ShelleyTxValidationError ShelleyBasedEraBabbage (ApplyTxError [UtxowFailure (UtxoFailure (FromAlonzoUtxoFail (ValueNotConservedUTxO ... ``` -### 7. Test suite setup on PureScript side +### Test suite setup on PureScript side `executeContractTestsWithBlockfrost` is a helper function that reads all the variables above and takes care of contract environment setup. It accepts a number of arguments: -1. A test spec config, e.g. `Test.Spec.Runner.defaultConfig` - it's probably better to increase the timeout. +1. A test spec config, e.g. `Test.Spec.Runner.defaultConfig` - it's probably better to increase the timeout to 300 seconds or more. 2. A `Contract` config, e.g. `Contract.Config.testnetConfig` -3. An optional CTL runtime config -4. A `ContractTest` suite +3. A `ContractTest` suite -See [this example](../test/Blockfrost/Contract.purs), which can be executed with `npm run blockfrost-test` command. It will automatically load the exported variables from [`test/blockfrost.env`](../test/blockfrost.env). +See [this example](../test/Blockfrost/Contract.purs), which can be executed with `npm run blockfrost-test` command in CTL repo. It will automatically load the exported variables from [`test/blockfrost.env`](../test/blockfrost.env). ## Running `Contract`s with Blockfrost +On production, the environment should be configured on PureScript side (environment variables are not respected). + `mkBlockfrostBackendParams` can be called on a populated `BlockfrostBackendParams` record to create a `QueryBackendParams` value. `backendParams` field of `ContractParams` uses a value of this type. And `ContractParams` can in turn be used with `runContract`. -``` +```purescript type BlockfrostBackendParams = { blockfrostConfig :: ServerConfig , blockfrostApiKey :: Maybe String @@ -136,21 +144,69 @@ type BlockfrostBackendParams = For convenience, use `blockfrostPublicMainnetServerConfig`, `blockfrostPublicPreviewServerConfig` or `blockfrostPublicPreprodServerConfig` for pre-configured `ServerConfig` setups. + +## Running Blockfrost locally + +Blockfrost can be started locally using [blockfrost-backend-ryo](https://github.com/blockfrost/blockfrost-backend-ryo) distribution. It is included in CTL runtime as optional service, use `npm run start-blockfrost-runtime` instead of `npm run start-runtime`. + +The differences between public and run-your-own flavours of Blockfrost are: + +- There's no need to provide an API key +- `/tx/submit` and `/utils/txs/evaluate` endpoints, that are simply proxied to Ogmios on the public instance, [are not provided](https://github.com/blockfrost/blockfrost-backend-ryo/issues/38) within the distribution, so Ogmios should be used for these. + +### Configuration + +#### Contract parameters + +Configuration on PureScript side is the same as above, but `mkSelfHostedBlockfrostBackendParams` should be used, to specify Ogmios and Kupo parameters (only Ogmios will in fact be used). + +`Contract.Config.blockfrostSelfHostedServerConfig` contains default server parameters usable with a locally-deployed Blockfrost instance, together with `defaultOgmiosWsConfig`. + +CTL handles the absence of `submit` and `evaluate` endpoints in self-hosted Blockfrost nicely by setting up own runtime to query Ogmios for these two endpoints when `mkSelfHostedBlockfrostBackendParams` is used. + +#### Test suite + +The Blockfrost test suite can also be configured for local runtime. To let it connect to local Ogmios, these four parameters must be provided: + +```bash +export OGMIOS_PORT=1337 +export OGMIOS_HOST=127.0.0.1 +export OGMIOS_PATH="" +export OGMIOS_SECURE=false +``` + +See [`blockfrost-local.env`](../test/blockfrost-local.env) for a complete example. + +### Synchronization + +`cardano-db-sync` takes 30 minutes or more to synchronize with `preview` network (and many hours with `mainnet`). + +It will print messages like these, so you can estimate the sync progress knowing the latest epoch number: + +``` +db-sync-preview_1 | [db-sync-node:Info:70] [2023-03-06 15:09:27.39 UTC] Starting epoch 38 +db-sync-preview_1 | [db-sync-node:Info:70] [2023-03-06 15:09:27.40 UTC] epochPluginInsertBlockDetails: epoch 37 +``` + ## Limitations ### Performance The main disadvantage of using Blockfrost in comparison with CTL backend is speed of Tx confirmation (see [here](#6-setting-tx-confirmation-delay) for explanation). +Contracts running with local Blockfrost instance are expected to be slightly slower, because transaction propagation takes a bit longer. + ### Transaction chaining -Blockfrost is proxying [Ogmios](https://ogmios.dev) to provide an endpoint for execution units evaluation. This Ogmios endpoint normally [accepts a parameter](https://ogmios.dev/mini-protocols/local-tx-submission/#additional-utxo-set) that allows to specify additional UTxOs that should be considered. Transaction chaining is relying on this feature to allow Ogmios to "see" the newly created UTxOs. But Blockfrost seems to not pass this parameter to Ogmios ([issue](https://github.com/blockfrost/blockfrost-backend-ryo/issues/85)). +Public Blockfrost instance is proxying [Ogmios](https://ogmios.dev) to provide an endpoint for execution units evaluation. This Ogmios endpoint normally [accepts a parameter](https://ogmios.dev/mini-protocols/local-tx-submission/#additional-utxo-set) that allows to specify additional UTxOs that should be considered. Transaction chaining is relying on this feature to allow Ogmios to "see" the newly created UTxOs. But Blockfrost seems to not pass this parameter to Ogmios ([issue](https://github.com/blockfrost/blockfrost-backend-ryo/issues/85)). + +When using self-hosted blockfrost, chaining works normally, because local Ogmios is used without proxying. ### Getting pool parameters -`getPoolParameters` function only runs with Ogmios backend, see [here](https://github.com/blockfrost/blockfrost-backend-ryo/issues/82) for more context. +`getPoolParameters` function only runs with [CTL backend](./runtime.md#ctl-backend) (Ogmios), see [here](https://github.com/blockfrost/blockfrost-backend-ryo/issues/82) for more context. -It is not used for constraints resolution, the only way to make it run is to call it manually. +This function is never used for constraints resolution, the only way to make it run is to call it manually. ## See also diff --git a/doc/cip-25-nfts.md b/doc/cip-25-nfts.md index 411151231..6c1568891 100644 --- a/doc/cip-25-nfts.md +++ b/doc/cip-25-nfts.md @@ -2,6 +2,6 @@ # CIP-25 NFT Metadata standard -CTL includes [CIP-25](https://cips.cardano.org/cips/cip25/) (v2) domain type definitions that enable creation of standard-compliant applications with ease. The definitions abstract away conversions between PlutusData and PureScript types. +CTL includes [CIP-25](https://cips.cardano.org/cip/CIP-0025) (v2) domain type definitions that enable creation of standard-compliant applications with ease. The definitions abstract away conversions between PlutusData and PureScript types. See [`Contract.Metadata`](https://plutonomicon.github.io/cardano-transaction-lib/Contract.Metadata.html#t:Cip25MetadataEntry) module. diff --git a/doc/comparisons.md b/doc/comparisons.md new file mode 100644 index 000000000..0a362e010 --- /dev/null +++ b/doc/comparisons.md @@ -0,0 +1,64 @@ + +

CTL vs. other offchain solutions

+ +This document highlights key differences between CTL and other Cardano offchain frameworks. + + + + +- [Lucid](#lucid) + - [Wallet support](#wallet-support) + - [Query layer differences](#query-layer-differences) + - [Supported backends](#supported-backends) + - [Staking support](#staking-support) + - [Testing](#testing) + - [API design](#api-design) + + + +## Lucid + +### Wallet support + +- Lucid supports any CIP-30 compatible wallet. CTL supports a pre-defined list of wallets (however, the list can be extended easily). +- Both CTL and Lucid support using [seed phrases and private keys](./key-management.md). +- Lucid allows to use any address without a private key for querying - CTL does not allow that, but it's still possible to build transactions for other wallets to sign via [other means](./balancing.md). + +### Query layer differences + +Lucid uses a [`Provider` class](https://deno.land/x/lucid@0.10.5/mod.ts?s=Provider) that defines all available queries. CTL query methods are defined in [`QueryHandle`](https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/src/Internal/Contract/QueryHandle/Type.purs#L36). + +CTL supports the following queries that Lucid does not: + +- `getScriptByHash` +- `getTxMetadata` +- `getChainTip` +- `getCurrentEpoch` +- `evaluateTx` (not needed for Lucid) +- `getEraSummaries` +- `getPoolIds` + +Lucid, on the other hand, provides a way to get a UTxO that contains a specified NFT (`getUtxoByUnit`). + +### Supported backends + +- Both CTL and Lucid support [Blockfrost](./blockfrost.md) and [Kupo+Ogmios](./runtime.md) +- Lucid supports [Maestro](https://www.gomaestro.org/) +- Both CTL and Lucid allow for custom backends - Lucid via `Provider` interface implementation, and CTL via a custom `QueryHandle`. + +### Staking support + +Both [CTL](./staking.md) and [Lucid](https://lucid.spacebudz.io/docs/getting-started/delegate/) support all operations with ADA delegations. + +### Testing + +CTL uses [Plutip](./plutip-testing.md), which is a tool to spawn real Cardano testnets on the fly, while Lucid uses an [emulator](https://lucid.spacebudz.io/docs/getting-started/test-emulate/). + +Additionally, CTL supports [testing with real wallets](./e2e-testing.md) via headless browsers and provides [an assertion library](./test-utils.md). + +### API design + +Lucid aims for simplicity, while CTL allows more fine-grained control over transaction building process. + +- CTL uses [`cardano-serialization-lib`](https://github.com/Emurgo/cardano-serialization-lib/), while Lucid uses a fork of [`cardano-multiplatform-lib`](https://github.com/berry-pool/cardano-multiplatform-lib). Lucid allows to use CML's `TxBuilder` or [call CML directly](https://lucid.spacebudz.io/docs/advanced/cml/), while CTL allows to alter the transaction arbitrarily as PureScript data type either before or after balancing. In CTL, CSL types and method wrappers are a part of the internal interface, but technically they can be used as well. +- Plutus Data conversion is handled via a [schema-enabled API](https://lucid.spacebudz.io/docs/advanced/type-casting/) in Lucid. CTL allows for automatic `ToData` / `FromData` deriving for some types, via `HasPlutusSchema`. diff --git a/doc/contract-environment.md b/doc/contract-environment.md new file mode 100644 index 000000000..3c549e351 --- /dev/null +++ b/doc/contract-environment.md @@ -0,0 +1,76 @@ + + + +- [`Contract` environment](#contract-environment) + - [`ContractEnv` management](#contractenv-management) + - [Following the bracket pattern](#following-the-bracket-pattern) + - [Manually passing the environment](#manually-passing-the-environment) + - [See also](#see-also) + + + +# `Contract` environment + +CTL environment (`ContractEnv` type) consists of: + +- various settings +- network protocol parameters (fetched once on initialization) +- active Ogmios `WebSocket` (optional) +- CIP-30 wallet connection (optional) +- internal state used by [synchronization primitives](./query-layers.md) + +## `ContractEnv` management + +Initialization is a costly operation, and having multiple distinct runtimes may lead to problems with state synchronization and excessive `WebSocket` use, so it is recommended to use only one runtime at any point in time. + +If only one `Contract` is ever executed, just using `runContract` is perfectly fine. Otherwise, there are two better approaches: + +### Following the bracket pattern + +[Bracket pattern](https://wiki.haskell.org/Bracket_pattern) in functional programming world is commonly used to safely manage resources. In our case, `withContractEnv` should be used to initialize and finalize a `ContractEnv`. `runContractEnv` should be used to run a `Contract` within the environment: + +```purescript +withContractEnv :: forall (a :: Type). ContractParams -> (ContractEnv -> Aff a) -> Aff a +runContractInEnv :: forall (a :: Type). ContractEnv -> Contract a -> Aff a + +myContract1 :: Contract Uni +myContract2 :: Contract Uni + +myRunner :: ContractParams -> Aff Unit +myRunner params = withContractEnv params \env -> do + runContractInEnv env myContract1 + runContractInEnv env myContract2 +``` + +Using bracket functions is safe, but is not always convenient, because `withContractEnv` callback must hold the `Aff` context until all `Contract`s exit. + +### Manually passing the environment + +Another approach is using `mkContractEnv` coupled with `runContractInEnv` and `stopContractEnv`. + +Here's an example: + +```purescript +mkContractEnv :: ContractParams -> Aff ContractEnv +stopContractEnv :: ContractEnv -> Aff Unit + +myContract1 :: Contract Uni +myContract2 :: Contract Uni + +myRunner :: ContractParams -> Aff Unit +myRunner params = do + env <- mkContractEnv + void $ try do + runContractInEnv env myContract1 + runContractInEnv env myContract2 + stopContractEnv env +``` + +This approach is less safe in general, and it's fairly easy to hit the max WebSocket connections limit (which is 200 for Firefox) due to a forgotten `stopContractEnv` call (e.g. due to an exception), not to mention that any websocket that is not closed will force the server to also keep the connection. + +This approach, however, is better suited for use when creating [custom JavaScript SDKs](./using-from-js.md). + +## See also + +- [Using CTL from JS](./using-from-js.md) +- [CTL runtime](./runtime.md) diff --git a/doc/ctl-as-dependency.md b/doc/ctl-as-dependency.md index 679468569..0be2285ae 100644 --- a/doc/ctl-as-dependency.md +++ b/doc/ctl-as-dependency.md @@ -9,9 +9,7 @@ CTL can be imported as an additional dependency into a Purescript project built - [Caveats](#caveats) - [Using CTL's overlays](#using-ctls-overlays) - [Upgrading CTL](#upgrading-ctl) -- [Using CTL from JS](#using-ctl-from-js) - - [Bundling](#bundling) - - [Wrapping CTL into a JS interface](#wrapping-ctl-into-a-js-interface) +- [See also](#see-also) @@ -26,7 +24,7 @@ The following caveats alway applies when using CTL from your project: CTL exposes two `overlay`s from its flake. You can use these in the Nix setup of your own project to use the same setup as we do, e.g. the same packages and PS builders: -- `overlays.purescript` contains Purescript builders to compile Purescript sources, build bundles with Webpack (`bundlePursProject`), run unit tests using NodeJS (`runPursTest`), run CTL contracts on a private testnet using Plutip (`runPlutipTest`), or build Pursuit documentation (`buildSearchablePursDocs` and `launchSearchablePursDocs`) +- `overlays.purescript` contains Purescript builders to compile Purescript sources, build bundles with Webpack (`bundlePursProject`), run unit tests using NodeJS (`runPursTest`), and run CTL contracts on a private testnet using Plutip (`runPlutipTest`). - `overlays.runtime` contains various packages and other tools used in CTL's runtime, including `ogmios`, `kupo`, and `plutip-server`. It also defines `buildCtlRuntime` and `launchCtlRuntime` to help you quickly launch all runtime services (see the [runtime docs](./runtime.md)) We've split the overlays into two components to allow users to more easily choose which parts of CTL's Nix infrastructure they would like to directly consume. For example, some users do not require a pre-packaged runtime and would prefer to build it themselves with more control over its components (e.g. by directly using `ogmios` from their own `inputs`). Such users might still like to use our `purescript` overlay -- splitting the `overlays` allows us to support this. `overlays.runtime` also contains several haskell.nix packages which may cause issues with `hackage.nix` versions in your own project. @@ -86,35 +84,8 @@ Make sure to perform **all** of the following steps, otherwise you **will** enco - Sometimes the WebPack configuration also comes with breaking changes. Common source of problems are changes to `resolve.fallback`, `plugins` and `experiments` fields of the WebPack config. Use `git diff old-revision new-revision webpack.config.js` in the root of a cloned CTL repo, or use `git blame`. -## Using CTL from JS +## See also -### Bundling - -The recommended way to bundle CTL is to use WebPack. - -We depend on WebPack's `DefinePlugin` to conditionally load one of our dependency (`cardano-serialization-lib`) nodejs or browser version. - -That means that CTL _requires_ bundling it the same way when used as a dependency, as we do in development. If you intend to use another bundler, something like `DefinePlugin` should be used to transform the imports from - -```javascript -let lib; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); -} else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); -} -``` - -to only one of the variants. - -Our default [WebPack config](../webpack.config.js) uses `BROWSER_RUNTIME` environment variable to differentiate between two bundling options. - -The reason why we are tied to WebPack is that it is one of the few bundlers that support async WASM imports. - -There's [a claim that Vite bundler can also be used](https://github.com/Plutonomicon/cardano-transaction-lib/issues/79#issuecomment-1257036068), although we don't officially support this method. - -### Wrapping CTL into a JS interface - -Some users may want to provide a small set of APIs behind a JS/TS interface, instead of dealing with PureScript code. - -There's nothing specific to be done for CTL (it's a normal PureScript project), so [this PureScript guide](https://book.purescript.org/chapter10.html#calling-purescript-from-javascript) may be of help. Note that our PureScript version is using CommonJS modules and not ES modules. +- [How to use CTL-based apps from JS](./using-from-js.md) +- [Managing Contract environment correctly](./contract-environment.md) +- [Alternative setup with purs-nix instead of spago2nix](https://github.com/LovelaceAcademy/cardano-transaction-lib/tree/develop/templates/la-scaffold) diff --git a/doc/custom-query-layers.md b/doc/custom-query-layers.md new file mode 100644 index 000000000..757373f0a --- /dev/null +++ b/doc/custom-query-layers.md @@ -0,0 +1,48 @@ + + + +- [Custom query layers in CTL](#custom-query-layers-in-ctl) + - [Adding a new backend](#adding-a-new-backend) + - [Replacing some queries in existing backend](#replacing-some-queries-in-existing-backend) +- [Configuring CTL's default query layer (Kupo/Ogmios)](#configuring-ctls-default-query-layer-kupoogmios) + - [Kupo](#kupo) + - [Faster sync for Kupo](#faster-sync-for-kupo) + + + +# Custom query layers in CTL + +## Adding a new backend + +CTL can be extended with custom (user) query layers if needed. At this moment it can be done by forking. + +Every query CTL uses, except of backend-specific ones, goes through a [query handle](https://github.com/Plutonomicon/cardano-transaction-lib/blob/10a88faa2e6237aafc90568e3488f3421517af63/src/Internal/Contract/QueryHandle/Type.purs#L36). + +A new [backend option](https://github.com/Plutonomicon/cardano-transaction-lib/blob/10a88faa2e6237aafc90568e3488f3421517af63/src/Internal/Contract/QueryBackend.purs#L57) should be added, with corresponding [initialization code](https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/src/Internal/Contract/QueryHandle.purs) + +## Replacing some queries in existing backend + +Substituting the query layer for a few functions only (assuming the original backend remains available for initial connection) can be done without forking CTL. + +`ContractEnv` contains a QueryHandle (inside a `Reader`), so a [`local`](https://pursuit.purescript.org/packages/purescript-transformers/6.0.0/docs/Control.Monad.Reader.Class#v:local) call with a function that replaces some `QueryHandle` record entries will just work. + +# Configuring CTL's default query layer (Kupo/Ogmios) + +Optimising storage requirements and performance of the query layer, unfortunately, depends on your app query needs. + +## Kupo + +Kupo is used for "utxos-at-address" query in CTL. + +This query is mainly used in two contexts: + +- manual `utxosAt` calls +- wallet <-> backend synchronization (see [here](./query-layers.md)) + +If you don't need either, consider removing Kupo from the runtime and [disabling wallet <-> backend synchronization](./query-layers.md) (**IMPORTANT!**). + +If your app works in a way that only requires UTxO lookups on certain addresses (e.g. script addresses), consider using [`--match-pattern`](https://cardanosolutions.github.io/kupo/#section/Getting-started/-match-pattern) to drastically reduce DB size. The downside would be that wallet<->backend sync will have to be disabled, because it requires looking up wallet's addresses via the backend. + +### Faster sync for Kupo + +Use [`--since` flag](https://cardanosolutions.github.io/kupo/#section/Getting-started/-since-slot-no.header_hash) to perform partial incomplete sync. Find block parameters on [a block explorer](https://cexplorer.io/block). It will let you sync things faster (than in ~4 days for mainnet), for the price of Kupo not seeing UTxOs created after the specified slot. If you disable wallet<->backend sync, and depending on your use case, that might be acceptable for production. diff --git a/doc/development.md b/doc/development.md index c5269d178..8928d5c6a 100644 --- a/doc/development.md +++ b/doc/development.md @@ -9,7 +9,13 @@ This document outlines development workflows for CTL itself. You may also wish t - [Nix environment](#nix-environment) - [Launching services for development](#launching-services-for-development) -- [Building, testing, and running the PS project](#building-testing-and-running-the-ps-project) +- [Workflows](#workflows) + - [Building](#building) + - [Testing](#testing) + - [With NodeJS](#with-nodejs) + - [With Nix](#with-nix) + - [Nix checks](#nix-checks) + - [Bundling for the browser](#bundling-for-the-browser) - [Generating PS documentation](#generating-ps-documentation) - [Adding PS/JS dependencies](#adding-psjs-dependencies) - [Purescript](#purescript) @@ -45,35 +51,65 @@ Running `nix develop` in the root of the repository will place you in a developm To develop locally, you can use one the CTL flake to launch all required services (using default configuration values): -- The easiest way: `nix run -L .#ctl-runtime` will both build and run the services +- The easiest way: `npm run start-runtime` will both build and run the services - The same, but indirectly in your shell: ``` $ nix build -L .#ctl-runtime $ arion --prebuilt-file ./result up ``` -## Building, testing, and running the PS project - -- To build the project **without bundling and for a NodeJS environment**: - - `nix build` _or_ - - `spago build` -- To test the project, currently only supported when running in a NodeJS environment: - - Use `npm run test`, or, if you need to test some specific functionality: - - `npm run unit-test` for unit tests - - `npm run integration-test` for integration tests (requires ctl-runtime running) - - `npm run plutip-test` for Plutip integration tests (does not require ctl-runtime) - - `nix build .#checks..ctl-unit-test` will build and run the unit tests (useful for CI) -- To run or build/bundle the project for the browser: - - `npm run e2e-serve` will start a Webpack development server at `localhost:4008` - - `npm run build` will output a Webpack-bundled example module to `dist` (or `nix build -L .#ctl-example-bundle-web` to build an example module using Nix into `./result/`) +## Workflows + +### Building + +To **build** the project **without bundling and for a NodeJS environment**: + +- `nix build` _or_ +- `spago build` + +### Testing + +#### With NodeJS + +- `npm run unit-test` for unit tests (no need for a runtime) - [entry point](../test/Unit.purs) +- `npm run integration-test` for integration tests (requires a [runtime](./runtime.md#ctl-backend)) - [entry point](../test/Integration.purs) +- `npm run plutip-test` for Plutip integration tests (does not require a runtime) - [entry point](../test/Plutip.purs) +- `npm run staking-test` to run [Plutip](./plutip-testing.md)-powered tests for ADA staking functionality - [entry point](../test/Plutip/Staking.purs) +- `npm run blockfrost-test` for [Blockfrost-powered tests](./blockfrost.md) (does not require a runtime, but needs [some setup](./blockfrost.md#setting-up-a-blockfrost-powered-test-suite)) - [entry point](../test/Blockfrost/Contract.purs) +- `npm run blockfrost-local-test` for self-hosted [Blockfrost-powered tests](./blockfrost.md) (requires a [local Blockfrost runtime](./blockfrost.md#running-blockfrost-locally)) - [entry point](../test/Blockfrost/Contract.purs) +- `npm run e2e-test` for [tests with a headless browser](./e2e-testing.md) (requires a runtime and the tests served via HTTP: `npm run start-runtime` and `npm run webpack-serve` or `esbuild-serve`) + +#### With Nix + +Here and below, `` should be replaced with [one of the supported systems](https://github.com/Plutonomicon/cardano-transaction-lib/blob/15fd9c5b683df47134dce4a0479f1edc30d4b6f7/flake.nix#L51) that you use, e.g. `x86_64-linux`. + +- Unit tests: `nix build .#checks..ctl-unit-test` +- [E2E tests in Nix with wallet mocks](./e2e-testing.md#using-cip-30-mock-with-plutip): `nix build -L .#checks..ctl-e2e-test` +- Contract tests ([Plutip](./plutip-testing.md)): `nix build -L .#checks..ctl-plutip-test` +- [Staking](./staking.md) tests ([Plutip](./plutip-testing.md)): `nix build -L .#checks..ctl-staking-test` + +#### Nix checks + +- Check formatting: `nix build -L .#checks..formatting-check` +- Check correctness of `package.json` dependencies in template: `nix build -L .#checks..template-deps-json` +- Check correctness of Spago dependencies in template: `nix build -L .#checks..template-dhall-diff` +- Check that CTL revisions match in Spago package set and Nix in template: `nix build -L .#checks..template-version` +- Check that examples don't use internal modules: `nix build -L .#checks..examples-imports-check` + +### Bundling for the browser + +To run or build/bundle the project for the browser: + +- `npm run webpack-serve` will start a Webpack development server at `localhost:4008`, which is required for [E2E tests](./e2e-testing.md) +- `npm run {webpack|esbuild}-bundle` will output a bundled example module to `dist` (or `nix build -L .#ctl-example-bundle-web-{webpack|esbuild}` to build an example module using Nix into `./result/`) By default, Webpack will build a [Purescript module](../examples/ByUrl.purs) that serves multiple example `Contract`s depending on URL (see [here](./e2e-testing.md#serving-the-contract-to-be-tested)). You can point Webpack to another Purescript entrypoint by changing the `ps-bundle` variable in the Makefile or in the `main` argument in the flake's `packages.ctl-examples-bundle-web`. -You will also need a light wallet extension pre-configured. +You will also need a light wallet extension pre-configured to run a `Contract`. -**Note**: The `BROWSER_RUNTIME` environment variable must be set to `1` in order to build/bundle the project properly for the browser (e.g. `BROWSER_RUNTIME=1 webpack ...`). For Node environments, leave this variable unset or set it to `0`. +**Note**: The `BROWSER_RUNTIME` environment variable must be set to `1` in order to build/bundle the project properly for the browser (e.g. `BROWSER_RUNTIME=1 webpack ...`). For Node environments, leave this variable unset. -**Note**: The `KUPO_HOST` environment variable must be set the base URL of the Kupo service in order to successfully run the project for the browser (e.g. `KUPO_HOST=http://localhost:1442`), otherwise all requests to Kupo will fail. +**Note**: The `KUPO_HOST` environment variable must be set to the base URL of the Kupo service in order to successfully serve the project for the browser (by default, `KUPO_HOST=http://localhost:1442`). ## Generating PS documentation diff --git a/doc/e2e-testing.md b/doc/e2e-testing.md index c9303b8dc..402388558 100644 --- a/doc/e2e-testing.md +++ b/doc/e2e-testing.md @@ -51,9 +51,9 @@ For a working example see `test/E2E.purs`. It can be run conveniently using `npm The process is as follows: -1. run `npm run e2e-serve` in one shell -2. run `nix run -L .#ctl-runtime` in another shell -3. run `npm run e2e-test` in the third shell +1. run `npm run e2e-serve` in Nix shell (enter `nix develop`) +2. run `npm run start-runtime` in another shell (can be outside of `nix develop` shell) +3. run `npm run e2e-test` in second Nix shell (enter `nix develop`) ## How Wallets are Used @@ -116,7 +116,6 @@ The tests can set up using CLI arguments, environment variables, or both. CLI ar | URL of settings archive asset | `--settings-archive-url` | `E2E_SETTINGS_ARCHIVE_URL` | | Path to the user data directory | `--chrome-user-data` | `E2E_CHROME_USER_DATA` | | Extra browser CLI arguments | `--extra-browser-args` | `E2E_EXTRA_BROWSER_ARGS` | -| Skip downloading jQuery (allows to run E2E+Plutip tests fully offline) | `--skip-jquery-download` | `E2E_SKIP_JQUERY_DOWNLOAD` | |------------------------------------------------------------------------|-----------------------------|----------------------------| | Eternl CRX URL | `--eternl-crx-url` | `ETERNL_CRX_URL` | | Eternl CRX file | `--eternl-crx` | `ETERNL_CRX` | @@ -215,7 +214,7 @@ Note that the test closes successfully after the first successful `Contract` exe CTL offers a function to serve the `Contract`s to be tested with a router, that dispatches contracts and configuration parameters based on query part of the URL. -It also builds a page with a table consisting of links to all possible examples with all possible environments, that looks like this: +It also builds a page with drop-downs, allowing to select an example and an environments, that looks like this: ![Headless browser test suite - served examples](./images/e2e.png) diff --git a/doc/faq.md b/doc/faq.md index 7952665a4..e92226e6d 100644 --- a/doc/faq.md +++ b/doc/faq.md @@ -9,6 +9,9 @@ This document lists common problems encountered by CTL users and developers. - [Bundling-related](#bundling-related) - [Q: `lib.something` is not a function, why?](#q-libsomething-is-not-a-function-why) - [Q: I see `spago: Error: Remote host not found`, why?](#q-i-see-spago-error-remote-host-not-found-why) + - [Q: I see `WebAssembly module is included in initial chunk.` error, why?](#q-i-see-webassembly-module-is-included-in-initial-chunk-error-why) + - [Q: I see `Cannot use 'import.meta' outside a module` error in the browser, why?](#q-i-see-cannot-use-importmeta-outside-a-module-error-in-the-browser-why) + - [Q: I see `Module not found: Error: Can't resolve 'utf-8-validate'` error when bundling, why?](#q-i-see-module-not-found-error-cant-resolve-utf-8-validate-error-when-bundling-why) - [Common Contract execution problems](#common-contract-execution-problems) - [Q: What are the common reasons behind BalanceInsufficientError?](#q-what-are-the-common-reasons-behind-balanceinsufficienterror) - [Q: CTL consumed my collateral](#q-ctl-consumed-my-collateral) @@ -21,6 +24,7 @@ This document lists common problems encountered by CTL users and developers. - [Environment-related](#environment-related) - [Q: I use wayland, the E2E browser fails on startup](#q-i-use-wayland-the-e2e-browser-fails-on-startup) - [Q: How to keep the number of WebSocket connections to a minimum?](#q-how-to-keep-the-number-of-websocket-connections-to-a-minimum) + - [Package 'chromium-105.0.5195.125' is not supported on 'x86_64-darwin'](#package-chromium-10505195125-is-not-supported-on-x86_64-darwin) - [Miscellaneous](#miscellaneous) - [Q: Why am I getting `Error: (AtKey "coinsPerUtxoByte" MissingValue)`?](#q-why-am-i-getting-error-atkey-coinsperutxobyte-missingvalue) - [Q: Why do I get an error from `foreign.js` when running Plutip tests locally?](#q-why-do-i-get-an-error-from-foreignjs-when-running-plutip-tests-locally) @@ -48,6 +52,20 @@ URL: https://github.com/purescript/package-sets/releases/download/psc-0.14.5-202 means that the CTL overlay hasn't been properly applied. Add `ctl.overlays.spago`. +### Q: I see `WebAssembly module is included in initial chunk.` error, why? + +You may be trying to use `require` instead of `import` in the app entry point, see [here](./using-from-js.md). + +### Q: I see `Cannot use 'import.meta' outside a module` error in the browser, why? + +`type="module"` is required in the HTML script import, see [here](./using-from-js.md). + +Other possible cause may be that you are trying to run a browser-targeted bundle in NodeJS. + +### Q: I see `Module not found: Error: Can't resolve 'utf-8-validate'` error when bundling, why? + +You probably forgot to set `BROWSER_RUNTIME=1` for the `webpack` command, see [here](./using-from-js.md). + ## Common Contract execution problems ### Q: What are the common reasons behind BalanceInsufficientError? @@ -72,7 +90,9 @@ To do anything time-related, it's best to rely on local node chain tip time, ins ### Q: Time/slot conversion functions return `Nothing`. Why is that? -Time/slot conversion functions depend on `eraSummaries` [Ogmios local state query](https://ogmios.dev/mini-protocols/local-state-query/), that returns era bounds and slotting parameters details, required for proper slot arithmetic. The most common source of the problem is that Ogmios does not return enough epochs into the future. +Time/slot conversion functions depend on `eraSummaries` [Ogmios local state query](https://ogmios.dev/mini-protocols/local-state-query/), that returns era bounds and slotting parameters details, required for proper slot arithmetic. The most common source of the problem is that Ogmios does not return enough epochs into the future. [A possible symptom](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1057) is `CannotFindTimeInEraSummaries` in the error message. + +When using Plutip, a solution may be [to increase the `epochSize` parameter](https://github.com/Plutonomicon/cardano-transaction-lib/issues/1057#issuecomment-1450692539). ### Q: I'm getting `Uncomputable slot arithmetic; transaction's validity bounds go beyond the foreseeable end of the current era: PastHorizon` @@ -127,7 +147,13 @@ If you are under wayland you need to add `--ozone-platform=wayland` to the argum Use only one `ContractEnv` value. They are implicitly created every time `runContract` is called, so avoid using this function if you need to run multiple `Contract`s. -Instead, initialize the environment with `withContractEnv` and pass it to `runContractInEnv`. The former ensures that the environment is properly finalized, but it forces the developer to follow the bracket pattern, which is not always convenient. As an alternative, `mkContractEnv` can be used. If you are initializing a contract environment with `mkContractEnv` only once during the lifeteime of your app, you should be fine, but if you re-create it dynamically and do not finalize it with `stopContractEnv`, it's fairly easy to hit the max websocket connections limit, which is 200 for Firefox, not to mention that it would be forcing the server to keep the connections. +See [here](./contract-environment.md) for more info. + +### Package 'chromium-105.0.5195.125' is not supported on 'x86_64-darwin' + +Chromium is used in [E2E test suite](./e2e-testing.md). Chromium is pinned in nix shell by default, because system versions of chromium may be affected by [this bug](https://bugs.chromium.org/p/chromium/issues/detail?id=706008#c39) + +To disable, set `withChromium` to `false` in [`purescriptProject`'s `shell` argument](https://github.com/Plutonomicon/cardano-transaction-lib/blob/946818b72e3ac1321feebe2944ca2986da2ddc01/templates/ctl-scaffold/flake.nix#L96). ## Miscellaneous diff --git a/doc/getting-started.md b/doc/getting-started.md index 94c858e77..f758fa847 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -38,6 +38,8 @@ Then, add `https://public-plutonomicon.cachix.org` and `public-plutonomicon.cach The easiest way to create a new CTL project is to use our `ctl-scaffold` flake template. This lives in the CTL repo -- you can have a look [here](../templates/ctl-scaffold). It contains a simple, yet complete, flakes-based scaffolding project with example `outputs` for a CTL project, including its runtime. +Alternatively, consider [the-plutus-scaffold](https://github.com/mlabs-haskell/the-plutus-scaffold) flake template. It's a scaffold built on top of the above mentioned `ctl-scaffold`, but includes a react based frontend and a haskell onchain additionaly. It's more of a demo application, than a minimal working example. + A new project can be initialized as follows: ``` @@ -117,11 +119,11 @@ main = Contract.Monad.launchAff_ do ### Making the `ContractEnv` -The `ContractEnv` type contains configuration values and websocket connections that are required to execute contracts written in CTL. The users should not construct it directly - `Contract.Config.ContractParams` should be used instead. +The `ContractEnv` type contains data that is required to execute contracts written in CTL. The users should not construct it directly - `Contract.Config.ContractParams` should be used instead. For local development and testing, we provide `Contract.Config.testnetConfig` where all `CtlBackend` service hosts are set to `localhost` and the `logLevel` is set to `Trace`. -It is **not recommended to directly construct or manipulate a `ContractEnv` yourself** as the process of making a new config initializes websockets. Instead, use `Contract.Monad.ContractParams` with `runContract`. +It is **not recommended to directly construct or manipulate a `ContractEnv` yourself** as the process of making a new config initializes websockets. Instead, use `Contract.Monad.ContractParams` with `runContract` or its variants. A special `Contract.Config.WalletSpec` type is used to specify which wallet to use during the `Contract` lifetime. @@ -217,15 +219,9 @@ You can import your scripts to use with CTL. See [importing-scripts](./importing ### Without a light wallet -We provide `KeyWallet` to enable testing outside of the browser, or in-browser without a light wallet installed. To generate a key, you can use `cardano-cli` as follows: - -```shell -$ cardano-cli address key-gen --normal-key --signing-key-file payment.skey --verification-key-file payment.vkey -``` - -The signing key can be loaded to CTL using `WalletSpec`'s `UseKeys` constructor. See [`examples/KeyWallet/Internal/Pkh2PkhContract.purs`](../examples/KeyWallet/Internal/Pkh2PkhContract.purs#L49). +We provide `KeyWallet` to enable testing outside of the browser, or in-browser without a light wallet installed. -From here you can submit transactions that will be signed with your private key, or perhaps export transactions to be tested with external tools such as [`plutip` testing tool](https://github.com/mlabs-haskell/plutip). +See [here](./key-management.md) ### With a light wallet diff --git a/doc/images/e2e.png b/doc/images/e2e.png index 7af557e9d..178768b5f 100644 Binary files a/doc/images/e2e.png and b/doc/images/e2e.png differ diff --git a/doc/images/eternl-utxo-locking.png b/doc/images/eternl-utxo-locking.png new file mode 100644 index 000000000..25fa6f454 Binary files /dev/null and b/doc/images/eternl-utxo-locking.png differ diff --git a/doc/importing-scripts.md b/doc/importing-scripts.md index be7705eb9..0e44ae237 100644 --- a/doc/importing-scripts.md +++ b/doc/importing-scripts.md @@ -4,12 +4,46 @@ +- [Exporting scripts from Plutus or Plutarch](#exporting-scripts-from-plutus-or-plutarch) + - [Using Plutonomy](#using-plutonomy) - [Importing serialized scripts](#importing-serialized-scripts) - [Serializing Plutus scripts](#serializing-plutus-scripts) - [PlutusTx](#plutustx) - [Plutarch](#plutarch) + - [plutarch-ctl-bridge](#plutarch-ctl-bridge) + +## Exporting scripts from Plutus or Plutarch + +Usually projects use a Haskell binary called *exporter* that outputs a pre-compiler UPLC bundle into a file. + +The output file should be a Cardano envelope: + +```json +{ + "cborHex": "4e4d01000033222220051200120011", + "description": "always-succeeds", + "type": "PlutusScriptV2" +} +``` + +- An example of a Plutus exporter can be found [here](https://github.com/Mr-Andersen/ctl-multisign-mre/blob/main/onchain/exporter/Main.hs). +- For Plutarch, see [the-plutus-scaffold](https://github.com/mlabs-haskell/the-plutus-scaffold)'s [exporter](https://github.com/mlabs-haskell/the-plutus-scaffold/tree/main/onchain/exporter). + + +### Using Plutonomy + +It makes sense to use [Plutonomy](https://github.com/well-typed/plutonomy) (an optimizer for UPLC) in the exporter: + +```haskell +import Plutonomy (aggressiveOptimizerOptions, optimizeUPLCWith) + +script :: Script +script = fromCompiledCode $ + optimizeUPLCWith aggressiveOptimizerOptions $$(PlutusTx.compile [||policy||]) +``` + ## Importing serialized scripts To use your own scripts, compile them to any subdirectory in the root of your project (where `webpack.config.js` is located) and add a relative path to `webpack.config.js` under the `resolve.alias` section. In CTL, we have the `Scripts` alias for this purpose. Note the capitalization of `Scripts`: it is necessary to disambiguate it from local folders. @@ -137,4 +171,8 @@ Note that we specified plutus version. ### Plutarch -You can use [`ply`](https://github.com/mlabs-haskell/ply). +You can use [`ply`](https://github.com/mlabs-haskell/ply) and [`ply-ctl`](https://github.com/mlabs-haskell/ply-ctl). + +### plutarch-ctl-bridge + +You can use [`plutarch-ctl-bridge`](https://github.com/mlabs-haskell/plutarch-ctl-bridge) to generate Purescript types from your Haskell type definitions and typed script wrappers from parametrized Plutarch scripts. See [example module](https://github.com/mlabs-haskell/plutarch-ctl-bridge/blob/main/example/Main.hs). diff --git a/doc/key-management.md b/doc/key-management.md new file mode 100644 index 000000000..f4635b65c --- /dev/null +++ b/doc/key-management.md @@ -0,0 +1,81 @@ + + + +- [Key Management](#key-management) + - [`KeyWallet` in CTL](#keywallet-in-ctl) + - [Loading private keys as `KeyWallet`s](#loading-private-keys-as-keywallets) + - [From `cardano-cli`-compatible JSON envelopes](#from-cardano-cli-compatible-json-envelopes) + - [From CIP1852 mnemonics](#from-cip1852-mnemonics) + + + +# Key Management + +The process of going from private key menmonic to a set of addresses that the wallet can use is well specified in [CIP-1852](https://cips.cardano.org/cip/CIP-1852). + +For an address to be built, the user must provide some entropy for private key derivation and a *derivation path*, that specifies a list of cryptographic operations to perform on the "parent" or "root" key to get the "child" private key that can be used for signing. + +The derivation path is a list of numbers, commonly written separated by `/` prefixed with `m`: + +``` +m + / purpose' (always 1852) + / coin_type' (always 1815) + / accountIndex' + / role (specified in CIP-1852) + / addressIndex +``` + +`'` indicates *hardened* flag presence for the derivation function, which is a specific cryptographic feature that ensures that leaking the "child" key will not compromise the "parent". + +`Role` is determined by the algorithm (different constants are used for payment, change and stake keys). + +Effectively, `accountIndex` and `addressIndex` fully determine the address. + +Note that within an account, the same stake key is used for all the addresses, thus making it trivial to track the movement of funds. This is done to simplify staking (one shared staking key controls all the funds on different payment addresses). + +Most of the wallets are in "single address mode", which means that they will use only address index of 0. They may allow to use multiple accounts. Eternl is the only exception, that lets users create both multiple accounts and multiple addresses within an account. + +## `KeyWallet` in CTL + +CTL supports a special kind of wallet called `KeyWallet` - it wraps one or two private keys (stake key is optional) and can be used to sign transactions. `KeyWallet` is always in single-address mode, but it is possible to derive multiple `KeyWallet`s from menmonics using CTL. + +## Loading private keys as `KeyWallet`s + +### From `cardano-cli`-compatible JSON envelopes + +[This guide](https://developers.cardano.org/docs/stake-pool-course/handbook/keys-addresses/) describes how to generate private keys using cardano-cli. + +The signing key can be loaded to CTL using `WalletSpec`'s `UseKeys` constructor - either by providing a file or the private key itself. See [`examples/KeyWallet/Internal/Pkh2PkhContract.purs`](../examples/KeyWallet/Internal/Pkh2PkhContract.purs#L49). + +### From CIP1852 mnemonics + +A mnemonic is represented as a 12- or 24-word phare encoding private entropy from which the key is derived. + +It can be converted to a `KeyWallet` given a derivation path and a config option that specifies whether to include a staking part of the address: + +```purescript +type Cip1852DerivationPath = + { accountIndex :: UInt + , addressIndex :: UInt + } + +data StakeKeyPresence = WithStakeKey | WithoutStakeKey + +Contract.Wallet.Key.mkKeyWalletFromMnemonic + :: String -> Cip1852DerivationPath -> StakeKeyPresence -> Either String KeyWallet +``` + +`Contract.Wallet.withKeyWalletFromMnemonic` is another helper function that lets to construct and use wallets on the fly, which is convenient for [Plutip tests](./plutip-testing.md). + +In `ContractParams`, these values can be conveniently passed as the `walletSpec` via the `UseMnemonic` constructor: + +```purescript +data MnemonicSource + = MnemonicString String + | MnemonicFile FilePath + +data WalletSpec + = UseMnemonic MnemonicSource Cip1852DerivationPath StakeKeyPresence + | ... +``` diff --git a/doc/keydir.md b/doc/keydir.md new file mode 100644 index 000000000..1afbe8ddd --- /dev/null +++ b/doc/keydir.md @@ -0,0 +1,80 @@ +# Keydir backend + + + + +- [Setting up a keydir test suite](#setting-up-a-keydir-test-suite) + - [Generating private keys](#generating-private-keys) + - [Funding your address](#funding-your-address) + - [Setting up a directory for temporary keys](#setting-up-a-directory-for-temporary-keys) + + + +## Setting up a keydir test suite + +In this section, we show how to set up a test suite that uses the keydir backend +to run `Contract`s and print reports nicely using [Mote][mote]. + +**Important note:** Blockfrost-based tests also use the keydir test engine. +Thus, if you have already done basic setup for Blockfrost-based tests, you don't +have to repeat this setup for keydir-based tests. + +### Generating private keys + +Follow [the Cardano handbook][cardano-handbook-keys-addresses] to generate a +private payment key, and optionally, a stake key. You can use [this +script][ctl-generate-keys] for convenience instead of following the instructions +given in this section. + +The generated keys should look like this: + +```json +{ + "type": "PaymentSigningKeyShelley_ed25519", + "description": "Payment signing key", + "cborHex": "..." +} +``` + +Get the address for this payment key (and, optionally, stake key), following the +guide above. + +If you are using a testnet, replace the `--mainnet` flag in the shell command +with `--testnet-magic YOUR_NETWORK_MAGIC`, where `YOUR_NETWORK_MAGIC` is a +genesis parameter of the network. For public testnets, you can get this value +from the [`cardano-configurations` repo][cardano-configurations]. You can find +it in `network/YOUR_NETWORK_NAME/genesis/shelley.json`, under the `networkMagic` +key. Common values are 1 for `preprod`, and 2 for `preview`. + +### Funding your address + +Fund your address using the [testnet faucet][testnet-faucet]. Make sure you're +sending funds in the correct network. + +Point the test suite to your keys by setting `PRIVATE_PAYMENT_KEY_FILE` and +`PRIVATE_STAKE_KEY_FILE` to the paths of your `.skey` files. If you are using an +enterprise address (without a staking credential component), then do not provide +the staking key file. Whether you use a staking credential component or not does +not affect anything, because the test suite will only use this address to +distribute funds to other, temporary addresses. + +### Setting up a directory for temporary keys + +During testing, the test engine will move funds around according to the UTxO +distribution specifications provided via `Contract.Test.withWallets' calls in +the test bodies. This will generate private keys as-needed on the fly: these +will be stored in a special directory, to prevent loss of funds in case the test +suite suddenly exits. This directory will become the `FilePath` argument to +`runContractTestsWithKeyDir`. + +Each test will generate fresh keys that will be stored in this directory +indefinitely. It is up to the user to decide when to delete the corresponding +directories. We don't dispose of the keys automatically, as there may be some +on-chain state that's uniquely tied to them, which the user might not want to +lose access to. + +[mote]: https://github.com/garyb/purescript-mote +[cardano-handbook-keys-addresses]: https://developers.cardano.org/docs/stake-pool-course/handbook/keys-addresses +[ctl-generate-keys]: https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/scripts/generate-keys.sh +[cardano-configurations]: https://github.com/input-output-hk/cardano-configurations +[testnet-faucet]: https://docs.cardano.org/cardano-testnet/tools/faucet diff --git a/doc/plutip-testing.md b/doc/plutip-testing.md index 08a1db5e2..85b11fd32 100644 --- a/doc/plutip-testing.md +++ b/doc/plutip-testing.md @@ -1,6 +1,6 @@ # CTL integration with Plutip -[Plutip](https://github.com/mlabs-haskell/plutip) is a tool to run private Cardano testnets. CTL provides integration with Plutip via a [`plutip-server` binary](https://github.com/mlabs-haskell/plutip/pull/79) that exposes an HTTP interface to control local Cardano clusters. +[Plutip](https://github.com/mlabs-haskell/plutip) is a tool to run private Cardano testnets. CTL provides integration with Plutip via [`plutip-server` binary](https://github.com/Plutonomicon/cardano-transaction-lib/tree/develop/plutip-server) that exposes an HTTP interface to control local Cardano clusters. **Table of Contents** @@ -8,12 +8,20 @@ - [Architecture](#architecture) - [Testing contracts](#testing-contracts) - - [Testing in Aff context](#testing-in-aff-context) - [Testing with Mote](#testing-with-mote) + - [Overview](#overview) + - [Using Mote testing interface](#using-mote-testing-interface) + - [Internal implementation overview](#internal-implementation-overview) + - [Testing in Aff context](#testing-in-aff-context) + - [Writing checks in tests](#writing-checks-in-tests) + - [Note on running clusters](#note-on-running-clusters) - [Note on SIGINT](#note-on-sigint) - [Testing with Nix](#testing-with-nix) +- [Cluster configuration options](#cluster-configuration-options) + - [Current limitations](#current-limitations) - [Using addresses with staking key components](#using-addresses-with-staking-key-components) - - [See also](#see-also) +- [Limitations](#limitations) +- [See also](#see-also) ## Architecture @@ -24,17 +32,135 @@ CTL depends on a number of binaries in the `$PATH` to execute Plutip tests: - [`ogmios`](https://ogmios.dev/) - [`kupo`](https://cardanosolutions.github.io/kupo/) -All of these are provided by CTL's `overlays.runtime` (and are provided in CTL's own `devShell`). You **must** use the `runtime` overlay or otherwise make the services available in your package set (e.g. by defining them within your own `overlays` when instantiating `nixpkgs`) as `purescriptProject.runPlutipTest` expects all of them. +All of these are provided by CTL's `overlays.runtime` (and are provided in CTL's own `devShell`). You **must** use the `runtime` overlay or otherwise make the services available in your package set (e.g. by defining them within your own `overlays` when instantiating `nixpkgs`) as `purescriptProject.runPlutipTest` expects all of them; an example of using CTL's overlays is in the [`ctl-scaffold` template](../templates/ctl-scaffold/flake.nix#L35). -The services are NOT run by `docker-compose` as is the case with `launchCtlRuntime`: they are started and stopped on each CTL `Contract` execution by CTL. +The services are NOT run by `docker-compose` (via `arion`) as is the case with `launchCtlRuntime`: instead they are started and stopped on each CTL `ContractTest` execution by CTL itself. + +If you have based your project on the [`ctl-scaffold` template](../templates/ctl-scaffold) then you have two options to run Plutip tests: +1. `nix develop` followed by `npm run test` (recommended for development) +2. `nix run .#checks.x86_64-linux.ctl-scaffold-plutip-test` + * where you'd usually replace `x86_64-linux` with the system you run tests on + * and `ctl-scaffold-plutip-test` with the name of the plutip test derivation for your project; + * note that building of your project via Nix will fail in case there are any PureScript compile-time warnings. ## Testing contracts -There are two entry points to the testing interface: `Contract.Test.Plutip.runPlutipContract` and `Contract.Test.Plutip.testPlutipContracts`. They work similarly, the difference being that `runPlutipContract` accepts a single `Contract` and runs in `Aff`, whereas `testPlutipContracts` transforms a `MoteT` test tree of `PlutipTest` into `Aff`. [Mote](https://github.com/garyb/purescript-mote) is a DSL for defining tests, and combined with `testPlutipContracts` you can use a single plutip instance to run multiple indepedent tests. +CTL can help you test the offchain `Contract`s from your project (and consequently the interaction of onchain and offchain code) by spinning up a disposable private testnet via Plutip and making all your `Contract`s interact with it. + +There are two approaches to writing such tests. + +### Testing with Mote + +#### Overview + +[Mote](https://github.com/garyb/purescript-mote) is a DSL for defining and grouping tests (plus other quality of life features, e.g. skipping marked tests). + +First (and more widely used) approach is to first build a tree of tests (in CTL's case a tree of `ContractTest` types -- basically a function from some distribution of funds to a `Contract a`) via Mote and then use the `Contract.Test.Plutip.testPlutipContracts` function to execute them. +This allows to set up a Plutip cluster only once per top-level groups and tests passed to the `testPlutipContracts` and then use it in many independent tests. +The function will interpret a `MoteT` (effectful test tree) into `Aff`, which you can then actually run. + +The [`ctl-scaffold` template](../templates/ctl-scaffold) provides a simple `Mote`-based example. + +`Contract.Test.Plutip.testPlutipContracts` type is defined as follows: +```purescript +testPlutipContracts + :: PlutipConfig + -> TestPlanM ContractTest Unit + -> TestPlanM (Aff Unit) Unit +``` + +It takes a plutip config and a tree of Mote tests, where tests are of type `ContractTest`. + +To create tests of type `ContractTest`, you should either use `Contract.Test.Plutip.withWallets` or `Contract.Test.Plutip.noWallet`: + +```purescript +withWallets + :: forall (distr :: Type) (wallets :: Type) + . UtxoDistribution distr wallets + => distr + -> (wallets -> Contract Unit) + -> ContractTest + +noWallet :: Contract Unit -> ContractTest +noWallet test = withWallets unit (const test) +``` + +Usage of `testPlutipContracts` is similar to that of `runPlutipContract`, and distributions are handled in the same way. Here's an example: + +```purescript +suite :: MoteT Aff (Aff Unit) Aff +suite = testPlutipContracts config do + test "Test 1" do + let + distribution :: Array BigInt /\ Array BigInt + distribution = ... + withWallets distribution \(alice /\ bob) -> do + ... + + test "Test 2" do + let + distribution :: Array BigInt + distribution = ... + withWallets distribution \alice -> do + ... + + test "Test 3" do + noWallet do + ... +``` + +#### Using Mote testing interface + +To define tests suites you can use `test`, group them with `group` and also wrap tests or groups with `bracket` to execute custom actions before and after tests/groups that are inside the bracket. +Note that in Mote you can define several tests and several groups in a single block, and bracket that wraps them will be run for each such test or group. + +Internally `testPlutipContracts` places a bracket that sets up the CTL environment and starts up the Plutip cluster on the top level, so if you want to launch cluster only once wrap your tests or groups in a single group. +In the example above the environment and cluster setup will happen 3 times. + +#### Internal implementation overview + +`Contract.Test.Plutip.testPlutipContracts` type is defined as follows (after expansion of the CTL's `TestPlanM` type synonym): +```purescript +type TestPlanM :: Type -> Type -> Type +type TestPlanM test a = MoteT Aff test Aff a + +testPlutipContracts + :: PlutipConfig + -> MoteT Aff ContractTest Aff Unit + -> MoteT Aff (Aff Unit) Aff Unit + +-- Recall that `MoteT` has three type variables +newtype MoteT bracket test m a +``` +where +* `bracket :: Type -> Type` is where brackets will be run (before/setup is `bracket r` and after/shutdown is of type `r -> bracket Unit`), + * in our case it's `Aff` and is where the CTL environment and Plutip cluster setup will happen, + * also environment setup and Plutip startup and teardown will happen once per each top-level test or group inside the `testPlutipContracts` call, + * so wrap your tests or groups in a single group if you want for the cluster to start only once, +* `test :: Type` is a type of tests themselves, + * in our case it's [`ContractTest`](../src/Internal/Test/ContractTest.purs), which in a nutshell describes a function from some wallet UTxO distribution to a `Contract r` + * wallet UTxO distribution is the one that you need to pattern-match on when writing tests +* `m :: Type -> Type` is a monad where effects during the construction of the test suite can be performed, + * here we use `Aff` again +* `a :: Type` is a result of the test suite, we use `Unit` here. + +`testPlutipContracts` also combines distributions of individual tests in a single big distribution (via nested tuples) and modifies tests to pluck their required distributions out of the big one. +This allows to create wallets and fund them in one step, during the Plutip setup. +See the comments in the [`Ctl.Internal.Plutip.Server` module](../src/Internal/Plutip/Server.purs) for more info (relevant ones are in `execDistribution` and `testPlutipContracts` functions). + +In complicated protocols you might want to execute some `Contract`s in one test and then execute other `Contract`s which depend on some wallet-dependent state set up by the first batch of contracts, e.g. some authorization token is present at some wallet. +Keeping these steps in separate sequential tests allows to pinpoint where things failed much easier, but currently CTL uses separate wallets for each test without an easy way to refer to wallets in other tests, so you have to call first batch of contracts again to replicate the state of the wallets, which in turn might fail or mess up your protocol, because the chain state is shared between tests for each top-level group. +There's a patch to CTL you can adapt (and even better -- make a PR) if you need to share wallets between tests right now, see the [limitations](#limitations) doc for more info. +This functionality will probably be added to CTL later. ### Testing in Aff context -`Contract.Test.Plutip.runPlutipContract`'s function type is as follows: +Second approach is to use the `Contract.Test.Plutip.runPlutipContract` function, which takes a single `Contract`, launches a Plutip cluster and executes the passed contract. +This function runs in `Aff`; it will also throw an exception should contract fail for any reason. +After the contract execution the Plutip cluster is terminated. +You can either call it directly from your test's main or use any library for grouping and describing tests which support effects in the test body, like Mote. + +`Contract.Test.Plutip.runPlutipContract`'s function type is defined as follows: ```purescript runPlutipContract @@ -46,9 +172,9 @@ runPlutipContract -> Aff a ``` -`distr` is a specification of how many wallets and with how much funds should be created. It should either be a `unit` (for no wallets), nested tuples containing `Array BigInt` or an `Array` of `Array BigInt`, where each element of the `Array BigInt` specifies an UTxO amount in Lovelaces (0.000001 Ada). +`distr` is a specification of how many wallets and with how much funds should be created. It should either be a `Unit` (for no wallets), nested tuples containing `Array BigInt` or an `Array (Array BigInt)`, where each element of the inner array specifies an UTxO amount in Lovelaces (0.000001 Ada). -The `wallets` argument is either a `Unit`, a tuple of `KeyWallet`s (with the same nesting level as in `distr`, which is guaranteed by `UtxoDistribution`) or an `Array KeyWallet`. +The `wallets` argument of the callback is either a `Unit`, a tuple of `KeyWallet`s (with the same nesting level as in `distr`, which is guaranteed by `UtxoDistribution`) or an `Array KeyWallet`. `wallets` should be pattern-matched on, and its components should be passed to `withKeyWallet`: @@ -75,7 +201,9 @@ An example `Contract` with two actors using `Array`: let distribution :: Array (Array BigInt) distribution = + -- wallet one: two UTxOs [ [ BigInt.fromInt 1_000_000_000, BigInt.fromInt 2_000_000_000] + -- wallet two: one UTxO , [ BigInt.fromInt 2_000_000_000 ] ] runPlutipContract config distribution \wallets -> do @@ -88,62 +216,27 @@ runPlutipContract config distribution \wallets -> do In most cases at least two UTxOs per wallet are needed (one of which will be used as collateral, so it should exceed `5_000_000` Lovelace). -Note that during execution WebSocket connection errors may occur. However, payloads are re-sent after these errors, so you can ignore them. [These errors will be suppressed in the future.](https://github.com/Plutonomicon/cardano-transaction-lib/issues/670). - -### Testing with Mote - -`Contract.Test.Plutip.testPlutipContracts` type is as follows: - -```purescript -testPlutipContracts - :: PlutipConfig - -> MoteT Aff PlutipTest Aff Unit - -> MoteT Aff (Aff Unit) Aff Unit -``` - -The final `MoteT` type requires the bracket, test and test building type to all be in `Aff`. The brackets cannot be ignored in the `MoteT` test runner, as it is what allows a single plutip instance to persist over multiple tests. - -To create tests of type `PlutipTest`, you must either use `Contract.Test.Plutip.withWallets` or `Contract.Test.Plutip.noWallet`, the latter being a helper alias of the first: -```purescript -withWallets - :: forall (distr :: Type) (wallets :: Type) - . UtxoDistribution distr wallets - => distr - -> (wallets -> Contract Unit) - -> PlutipTest +Internally `runPlutipContract` runs a contract in an `Aff.bracket`, which creates a Plutip cluster on setup and terminates it during the shutdown or in case of an exception. +Logs will be printed in case of an error. -noWallet :: Contract Unit -> PlutipTest -noWallet test = withWallets unit (const test) -``` +### Writing checks in tests -The type is very similar to that of `runPlutipContract`, and distributions are handled in the same way. The following is an example of running multiple tests under the same plutip instance: +CTL will run contracts in your test bodies and will print errors for any failed tests. +For more complex checks you can use the [assertions library](./test-utils.md). -```purescript -suite :: MoteT Aff (Aff Unit) Aff -suite = testPlutipContracts config do - test "Test 1" do - let - distribution :: Array BigInt /\ Array BigInt - distribution = ... - withWallets distribution \(alice /\ bob) -> do - ... +### Note on running clusters - test "Test 2" do - let - distribution :: Array BigInt - distribution = ... - withWallets distribution \alice -> do - ... +The communication with Plutip happens via the `plutip-server`'s HTTP interface, which allows to start or stop a cluster. +[`plutip-server`](../plutip-server) allows only once active cluster at a time. +CTL currently launches `plutip-server` and `kupo` on pre-defined ports, so you won't be able to launch multiple environments to get parallel cluster. - test "Test 3" do - noWallet do - ... -``` + + ### Note on SIGINT -Due to `testPlutipContracts`/`runPlutipContract` adding listeners to the SIGINT signal, node's default behaviour of exiting on that signal no longer occurs. This was done to add cleanup handlers and let them run in parallel instead of exiting eagerly, which is possible when running multiple clusters in parallel. To restore the exit behaviour, we provide helpers to cancel an `Aff` fiber and set the exit code, to let node shut down gracefully when no more events are to be processed. +Due to `testPlutipContracts`/`runPlutipContract` adding listeners to the SIGINT IPC signal, Node.js's default behaviour of exiting on CTRL+C no longer occurs. This was done to let cluster cleanup handlers run asynchronously. To restore the usual exit-by-CTRL+C, we provide helpers to cancel an `Aff` fiber and set the exit code, to let Node.js shut down gracefully when no more events are to be processed. ```purescript ... @@ -172,6 +265,29 @@ You can run Plutip tests via CTL's `purescriptProject` as well. After creating y } ``` +The usual approach is to put `projectname-plutip-test` in the `checks` attribute of your project's `flake.nix`. +This is done by default in the [`ctl-scaffold` template](../templates/ctl-scaffold/flake.nix). + +## Cluster configuration options + +`PlutipConfig` type contains `clusterConfig` record with the following options: + +```purescript +{ slotLength :: Seconds +, epochSize :: Maybe UInt +, maxTxSize :: Maybe UInt +, raiseExUnitsToMax :: Boolean +} +``` + +- `slotLength` and `epochSize` define time-related protocol parameters. Epoch size is specified in slots. +- `maxTxSize` (in bytes) allows to stress-test protocols with more restrictive transaction size limits. +- `raiseExUnitsToMax` allows to bypass execution units limit (useful when compiling the contract with tracing in development and without it in production). + +### Current limitations + +* Non-default values of `epochSize` (current default is 80) break staking rewards - see [this issue](https://github.com/mlabs-haskell/plutip/issues/149) for more info. `slotLength` can be changed without any problems. + ## Using addresses with staking key components It's possible to use stake keys with Plutip. `Contract.Test.Plutip.withStakeKey` function can be used to modify the distribution spec: @@ -191,8 +307,16 @@ let Although stake keys serve no real purpose in plutip context, they allow to use base addresses, and thus allow to have the same code for plutip testing, in-browser tests and production. -Note that CTL re-distributes tADA from payment key-only ("enterprise") addresses to base addresses, which requires a few transactions before the test can be run. Plutip can currently handle only enterprise addreses (see [this issue](https://github.com/mlabs-haskell/plutip/issues/103)). +Note that CTL re-distributes tADA from payment key-only ("enterprise") addresses to base addresses, which requires a few transactions before the test can be run. These transactions happen on the CTL side, because Plutip can currently handle only enterprise addreses (see [this issue](https://github.com/mlabs-haskell/plutip/issues/103)). + +## Limitations +* See the `epochSize` configuration option problem [here](#current-limitations). +* Currently there's no way to share wallets between separate tests (which is useful for complex protocols). You can adapt [this PR](https://github.com/IndigoProtocol/cardano-transaction-lib/pull/1) (needs to be updated for the newer versions of CTL, likely won't need too many changes) if you need it now (and even better -- make a PR to CTL). +* If you've used the [`plutus-simple-model`](https://github.com/mlabs-haskell/plutus-simple-model) library then you might know that it allows to time travel in tests, which can be very useful for testing vesting schedules, etc. Testing with Plutip doesn't allow this, as it's running a real network. A way around this problem can be to parametrize onchain logic by a time multiplier (and use a small one for tests). -### See also +## See also -- To actually write the test bodies, [assertions library](./test-utils.md) can be useful. +- To actually write the test bodies, [assertions library](./test-utils.md) can be useful [(usage example)](../examples/ContractTestUtils.purs). +- Take a look at CTL's Plutip tests for the usage examples: + - the entry point with `main` that runs Plutip tests is [here](../test/Plutip.purs), + - folder with various test suites is [here](../test/Plutip/). diff --git a/doc/query-layers.md b/doc/query-layers.md new file mode 100644 index 000000000..ab4be09f4 --- /dev/null +++ b/doc/query-layers.md @@ -0,0 +1,120 @@ + + + +- [CTL Query Layers](#ctl-query-layers) + - [Wallet/Backend Inconsistency](#walletbackend-inconsistency) + - [Configuring synchronization behavior](#configuring-synchronization-behavior) + - [Synchronization and wallet UTxO locking](#synchronization-and-wallet-utxo-locking) + - [Historical notes](#historical-notes) + - [See also](#see-also) + + + +# CTL Query Layers + +On Cardano, every running node has its own opinion on the set of currently unspent transaction outputs. Only [eventual consistency](https://en.wikipedia.org/wiki/Eventual_consistency) is guaranteed. + +A *Query Layer* is a software that provides an API to interact with underlying cardano-node(s). + +In CTL context, the following query layers can be used, depending on backend choice: + +- [Ogmios](https://ogmios.dev/) ([CTL backend](./runtime.md#ctl-backend)) +- [Kupo](https://cardanosolutions.github.io/kupo/) ([CTL backend](./runtime.md#ctl-backend)) +- [Blockfrost](https://blockfrost.io/) ([Blockfrost backend](./blockfrost.md)) +- [CIP-30 light wallet browser extensions](https://cips.cardano.org/cip/CIP-0030) (any backend) + +## Wallet/Backend Inconsistency + +Any dApp that interacts with a CIP-30 wallet has to deal with the inconsistency between local `cardano-node`-based query layer and light wallet query layer, especially when dApp workflow involves sending multiple interactions with the wallet in quick succession. + +Thus, the goal of the developers is to ensure that the set of UTxOs available to the wallet and the set of UTxOs the backend cardano-node knows about are *synchronized enough* to not cause errors when wallet or backend operations are performed. To give a few examples of potential issues, consider the following scenarios: + +- A dApp tries to balance a transaction with UTxOs from the wallet that are not yet available in Ogmios or Blockfrost, causing an error response +- A transaction is passed for signing, but the wallet does not yet know about the UTxOs it spends, and thus refuses to sign it (this happens with Eternl) +- A transaction is sent to the network via Ogmios or Blockfrost and is confirmed there, but the wallet still does not know about its UTxOs. + +CTL tries to be smart when dealing with the issue, and it aims to let the user work with both query layers as if it was one. To achieve this guarantee, CTL follows three simple rules: + +- **Rule 1** Whenever there is a *wallet operation* the result of which depends on the set of available UTxOs, CTL delays the execution until it reaches a state where *all wallet UTxOs are known to the backend*. These operations are assumed to be `getWalletUtxos`, `getWalletCollateral` and `getWalletBalance`. +- **Rule 2** Whenever there is a transaction *`signTx`* [CIP-30](https://cips.cardano.org/cip/CIP-0030/) call, the execution is delayed until all transaction inputs that come from one of the addresses controlled by the wallet *are known to the wallet*. +- **Rule 3** Whenever CTL is asked to await for *transaction confirmation*, the execution is delayed until the *UTxOs that the transaction creates at wallet addresses* are visible to the wallet. + +The rules are implemented as 3 callable functions, which we call *synchronization primitives*: + +1. `Contract.Sync.syncBackendWithWallet :: Contract Unit` - wait for wallet UTxOs to appear on backend +2. `Contract.Sync.syncWalletWithTxInputs :: Array TransactionInput -> Contract Unit` - wait for inputs to appear in the wallet +3. `Contract.Sync.syncWalletWithTransaction :: TransactionHash -> Contract Unit` - wait for Tx outputs to appear in the wallet + +The developer does not have to call them manually, because by default all the synchronization primitives are enabled when CIP-30 wallets are used. + +### Configuring synchronization behavior + +Although stronger UTxO set consistency guarantees allow to develop more reliable applications in less time, some users may find the delays or remote call overhead not worth it. + +To give some examples, it may be known that: + +- wallet UTxOs did not change in a while +- all the UTxOs a new transaction uses have long been settled in the wallet +- that the UTxOs a transaction creates at the wallet addresses will not be consumed again + +To account for these cases, synchronization primitives can be configured or disabled via `synchronizationParams` field of `ContractParams`: + +```purescript +type ContractSynchronizationParams = + { syncBackendWithWallet :: + { errorOnTimeout :: Boolean + , beforeCip30Methods :: Boolean + , beforeBalancing :: Boolean + } + , syncWalletWithTxInputs :: + { errorOnTimeout :: Boolean, beforeCip30Sign :: Boolean } + , syncWalletWithTransaction :: + { errorOnTimeout :: Boolean, beforeTxConfirmed :: Boolean } + } +``` + +- `before*` boolean value fields allow to enable or disable the delays (see above for correspondence between synchronization rules and function names). +- `errorOnTimeout` field controls whether a given synchronization primitive should throw an exception when timeouts are reached, or just print a warning to the console. It is set to `false` by default, use `Contract.Config.strictSynchronizationParams` to throw. +- Use `Contract.Config.disabledSynchronizationParams` to disable synchronization completely (this brings back CTL pre-v5.1.0 behavior). Additionally, `Contract.Sync.withoutSync` helper function can be used to disable synchronization locally in `Contract` context. + +The timeouts themselves can be configured using `timeParams` field of `ContractParams`: + +```purescript +type ContractTimeParams = + { ... + , syncWallet :: { delay :: Milliseconds, timeout :: Seconds } + , syncBackend :: { delay :: Milliseconds, timeout :: Seconds } + } +``` + +`delay` fields control intervals between synchronization checks. + +Note that it is possible to set `timeout` to `Seconds infinity`. + +### Synchronization and wallet UTxO locking + +`Contract.Utxos.utxosAt` function returns a set of UTxOs at a given address by calling Kupo or Blockfrost, depending on the backend. It seems reasonable to assume that if we call `utxosAt` at all wallet's addresses we will get the same set of UTxOs that [CIP-30](https://cips.cardano.org/cip/CIP-0030/) `getUtxos` method would return (eventually). But it is not, in fact, true. + +*UTxO locking* is a wallet feature that allows to hide certain UTxOs from results of CIP-30 calls, making them invisible to dApps. Among the wallets we support, it is currently only present in Eternl: + +![Eternl UTxO locking feature in UI](./images/eternl-utxo-locking.png) + +UTxO locking does not play well with `syncWalletWithTxInputs` and `syncWalletWithTransaction`, because the set of UTxOs these functions poll for may contain locked UTxOs, and thus the synchronization can fail by timeout (either with an exception or a console warning, see `errorOnTimeout` configuration parameter above). + +However, the developer can easily safeguard against this problem by following one simple rule: + +- `utxosAt` should not be used to get UTxOs present on wallet's addresses. Instead, `Contract.Wallet.getWalletUtxos` should be used. + +`utxosAt` will log a warning to the console when used with a wallet's address. + +### Historical notes + +Initially we underestimated the problem of UTxO set inconsistency between query layers and decided to just use our backend as a source of truth all the time, because sticking to CIP-30 just wouldn't be enough for our needs. This decision led to subtle and non-reproducible problems in our clients dApps, so we wouldn't suggest anyone to follow this path. + +Conceptually, the wallet is responsible for *owning* the UTxOs, so wallet developers may implement behaviors that would prevent us from making general assumptions about the wallet state. + +CTL `v5.1.0` introduces better consistency guarantees while not requiring the developer to change any code on their side - for the price of slight delays during the app runtime. + +## See also + +- [Optimising your app with custom query layers](./custom-query-layers.md) diff --git a/doc/runtime.md b/doc/runtime.md index c78c6d627..2ec91aea4 100644 --- a/doc/runtime.md +++ b/doc/runtime.md @@ -15,8 +15,6 @@ Our nix environment includes CTL backend services, but for now Blockfrost can be - [Using CTL's `runtime` overlay](#using-ctls-runtime-overlay) - [Changing network configurations](#changing-network-configurations) - [Blockfrost Backend](#blockfrost-backend) - - [Blockfrost backend limitations](#blockfrost-backend-limitations) - - [Transaction confirmation delays](#transaction-confirmation-delays) - [Wallet requirements](#wallet-requirements) @@ -27,14 +25,16 @@ Info in this section only applies to CTL backend services. The services that are currently **required** are: - [Ogmios](https://ogmios.dev) - - You **must** use Ogmios v5.2.0 or greater with CTL - - Ogmios itself requires a running Cardano node, so you may also need to deploy a node. Node v1.34.0 or greater is recommended + - You **must** use Ogmios v6 or greater with CTL with `--include-transaction-cbor` option + - Ogmios itself requires a running Cardano node, so you may also need to deploy a node. Node v8.1.1 or greater is recommended - You can also use [our fork](https://github.com/mlabs-haskell/ogmios) which has improved Nix integration - [Kupo](https://github.com/CardanoSolutions/kupo) - Required to query UTxOs and resolve inline datums and reference scripts - You **must** use Kupo v2.2.0 or greater with CTL - Like Ogmios, Kupo requires a running Cardano node +To start all of them for tests, run `npm run start-runtime`. + ### Using NixOS module CTL's dependencies can be configured and started via NixOS modules. See [nix/test-nixos-configuration.nix](../nix/test-nixos-configuration.nix) for example. @@ -63,25 +63,7 @@ When changing networks, make sure that `network.magic` is correctly synchronized ## Blockfrost Backend -Blockfrost backend can be configured by providing a record of values to `mkBlockfrostBackendParams`: - -```purescript -type BlockfrostBackendParams = - { blockfrostConfig :: ServerConfig - , blockfrostApiKey :: Maybe String - , confirmTxDelay :: Maybe Seconds - } - -mkBlockfrostBackendParams :: BlockfrostBackendParams -> QueryBackendParams -``` - -Note that it is possible to use CTL runtime services alongside with Blockfrost for queries it does not support by modifying the `QueryBackendParams` value manually (`CtlBackendParams` is an optional parameter of its constructor). - -### Blockfrost backend limitations - -#### Transaction confirmation delays - -State does not propagate to the chain consistently the moment a transaction gets submitted. So, there's a certain artificial delay that gets added after each Tx submission. You can adjust it with `confirmTxDelay` parameter of `BlockfrostBackendParams`. 20-30 seconds is recommended. +See [here](./blockfrost.md) for the documentation. ## Wallet requirements diff --git a/doc/secp256k1-support.md b/doc/secp256k1-support.md index e6af3d1eb..fb40e20b6 100644 --- a/doc/secp256k1-support.md +++ b/doc/secp256k1-support.md @@ -21,6 +21,7 @@ For a more in depth oversight please see [Cip-49](https://github.com/mlabs-haske [Cip-49](https://github.com/mlabs-haskell/CIPs/tree/c5bdd66fe49c19c341499f86cebaa2eef9e90b74/CIP-0049) provides two new Plutus builtin functions for signature verification. Both functions take the following as Parameters: + - A verification key; - An input to verify (either the message itself, or a hash); - A signature. diff --git a/doc/test-utils.md b/doc/test-utils.md index 397afb12a..0290683dc 100644 --- a/doc/test-utils.md +++ b/doc/test-utils.md @@ -87,4 +87,6 @@ type ContractCheck a = Particular values can be constructed with utility functions, as demonstrated in the [ContractTestUtils example](../examples/ContractTestUtils.purs) (see `mkAssertions`). +An example for using checks in the tests is [here](../test/Plutip/Contract/Assert.purs). + All the functions require `Labeled` arguments, that can be constructed with `label` function; or `noLabel`, if descriptive names in error messages are not needed. diff --git a/doc/tx-chaining.md b/doc/tx-chaining.md index bab932953..3088503b0 100644 --- a/doc/tx-chaining.md +++ b/doc/tx-chaining.md @@ -6,4 +6,6 @@ Transaction chaining on Cardano is the ability to send transactions that depend In case the transactions come from multiple actors, some off-chain data delivery mechanism should be used - it's up to the application developers to implement it. -The only piece of data that is actually needed is the additional UTxOs that the CTL query layer is not (yet) aware of. `mustUseAdditionalUtxos` [balancer constraint](./balancing.md) can be used for that, as shown in the [transaction chaining example](../examples/TxChaining.purs). +The only piece of data that is actually needed is the additional UTxOs that the CTL query layer is not (yet) aware of. `mustUseAdditionalUtxos` [balancer constraint](./balancing.md) can be used for that, as shown in the [transaction chaining example](../examples/TxChaining.purs). Additionally, `mustNotSpendUtxosWithOutRefs` can be used to forbid spending UTxOs that have been consumed. + +`createAdditionalUtxos` is a helper function that can be used to build an UTxO set for use with `mustUseAdditionalUtxos`. `Contract.Backend.Ogmios.Mempool` module contains functions that allow to query the mempool for pending transactions (only works with Ogmios backend). See [here](https://ogmios.dev/mini-protocols/local-tx-monitor/) for more. diff --git a/doc/using-from-js.md b/doc/using-from-js.md new file mode 100644 index 000000000..4c977528d --- /dev/null +++ b/doc/using-from-js.md @@ -0,0 +1,199 @@ + + + +- [JavaScript SDKs](#javascript-sdks) + - [Defining APIs in PureScript](#defining-apis-in-purescript) + - [Using from NodeJS](#using-from-nodejs) + - [Bundling for NodeJS](#bundling-for-nodejs) + - [Calling from NodeJS](#calling-from-nodejs) + - [Using from the browser](#using-from-the-browser) + - [Bundling for the browser](#bundling-for-the-browser) + - [WebAssembly and conditional imports](#webassembly-and-conditional-imports) + - [Calling in the browser](#calling-in-the-browser) + - [See also](#see-also) + + + +# JavaScript SDKs + +Normally, dApps involve three parts: + +- on-chain logic (Plutus or Plutarch scripts) +- off-chain logic (in our case, implemented using CTL) +- user interface + +Building CTL-based JavaScript SDKs is the simplest way to connect user interfaces (most commonly, web apps) with off-chain logic. These SDKs expose app-specific APIs for web developers to plug into the user interface. SDKs are normally consumable as NPM packages. + +## Defining APIs in PureScript + +Developers should start from reading [this PureScript guide](https://book.purescript.org/chapter10.html#calling-purescript-from-javascript) that shows how to call PureScript from JS. Our (older) PureScript version is using CommonJS modules and not ES modules, so `import` statements should be replaced with `require`. + +Suppose we want to wrap a single `Contract` into an interface to call it from JS with Nami wallet. + +We have to expose [functions to manage contract environment](./contract-environment.md) - initialization and finalization, as well as a config value we will use. + +```purescript +module Api where + +import Prelude + +import Contract.Config (ContractParams, testnetNamiConfig) +import Contract.JsSdk (mkContractEnvJS, stopContractEnvJS) +import Contract.Monad (ContractEnv, runContractInEnv) +import Control.Promise (Promise, fromAff) +import Data.Function.Uncurried (Fn1, mkFn1) +import Effect.Unsafe (unsafePerformEffect) +import Scaffold (contract) -- our contract + +initialize :: Fn1 ContractParams (Promise ContractEnv) +initialize = mkContractEnvJS + +finalize :: Fn1 ContractEnv (Promise Unit) +finalize = stopContractEnvJS + +run :: Fn1 ContractEnv (Promise Unit) +run = mkFn1 \env -> + unsafePerformEffect $ fromAff $ runContractInEnv env contract + +config :: ContractParams +config = testnetNamiConfig -- use Nami wallet +``` + +- `Fn1` - `Fn10` types are wrappers that represent uncurried JavaScript functions with multiple arguments, and `mkFn1` - `mkFn10` are their constructors. +- `Contract.JsSdk` is a module containing synonyms for some `Contract.Monad` functions, but adapted for use in JS SDKs. +- `fromAff` converts `Aff a` to `Effect (Promise a)`, and `unsafePerformEffect` removes the `Effect` wrapper that is not needed on the JS side. + +## Using from NodeJS + +### Bundling for NodeJS + +To prepare the module defined above for use from other NodeJS code, `spago bundle-module` should be used: + +```bash +spago bundle-module -m Api --to output.js +``` + +The resulting bundle will NOT include its NodeJS dependencies in the same file. + +It can be distributed via NPM by pointing `package.json` to it: + +```js +{ + ... + "main": "output.js", + ... + "dependencies": { + // same dependencies as CTL itself uses should be put here + } +} +``` + +### Calling from NodeJS + +The module above can be imported like this from NodeJS: + +```javascript +const { initialize, config, run, finalize } = require('./output.js'); + +(async () => { + const env = await initialize(config); + try { + await run(env); + } finally { + await finalize(env); + } +})(); +``` + +Notice that we used `finally` to finalize - this is because a running contract environment would prevent the script from exiting otherwise. Please read [this guide](./contract-environment.md) for info on how to manage the runtime environment correctly. + +## Using from the browser + +### Bundling for the browser + +The recommended way to bundle CTL for the browser is to use WebPack. + +#### WebAssembly and conditional imports + +We depend on WebPack's `DefinePlugin` to conditionally load either NodeJS or browser variant of dependencies that have WebAssembly parts. + +That means that CTL _requires_ bundling it the same way when used as a dependency, as we do in development. If you intend to use another bundler, something like `DefinePlugin` should be used to transform the import headers from this: + +```javascript +let lib; +if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { + lib = require("@emurgo/cardano-serialization-lib-browser"); +} else { + lib = require("@emurgo/cardano-serialization-lib-nodejs"); +} +``` + +to only one of the import variants. + +Our default [WebPack config](../webpack.config.cjs) uses `BROWSER_RUNTIME` environment variable to differentiate between two bundling options: + +```js + plugins: [ + new webpack.DefinePlugin({ + BROWSER_RUNTIME: !!process.env.BROWSER_RUNTIME, + }), +``` + +There's [a claim that Vite bundler can also be used](https://github.com/Plutonomicon/cardano-transaction-lib/issues/79#issuecomment-1257036068), although we don't officially support this method. + +### Calling in the browser + +Webpack config contains `entry` field, pointing to the main file of the app. + +Assuming we want to use the example app from above, it can be populated like this: + +```js +import("./output.js").then( + async ({ initialize, config, run, finalize }) => { + + const env = await initialize(config); + try { + await run(env); + } finally { + await finalize(env); + } +}); +``` + +Note that `import` returns a `Promise`. + +The config also contains some setup for output target: + +```js + output: { + path: path.resolve(__dirname, "dist"), + filename: "bundle.js", + }, +``` + +But to actually build a page that can be opened in a browser, we use `HtmlWebpackPlugin`: + +```js + new HtmlWebpackPlugin({ + title: "ctl-scaffold", + template: "./index.html", + inject: false, // See stackoverflow.com/a/38292765/3067181 + }), +``` + +The HTML page should contain this import, pointing to output bundle filename: + +```html + +``` + +`type="module"` is required here. + + +`experiments.syncWebAssembly` WebPack setting must be set to `true` because CTL internal code expects it. + +The whole webpage can be served with `BROWSER_RUNTIME=1 webpack-dev-server --progress` or built with `BROWSER_RUNTIME=1 webpack --mode=production` + +## See also + +- [How to import serialized Plutus scripts for NodeJS and the browser](./importing-scripts.md) diff --git a/doc/video-intro.md b/doc/video-intro.md index 9259d13dc..b78665d91 100644 --- a/doc/video-intro.md +++ b/doc/video-intro.md @@ -16,3 +16,7 @@ Timecodes: - 00:55:50 - how plutip test suite machinery manages local clusters - 01:06:50 - Babbage features (explaining) - 01:16:03 - Running E2E tests for Babbage features with Gero wallet + +# Blockfrost backend demo + +Here is [another video](https://drive.google.com/file/d/1cU7vsHlq0-rdybMn2_doBd8XDWA_MHwO/view?usp=share_link) with a walkthrough for CTL with [Blockfrost backend](./blockfrost.md) setup. A [presentation video](https://drive.google.com/file/d/1p-WT8L3x3iKYtNPjujo1JgmZZQ403GNS/view?usp=share_link) is also available - it gives a quick overview in under 5 minutes. diff --git a/esbuild/bundle.js b/esbuild/bundle.js new file mode 100755 index 000000000..29191f9af --- /dev/null +++ b/esbuild/bundle.js @@ -0,0 +1,13 @@ +import * as esbuild from "esbuild"; +import { buildOptions } from "./config.js"; + +if (process.argv.length < 4) { + throw `usage: node bundle.js ENTRY_POINT OUTPUT_FILENAME`; +} + +esbuild.build( + buildOptions({ + entryPoint: process.argv[2], + outfile: process.argv[3] + }) +); diff --git a/esbuild/config.js b/esbuild/config.js new file mode 100644 index 000000000..0ed3d593e --- /dev/null +++ b/esbuild/config.js @@ -0,0 +1,41 @@ +import { wasmLoader } from "esbuild-plugin-wasm"; +import { polyfillNode } from "esbuild-plugin-polyfill-node"; + +const isBrowser = !!process.env.BROWSER_RUNTIME; + +export const buildOptions = ({ entryPoint, outfile }) => { + const config = { + entryPoints: [entryPoint], + outfile: outfile, + define: { + BROWSER_RUNTIME: isBrowser ? "true" : '""' + }, + plugins: [ + wasmLoader({ + mode: "deferred" + }) + ], + bundle: true, + platform: isBrowser ? "browser" : "node", + format: "esm", + treeShaking: true, + logLevel: "error" + }; + + // https://esbuild.github.io/api/#packages + if (!isBrowser) { + config.packages = "external"; + } else { + config.plugins.push( + polyfillNode({ + polyfills: { + crypto: true, + fs: true, + os: true + } + }) + ); + } + + return config; +}; diff --git a/esbuild/serve.js b/esbuild/serve.js new file mode 100755 index 000000000..a77ae4162 --- /dev/null +++ b/esbuild/serve.js @@ -0,0 +1,72 @@ +import * as esbuild from "esbuild"; +import { buildOptions } from "./config.js"; +import http from "node:http"; +import * as url from "url"; + +if (process.argv.length < 6) { + throw `usage: node serve.js ENTRY_POINT OUTPUT_FILE SERVE_DIR PORT`; +} + +const ctx = await esbuild.context( + buildOptions({ + entryPoint: process.argv[2], + outfile: process.argv[3] + }) +); + +const config = { + // Use the next port for esbuild server, + // we need a port for our proxy (see below). + port: parseInt(process.argv[5]) + 1, + servedir: process.argv[4] +}; + +let { host, port } = await ctx.serve(config); + +// Proxy Kupo to esbuild server. This is needed due to CORS + +const kupoEndpoint = process.env.KUPO_HOST || "http://localhost:1442"; +const kupoHost = url.parse(kupoEndpoint).hostname; +const kupoPort = url.parse(kupoEndpoint).port || 80; + +http + .createServer((req, res) => { + const options = { + hostname: host, + port: port, + path: req.url, + method: req.method, + headers: req.headers + }; + + // Forward each incoming request to esbuild + const proxyReq = http.request(options, proxyRes => { + // If esbuild returns "not found" and the path starts from /kupo/ + if (proxyRes.statusCode === 404 && req.url.startsWith("/kupo/")) { + // Connect to Kupo running on port 1442 + const kupoOptions = { + hostname: kupoHost, + port: kupoPort, + path: req.url.slice("/kupo".length), + method: req.method, + headers: req.headers + }; + // Request the corresponding path + http + .request(kupoOptions, kupoRes => { + // Pipe the response from Kupo back to the client + res.writeHead(kupoRes.statusCode, kupoRes.headers); + kupoRes.pipe(res, { end: true }); + }) + .end(); + } else { + // Otherwise, forward the response from esbuild to the client + res.writeHead(proxyRes.statusCode, proxyRes.headers); + proxyRes.pipe(res, { end: true }); + } + }); + + // Forward the body of the request to esbuild + req.pipe(proxyReq, { end: true }); + }) + .listen(parseInt(process.argv[5])); diff --git a/examples/AdditionalUtxos.purs b/examples/AdditionalUtxos.purs new file mode 100644 index 000000000..6617e3144 --- /dev/null +++ b/examples/AdditionalUtxos.purs @@ -0,0 +1,133 @@ +module Ctl.Examples.AdditionalUtxos + ( contract + , main + ) where + +import Contract.Prelude + +import Contract.Address (scriptHashAddress) +import Contract.BalanceTxConstraints (BalanceTxConstraintsBuilder) +import Contract.BalanceTxConstraints (mustUseAdditionalUtxos) as BalancerConstraints +import Contract.Config (ContractParams, testnetNamiConfig) +import Contract.Log (logInfo') +import Contract.Monad (Contract, launchAff_, runContract) +import Contract.PlutusData (Datum, PlutusData(Integer), unitRedeemer) +import Contract.ScriptLookups (ScriptLookups, UnbalancedTx) +import Contract.ScriptLookups (datum, unspentOutputs, validator) as Lookups +import Contract.Scripts (Validator, ValidatorHash, validatorHash) +import Contract.Sync (withoutSync) +import Contract.Transaction + ( ScriptRef(NativeScriptRef) + , TransactionInput + , awaitTxConfirmed + , balanceTxWithConstraints + , createAdditionalUtxos + , signTransaction + , submit + , withBalancedTx + ) +import Contract.TxConstraints + ( DatumPresence(DatumInline, DatumWitness) + , TxConstraints + ) +import Contract.TxConstraints + ( mustPayToScript + , mustPayToScriptWithScriptRef + , mustSpendPubKeyOutput + , mustSpendScriptOutput + ) as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) +import Contract.Utxos (UtxoMap) +import Contract.Value (Value) +import Contract.Value (lovelaceValueOf) as Value +import Ctl.Examples.PlutusV2.Scripts.AlwaysSucceeds (alwaysSucceedsScriptV2) +import Data.Array (fromFoldable) as Array +import Data.Map (difference, filter, keys) as Map +import JS.BigInt (fromInt) as BigInt +import Test.QuickCheck (arbitrary) +import Test.QuickCheck.Gen (randomSampleOne) + +main :: Effect Unit +main = example testnetNamiConfig + +example :: ContractParams -> Effect Unit +example contractParams = + launchAff_ $ runContract contractParams $ contract false + +contract :: Boolean -> Contract Unit +contract testAdditionalUtxoOverlap = withoutSync do + logInfo' "Running Examples.AdditionalUtxos" + validator <- alwaysSucceedsScriptV2 + let vhash = validatorHash validator + { unbalancedTx, datum } <- payToValidator vhash + withBalancedTx unbalancedTx \balancedTx -> do + balancedSignedTx <- signTransaction balancedTx + txHash <- submit balancedSignedTx + when testAdditionalUtxoOverlap $ awaitTxConfirmed txHash + logInfo' "Successfully locked two outputs at the validator address." + + additionalUtxos <- createAdditionalUtxos balancedSignedTx + spendFromValidator validator additionalUtxos datum + +payToValidator + :: ValidatorHash -> Contract { unbalancedTx :: UnbalancedTx, datum :: Datum } +payToValidator vhash = do + scriptRef <- liftEffect (NativeScriptRef <$> randomSampleOne arbitrary) + let + value :: Value + value = Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 + + datum :: Datum + datum = wrap $ Integer $ BigInt.fromInt 42 + + constraints :: TxConstraints + constraints = + Constraints.mustPayToScript vhash datum DatumWitness value + <> Constraints.mustPayToScriptWithScriptRef vhash datum DatumInline + scriptRef + value + + lookups :: ScriptLookups + lookups = Lookups.datum datum + + unbalancedTx <- mkUnbalancedTx lookups constraints + pure { unbalancedTx, datum } + +spendFromValidator :: Validator -> UtxoMap -> Datum -> Contract Unit +spendFromValidator validator additionalUtxos datum = do + let + scriptUtxos :: UtxoMap + scriptUtxos = + additionalUtxos # Map.filter \out -> + (unwrap (unwrap out).output).address + == scriptHashAddress (validatorHash validator) Nothing + + scriptOrefs :: Array TransactionInput + scriptOrefs = Array.fromFoldable $ Map.keys scriptUtxos + + pubKeyOrefs :: Array TransactionInput + pubKeyOrefs = + Array.fromFoldable $ Map.keys $ Map.difference additionalUtxos scriptUtxos + + constraints :: TxConstraints + constraints = + foldMap (flip Constraints.mustSpendScriptOutput unitRedeemer) scriptOrefs + <> foldMap Constraints.mustSpendPubKeyOutput pubKeyOrefs + + lookups :: ScriptLookups + lookups = + Lookups.validator validator + <> Lookups.unspentOutputs additionalUtxos + <> Lookups.datum datum + + balancerConstraints :: BalanceTxConstraintsBuilder + balancerConstraints = + BalancerConstraints.mustUseAdditionalUtxos additionalUtxos + + unbalancedTx <- mkUnbalancedTx lookups constraints + balancedTx <- balanceTxWithConstraints unbalancedTx balancerConstraints + balancedSignedTx <- signTransaction balancedTx + txHash <- submit balancedSignedTx + + awaitTxConfirmed txHash + logInfo' "Successfully spent additional utxos from the validator address." diff --git a/examples/AlwaysMints.js b/examples/AlwaysMints.js index 3ab8b58f3..e9f4424fd 100644 --- a/examples/AlwaysMints.js +++ b/examples/AlwaysMints.js @@ -1,14 +1,5 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/always-mints.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/always-mints.plutus"), - "utf8" - ); -} -exports.alwaysMints = script; +export const alwaysMints = `{ + "cborHex": "484701000022120011", + "description": "always-mints", + "type": "PlutusScriptV1" +}`; diff --git a/examples/AlwaysMints.purs b/examples/AlwaysMints.purs index cbb1dece4..f8fddc2be 100644 --- a/examples/AlwaysMints.purs +++ b/examples/AlwaysMints.purs @@ -13,23 +13,15 @@ import Contract.Prelude import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') -import Contract.Monad (Contract, launchAff_, runContract) +import Contract.Monad (Contract, launchAff_, liftContractM, runContract) import Contract.ScriptLookups as Lookups import Contract.Scripts (MintingPolicy(PlutusMintingPolicy)) -import Contract.TextEnvelope - ( decodeTextEnvelope - , plutusScriptV1FromEnvelope - ) +import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV1FromEnvelope) import Contract.Transaction (awaitTxConfirmed, submitTxFromConstraints) import Contract.TxConstraints as Constraints import Contract.Value as Value -import Control.Monad.Error.Class (liftMaybe) -import Ctl.Examples.Helpers - ( mkCurrencySymbol - , mkTokenName - ) as Helpers -import Data.BigInt as BigInt -import Effect.Exception (error) +import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) as Helpers +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -40,12 +32,12 @@ contract = do mp /\ cs <- Helpers.mkCurrencySymbol alwaysMintsPolicy tn <- Helpers.mkTokenName "TheToken" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue $ Value.singleton cs tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txId <- submitTxFromConstraints lookups constraints @@ -61,10 +53,9 @@ foreign import alwaysMints :: String alwaysMintsPolicyMaybe :: Maybe MintingPolicy alwaysMintsPolicyMaybe = do - envelope <- decodeTextEnvelope alwaysMints - PlutusMintingPolicy <$> plutusScriptV1FromEnvelope envelope + PlutusMintingPolicy <$> + (plutusScriptV1FromEnvelope =<< decodeTextEnvelope alwaysMints) alwaysMintsPolicy :: Contract MintingPolicy alwaysMintsPolicy = - liftMaybe (error "Error decoding alwaysMintsPolicy") - alwaysMintsPolicyMaybe + liftContractM "Error decoding alwaysMintsPolicy" alwaysMintsPolicyMaybe diff --git a/examples/AlwaysSucceeds.js b/examples/AlwaysSucceeds.js index 4ba6671b7..f6c35572e 100644 --- a/examples/AlwaysSucceeds.js +++ b/examples/AlwaysSucceeds.js @@ -1,15 +1,5 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/always-succeeds.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/always-succeeds.plutus"), - "utf8" - ); -} - -exports.alwaysSucceeds = script; +export const alwaysSucceeds = `{ + "cborHex": "4e4d01000033222220051200120011", + "description": "always-succeeds", + "type": "PlutusScriptV1" +}`; diff --git a/examples/AlwaysSucceeds.purs b/examples/AlwaysSucceeds.purs index 1f3d7d405..26f1677de 100644 --- a/examples/AlwaysSucceeds.purs +++ b/examples/AlwaysSucceeds.purs @@ -2,8 +2,7 @@ -- | balance, and submit a smart-contract transaction. It creates a transaction -- | that pays two Ada to the `AlwaysSucceeds` script address. module Ctl.Examples.AlwaysSucceeds - ( alwaysSucceeds - , alwaysSucceedsScript + ( alwaysSucceedsScript , contract , example , main @@ -13,12 +12,12 @@ module Ctl.Examples.AlwaysSucceeds import Contract.Prelude -import Contract.Address (ownStakePubKeysHashes, scriptHashAddress) +import Contract.Address (scriptHashAddress) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Credential (Credential(PubKeyCredential)) import Contract.Log (logInfo') import Contract.Monad (Contract, launchAff_, runContract) -import Contract.PlutusData (PlutusData, unitDatum, unitRedeemer) +import Contract.PlutusData (unitDatum, unitRedeemer) import Contract.ScriptLookups as Lookups import Contract.Scripts (Validator(Validator), ValidatorHash, validatorHash) import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV1FromEnvelope) @@ -33,11 +32,12 @@ import Contract.TxConstraints (TxConstraints) import Contract.TxConstraints as Constraints import Contract.Utxos (utxosAt) import Contract.Value as Value +import Contract.Wallet (ownStakePubKeyHashes) import Control.Monad.Error.Class (liftMaybe) import Data.Array (head) -import Data.BigInt as BigInt import Data.Lens (view) import Effect.Exception (error) +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -60,9 +60,9 @@ example cfg = launchAff_ do payToAlwaysSucceeds :: ValidatorHash -> Contract TransactionHash payToAlwaysSucceeds vhash = do -- Send to own stake credential. This is used to test mustPayToScriptAddress. - mbStakeKeyHash <- join <<< head <$> ownStakePubKeysHashes + mbStakeKeyHash <- join <<< head <$> ownStakePubKeyHashes let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = case mbStakeKeyHash of Nothing -> @@ -78,7 +78,7 @@ payToAlwaysSucceeds vhash = do $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -90,7 +90,7 @@ spendFromAlwaysSucceeds -> Contract Unit spendFromAlwaysSucceeds vhash validator txId = do -- Use own stake credential if available - mbStakeKeyHash <- join <<< head <$> ownStakePubKeysHashes + mbStakeKeyHash <- join <<< head <$> ownStakePubKeyHashes let scriptAddress = scriptHashAddress vhash (PubKeyCredential <<< unwrap <$> mbStakeKeyHash) @@ -106,21 +106,21 @@ spendFromAlwaysSucceeds vhash validator txId = do ) (view _input <$> head (lookupTxHash txId utxos)) let - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs utxos - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustSpendScriptOutput txInput unitRedeemer spendTxId <- submitTxFromConstraints lookups constraints awaitTxConfirmed spendTxId logInfo' "Successfully spent locked values." -foreign import alwaysSucceeds :: String - alwaysSucceedsScript :: Contract Validator -alwaysSucceedsScript = +alwaysSucceedsScript = do liftMaybe (error "Error decoding alwaysSucceeds") do envelope <- decodeTextEnvelope alwaysSucceeds Validator <$> plutusScriptV1FromEnvelope envelope + +foreign import alwaysSucceeds :: String diff --git a/examples/BalanceTxConstraints.purs b/examples/BalanceTxConstraints.purs index fdbe92d12..8b971bf57 100644 --- a/examples/BalanceTxConstraints.purs +++ b/examples/BalanceTxConstraints.purs @@ -5,27 +5,24 @@ module Ctl.Examples.BalanceTxConstraints import Contract.Prelude -import Contract.Address - ( Address - , getWalletAddressesWithNetworkTag - , ownPaymentPubKeysHashes - ) +import Contract.Address (Address) import Contract.BalanceTxConstraints ( BalanceTxConstraintsBuilder , mustGenChangeOutsWithMaxTokenQuantity , mustNotSpendUtxoWithOutRef , mustSendChangeToAddress + , mustUseCollateralUtxos , mustUseUtxosAtAddress ) as BalanceTxConstraints import Contract.Log (logInfo') -import Contract.Monad (Contract, liftedE, liftedM) +import Contract.Monad (Contract, liftedM) import Contract.ScriptLookups as Lookups import Contract.Test.Assert ( ContractAssertionFailure(CustomFailure) , ContractCheck , assertContract + , assertNewUtxosAtAddress , assertionToCheck - , checkNewUtxosAtAddress , label , runChecks ) @@ -38,18 +35,25 @@ import Contract.Transaction , submit ) import Contract.TxConstraints as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Utxos (utxosAt) import Contract.Value (CurrencySymbol, TokenName, Value) import Contract.Value (singleton, valueOf) as Value -import Contract.Wallet (KeyWallet, withKeyWallet) +import Contract.Wallet + ( KeyWallet + , getWalletAddressesWithNetworkTag + , getWalletCollateral + , ownPaymentPubKeyHashes + , withKeyWallet + ) import Control.Monad.Trans.Class (lift) import Ctl.Examples.AlwaysMints (alwaysMintsPolicy) import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) as Helpers import Data.Array (head) import Data.Array (sort) as Array -import Data.BigInt (BigInt, fromInt) -import Data.Map (keys, member) as Map +import Data.Map (fromFoldable, keys, member) as Map import Data.Set (findMin) as Set +import JS.BigInt (BigInt, fromInt) newtype ContractParams = ContractParams { aliceKeyWallet :: KeyWallet @@ -59,6 +63,7 @@ newtype ContractParams = ContractParams type ContractResult = { txHash :: TransactionHash , changeAddress :: Address + , nonSpendableAddress :: Address , mintedToken :: CurrencySymbol /\ TokenName , nonSpendableOref :: TransactionInput } @@ -72,7 +77,7 @@ assertChangeOutputsPartitionedCorrectly = assertionToCheck "Change is correctly partitioned" \{ txHash, changeAddress: addr, mintedToken: cs /\ tn } -> do let labeledAddr = label addr "changeAddress" - checkNewUtxosAtAddress labeledAddr txHash \changeOutputs -> do + assertNewUtxosAtAddress labeledAddr txHash \changeOutputs -> do let assertionFailure :: ContractAssertionFailure assertionFailure = @@ -96,8 +101,8 @@ assertSelectedUtxoIsNotSpent :: ContractCheck ContractResult assertSelectedUtxoIsNotSpent = assertionToCheck "Non-spendable UTxO hasn't been spent" - \{ changeAddress, nonSpendableOref } -> do - utxos <- lift $ utxosAt changeAddress + \{ nonSpendableAddress, nonSpendableOref } -> do + utxos <- lift $ utxosAt nonSpendableAddress let assertionFailure :: ContractAssertionFailure assertionFailure = @@ -116,32 +121,44 @@ contract :: ContractParams -> Contract Unit contract (ContractParams p) = do logInfo' "Examples.BalanceTxConstraints" + aliceAddress <- + liftedM "Failed to get Alice's address" + $ head + <$> (withKeyWallet p.aliceKeyWallet getWalletAddressesWithNetworkTag) + alicePubKeyHash <- - liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes bobPubKeyHash <- liftedM "Failed to get Bob's PKH" $ head - <$> (withKeyWallet p.bobKeyWallet ownPaymentPubKeysHashes) + <$> (withKeyWallet p.bobKeyWallet ownPaymentPubKeyHashes) bobAddress <- liftedM "Failed to get Bob's address" $ head <$> (withKeyWallet p.bobKeyWallet getWalletAddressesWithNetworkTag) + bobsCollateralArray <- withKeyWallet p.bobKeyWallet do + fold <$> getWalletCollateral + let + bobsCollateral = + Map.fromFoldable $ bobsCollateralArray <#> unwrap >>> + \{ input, output } -> Tuple input output + nonSpendableOref <- - liftedM "Failed to get utxos at Bob's address" - (Set.findMin <<< Map.keys <$> utxosAt bobAddress) + liftedM "Failed to get utxos at Alice's address" + (Set.findMin <<< Map.keys <$> utxosAt aliceAddress) mp /\ cs <- Helpers.mkCurrencySymbol alwaysMintsPolicy tn <- Helpers.mkTokenName "The Token" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue (Value.singleton cs tn $ fromInt 11) <> foldMap Constraints.mustBeSignedBy [ alicePubKeyHash, bobPubKeyHash ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp balanceTxConstraints :: BalanceTxConstraints.BalanceTxConstraintsBuilder @@ -150,13 +167,12 @@ contract (ContractParams p) = do <> BalanceTxConstraints.mustUseUtxosAtAddress bobAddress <> BalanceTxConstraints.mustSendChangeToAddress bobAddress <> BalanceTxConstraints.mustNotSpendUtxoWithOutRef nonSpendableOref + <> BalanceTxConstraints.mustUseCollateralUtxos bobsCollateral void $ runChecks checks $ lift do - unbalancedTx <- - liftedE $ Lookups.mkUnbalancedTx lookups constraints + unbalancedTx <- mkUnbalancedTx lookups constraints - balancedTx <- - liftedE $ balanceTxWithConstraints unbalancedTx balanceTxConstraints + balancedTx <- balanceTxWithConstraints unbalancedTx balanceTxConstraints balancedSignedTx <- (withKeyWallet p.bobKeyWallet <<< signTransaction) @@ -169,4 +185,10 @@ contract (ContractParams p) = do logInfo' "Tx submitted successfully!" let changeAddress = (unwrap bobAddress).address - pure { txHash, changeAddress, mintedToken: cs /\ tn, nonSpendableOref } + pure + { txHash + , changeAddress + , nonSpendableAddress: (unwrap aliceAddress).address + , mintedToken: cs /\ tn + , nonSpendableOref + } diff --git a/examples/ByUrl.purs b/examples/ByUrl.purs index ec7bec66b..e4f75e7e1 100644 --- a/examples/ByUrl.purs +++ b/examples/ByUrl.purs @@ -11,7 +11,9 @@ import Contract.Config , ConnectToEternl , ConnectToFlint , ConnectToNuFi + , ConnectToLace ) + , blockfrostPublicPreprodServerConfig , blockfrostPublicPreviewServerConfig , mainnetFlintConfig , mainnetGeroConfig @@ -23,16 +25,20 @@ import Contract.Config , testnetEternlConfig , testnetFlintConfig , testnetGeroConfig + , testnetLaceConfig , testnetLodeConfig , testnetNamiConfig , testnetNuFiConfig ) import Contract.Monad (Contract) import Contract.Test.E2E (E2EConfigName, E2ETestName, addLinks, route) +import Ctl.Examples.AdditionalUtxos as AdditionalUtxos import Ctl.Examples.AlwaysMints as AlwaysMints import Ctl.Examples.AlwaysSucceeds as AlwaysSucceeds +import Ctl.Examples.ChangeGeneration as ChangeGeneration import Ctl.Examples.Cip30 as Cip30 import Ctl.Examples.Datums as Datums +import Ctl.Examples.DropTokens as DropTokens import Ctl.Examples.ECDSA as ECDSA import Ctl.Examples.MintsMultipleTokens as MintsMultipleTokens import Ctl.Examples.NativeScriptMints as NativeScriptMints @@ -72,32 +78,67 @@ main = do mbApiKey <- getBlockfrostApiKey let walletsWithBlockfrost = - wallets `Map.union` Map.fromFoldable - [ "blockfrost-nami-preview" - /\ (mkBlockfrostPreviewConfig mbApiKey) - { walletSpec = Just ConnectToNami } - /\ Nothing - , "blockfrost-gero-preview" - /\ (mkBlockfrostPreviewConfig mbApiKey) - { walletSpec = Just ConnectToGero } - /\ Nothing - , "blockfrost-eternl-preview" - /\ (mkBlockfrostPreviewConfig mbApiKey) - { walletSpec = Just ConnectToEternl } - /\ Nothing - , "blockfrost-lode-preview" - /\ (mkBlockfrostPreviewConfig mbApiKey) - { walletSpec = Just ConnectToLode } - /\ Nothing - , "blockfrost-flint-preview" - /\ (mkBlockfrostPreviewConfig mbApiKey) - { walletSpec = Just ConnectToFlint } - /\ Nothing - , "blockfrost-nufi-preview" - /\ (mkBlockfrostPreviewConfig mbApiKey) - { walletSpec = Just ConnectToNuFi } - /\ Nothing - ] + wallets `Map.union` + if isNothing mbApiKey then Map.empty + else + Map.fromFoldable + [ "blockfrost-nami-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToNami } + /\ Nothing + , "blockfrost-gero-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToGero } + /\ Nothing + , "blockfrost-eternl-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToEternl } + /\ Nothing + , "blockfrost-lode-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToLode } + /\ Nothing + , "blockfrost-flint-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToFlint } + /\ Nothing + , "blockfrost-nufi-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToNuFi } + /\ Nothing + , "blockfrost-lace-preview" + /\ (mkBlockfrostPreviewConfig mbApiKey) + { walletSpec = Just ConnectToLace } + /\ Nothing + , "blockfrost-nami-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToNami } + /\ Nothing + , "blockfrost-gero-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToGero } + /\ Nothing + , "blockfrost-eternl-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToEternl } + /\ Nothing + , "blockfrost-lode-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToLode } + /\ Nothing + , "blockfrost-flint-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToFlint } + /\ Nothing + , "blockfrost-nufi-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToNuFi } + /\ Nothing + , "blockfrost-lace-preprod" + /\ (mkBlockfrostPreprodConfig mbApiKey) + { walletSpec = Just ConnectToLace } + /\ Nothing + ] addLinks walletsWithBlockfrost examples route walletsWithBlockfrost examples @@ -120,6 +161,7 @@ wallets = Map.fromFoldable , "eternl" /\ testnetEternlConfig /\ Nothing , "lode" /\ testnetLodeConfig /\ Nothing , "nufi" /\ testnetNuFiConfig /\ Nothing + , "lace" /\ testnetLaceConfig /\ Nothing , "nami-mock" /\ testnetNamiConfig /\ Just MockNami , "gero-mock" /\ testnetGeroConfig /\ Just MockGero , "flint-mock" /\ testnetFlintConfig /\ Just MockFlint @@ -142,9 +184,20 @@ mkBlockfrostPreviewConfig apiKey = } } +mkBlockfrostPreprodConfig :: Maybe String -> ContractParams +mkBlockfrostPreprodConfig apiKey = + testnetConfig + { backendParams = mkBlockfrostBackendParams + { blockfrostConfig: blockfrostPublicPreprodServerConfig + , blockfrostApiKey: apiKey + , confirmTxDelay: Just (Seconds 30.0) + } + } + examples :: Map E2ETestName (Contract Unit) examples = Map.fromFoldable - [ "AlwaysMints" /\ AlwaysMints.contract + [ "AdditionalUtxos" /\ AdditionalUtxos.contract false + , "AlwaysMints" /\ AlwaysMints.contract , "NativeScriptMints" /\ NativeScriptMints.contract , "AlwaysSucceeds" /\ AlwaysSucceeds.contract , "AlwaysSucceedsV2" /\ AlwaysSucceedsV2.contract @@ -166,4 +219,11 @@ examples = Map.fromFoldable , "Schnorr" /\ Schnorr.contract , "ECDSA" /\ ECDSA.contract , "PaysWithDatum" /\ PaysWithDatum.contract + , "DropTokens" /\ DropTokens.contract + , "ChangeGeneration1-1" /\ + ChangeGeneration.checkChangeOutputsDistribution 1 1 3 + , "ChangeGeneration3-1" /\ + ChangeGeneration.checkChangeOutputsDistribution 3 1 5 + , "ChangeGeneration1-3" /\ + ChangeGeneration.checkChangeOutputsDistribution 1 3 7 ] diff --git a/examples/ChangeGeneration.purs b/examples/ChangeGeneration.purs new file mode 100644 index 000000000..1c416701e --- /dev/null +++ b/examples/ChangeGeneration.purs @@ -0,0 +1,77 @@ +module Ctl.Examples.ChangeGeneration (checkChangeOutputsDistribution) where + +import Prelude + +import Contract.BalanceTxConstraints (mustSendChangeWithDatum) +import Contract.Monad (Contract) +import Contract.PlutusData + ( Datum(Datum) + , OutputDatum(OutputDatum) + , PlutusData(Integer) + , unitDatum + ) +import Contract.ScriptLookups as Lookups +import Contract.Scripts (validatorHash) +import Contract.Transaction + ( _body + , _outputs + , awaitTxConfirmed + , balanceTxWithConstraints + , signTransaction + , submit + ) +import Contract.TxConstraints (TxConstraints) +import Contract.TxConstraints as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) +import Contract.Value as Value +import Contract.Wallet (ownPaymentPubKeyHashes, ownStakePubKeyHashes) +import Ctl.Examples.AlwaysSucceeds as AlwaysSucceeds +import Data.Array (fold, length, replicate, take, zip) +import Data.Lens (to, (^.)) +import Data.Maybe (Maybe(Just, Nothing)) +import Data.Newtype (unwrap) +import Data.Tuple (Tuple(Tuple)) +import JS.BigInt (fromInt) as BigInt +import Test.Spec.Assertions (shouldEqual) + +-- | A contract that creates `outputsToScript` number of outputs at a script address, +-- | `outputsToSelf` outputs going to own address, and asserts that the number of change +-- | outputs is equal to `expectedOutputs`. +checkChangeOutputsDistribution :: Int -> Int -> Int -> Contract Unit +checkChangeOutputsDistribution outputsToScript outputsToSelf expectedOutputs = + do + pkhs <- ownPaymentPubKeyHashes + skhs <- ownStakePubKeyHashes + validator <- AlwaysSucceeds.alwaysSucceedsScript + let + vhash = validatorHash validator + value = Value.lovelaceValueOf $ BigInt.fromInt 1000001 + + constraintsToSelf :: TxConstraints + constraintsToSelf = fold <<< take outputsToSelf <<< fold + $ replicate outputsToSelf + $ zip pkhs skhs <#> \(Tuple pkh mbSkh) -> case mbSkh of + Nothing -> Constraints.mustPayToPubKey pkh value + Just skh -> Constraints.mustPayToPubKeyAddress pkh skh value + + constraintsToScripts :: TxConstraints + constraintsToScripts = fold $ replicate outputsToScript + $ Constraints.mustPayToScript vhash unitDatum + Constraints.DatumWitness + value + + constraints = constraintsToSelf <> constraintsToScripts + + lookups :: Lookups.ScriptLookups + lookups = mempty + unbalancedTx <- mkUnbalancedTx lookups constraints + balancedTx <- balanceTxWithConstraints unbalancedTx + -- just to check that attaching datums works + ( mustSendChangeWithDatum $ OutputDatum $ Datum $ Integer $ BigInt.fromInt + 1000 + ) + balancedSignedTx <- signTransaction balancedTx + let outputs = balancedTx ^. to unwrap <<< _body <<< _outputs + length outputs `shouldEqual` expectedOutputs + txHash <- submit balancedSignedTx + awaitTxConfirmed txHash diff --git a/examples/Cip30.purs b/examples/Cip30.purs index 42ac0c8f8..4b6c43a75 100644 --- a/examples/Cip30.purs +++ b/examples/Cip30.purs @@ -1,5 +1,5 @@ -- | This module demonstrates the use of the CIP-30 functions --- | using an external wallet. +-- | using an external wallet. Uses `purescript-cip30` module Ctl.Examples.Cip30 ( main , example @@ -8,23 +8,22 @@ module Ctl.Examples.Cip30 import Contract.Prelude +import Cardano.Wallet.Cip30 + ( getApiVersion + , getAvailableWallets + , getIcon + , getName + ) +import Cardano.Wallet.Cip30.TypeSafe as Cip30 import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') import Contract.Monad (Contract, launchAff_, liftContractAffM, runContract) import Contract.Prim.ByteArray (rawBytesFromAscii) import Contract.Wallet - ( WalletExtension - , apiVersion - , getChangeAddress + ( getChangeAddress , getRewardAddresses , getUnusedAddresses - , getWallet - , icon - , isEnabled - , isWalletAvailable - , name , signData - , walletToWalletExtension ) import Control.Monad.Error.Class (liftMaybe) import Data.Array (head) @@ -35,25 +34,22 @@ main = example testnetNamiConfig example :: ContractParams -> Effect Unit example cfg = launchAff_ do - mWallet <- runContract cfg getWallet - let mSupportWallet = walletToWalletExtension =<< mWallet - _ <- traverse nonConfigFunctions mSupportWallet + traverse_ nonConfigFunctions =<< liftEffect getAvailableWallets runContract cfg contract -nonConfigFunctions :: WalletExtension -> Aff Unit +nonConfigFunctions :: String -> Aff Unit nonConfigFunctions extensionWallet = do log "Functions that don't depend on `Contract`" - performAndLog "isWalletAvailable" (liftEffect <<< isWalletAvailable) - performAndLog "isEnabled" isEnabled - performAndLog "apiVersion" apiVersion - performAndLog "name" name - performAndLog "icon" icon + performAndLog "isEnabled" $ Cip30.isEnabled + performAndLog "apiVersion" $ liftEffect <<< getApiVersion + performAndLog "name" $ liftEffect <<< getName + performAndLog "icon" $ liftEffect <<< getIcon where performAndLog :: forall (a :: Type) . Show a => String - -> (WalletExtension -> Aff a) + -> (String -> Aff a) -> Aff Unit performAndLog msg f = do result <- f extensionWallet @@ -70,8 +66,7 @@ contract = do mRewardAddress <- performAndLog "getRewardAddresses" getRewardAddresses rewardAddr <- liftMaybe (error "can't get reward address") $ head mRewardAddress - mChangeAddress <- performAndLog "getChangeAddress" getChangeAddress - changeAddress <- liftMaybe (error "can't get change address") mChangeAddress + changeAddress <- performAndLog "getChangeAddress" getChangeAddress _ <- performAndLog "signData changeAddress" $ signData changeAddress dataBytes void $ performAndLog "signData rewardAddress" $ signData rewardAddr dataBytes where diff --git a/examples/ContractTestUtils.purs b/examples/ContractTestUtils.purs index 21fec074b..086735028 100644 --- a/examples/ContractTestUtils.purs +++ b/examples/ContractTestUtils.purs @@ -16,9 +16,6 @@ import Contract.Address , PaymentPubKeyHash , StakePubKeyHash , getNetworkId - , getWalletAddresses - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes , payPubKeyHashBaseAddress , payPubKeyHashEnterpriseAddress ) @@ -26,7 +23,7 @@ import Contract.AuxiliaryData (setTxMetadata) import Contract.Hashing (datumHash) import Contract.Log (logInfo') import Contract.Metadata (Cip25Metadata) -import Contract.Monad (Contract, liftContractM, liftedE, liftedM) +import Contract.Monad (Contract, liftContractM, liftedM) import Contract.PlutusData (Datum, OutputDatum(OutputDatumHash)) import Contract.ScriptLookups as Lookups import Contract.Scripts (MintingPolicy) @@ -57,14 +54,21 @@ import Contract.Transaction ) import Contract.TxConstraints (DatumPresence(DatumWitness)) import Contract.TxConstraints as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Utxos (utxosAt) import Contract.Value (CurrencySymbol, TokenName, Value) import Contract.Value (lovelaceValueOf, singleton) as Value +import Contract.Wallet + ( getWalletAddresses + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) import Ctl.Examples.Helpers (mustPayToPubKeyStakeAddress) as Helpers import Data.Array (head) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Lens (view) +import Effect.Exception (throw) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt type ContractParams = { receiverPkh :: PaymentPubKeyHash @@ -98,7 +102,8 @@ mkChecks p = do , checkLossAtAddress (label senderAddress "Sender") case _ of Just { txFinalFee } -> pure (p.adaToSend + txFinalFee) - Nothing -> pure zero + Nothing -> liftEffect $ + throw "Unable to estimate expected loss in wallet" , checkTokenGainAtAddress' (label senderAddress "Sender") ( uncurry3 (\cs tn amount -> cs /\ tn /\ amount) @@ -126,8 +131,8 @@ mkChecks p = do mkContract :: ContractParams -> Contract ContractResult mkContract p = do logInfo' "Running Examples.ContractTestUtils" - ownPkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes - ownSkh <- join <<< head <$> ownStakePubKeysHashes + ownPkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes + ownSkh <- join <<< head <$> ownStakePubKeyHashes let mustPayToPubKeyStakeAddressWithDatumAndScriptRef = ownSkh # maybe Constraints.mustPayToPubKeyWithDatumAndScriptRef @@ -140,7 +145,7 @@ mkContract p = do nonAdaValue :: Value nonAdaValue = uncurry3 Value.singleton p.tokensToMint - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Helpers.mustPayToPubKeyStakeAddress p.receiverPkh p.receiverSkh adaValue @@ -152,12 +157,12 @@ mkContract p = do nonAdaValue ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy p.mintingPolicy - unbalancedTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + unbalancedTx <- mkUnbalancedTx lookups constraints unbalancedTxWithMetadata <- setTxMetadata unbalancedTx p.txMetadata - balancedTx <- liftedE $ balanceTx unbalancedTxWithMetadata + balancedTx <- balanceTx unbalancedTxWithMetadata balancedSignedTx <- signTransaction balancedTx txId <- submit balancedSignedTx diff --git a/examples/DropTokens.purs b/examples/DropTokens.purs new file mode 100644 index 000000000..6ef12aeee --- /dev/null +++ b/examples/DropTokens.purs @@ -0,0 +1,53 @@ +-- | This module can be used to get rid of extra tokens. It drops half of the +-- | tokens by sending them to a null wallet. +module Ctl.Examples.DropTokens (main, example, contract) where + +import Contract.Prelude + +import Contract.Config (ContractParams, testnetNamiConfig) +import Contract.Log (logInfo') +import Contract.Monad (Contract, launchAff_, runContract) +import Contract.ScriptLookups as Lookups +import Contract.Transaction (awaitTxConfirmed, submitTxFromConstraints) +import Contract.TxConstraints as Constraints +import Contract.TxConstraints as Helpers +import Contract.Value + ( coinToValue + , flattenNonAdaAssets + , negation + , singleton + , valueToCoin + ) +import Contract.Wallet (getWalletBalance) +import Data.Array as Array +import Test.Ctl.Fixtures (nullPaymentPubKeyHash) + +main :: Effect Unit +main = example testnetNamiConfig + +example :: ContractParams -> Effect Unit +example cfg = launchAff_ do + runContract cfg contract + +contract :: Contract Unit +contract = do + logInfo' "Running Examples.DropTokens" + logInfo' "Going to get rid of half of the tokens available" + value <- getWalletBalance <#> fold + + let + tokenValue = value <> negation (coinToValue (valueToCoin value)) + halfArray arr = Array.take (Array.length arr `div` 2) arr + -- drop half of the tokens + tokenValueHalf = + fold $ halfArray (flattenNonAdaAssets tokenValue) <#> + \(cs /\ tn /\ n) -> singleton cs tn n + + constraints :: Constraints.TxConstraints + constraints = Helpers.mustPayToPubKey nullPaymentPubKeyHash tokenValueHalf + + lookups :: Lookups.ScriptLookups + lookups = mempty + + submitTxFromConstraints lookups constraints >>= awaitTxConfirmed + logInfo' "Tx submitted successfully!" diff --git a/examples/ECDSA.js b/examples/ECDSA.js deleted file mode 100644 index 5115d95ec..000000000 --- a/examples/ECDSA.js +++ /dev/null @@ -1,14 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/validate-ecdsa.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/validate-ecdsa.plutus"), - "utf8" - ); -} -exports.validateECDSA = script; diff --git a/examples/ECDSA.purs b/examples/ECDSA.purs index 91fc5953a..5cec16613 100644 --- a/examples/ECDSA.purs +++ b/examples/ECDSA.purs @@ -65,10 +65,10 @@ prepTest = do val = Value.lovelaceValueOf one - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustPayToScript valHash unitDatum Constraints.DatumInline val @@ -99,12 +99,12 @@ testVerification txId ecdsaRed = do $ Map.keys scriptUtxos let - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs (Map.filterKeys ((unwrap >>> _.transactionId >>> eq txId)) scriptUtxos) - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustSpendScriptOutput txIn red txId' <- submitTxFromConstraints lookups constraints logInfo' $ "Submitted ECDSA test verification tx: " <> show txId' @@ -129,7 +129,15 @@ testECDSA txId = do } getValidator :: Maybe Validator -getValidator = do +getValidator = decodeTextEnvelope validateECDSA >>= plutusScriptV2FromEnvelope >>> map wrap -foreign import validateECDSA :: String +validateECDSA :: String +validateECDSA = + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59080459080101000032323232332232323232323232323233223232323232223232322323253353232323500222253353335734666ed000400c00808007c40804cd5ce249167369676e617475726520636865636b206661696c65640001f3333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd406806cd5d0a80619a80d00d9aba1500b33501a01c35742a014666aa03ceb94074d5d0a804999aa80f3ae501d35742a01066a03404a6ae85401cccd54078099d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40c1d69aba150023031357426ae8940088c98c80d4cd5ce01b01a81989aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8183ad35742a00460626ae84d5d1280111931901a99ab9c036035033135573ca00226ea8004d5d09aba2500223263203133573806406205e26aae7940044dd50009aba1500533501a75c6ae854010ccd540780888004d5d0a801999aa80f3ae200135742a00460486ae84d5d1280111931901699ab9c02e02d02b135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860286ae84d5d1280211931900f99ab9c02001f01d3333573466e1cd55cea803a40004666444246660020080060046eb8d5d0a8039bae35742a00c6eb8d5d09aba2500623263201e33573803e03c0386666ae68cdc39aab9d37540109000100e91931900e99ab9c01e01d01b101c13263201c3357389201035054350001c135573ca00226ea80044d5d1280089aab9e5001137540022464460046eb0004c8004d5405888cccd55cf80092805119a80498021aba100230033574400402c464646666ae68cdc39aab9d5002480008cc8848cc00400c008c030d5d0a80118029aba135744a004464c6402c66ae7005c0580504d55cf280089baa0012323232323333573466e1cd55cea8022400046666444424666600200a0080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c054d5d0a80119a80780a1aba135744a004464c6403666ae7007006c0644d55cf280089baa00135742a008666aa010eb9401cd5d0a8019919191999ab9a3370ea0029002119091118010021aba135573ca00646666ae68cdc3a80124004464244460020086eb8d5d09aab9e500423333573466e1d400d20002122200323263201d33573803c03a03603403226aae7540044dd50009aba1500233500b75c6ae84d5d1280111931900b99ab9c018017015135744a00226ae8940044d55cf280089baa0011335500175ceb44488c88c008dd5800990009aa80991191999aab9f00225008233500733221233001003002300635573aa004600a6aae794008c010d5d100180a09aba100111220021221223300100400312232323333573466e1d4005200023212230020033005357426aae79400c8cccd5cd19b8750024800884880048c98c8048cd5ce00980900800789aab9d500113754002464646666ae68cdc3a800a400c46424444600800a600e6ae84d55cf280191999ab9a3370ea004900211909111180100298049aba135573ca00846666ae68cdc3a801a400446424444600200a600e6ae84d55cf280291999ab9a3370ea00890001190911118018029bae357426aae7940188c98c8048cd5ce00980900800780700689aab9d500113754002464646666ae68cdc39aab9d5002480008cc8848cc00400c008c014d5d0a8011bad357426ae8940088c98c8038cd5ce00780700609aab9e5001137540024646666ae68cdc39aab9d5001480008dd71aba135573ca004464c6401866ae700340300284dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6402a66ae7005805404c04804404003c0380344d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263200e33573801e01c01801626aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931900599ab9c00c00b009008135573aa00226ea8004488c8c8cccd5cd19b87500148010848880048cccd5cd19b875002480088c84888c00c010c018d5d09aab9e500423333573466e1d400d20002122200223263200c33573801a01801401201026aae7540044dd50009191999ab9a3370ea0029001100291999ab9a3370ea0049000100291931900419ab9c009008006005135573a6ea800448800848800526120014910350543100112323001001223300330020020011" +} +""" diff --git a/examples/ExUnits.js b/examples/ExUnits.js new file mode 100644 index 000000000..8a2cbb76f --- /dev/null +++ b/examples/ExUnits.js @@ -0,0 +1,2 @@ +export const exUnits = `{"cborHex":"59079f59079c0100003233223232323232323232323232323233223232323232222323253353232301b0023333573466e1cd55cea801a4000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd405805cd5d0a80619a80b00b9aba1500b33501601835742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02c0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01801781689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03002f02d135573ca00226ea8004d5d09aba2500223263202b33573805805605226aae7940044dd50009aba1500533501675c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c028027025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00660206ae84d5d1280191931900c99ab9c01a019017375a008202e264c6402e66ae712401134661696c656420766572696669636174696f6e00017135573ca00226ea800448c88c008dd6000990009aa80b911999aab9f0012500a233500930043574200460066ae880080508c8c8cccd5cd19b8735573aa004900011991091980080180118061aba150023005357426ae8940088c98c8050cd5ce00a80a00909aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180a9aba1500233500f014357426ae8940088c98c8064cd5ce00d00c80b89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403666ae7007006c06406005c4d55cea80089baa00135742a00466a016eb8d5d09aba2500223263201533573802c02a02626ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355014223233335573e0044a010466a00e66442466002006004600c6aae754008c014d55cf280118021aba200301213574200222440042442446600200800624464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002200923333573466e1d40092000200923263200633573800e00c00800626aae74dd5000a4c24002921035054310032001355003225335333573466e2400520000040031004130023370200290010910010910008891918008009119801980100100081","description":"","type":"PlutusScriptV2"} +`; diff --git a/examples/ExUnits.purs b/examples/ExUnits.purs new file mode 100644 index 000000000..6340d689f --- /dev/null +++ b/examples/ExUnits.purs @@ -0,0 +1,128 @@ +module Ctl.Examples.ExUnits where + +import Contract.Prelude + +import Contract.Address (scriptHashAddress) +import Contract.Config (ContractParams, testnetNamiConfig) +import Contract.Credential (Credential(PubKeyCredential)) +import Contract.Log (logInfo') +import Contract.Monad (Contract, launchAff_, runContract) +import Contract.PlutusData + ( Redeemer(Redeemer) + , toData + , unitDatum + ) +import Contract.ScriptLookups as Lookups +import Contract.Scripts + ( Validator(Validator) + , ValidatorHash + , validatorHash + ) +import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV2FromEnvelope) +import Contract.Transaction + ( TransactionHash + , _input + , awaitTxConfirmed + , lookupTxHash + , submitTxFromConstraints + ) +import Contract.TxConstraints (TxConstraints) +import Contract.TxConstraints as Constraints +import Contract.Utxos (utxosAt) +import Contract.Value as Value +import Contract.Wallet (ownStakePubKeyHashes) +import Control.Monad.Error.Class (liftMaybe) +import Data.Array (head) +import Data.Lens (view) +import Effect.Exception (error) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt + +main :: Effect Unit +main = example testnetNamiConfig + +contract :: Contract Unit +contract = do + logInfo' "Running Examples.ExUnits" + validator <- exUnitsScript + let vhash = validatorHash validator + logInfo' "Attempt to lock value" + txId <- payToExUnits vhash + awaitTxConfirmed txId + logInfo' "Tx submitted successfully, Try to spend locked values" + spendFromExUnits (BigInt.fromInt 1000) vhash validator txId + +example :: ContractParams -> Effect Unit +example cfg = launchAff_ do + runContract cfg contract + +payToExUnits :: ValidatorHash -> Contract TransactionHash +payToExUnits vhash = do + -- Send to own stake credential. This is used to test mustPayToScriptAddress. + mbStakeKeyHash <- join <<< head <$> ownStakePubKeyHashes + let + constraints :: TxConstraints + constraints = + case mbStakeKeyHash of + Nothing -> + Constraints.mustPayToScript vhash unitDatum + Constraints.DatumWitness + $ Value.lovelaceValueOf + $ BigInt.fromInt 2_000_000 + Just stakeKeyHash -> + Constraints.mustPayToScriptAddress vhash + (PubKeyCredential $ unwrap stakeKeyHash) + unitDatum + Constraints.DatumWitness + $ Value.lovelaceValueOf + $ BigInt.fromInt 2_000_000 + + lookups :: Lookups.ScriptLookups + lookups = mempty + + submitTxFromConstraints lookups constraints + +-- | ExUnits script loops a given number of iterations provided as redeemer. +spendFromExUnits + :: BigInt + -> ValidatorHash + -> Validator + -> TransactionHash + -> Contract Unit +spendFromExUnits iters vhash validator txId = do + -- Use own stake credential if available + mbStakeKeyHash <- join <<< head <$> ownStakePubKeyHashes + let + scriptAddress = + scriptHashAddress vhash (PubKeyCredential <<< unwrap <$> mbStakeKeyHash) + utxos <- utxosAt scriptAddress + txInput <- + liftM + ( error + ( "The id " + <> show txId + <> " does not have output locked at: " + <> show scriptAddress + ) + ) + (view _input <$> head (lookupTxHash txId utxos)) + let + lookups :: Lookups.ScriptLookups + lookups = Lookups.validator validator + <> Lookups.unspentOutputs utxos + + constraints :: TxConstraints + constraints = + Constraints.mustSpendScriptOutput txInput (Redeemer $ toData iters) + + spendTxId <- submitTxFromConstraints lookups constraints + awaitTxConfirmed spendTxId + logInfo' "Successfully spent locked values." + +exUnitsScript :: Contract Validator +exUnitsScript = do + liftMaybe (error "Error decoding exUnits") do + envelope <- decodeTextEnvelope exUnits + Validator <$> plutusScriptV2FromEnvelope envelope + +foreign import exUnits :: String diff --git a/examples/Helpers.purs b/examples/Helpers.purs index 461903a66..9f5dbb644 100644 --- a/examples/Helpers.purs +++ b/examples/Helpers.purs @@ -31,7 +31,7 @@ mkCurrencySymbol -> Contract (MintingPolicy /\ CurrencySymbol) mkCurrencySymbol mintingPolicy = do mp <- mintingPolicy - cs <- liftContractM "Cannot get cs" $ Value.scriptCurrencySymbol mp + let cs = Value.scriptCurrencySymbol mp pure (mp /\ cs) mkTokenName :: String -> Contract TokenName @@ -44,7 +44,7 @@ mustPayToPubKeyStakeAddress . PaymentPubKeyHash -> Maybe StakePubKeyHash -> Value - -> Constraints.TxConstraints i o + -> Constraints.TxConstraints mustPayToPubKeyStakeAddress pkh Nothing = Constraints.mustPayToPubKey pkh mustPayToPubKeyStakeAddress pkh (Just skh) = @@ -57,7 +57,7 @@ mustPayToPubKeyStakeAddressWithDatum -> Datum -> DatumPresence -> Value - -> Constraints.TxConstraints i o + -> Constraints.TxConstraints mustPayToPubKeyStakeAddressWithDatum pkh Nothing datum dtp = Constraints.mustPayToPubKeyWithDatum pkh datum dtp mustPayToPubKeyStakeAddressWithDatum pkh (Just skh) datum dtp = @@ -69,7 +69,7 @@ mustPayToPubKeyStakeAddressWithScriptRef -> Maybe StakePubKeyHash -> ScriptRef -> Value - -> Constraints.TxConstraints i o + -> Constraints.TxConstraints mustPayToPubKeyStakeAddressWithScriptRef pkh Nothing scriptRef = Constraints.mustPayToPubKeyWithScriptRef pkh scriptRef mustPayToPubKeyStakeAddressWithScriptRef pkh (Just skh) scriptRef = diff --git a/examples/IncludeDatum.js b/examples/IncludeDatum.js deleted file mode 100644 index 5ce016be7..000000000 --- a/examples/IncludeDatum.js +++ /dev/null @@ -1,15 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/include-datum.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/include-datum.plutus"), - "utf8" - ); -} - -exports.includeDatum = script; diff --git a/examples/IncludeDatum.purs b/examples/IncludeDatum.purs index 5e38ad374..5a21a4094 100644 --- a/examples/IncludeDatum.purs +++ b/examples/IncludeDatum.purs @@ -33,9 +33,9 @@ import Contract.Utxos (utxosAt) import Contract.Value as Value import Control.Monad.Error.Class (liftMaybe) import Data.Array (head) -import Data.BigInt as BigInt import Data.Lens (view) import Effect.Exception (error) +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -58,7 +58,7 @@ datum = Datum $ Integer $ BigInt.fromInt 42 payToIncludeDatum :: ValidatorHash -> Contract TransactionHash payToIncludeDatum vhash = let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = ( Constraints.mustPayToScript vhash datum Constraints.DatumWitness $ Value.lovelaceValueOf @@ -66,7 +66,7 @@ payToIncludeDatum vhash = ) <> Constraints.mustIncludeDatum datum - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty in submitTxFromConstraints lookups constraints @@ -82,11 +82,11 @@ spendFromIncludeDatum vhash validator txId = do txInput <- liftContractM "no locked output at address" (view _input <$> head (lookupTxHash txId utxos)) let - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs utxos - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustSpendScriptOutput txInput unitRedeemer <> Constraints.mustIncludeDatum datum @@ -94,11 +94,19 @@ spendFromIncludeDatum vhash validator txId = do awaitTxConfirmed spendTxId logInfo' "Successfully spent locked values." -foreign import includeDatum :: String - -- | checks if the datum equals 42 only42Script :: Contract Validator -only42Script = +only42Script = do liftMaybe (error "Error decoding includeDatum") do envelope <- decodeTextEnvelope includeDatum Validator <$> plutusScriptV1FromEnvelope envelope + +includeDatum :: String +includeDatum = + """ +{ + "type": "PlutusScriptV1", + "description": "include-datum", + "cborHex": "55540100002225333573466e1cdd6801a40a82930b01" +} +""" diff --git a/examples/KeyWallet/Cip30.purs b/examples/KeyWallet/Cip30.purs index 0f1470d1d..00c0ebab2 100644 --- a/examples/KeyWallet/Cip30.purs +++ b/examples/KeyWallet/Cip30.purs @@ -7,7 +7,7 @@ module Ctl.Examples.KeyWallet.Cip30 import Contract.Prelude import Contract.Log (logInfo') -import Contract.Monad (Contract) +import Contract.Monad (Contract, liftedM) import Contract.Prim.ByteArray (RawBytes) import Contract.Wallet ( getChangeAddress @@ -15,10 +15,9 @@ import Contract.Wallet , getUnusedAddresses , signData ) -import Control.Monad.Error.Class (liftMaybe, try) +import Control.Monad.Error.Class (try) import Ctl.Examples.KeyWallet.Internal.Cip30Contract (runKeyWalletContract_) import Data.Array (head) -import Effect.Exception (error) main :: Effect Unit main = runKeyWalletContract_ mkContract @@ -26,15 +25,13 @@ main = runKeyWalletContract_ mkContract mkContract :: RawBytes -> Contract Unit mkContract dat = do logInfo' "Running Examples.KeyWallet.Cip30" - logInfo' "Funtions that depend on `Contract`" + logInfo' "Functions that depend on `Contract`" _ <- performAndLog "getUnusedAddresses" getUnusedAddresses - mChangeAddress <- performAndLog "getChangeAddress" getChangeAddress - changeAddress <- liftMaybe (error "can't get change address") mChangeAddress + changeAddress <- performAndLog "getChangeAddress" getChangeAddress _ <- performAndLog "signData changeAddress" $ try $ signData changeAddress dat - rewardAddress <- performAndLog "getRewardAddresses" getRewardAddresses - rewardAddr <- liftMaybe (error "can't get change address") $ head - rewardAddress - _ <- performAndLog "signData rewardAddress" $ try $ signData rewardAddr dat + rewardAddress <- performAndLog "getRewardAddresses" $ + liftedM "Could not get reward address" (head <$> getRewardAddresses) + _ <- performAndLog "signData rewardAddress" $ try $ signData rewardAddress dat pure unit where diff --git a/examples/KeyWallet/Internal/Cip30HtmlForm.js b/examples/KeyWallet/Internal/Cip30HtmlForm.js index ab840e979..e0a8f878f 100644 --- a/examples/KeyWallet/Internal/Cip30HtmlForm.js +++ b/examples/KeyWallet/Internal/Cip30HtmlForm.js @@ -38,35 +38,39 @@ code { `; -exports.logError = error => () => { - console.log(error); -}; +export function logError(error) { + return () => { + console.log(error); + }; +} -exports.mkForm = handler => () => { - window.document.body.insertAdjacentHTML("beforeend", form); - const formEl = window.document.querySelector("form"); - const fieldsEl = window.document.querySelector("fieldset"); - const resultEl = window.document.querySelector("code"); - formEl.addEventListener("submit", event => { - event.preventDefault(); - resultEl.replaceChildren(); +export function mkForm(handler) { + return () => { + window.document.body.insertAdjacentHTML("beforeend", form); + const formEl = window.document.querySelector("form"); + const fieldsEl = window.document.querySelector("fieldset"); + const resultEl = window.document.querySelector("code"); + formEl.addEventListener("submit", event => { + event.preventDefault(); + resultEl.replaceChildren(); - const data = new FormData(formEl); - const input = Object.fromEntries(data); - fieldsEl.setAttribute("disabled", "disabled"); + const data = new FormData(formEl); + const input = Object.fromEntries(data); + fieldsEl.setAttribute("disabled", "disabled"); - const log = color => text => () => { - const line = document.createElement("div"); - line.style.color = color; - line.textContent = text; - resultEl.append(line); - }; + const log = color => text => () => { + const line = document.createElement("div"); + line.style.color = color; + line.textContent = text; + resultEl.append(line); + }; - const unlock = () => { - fieldsEl.setAttribute("disabled", "disabled"); - fieldsEl.removeAttribute("disabled"); - }; + const unlock = () => { + fieldsEl.setAttribute("disabled", "disabled"); + fieldsEl.removeAttribute("disabled"); + }; - handler(input)(log)(unlock)(); - }); -}; + handler(input)(log)(unlock)(); + }); + }; +} diff --git a/examples/KeyWallet/Internal/Pkh2PkhContract.purs b/examples/KeyWallet/Internal/Pkh2PkhContract.purs index 8040bb5a0..53bb3d9b3 100644 --- a/examples/KeyWallet/Internal/Pkh2PkhContract.purs +++ b/examples/KeyWallet/Internal/Pkh2PkhContract.purs @@ -22,13 +22,13 @@ import Ctl.Examples.KeyWallet.Internal.Pkh2PkhHtmlForm import Ctl.Internal.Deserialization.Keys (privateKeyFromBytes) import Ctl.Internal.Serialization.Hash (ed25519KeyHashFromBech32) import Ctl.Internal.Types.RawBytes (hexToRawBytes) -import Data.BigInt (BigInt) -import Data.BigInt (fromString) as BigInt import Data.Log.Formatter.Pretty (prettyFormatter) import Data.Log.Level (LogLevel) import Data.Log.Message (Message) import Effect.Class (class MonadEffect) import Effect.Exception (Error, error, message) +import JS.BigInt (BigInt) +import JS.BigInt (fromString) as BigInt runKeyWalletContract_ :: (PaymentPubKeyHash -> BigInt -> Unlock -> Contract Unit) -> Effect Unit diff --git a/examples/KeyWallet/Internal/Pkh2PkhHtmlForm.js b/examples/KeyWallet/Internal/Pkh2PkhHtmlForm.js index 62ecf2176..5fa0eff2c 100644 --- a/examples/KeyWallet/Internal/Pkh2PkhHtmlForm.js +++ b/examples/KeyWallet/Internal/Pkh2PkhHtmlForm.js @@ -40,35 +40,39 @@ code { `; -exports.logError = error => () => { - console.log(error); -}; +export function logError(error) { + return () => { + console.log(error); + }; +} -exports.mkForm = handler => () => { - window.document.body.insertAdjacentHTML("beforeend", form); - const formEl = window.document.querySelector("form"); - const fieldsEl = window.document.querySelector("fieldset"); - const resultEl = window.document.querySelector("code"); - formEl.addEventListener("submit", event => { - event.preventDefault(); - resultEl.replaceChildren(); +export function mkForm(handler) { + return () => { + window.document.body.insertAdjacentHTML("beforeend", form); + const formEl = window.document.querySelector("form"); + const fieldsEl = window.document.querySelector("fieldset"); + const resultEl = window.document.querySelector("code"); + formEl.addEventListener("submit", event => { + event.preventDefault(); + resultEl.replaceChildren(); - const data = new FormData(formEl); - const input = Object.fromEntries(data); - fieldsEl.setAttribute("disabled", "disabled"); + const data = new FormData(formEl); + const input = Object.fromEntries(data); + fieldsEl.setAttribute("disabled", "disabled"); - const log = color => text => () => { - const line = document.createElement("div"); - line.style.color = color; - line.textContent = text; - resultEl.append(line); - }; + const log = color => text => () => { + const line = document.createElement("div"); + line.style.color = color; + line.textContent = text; + resultEl.append(line); + }; - const unlock = () => { - fieldsEl.setAttribute("disabled", "disabled"); - fieldsEl.removeAttribute("disabled"); - }; + const unlock = () => { + fieldsEl.setAttribute("disabled", "disabled"); + fieldsEl.removeAttribute("disabled"); + }; - handler(input)(log)(unlock)(); - }); -}; + handler(input)(log)(unlock)(); + }); + }; +} diff --git a/examples/KeyWallet/MintsAndSendsToken.purs b/examples/KeyWallet/MintsAndSendsToken.purs index 1bcf557cd..c71a6ca6e 100644 --- a/examples/KeyWallet/MintsAndSendsToken.purs +++ b/examples/KeyWallet/MintsAndSendsToken.purs @@ -26,14 +26,14 @@ main = runKeyWalletContract_ \pkh lovelace unlock -> do tn <- Helpers.mkTokenName "TheToken" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustMintValue (Value.singleton cs tn one) , Constraints.mustPayToPubKey pkh (Value.lovelaceValueOf lovelace <> Value.singleton cs tn one) ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txId <- submitTxFromConstraints lookups constraints diff --git a/examples/KeyWallet/Pkh2Pkh.purs b/examples/KeyWallet/Pkh2Pkh.purs index 1b6fabfae..e3808d28f 100644 --- a/examples/KeyWallet/Pkh2Pkh.purs +++ b/examples/KeyWallet/Pkh2Pkh.purs @@ -18,11 +18,11 @@ main = runKeyWalletContract_ \pkh lovelace unlock -> do logInfo' "Running Examples.KeyWallet.Pkh2Pkh" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustPayToPubKey pkh $ Value.lovelaceValueOf lovelace - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty txId <- submitTxFromConstraints lookups constraints diff --git a/examples/KeyWallet/SignMultiple.purs b/examples/KeyWallet/SignMultiple.purs index 0713da495..fc998ca5a 100644 --- a/examples/KeyWallet/SignMultiple.purs +++ b/examples/KeyWallet/SignMultiple.purs @@ -3,7 +3,7 @@ module Ctl.Examples.KeyWallet.SignMultiple where import Contract.Prelude import Contract.Log (logInfo') -import Contract.Monad (Contract, liftedE, throwContractError) +import Contract.Monad (Contract, throwContractError) import Contract.ScriptLookups as Lookups import Contract.Transaction ( BalancedSignedTransaction @@ -14,6 +14,7 @@ import Contract.Transaction , withBalancedTxs ) import Contract.TxConstraints as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Value (lovelaceValueOf) as Value import Control.Monad.Reader (asks) import Ctl.Examples.KeyWallet.Internal.Pkh2PkhContract (runKeyWalletContract_) @@ -34,15 +35,15 @@ main = runKeyWalletContract_ \pkh lovelace unlock -> do logInfo' "Running Examples.KeyWallet.SignMultiple" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustPayToPubKey pkh $ Value.lovelaceValueOf lovelace - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty - unbalancedTx0 <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - unbalancedTx1 <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + unbalancedTx0 <- mkUnbalancedTx lookups constraints + unbalancedTx1 <- mkUnbalancedTx lookups constraints txIds <- withBalancedTxs [ unbalancedTx0, unbalancedTx1 ] $ \balancedTxs -> do locked <- getLockedInputs diff --git a/examples/Lose7Ada.js b/examples/Lose7Ada.js deleted file mode 100644 index f2e299ed7..000000000 --- a/examples/Lose7Ada.js +++ /dev/null @@ -1,15 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/always-fails.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/always-fails.plutus"), - "utf8" - ); -} - -exports.alwaysFails = script; diff --git a/examples/Lose7Ada.purs b/examples/Lose7Ada.purs index f705f0a78..43cbd25b9 100644 --- a/examples/Lose7Ada.purs +++ b/examples/Lose7Ada.purs @@ -17,7 +17,7 @@ import Contract.Address (scriptHashAddress) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') import Contract.Monad (Contract, launchAff_, runContract) -import Contract.PlutusData (PlutusData, unitDatum, unitRedeemer) +import Contract.PlutusData (unitDatum, unitRedeemer) import Contract.ScriptLookups as Lookups import Contract.Scripts (Validator(Validator), ValidatorHash, validatorHash) import Contract.TextEnvelope @@ -32,14 +32,15 @@ import Contract.Transaction ) import Contract.TxConstraints (TxConstraints) import Contract.TxConstraints as Constraints -import Contract.Utxos (getWalletBalance, utxosAt) +import Contract.Utxos (utxosAt) import Contract.Value as Value +import Contract.Wallet (getWalletBalance) import Control.Monad.Error.Class (liftMaybe) -import Data.BigInt as BigInt import Data.Foldable (fold) import Data.Functor ((<$>)) import Data.Map as Map import Effect.Exception (error) +import JS.BigInt as BigInt import Test.Spec.Assertions (shouldEqual) main :: Effect Unit @@ -60,14 +61,14 @@ example cfg = launchAff_ do payToAlwaysFails :: ValidatorHash -> Contract TransactionHash payToAlwaysFails vhash = do let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToScript vhash unitDatum Constraints.DatumWitness $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -91,11 +92,11 @@ spendFromAlwaysFails vhash validator txId = do ) (fst <$> find hasTransactionId (Map.toUnfoldable utxos :: Array _)) let - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs utxos - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustSpendScriptOutput txInput unitRedeemer <> Constraints.mustNotBeValid @@ -114,10 +115,18 @@ spendFromAlwaysFails vhash validator txId = do hasTransactionId (TransactionInput tx /\ _) = tx.transactionId == txId -foreign import alwaysFails :: String - alwaysFailsScript :: Contract Validator -alwaysFailsScript = +alwaysFailsScript = do liftMaybe (error "Error decoding alwaysFails") do envelope <- decodeTextEnvelope alwaysFails Validator <$> plutusScriptV1FromEnvelope envelope + +alwaysFails :: String +alwaysFails = + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "581e581c01000033223232222350040071235002353003001498498480048005" +} +""" diff --git a/examples/ManyAssets.purs b/examples/ManyAssets.purs new file mode 100644 index 000000000..70a6bccf4 --- /dev/null +++ b/examples/ManyAssets.purs @@ -0,0 +1,68 @@ +-- | Mints many assets at once. A reproduction for https://github.com/Plutonomicon/cardano-transaction-lib/issues/1441 +module Ctl.Examples.ManyAssets + ( contract + , example + , main + , mkContractWithAssertions + ) where + +import Contract.Prelude + +import Contract.Config (ContractParams, testnetNamiConfig) +import Contract.Log (logInfo') +import Contract.Monad + ( Contract + , launchAff_ + , liftContractM + , liftedM + , runContract + ) +import Contract.ScriptLookups as Lookups +import Contract.Transaction (awaitTxConfirmed, submitTxFromConstraints) +import Contract.TxConstraints as Constraints +import Contract.Value (singleton) as Value +import Contract.Wallet (getWalletUtxos) +import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) as Helpers +import Ctl.Examples.PlutusV2.Scripts.AlwaysMints (alwaysMintsPolicyV2) +import Data.Array (head, range) as Array +import Data.Map (toUnfoldable) as Map + +main :: Effect Unit +main = example testnetNamiConfig + +example :: ContractParams -> Effect Unit +example cfg = launchAff_ do + runContract cfg contract + +contract :: Contract Unit +contract = + mkContractWithAssertions "Examples.ManyAssets" + +mkContractWithAssertions + :: String + -> Contract Unit +mkContractWithAssertions exampleName = do + logInfo' ("Running " <> exampleName) + utxos <- liftedM "Failed to get UTxOs from wallet" getWalletUtxos + oref <- + liftContractM "Utxo set is empty" + (fst <$> Array.head (Map.toUnfoldable utxos :: Array _)) + + mp /\ cs <- Helpers.mkCurrencySymbol (alwaysMintsPolicyV2) + tns <- for (Array.range 0 600) \i -> Helpers.mkTokenName $ "CTLNFT" <> show i + + let + constraints :: Constraints.TxConstraints + constraints = + fold + (tns <#> \tn -> Constraints.mustMintValue (Value.singleton cs tn one)) + <> Constraints.mustSpendPubKeyOutput oref + + lookups :: Lookups.ScriptLookups + lookups = Lookups.mintingPolicy mp + <> Lookups.unspentOutputs utxos + + txHash <- submitTxFromConstraints lookups constraints + logInfo' $ "Tx ID: " <> show txHash + awaitTxConfirmed txHash + logInfo' "Tx submitted successfully!" diff --git a/examples/MintsMultipleTokens.js b/examples/MintsMultipleTokens.js index 74ad17f73..911a34f94 100644 --- a/examples/MintsMultipleTokens.js +++ b/examples/MintsMultipleTokens.js @@ -1,24 +1,17 @@ -/* global BROWSER_RUNTIME */ +export const redeemer1Script = `{ + "cborHex": "59099959099601000032323233223322333222323233322232323232333222333222333333332222222233223333322222333322223322332233223332223322332233223322332232323232323232323232323232323232323232323232323232335001011223304849010e77726f6e672072656465656d657200333504b04a00233504904f4800848888c014cc00cc010008c01800494cd4c12400441484d4060d4c144cd5ce2481025064000524988c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c26603ca002a0042600c6ae8540084c050d5d09aba25001135573ca00226ea80084d405d262323232323232323232323232323232323232323232323333573466e1cd55cea80aa40004a0044a02e9309999999999817a800a8012801a8022802a8032803a8042804a805099a81080b1aba15012133502001635742a0202666aa032eb94060d5d0a8070999aa80c3ae501735742a018266a03a0426ae8540284cd4070cd54078085d69aba15008133501675a6ae8540184cd4069d71aba150041335019335501b75c0346ae8540084c080d5d09aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135573ca00226ea80084d40592623232323232323333573466e1cd55cea802a40004a0044a00e930998102800a8010980b9aba1500213005357426ae8940044d55cf280089baa0021350154988c8c8c8c8c8c8c8c8cccd5cd19b8735573aa00e90001280112804a4c2666046a002a004a006260106ae8540104ccd54029d728049aba15002133500775c6ae84d5d1280089aba25001135573ca00226ea80084d40512623232323232323333573466e1cd55cea802a40004a0044a00e930998112800a8010980a1aba150021335005012357426ae8940044d55cf280089baa002135013498488c8c8c8c8c8c8cccd5cd19b87500448000940089401126135025500113006357426aae79400c4cccd5cd19b875001480089408c9401126135573aa00226ea80084d404d261335500175ceb444888c8c8c004dd58019a80090008918009aa82811191919191919191999aab9f0085505125300212001056350022200135001220023555505712223300321300a357440124266a0a8a00aa600624002266aa0a8a002a004260106aae7540084c018d55cf280089aba10011223232323232323333573466e1cd55cea802a40004a0044a00e93099a8122800a801099a8038031aba150021335007005357426ae8940044d55cf280089baa002135010498488c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c266a04ea002a004266a01000c6ae8540084c020d5d09aba25001135573ca00226ea80084d403d261223232323232323333573466e1cd55cea802a40004a0044a00e93099a8122800a801099a8038031aba1500213007357426ae8940044d55cf280089baa00213500e498488c8c8c8c8c8c8c8cccd5cd19b87500548010940a8940092613333573466e1d4011200225002250044984d40a540044c018d5d09aab9e500313333573466e1d4005200025027250044984d55cea80089baa00213500d4988c8c8c8cccd5cd19b875002480088108940092613333573466e1d400520002040250034984d55ce9baa00213500b498488c8c8c004dd60019a80090008918009aa824911999aab9f00125047233504630063574200460066ae88008120800444888c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c266aa096a002a0042600e6ae8540084c014d5d09aba25001135573ca00226ea80084d402926232323232323232323232323232323333573466e1d4029200625002250044984c0c140044c038d5d09aab9e500b13333573466e1d401d200425002250044984c0ad40044c030d5d09aab9e500813333573466e1d4011200225002250044984c09d40044c02cd5d09aab9e500513333573466e1d4005200025003250064984d55cea80189812a80089bae357426aae7940044dd500109a803a4c4646464646464646464646464646464646464646464646464646666ae68cdc3a80aa401840844a0049309999ab9a3370ea028900510211280124c26666ae68cdc3a809a40104a0044a00c9309981e2800a80109bae35742a00426eb4d5d09aba25001135573ca02426666ae68cdc3a8072400c4a0044a00c9309981c2800a80109bae35742a00426eb8d5d09aba25001135573ca01a26666ae68cdc3a804a40084a0044a00c9309981ba800a801098069aba150021375c6ae84d5d1280089aab9e500813333573466e1d4011200225002250044984c0cd40044c020d5d09aab9e500513333573466e1d4005200025003250064984d55cea80189816a800898021aba135573ca00226ea80084d40192623232323232323232323232323333573466e1d4021200225002250084984ccc0e140054009400c4dd69aba150041375a6ae8540084dd69aba135744a00226ae8940044d55cf280289999ab9a3370ea0029000128019280324c26aae75400c4c0c540044c010d5d09aab9e50011375400426a00a93119191919191919191999ab9a3370ea0089001128011280224c2606ca00226eb8d5d09aab9e500513333573466e1d4005200025003250064984d55cea80189819a80089bae357426aae7940044dd500109a80224c46464646464646666ae68cdc39aab9d500548000940089401d26133026500150021300635742a00426eb4d5d09aba25001135573ca00226ea80084d400d2623232323333573466e1cd55cea801240004a0044a0089309bae357426aae7940044dd500109a80124c24c4424660020060044002444444444424666666666600201601401201000e00c00a0080060044002442466002006004400244424666002008006004400244246600200600440022424460040062244002240022442466002006004240022442466002006004240022442466002006004240022424446006008224440042244400224002424444600800a424444600600a424444600400a424444600200a40024424660020060044002424444444600e01044244444446600c012010424444444600a010244444440082444444400644244444446600401201044244444446600201201040024244600400644424466600200a00800640024244600400642446002006400244a66a600c0022010266ae7000801c4800488ccd5cd19baf00200100600512001122002122001200123750002224a0082244004244244660020080062400224002400222442466002006004224002224646002002446600660040040022222466a0044246600246a00644600400646a00644600200600224646460020024466006600400400244246a6008246a60080066a0060020021", + "description": "redeemer-1", + "type": "PlutusScriptV1" +}`; -let redeemerInt1, redeemerInt2, redeemerInt3; +export const redeemer2Script = `{ + "cborHex": "59099959099601000032323233223322333222323233322232323232333222333222333333332222222233223333322222333322223322332233223332223322332233223322332232323232323232323232323232323232323232323232323232335001011223304849010e77726f6e672072656465656d657200333504b04a00233504904f4801048888c014cc00cc010008c01800494cd4c12400441484d4060d4c144cd5ce2481025064000524988c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c26603ca002a0042600c6ae8540084c050d5d09aba25001135573ca00226ea80084d405d262323232323232323232323232323232323232323232323333573466e1cd55cea80aa40004a0044a02e9309999999999817a800a8012801a8022802a8032803a8042804a805099a81080b1aba15012133502001635742a0202666aa032eb94060d5d0a8070999aa80c3ae501735742a018266a03a0426ae8540284cd4070cd54078085d69aba15008133501675a6ae8540184cd4069d71aba150041335019335501b75c0346ae8540084c080d5d09aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135573ca00226ea80084d40592623232323232323333573466e1cd55cea802a40004a0044a00e930998102800a8010980b9aba1500213005357426ae8940044d55cf280089baa0021350154988c8c8c8c8c8c8c8c8cccd5cd19b8735573aa00e90001280112804a4c2666046a002a004a006260106ae8540104ccd54029d728049aba15002133500775c6ae84d5d1280089aba25001135573ca00226ea80084d40512623232323232323333573466e1cd55cea802a40004a0044a00e930998112800a8010980a1aba150021335005012357426ae8940044d55cf280089baa002135013498488c8c8c8c8c8c8cccd5cd19b87500448000940089401126135025500113006357426aae79400c4cccd5cd19b875001480089408c9401126135573aa00226ea80084d404d261335500175ceb444888c8c8c004dd58019a80090008918009aa82811191919191919191999aab9f0085505125300212001056350022200135001220023555505712223300321300a357440124266a0a8a00aa600624002266aa0a8a002a004260106aae7540084c018d55cf280089aba10011223232323232323333573466e1cd55cea802a40004a0044a00e93099a8122800a801099a8038031aba150021335007005357426ae8940044d55cf280089baa002135010498488c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c266a04ea002a004266a01000c6ae8540084c020d5d09aba25001135573ca00226ea80084d403d261223232323232323333573466e1cd55cea802a40004a0044a00e93099a8122800a801099a8038031aba1500213007357426ae8940044d55cf280089baa00213500e498488c8c8c8c8c8c8c8cccd5cd19b87500548010940a8940092613333573466e1d4011200225002250044984d40a540044c018d5d09aab9e500313333573466e1d4005200025027250044984d55cea80089baa00213500d4988c8c8c8cccd5cd19b875002480088108940092613333573466e1d400520002040250034984d55ce9baa00213500b498488c8c8c004dd60019a80090008918009aa824911999aab9f00125047233504630063574200460066ae88008120800444888c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c266aa096a002a0042600e6ae8540084c014d5d09aba25001135573ca00226ea80084d402926232323232323232323232323232323333573466e1d4029200625002250044984c0c140044c038d5d09aab9e500b13333573466e1d401d200425002250044984c0ad40044c030d5d09aab9e500813333573466e1d4011200225002250044984c09d40044c02cd5d09aab9e500513333573466e1d4005200025003250064984d55cea80189812a80089bae357426aae7940044dd500109a803a4c4646464646464646464646464646464646464646464646464646666ae68cdc3a80aa401840844a0049309999ab9a3370ea028900510211280124c26666ae68cdc3a809a40104a0044a00c9309981e2800a80109bae35742a00426eb4d5d09aba25001135573ca02426666ae68cdc3a8072400c4a0044a00c9309981c2800a80109bae35742a00426eb8d5d09aba25001135573ca01a26666ae68cdc3a804a40084a0044a00c9309981ba800a801098069aba150021375c6ae84d5d1280089aab9e500813333573466e1d4011200225002250044984c0cd40044c020d5d09aab9e500513333573466e1d4005200025003250064984d55cea80189816a800898021aba135573ca00226ea80084d40192623232323232323232323232323333573466e1d4021200225002250084984ccc0e140054009400c4dd69aba150041375a6ae8540084dd69aba135744a00226ae8940044d55cf280289999ab9a3370ea0029000128019280324c26aae75400c4c0c540044c010d5d09aab9e50011375400426a00a93119191919191919191999ab9a3370ea0089001128011280224c2606ca00226eb8d5d09aab9e500513333573466e1d4005200025003250064984d55cea80189819a80089bae357426aae7940044dd500109a80224c46464646464646666ae68cdc39aab9d500548000940089401d26133026500150021300635742a00426eb4d5d09aba25001135573ca00226ea80084d400d2623232323333573466e1cd55cea801240004a0044a0089309bae357426aae7940044dd500109a80124c24c4424660020060044002444444444424666666666600201601401201000e00c00a0080060044002442466002006004400244424666002008006004400244246600200600440022424460040062244002240022442466002006004240022442466002006004240022442466002006004240022424446006008224440042244400224002424444600800a424444600600a424444600400a424444600200a40024424660020060044002424444444600e01044244444446600c012010424444444600a010244444440082444444400644244444446600401201044244444446600201201040024244600400644424466600200a00800640024244600400642446002006400244a66a600c0022010266ae7000801c4800488ccd5cd19baf00200100600512001122002122001200123750002224a0082244004244244660020080062400224002400222442466002006004224002224646002002446600660040040022222466a0044246600246a00644600400646a00644600200600224646460020024466006600400400244246a6008246a60080066a0060020021", + "description": "redeemer-2", + "type": "PlutusScriptV1" +}`; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - redeemerInt1 = require("Scripts/redeemer1.plutus"); - redeemerInt2 = require("Scripts/redeemer2.plutus"); - redeemerInt3 = require("Scripts/redeemer3.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - const readScript = name => - fs.readFileSync( - path.resolve(__dirname, `../../fixtures/scripts/${name}.plutus`), - "utf8" - ); - redeemerInt1 = readScript("redeemer1"); - redeemerInt2 = readScript("redeemer2"); - redeemerInt3 = readScript("redeemer3"); -} - -exports.redeemerInt1 = redeemerInt1; -exports.redeemerInt2 = redeemerInt2; -exports.redeemerInt3 = redeemerInt3; +export const redeemer3Script = `{ + "cborHex": "59099959099601000032323233223322333222323233322232323232333222333222333333332222222233223333322222333322223322332233223332223322332233223322332232323232323232323232323232323232323232323232323232335001011223304849010e77726f6e672072656465656d657200333504b04a00233504904f4801848888c014cc00cc010008c01800494cd4c12400441484d4060d4c144cd5ce2481025064000524988c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c26603ca002a0042600c6ae8540084c050d5d09aba25001135573ca00226ea80084d405d262323232323232323232323232323232323232323232323333573466e1cd55cea80aa40004a0044a02e9309999999999817a800a8012801a8022802a8032803a8042804a805099a81080b1aba15012133502001635742a0202666aa032eb94060d5d0a8070999aa80c3ae501735742a018266a03a0426ae8540284cd4070cd54078085d69aba15008133501675a6ae8540184cd4069d71aba150041335019335501b75c0346ae8540084c080d5d09aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135573ca00226ea80084d40592623232323232323333573466e1cd55cea802a40004a0044a00e930998102800a8010980b9aba1500213005357426ae8940044d55cf280089baa0021350154988c8c8c8c8c8c8c8c8cccd5cd19b8735573aa00e90001280112804a4c2666046a002a004a006260106ae8540104ccd54029d728049aba15002133500775c6ae84d5d1280089aba25001135573ca00226ea80084d40512623232323232323333573466e1cd55cea802a40004a0044a00e930998112800a8010980a1aba150021335005012357426ae8940044d55cf280089baa002135013498488c8c8c8c8c8c8cccd5cd19b87500448000940089401126135025500113006357426aae79400c4cccd5cd19b875001480089408c9401126135573aa00226ea80084d404d261335500175ceb444888c8c8c004dd58019a80090008918009aa82811191919191919191999aab9f0085505125300212001056350022200135001220023555505712223300321300a357440124266a0a8a00aa600624002266aa0a8a002a004260106aae7540084c018d55cf280089aba10011223232323232323333573466e1cd55cea802a40004a0044a00e93099a8122800a801099a8038031aba150021335007005357426ae8940044d55cf280089baa002135010498488c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c266a04ea002a004266a01000c6ae8540084c020d5d09aba25001135573ca00226ea80084d403d261223232323232323333573466e1cd55cea802a40004a0044a00e93099a8122800a801099a8038031aba1500213007357426ae8940044d55cf280089baa00213500e498488c8c8c8c8c8c8c8cccd5cd19b87500548010940a8940092613333573466e1d4011200225002250044984d40a540044c018d5d09aab9e500313333573466e1d4005200025027250044984d55cea80089baa00213500d4988c8c8c8cccd5cd19b875002480088108940092613333573466e1d400520002040250034984d55ce9baa00213500b498488c8c8c004dd60019a80090008918009aa824911999aab9f00125047233504630063574200460066ae88008120800444888c8c8c8c8c8c8cccd5cd19b8735573aa00a90001280112803a4c266aa096a002a0042600e6ae8540084c014d5d09aba25001135573ca00226ea80084d402926232323232323232323232323232323333573466e1d4029200625002250044984c0c140044c038d5d09aab9e500b13333573466e1d401d200425002250044984c0ad40044c030d5d09aab9e500813333573466e1d4011200225002250044984c09d40044c02cd5d09aab9e500513333573466e1d4005200025003250064984d55cea80189812a80089bae357426aae7940044dd500109a803a4c4646464646464646464646464646464646464646464646464646666ae68cdc3a80aa401840844a0049309999ab9a3370ea028900510211280124c26666ae68cdc3a809a40104a0044a00c9309981e2800a80109bae35742a00426eb4d5d09aba25001135573ca02426666ae68cdc3a8072400c4a0044a00c9309981c2800a80109bae35742a00426eb8d5d09aba25001135573ca01a26666ae68cdc3a804a40084a0044a00c9309981ba800a801098069aba150021375c6ae84d5d1280089aab9e500813333573466e1d4011200225002250044984c0cd40044c020d5d09aab9e500513333573466e1d4005200025003250064984d55cea80189816a800898021aba135573ca00226ea80084d40192623232323232323232323232323333573466e1d4021200225002250084984ccc0e140054009400c4dd69aba150041375a6ae8540084dd69aba135744a00226ae8940044d55cf280289999ab9a3370ea0029000128019280324c26aae75400c4c0c540044c010d5d09aab9e50011375400426a00a93119191919191919191999ab9a3370ea0089001128011280224c2606ca00226eb8d5d09aab9e500513333573466e1d4005200025003250064984d55cea80189819a80089bae357426aae7940044dd500109a80224c46464646464646666ae68cdc39aab9d500548000940089401d26133026500150021300635742a00426eb4d5d09aba25001135573ca00226ea80084d400d2623232323333573466e1cd55cea801240004a0044a0089309bae357426aae7940044dd500109a80124c24c4424660020060044002444444444424666666666600201601401201000e00c00a0080060044002442466002006004400244424666002008006004400244246600200600440022424460040062244002240022442466002006004240022442466002006004240022442466002006004240022424446006008224440042244400224002424444600800a424444600600a424444600400a424444600200a40024424660020060044002424444444600e01044244444446600c012010424444444600a010244444440082444444400644244444446600401201044244444446600201201040024244600400644424466600200a00800640024244600400642446002006400244a66a600c0022010266ae7000801c4800488ccd5cd19baf00200100600512001122002122001200123750002224a0082244004244244660020080062400224002400222442466002006004224002224646002002446600660040040022222466a0044246600246a00644600400646a00644600200600224646460020024466006600400400244246a6008246a60080066a0060020021", + "description": "redeemer-3", + "type": "PlutusScriptV1" +}`; diff --git a/examples/MintsMultipleTokens.purs b/examples/MintsMultipleTokens.purs index bb57734c2..eb731b40d 100644 --- a/examples/MintsMultipleTokens.purs +++ b/examples/MintsMultipleTokens.purs @@ -30,8 +30,8 @@ import Ctl.Examples.Helpers ( mkCurrencySymbol , mkTokenName ) as Helpers -import Data.BigInt (fromInt) as BigInt import Effect.Exception (error) +import JS.BigInt (fromInt) as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -46,7 +46,7 @@ contract = do mp3 /\ cs3 <- Helpers.mkCurrencySymbol mintingPolicyRdmrInt3 let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustMintValueWithRedeemer (Redeemer $ Integer (BigInt.fromInt 1)) @@ -59,7 +59,7 @@ contract = do (Value.singleton cs3 tn1 one <> Value.singleton cs3 tn2 one) ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp1 <> Lookups.mintingPolicy mp2 @@ -74,24 +74,24 @@ example :: ContractParams -> Effect Unit example cfg = launchAff_ do runContract cfg contract -foreign import redeemerInt1 :: String -foreign import redeemerInt2 :: String -foreign import redeemerInt3 :: String +foreign import redeemer1Script :: String +foreign import redeemer2Script :: String +foreign import redeemer3Script :: String mintingPolicyRdmrInt1 :: Contract MintingPolicy -mintingPolicyRdmrInt1 = - liftMaybe (error "Error decoding redeemerInt1") do - envelope <- decodeTextEnvelope redeemerInt3 +mintingPolicyRdmrInt1 = do + liftMaybe (error "Error decoding redeemer1Script") do + envelope <- decodeTextEnvelope redeemer1Script PlutusMintingPolicy <$> plutusScriptV1FromEnvelope envelope mintingPolicyRdmrInt2 :: Contract MintingPolicy -mintingPolicyRdmrInt2 = - liftMaybe (error "Error decoding redeemerInt2") do - envelope <- decodeTextEnvelope redeemerInt3 +mintingPolicyRdmrInt2 = do + liftMaybe (error "Error decoding redeemer2Script") do + envelope <- decodeTextEnvelope redeemer2Script PlutusMintingPolicy <$> plutusScriptV1FromEnvelope envelope mintingPolicyRdmrInt3 :: Contract MintingPolicy -mintingPolicyRdmrInt3 = - liftMaybe (error "Error decoding redeemerInt3") do - envelope <- decodeTextEnvelope redeemerInt3 +mintingPolicyRdmrInt3 = do + liftMaybe (error "Error decoding redeemer3Script") do + envelope <- decodeTextEnvelope redeemer3Script PlutusMintingPolicy <$> plutusScriptV1FromEnvelope envelope diff --git a/examples/MultipleRedeemers.js b/examples/MultipleRedeemers.js index 7d8855f2b..0f3fd9df9 100644 --- a/examples/MultipleRedeemers.js +++ b/examples/MultipleRedeemers.js @@ -1,24 +1,17 @@ -/* global BROWSER_RUNTIME */ +export const redeemerIs1Script = `{ + "description": "validator that checks whether redeemer is 1", + "cborHex": "4e4d0100002223375e0046ea120021", + "type": "PlutusScriptV1" +}`; -let vredeemerInt1, vredeemerInt2, vredeemerInt3; +export const redeemerIs2Script = `{ + "description": "validator that checks whether redeemer is 2", + "cborHex": "4e4d0100002223375e0046ea120041", + "type": "PlutusScriptV1" +}`; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - vredeemerInt1 = require("Scripts/redeemer1-validator.plutus"); - vredeemerInt2 = require("Scripts/redeemer2-validator.plutus"); - vredeemerInt3 = require("Scripts/redeemer3-validator.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - const readScript = name => - fs.readFileSync( - path.resolve(__dirname, `../../fixtures/scripts/${name}.plutus`), - "utf8" - ); - vredeemerInt1 = readScript("redeemer1-validator"); - vredeemerInt2 = readScript("redeemer2-validator"); - vredeemerInt3 = readScript("redeemer3-validator"); -} - -exports.vredeemerInt1 = vredeemerInt1; -exports.vredeemerInt2 = vredeemerInt2; -exports.vredeemerInt3 = vredeemerInt3; +export const redeemerIs3Script = `{ + "description": "validator that checks whether redeemer is 3", + "cborHex": "4e4d0100002223375e0046ea120061", + "type": "PlutusScriptV1" +}`; diff --git a/examples/MultipleRedeemers.purs b/examples/MultipleRedeemers.purs index 6ed5c9d0f..f5bef4b0b 100644 --- a/examples/MultipleRedeemers.purs +++ b/examples/MultipleRedeemers.purs @@ -37,11 +37,11 @@ import Ctl.Examples.PlutusV2.ReferenceInputsAndScripts ( mintAlwaysMintsV2ToTheScript ) import Ctl.Examples.PlutusV2.Scripts.AlwaysMints (alwaysMintsPolicyV2) -import Data.BigInt as BigInt import Data.List as List import Data.Map as Map import Data.Traversable (sequence) import Effect.Exception (error) +import JS.BigInt as BigInt contract :: Contract Unit contract = do @@ -59,10 +59,10 @@ contract = do lcs <- sequence $ spendLockedByIntOutputParams <$> [ (validator1 /\ 1), (validator2 /\ 2) ] - let lookups = (mconcat $ snd <$> lcs) :: Lookups.ScriptLookups Void + let lookups = (mconcat $ snd <$> lcs) :: Lookups.ScriptLookups let constraints = - (mconcat $ fst <$> lcs) :: Constraints.TxConstraints Void Void + (mconcat $ fst <$> lcs) :: Constraints.TxConstraints txHash <- submitTxFromConstraints (Lookups.mintingPolicy mintingPolicy <> lookups) constraints @@ -82,8 +82,8 @@ contractWithMintRedeemers = do --- Unlock tokens and mint other tokens with redeemer lcs <- spendLockedByIntOutputParams (validator1 /\ 1) - let unlockingLookups = snd lcs :: Lookups.ScriptLookups Void - let unlockingConstraints = fst lcs :: Constraints.TxConstraints Void Void + let unlockingLookups = snd lcs :: Lookups.ScriptLookups + let unlockingConstraints = fst lcs :: Constraints.TxConstraints let mintingConstraints = ( Constraints.mustMintValueWithRedeemer @@ -100,8 +100,8 @@ contractWithMintRedeemers = do spendLockedByIntOutputParams :: Tuple Validator Int -> Contract - ( Tuple (Constraints.TxConstraints Void Void) - (Lookups.ScriptLookups Void) + ( Tuple (Constraints.TxConstraints) + (Lookups.ScriptLookups) ) spendLockedByIntOutputParams (validator /\ redeemerVal) = do let vhash = validatorHash validator @@ -118,26 +118,27 @@ spendLockedByIntOutputParams (validator /\ redeemerVal) = do pure $ constraints /\ (Lookups.unspentOutputs utxo <> Lookups.validator validator) ---- Importing validation scripts - -foreign import vredeemerInt1 :: String -foreign import vredeemerInt2 :: String -foreign import vredeemerInt3 :: String +foreign import redeemerIs1Script :: String +foreign import redeemerIs2Script :: String +foreign import redeemerIs3Script :: String -- | checks whether redeemer is 1 redeemerIs1Validator :: Contract Validator -redeemerIs1Validator = liftMaybe (error "Error decoding vredeemerInt1") do - envelope <- decodeTextEnvelope vredeemerInt1 - Validator <$> plutusScriptV1FromEnvelope envelope +redeemerIs1Validator = do + liftMaybe (error "Error decoding redeemerIs1Script") do + envelope <- decodeTextEnvelope redeemerIs1Script + Validator <$> plutusScriptV1FromEnvelope envelope -- | checks whether redeemer is 2 redeemerIs2Validator :: Contract Validator -redeemerIs2Validator = liftMaybe (error "Error decoding vredeemerInt2") do - envelope <- decodeTextEnvelope vredeemerInt2 - Validator <$> plutusScriptV1FromEnvelope envelope +redeemerIs2Validator = do + liftMaybe (error "Error decoding redeemerIs2Script") do + envelope <- decodeTextEnvelope redeemerIs2Script + Validator <$> plutusScriptV1FromEnvelope envelope -- | checks whether redeemer is 3 redeemerIs3Validator :: Contract Validator -redeemerIs3Validator = liftMaybe (error "Error decoding vredeemerInt3") do - envelope <- decodeTextEnvelope vredeemerInt3 - Validator <$> plutusScriptV1FromEnvelope envelope +redeemerIs3Validator = do + liftMaybe (error "Error decoding redeemerIs3Script") do + envelope <- decodeTextEnvelope redeemerIs3Script + Validator <$> plutusScriptV1FromEnvelope envelope diff --git a/examples/NativeScriptMints.purs b/examples/NativeScriptMints.purs index 8bbe3be46..eb3cc0d0d 100644 --- a/examples/NativeScriptMints.purs +++ b/examples/NativeScriptMints.purs @@ -6,8 +6,6 @@ import Contract.Prelude import Contract.Address ( PaymentPubKeyHash - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes ) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') @@ -21,14 +19,18 @@ import Contract.Transaction (awaitTxConfirmed, submitTxFromConstraints) import Contract.TxConstraints as Constraints import Contract.Value (CurrencySymbol, TokenName) import Contract.Value as Value +import Contract.Wallet + ( ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) import Ctl.Examples.Helpers ( mkCurrencySymbol , mkTokenName , mustPayToPubKeyStakeAddress ) as Helpers import Data.Array (head) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt +import JS.BigInt (BigInt) +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -37,19 +39,19 @@ contract :: Contract Unit contract = do logInfo' "Running Examples.NativeScriptMints" - pkh <- liftedM "Couldn't get own pkh" $ head <$> ownPaymentPubKeysHashes + pkh <- liftedM "Couldn't get own pkh" $ head <$> ownPaymentPubKeyHashes mp /\ cs <- Helpers.mkCurrencySymbol <<< pure $ pkhPolicy pkh tn <- Helpers.mkTokenName "NSToken" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintCurrencyUsingNativeScript (nsPolicy pkh) tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txId <- submitTxFromConstraints lookups constraints @@ -61,16 +63,16 @@ contract = do toSelfContract :: CurrencySymbol -> TokenName -> BigInt -> Contract Unit toSelfContract cs tn amount = do - pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes - skh <- join <<< head <$> ownStakePubKeysHashes + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes + skh <- join <<< head <$> ownStakePubKeyHashes let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Helpers.mustPayToPubKeyStakeAddress pkh skh $ Value.singleton cs tn $ amount - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty txId <- submitTxFromConstraints lookups constraints diff --git a/examples/OneShotMinting.js b/examples/OneShotMinting.js index 583fda109..532b17cff 100644 --- a/examples/OneShotMinting.js +++ b/examples/OneShotMinting.js @@ -1,15 +1,5 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/one-shot-minting.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/one-shot-minting.plutus"), - "utf8" - ); -} - -exports.oneShotMinting = script; +export const oneShotMinting = `{ + "type": "PlutusScriptV1", + "description": "one-shot-minting", + "cborHex": "5908d75908d401000033232332233223232323232323232323232323232323232323222223232323232325335533533355300b120013232123300122333500522002002001002350012200112330012253350021022100101f2325335333573466e3cd400488008d4014880080840804ccd5cd19b873500122001350052200102102010203500122002355001222222222200a101e101f1326353357389201115574786f206e6f7420636f6e73756d65640001b0191533553355335323301d50220013550012222222222007101e22135002222533500415335333573466e3c00cd401c88cccd40048c98d4cd5ce2481024c680002302120012326353357389201024c68000230212326353357389201024c680002302102402315335333573466e3c00802409008c4ccd5cd19b870014800809008c408c408c8840944078407c4c98d4cd5ce24811357726f6e6720616d6f756e74206d696e7465640001b019101b135001220023333573466e1cd55cea8022400046644246600200600464646464646464646464646666ae68cdc39aab9d500a480008cccccccccc888888888848cccccccccc00402c02802402001c01801401000c008cd40648c8c8cccd5cd19b8735573aa0049000119910919800801801180d9aba15002301e357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854028cd4064068d5d0a804999aa80e3ae501b35742a010666aa038eb9406cd5d0a80399a80c8101aba15006335019335502302175a6ae854014c8c8c8cccd5cd19b8735573aa00490001199109198008018011919191999ab9a3370e6aae754009200023322123300100300233502675a6ae854008c09cd5d09aba2500223263533573805a05c05805626aae7940044dd50009aba150023232323333573466e1cd55cea8012400046644246600200600466a04ceb4d5d0a80118139aba135744a004464c6a66ae700b40b80b00ac4d55cf280089baa001357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854010cd4065d71aba15003335019335502375c40026ae854008c060d5d09aba2500223263533573804a04c04804626ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150043232323333573466e1d400520062321222230040053018357426aae79400c8cccd5cd19b875002480108c848888c008014c068d5d09aab9e500423333573466e1d400d20022321222230010053011357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6a66ae7008008407c07807407006c4d55cea80089baa001357426ae8940108c98d4cd5ce00c80d00c00b98048031bae006135573ca00226ea8004c8004d5406088448894cd40044d400c88004884ccd401488008c010008ccd54c01c480040140100048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931a99ab9c012013011010135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98d4cd5ce00800880780709baa0011232230023758002640026aa02c446666aae7c0049405c8cd4058c010d5d080118019aba200201023232323333573466e1cd55cea801a40004666444246660020080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c044d5d0a80119a8060081aba135744a004464c6a66ae7005005404c0484d55cf280089baa00135742a006666aa00eeb94018d5d0a80119a8043ae357426ae8940088c98d4cd5ce00800880780709aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02844646666aae7c008940588cd4054cd5405cc018d55cea80118029aab9e500230043574400601e26ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263533573801c01e01a01801626aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6a66ae7003803c03403002c0284d55cea80089baa0012323333573466e1d40052002200e23333573466e1d40092000200e23263533573801401601201000e26aae74dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6a66ae7004804c04404003c03803403002c0284d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263533573801601801401201026aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931a99ab9c008009007006005135573aa00226ea800444888c8c8cccd5cd19b8735573aa0049000119aa80818031aba150023005357426ae8940088c98d4cd5ce00400480380309aab9e5001137540029324903505431001200132001355007222533500110022213500222330073330080020060010033200135500622225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b1233300100800300200600312200212200111220021221223300100400311221233001003002112323001001223300330020020014c1074643544c4e46540001" +}`; diff --git a/examples/OneShotMinting.purs b/examples/OneShotMinting.purs index f9914f158..b37bb08e2 100644 --- a/examples/OneShotMinting.purs +++ b/examples/OneShotMinting.purs @@ -13,7 +13,6 @@ module Ctl.Examples.OneShotMinting import Contract.Prelude -import Contract.Address (Address, getWalletAddresses) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') import Contract.Monad @@ -34,10 +33,8 @@ import Contract.Scripts ) import Contract.Test.Assert ( ContractCheck - , Labeled - , checkLossAtAddress - , checkTokenGainAtAddress' - , label + , checkLossInWallet + , checkTokenGainInWallet' , runChecks ) import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV1FromEnvelope) @@ -47,17 +44,16 @@ import Contract.Transaction , submitTxFromConstraintsReturningFee ) import Contract.TxConstraints as Constraints -import Contract.Utxos (utxosAt) import Contract.Value (CurrencySymbol, TokenName) import Contract.Value (singleton) as Value +import Contract.Wallet (getWalletUtxos) import Control.Monad.Error.Class (liftMaybe) import Control.Monad.Trans.Class (lift) import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) as Helpers -import Data.Array (head) import Data.Array (head, singleton) as Array -import Data.BigInt (BigInt) import Data.Map (toUnfoldable) as Map -import Effect.Exception (error) +import Effect.Exception (error, throw) +import JS.BigInt (BigInt) main :: Effect Unit main = example testnetNamiConfig @@ -67,21 +63,16 @@ example cfg = launchAff_ do runContract cfg contract mkChecks - :: Address - -> (CurrencySymbol /\ TokenName /\ BigInt) + :: (CurrencySymbol /\ TokenName /\ BigInt) -> Array (ContractCheck { txFinalFee :: BigInt }) -mkChecks ownAddress nft = - let - labeledOwnAddress :: Labeled Address - labeledOwnAddress = label ownAddress "ownAddress" - in - [ checkTokenGainAtAddress' labeledOwnAddress nft - - , checkLossAtAddress labeledOwnAddress - case _ of - Nothing -> pure zero - Just { txFinalFee } -> pure txFinalFee - ] +mkChecks nft = + [ checkTokenGainInWallet' nft + , checkLossInWallet + case _ of + Nothing -> liftEffect $ throw $ + "Unable to estimate expected loss in wallet" + Just { txFinalFee } -> pure txFinalFee + ] contract :: Contract Unit contract = @@ -93,10 +84,7 @@ mkContractWithAssertions -> Contract Unit mkContractWithAssertions exampleName mkMintingPolicy = do logInfo' ("Running " <> exampleName) - - ownAddress <- liftedM "Failed to get own address" $ head <$> - getWalletAddresses - utxos <- utxosAt ownAddress + utxos <- liftedM "Failed to get UTxOs from wallet" getWalletUtxos oref <- liftContractM "Utxo set is empty" (fst <$> Array.head (Map.toUnfoldable utxos :: Array _)) @@ -105,17 +93,17 @@ mkContractWithAssertions exampleName mkMintingPolicy = do tn <- Helpers.mkTokenName "CTLNFT" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue (Value.singleton cs tn one) <> Constraints.mustSpendPubKeyOutput oref - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp <> Lookups.unspentOutputs utxos - let checks = mkChecks ownAddress (cs /\ tn /\ one) + let checks = mkChecks (cs /\ tn /\ one) void $ runChecks checks $ lift do { txHash, txFinalFee } <- submitTxFromConstraintsReturningFee lookups constraints @@ -124,8 +112,6 @@ mkContractWithAssertions exampleName mkMintingPolicy = do logInfo' "Tx submitted successfully!" pure { txFinalFee } -foreign import oneShotMinting :: String - oneShotMintingPolicy :: TransactionInput -> Contract MintingPolicy oneShotMintingPolicy = map PlutusMintingPolicy <<< oneShotMintingPolicyScript @@ -147,3 +133,5 @@ mkOneShotMintingPolicy unappliedMintingPolicy oref = mintingPolicyArgs = Array.singleton (toData oref) in applyArgs unappliedMintingPolicy mintingPolicyArgs + +foreign import oneShotMinting :: String diff --git a/examples/OtherTypeTextEnvelope.js b/examples/OtherTypeTextEnvelope.js deleted file mode 100644 index 2affb4b24..000000000 --- a/examples/OtherTypeTextEnvelope.js +++ /dev/null @@ -1,17 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/other-type-text-envelope.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve( - __dirname, - "../../fixtures/scripts/other-type-text-envelope.plutus" - ), - "utf8" - ); -} -exports.otherTypeTextEnvelope = script; diff --git a/examples/OtherTypeTextEnvelope.purs b/examples/OtherTypeTextEnvelope.purs deleted file mode 100644 index 725be0b5b..000000000 --- a/examples/OtherTypeTextEnvelope.purs +++ /dev/null @@ -1,3 +0,0 @@ -module Ctl.Examples.OtherTypeTextEnvelope where - -foreign import otherTypeTextEnvelope :: String diff --git a/examples/PaysWithDatum.purs b/examples/PaysWithDatum.purs index 6405d3f07..1cc9efded 100644 --- a/examples/PaysWithDatum.purs +++ b/examples/PaysWithDatum.purs @@ -10,9 +10,6 @@ import Contract.Prelude import Contract.Address ( Address - , getWalletAddresses - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes ) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Hashing (datumHash) @@ -29,8 +26,8 @@ import Contract.Test.Assert ( ContractAssertionFailure(CustomFailure) , ContractCheck , assertContract + , assertNewUtxosAtAddress , assertionToCheck - , checkNewUtxosAtAddress , label , runChecks ) @@ -44,10 +41,15 @@ import Contract.TxConstraints (DatumPresence(DatumInline, DatumWitness)) import Contract.TxConstraints as Constraints import Contract.Value (Value) import Contract.Value (lovelaceValueOf) as Value +import Contract.Wallet + ( getWalletAddresses + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) import Control.Monad.Trans.Class (lift) import Ctl.Examples.Helpers (mustPayToPubKeyStakeAddressWithDatum) import Data.Array (head) -import Data.BigInt (fromInt) as BigInt +import JS.BigInt (fromInt) as BigInt type ContractResult = { address :: Address @@ -66,8 +68,8 @@ contract :: Contract Unit contract = do logInfo' "Running Examples.PaysWithDatum" - pkh <- liftedM "Could not get own PKH" (head <$> ownPaymentPubKeysHashes) - skh <- join <<< head <$> ownStakePubKeysHashes + pkh <- liftedM "Could not get own PKH" (head <$> ownPaymentPubKeyHashes) + skh <- join <<< head <$> ownStakePubKeyHashes address <- liftedM "Could not get own address" (head <$> getWalletAddresses) let @@ -77,12 +79,12 @@ contract = do value :: Value value = Value.lovelaceValueOf (BigInt.fromInt 2_000_000) - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mustPayToPubKeyStakeAddressWithDatum pkh skh datum DatumWitness value <> mustPayToPubKeyStakeAddressWithDatum pkh skh datum DatumInline value - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty void $ runChecks checks $ lift do @@ -104,7 +106,7 @@ assertTxCreatesOutputWithInlineDatum = assertionToCheck assertionFailure :: ContractAssertionFailure assertionFailure = CustomFailure "Could not find output with given inline datum" - checkNewUtxosAtAddress (label address "ownAddress") txHash + assertNewUtxosAtAddress (label address "ownAddress") txHash \outputs -> assertContract assertionFailure $ hasOutputWithOutputDatum (OutputDatum datum) outputs @@ -118,7 +120,7 @@ assertTxCreatesOutputWithDatumHash = assertionToCheck assertionFailure :: ContractAssertionFailure assertionFailure = CustomFailure "Could not find output with given datum hash" - checkNewUtxosAtAddress (label address "ownAddress") txHash + assertNewUtxosAtAddress (label address "ownAddress") txHash \outputs -> assertContract assertionFailure $ hasOutputWithOutputDatum (OutputDatumHash datumHash) outputs diff --git a/examples/Pkh2Pkh.purs b/examples/Pkh2Pkh.purs index 81f8e3ef4..85b3752d7 100644 --- a/examples/Pkh2Pkh.purs +++ b/examples/Pkh2Pkh.purs @@ -5,7 +5,6 @@ module Ctl.Examples.Pkh2Pkh (main, contract, example) where import Contract.Prelude -import Contract.Address (ownPaymentPubKeysHashes, ownStakePubKeysHashes) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') import Contract.Monad (Contract, launchAff_, liftedM, runContract) @@ -16,8 +15,9 @@ import Contract.Transaction ) import Contract.TxConstraints as Constraints import Contract.Value as Value +import Contract.Wallet (ownPaymentPubKeyHashes, ownStakePubKeyHashes) import Data.Array (head) -import Data.BigInt as BigInt +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -25,17 +25,17 @@ main = example testnetNamiConfig contract :: Contract Unit contract = do logInfo' "Running Examples.Pkh2Pkh" - pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes skh <- liftedM "Failed to get own SKH" $ join <<< head <$> - ownStakePubKeysHashes + ownStakePubKeyHashes let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustPayToPubKeyAddress pkh skh $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty txId <- submitTxFromConstraints lookups constraints diff --git a/examples/PlutusV2/InlineDatum.js b/examples/PlutusV2/InlineDatum.js index 367b1170b..030fa63ee 100644 --- a/examples/PlutusV2/InlineDatum.js +++ b/examples/PlutusV2/InlineDatum.js @@ -1,18 +1,5 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/check-datum-is-inline.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve( - __dirname, - "../../fixtures/scripts/check-datum-is-inline.plutus" - ), - "utf8" - ); -} - -exports.checkDatumIsInline = script; +export const checkDatumIsInline = `{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59088859088501000032332232323233223232323232323232323322323232323232322223232533532325335001101b13357389211d556e657870656374656420646174756d206174206f776e20696e7075740001a323253335002153335001101c2101c2101c2153335002101c21333573466ebc00800407807484074854ccd400840708407484ccd5cd19b8f00200101e01d323500122220023235001220013553353500222350022222222222223333500d2501e2501e2501e233355302d12001321233001225335002210031001002501e2350012253355335333573466e3cd400888008d4010880080b40b04ccd5cd19b873500222001350042200102d02c102c1350220031502100d21123001002162001300a0053333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4054058d5d0a80619a80a80b1aba1500b33501501735742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02a0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01901881689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03203102d135573ca00226ea8004d5d09aba2500223263202b33573805c05a05226aae7940044dd50009aba1500533501575c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c02a029025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00460206ae84d5d1280111931900c99ab9c01c01b017101a132632018335738921035054350001a135573ca00226ea800448c88c008dd6000990009aa80d111999aab9f0012501c233501b30043574200460066ae8800805c8c8c8cccd5cd19b8735573aa004900011991091980080180118069aba150023005357426ae8940088c98c8054cd5ce00c00b80989aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180b1aba1500233500e015357426ae8940088c98c8068cd5ce00e80e00c09aab9e5001137540026ae854010ccd54025d728041aba150033232323333573466e1d400520042300b357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403866ae7007c0780680640604d55cea80089baa00135742a00466a014eb8d5d09aba2500223263201633573803203002826ae8940044d5d1280089aab9e500113754002424446004008266aa002eb9d6889119118011bab00132001355016223233335573e0044a032466a03066442466002006004600c6aae754008c014d55cf280118021aba200301413574200224464646666ae68cdc3a800a400046a00e600a6ae84d55cf280191999ab9a3370ea00490011280391931900919ab9c01501401000f135573aa00226ea800448488c00800c44880048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01301200e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00f00e00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00680600409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00b00a80880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae7003c0380280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801801600e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7003403002001c0184d55cea80089baa0012323333573466e1d40052002200623333573466e1d40092000200623263200633573801201000800626aae74dd5000a4c24400424400224002920103505431003200135500322112225335001135003220012213335005220023004002333553007120010050040011122002122122330010040031123230010012233003300200200101" +}`; diff --git a/examples/PlutusV2/InlineDatum.purs b/examples/PlutusV2/InlineDatum.purs index 2b30191db..d2f2eca5f 100644 --- a/examples/PlutusV2/InlineDatum.purs +++ b/examples/PlutusV2/InlineDatum.purs @@ -38,9 +38,9 @@ import Contract.TxConstraints as Constraints import Contract.Utxos (utxosAt) import Contract.Value as Value import Control.Monad.Error.Class (liftMaybe) -import Data.BigInt as BigInt import Data.Map as Map import Effect.Exception (error) +import JS.BigInt as BigInt import Test.Spec.Assertions (shouldEqual) main :: Effect Unit @@ -67,14 +67,14 @@ payToCheckDatumIsInline vhash = do datum :: Datum datum = Datum plutusData - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToScript vhash datum Constraints.DatumInline $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -101,11 +101,11 @@ spendFromCheckDatumIsInline vhash validator txId = do redeemer :: Redeemer redeemer = Redeemer plutusData - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs utxos - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustSpendScriptOutput txInput redeemer @@ -124,14 +124,14 @@ payToCheckDatumIsInlineWrong vhash = do datum :: Datum datum = Datum plutusData - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToScript vhash datum Constraints.DatumWitness $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -161,10 +161,10 @@ readFromCheckDatumIsInline vhash txId = do hasTransactionId (TransactionInput tx /\ _) = tx.transactionId == txId -foreign import checkDatumIsInline :: String - checkDatumIsInlineScript :: Contract Validator -checkDatumIsInlineScript = +checkDatumIsInlineScript = do liftMaybe (error "Error decoding checkDatumIsInline") do envelope <- decodeTextEnvelope checkDatumIsInline Validator <$> plutusScriptV2FromEnvelope envelope + +foreign import checkDatumIsInline :: String diff --git a/examples/PlutusV2/OneShotMinting.js b/examples/PlutusV2/OneShotMinting.js index d3c979a85..8a572af4a 100644 --- a/examples/PlutusV2/OneShotMinting.js +++ b/examples/PlutusV2/OneShotMinting.js @@ -1,18 +1,5 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/one-shot-minting-v2.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve( - __dirname, - "../../fixtures/scripts/one-shot-minting-v2.plutus" - ), - "utf8" - ); -} - -exports.oneShotMinting = script; +export const oneShotMinting = `{ + "type": "PlutusScriptV2", + "description": "one-shot-minting", + "cborHex": "59092c59092901000033233223322323232323232323232323232323232323232323222223232323232325335533533355300b12001323212330012233350052200200200100235001220011233001225335002102310010202325335333573466e3cd400488008d4014880080880844ccd5cd19b87350012200135005220010220211021350012200235500122222222222200c101f102013263201b335738921115574786f206e6f7420636f6e73756d65640001c1533553355335323301e5023001355001222222222222008101f22135002222533500415335333573466e3c00cd401c88cccd40048c98c808ccd5ce2481024c680002420012326320233357389201024c68000242326320233357389201024c680002402502415335333573466e3c0080240940904ccd5cd19b870014800809409040904090884098407c40804c98c806ccd5ce24811357726f6e6720616d6f756e74206d696e7465640001c101c135001220023333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4064068d5d0a80619a80c80d1aba1500b33501901b35742a014666aa03aeb94070d5d0a804999aa80ebae501c35742a01066a0320446ae85401cccd5407408dd69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b5d69aba15002302e357426ae8940088c98c80c0cd5ce01801881709aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a816bad35742a004605c6ae84d5d1280111931901819ab9c03003102e135573ca00226ea8004d5d09aba2500223263202c33573805805a05426aae7940044dd50009aba1500533501975c6ae854010ccd5407407c8004d5d0a801999aa80ebae200135742a00460426ae84d5d1280111931901419ab9c028029026135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860226ae84d5d1280211931900d19ab9c01a01b0183010006375c00c26aae7940044dd5000990009aa80c1108911299a80089a80191000910999a802910011802001199aa9803890008028020008919118011bac001320013550182233335573e0024a034466a03260086ae84008c00cd5d1001009919191999ab9a3370e6aae7540092000233221233001003002300a35742a004600a6ae84d5d1280111931900919ab9c012013010135573ca00226ea80048c8c8c8c8cccd5cd19b8735573aa00890001199991110919998008028020018011919191999ab9a3370e6aae7540092000233221233001003002301335742a00466a01a0246ae84d5d1280111931900b99ab9c017018015135573ca00226ea8004d5d0a802199aa8043ae500735742a0066464646666ae68cdc3a800a4008464244460040086ae84d55cf280191999ab9a3370ea0049001119091118008021bae357426aae7940108cccd5cd19b875003480008488800c8c98c8064cd5ce00c80d00b80b00a89aab9d5001137540026ae854008cd4025d71aba135744a004464c6402666ae7004c0500444d5d1280089aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02a44646666aae7c008940608cd405ccc8848cc00400c008c018d55cea80118029aab9e500230043574400602226ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263201033573802002201c01a26aae7540044dd5000919191999ab9a3370ea002900311909111180200298039aba135573ca00646666ae68cdc3a8012400846424444600400a60126ae84d55cf280211999ab9a3370ea006900111909111180080298039aba135573ca00a46666ae68cdc3a8022400046424444600600a6eb8d5d09aab9e500623263201033573802002201c01a01801626aae7540044dd5000919191999ab9a3370e6aae7540092000233221233001003002300535742a0046eb4d5d09aba2500223263200c33573801801a01426aae7940044dd50009191999ab9a3370e6aae75400520002375c6ae84d55cf280111931900519ab9c00a00b00813754002464646464646666ae68cdc3a800a401842444444400646666ae68cdc3a8012401442444444400846666ae68cdc3a801a40104664424444444660020120106eb8d5d0a8029bad357426ae8940148cccd5cd19b875004480188cc8848888888cc008024020dd71aba15007375c6ae84d5d1280391999ab9a3370ea00a900211991091111111980300480418061aba15009375c6ae84d5d1280491999ab9a3370ea00c900111909111111180380418069aba135573ca01646666ae68cdc3a803a400046424444444600a010601c6ae84d55cf280611931900999ab9c01301401101000f00e00d00c00b135573aa00826aae79400c4d55cf280109aab9e5001137540024646464646666ae68cdc3a800a4004466644424466600200a0080066eb4d5d0a8021bad35742a0066eb4d5d09aba2500323333573466e1d4009200023212230020033008357426aae7940188c98c8030cd5ce00600680500489aab9d5003135744a00226aae7940044dd5000919191999ab9a3370ea002900111909118008019bae357426aae79400c8cccd5cd19b875002480008c8488c00800cdd71aba135573ca008464c6401266ae7002402801c0184d55cea80089baa00112232323333573466e1d400520042122200123333573466e1d40092002232122230030043006357426aae7940108cccd5cd19b87500348000848880088c98c8028cd5ce00500580400380309aab9d5001137540024646666ae68cdc3a800a4004401446666ae68cdc3a801240004014464c6400c66ae7001801c01000c4d55ce9baa001499240103505431001200132001355006222533500110022213500222330073330080020060010033200135500522225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b12333001008003002006003122002122001112200212212233001004003112323001001223300330020020014c01074643544c4e46540001" +}`; diff --git a/examples/PlutusV2/OneShotMinting.purs b/examples/PlutusV2/OneShotMinting.purs index fb46fd610..83c1d4413 100644 --- a/examples/PlutusV2/OneShotMinting.purs +++ b/examples/PlutusV2/OneShotMinting.purs @@ -40,8 +40,6 @@ contract = mkContractWithAssertions "Examples.PlutusV2.OneShotMinting" oneShotMintingPolicyV2 -foreign import oneShotMinting :: String - oneShotMintingPolicyV2 :: TransactionInput -> Contract MintingPolicy oneShotMintingPolicyV2 = map PlutusMintingPolicy <<< oneShotMintingPolicyScriptV2 @@ -54,3 +52,4 @@ oneShotMintingPolicyScriptV2 txInput = do liftContractE $ mkOneShotMintingPolicy script txInput +foreign import oneShotMinting :: String diff --git a/examples/PlutusV2/ReferenceInputs.purs b/examples/PlutusV2/ReferenceInputs.purs index 8ffa03eb4..d97f614b0 100644 --- a/examples/PlutusV2/ReferenceInputs.purs +++ b/examples/PlutusV2/ReferenceInputs.purs @@ -2,19 +2,12 @@ module Ctl.Examples.PlutusV2.ReferenceInputs (contract, example, main) where import Contract.Prelude -import Contract.Address - ( Address - , getWalletAddresses - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes - ) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') import Contract.Monad ( Contract , launchAff_ , liftContractM - , liftedE , liftedM , runContract ) @@ -37,15 +30,20 @@ import Contract.Transaction , submit ) import Contract.TxConstraints as Constraints -import Contract.Utxos (utxosAt) +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Value (lovelaceValueOf) as Value +import Contract.Wallet + ( getWalletUtxos + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) import Control.Monad.Trans.Class (lift) import Ctl.Examples.Helpers (mustPayToPubKeyStakeAddress) as Helpers import Data.Array (head) as Array -import Data.BigInt (fromInt) as BigInt import Data.Lens.Getter ((^.)) import Data.Map (member, toUnfoldable) as Map import Data.Set (member) as Set +import JS.BigInt (fromInt) as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -58,40 +56,37 @@ contract = do logInfo' "Running Examples.PlutusV2.ReferenceInputs" pkh <- liftedM "Failed to get own PKH" - (Array.head <$> ownPaymentPubKeysHashes) - skh <- join <<< Array.head <$> ownStakePubKeysHashes + (Array.head <$> ownPaymentPubKeyHashes) + skh <- join <<< Array.head <$> ownStakePubKeyHashes - ownAddress <- liftedM "Failed to get own address" - (Array.head <$> getWalletAddresses) - utxos <- utxosAt ownAddress + utxos <- liftedM "Failed to get UTxOs from wallet" getWalletUtxos oref <- liftContractM "Utxo set is empty" (fst <$> Array.head (Map.toUnfoldable utxos :: Array _)) let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustReferenceOutput oref , Helpers.mustPayToPubKeyStakeAddress pkh skh (Value.lovelaceValueOf $ BigInt.fromInt 2_000_000) ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty void $ runChecks checks $ lift do - unbalancedTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - balancedSignedTx <- signTransaction =<< liftedE (balanceTx unbalancedTx) + unbalancedTx <- mkUnbalancedTx lookups constraints + balancedSignedTx <- signTransaction =<< balanceTx unbalancedTx txHash <- submit balancedSignedTx logInfo' $ "Tx ID: " <> show txHash awaitTxConfirmed txHash logInfo' "Tx submitted successfully!" - pure { ownAddress, referenceInput: oref, balancedSignedTx } + pure { referenceInput: oref, balancedSignedTx } type ContractResult = - { ownAddress :: Address - , referenceInput :: TransactionInput + { referenceInput :: TransactionInput , balancedSignedTx :: BalancedSignedTransaction } @@ -109,11 +104,11 @@ assertTxContainsReferenceInput = assertReferenceInputNotSpent :: ContractCheck ContractResult assertReferenceInputNotSpent = assertionToCheck "A reference input UTxO" - \{ ownAddress, referenceInput } -> do + \{ referenceInput } -> do let assertionFailure :: ContractAssertionFailure assertionFailure = CustomFailure "Reference input has been spent" - utxos <- lift $ utxosAt ownAddress + utxos <- lift $ liftedM "Failed to get UTxOs from wallet" getWalletUtxos assertContract assertionFailure do Map.member referenceInput utxos diff --git a/examples/PlutusV2/ReferenceInputsAndScripts.purs b/examples/PlutusV2/ReferenceInputsAndScripts.purs index 833d2d291..b0a453bf9 100644 --- a/examples/PlutusV2/ReferenceInputsAndScripts.purs +++ b/examples/PlutusV2/ReferenceInputsAndScripts.purs @@ -10,9 +10,6 @@ import Contract.Prelude import Contract.Address ( PaymentPubKeyHash , StakePubKeyHash - , getWalletAddresses - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes , scriptHashAddress ) import Contract.Config (ContractParams, testnetNamiConfig) @@ -24,7 +21,7 @@ import Contract.Monad , liftedM , runContract ) -import Contract.PlutusData (PlutusData, unitDatum, unitRedeemer) +import Contract.PlutusData (unitDatum, unitRedeemer) import Contract.ScriptLookups as Lookups import Contract.Scripts ( MintingPolicy(PlutusMintingPolicy) @@ -53,6 +50,11 @@ import Contract.TxConstraints as Constraints import Contract.Utxos (utxosAt) import Contract.Value (TokenName, Value) import Contract.Value as Value +import Contract.Wallet + ( getWalletAddresses + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) import Ctl.Examples.Helpers (mkTokenName) as Helpers import Ctl.Examples.PlutusV2.Scripts.AlwaysMints ( alwaysMintsPolicyScriptV2 @@ -60,8 +62,8 @@ import Ctl.Examples.PlutusV2.Scripts.AlwaysMints ) import Ctl.Examples.PlutusV2.Scripts.AlwaysSucceeds (alwaysSucceedsScriptV2) import Data.Array (head) -import Data.BigInt (fromInt) as BigInt import Data.Map (toUnfoldable) as Map +import JS.BigInt (fromInt) as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -96,23 +98,23 @@ contract = do payToAlwaysSucceedsAndCreateScriptRefOutput :: ValidatorHash -> ScriptRef -> ScriptRef -> Contract TransactionHash payToAlwaysSucceedsAndCreateScriptRefOutput vhash validatorRef mpRef = do - pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes - skh <- join <<< head <$> ownStakePubKeysHashes + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes + skh <- join <<< head <$> ownStakePubKeyHashes let value :: Value value = Value.lovelaceValueOf (BigInt.fromInt 2_000_000) - createOutputWithScriptRef :: ScriptRef -> TxConstraints Unit Unit + createOutputWithScriptRef :: ScriptRef -> TxConstraints createOutputWithScriptRef scriptRef = mustPayToPubKeyStakeAddressWithScriptRef pkh skh scriptRef value - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToScript vhash unitDatum DatumWitness value <> createOutputWithScriptRef validatorRef <> createOutputWithScriptRef mpRef - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -147,7 +149,7 @@ spendFromAlwaysSucceeds vhash txId validator mp tokenName = do mph :: MintingPolicyHash mph = mintingPolicyHash (PlutusMintingPolicy mp) - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = mconcat [ Constraints.mustSpendScriptOutputUsingScriptRef txInput unitRedeemer (RefInput $ mkTxUnspentOut refValidatorInput refValidatorOutput) @@ -156,7 +158,7 @@ spendFromAlwaysSucceeds vhash txId validator mp tokenName = do (RefInput $ mkTxUnspentOut refMpInput refMpOutput) ] - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.unspentOutputs scriptAddressUtxos spendTxId <- submitTxFromConstraints lookups constraints @@ -178,7 +180,7 @@ mustPayToPubKeyStakeAddressWithScriptRef -> Maybe StakePubKeyHash -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyStakeAddressWithScriptRef pkh Nothing = Constraints.mustPayToPubKeyWithScriptRef pkh mustPayToPubKeyStakeAddressWithScriptRef pkh (Just skh) = @@ -188,12 +190,12 @@ mintAlwaysMintsV2ToTheScript :: TokenName -> Validator -> Int -> Contract Unit mintAlwaysMintsV2ToTheScript tokenName validator sum = do mp <- alwaysMintsPolicyV2 - cs <- liftContractM "Cannot get cs" $ Value.scriptCurrencySymbol mp + let cs = Value.scriptCurrencySymbol mp let vhash = validatorHash validator - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustMintValue $ Value.singleton cs tokenName @@ -203,7 +205,7 @@ mintAlwaysMintsV2ToTheScript tokenName validator sum = do $ BigInt.fromInt sum ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txHash <- submitTxFromConstraints lookups constraints diff --git a/examples/PlutusV2/ReferenceScripts.purs b/examples/PlutusV2/ReferenceScripts.purs index eae1f8278..a52783f7a 100644 --- a/examples/PlutusV2/ReferenceScripts.purs +++ b/examples/PlutusV2/ReferenceScripts.purs @@ -6,12 +6,12 @@ module Ctl.Examples.PlutusV2.ReferenceScripts import Contract.Prelude -import Contract.Address (ownStakePubKeysHashes, scriptHashAddress) +import Contract.Address (scriptHashAddress) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Credential (Credential(PubKeyCredential)) import Contract.Log (logInfo') import Contract.Monad (Contract, launchAff_, liftContractM, runContract) -import Contract.PlutusData (PlutusData, unitDatum, unitRedeemer) +import Contract.PlutusData (unitDatum, unitRedeemer) import Contract.ScriptLookups as Lookups import Contract.Scripts (ValidatorHash, validatorHash) import Contract.Transaction @@ -30,10 +30,11 @@ import Contract.TxConstraints import Contract.TxConstraints as Constraints import Contract.Utxos (utxosAt) import Contract.Value (lovelaceValueOf) as Value +import Contract.Wallet (ownStakePubKeyHashes) import Ctl.Examples.PlutusV2.Scripts.AlwaysSucceeds (alwaysSucceedsScriptV2) import Data.Array (head) -import Data.BigInt (fromInt) as BigInt import Data.Map (toUnfoldable) as Map +import JS.BigInt (fromInt) as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -64,9 +65,9 @@ payWithScriptRefToAlwaysSucceeds payWithScriptRefToAlwaysSucceeds vhash scriptRef = do -- Send to own stake credential. This is used to test -- `mustPayToScriptAddressWithScriptRef` - mbStakeKeyHash <- join <<< head <$> ownStakePubKeysHashes + mbStakeKeyHash <- join <<< head <$> ownStakePubKeyHashes let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = case mbStakeKeyHash of Nothing -> @@ -82,7 +83,7 @@ payWithScriptRefToAlwaysSucceeds vhash scriptRef = do scriptRef (Value.lovelaceValueOf $ BigInt.fromInt 2_000_000) - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -91,7 +92,7 @@ spendFromAlwaysSucceeds :: ValidatorHash -> TransactionHash -> Contract Unit spendFromAlwaysSucceeds vhash txId = do -- Send to own stake credential. This is used to test -- `mustPayToScriptAddressWithScriptRef` - mbStakeKeyHash <- join <<< head <$> ownStakePubKeysHashes + mbStakeKeyHash <- join <<< head <$> ownStakePubKeyHashes let scriptAddress = scriptHashAddress vhash (PubKeyCredential <<< unwrap <$> mbStakeKeyHash) @@ -102,12 +103,12 @@ spendFromAlwaysSucceeds vhash txId = do $ find hasTransactionId (Map.toUnfoldable utxos :: Array _) let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustSpendScriptOutputUsingScriptRef txInput unitRedeemer (SpendInput $ mkTxUnspentOut txInput txOutput) - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty spendTxId <- submitTxFromConstraints lookups constraints diff --git a/examples/PlutusV2/Scripts/AlwaysMints.js b/examples/PlutusV2/Scripts/AlwaysMints.js deleted file mode 100644 index 170c59121..000000000 --- a/examples/PlutusV2/Scripts/AlwaysMints.js +++ /dev/null @@ -1,14 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/always-mints-v2.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/always-mints-v2.plutus"), - "utf8" - ); -} -exports.alwaysMintsV2 = script; diff --git a/examples/PlutusV2/Scripts/AlwaysMints.purs b/examples/PlutusV2/Scripts/AlwaysMints.purs index 8f89cc3d2..15b9f072e 100644 --- a/examples/PlutusV2/Scripts/AlwaysMints.purs +++ b/examples/PlutusV2/Scripts/AlwaysMints.purs @@ -11,13 +11,21 @@ import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV2FromEnvelope) import Control.Monad.Error.Class (liftMaybe) import Effect.Exception (error) -foreign import alwaysMintsV2 :: String - alwaysMintsPolicyV2 :: Contract MintingPolicy alwaysMintsPolicyV2 = PlutusMintingPolicy <$> alwaysMintsPolicyScriptV2 alwaysMintsPolicyScriptV2 :: Contract PlutusScript -alwaysMintsPolicyScriptV2 = +alwaysMintsPolicyScriptV2 = do liftMaybe (error "Error decoding alwaysMintsV2") do envelope <- decodeTextEnvelope alwaysMintsV2 plutusScriptV2FromEnvelope envelope + +alwaysMintsV2 :: String +alwaysMintsV2 = + """ +{ + "cborHex": "484701000022120011", + "description": "always-mints", + "type": "PlutusScriptV2" +} +""" diff --git a/examples/PlutusV2/Scripts/AlwaysSucceeds.js b/examples/PlutusV2/Scripts/AlwaysSucceeds.js deleted file mode 100644 index a143119c9..000000000 --- a/examples/PlutusV2/Scripts/AlwaysSucceeds.js +++ /dev/null @@ -1,15 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/always-succeeds-v2.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/always-succeeds-v2.plutus"), - "utf8" - ); -} - -exports.alwaysSucceedsV2 = script; diff --git a/examples/PlutusV2/Scripts/AlwaysSucceeds.purs b/examples/PlutusV2/Scripts/AlwaysSucceeds.purs index 5b9f273f6..6fd1387c7 100644 --- a/examples/PlutusV2/Scripts/AlwaysSucceeds.purs +++ b/examples/PlutusV2/Scripts/AlwaysSucceeds.purs @@ -10,10 +10,18 @@ import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV2FromEnvelope) import Control.Monad.Error.Class (liftMaybe) import Effect.Exception (error) -foreign import alwaysSucceedsV2 :: String - alwaysSucceedsScriptV2 :: Contract Validator -alwaysSucceedsScriptV2 = +alwaysSucceedsScriptV2 = do liftMaybe (error "Error decoding alwaysSucceeds") do envelope <- decodeTextEnvelope alwaysSucceedsV2 Validator <$> plutusScriptV2FromEnvelope envelope + +alwaysSucceedsV2 :: String +alwaysSucceedsV2 = + """ +{ + "cborHex": "4e4d01000033222220051200120011", + "description": "always-succeeds", + "type": "PlutusScriptV2" +} +""" diff --git a/examples/SatisfiesAnyOf.purs b/examples/SatisfiesAnyOf.purs index e07a6ee2f..f7862b360 100644 --- a/examples/SatisfiesAnyOf.purs +++ b/examples/SatisfiesAnyOf.purs @@ -13,7 +13,7 @@ import Contract.Prelude import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Hashing (datumHash) as Hashing import Contract.Log (logInfo') -import Contract.Monad (Contract, launchAff_, liftedE, runContract) +import Contract.Monad (Contract, launchAff_, runContract) import Contract.PlutusData ( Datum(Datum) , PlutusData(Integer) @@ -22,7 +22,8 @@ import Contract.PlutusData import Contract.ScriptLookups as Lookups import Contract.TxConstraints (TxConstraints) import Contract.TxConstraints as Constraints -import Data.BigInt as BigInt +import Contract.UnbalancedTx (mkUnbalancedTx) +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -42,13 +43,13 @@ testMustSatisfyAnyOf = do wrongDatumHash = Hashing.datumHash wrongDatum correctDatumHash = Hashing.datumHash unitDatum - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustSatisfyAnyOf [ Constraints.mustHashDatum wrongDatumHash unitDatum , Constraints.mustHashDatum correctDatumHash unitDatum ] - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty - void $ liftedE $ Lookups.mkUnbalancedTx lookups constraints + void $ mkUnbalancedTx lookups constraints diff --git a/examples/Schnorr.js b/examples/Schnorr.js deleted file mode 100644 index 76d1ed204..000000000 --- a/examples/Schnorr.js +++ /dev/null @@ -1,15 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let script; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - script = require("Scripts/validate-schnorr.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - script = fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/validate-schnorr.plutus"), - "utf8" - ); -} - -exports.validateSchnorr = script; diff --git a/examples/Schnorr.purs b/examples/Schnorr.purs index 292d24864..b4aa431b4 100644 --- a/examples/Schnorr.purs +++ b/examples/Schnorr.purs @@ -22,7 +22,7 @@ import Contract.PlutusData ) import Contract.Prim.ByteArray (ByteArray, byteArrayFromIntArrayUnsafe) import Contract.ScriptLookups as Lookups -import Contract.Scripts (Validator, validatorHash) +import Contract.Scripts (Validator(Validator), validatorHash) import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV2FromEnvelope) import Contract.Transaction ( TransactionHash @@ -60,10 +60,10 @@ prepTest = do valHash = validatorHash validator val = Value.lovelaceValueOf one - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustPayToScript valHash unitDatum Constraints.DatumInline val @@ -94,12 +94,12 @@ testVerification txId ecdsaRed = do $ Map.keys scriptUtxos let - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs (Map.filterKeys ((unwrap >>> _.transactionId >>> eq txId)) scriptUtxos) - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustSpendScriptOutput txIn red txId' <- submitTxFromConstraints lookups constraints logInfo' $ "Submitted Schnorr test verification tx: " <> show txId' @@ -124,6 +124,15 @@ testSchnorr txId = do getValidator :: Maybe Validator getValidator = do - decodeTextEnvelope validateSchnorr >>= plutusScriptV2FromEnvelope >>> map wrap - -foreign import validateSchnorr :: String + Validator <$> + (plutusScriptV2FromEnvelope =<< decodeTextEnvelope validateSchnorrScript) + +validateSchnorrScript :: String +validateSchnorrScript = + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59080459080101000032323232332232323232323232323233223232323232223232322323253353232323500222253353335734666ed400400c00808007c40804cd5ce249167369676e617475726520636865636b206661696c65640001f3333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd406806cd5d0a80619a80d00d9aba1500b33501a01c35742a014666aa03ceb94074d5d0a804999aa80f3ae501d35742a01066a03404a6ae85401cccd54078099d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40c1d69aba150023031357426ae8940088c98c80d4cd5ce01b01a81989aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8183ad35742a00460626ae84d5d1280111931901a99ab9c036035033135573ca00226ea8004d5d09aba2500223263203133573806406205e26aae7940044dd50009aba1500533501a75c6ae854010ccd540780888004d5d0a801999aa80f3ae200135742a00460486ae84d5d1280111931901699ab9c02e02d02b135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860286ae84d5d1280211931900f99ab9c02001f01d3333573466e1cd55cea803a40004666444246660020080060046eb8d5d0a8039bae35742a00c6eb8d5d09aba2500623263201e33573803e03c0386666ae68cdc39aab9d37540109000100e91931900e99ab9c01e01d01b101c13263201c3357389201035054350001c135573ca00226ea80044d5d1280089aab9e5001137540022464460046eb0004c8004d5405888cccd55cf80092805119a80498021aba100230033574400402c464646666ae68cdc39aab9d5002480008cc8848cc00400c008c030d5d0a80118029aba135744a004464c6402c66ae7005c0580504d55cf280089baa0012323232323333573466e1cd55cea8022400046666444424666600200a0080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c054d5d0a80119a80780a1aba135744a004464c6403666ae7007006c0644d55cf280089baa00135742a008666aa010eb9401cd5d0a8019919191999ab9a3370ea0029002119091118010021aba135573ca00646666ae68cdc3a80124004464244460020086eb8d5d09aab9e500423333573466e1d400d20002122200323263201d33573803c03a03603403226aae7540044dd50009aba1500233500b75c6ae84d5d1280111931900b99ab9c018017015135744a00226ae8940044d55cf280089baa0011335500175ceb44488c88c008dd5800990009aa80991191999aab9f00225008233500733221233001003002300635573aa004600a6aae794008c010d5d100180a09aba100111220021221223300100400312232323333573466e1d4005200023212230020033005357426aae79400c8cccd5cd19b8750024800884880048c98c8048cd5ce00980900800789aab9d500113754002464646666ae68cdc3a800a400c46424444600800a600e6ae84d55cf280191999ab9a3370ea004900211909111180100298049aba135573ca00846666ae68cdc3a801a400446424444600200a600e6ae84d55cf280291999ab9a3370ea00890001190911118018029bae357426aae7940188c98c8048cd5ce00980900800780700689aab9d500113754002464646666ae68cdc39aab9d5002480008cc8848cc00400c008c014d5d0a8011bad357426ae8940088c98c8038cd5ce00780700609aab9e5001137540024646666ae68cdc39aab9d5001480008dd71aba135573ca004464c6401866ae700340300284dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6402a66ae7005805404c04804404003c0380344d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263200e33573801e01c01801626aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931900599ab9c00c00b009008135573aa00226ea8004488c8c8cccd5cd19b87500148010848880048cccd5cd19b875002480088c84888c00c010c018d5d09aab9e500423333573466e1d400d20002122200223263200c33573801a01801401201026aae7540044dd50009191999ab9a3370ea0029001100291999ab9a3370ea0049000100291931900419ab9c009008006005135573a6ea800448800848800526120014910350543100112323001001223300330020020011" +} +""" diff --git a/examples/SendsToken.purs b/examples/SendsToken.purs index cc213902f..7993c4e11 100644 --- a/examples/SendsToken.purs +++ b/examples/SendsToken.purs @@ -6,7 +6,6 @@ module Ctl.Examples.SendsToken (main, example, contract) where import Contract.Prelude -import Contract.Address (ownPaymentPubKeysHashes, ownStakePubKeysHashes) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') import Contract.Monad (Contract, launchAff_, liftedM, runContract) @@ -20,6 +19,7 @@ import Contract.Transaction import Contract.TxConstraints as Constraints import Contract.Value (Value) import Contract.Value as Value +import Contract.Wallet (ownPaymentPubKeyHashes, ownStakePubKeyHashes) import Ctl.Examples.AlwaysMints (alwaysMintsPolicy) import Ctl.Examples.Helpers ( mkCurrencySymbol @@ -49,24 +49,24 @@ mintToken :: Contract TransactionHash mintToken = do mp /\ value <- tokenValue let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue value - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp submitTxFromConstraints lookups constraints sendToken :: Contract TransactionHash sendToken = do - pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes - skh <- join <<< head <$> ownStakePubKeysHashes + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes + skh <- join <<< head <$> ownStakePubKeyHashes _ /\ value <- tokenValue let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Helpers.mustPayToPubKeyStakeAddress pkh skh value - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints diff --git a/examples/SignData.purs b/examples/SignData.purs index cec35b1d6..dfa44dee1 100644 --- a/examples/SignData.purs +++ b/examples/SignData.purs @@ -23,7 +23,7 @@ contract :: Contract Unit contract = do logInfo' "Running Examples.SignData" - changeAddress <- liftedM "Could not get change address" getChangeAddress + changeAddress <- getChangeAddress logInfo' $ "change address: " <> show changeAddress testSignDataWithAddress "changeAddress" changeAddress @@ -37,9 +37,6 @@ contract = do testSignDataWithAddress :: String -> Address -> Contract Unit testSignDataWithAddress addressLabel address = do - dataSignature <- - signData address payload - # liftedM "Could not get data signature" + dataSignature <- signData address payload logInfo' $ "signData " <> addressLabel <> ": " <> show dataSignature void $ liftAff $ checkCip30SignDataResponse address dataSignature - diff --git a/examples/SignMultiple.purs b/examples/SignMultiple.purs index 82b295012..c5eb936e7 100644 --- a/examples/SignMultiple.purs +++ b/examples/SignMultiple.purs @@ -5,13 +5,11 @@ module Ctl.Examples.SignMultiple (example, contract, main) where import Contract.Prelude -import Contract.Address (ownPaymentPubKeysHashes, ownStakePubKeysHashes) import Contract.Config (ContractParams, testnetNamiConfig) -import Contract.Log (logInfo') +import Contract.Log (logInfo', logWarn') import Contract.Monad ( Contract , launchAff_ - , liftedE , liftedM , runContract , throwContractError @@ -21,21 +19,28 @@ import Contract.Transaction ( BalancedSignedTransaction , TransactionHash , awaitTxConfirmed + , awaitTxConfirmedWithTimeout , signTransaction , submit + , submitTxFromConstraints , withBalancedTxs ) import Contract.TxConstraints as Constraints -import Contract.Utxos (getWalletUtxos) +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Value (leq) import Contract.Value as Value +import Contract.Wallet + ( getWalletUtxos + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) import Control.Monad.Reader (asks) import Data.Array (head) -import Data.BigInt as BigInt import Data.Map (Map, filter) import Data.Set (Set) import Data.UInt (UInt) import Effect.Ref as Ref +import JS.BigInt as BigInt getLockedInputs :: Contract (Map TransactionHash (Set UInt)) @@ -49,25 +54,26 @@ main = example testnetNamiConfig contract :: Contract Unit contract = do logInfo' "Running Examples.SignMultiple" - pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes skh <- liftedM "Failed to get own SKH" $ join <<< head <$> - ownStakePubKeysHashes + ownStakePubKeyHashes -- Early fail if not enough utxos present for 2 transactions - unlessM hasSufficientUtxos $ throwContractError - "Insufficient Utxos for 2 transactions" + unlessM hasSufficientUtxos do + logWarn' "Insufficient Utxos for 2 transactions" + createAdditionalUtxos let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustPayToPubKeyAddress pkh skh $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty - unbalancedTx0 <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - unbalancedTx1 <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + unbalancedTx0 <- mkUnbalancedTx lookups constraints + unbalancedTx1 <- mkUnbalancedTx lookups constraints txIds <- withBalancedTxs [ unbalancedTx0, unbalancedTx1 ] $ \balancedTxs -> do locked <- getLockedInputs @@ -108,6 +114,33 @@ contract = do pure $ length walletValidUtxos >= 2 -- 2 transactions +createAdditionalUtxos :: Contract Unit +createAdditionalUtxos = do + logInfo' "Creating additional UTxOs for SignMultiple example" + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes + skh <- liftedM "Failed to get own SKH" $ join <<< head <$> + ownStakePubKeyHashes + + let + constraints :: Constraints.TxConstraints + constraints = + Constraints.mustPayToPubKeyAddress pkh skh + ( Value.lovelaceValueOf + $ BigInt.fromInt 2_000_000 + ) <> + Constraints.mustPayToPubKeyAddress pkh skh + ( Value.lovelaceValueOf + $ BigInt.fromInt 2_000_000 + ) + + lookups :: Lookups.ScriptLookups + lookups = mempty + + txId <- submitTxFromConstraints lookups constraints + + awaitTxConfirmedWithTimeout (wrap 100.0) txId + logInfo' $ "Tx submitted successfully!" + example :: ContractParams -> Effect Unit example cfg = launchAff_ do runContract cfg contract diff --git a/examples/TxChaining.purs b/examples/TxChaining.purs index dfb68f9d2..4e82e1fa0 100644 --- a/examples/TxChaining.purs +++ b/examples/TxChaining.purs @@ -10,15 +10,13 @@ module Ctl.Examples.TxChaining import Contract.Prelude -import Contract.Address (ownPaymentPubKeysHashes) import Contract.BalanceTxConstraints ( BalanceTxConstraintsBuilder , mustUseAdditionalUtxos ) as BalanceTxConstraints import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo') -import Contract.Monad (Contract, launchAff_, liftedE, liftedM, runContract) -import Contract.PlutusData (PlutusData) +import Contract.Monad (Contract, launchAff_, liftedM, runContract) import Contract.ScriptLookups as Lookups import Contract.Transaction ( awaitTxConfirmed @@ -30,9 +28,11 @@ import Contract.Transaction ) import Contract.TxConstraints (TxConstraints) import Contract.TxConstraints as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Value as Value +import Contract.Wallet (ownPaymentPubKeyHashes) import Data.Array (head) -import Data.BigInt as BigInt +import JS.BigInt as BigInt main :: Effect Unit main = example testnetNamiConfig @@ -43,17 +43,17 @@ example cfg = launchAff_ do contract :: Contract Unit contract = do - pkh <- liftedM "Failed to get PKH" $ head <$> ownPaymentPubKeysHashes + pkh <- liftedM "Failed to get PKH" $ head <$> ownPaymentPubKeyHashes let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToPubKey pkh (Value.lovelaceValueOf $ BigInt.fromInt 1_000_000) - lookups0 :: Lookups.ScriptLookups PlutusData + lookups0 :: Lookups.ScriptLookups lookups0 = mempty - unbalancedTx0 <- liftedE $ Lookups.mkUnbalancedTx lookups0 constraints + unbalancedTx0 <- mkUnbalancedTx lookups0 constraints withBalancedTx unbalancedTx0 \balancedTx0 -> do balancedSignedTx0 <- signTransaction balancedTx0 @@ -62,16 +62,15 @@ contract = do logInfo' $ "Additional utxos: " <> show additionalUtxos let - lookups1 :: Lookups.ScriptLookups PlutusData + lookups1 :: Lookups.ScriptLookups lookups1 = Lookups.unspentOutputs additionalUtxos balanceTxConstraints :: BalanceTxConstraints.BalanceTxConstraintsBuilder balanceTxConstraints = BalanceTxConstraints.mustUseAdditionalUtxos additionalUtxos - unbalancedTx1 <- liftedE $ Lookups.mkUnbalancedTx lookups1 constraints - balancedTx1 <- - liftedE $ balanceTxWithConstraints unbalancedTx1 balanceTxConstraints + unbalancedTx1 <- mkUnbalancedTx lookups1 constraints + balancedTx1 <- balanceTxWithConstraints unbalancedTx1 balanceTxConstraints balancedSignedTx1 <- signTransaction balancedTx1 txId0 <- submit balancedSignedTx0 @@ -79,4 +78,3 @@ contract = do awaitTxConfirmed txId0 awaitTxConfirmed txId1 - diff --git a/examples/Utxos.purs b/examples/Utxos.purs index fc6602a8b..8b782c711 100644 --- a/examples/Utxos.purs +++ b/examples/Utxos.purs @@ -5,9 +5,6 @@ import Contract.Prelude import Contract.Address ( PaymentPubKeyHash , StakePubKeyHash - , getWalletAddress - , ownPaymentPubKeyHash - , ownStakePubKeyHash ) import Contract.Config (ContractParams, testnetNamiConfig) import Contract.Log (logInfo, logInfo') @@ -28,18 +25,19 @@ import Contract.Transaction ) import Contract.TxConstraints (DatumPresence(DatumInline, DatumWitness)) import Contract.TxConstraints as Constraints -import Contract.Utxos (utxosAt) import Contract.Value (Value) import Contract.Value (lovelaceValueOf, singleton) as Value -import Ctl.Examples.Helpers - ( mkCurrencySymbol - , mkTokenName - ) as Helpers +import Contract.Wallet + ( getWalletUtxos + , ownPaymentPubKeyHash + , ownStakePubKeyHash + ) +import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) as Helpers import Ctl.Examples.PlutusV2.OneShotMinting (oneShotMintingPolicyScriptV2) import Data.Array (head) as Array -import Data.BigInt (fromInt) as BigInt import Data.Log.Tag (tag) import Data.Map (toUnfoldable) as Map +import JS.BigInt (fromInt) as BigInt import Test.QuickCheck.Arbitrary (arbitrary) import Test.QuickCheck.Gen (randomSampleOne) @@ -54,7 +52,6 @@ contract = do logInfo' "Running Examples.Utxos" pkh <- liftedM "Failed to get own PKH" ownPaymentPubKeyHash skh <- ownStakePubKeyHash - address <- liftedM "Failed to get own address" getWalletAddress datum <- liftEffect $ Datum @@ -62,7 +59,7 @@ contract = do <<< BigInt.fromInt <$> randomSampleOne arbitrary - utxos <- utxosAt address + utxos <- liftedM "Failed to get UTxOs from wallet" getWalletUtxos oref <- liftContractM "Utxo set is empty" (map fst <<< Array.head <<< Map.toUnfoldable $ utxos) @@ -84,7 +81,7 @@ contract = do mintValue :: Value mintValue = Value.singleton cs0 tn0 one - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustMintValue mintValue , mustPayWithDatumAndScriptRef pkh skh datum DatumWitness plutusScriptRef @@ -93,14 +90,14 @@ contract = do adaValue ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp0 <> Lookups.unspentOutputs utxos txHash <- submitTxFromConstraints lookups constraints awaitTxConfirmed txHash logInfo' "Tx submitted successfully!" - utxos' <- utxosAt address + utxos' <- liftedM "Failed to get UTxOs from wallet" getWalletUtxos logInfo (tag "utxos" $ show utxos') "Utxos after transaction confirmation:" -------------------------------------------------------------------------------- @@ -115,9 +112,8 @@ mustPayWithDatumAndScriptRef -> DatumPresence -> ScriptRef -> Value - -> Constraints.TxConstraints i o + -> Constraints.TxConstraints mustPayWithDatumAndScriptRef pkh Nothing = Constraints.mustPayToPubKeyWithDatumAndScriptRef pkh mustPayWithDatumAndScriptRef pkh (Just skh) = Constraints.mustPayToPubKeyAddressWithDatumAndScriptRef pkh skh - diff --git a/examples/Wallet.purs b/examples/Wallet.purs index 18e7a072d..fa1e95beb 100644 --- a/examples/Wallet.purs +++ b/examples/Wallet.purs @@ -2,10 +2,14 @@ module Ctl.Examples.Wallet (example, contract) where import Contract.Prelude -import Contract.Address (getWalletAddresses, getWalletCollateral) import Contract.Config (ContractParams) import Contract.Monad (Contract, launchAff_, runContract) -import Contract.Utxos (getWalletBalance, getWalletUtxos) +import Contract.Wallet + ( getWalletAddresses + , getWalletBalance + , getWalletCollateral + , getWalletUtxos + ) contract :: Contract Unit contract = do diff --git a/examples/index.html b/examples/index.html deleted file mode 100644 index b92b25e15..000000000 --- a/examples/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - Examples source code is located in examples/ directory.
- To set a Blockfrost API key, run the following in the browser console: -
-    localStorage.setItem('BLOCKFROST_API_KEY', 'your-key-here');
-  
- Then close the browser, and run: -
-    npm run e2e-pack-settings
-  
- The key will be saved permanently to your settings archive. Sharing the archive file after that implies that the key can be leaked. -
    -
- - diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index cc75f91f4..000000000 --- a/examples/index.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -// This needs to be asynchronous to load the WASM from CSL -// -// You also need to call `spago bundle-module` to generate the module that is -// imported here. From the repository root, run: -// spago bundle-module -m
--to output.js -import("../output.js").then(m => m.main()); - -console.log("app starting"); diff --git a/fixtures/schemata/JsonWsp/UtxoQueryResponse.medea b/fixtures/schemata/JsonWsp/UtxoQueryResponse.medea deleted file mode 100644 index a5af178af..000000000 --- a/fixtures/schemata/JsonWsp/UtxoQueryResponse.medea +++ /dev/null @@ -1,100 +0,0 @@ -$schema $start - $type - $object - $properties - $property-name "type" - $property-schema jsonWspType - $property-name "version" - $property-schema versionType - $property-name "servicename" - $property-schema serviceType - $property-name "methodname" - $property-schema methodType - $property-name "result" - $property-schema result - $property-name "reflection" - $property-schema mirrorType - -$schema jsonWspType - $type - $string - $string-values - "jsonwsp/response" - -$schema versionType - $type - $string - $string-values - "1.0" - -$schema serviceType - $type - $string - $string-values - "ogmios" - -$schema methodType - $type - $string - $string-values - "Query" - -$schema mirrorType - $type - $string - -$schema result - $type - $array - $element-type - utxoEntry - -$schema utxoEntry - $type - $array - $tuple - txOutRef - ogmiosTxOut - -$schema txOutRef - $type - $object - $properties - $property-name "txId" - $property-schema $string - $property-name "index" - $property-schema $number - -$schema ogmiosTxOut - $type - $object - $properties - $property-name "address" - $property-schema $string - $property-name "value" - $property-schema valueType - $property-name "datumHash" - $property-schema datumHashType - $additional-properties-allowed - -$schema valueType - $type - $object - $properties - $property-name "coins" - $property-schema $number - $property-name "assets" - $property-schema assetsType - $optional-property - -$schema datumHashType - $type - $null - $string - -$schema assetsType - $type - $object - $properties - $additional-properties-allowed - $additional-property-schema $number diff --git a/fixtures/scripts/exunits.plutus b/fixtures/scripts/exunits.plutus new file mode 100644 index 000000000..7168c1dc1 --- /dev/null +++ b/fixtures/scripts/exunits.plutus @@ -0,0 +1 @@ +{"cborHex":"59079f59079c0100003233223232323232323232323232323233223232323232222323253353232301b0023333573466e1cd55cea801a4000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd405805cd5d0a80619a80b00b9aba1500b33501601835742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02c0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01801781689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03002f02d135573ca00226ea8004d5d09aba2500223263202b33573805805605226aae7940044dd50009aba1500533501675c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c028027025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00660206ae84d5d1280191931900c99ab9c01a019017375a008202e264c6402e66ae712401134661696c656420766572696669636174696f6e00017135573ca00226ea800448c88c008dd6000990009aa80b911999aab9f0012500a233500930043574200460066ae880080508c8c8cccd5cd19b8735573aa004900011991091980080180118061aba150023005357426ae8940088c98c8050cd5ce00a80a00909aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180a9aba1500233500f014357426ae8940088c98c8064cd5ce00d00c80b89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403666ae7007006c06406005c4d55cea80089baa00135742a00466a016eb8d5d09aba2500223263201533573802c02a02626ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355014223233335573e0044a010466a00e66442466002006004600c6aae754008c014d55cf280118021aba200301213574200222440042442446600200800624464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002200923333573466e1d40092000200923263200633573800e00c00800626aae74dd5000a4c24002921035054310032001355003225335333573466e2400520000040031004130023370200290010910010910008891918008009119801980100100081","description":"","type":"PlutusScriptV2"} diff --git a/fixtures/test/blockfrost/getProtocolParameters/getProtocolParameters-2d2ce3159a465c84058d7eab67b1b345.json b/fixtures/test/blockfrost/getProtocolParameters/getProtocolParameters-2d2ce3159a465c84058d7eab67b1b345.json new file mode 100644 index 000000000..d137e184a --- /dev/null +++ b/fixtures/test/blockfrost/getProtocolParameters/getProtocolParameters-2d2ce3159a465c84058d7eab67b1b345.json @@ -0,0 +1 @@ +{"epoch":374,"min_fee_a":44,"min_fee_b":155381,"max_block_size":90112,"max_tx_size":16384,"max_block_header_size":1100,"key_deposit":"2000000","pool_deposit":"500000000","e_max":18,"n_opt":500,"a0":0.3,"rho":0.003,"tau":0.2,"decentralisation_param":0,"extra_entropy":null,"protocol_major_ver":8,"protocol_minor_ver":0,"min_utxo":"4310","min_pool_cost":"170000000","nonce":"e35763cef0b1b30b21d7cf61e8572e016fe3b71c0619a80d1d4850643357d047","cost_models":{"PlutusV1":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEd25519Signature-cpu-arguments-intercept":57996947,"verifyEd25519Signature-cpu-arguments-slope":18975,"verifyEd25519Signature-memory-arguments":10},"PlutusV2":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"serialiseData-cpu-arguments-intercept":1159724,"serialiseData-cpu-arguments-slope":392670,"serialiseData-memory-arguments-intercept":0,"serialiseData-memory-arguments-slope":2,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEcdsaSecp256k1Signature-cpu-arguments":35892428,"verifyEcdsaSecp256k1Signature-memory-arguments":10,"verifyEd25519Signature-cpu-arguments-intercept":57996947,"verifyEd25519Signature-cpu-arguments-slope":18975,"verifyEd25519Signature-memory-arguments":10,"verifySchnorrSecp256k1Signature-cpu-arguments-intercept":38887044,"verifySchnorrSecp256k1Signature-cpu-arguments-slope":32947,"verifySchnorrSecp256k1Signature-memory-arguments":10}},"price_mem":0.0577,"price_step":0.0000721,"max_tx_ex_mem":"14000000","max_tx_ex_steps":"10000000000","max_block_ex_mem":"62000000","max_block_ex_steps":"20000000000","max_val_size":"5000","collateral_percent":150,"max_collateral_inputs":3,"coins_per_utxo_size":"4310","coins_per_utxo_word":"4310"} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-0cbfedbf9c461116322a023c58f3a2e0.json b/fixtures/test/ogmios/chainTip-0cbfedbf9c461116322a023c58f3a2e0.json deleted file mode 100644 index c690c3898..000000000 --- a/fixtures/test/ogmios/chainTip-0cbfedbf9c461116322a023c58f3a2e0.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"6cb4da9d4dd6df22b329bb1db8e49b3b6e9c326244a73c10801d0aeff7b8aae3","slot":66548374} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-256cc6b0599bbd3f1b492083ce01dbf1.json b/fixtures/test/ogmios/chainTip-256cc6b0599bbd3f1b492083ce01dbf1.json deleted file mode 100644 index a5338c330..000000000 --- a/fixtures/test/ogmios/chainTip-256cc6b0599bbd3f1b492083ce01dbf1.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"829ba391306aaa041c647a87b562e8d670cd230076ef126477fe7aca71331741","slot":1888706} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-33384ff2ce253b20ed805395c5f719b5.json b/fixtures/test/ogmios/chainTip-33384ff2ce253b20ed805395c5f719b5.json deleted file mode 100644 index 4de268fbd..000000000 --- a/fixtures/test/ogmios/chainTip-33384ff2ce253b20ed805395c5f719b5.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"e94ce9dd507217cea0b70eaf5f37a3cad3106eb38df1b78242911b0a969d306f","slot":1894413} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-352e247aaf34f5ef063e7bd40c3e6da1.json b/fixtures/test/ogmios/chainTip-352e247aaf34f5ef063e7bd40c3e6da1.json deleted file mode 100644 index 172429d52..000000000 --- a/fixtures/test/ogmios/chainTip-352e247aaf34f5ef063e7bd40c3e6da1.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"1115d5fd8b8acada0649971962f1720c692aa23513b13382253e7c13f84a525e","slot":1894095} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-3b2a514f29561154784c3ff3b9014f7b.json b/fixtures/test/ogmios/chainTip-3b2a514f29561154784c3ff3b9014f7b.json deleted file mode 100644 index a7c8b4462..000000000 --- a/fixtures/test/ogmios/chainTip-3b2a514f29561154784c3ff3b9014f7b.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"a1c5c9d751d3eb0eea358e88d5c63c9bf3e4751bdfdb855e9d7bfd9359ba296d","slot":1886697} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-413f14ac202089f297cef36743fdc3af.json b/fixtures/test/ogmios/chainTip-413f14ac202089f297cef36743fdc3af.json deleted file mode 100644 index 89c7496ed..000000000 --- a/fixtures/test/ogmios/chainTip-413f14ac202089f297cef36743fdc3af.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"242a65ae3dbf8682b525342a50b0bf29349c251eb0291aecfc98278c2d33c5df","slot":1885226} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-45449728188ad3ad324c21d3da6d4878.json b/fixtures/test/ogmios/chainTip-45449728188ad3ad324c21d3da6d4878.json deleted file mode 100644 index 0cbcb4d02..000000000 --- a/fixtures/test/ogmios/chainTip-45449728188ad3ad324c21d3da6d4878.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"d6f6822844d2bbe6dad521ce699a523deb9c210b8b7758afddb2f57c103dd804","slot":1888493} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-5702801170e294405944b2c20ea84f92.json b/fixtures/test/ogmios/chainTip-5702801170e294405944b2c20ea84f92.json deleted file mode 100644 index 4e2a9d722..000000000 --- a/fixtures/test/ogmios/chainTip-5702801170e294405944b2c20ea84f92.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"190af9f3b0eb9bf062993c51d70eabc56f31de4645dd7ae2b3fa36c4fec75b95","slot":1885025} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-5e316fd232ed7a93f434260692fadb42.json b/fixtures/test/ogmios/chainTip-5e316fd232ed7a93f434260692fadb42.json deleted file mode 100644 index bf4c6359c..000000000 --- a/fixtures/test/ogmios/chainTip-5e316fd232ed7a93f434260692fadb42.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"868b9320cc2be1e9ffa45e244026efb46869d477c07f804e9037dc709e92d6db","slot":1907982} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-74ab6d8659a259f85e4bce30be904451.json b/fixtures/test/ogmios/chainTip-74ab6d8659a259f85e4bce30be904451.json deleted file mode 100644 index 268149693..000000000 --- a/fixtures/test/ogmios/chainTip-74ab6d8659a259f85e4bce30be904451.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"d23ec206b71a726888c84c6031f36abca675cd3a071b3b63590c44d737499c69","slot":1887842} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-7c012adccbd90622d09a4efcf98ef5ba.json b/fixtures/test/ogmios/chainTip-7c012adccbd90622d09a4efcf98ef5ba.json deleted file mode 100644 index 7d42640c1..000000000 --- a/fixtures/test/ogmios/chainTip-7c012adccbd90622d09a4efcf98ef5ba.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"6a69fe94c2e9abc06e9918e083a1243849604fcef7dfa03c4df4bb4fa8cb2ce8","slot":1886102} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-84d84f6061c30740ebfef15fa6898d04.json b/fixtures/test/ogmios/chainTip-84d84f6061c30740ebfef15fa6898d04.json deleted file mode 100644 index 2c33a79ea..000000000 --- a/fixtures/test/ogmios/chainTip-84d84f6061c30740ebfef15fa6898d04.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"d8b74f26e5e7ac3d5cda3611f5336135780a60280ae9787018cdef6029bb22d3","slot":1885213} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-89419e60a37ad985d0f6a3f1dbdf3a57.json b/fixtures/test/ogmios/chainTip-89419e60a37ad985d0f6a3f1dbdf3a57.json deleted file mode 100644 index 34f88b56b..000000000 --- a/fixtures/test/ogmios/chainTip-89419e60a37ad985d0f6a3f1dbdf3a57.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"4f5b78e9a0c591444da6fabdb2491f2e6d16d5d02b0fc9452e890b4ad6020dc5","slot":1958967} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-9d9094430c84b08573785786d2d9263e.json b/fixtures/test/ogmios/chainTip-9d9094430c84b08573785786d2d9263e.json deleted file mode 100644 index f48db3f65..000000000 --- a/fixtures/test/ogmios/chainTip-9d9094430c84b08573785786d2d9263e.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"f910b3bec65f407889d2a3dd493b3a8842ce768dcfb353c63a21ec4a46f66269","slot":1905968} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-deafb6615f772fbdf1429dfebc39c25d.json b/fixtures/test/ogmios/chainTip-deafb6615f772fbdf1429dfebc39c25d.json deleted file mode 100644 index e5da46e63..000000000 --- a/fixtures/test/ogmios/chainTip-deafb6615f772fbdf1429dfebc39c25d.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"f220103510c8f2f2c5224fcdced21ce57a0a9775e199bf0aa83c6e3a512b4116","slot":1894855} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-e121a9c9f5e425ad58f84db940082abb.json b/fixtures/test/ogmios/chainTip-e121a9c9f5e425ad58f84db940082abb.json deleted file mode 100644 index b43786b88..000000000 --- a/fixtures/test/ogmios/chainTip-e121a9c9f5e425ad58f84db940082abb.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"f59c3e3b2954ba387f57b141413797dc6ce85ff2858d04638a010e121aea4cfe","slot":1884910} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-e17c77f317db5ef57634c48500baf319.json b/fixtures/test/ogmios/chainTip-e17c77f317db5ef57634c48500baf319.json deleted file mode 100644 index d834f1341..000000000 --- a/fixtures/test/ogmios/chainTip-e17c77f317db5ef57634c48500baf319.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"76ebdeb4ca9806f7bbd273a1db6833259a05be9b7f3b856bcb2c8113f1aa7d77","slot":1885185} \ No newline at end of file diff --git a/fixtures/test/ogmios/chainTip-ee3c92f2b0da1d37b289e8baff88f2ff.json b/fixtures/test/ogmios/chainTip-ee3c92f2b0da1d37b289e8baff88f2ff.json deleted file mode 100644 index 154f10e00..000000000 --- a/fixtures/test/ogmios/chainTip-ee3c92f2b0da1d37b289e8baff88f2ff.json +++ /dev/null @@ -1 +0,0 @@ -{"hash":"6d4982d0e98676939d389066f3d0b24b1b5d9102ffa49a3a481913a4b6328609","slot":1896465} \ No newline at end of file diff --git a/fixtures/test/ogmios/currentEpoch-13fe9d84310e77f13a6d184dbf1232f3.json b/fixtures/test/ogmios/currentEpoch-13fe9d84310e77f13a6d184dbf1232f3.json deleted file mode 100644 index fba8ce006..000000000 --- a/fixtures/test/ogmios/currentEpoch-13fe9d84310e77f13a6d184dbf1232f3.json +++ /dev/null @@ -1 +0,0 @@ -224 \ No newline at end of file diff --git a/fixtures/test/ogmios/currentEpoch-36660e59856b4de58a219bcf4e27eba3.json b/fixtures/test/ogmios/currentEpoch-36660e59856b4de58a219bcf4e27eba3.json deleted file mode 100644 index bb81456fa..000000000 --- a/fixtures/test/ogmios/currentEpoch-36660e59856b4de58a219bcf4e27eba3.json +++ /dev/null @@ -1 +0,0 @@ -262 \ No newline at end of file diff --git a/fixtures/test/ogmios/currentEpoch-4734ba6f3de83d861c3176a6273cac6d.json b/fixtures/test/ogmios/currentEpoch-4734ba6f3de83d861c3176a6273cac6d.json deleted file mode 100644 index e21ad0e4f..000000000 --- a/fixtures/test/ogmios/currentEpoch-4734ba6f3de83d861c3176a6273cac6d.json +++ /dev/null @@ -1 +0,0 @@ -273 \ No newline at end of file diff --git a/fixtures/test/ogmios/currentEpoch-8c19f571e251e61cb8dd3612f26d5ecf.json b/fixtures/test/ogmios/currentEpoch-8c19f571e251e61cb8dd3612f26d5ecf.json deleted file mode 100644 index 680cc9c31..000000000 --- a/fixtures/test/ogmios/currentEpoch-8c19f571e251e61cb8dd3612f26d5ecf.json +++ /dev/null @@ -1 +0,0 @@ -263 \ No newline at end of file diff --git a/fixtures/test/ogmios/currentEpoch-d6baf65e0b240ce177cf70da146c8dc8.json b/fixtures/test/ogmios/currentEpoch-d6baf65e0b240ce177cf70da146c8dc8.json deleted file mode 100644 index 44dfb1d0b..000000000 --- a/fixtures/test/ogmios/currentEpoch-d6baf65e0b240ce177cf70da146c8dc8.json +++ /dev/null @@ -1 +0,0 @@ -264 \ No newline at end of file diff --git a/fixtures/test/ogmios/currentEpoch-e56954b4f6347e897f954495eab16a88.json b/fixtures/test/ogmios/currentEpoch-e56954b4f6347e897f954495eab16a88.json deleted file mode 100644 index b1ef57c1f..000000000 --- a/fixtures/test/ogmios/currentEpoch-e56954b4f6347e897f954495eab16a88.json +++ /dev/null @@ -1 +0,0 @@ -265 \ No newline at end of file diff --git a/fixtures/test/ogmios/currentProtocolParameters-2adce4ab4ea7749607673c7c4ae75712.json b/fixtures/test/ogmios/currentProtocolParameters-2adce4ab4ea7749607673c7c4ae75712.json deleted file mode 100644 index 2d4427c11..000000000 --- a/fixtures/test/ogmios/currentProtocolParameters-2adce4ab4ea7749607673c7c4ae75712.json +++ /dev/null @@ -1 +0,0 @@ -{"coinsPerUtxoByte":4310,"collateralPercentage":150,"costModels":{"plutus:v1":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10},"plutus:v2":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"serialiseData-cpu-arguments-intercept":1159724,"serialiseData-cpu-arguments-slope":392670,"serialiseData-memory-arguments-intercept":0,"serialiseData-memory-arguments-slope":2,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEcdsaSecp256k1Signature-cpu-arguments":35892428,"verifyEcdsaSecp256k1Signature-memory-arguments":10,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10,"verifySchnorrSecp256k1Signature-cpu-arguments-intercept":38887044,"verifySchnorrSecp256k1Signature-cpu-arguments-slope":32947,"verifySchnorrSecp256k1Signature-memory-arguments":10}},"desiredNumberOfPools":50,"maxBlockBodySize":65536,"maxBlockHeaderSize":1100,"maxCollateralInputs":3,"maxExecutionUnitsPerBlock":{"memory":50000000,"steps":40000000000},"maxExecutionUnitsPerTransaction":{"memory":10000000,"steps":10000000000},"maxTxSize":16384,"maxValueSize":5000,"minFeeCoefficient":44,"minFeeConstant":155381,"minPoolCost":0,"monetaryExpansion":"178650067/100000000000","poolDeposit":500000000,"poolInfluence":"1/10","poolRetirementEpochBound":18,"prices":{"memory":"577/10000","steps":"721/10000000"},"protocolVersion":{"major":7,"minor":0},"stakeKeyDeposit":400000,"treasuryExpansion":"1/10"} \ No newline at end of file diff --git a/fixtures/test/ogmios/currentProtocolParameters-4e6d46e29456394fd3313ba4909b1a49.json b/fixtures/test/ogmios/currentProtocolParameters-4e6d46e29456394fd3313ba4909b1a49.json deleted file mode 100644 index f61b65369..000000000 --- a/fixtures/test/ogmios/currentProtocolParameters-4e6d46e29456394fd3313ba4909b1a49.json +++ /dev/null @@ -1 +0,0 @@ -{"coinsPerUtxoByte":4310,"collateralPercentage":150,"costModels":{"plutus:v1":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10},"plutus:v2":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"serialiseData-cpu-arguments-intercept":1159724,"serialiseData-cpu-arguments-slope":392670,"serialiseData-memory-arguments-intercept":0,"serialiseData-memory-arguments-slope":2,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEcdsaSecp256k1Signature-cpu-arguments":20000000000,"verifyEcdsaSecp256k1Signature-memory-arguments":20000000000,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10,"verifySchnorrSecp256k1Signature-cpu-arguments-intercept":20000000000,"verifySchnorrSecp256k1Signature-cpu-arguments-slope":0,"verifySchnorrSecp256k1Signature-memory-arguments":20000000000}},"desiredNumberOfPools":500,"maxBlockBodySize":98304,"maxBlockHeaderSize":1100,"maxCollateralInputs":3,"maxExecutionUnitsPerBlock":{"memory":80000000,"steps":40000000000},"maxExecutionUnitsPerTransaction":{"memory":16000000,"steps":10000000000},"maxTxSize":16384,"maxValueSize":5000,"minFeeCoefficient":44,"minFeeConstant":155381,"minPoolCost":340000000,"monetaryExpansion":"3/1000","poolDeposit":500000000,"poolInfluence":"3/10","poolRetirementEpochBound":18,"prices":{"memory":"577/10000","steps":"721/10000000"},"protocolVersion":{"major":7,"minor":0},"stakeKeyDeposit":2000000,"treasuryExpansion":"1/5"} \ No newline at end of file diff --git a/fixtures/test/ogmios/currentProtocolParameters-9f10850f285b1493955267e900008841.json b/fixtures/test/ogmios/currentProtocolParameters-9f10850f285b1493955267e900008841.json deleted file mode 100644 index ad617ad1f..000000000 --- a/fixtures/test/ogmios/currentProtocolParameters-9f10850f285b1493955267e900008841.json +++ /dev/null @@ -1 +0,0 @@ -{"minFeeCoefficient":44,"minFeeConstant":155381,"maxBlockBodySize":90112,"maxBlockHeaderSize":1100,"maxTxSize":16384,"stakeKeyDeposit":2000000,"poolDeposit":500000000,"poolRetirementEpochBound":18,"desiredNumberOfPools":500,"poolInfluence":"3/10","monetaryExpansion":"3/1000","treasuryExpansion":"1/5","protocolVersion":{"major":8,"minor":0},"minPoolCost":340000000,"coinsPerUtxoByte":4310,"costModels":{"plutus:v1":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10},"plutus:v2":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"serialiseData-cpu-arguments-intercept":1159724,"serialiseData-cpu-arguments-slope":392670,"serialiseData-memory-arguments-intercept":0,"serialiseData-memory-arguments-slope":2,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEcdsaSecp256k1Signature-cpu-arguments":35892428,"verifyEcdsaSecp256k1Signature-memory-arguments":10,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10,"verifySchnorrSecp256k1Signature-cpu-arguments-intercept":38887044,"verifySchnorrSecp256k1Signature-cpu-arguments-slope":32947,"verifySchnorrSecp256k1Signature-memory-arguments":10}},"prices":{"memory":"577/10000","steps":"721/10000000"},"maxExecutionUnitsPerTransaction":{"memory":14000000,"steps":10000000000},"maxExecutionUnitsPerBlock":{"memory":62000000,"steps":40000000000},"maxValueSize":5000,"collateralPercentage":150,"maxCollateralInputs":3} \ No newline at end of file diff --git a/fixtures/test/ogmios/currentProtocolParameters.json b/fixtures/test/ogmios/currentProtocolParameters.json deleted file mode 100644 index 2d4427c11..000000000 --- a/fixtures/test/ogmios/currentProtocolParameters.json +++ /dev/null @@ -1 +0,0 @@ -{"coinsPerUtxoByte":4310,"collateralPercentage":150,"costModels":{"plutus:v1":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10},"plutus:v2":{"addInteger-cpu-arguments-intercept":205665,"addInteger-cpu-arguments-slope":812,"addInteger-memory-arguments-intercept":1,"addInteger-memory-arguments-slope":1,"appendByteString-cpu-arguments-intercept":1000,"appendByteString-cpu-arguments-slope":571,"appendByteString-memory-arguments-intercept":0,"appendByteString-memory-arguments-slope":1,"appendString-cpu-arguments-intercept":1000,"appendString-cpu-arguments-slope":24177,"appendString-memory-arguments-intercept":4,"appendString-memory-arguments-slope":1,"bData-cpu-arguments":1000,"bData-memory-arguments":32,"blake2b_256-cpu-arguments-intercept":117366,"blake2b_256-cpu-arguments-slope":10475,"blake2b_256-memory-arguments":4,"cekApplyCost-exBudgetCPU":23000,"cekApplyCost-exBudgetMemory":100,"cekBuiltinCost-exBudgetCPU":23000,"cekBuiltinCost-exBudgetMemory":100,"cekConstCost-exBudgetCPU":23000,"cekConstCost-exBudgetMemory":100,"cekDelayCost-exBudgetCPU":23000,"cekDelayCost-exBudgetMemory":100,"cekForceCost-exBudgetCPU":23000,"cekForceCost-exBudgetMemory":100,"cekLamCost-exBudgetCPU":23000,"cekLamCost-exBudgetMemory":100,"cekStartupCost-exBudgetCPU":100,"cekStartupCost-exBudgetMemory":100,"cekVarCost-exBudgetCPU":23000,"cekVarCost-exBudgetMemory":100,"chooseData-cpu-arguments":19537,"chooseData-memory-arguments":32,"chooseList-cpu-arguments":175354,"chooseList-memory-arguments":32,"chooseUnit-cpu-arguments":46417,"chooseUnit-memory-arguments":4,"consByteString-cpu-arguments-intercept":221973,"consByteString-cpu-arguments-slope":511,"consByteString-memory-arguments-intercept":0,"consByteString-memory-arguments-slope":1,"constrData-cpu-arguments":89141,"constrData-memory-arguments":32,"decodeUtf8-cpu-arguments-intercept":497525,"decodeUtf8-cpu-arguments-slope":14068,"decodeUtf8-memory-arguments-intercept":4,"decodeUtf8-memory-arguments-slope":2,"divideInteger-cpu-arguments-constant":196500,"divideInteger-cpu-arguments-model-arguments-intercept":453240,"divideInteger-cpu-arguments-model-arguments-slope":220,"divideInteger-memory-arguments-intercept":0,"divideInteger-memory-arguments-minimum":1,"divideInteger-memory-arguments-slope":1,"encodeUtf8-cpu-arguments-intercept":1000,"encodeUtf8-cpu-arguments-slope":28662,"encodeUtf8-memory-arguments-intercept":4,"encodeUtf8-memory-arguments-slope":2,"equalsByteString-cpu-arguments-constant":245000,"equalsByteString-cpu-arguments-intercept":216773,"equalsByteString-cpu-arguments-slope":62,"equalsByteString-memory-arguments":1,"equalsData-cpu-arguments-intercept":1060367,"equalsData-cpu-arguments-slope":12586,"equalsData-memory-arguments":1,"equalsInteger-cpu-arguments-intercept":208512,"equalsInteger-cpu-arguments-slope":421,"equalsInteger-memory-arguments":1,"equalsString-cpu-arguments-constant":187000,"equalsString-cpu-arguments-intercept":1000,"equalsString-cpu-arguments-slope":52998,"equalsString-memory-arguments":1,"fstPair-cpu-arguments":80436,"fstPair-memory-arguments":32,"headList-cpu-arguments":43249,"headList-memory-arguments":32,"iData-cpu-arguments":1000,"iData-memory-arguments":32,"ifThenElse-cpu-arguments":80556,"ifThenElse-memory-arguments":1,"indexByteString-cpu-arguments":57667,"indexByteString-memory-arguments":4,"lengthOfByteString-cpu-arguments":1000,"lengthOfByteString-memory-arguments":10,"lessThanByteString-cpu-arguments-intercept":197145,"lessThanByteString-cpu-arguments-slope":156,"lessThanByteString-memory-arguments":1,"lessThanEqualsByteString-cpu-arguments-intercept":197145,"lessThanEqualsByteString-cpu-arguments-slope":156,"lessThanEqualsByteString-memory-arguments":1,"lessThanEqualsInteger-cpu-arguments-intercept":204924,"lessThanEqualsInteger-cpu-arguments-slope":473,"lessThanEqualsInteger-memory-arguments":1,"lessThanInteger-cpu-arguments-intercept":208896,"lessThanInteger-cpu-arguments-slope":511,"lessThanInteger-memory-arguments":1,"listData-cpu-arguments":52467,"listData-memory-arguments":32,"mapData-cpu-arguments":64832,"mapData-memory-arguments":32,"mkCons-cpu-arguments":65493,"mkCons-memory-arguments":32,"mkNilData-cpu-arguments":22558,"mkNilData-memory-arguments":32,"mkNilPairData-cpu-arguments":16563,"mkNilPairData-memory-arguments":32,"mkPairData-cpu-arguments":76511,"mkPairData-memory-arguments":32,"modInteger-cpu-arguments-constant":196500,"modInteger-cpu-arguments-model-arguments-intercept":453240,"modInteger-cpu-arguments-model-arguments-slope":220,"modInteger-memory-arguments-intercept":0,"modInteger-memory-arguments-minimum":1,"modInteger-memory-arguments-slope":1,"multiplyInteger-cpu-arguments-intercept":69522,"multiplyInteger-cpu-arguments-slope":11687,"multiplyInteger-memory-arguments-intercept":0,"multiplyInteger-memory-arguments-slope":1,"nullList-cpu-arguments":60091,"nullList-memory-arguments":32,"quotientInteger-cpu-arguments-constant":196500,"quotientInteger-cpu-arguments-model-arguments-intercept":453240,"quotientInteger-cpu-arguments-model-arguments-slope":220,"quotientInteger-memory-arguments-intercept":0,"quotientInteger-memory-arguments-minimum":1,"quotientInteger-memory-arguments-slope":1,"remainderInteger-cpu-arguments-constant":196500,"remainderInteger-cpu-arguments-model-arguments-intercept":453240,"remainderInteger-cpu-arguments-model-arguments-slope":220,"remainderInteger-memory-arguments-intercept":0,"remainderInteger-memory-arguments-minimum":1,"remainderInteger-memory-arguments-slope":1,"serialiseData-cpu-arguments-intercept":1159724,"serialiseData-cpu-arguments-slope":392670,"serialiseData-memory-arguments-intercept":0,"serialiseData-memory-arguments-slope":2,"sha2_256-cpu-arguments-intercept":806990,"sha2_256-cpu-arguments-slope":30482,"sha2_256-memory-arguments":4,"sha3_256-cpu-arguments-intercept":1927926,"sha3_256-cpu-arguments-slope":82523,"sha3_256-memory-arguments":4,"sliceByteString-cpu-arguments-intercept":265318,"sliceByteString-cpu-arguments-slope":0,"sliceByteString-memory-arguments-intercept":4,"sliceByteString-memory-arguments-slope":0,"sndPair-cpu-arguments":85931,"sndPair-memory-arguments":32,"subtractInteger-cpu-arguments-intercept":205665,"subtractInteger-cpu-arguments-slope":812,"subtractInteger-memory-arguments-intercept":1,"subtractInteger-memory-arguments-slope":1,"tailList-cpu-arguments":41182,"tailList-memory-arguments":32,"trace-cpu-arguments":212342,"trace-memory-arguments":32,"unBData-cpu-arguments":31220,"unBData-memory-arguments":32,"unConstrData-cpu-arguments":32696,"unConstrData-memory-arguments":32,"unIData-cpu-arguments":43357,"unIData-memory-arguments":32,"unListData-cpu-arguments":32247,"unListData-memory-arguments":32,"unMapData-cpu-arguments":38314,"unMapData-memory-arguments":32,"verifyEcdsaSecp256k1Signature-cpu-arguments":35892428,"verifyEcdsaSecp256k1Signature-memory-arguments":10,"verifyEd25519Signature-cpu-arguments-intercept":9462713,"verifyEd25519Signature-cpu-arguments-slope":1021,"verifyEd25519Signature-memory-arguments":10,"verifySchnorrSecp256k1Signature-cpu-arguments-intercept":38887044,"verifySchnorrSecp256k1Signature-cpu-arguments-slope":32947,"verifySchnorrSecp256k1Signature-memory-arguments":10}},"desiredNumberOfPools":50,"maxBlockBodySize":65536,"maxBlockHeaderSize":1100,"maxCollateralInputs":3,"maxExecutionUnitsPerBlock":{"memory":50000000,"steps":40000000000},"maxExecutionUnitsPerTransaction":{"memory":10000000,"steps":10000000000},"maxTxSize":16384,"maxValueSize":5000,"minFeeCoefficient":44,"minFeeConstant":155381,"minPoolCost":0,"monetaryExpansion":"178650067/100000000000","poolDeposit":500000000,"poolInfluence":"1/10","poolRetirementEpochBound":18,"prices":{"memory":"577/10000","steps":"721/10000000"},"protocolVersion":{"major":7,"minor":0},"stakeKeyDeposit":400000,"treasuryExpansion":"1/10"} \ No newline at end of file diff --git a/fixtures/test/ogmios/eraSummaries-09c1f918b78f701df43777607d0ca090.json b/fixtures/test/ogmios/eraSummaries-09c1f918b78f701df43777607d0ca090.json deleted file mode 100644 index 6b092c72d..000000000 --- a/fixtures/test/ogmios/eraSummaries-09c1f918b78f701df43777607d0ca090.json +++ /dev/null @@ -1 +0,0 @@ -[{"end":{"epoch":1,"slot":360,"time":7200},"parameters":{"epochLength":360,"safeZone":72,"slotLength":20},"start":{"epoch":0,"slot":0,"time":0}},{"end":{"epoch":2,"slot":7560,"time":14400},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":1,"slot":360,"time":7200}},{"end":{"epoch":3,"slot":14760,"time":21600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":2,"slot":7560,"time":14400}},{"end":{"epoch":4,"slot":21960,"time":28800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":3,"slot":14760,"time":21600}},{"end":{"epoch":13,"slot":86760,"time":93600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":4,"slot":21960,"time":28800}},{"end":{"epoch":264,"slot":1893960,"time":1900800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":13,"slot":86760,"time":93600}}] \ No newline at end of file diff --git a/fixtures/test/ogmios/eraSummaries-6df28f7065f77208bb3d8a86e17d2629.json b/fixtures/test/ogmios/eraSummaries-6df28f7065f77208bb3d8a86e17d2629.json deleted file mode 100644 index 12d5def32..000000000 --- a/fixtures/test/ogmios/eraSummaries-6df28f7065f77208bb3d8a86e17d2629.json +++ /dev/null @@ -1 +0,0 @@ -[{"end":{"epoch":1,"slot":360,"time":7200},"parameters":{"epochLength":360,"safeZone":72,"slotLength":20},"start":{"epoch":0,"slot":0,"time":0}},{"end":{"epoch":2,"slot":7560,"time":14400},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":1,"slot":360,"time":7200}},{"end":{"epoch":3,"slot":14760,"time":21600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":2,"slot":7560,"time":14400}},{"end":{"epoch":4,"slot":21960,"time":28800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":3,"slot":14760,"time":21600}},{"end":{"epoch":13,"slot":86760,"time":93600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":4,"slot":21960,"time":28800}},{"end":{"epoch":265,"slot":1901160,"time":1908000},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":13,"slot":86760,"time":93600}}] \ No newline at end of file diff --git a/fixtures/test/ogmios/eraSummaries-bbf8b1d7d2487e750104ec2b5a31fa86.json b/fixtures/test/ogmios/eraSummaries-bbf8b1d7d2487e750104ec2b5a31fa86.json deleted file mode 100644 index 7482268dc..000000000 --- a/fixtures/test/ogmios/eraSummaries-bbf8b1d7d2487e750104ec2b5a31fa86.json +++ /dev/null @@ -1 +0,0 @@ -[{"end":{"epoch":74,"slot":1598400,"time":31968000},"parameters":{"epochLength":21600,"safeZone":4320,"slotLength":20},"start":{"epoch":0,"slot":0,"time":0}},{"end":{"epoch":102,"slot":13694400,"time":44064000},"parameters":{"epochLength":432000,"safeZone":129600,"slotLength":1},"start":{"epoch":74,"slot":1598400,"time":31968000}},{"end":{"epoch":112,"slot":18014400,"time":48384000},"parameters":{"epochLength":432000,"safeZone":129600,"slotLength":1},"start":{"epoch":102,"slot":13694400,"time":44064000}},{"end":{"epoch":154,"slot":36158400,"time":66528000},"parameters":{"epochLength":432000,"safeZone":129600,"slotLength":1},"start":{"epoch":112,"slot":18014400,"time":48384000}},{"end":{"epoch":215,"slot":62510400,"time":92880000},"parameters":{"epochLength":432000,"safeZone":129600,"slotLength":1},"start":{"epoch":154,"slot":36158400,"time":66528000}},{"end":{"epoch":225,"slot":66830400,"time":97200000},"parameters":{"epochLength":432000,"safeZone":129600,"slotLength":1},"start":{"epoch":215,"slot":62510400,"time":92880000}}] \ No newline at end of file diff --git a/fixtures/test/ogmios/eraSummaries-d5d029cfd6b75f3f4402131b67402b32.json b/fixtures/test/ogmios/eraSummaries-d5d029cfd6b75f3f4402131b67402b32.json deleted file mode 100644 index 6dc21e1db..000000000 --- a/fixtures/test/ogmios/eraSummaries-d5d029cfd6b75f3f4402131b67402b32.json +++ /dev/null @@ -1 +0,0 @@ -[{"end":{"epoch":1,"slot":360,"time":7200},"parameters":{"epochLength":360,"safeZone":72,"slotLength":20},"start":{"epoch":0,"slot":0,"time":0}},{"end":{"epoch":2,"slot":7560,"time":14400},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":1,"slot":360,"time":7200}},{"end":{"epoch":3,"slot":14760,"time":21600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":2,"slot":7560,"time":14400}},{"end":{"epoch":4,"slot":21960,"time":28800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":3,"slot":14760,"time":21600}},{"end":{"epoch":13,"slot":86760,"time":93600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":4,"slot":21960,"time":28800}},{"end":{"epoch":267,"slot":1915560,"time":1922400},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":13,"slot":86760,"time":93600}}] \ No newline at end of file diff --git a/fixtures/test/ogmios/eraSummaries-dd511bb2ee535232ffb380a5c5545b79.json b/fixtures/test/ogmios/eraSummaries-dd511bb2ee535232ffb380a5c5545b79.json deleted file mode 100644 index 13cf999b2..000000000 --- a/fixtures/test/ogmios/eraSummaries-dd511bb2ee535232ffb380a5c5545b79.json +++ /dev/null @@ -1 +0,0 @@ -[{"end":{"epoch":1,"slot":360,"time":7200},"parameters":{"epochLength":360,"safeZone":72,"slotLength":20},"start":{"epoch":0,"slot":0,"time":0}},{"end":{"epoch":2,"slot":7560,"time":14400},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":1,"slot":360,"time":7200}},{"end":{"epoch":3,"slot":14760,"time":21600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":2,"slot":7560,"time":14400}},{"end":{"epoch":4,"slot":21960,"time":28800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":3,"slot":14760,"time":21600}},{"end":{"epoch":13,"slot":86760,"time":93600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":4,"slot":21960,"time":28800}},{"end":{"epoch":266,"slot":1908360,"time":1915200},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":13,"slot":86760,"time":93600}}] \ No newline at end of file diff --git a/fixtures/test/ogmios/eraSummaries-eba8639c38a39eb796f833d7a3b647cf.json b/fixtures/test/ogmios/eraSummaries-eba8639c38a39eb796f833d7a3b647cf.json deleted file mode 100644 index de2ce8d92..000000000 --- a/fixtures/test/ogmios/eraSummaries-eba8639c38a39eb796f833d7a3b647cf.json +++ /dev/null @@ -1 +0,0 @@ -[{"end":{"epoch":1,"slot":360,"time":7200},"parameters":{"epochLength":360,"safeZone":72,"slotLength":20},"start":{"epoch":0,"slot":0,"time":0}},{"end":{"epoch":2,"slot":7560,"time":14400},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":1,"slot":360,"time":7200}},{"end":{"epoch":3,"slot":14760,"time":21600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":2,"slot":7560,"time":14400}},{"end":{"epoch":4,"slot":21960,"time":28800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":3,"slot":14760,"time":21600}},{"end":{"epoch":13,"slot":86760,"time":93600},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":4,"slot":21960,"time":28800}},{"end":{"epoch":274,"slot":1965960,"time":1972800},"parameters":{"epochLength":7200,"safeZone":2160,"slotLength":1},"start":{"epoch":13,"slot":86760,"time":93600}}] \ No newline at end of file diff --git a/fixtures/test/ogmios/queryLedgerState-epoch-8d7a461f70d4d44d0d8cdd64c5fba15c.json b/fixtures/test/ogmios/queryLedgerState-epoch-8d7a461f70d4d44d0d8cdd64c5fba15c.json new file mode 100644 index 000000000..093568ebd --- /dev/null +++ b/fixtures/test/ogmios/queryLedgerState-epoch-8d7a461f70d4d44d0d8cdd64c5fba15c.json @@ -0,0 +1 @@ +{"result":374,"method":"queryLedgerState/epoch","jsonrpc":"2.0","id":"queryLedgerState/epoch-3rvj1ml27d5loixoww7","error":null} \ No newline at end of file diff --git a/fixtures/test/ogmios/queryLedgerState-eraSummaries-d8b19110b9580cddfa3895eea34c2139.json b/fixtures/test/ogmios/queryLedgerState-eraSummaries-d8b19110b9580cddfa3895eea34c2139.json new file mode 100644 index 000000000..6a2ce7478 --- /dev/null +++ b/fixtures/test/ogmios/queryLedgerState-eraSummaries-d8b19110b9580cddfa3895eea34c2139.json @@ -0,0 +1 @@ +{"result":[{"start":{"time":0,"slot":0,"epoch":0},"end":{"time":0,"slot":0,"epoch":0},"parameters":{"epochLength":4320,"slotLength":{"seconds":20},"safeZone":864}},{"start":{"time":0,"slot":0,"epoch":0},"end":{"time":0,"slot":0,"epoch":0},"parameters":{"epochLength":86400,"slotLength":{"seconds":1},"safeZone":25920}},{"start":{"time":0,"slot":0,"epoch":0},"end":{"time":0,"slot":0,"epoch":0},"parameters":{"epochLength":86400,"slotLength":{"seconds":1},"safeZone":25920}},{"start":{"time":0,"slot":0,"epoch":0},"end":{"time":0,"slot":0,"epoch":0},"parameters":{"epochLength":86400,"slotLength":{"seconds":1},"safeZone":25920}},{"start":{"time":0,"slot":0,"epoch":0},"end":{"time":259200,"slot":259200,"epoch":3},"parameters":{"epochLength":86400,"slotLength":{"seconds":1},"safeZone":25920}},{"start":{"time":259200,"slot":259200,"epoch":3},"end":{"time":32486400,"slot":32486400,"epoch":376},"parameters":{"epochLength":86400,"slotLength":{"seconds":1},"safeZone":25920}}],"method":"queryLedgerState/eraSummaries","jsonrpc":"2.0","id":"queryLedgerState/eraSummaries-3rvj1ml27d5loixoww8","error":null} \ No newline at end of file diff --git a/fixtures/test/ogmios/queryLedgerState-protocolParameters-68ba1141d17af9326cad70407ea3d7fb.json b/fixtures/test/ogmios/queryLedgerState-protocolParameters-68ba1141d17af9326cad70407ea3d7fb.json new file mode 100644 index 000000000..154c4a496 --- /dev/null +++ b/fixtures/test/ogmios/queryLedgerState-protocolParameters-68ba1141d17af9326cad70407ea3d7fb.json @@ -0,0 +1 @@ +{"result":{"minFeeCoefficient":44,"minFeeConstant":{"lovelace":155381},"maxBlockBodySize":{"bytes":90112},"maxBlockHeaderSize":{"bytes":1100},"maxTransactionSize":{"bytes":16384},"stakeCredentialDeposit":{"lovelace":2000000},"stakePoolDeposit":{"lovelace":500000000},"stakePoolRetirementEpochBound":18,"desiredNumberOfStakePools":500,"stakePoolPledgeInfluence":"3/10","monetaryExpansion":"3/1000","treasuryExpansion":"1/5","minStakePoolCost":{"lovelace":170000000},"minUtxoDepositConstant":0,"minUtxoDepositCoefficient":4310,"plutusCostModels":{"plutus:v1":[205665,812,1,1,1000,571,0,1,1000,24177,4,1,1000,32,117366,10475,4,23000,100,23000,100,23000,100,23000,100,23000,100,23000,100,100,100,23000,100,19537,32,175354,32,46417,4,221973,511,0,1,89141,32,497525,14068,4,2,196500,453240,220,0,1,1,1000,28662,4,2,245000,216773,62,1,1060367,12586,1,208512,421,1,187000,1000,52998,1,80436,32,43249,32,1000,32,80556,1,57667,4,1000,10,197145,156,1,197145,156,1,204924,473,1,208896,511,1,52467,32,64832,32,65493,32,22558,32,16563,32,76511,32,196500,453240,220,0,1,1,69522,11687,0,1,60091,32,196500,453240,220,0,1,1,196500,453240,220,0,1,1,806990,30482,4,1927926,82523,4,265318,0,4,0,85931,32,205665,812,1,1,41182,32,212342,32,31220,32,32696,32,43357,32,32247,32,38314,32,57996947,18975,10],"plutus:v2":[205665,812,1,1,1000,571,0,1,1000,24177,4,1,1000,32,117366,10475,4,23000,100,23000,100,23000,100,23000,100,23000,100,23000,100,100,100,23000,100,19537,32,175354,32,46417,4,221973,511,0,1,89141,32,497525,14068,4,2,196500,453240,220,0,1,1,1000,28662,4,2,245000,216773,62,1,1060367,12586,1,208512,421,1,187000,1000,52998,1,80436,32,43249,32,1000,32,80556,1,57667,4,1000,10,197145,156,1,197145,156,1,204924,473,1,208896,511,1,52467,32,64832,32,65493,32,22558,32,16563,32,76511,32,196500,453240,220,0,1,1,69522,11687,0,1,60091,32,196500,453240,220,0,1,1,196500,453240,220,0,1,1,1159724,392670,0,2,806990,30482,4,1927926,82523,4,265318,0,4,0,85931,32,205665,812,1,1,41182,32,212342,32,31220,32,32696,32,43357,32,32247,32,38314,32,35892428,10,57996947,18975,10,38887044,32947,10]},"scriptExecutionPrices":{"memory":"577/10000","cpu":"721/10000000"},"maxExecutionUnitsPerTransaction":{"memory":14000000,"cpu":10000000000},"maxExecutionUnitsPerBlock":{"memory":62000000,"cpu":20000000000},"maxValueSize":{"bytes":5000},"collateralPercentage":150,"maxCollateralInputs":3,"version":{"major":8,"minor":0}},"method":"queryLedgerState/protocolParameters","jsonrpc":"2.0","id":"queryLedgerState/protocolParameters-3rvj1ml27d5loixoww9","error":null} \ No newline at end of file diff --git a/fixtures/test/ogmios/queryLedgerState-stakePools-e449fe6e00b4f704f6b9b28c7d42047e.json b/fixtures/test/ogmios/queryLedgerState-stakePools-e449fe6e00b4f704f6b9b28c7d42047e.json new file mode 100644 index 000000000..0fd254181 --- /dev/null +++ b/fixtures/test/ogmios/queryLedgerState-stakePools-e449fe6e00b4f704f6b9b28c7d42047e.json @@ -0,0 +1 @@ +{"result":{"pool1qzamfq0qzpggch2rk9daqq8skky7rhvs5g38lchnhw67sve4d36":{"id":"pool1qzamfq0qzpggch2rk9daqq8skky7rhvs5g38lchnhw67sve4d36","vrfVerificationKeyHash":"5746d095a8a960de6ebb1fed6acac883a194645b523d5006692a3ba1481ea70e","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqrty8jrgjn4cywwzds025d64fz39ke2pkjk5rt5nqyrr9gxljplf","owners":["06b21e4344a75c11ce1360f551baaa4512db2a0da56a0d7498083195"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/RSPO5","hash":"9ee2d16fe3a94f0e9ac1fda5b5259ae73612d43ed274504b549e849e863eb992"}},"pool1qrjk9dqdaydy207lw4hf3zlxxg2qlxvxp9kvxx9fscccgwmgfv9":{"id":"pool1qrjk9dqdaydy207lw4hf3zlxxg2qlxvxp9kvxx9fscccgwmgfv9","vrfVerificationKeyHash":"fa730318b97a085aa8722dbb7a2fd59ae35942f880e01c9c8b462d81c84dc4cc","pledge":{"lovelace":9069000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1urdcnx276w4g3h8mgdusutj3wc0uhflgt99ucemgfafd2fqmjjw3u","owners":["db89995ed3aa88dcfb43790e2e51761fcba7e8594bcc67684f52d524"],"relays":[{"type":"ipAddress","ipv4":"194.60.201.143","port":6001}],"metadata":{"url":"https://cardanotech.io/sancho/poolMetaData.json","hash":"ccb6217c050e86cc6128b6c40e9daf5650daeb40225c26abade57c22d68ce7b6"}},"pool1q95luz38nhsw6h7mxud8tptc6mxvnsczhanw4j5htk8h2ltlf3k":{"id":"pool1q95luz38nhsw6h7mxud8tptc6mxvnsczhanw4j5htk8h2ltlf3k","vrfVerificationKeyHash":"00e024fbc63daf0af69eebc5741e7ff183b890ef2628e9bfd4e2bc4d6d1b16b8","pledge":{"lovelace":100000000},"cost":{"lovelace":345000000},"margin":"3/20","rewardAccount":"stake_test1uztsmrxurfw7v3gjz04n8m45kngf4fwhfzxez9wa24rmdxclut9y5","owners":["970d8cdc1a5de6451213eb33eeb4b4d09aa5d7488d9115dd5547b69b"],"relays":[{"type":"ipAddress","ipv4":"83.58.170.227","port":6000}],"metadata":{"url":"https://not.me","hash":"e3568b0190e59d344e0a9803d31ac9fe4ca11c5861b6e3b06527343adbdefae9"}},"pool1qxcz3zxnye8g9ejsqslhl0ljevdx895uc80lr89ulf92gcv40ng":{"id":"pool1qxcz3zxnye8g9ejsqslhl0ljevdx895uc80lr89ulf92gcv40ng","vrfVerificationKeyHash":"e8e9921e6e7428b4a53da8874a843f7cf3ad868cea778f0490dee728273644a5","pledge":{"lovelace":9900000000},"cost":{"lovelace":345000000},"margin":"1/50","rewardAccount":"stake_test1uqm7ecwn9mydtgpnqwcssnc9cq8nsneshs0q9zchq7zrz7gfzcshd","owners":["37ece1d32ec8d5a03303b1084f05c00f384f30bc1e028b1707843179"],"relays":[{"type":"hostname","hostname":"pn1.powerfulpools.com","port":6030}],"metadata":{"url":"https://powerfulpools.com/previewpool1.json","hash":"782694a7c6c9e679f3370bb5aecae8a8988e4c4e37647b2177be59bd0f704ca7"}},"pool1qncwwllw9nwtu7sl7zqw3fpyh4t3q6nhludryfwv0jyqjygd46d":{"id":"pool1qncwwllw9nwtu7sl7zqw3fpyh4t3q6nhludryfwv0jyqjygd46d","vrfVerificationKeyHash":"9b960c725b707c79a4aade62a362be9f35b5b0d7615b8bdd3bfd72a77b0a32a4","pledge":{"lovelace":0},"cost":{"lovelace":345000000},"margin":"1/20","rewardAccount":"stake_test1ur4n0pv3cagnah7atw58qr8an8vm8f75tq5u2q9h925nwasuxt25m","owners":["eb378591c7513edfdd5ba8700cfd99d9b3a7d45829c500b72aa93776"],"relays":[{"type":"hostname","hostname":"beadapool.ddns.net","port":6001}],"metadata":{"url":"https://beadapool.com/media/poolMetaDatapreview.json","hash":"c760f6e23539c052bff72bbc0d921a0663a0fea445b401871d5f65eb3debfc55"}},"pool1q65ag8panwayzaqfs6je7jz2ywt8x2032yaunq5hf25t7t8c26e":{"id":"pool1q65ag8panwayzaqfs6je7jz2ywt8x2032yaunq5hf25t7t8c26e","vrfVerificationKeyHash":"240b5246bc511fa4d7873d91a627aae4e74a60ecfd1165309774a0a7b1dab952","pledge":{"lovelace":42000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzhzr9qzlcr98rhuek3t623e008rye68grawtx6gc5v7g7q2j5u2z","owners":["ae219402fe06538efccda2bd2a397bce32674740fae59b48c519e478"],"relays":[{"type":"hostname","hostname":"test.smaug.pool.pm","port":3003}],"metadata":{"url":"https://smaug.pool.pm/meta-testnet-6adaf6af.json","hash":"6adaf6af9346cc941c916534118b48bdc0e0d560164333d7ab79b113421f2b3b"}},"pool1qal80uhlj949mgv0ecvdkmgqjdn5q27wmpaj4crnr5e9v6qmsv7":{"id":"pool1qal80uhlj949mgv0ecvdkmgqjdn5q27wmpaj4crnr5e9v6qmsv7","vrfVerificationKeyHash":"d498ef12879315f2b3b9bf3d944a42ae4062203db8ebc78236d63f3697f1804c","pledge":{"lovelace":420000000},"cost":{"lovelace":420000000},"margin":"69/1000","rewardAccount":"stake_test1uzpafaxd4q5p7adccdefpnv69dkwlpm7dpkpm3yefxzeluc4z24ec","owners":["83d4f4cda8281f75b8c37290cd9a2b6cef877e686c1dc49949859ff3"],"relays":[{"type":"hostname","hostname":"preview.world.bbhmm.net","port":6200}],"metadata":{"url":"https://pool.bbhmm.net/poolmeta-preview.json","hash":"885cbb02d004f75fad5716c878a6074a9c1bd62b3003d1896b1d27831d67239a"}},"pool1p9xu88dzmpp5l8wmjd6f5xfs9z89mky6up86ty2wz4aavmm8f3m":{"id":"pool1p9xu88dzmpp5l8wmjd6f5xfs9z89mky6up86ty2wz4aavmm8f3m","vrfVerificationKeyHash":"2dd02fc85a8ded714d3d56a684f85d741cef553756d760c8c4d5ae325ab6a1a1","pledge":{"lovelace":1111000000},"cost":{"lovelace":170000000},"margin":"1/100","rewardAccount":"stake_test1uzsf4dc8l9r2uxgwk7vpladqf09vvduw43z6cd0p96ru0gcpg49cx","owners":["a09ab707f946ae190eb7981ff5a04bcac6378eac45ac35e12e87c7a3"],"relays":[{"type":"hostname","hostname":"relay-m.fluxpool.cc","port":5001}],"metadata":{"url":"https://cylonyx.github.io/testnet.json","hash":"99e451a46f89b17502196457698bde37d604fe74ef19a8c0cb8518da72b1ecf1"}},"pool1p835jxsj8py5n34lrgk6fvpgpxxvh585qm8dzvp7ups37vdet5a":{"id":"pool1p835jxsj8py5n34lrgk6fvpgpxxvh585qm8dzvp7ups37vdet5a","vrfVerificationKeyHash":"e67d6ccc4b3b0ca3e61ad09ccf2094b4fbf4eee929e8995c52fa0f32a43a707c","pledge":{"lovelace":100000000000},"cost":{"lovelace":170000000},"margin":"0/1","rewardAccount":"stake_test1upn7ehn9g6e9cqp7jcmuv5a79avzxavxe6g6fmfwttsm6lqa9kp7c","owners":["67ecde6546b25c003e9637c653be2f58237586ce91a4ed2e5ae1bd7c"],"relays":[{"type":"hostname","hostname":"firewall.adamantium.online","port":3000}],"metadata":{"url":"https://testforge.adamantium.online/otg-preview.metadata.json","hash":"5f9824434e7fc57a08ab0fe9d7f09ed59f2601ec138af8be0a3c89305aa2dc9c"}},"pool1pf95k36qu4u4c6psd8qwclnzj9cqmxd32q0305dz4fcxg3wyuu5":{"id":"pool1pf95k36qu4u4c6psd8qwclnzj9cqmxd32q0305dz4fcxg3wyuu5","vrfVerificationKeyHash":"666efbd46910b4a0472219a7e9a198c5b07437329a47a89a9d85ca3b6da806f4","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqedemevyevg5esgdpdpc9awlepc49nhqln75clf5n4n6tsxqzcvz","owners":["32dcef2c26588a6608685a1c17aefe438a967707e7ea63e9a4eb3d2e"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/CD1","hash":"167b65b63ca316b3d6968ccd60ab59ef18202b7218dd2447170218d0f3c40b77"}},"pool1pt39c4va0aljcgn4jqru0jhtws9q5wj8u0xnajtkgk9g7lxlk2t":{"id":"pool1pt39c4va0aljcgn4jqru0jhtws9q5wj8u0xnajtkgk9g7lxlk2t","vrfVerificationKeyHash":"d9f1792aeb20bf814c367e6b3dd5e2c3f4c7f91f45247da2d0de451a2a2c1f85","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzftx5dwygs4k88svkh4gp6hz4l628ydvskx5yzff55wlmskas3cr","owners":["92b351ae22215b1cf065af540757157fa51c8d642c6a10494d28efee"],"relays":[{"type":"hostname","hostname":"preview.bladepool.com","port":3001}],"metadata":{"url":"https://public.bladepool.com/metadata.json","hash":"2738e2233800ab7f82bd2212a9a55f52d4851f9147f161684c63e6655bedb562"}},"pool1pw345epmct6cuummleuu5hc7qq2h96zawvf0e9062uw7gnjz9ej":{"id":"pool1pw345epmct6cuummleuu5hc7qq2h96zawvf0e9062uw7gnjz9ej","vrfVerificationKeyHash":"420f04838a553e3e959b9b402e36bdd8123888b5f22126491294238150ba385a","pledge":{"lovelace":1000000000},"cost":{"lovelace":345000000},"margin":"3/4","rewardAccount":"stake_test1urmpvvedk8cjnzxp0g89u87ghenhdkyrwn7vl2qg9aly99cp6ypdy","owners":["f616332db1f12988c17a0e5e1fc8be6776d88374fccfa8082f7e4297"],"relays":[{"type":"ipAddress","ipv4":"73.70.8.87","port":6000}],"metadata":{"url":"https://tinyurl.com/yy69a8eh","hash":"52977d65de765d1ec235c59676d4fea81046dc6ef561ab2790d4c359d8611b1d"}},"pool1pn9sffcqqzkx70m0gujks4h3wf8p4y706t2f0cjcyreekg83wtf":{"id":"pool1pn9sffcqqzkx70m0gujks4h3wf8p4y706t2f0cjcyreekg83wtf","vrfVerificationKeyHash":"3cfeffec7d5b5dbbc4f0494271fad41952fdb82937189fb3f2581d9de3fad81b","pledge":{"lovelace":400000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1up8dnh6ywzs96upw6ycmeafzmkvrv096njjkphgqzuts0wgnxsaqg","owners":["4ed9df4470a05d702ed131bcf522dd98363cba9ca560dd00171707b9"],"relays":[{"type":"hostname","hostname":"preview-r1.panl.org","port":3015}],"metadata":{"url":"https://preview-metadata.panl.org","hash":"a2d8a47fc4d3a6e707487b65b3ab790e6fff71c2afd72f0fe17bc5e523024019"}},"pool1p4kh4yt0vwh6yexf9ae36qfwnch7vqa7l77akh94pv4u6rq7tuk":{"id":"pool1p4kh4yt0vwh6yexf9ae36qfwnch7vqa7l77akh94pv4u6rq7tuk","vrfVerificationKeyHash":"c3e92038b50de0e70bd3066f83c067e1726f126a6cc4c9044f3c87582194bee6","pledge":{"lovelace":1000000},"cost":{"lovelace":568800000},"margin":"1/1","rewardAccount":"stake_test1urull23za5j968nez2952k0fpdzk49raz5qvadyer7d8fxqtpzyfh","owners":["f9ffaa22ed245d1e79128b4559e90b456a947d1500ceb4991f9a7498"],"relays":[{"type":"ipAddress","ipv4":"142.132.218.54","port":6001}],"metadata":{"url":"http://gmbh.roastfrog.com","hash":"62ba8350ad0da97a45cb5cf4940204c702bb5a89c81dff3eab95e35a9657b775"}},"pool1phj3kpraf3vgn0zzlugpts8k6eps8d3fgp9ddceu4s43cq00nzr":{"id":"pool1phj3kpraf3vgn0zzlugpts8k6eps8d3fgp9ddceu4s43cq00nzr","vrfVerificationKeyHash":"d4d04f919daf4e89a556f5555a2a68ba89ccf03f022ee77954b1bf1c37a7c8ff","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1up046thgsc2fg0wcwfzvmpmy6r6c0psanu9wyxg8vcknt9sumrgc7","owners":["5f5d2ee88614943dd87244cd8764d0f587861d9f0ae21907662d3596"],"relays":[{"type":"hostname","hostname":"https://aggregator.dev-preview.api.mithril.network/"}],"metadata":{"url":"https://mithril.network/tbd.json","hash":"5e96bfc37d05582545c91727d73e11a26fa0ebcd4e482a9714d02ab96e83ed19"}},"pool1perfzsuh2l59jd5jzqs0a2774uqmelymuflw9nm3q4lmslpmk92":{"id":"pool1perfzsuh2l59jd5jzqs0a2774uqmelymuflw9nm3q4lmslpmk92","vrfVerificationKeyHash":"2661c5f0a335170cc2342c8dc322c5b47f8e2611df6bcc4d5192adb79cc20257","pledge":{"lovelace":500000000},"cost":{"lovelace":500000000},"margin":"1/20","rewardAccount":"stake_test1uruhhewtul8tkg88vdp4l84ds5t5j4s8tlrdjafr4crh7xckcrc2x","owners":["f97be5cbe7cebb20e763435f9ead85174956075fc6d97523ae077f1b"],"relays":[{"type":"ipAddress","ipv4":"3.72.231.105","port":30002}],"metadata":{"url":"https://cardanofiles.blob.core.windows.net/test/poolMdata.json","hash":"3b29e608eed25bb13c9d0950599634ed6d4f498ec4a748322dff5e5cca5deddb"}},"pool1p79majfcn554nkl88auu5njmprfsx9jdkv29rtltkn44y2h04qy":{"id":"pool1p79majfcn554nkl88auu5njmprfsx9jdkv29rtltkn44y2h04qy","vrfVerificationKeyHash":"b6168f2e63d95d18756328cf2ea0f869c7f227e50e13f55228cf3854dea16475","pledge":{"lovelace":2000000000000},"cost":{"lovelace":170000000},"margin":"99/100","rewardAccount":"stake_test1urdj5j3jtsj9lsf6xdz27dzxfw92ezj34v5d0qhcrx4ztysksexxe","owners":["db2a4a325c245fc13a3344af34464b8aac8a51ab28d782f819aa2592"],"relays":[{"type":"hostname","hostname":"topo-test.topopool.com","port":3010}],"metadata":{"url":"https://cardanostakehouse.com/c856b8c5-0f0a-42db-8a78-59a.json","hash":"8de3639f2d956664dd0d58903461853572e01355895cbc5932e42e22b0c1b960"}},"pool1p73yrd7vzwkkjd2rff4g683smhlm3jkg45f2hwm79cke6uxxwq9":{"id":"pool1p73yrd7vzwkkjd2rff4g683smhlm3jkg45f2hwm79cke6uxxwq9","vrfVerificationKeyHash":"92a482dd75c257122c3eb24de9b2f3b029319aa4e1ca0ac1125f62a912ce8c9d","pledge":{"lovelace":100000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1urnuwkjxcf0erfm53fx9tnkvs6ye0shcwk3lt0wzzy500tcu0xf8f","owners":["e7c75a46c25f91a7748a4c55cecc868997c2f875a3f5bdc21128f7af"],"relays":[{"type":"ipAddress","ipv6":"2a01:e0a:3d1:770:216:3eff:feb6:d700","port":6000}],"metadata":{"url":"https://api.monrma.fr/meta/JOSEP.json","hash":"6c133a6ba49006eee1fdd1525662d64de10f4a54566e715246525b3b386f0c02"}},"pool1zpsskvu5q00lpezkj53xm7a5y9wv0jqt5j0xsvn42jdx2gajwr6":{"id":"pool1zpsskvu5q00lpezkj53xm7a5y9wv0jqt5j0xsvn42jdx2gajwr6","vrfVerificationKeyHash":"7827b526f0599b169c664b0dd8733a38a702d6d9e868e689cd8404e110a96dcb","pledge":{"lovelace":10000000000},"cost":{"lovelace":170000000},"margin":"0/1","rewardAccount":"stake_test1url5r2tsk5j9sd49exdale4da6vd2ucn44hcqeygqcfdyyc84hjr3","owners":["ff41a970b5245836a5c99bdfe6adee98d57313ad6f8064880612d213"],"relays":[{"type":"ipAddress","ipv4":"90.251.253.249","port":3000}],"metadata":{"url":"https://raw.githubusercontent.com/OYSTERPOOL/GIT/main/prev.json","hash":"cd19e8c622a0c35e0384caeeced99552fe989a6ee8bd98018b8236328663132d"}},"pool1zyvx690fps6a9m3m89q6fwcfgd8jyupzgv8wrfpvd0fm5cyzxd0":{"id":"pool1zyvx690fps6a9m3m89q6fwcfgd8jyupzgv8wrfpvd0fm5cyzxd0","vrfVerificationKeyHash":"e0c09cfd7e6b1766efe46f4297d5ada1a5f8b006c1ed72535e16c6fd2f384174","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"3/100","rewardAccount":"stake_test1uzzx65ylw8yrkeusmfwa6exesgpzlw74630cxusgq3jn9jqrgsrjc","owners":["846d509f71c83b6790da5ddd64d982022fbbd5d45f837208046532c8"],"relays":[{"type":"ipAddress","ipv4":"129.152.11.126","port":3002}],"metadata":{"url":"https://raw.githubusercontent.com/stefanosu-code/stpz/a/s2.j","hash":"0bf71440af0a351555045ae2a59e65c8661748a2781476f9bd560871afb2069f"}},"pool1z2dpsu58adkxtet672s6c46szylvcxs7vk9evq6clj49jcm6s4f":{"id":"pool1z2dpsu58adkxtet672s6c46szylvcxs7vk9evq6clj49jcm6s4f","vrfVerificationKeyHash":"cf027ebfbfec5c3f964b05341519180003e2ed092829a402f775efec666d78e1","pledge":{"lovelace":0},"cost":{"lovelace":456789123000000},"margin":"1/10000000","rewardAccount":"stake_test1uzcyml6eacaevjnana8a5pxe3m6rmcateqepztxr0g6azwq30tk38","owners":["b04dff59ee3b964a7d9f4fda04d98ef43de3abc832112cc37a35d138"],"relays":[{"type":"ipAddress","ipv4":"5.161.75.212","port":5003},{"type":"ipAddress","ipv4":"100.100.100.100","port":100},{"type":"ipAddress","ipv4":"200.200.200.200","port":200}],"metadata":{"url":"https://digitalfortress.online/digi7.json","hash":"0dd9984a4a83fd1e15a182fa318787acfea2d9e26fd416bc71f939367a0dc625"}},"pool1zt3l0pv74ms3j0uspstj3k26ndq93ej37djcw86gkk487pgpthh":{"id":"pool1zt3l0pv74ms3j0uspstj3k26ndq93ej37djcw86gkk487pgpthh","vrfVerificationKeyHash":"17842dce450acb74a96644b90ad38f7713f57f06526b620a4de322506fb67e6e","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uq8slx8ar3a6srktfrwjrqfsj9qgcapd7rn9xxd4z6dssyg4a57zg","owners":["0f0f98fd1c7ba80ecb48dd21813091408c742df0e65319b5169b0811"],"relays":[{"type":"hostname","hostname":"testrl2.duckdns.org","port":6000},{"type":"hostname","hostname":"bbotest.duckdns.org","port":3000}],"metadata":{"url":"https://ada-bamboo.com/testccb.json","hash":"bd75a5e72fe17426f170ac3a3ec1a82b151ddca9ce2f2ad49e0187edcf736c4a"}},"pool1z737pypn7xgvmnwazy6s7z2a8ts37xnpcetnzdn82qth5w6n8sf":{"id":"pool1z737pypn7xgvmnwazy6s7z2a8ts37xnpcetnzdn82qth5w6n8sf","vrfVerificationKeyHash":"4eb3784dc978391209b63132e32cdbd180cdb4eb5a08e2d38551d907907dea51","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uq4r9wzkug92c2pfhl6l60rpnvtqyklncdezr4p7p668rpgnjtsyx","owners":["2a32b856e20aac2829bff5fd3c619b16025bf3c37221d43e0eb47185"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSNA","hash":"f801fa03129fb7fc2dc8478c2fc7fbe5a7711be676ca6fb7f6660b09477ea0a1"}},"pool1rzgvf9rytug9p3hz6a9q8zeu3mp6trl70qdyw0g9c7ywzy984yr":{"id":"pool1rzgvf9rytug9p3hz6a9q8zeu3mp6trl70qdyw0g9c7ywzy984yr","vrfVerificationKeyHash":"0e0c0f257842b44b19dda1a20d8e406401f7696725f1c00a5b2768a4c684a089","pledge":{"lovelace":70000000000},"cost":{"lovelace":345000000},"margin":"3/25","rewardAccount":"stake_test1upxxj9un9j6xyaxkxnw0n2hajye3ux6qxn53ex7g4xwdh2cq3xsrd","owners":["4c6917932cb46274d634dcf9aafd91331e1b4034e91c9bc8a99cdbab"],"relays":[{"type":"hostname","hostname":"adarelay-t2-1.nanyka.com","port":1856}],"metadata":{"url":"https://nanyka.com/cardanospo/poolmeta_preview.json","hash":"a14630b7010397fc9bf309f59618b613698851bc1ac5772fd43717405b426bf5"}},"pool1r8t2047f3hj4c070rjns323s5dgyzyrxd2a06v6hkuh7zx7cqp7":{"id":"pool1r8t2047f3hj4c070rjns323s5dgyzyrxd2a06v6hkuh7zx7cqp7","vrfVerificationKeyHash":"f3a05875600f9960501f6b4e3a65b345b018da7a4b11ab2cd61638c08c2370d6","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/40","rewardAccount":"stake_test1urdxvfs090s0wysk9v5fsy70caswrfksjw0j4nzv5xh7ffq06zrw8","owners":["da66260f2be0f712162b289813cfc760e1a6d0939f2acc4ca1afe4a4"],"relays":[{"type":"hostname","hostname":"pv-relays.digitalfortress.online","port":8001}],"metadata":{"url":"https://digitalfortress.online/digi-pv.json","hash":"e42ed99f0b9752054081f0176b33b548bdc3db13558389fef7e0455e990edad8"}},"pool1rf0xxt0xpq0vwyq5jeqn8t9wags7k0mq8vlt0dygkc7rvc85uhn":{"id":"pool1rf0xxt0xpq0vwyq5jeqn8t9wags7k0mq8vlt0dygkc7rvc85uhn","vrfVerificationKeyHash":"41dbf753c8cb0c835d3719de7490a64921a66ad81d598981012a2cf2c1f762f8","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uzvex98c4tw539cel9rj9u7axrxqvpat3r769tlgrw33t3gjxq666","owners":["999314f8aadd489719f94722f3dd30cc0607ab88fda2afe81ba315c5"],"relays":[{"type":"ipAddress","ipv4":"130.162.169.5","port":6000},{"type":"ipAddress","ipv4":"161.0.154.231","port":6000}],"metadata":{"url":"https://tinyurl.com/3kv77zvd","hash":"52daa526fd9d0b35e57ca376d617d0f99068c5f98afd13745f969cc79ef5928f"}},"pool1rwwmnhgsnyzhzpg89lgq4k6uc38qadsdnet9l2xgv34hsjxzj2d":{"id":"pool1rwwmnhgsnyzhzpg89lgq4k6uc38qadsdnet9l2xgv34hsjxzj2d","vrfVerificationKeyHash":"a4057bb1feefee1f968888a3596a6ff463b443ef9d9919398c1b4dbe9a493597","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"99/100","rewardAccount":"stake_test1urarrlsypaptr9lrx8c65qr5qjfd4a6j893caw33mwpxsjgqfxdem","owners":["fa31fe040f42b197e331f1aa00740492daf75239638eba31db826849"],"relays":[{"type":"hostname","hostname":"spec1-staging.spirestaking2.com","port":3005}],"metadata":{"url":"https://data.spireblockchain.com/ADA-PREVIEW/SPF/pool_0.json","hash":"e11362ceaa7817a979a1f703268a0d63a9e65d48e35e5879e4a7e693f47253ed"}},"pool1r0tln8nct3mpyvehgy6uu3cdlmjnmtr2fxjcqnfl6v0qg0we42e":{"id":"pool1r0tln8nct3mpyvehgy6uu3cdlmjnmtr2fxjcqnfl6v0qg0we42e","vrfVerificationKeyHash":"0bf04a518f6e9a49fbc3ca8b98bec244874fa9939427156ec2af28fa2bfdab11","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uraat6a6egphv996jz7ncmzncp8689fzum4up72c8xfaf4s04shmw","owners":["fbd5ebbaca037614ba90bd3c6c53c04fa39522e6ebc0f9583993d4d6"],"relays":[{"type":"hostname","hostname":"mithril-signer-2.testing-preview.api.mithril.network","port":9092}],"metadata":{"url":"https://tinyurl.com/2nx2ty2d","hash":"8cc5e635ed38182d9c4680129dc8815f7c2af1d0d7c34e36781139a26a47d650"}},"pool1r5mj0h2e5s2kpe0pckesz0x4g8rhr9e5fzr6k598ckjjun5snvk":{"id":"pool1r5mj0h2e5s2kpe0pckesz0x4g8rhr9e5fzr6k598ckjjun5snvk","vrfVerificationKeyHash":"9406b0490a7683eb52c139db3ff4ed3c8f48e6e3c786b9dc12c1fd2639e74ae8","pledge":{"lovelace":5},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uzp8gpkuaz50mqexhfs6tpzqxlznhgdl9ev9q7pv9e9d8dcmva7p6","owners":["827406dce8a8fd8326ba61a5844037c53ba1bf2e5850782c2e4ad3b7","8e901a894907f529925330e4dbb4070e8ee6c45d5a0e85f4102444aa"],"relays":[]},"pool1rk2y9gx6vll8lawzdqlky5p2a3ypzsxg07arg8gmhkjj2905035":{"id":"pool1rk2y9gx6vll8lawzdqlky5p2a3ypzsxg07arg8gmhkjj2905035","vrfVerificationKeyHash":"a86606621866917a797374a33b0dbb73afdb27b82abfe1facdf99f527cc7b434","pledge":{"lovelace":100000000000},"cost":{"lovelace":340000000},"margin":"3/20","rewardAccount":"stake_test1uz6yw4xj9lfkv8dweq3m64vwnmm8c3hpleufjzqf866ar8qjxc6cs","owners":["b44754d22fd3661daec823bd558e9ef67c46e1fe789908093eb5d19c"],"relays":[{"type":"hostname","hostname":"sully.crabdance.com","port":6004}],"metadata":{"url":"tinyurl.com/4uszu5zt","hash":"62710fed07d182806c647d4a2034eccb14035e57f9bb4899aff9ec1c461ee4ae"}},"pool1rutq574pcq30mn9xuytgpqyvn69zq2dnycp2fhnw0hsuyqpnh99":{"id":"pool1rutq574pcq30mn9xuytgpqyvn69zq2dnycp2fhnw0hsuyqpnh99","vrfVerificationKeyHash":"11351c5c5dfe74a8adb76e47b1590ab9e0251915548447db027806fe0d64fd64","pledge":{"lovelace":2000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uz79lrtfw5w9z6pl2047nn7mxtqvzv9x0senqg6g3upwgeqq9zjj6","owners":["bc5f8d69751c51683f53ebe9cfdb32c0c130a67c333023488f02e464"],"relays":[{"type":"hostname","hostname":"preview-node.world.dev.cardano.org"}],"metadata":{"url":"https://git.io/JJWdJ","hash":"bf3eeabce96f495924dc15000ca067699f38fca78ea36e6d69328dc9c88a5e84"}},"pool1r7snhee0af6cykx7vt7ajkdn0cgym9pucpl94m3l9thnw74ggg6":{"id":"pool1r7snhee0af6cykx7vt7ajkdn0cgym9pucpl94m3l9thnw74ggg6","vrfVerificationKeyHash":"7a785758a863bbad51e9fabdeba75009acbe05236f416dacb327c78a5c15a638","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uq578ry6j5t3ud23e4q8grrhfygm0cf6200rwpquts203zs62922g","owners":["29e38c9a95171e3551cd40740c774911b7e13a53de37041c5c14f88a"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/LXSP0","hash":"62acb9589309a17b39d1fa6115541f0fad74d89c07072a835e11fcce93d5d23c"}},"pool1yq5q3unkyr764243l4v3gca6m42jlg04df9k7f5hv00lsjhyj4d":{"id":"pool1yq5q3unkyr764243l4v3gca6m42jlg04df9k7f5hv00lsjhyj4d","vrfVerificationKeyHash":"d6d05e32b4c2eb2e62cb5659d118061473360c2db23a213c377edb2ead2cf591","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1urty9s8ufz8kydh8wfz6k9cqsj4v2q2k5wdu8wtetvlz4fs7adk6p","owners":["d642c0fc488f6236e77245ab170084aac50156a39bc3b9795b3e2aa6"],"relays":[{"type":"hostname","hostname":"pool.sudosu.cyou","port":30443},{"type":"hostname","hostname":"pool.sudosu.cyou","port":30444}],"metadata":{"url":"https://ado-pool.web.app/poolMetadata.json","hash":"aeaaf5c46c1466f65ff731fc3cc82f006acfd0aaedb4d4f6ff665f04224a1bd1"}},"pool1yphncqvpc4n49c4ya3mys7uwpwa25892r70gzkpqglenv093qge":{"id":"pool1yphncqvpc4n49c4ya3mys7uwpwa25892r70gzkpqglenv093qge","vrfVerificationKeyHash":"83602a44cf3b951a3ef83a4d868852ccfa50cc841e93212b302a67c8d1cd9144","pledge":{"lovelace":175000000000},"cost":{"lovelace":345000000},"margin":"1/50","rewardAccount":"stake_test1urt0mxys755epyacjdacm4e0wyyr7kd603tzxrqzstj7auc5l9456","owners":["d6fd9890f5299093b8937b8dd72f71083f59ba7c56230c0282e5eef3"],"relays":[{"type":"hostname","hostname":"129.213.55.211","port":6000}],"metadata":{"url":"https://cardano-blockhouse.de/preview/poolMetaData.json","hash":"b570b17ca6e0b44783f4a18654f14b472460f0f553e2cc29eaa25a7a2f874f09"}},"pool1ywazc6h66tamsfxpfncfhhj282y0j420sze45x3s5qdvkaxssse":{"id":"pool1ywazc6h66tamsfxpfncfhhj282y0j420sze45x3s5qdvkaxssse","vrfVerificationKeyHash":"ad310b61f0ae967eccfcc0557661f421389c9bef3cbef6dc22bf877c7f08f9ea","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1urjxc8q208jfclu9me2zn36luj70d8qsmrgemcga37vr2hg76ymtw","owners":["e46c1c0a79e49c7f85de5429c75fe4bcf69c10d8d19de11d8f98355d"],"relays":[{"type":"hostname","hostname":"relays.planetstake.com","port":30002}],"metadata":{"url":"https://planetstake.s3.eu-west-2.amazonaws.com/STAKEPreview.json","hash":"87fa8b931cb4641c75039d7b3314e9b0d0efc5d0c496d01a67863e7d25453fac"}},"pool1y0uxkqyplyx6ld25e976t0s35va3ysqcscatwvy2sd2cwcareq7":{"id":"pool1y0uxkqyplyx6ld25e976t0s35va3ysqcscatwvy2sd2cwcareq7","vrfVerificationKeyHash":"b2ff1c4e1aee2de9b5212f4d964b6acb09c67e54a9e2aaefdebda42e08125cc6","pledge":{"lovelace":400000000000},"cost":{"lovelace":340000000},"margin":"99/100","rewardAccount":"stake_test1urfvlns8kzw5rl08uns7g35atul8k43unpcyd8we8juwuhclq5pxz","owners":["d2cfce07b09d41fde7e4e1e4469d5f3e7b563c9870469dd93cb8ee5f"],"relays":[{"type":"hostname","hostname":"adaboy-preview-1c.gleeze.com","port":5000},{"type":"hostname","hostname":"adaboy-preview-2c.gleeze.com","port":5000}],"metadata":{"url":"https://tinyurl.com/39a7pnv5","hash":"643a016d84fb171855f8b6d9c9a5efa230fb4665de3ee0ee0a1ed0f486d26be2"}},"pool1ynfnjspgckgxjf2zeye8s33jz3e3ndk9pcwp0qzaupzvvd8ukwt":{"id":"pool1ynfnjspgckgxjf2zeye8s33jz3e3ndk9pcwp0qzaupzvvd8ukwt","vrfVerificationKeyHash":"dbdd412069ed405b8efe1f30d4e7a8ea551a8cbfc949b1a462936e0b55ec632a","pledge":{"lovelace":3000000000000},"cost":{"lovelace":170000000},"margin":"0/1","rewardAccount":"stake_test1urn5vcltkemnl8nnx3xt4ucsej3v45y0r5s4xgkl9v24jpsxs8v3h","owners":["e74663ebb6773f9e73344cbaf310cca2cad08f1d215322df2b155906"],"relays":[{"type":"hostname","hostname":"node1.cardano.gratis","port":6501},{"type":"hostname","hostname":"node2.cardano.gratis","port":6502}],"metadata":{"url":"https://cardano.gratis/poolMetaDataPreView.json","hash":"8bcb8efe6973b8b6bd0918cd356735ff3ce0ca41276fac6fb4b50b900fbcebce"}},"pool1yu60zjc6ykj22ns69e8w5me469r4k4805706vz2mvrnz5qvvfz7":{"id":"pool1yu60zjc6ykj22ns69e8w5me469r4k4805706vz2mvrnz5qvvfz7","vrfVerificationKeyHash":"e84a8a24359b57aec037671ec8597f73ca6d231f06174e7b58c1536ad0f28c9e","pledge":{"lovelace":1000},"cost":{"lovelace":500000000},"margin":"1/1000","rewardAccount":"stake_test1uzp3y24gpe5zjw0nzsc04tteyuhr6yxqpcvl4cg9x6227gcr4s4cs","owners":["83122aa80e682939f31430faad79272e3d10c00e19fae1053694af23"],"relays":[]},"pool19p0rndwuhsyzwjt3v3s946yrq3je8usgcqwn32xjfkd52f3znjf":{"id":"pool19p0rndwuhsyzwjt3v3s946yrq3je8usgcqwn32xjfkd52f3znjf","vrfVerificationKeyHash":"18a7b9fa81478d76b1797a5935f1ba4564c06390ecffb208a02283993f179ceb","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1up829zqr979f4svv7daykuk000nwmvtkas8qpy8rld4t7wqyu059y","owners":["4ea288032f8a9ac18cf37a4b72cf7be6edb176ec0e0090e3fb6abf38"],"relays":[{"type":"hostname","hostname":"mithril-signer-1.dev-preview.api.mithril.network","port":9091}],"metadata":{"url":"https://tinyurl.com/2xn8c23m","hash":"d907a12c9750aa8536fe24bf2e904cef6acc9801d952e851b76530e743244491"}},"pool19zfyfkrfueu8gtqm8mq72fts7z5pte54v0upej5kh905v7q3xya":{"id":"pool19zfyfkrfueu8gtqm8mq72fts7z5pte54v0upej5kh905v7q3xya","vrfVerificationKeyHash":"444a5509caf8074e6bb5f387b93c802837410f45efb4867f22a0e4e4d1fc9866","pledge":{"lovelace":1200000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uqc9rnvul66ud5azgn95678uy5aj8y2cfy734m3caxlyrjc204n8m","owners":["3051cd9cfeb5c6d3a244cb4d78fc253b239158493d1aee38e9be41cb"],"relays":[{"type":"ipAddress","ipv4":"82.208.22.91","port":6003}],"metadata":{"url":"https://www.cardanolink.net/metadata.json","hash":"9e52ad6d3397ef0e196752f5b6c783d159e6e11b012fc426ed10e5e99b44a8af"}},"pool19x5z6h63kq9tvwt9yz8emdf3fry06pnm6lu8lcuqpf9dunqwng8":{"id":"pool19x5z6h63kq9tvwt9yz8emdf3fry06pnm6lu8lcuqpf9dunqwng8","vrfVerificationKeyHash":"8a97230d41bc99a952bbad1382a384fad365521e3e222a1baf227998f6c5fbdd","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uz488lprpyycw8h6jelrudnuw9syv55judndgdqyrmwnl0qnx56dn","owners":["aa73fc230909871efa967e3e367c7160465292e366d434041edd3fbc"],"relays":[{"type":"hostname","hostname":"preview.ada.chicando.net","port":3002}],"metadata":{"url":"https://chicando.net/resources/metadata/ccdo.json","hash":"c2d117b0ee365a4717ae5e1c1659f5246db80a4cc12f1fc437eab19076b8c09b"}},"pool198jfkrkjf5nk9jxs2nwqh0dpswnw7f8vgea7k07dup5wyr0dtwc":{"id":"pool198jfkrkjf5nk9jxs2nwqh0dpswnw7f8vgea7k07dup5wyr0dtwc","vrfVerificationKeyHash":"002345b996b612fbe645a9e51f0bad41c19570417c92dd16f00785619c3b9691","pledge":{"lovelace":100000000},"cost":{"lovelace":345000000},"margin":"17/100","rewardAccount":"stake_test1urx0wzfjh55njew498usze4jaqu3sjaugu8gdjnxm3faj7cmwkhjg","owners":["ccf70932bd293965d529f90166b2e839184bbc470e86ca66dc53d97b"],"relays":[{"type":"ipAddress","ipv4":"73.222.0.99","port":6000}],"metadata":{"url":"https://tinyurl.com/4w5yp728","hash":"af5d091d79115e56fa7b6d0a5d39fe9901141d93a1beed06003b3b44f75b12b1"}},"pool19ta77tu28f3y7m6yjgnqlcs98ak6a0vvtlcn7mc52azpwr4l2xt":{"id":"pool19ta77tu28f3y7m6yjgnqlcs98ak6a0vvtlcn7mc52azpwr4l2xt","vrfVerificationKeyHash":"b06775ea69068784c2735f6211c537ffd5fa50aa3e3e2a798eea1f3b0e4ec98c","pledge":{"lovelace":1000000000000},"cost":{"lovelace":500000000},"margin":"1/1","rewardAccount":"stake_test1ur9l0p6pr3ctkjaewnwawuykwma9skxjhx9nrdafndhs7jsa0vjgx","owners":["db266813b8285a41aaf806024aa16f4c5a3592e1b012460435224de3"],"relays":[{"type":"hostname","hostname":"preview-node.play.dev.cardano.org","port":3001}]},"pool19wrj23gqupswxefaks40xncv69ca83mqck2e9gxwncza6vl8h47":{"id":"pool19wrj23gqupswxefaks40xncv69ca83mqck2e9gxwncza6vl8h47","vrfVerificationKeyHash":"48de9f061019deaba5729b48be6db15e7169a18574c995cbb27d5b89f243ab9f","pledge":{"lovelace":3000000000},"cost":{"lovelace":170000000},"margin":"1/50","rewardAccount":"stake_test1uz2r2kjj8ulkp2l9l8474pfe800ad77yl2p2ksqg6keza9c8azv2g","owners":["94355a523f3f60abe5f9ebea85393bdfd6fbc4fa82ab4008d5b22e97"],"relays":[{"type":"ipAddress","ipv4":"78.131.56.145","port":7362}],"metadata":{"url":"https://tinyurl.com/2s3jx2rs","hash":"502b700e1c714a9e51534f1f61731a1ae1ec251199bdeb0d7d7fa65fa53b4626"}},"pool190ce9qhpzwzveasvngas7kmwqrn54mfvhk9unqmuesykvtadu8l":{"id":"pool190ce9qhpzwzveasvngas7kmwqrn54mfvhk9unqmuesykvtadu8l","vrfVerificationKeyHash":"ecaaf8a89ead238b71ae9054487c229c1c6bc327062c5211dea2ae78c7cb0280","pledge":{"lovelace":1000000},"cost":{"lovelace":805000000},"margin":"1/100","rewardAccount":"stake_test1uz5qfpx4786s0n847grlqcfrg5ja2g980jtnkfal2jxnaccg69qk0","owners":["a80484d5f1f507ccf5f207f061234525d520a77c973b27bf548d3ee3","c9dc49a676087ba0fb1ab1f28b209e647b4139626d732455bb7d5582","f4cceaa5fff7b592e39519942ea8c3b823f3fee622bb3c81a5f5150f"],"relays":[{"type":"hostname","hostname":"us.netspectrum.com","port":13001}],"metadata":{"url":"http://us.netspectrum.com:13002/pool-meta-data.json","hash":"e9a969b627f3cac9581322dab1f352533d63264fcdbb9e46c11bbd25b8b1c5e3"}},"pool19cmwzwk4vetgtutrunar6vkv7z3n8ldq5e7f8javn8m6ynvhuzv":{"id":"pool19cmwzwk4vetgtutrunar6vkv7z3n8ldq5e7f8javn8m6ynvhuzv","vrfVerificationKeyHash":"61e5b9672e64e846c49cbf305ed1ae7de084c6c5b9b2c202589068337d275295","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqag28j8d0qahxj3q85mzfgzr7k2duckp46t76ju8snrqug9eknpj","owners":["3a851e476bc1db9a5101e9b125021faca6f3160d74bf6a5c3c263071"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSND","hash":"9b41da403200a656749255f4575016eaac46b803656bc96616c89dad89728364"}},"pool1xqycqt2kz6ps4r2ggk0jqsln0st5xtw9xgep4xlg2uxgvq6w6h7":{"id":"pool1xqycqt2kz6ps4r2ggk0jqsln0st5xtw9xgep4xlg2uxgvq6w6h7","vrfVerificationKeyHash":"4664efa0023bf465d8e746a80eefa620ee04c0e9455760779bd484a8dadc1e16","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1urr658f2tpkx8jfnmjczdvv2s8zwpug6cnegdxqc4rvuc8cdy3xrz","owners":["c7aa1d2a586c63c933dcb026b18a81c4e0f11ac4f2869818a8d9cc1f"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/LXSP1","hash":"828d2ec12cdfbd0c989b82e8ceb3ea9ba48491ab6453f2c5d66d503048648d53"}},"pool1x9xkvkrfw6htmnflpad0z2aqsxx50f5mwkyzpylw0tlsk9z5uff":{"id":"pool1x9xkvkrfw6htmnflpad0z2aqsxx50f5mwkyzpylw0tlsk9z5uff","vrfVerificationKeyHash":"af51e586a3601de453af80a5d24d88d3e451cc283aff0602d96e2e7f872d983e","pledge":{"lovelace":100000000000},"cost":{"lovelace":170000000},"margin":"1/20","rewardAccount":"stake_test1upeasuglk6mfjthng6xmua0f7q4tzqpsvn3a6wdjry26z0sscd4la","owners":["73d8711fb6b6992ef3468dbe75e9f02ab1003064e3dd39b21915a13e"],"relays":[{"type":"hostname","hostname":"guavarelay.com","port":6000}],"metadata":{"url":"https://github.com/MontiMarti","hash":"72497a1aa897015a10c30bff37371adde3fedf5da930fbf54c40976856782d46"}},"pool1x9tqyeasf0n3zvq6p6dvaeckz828ygcustd3hngs0mmxgpq7n7v":{"id":"pool1x9tqyeasf0n3zvq6p6dvaeckz828ygcustd3hngs0mmxgpq7n7v","vrfVerificationKeyHash":"066490995d792052c4cf4a1010ca55547035261003fd5d42730b92acb165ce4b","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1upd07wdllf3heh5y0c7893gfh04ye5s9r69nq382m4kgtgcd206pr","owners":["5aff39bffa637cde847e3c72c509bbea4cd2051e8b3044eadd6c85a3"],"relays":[{"type":"hostname","hostname":"grokism.com","port":6003}],"metadata":{"url":"https://www.grokism.com/groktnet.json","hash":"b04da3c89fa84062ab55ef8653b00f469f60137afc1d6ff20cd175b00105d888"}},"pool1xg80gqxp89sllgk6xs6ajwjxkjntwjc2wzc9mjsnzchkgm4z2se":{"id":"pool1xg80gqxp89sllgk6xs6ajwjxkjntwjc2wzc9mjsnzchkgm4z2se","vrfVerificationKeyHash":"3efd3ace7be87e59adfbf0196c75d16bae4c46b6c2eeba65c0a32a97c3043eda","pledge":{"lovelace":7500000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1uppctwdc07j7aeut3kzwkxddtarc8s5znulauvcp8snl6wsx8ttpx","owners":["4385b9b87fa5eee78b8d84eb19ad5f4783c2829f3fde33013c27fd3a"],"relays":[{"type":"ipAddress","ipv4":"95.88.156.175","port":4444}],"metadata":{"url":"https://sharepool-crypto.github.io/share/poolMetaData.json","hash":"396f9b3f3dfaaa606e6459758f580ec461f5e4a416027038ff4565a3891301d8"}},"pool1xgmqwh23yc2jp52k7jn249x56v6nyhl9nhxaeg6hq8tmc5t78rq":{"id":"pool1xgmqwh23yc2jp52k7jn249x56v6nyhl9nhxaeg6hq8tmc5t78rq","vrfVerificationKeyHash":"360f9057c01159a44581ccc4ba786d64b80c551bae0163f09fc408b5779b0e55","pledge":{"lovelace":10000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1ur3yj9zs0cd9mtx43zssh877qmgp5env3pa0hhytw53fw2se7fthy","owners":["e24914507e1a5dacd588a10b9fde06d01a666c887afbdc8b7522972a"],"relays":[{"type":"ipAddress","ipv4":"73.23.36.140","port":6000}],"metadata":{"url":"https://petloverstake.com/PET_Preview2.json","hash":"87b5fae91c87eb8dbd828c24088dfea6dca290170723092a2575a9d654444a85"}},"pool1x2u60w0uupzv6qdn39pvzeapd54q0jqwd6vv4a7wfe76q8lgsth":{"id":"pool1x2u60w0uupzv6qdn39pvzeapd54q0jqwd6vv4a7wfe76q8lgsth","vrfVerificationKeyHash":"b2f21592a1eeebdfd7a29d997d93d6c73b80f11c5818408836033a4e93aca409","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1up22rprkrxxhme8gqfqqntvzjfvw2app3sxn85rgsn2me6gq0r6c2","owners":["54a18476198d7de4e8024009ad829258e574218c0d33d06884d5bce9"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/LXSP3","hash":"fd7246127084e052c2a6bf8005ff1a35fe4dcbb4dc32cf97bc110d5470cbe71f"}},"pool1xkfew9wzhefz2at44eqdu5d6hk6s6xjdjj8h54tgvmymwea4vk3":{"id":"pool1xkfew9wzhefz2at44eqdu5d6hk6s6xjdjj8h54tgvmymwea4vk3","vrfVerificationKeyHash":"4967db4150525352a6eaaec789d27795fc7bb17cfd72da8b0815e43bef540a6f","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1urw67l30v2at04d2uaa6cazpuzl4csa5xmu6k4cvcj9yadccrvm93","owners":["ddaf7e2f62bab7d5aae77bac7441e0bf5c43b436f9ab570cc48a4eb7"],"relays":[{"type":"hostname","hostname":"adaboy-preview-2c.gleeze.com","port":5000}],"metadata":{"url":"https://tinyurl.com/39a7pnv5","hash":"643a016d84fb171855f8b6d9c9a5efa230fb4665de3ee0ee0a1ed0f486d26be2"}},"pool1xe7ey753aw0v79tysaumamkgcugpw9txahxwrrltqjpx25adrkr":{"id":"pool1xe7ey753aw0v79tysaumamkgcugpw9txahxwrrltqjpx25adrkr","vrfVerificationKeyHash":"5837fb2c83c6c2808deb5269be449a4c16cd337a7a27d379e77587f5fce73ce9","pledge":{"lovelace":65000000000},"cost":{"lovelace":170000000},"margin":"1/200","rewardAccount":"stake_test1ur7a6w4l2tkz3p7krp8y6807lnqd6e03awrstq644wfaksczmnpth","owners":["fddd3abf52ec2887d6184e4d1dfefcc0dd65f1eb87058355ab93db43"],"relays":[{"type":"ipAddress","ipv4":"45.32.18.201","ipv6":"2001:19f0:7001:24a6:5400:4ff:fe31:9996","port":4002}],"metadata":{"url":"https://git.io/JI2Zk","hash":"d50f5e2e137f291889af50e054025af04bdc487e747c6cfa2521810157a5dfe6"}},"pool1xas798gr6u5kjy2y34ge0jhpp6fwlg88cycrg28swx50z83a9ye":{"id":"pool1xas798gr6u5kjy2y34ge0jhpp6fwlg88cycrg28swx50z83a9ye","vrfVerificationKeyHash":"342463d308642d685df96501b3727510cd10a690927e80727721c837eaff390f","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uzcd50ffs5upkujgw2wa88ky099wka33a6yd6y9zexd6cyss0mu6v","owners":["b0da3d2985381b7248729dd39ec4794aeb7631ee88dd10a2c99bac12"],"relays":[{"type":"hostname","hostname":"adaboy-preview-2c.gleeze.com","port":5000}],"metadata":{"url":"https://tinyurl.com/39a7pnv5","hash":"643a016d84fb171855f8b6d9c9a5efa230fb4665de3ee0ee0a1ed0f486d26be2"}},"pool18pn6p9ef58u4ga3wagp44qhzm8f6zncl57g6qgh0pk3yytwz54h":{"id":"pool18pn6p9ef58u4ga3wagp44qhzm8f6zncl57g6qgh0pk3yytwz54h","vrfVerificationKeyHash":"82419eaa78194ea40711dea37ab068e6ee101dd7785fe9e41e9acd4b98290d49","pledge":{"lovelace":1659000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1urpl4kvj3jfn3zxzxud9px6she3suks5fdyygyke7nnpkcslky9um","owners":["c3fad9928c933888c2371a509b50be630e5a144b484412d9f4e61b62"],"relays":[{"type":"ipAddress","ipv4":"51.104.251.142","port":3001}],"metadata":{"url":"https://adacapital.io/adact_preview.json","hash":"e345a478726731a08900d2cbad4b8455815d41b562fe2b862a3d8fd2c3e36d78"}},"pool18xr0tmqrqffd7yu5jh4pq7hs4eezkremxmgzkq8ua4y82dmmrxp":{"id":"pool18xr0tmqrqffd7yu5jh4pq7hs4eezkremxmgzkq8ua4y82dmmrxp","vrfVerificationKeyHash":"d9df3f4eee37db91a204ef07d8240e4822d8a1d0c0009d2384e7057dcd9cd7c8","pledge":{"lovelace":220000000000},"cost":{"lovelace":170000000},"margin":"69/10000","rewardAccount":"stake_test1ur9pv4652sv524d5qdy9q5h354er45jc3s562jp6vjykwwqyz0kzj","owners":["ca16575454194555b403485052f1a5723ad2588c29a5483a64896738"],"relays":[{"type":"ipAddress","ipv4":"130.162.231.122","port":6001}],"metadata":{"url":"https://tinyurl.com/2ku8unuf","hash":"f5d13701d87a7a6d2642c194c7517a411ac662bfe63fa1d1c63f7558ed83e7ea"}},"pool18x0rtv0vznym7cczsunqcfs5atrve4dfcavfmpe7wkg8ga4urve":{"id":"pool18x0rtv0vznym7cczsunqcfs5atrve4dfcavfmpe7wkg8ga4urve","vrfVerificationKeyHash":"2288a7b58fe88ea76717ba5dd7741e4274042e6806307c10804c581788098d9b","pledge":{"lovelace":2000000000000},"cost":{"lovelace":170000000},"margin":"9999/10000","rewardAccount":"stake_test1urdj5j3jtsj9lsf6xdz27dzxfw92ezj34v5d0qhcrx4ztysksexxe","owners":["db2a4a325c245fc13a3344af34464b8aac8a51ab28d782f819aa2592"],"relays":[{"type":"hostname","hostname":"topo-test.topopool.com","port":3010}],"metadata":{"url":"https://cardanostakehouse.com/f60a27ae-11a4-4e87-9707-3d9.json","hash":"32c22289da648abcb85bf98d81ab0cde0959e92bb01dfd2837966d6b6858d3d0"}},"pool18x5zg95n59xvysu3rq7ygqn6f842ud29dlcc5jmw97xkv2renhy":{"id":"pool18x5zg95n59xvysu3rq7ygqn6f842ud29dlcc5jmw97xkv2renhy","vrfVerificationKeyHash":"eb7084adcbbe7c2f29e4ad162969dfc80ec4d53a1598d2b4277340c29fd99b35","pledge":{"lovelace":9400000000},"cost":{"lovelace":340000000},"margin":"99/100","rewardAccount":"stake_test1upa7k9ag7zpst5h63lpxa9syq5l4wqk2p2qjvfc04j4ncygq73sxl","owners":["7beb17a8f08305d2fa8fc26e9604053f5702ca0a8126270facab3c11"],"relays":[{"type":"ipAddress","ipv4":"139.218.11.14","port":6005},{"type":"ipAddress","ipv4":"14.201.4.90","port":6005},{"type":"ipAddress","ipv4":"14.201.4.90","port":6006}],"metadata":{"url":"https://dpadapools.com/preview1meta.json","hash":"fafe0366055360d905a2f12da33af561518ae141151fadc9a8a61de850c45664"}},"pool18800lgwlelse96swl6e7n0xes7qeqcnlkkgweq0njrxk66zlj9a":{"id":"pool18800lgwlelse96swl6e7n0xes7qeqcnlkkgweq0njrxk66zlj9a","vrfVerificationKeyHash":"a21d1f6c4c25e3c81754fb21b73b20a4cf64264978980ee1b42c4cfed4c0217f","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzfmqylayt305l5h2lh9xe4h5snu8dqm853fkaj0ex92n4sk3zgy0","owners":["93b013fd22e2fa7e9757ee5366b7a427c3b41b3d229b764fc98aa9d6"],"relays":[{"type":"hostname","hostname":"relay1.preview.metablx.com","port":8092}],"metadata":{"url":"https://bit.ly/8BOOL_01","hash":"b8be919f1da5d19de98673907c00530ccb15eb8f728712cfca433432ffc84f77"}},"pool188a03x468k4t908x265knzc29sz7v7wqlvmqaehrk34vkll3e2h":{"id":"pool188a03x468k4t908x265knzc29sz7v7wqlvmqaehrk34vkll3e2h","vrfVerificationKeyHash":"dbefdeb6466e8c439d6f2c433677bb4baadd745778ee83480d29cb54dcda0c25","pledge":{"lovelace":7000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1upha97flpp5xn22nq0n8k3pg5gk85g6p7fmh9u89q8df5kg9axepw","owners":["6fd2f93f086869a95303e67b4428a22c7a2341f27772f0e501da9a59"],"relays":[{"type":"hostname","hostname":"relay3.preview.metablx.com","port":8093}],"metadata":{"url":"https://bit.ly/8BOOM_01","hash":"843ac18da9b54c0fa8262d6bb99868c29dae4ad9181a1ac1e44ed97ff7e8b2bd"}},"pool183nyxe4nwwxs3rmnsxchhlep4guzm8ayhqwr3se0evz7v0jnnd0":{"id":"pool183nyxe4nwwxs3rmnsxchhlep4guzm8ayhqwr3se0evz7v0jnnd0","vrfVerificationKeyHash":"6dbfd220765e0271d5bc9619238ec289d954e4ac9b435f0444bef87c8a89b2ba","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzfjqkmx3uatgthyk70uazalp2vrgg3vffjrwgfc2uwksncxh5z6a","owners":["93205b668f3ab42ee4b79fce8bbf0a9834222c4a64372138571d684f"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/LXSP5","hash":"0db9041127868af4eb8675f134648d2d3776768b2e658206c840867280579ec3"}},"pool18cq0sr4ryw4t63hvgmdp00z7f8h3hgxef0gjldsgk6j75ajza6y":{"id":"pool18cq0sr4ryw4t63hvgmdp00z7f8h3hgxef0gjldsgk6j75ajza6y","vrfVerificationKeyHash":"18c331fcf6535b1d597c8c661c54eedc36029982c3a3b9779e1525ce73b8d884","pledge":{"lovelace":10000000000},"cost":{"lovelace":340000000},"margin":"9999/10000","rewardAccount":"stake_test1uza6lr2dqs8skq7wut7rp77xvn42w67gsqslpca3r6v6kwqxmcuup","owners":["9ca82a28ceafb9b3bbd77faf6ac500519e6fcbd54f49ef387ca507ab"],"relays":[{"type":"hostname","hostname":"relay.preview.cardanostakehouse.com","port":11000}],"metadata":{"url":"https://cardanostakehouse.com/459b8a9e-b96a-43cc-9981-970.json","hash":"e5e31422e1e2bc34d9ddc87aa974ffc841079a0773dc6972b6efbdb17c8d0ffe"}},"pool18ccrdt0hyj6vd9qwzfwttp2dsq0yqxk03h8nvswecr8yctuynt3":{"id":"pool18ccrdt0hyj6vd9qwzfwttp2dsq0yqxk03h8nvswecr8yctuynt3","vrfVerificationKeyHash":"1d77bf5d2db5645ebde81bf496105973c50f780479dffe796772c3fac4382e99","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/2","rewardAccount":"stake_test1urh699v5gws437m5x5qn09mwv68r9jcmmwngltwjeyfpensx3dcvn","owners":["491ed3664c9cb520f39f4d7eb3275dab8e26f0b6b52bb7deeba111f2","7c344ba81cddc582d4683d093fe1cdb152b4ed3809e52cc719e863bd"],"relays":[{"type":"hostname","hostname":"relays.tradingtools.software","port":6000}],"metadata":{"url":"https://tradingtools.software/downloads/pool_description.json","hash":"aff79b84a4543912a5db601af91474b8b4d6077e1c49d3828793f34bacb2219e"}},"pool186kkpzde9e5ns0sy0852k9nwfvs4sg6m7zgkd272sms6xxslzqv":{"id":"pool186kkpzde9e5ns0sy0852k9nwfvs4sg6m7zgkd272sms6xxslzqv","vrfVerificationKeyHash":"671132f505c4fa210ac3f8d35c6d390a610b555d9c16452fd8c80aed79f82275","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uznvpusq22cmypf9qefkpersmghzqgk492sju2elhfvmnzcrwrrkn","owners":["a6c0f20052b1b20525065360e470da2e2022d52aa12e2b3fba59b98b"],"relays":[{"type":"ipAddress","ipv4":"172.19.0.3","port":3002}],"metadata":{"url":"https://short.gy/huOsbi","hash":"229136efb689e4c9c4246fd9ba19832a815db1b08f8126b2e3df7132e3b4427a"}},"pool18u47gq2ps4hqawl2sfr8uu8rn4yvkue7c68mw45v2ra4wj7pdx0":{"id":"pool18u47gq2ps4hqawl2sfr8uu8rn4yvkue7c68mw45v2ra4wj7pdx0","vrfVerificationKeyHash":"63de13cac6902f7b63a6530ab41297734554bc7932a68496dce10aa187da8bfc","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uzmxaaxxnrk7qcmx7mr3dtshc6e4xgfh5t5w8e690msqtyqgnzx08","owners":["b0348c669fe3cb7446b5084a669e304dd1cff63762352e8355e14482","b66ef4c698ede06366f6c716ae17c6b3532137a2e8e3e7457ee00590"],"relays":[{"type":"hostname","hostname":"4728f95d.cardano-relay.stagebison.net","port":1338}],"metadata":{"url":"https://4728f95d.cardano-metadata.stagebison.net/metadata.json","hash":"c0719d1437e1bf09915b0dbfaae2e384d737e326f17d8f1ae82d6a40111a1035"}},"pool1gslhruyd8pk4f6am9zjjzgwuvetge6tztswwfrjqpnvdsex3455":{"id":"pool1gslhruyd8pk4f6am9zjjzgwuvetge6tztswwfrjqpnvdsex3455","vrfVerificationKeyHash":"59fa47761c925ff90e191c5d7d18d62ddd15ff88094575c2b1b139ea231b8485","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/2","rewardAccount":"stake_test1ur5p8rcnye82hu4ukkt8xru2hqxa3f9z58pe53qkl9wzz0sn83hhf","owners":["e8138f13264eabf2bcb596730f8ab80dd8a4a2a1c39a4416f95c213e"],"relays":[{"type":"hostname","hostname":"spec2-staging.spirestaking2.com","port":3006}],"metadata":{"url":"https://data.spireblockchain.com/ADA-PREVIEW/SPF/pool_1.json","hash":"9f4e03dd87a814ef9407212ca61355edd9ff266d29a14eb43ad8ad312851b2bc"}},"pool1ghxsz57l4rhsju328dk0t8j3ycmz80xtf8w8xzpkk7pfwtca9u9":{"id":"pool1ghxsz57l4rhsju328dk0t8j3ycmz80xtf8w8xzpkk7pfwtca9u9","vrfVerificationKeyHash":"5fa64452a0b245bd9778b32ca0b65ecf13d658903419a4978d5ee70dd1eec6b8","pledge":{"lovelace":5000000000},"cost":{"lovelace":341000000},"margin":"1/25","rewardAccount":"stake_test1uznc9768hq2qvkg3f588ps9gssw05jztp8n0s7zc7tldlmcku0gxs","owners":["a782fb47b8140659114d0e70c0a8841cfa484b09e6f87858f2fedfef"],"relays":[{"type":"hostname","hostname":"preview.testnet.cryptobounty.org","port":6161}],"metadata":{"url":"https://bnty.one","hash":"677d4eba97170f5267a84ca9d12e0c2bdd116c87128aaa2aaf6905912841fa63"}},"pool1fr8hdmcl5vadqdxrtdks6vzc44ddqmxpzfuxeuezjt965z8hr04":{"id":"pool1fr8hdmcl5vadqdxrtdks6vzc44ddqmxpzfuxeuezjt965z8hr04","vrfVerificationKeyHash":"4b4e8c37e61a53313028a84eef9bcd1d0ddc77c5da6570be8d23ab77e0088318","pledge":{"lovelace":100},"cost":{"lovelace":340000000},"margin":"3/10","rewardAccount":"stake_test1uzp3y24gpe5zjw0nzsc04tteyuhr6yxqpcvl4cg9x6227gcr4s4cs","owners":["83122aa80e682939f31430faad79272e3d10c00e19fae1053694af23"],"relays":[]},"pool1fv5dyzcaydlj3gvkxqdjsxvey29cvk5zz8jjxncqhch4xxj3lgr":{"id":"pool1fv5dyzcaydlj3gvkxqdjsxvey29cvk5zz8jjxncqhch4xxj3lgr","vrfVerificationKeyHash":"4ab5835f2302ea9d183e1d56143ee82e224657f46403ffc2bc0c4a557f1afeb6","pledge":{"lovelace":1104000000},"cost":{"lovelace":411000000},"margin":"1/100","rewardAccount":"stake_test1ur9h9qtr739mhuypqmhfxvzux3g9h0tksew8w6ravaj3t8qacq6d9","owners":["c9dc49a676087ba0fb1ab1f28b209e647b4139626d732455bb7d5582","cb728163f44bbbf08106ee93305c34505bbd76865c77687d6765159c","f4cceaa5fff7b592e39519942ea8c3b823f3fee622bb3c81a5f5150f"],"relays":[{"type":"hostname","hostname":"us.netspectrum.com","port":13001}],"metadata":{"url":"http://us.netspectrum.com:13002/pool-meta-data.json","hash":"41bbeb6b2f37c5c9195c4c816fb9b641723b92ba14ecf5f4adf210155b08d0e3"}},"pool1fvmzpfjatfgg0jx5l56ttuprc8g9p42782rdg4e8a9cwvplk9th":{"id":"pool1fvmzpfjatfgg0jx5l56ttuprc8g9p42782rdg4e8a9cwvplk9th","vrfVerificationKeyHash":"02f96e2a0f0e25b1fe59eade571d1389eae47cda456f949de278791ca2f300e7","pledge":{"lovelace":500000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1upvea236pch7jvvrdsxczr0t9t4f5n9plnx4u8rrkz4h74gxy80l0","owners":["599eaa3a0e2fe931836c0d810deb2aea9a4ca1fccd5e1c63b0ab7f55"],"relays":[{"type":"ipAddress","ipv4":"142.132.229.15","port":6001}],"metadata":{"url":"https://udknow.github.io/extend.github.io/pool_MetaData.json","hash":"2afac2a4edec44da0f81ba5bd6c23eb2a895e172c8561c6680819feb4872f667"}},"pool1fw9mq9eyrp5yydl3njau2568jal62rx5f8anp2llt0e5s3pl3py":{"id":"pool1fw9mq9eyrp5yydl3njau2568jal62rx5f8anp2llt0e5s3pl3py","vrfVerificationKeyHash":"171fdc0c6430bddfdc725553a2d84d01042cfb586f1e4b546853da5d96a604db","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uq27femrn9wj07uad23waxfnc29f7wk86s9mddtp7qhlepcnk0r4r","owners":["15e4e763995d27fb9d6aa2ee9933c28a9f3ac7d40bb6b561f02ffc87"],"relays":[{"type":"hostname","hostname":"d8bdbfbe.cardano-relay.bison.run","port":1338}],"metadata":{"url":"https://d8bdbfbe.cardano-metadata.bison.run/metadata.json","hash":"64c1813d814e5c2abb5f65864ec26f0b060d49f3d206a31f34aa6428d7b682e3"}},"pool1fw7yf4mehfuszpdf2g0u72gu8d948qamwut5c6jm3d3lkj3e4an":{"id":"pool1fw7yf4mehfuszpdf2g0u72gu8d948qamwut5c6jm3d3lkj3e4an","vrfVerificationKeyHash":"838ca6096cff572b788d840445bf2167345f3d87485133ebcbfc729af016ee14","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"7/100","rewardAccount":"stake_test1ur7dav7tz75n7qd4p5fx2su0m5vdu6udvpn2aw4gusx536sag3auf","owners":["fcdeb3cb17a93f01b50d1265438fdd18de6b8d6066aebaa8e40d48ea"],"relays":[{"type":"ipAddress","ipv4":"162.55.3.29","port":3003}],"metadata":{"url":"https://test.com","hash":"0ba562271b66ca6929aff5026bb127d05fb7fdab05cb165854f13f57ed87a222"}},"pool1fszljutkfl8kvvnm0l585tzqevuuvyxmp7rt6346q0nkxxg33mj":{"id":"pool1fszljutkfl8kvvnm0l585tzqevuuvyxmp7rt6346q0nkxxg33mj","vrfVerificationKeyHash":"10236e06f67a865caf85cb51a7465dba3e35d0afab2ff55a0ae4626502c91793","pledge":{"lovelace":4567},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1upq6yxehs9le5fzav7476zngs4kvmrn5qane0mwe9y8a8tqzmjfcd","owners":["10417a1f689bb4328ca92d6ba5eae93da2eb2d5e25c34acbbe0cdfee","17cf6f438e4eec78e697919fee6a4a2095207cfd96a3aaa1a84b59c4","41a21b37817f9a245d67abed0a68856ccd8e74076797edd9290fd3ac"],"relays":[],"metadata":{"url":"https://www.updated_location.com","hash":"4cd0cdc50f4220f9c134c7370e68a50142c9e272da4eeba45c1bc367792ef224"}},"pool1fsxwamyfh5aqwg707m69zpfvwyrj5fz5ep7a8yk92wnavck4pdf":{"id":"pool1fsxwamyfh5aqwg707m69zpfvwyrj5fz5ep7a8yk92wnavck4pdf","vrfVerificationKeyHash":"e091185050f16c36c140ff83df893a6ee90abc4e4b6c9e6f61feec71fb2af439","pledge":{"lovelace":1000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1up50rxfvpmvh2k0e9ku7vypfk5w8280j3w6nm4nkk76qkfcqpc9wn","owners":["68f1992c0ed97559f92db9e61029b51c751df28bb53dd676b7b40b27"],"relays":[{"type":"ipAddress","ipv4":"154.12.248.114","port":6001}],"metadata":{"url":"https://raw.githubusercontent.com/hodlonaut/a/master/t1.json","hash":"81986b8f246cb39979af55fc01215f193df2dc07107989b886e131633e880e43"}},"pool1f7geezz3s4jlcej03v62wm75wvunu2dzwk4qa6fvkjl9j23yp03":{"id":"pool1f7geezz3s4jlcej03v62wm75wvunu2dzwk4qa6fvkjl9j23yp03","vrfVerificationKeyHash":"bb6a74b787c6c3f59dce9524356655c714d28c18af92dc14007a90cd5cf84851","pledge":{"lovelace":2000000000},"cost":{"lovelace":340000000},"margin":"1/25","rewardAccount":"stake_test1uz6wcl67glqj2sfx7e55afxv58g6f0p9rlwq0xyt6cm33hqxczkka","owners":["b4ec7f5e47c1254126f6694ea4cca1d1a4bc251fdc07988bd63718dc"],"relays":[{"type":"ipAddress","ipv4":"194.28.129.203","port":3001}],"metadata":{"url":"https://shorturl.at/hloWY","hash":"3be51e24185ed60ebcc73af79dd1e13167d78093dbbbb4dc61f4e26f1b10e40a"}},"pool12q7fskmv767qv8yn7mvcxj5azam9cdg0lpm3cajjqr2rqxc7y6a":{"id":"pool12q7fskmv767qv8yn7mvcxj5azam9cdg0lpm3cajjqr2rqxc7y6a","vrfVerificationKeyHash":"d1dc9125cf57397889b155799e3e6e89ce70c41b6b3b94d3e6e08a48bc4ea5e3","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"19/1000","rewardAccount":"stake_test1urfrzvw6yyunusyx4creuzysuyly3tqkj353v7fv58jl6hcfyzy5d","owners":["d23131da21393e4086ae079e0890e13e48ac16946916792ca1e5fd5f"],"relays":[{"type":"hostname","hostname":"pv.blockchainlens.org","port":6306}],"metadata":{"url":"https://raw.githubusercontent.com/bclens/cardano/main/pv.json","hash":"82dc82447da80029382fb904948c09431e0848260a504bcf4a75c575a040b05e"}},"pool12yqmdst9axjwgav7jgcu2umfa0vdm8cnh6rq9ctvaqhhvtuys5z":{"id":"pool12yqmdst9axjwgav7jgcu2umfa0vdm8cnh6rq9ctvaqhhvtuys5z","vrfVerificationKeyHash":"f39deed0607f101e4d3de99930f0a1532c914a2796651c6e2bef756eaf0636ed","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uq5j484c9yd0v2836knjpyldgpy3havq7252xjlyhd2kt2qfcesug","owners":["292a9eb8291af628f1d5a72093ed40491bf580f2a8a34be4bb5565a8"],"relays":[{"type":"hostname","hostname":"alpha.relay.preview.mochipool.com","port":7777}],"metadata":{"url":"https://preview.mochipool.com/poolmeta.json","hash":"156868305e96086404ebfdbef2b552d266771597a206f1bfa34874e83fe46c4a"}},"pool12yrhvezsrqxlafahf02ka28a4a3qxgcgkylku4vqjg385jh60wa":{"id":"pool12yrhvezsrqxlafahf02ka28a4a3qxgcgkylku4vqjg385jh60wa","vrfVerificationKeyHash":"9692c9b1540de270cff040ba6df0d680b91c524b2e01673b97b4679a9e2d91eb","pledge":{"lovelace":1000000000000},"cost":{"lovelace":500000000},"margin":"1/1","rewardAccount":"stake_test1ur9dz9x9yzn65ys0ms72l6gsmk9w3dfdj26qrvknjvlhmrgnzpcmv","owners":["25d448544726958c9232dab0aa12c63b06b1db494ea133b96e73c836"],"relays":[{"type":"hostname","hostname":"preview-node.play.dev.cardano.org","port":3001}]},"pool123gjej7l8f53906d4xp6f2jxa8zxav8arx3t8af5r3fkvgxx2wx":{"id":"pool123gjej7l8f53906d4xp6f2jxa8zxav8arx3t8af5r3fkvgxx2wx","vrfVerificationKeyHash":"442324fe40068b5c1dca530dab61fdbc273e1ec20aed07b13fbba87f6e45840a","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uq8jgpx346l6hwuxa3vdecegtyfcv35wy4hmyfczw39876g0mhcw7","owners":["0f2404d1aebfabbb86ec58dce328591386468e256fb22702744a7f69"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSNE","hash":"2424d0726b990ec170fd1f9298bde6cfe1792153ea6ba56387ad098cec30c4ea"}},"pool12645cty3fsa7a79vx2nsd8yupl3quyhr6h3vqk6duqn0yy7vkv0":{"id":"pool12645cty3fsa7a79vx2nsd8yupl3quyhr6h3vqk6duqn0yy7vkv0","vrfVerificationKeyHash":"c1b125e070bea224be6663ebf5cf748194a70cf6aa8c16885b56e684d12450d5","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1urdj5j3jtsj9lsf6xdz27dzxfw92ezj34v5d0qhcrx4ztysksexxe","owners":["db2a4a325c245fc13a3344af34464b8aac8a51ab28d782f819aa2592"],"relays":[{"type":"hostname","hostname":"topo-test.topopool.com","port":3010}],"metadata":{"url":"https://cardanostakehouse.com/bf2f257f-2776-4c14-aae4-1c1.json","hash":"98db945cdff93d149a30e0d9010927f1417fb1b9796c63a2bcbb85cd551b2fb6"}},"pool12l8602apyt7a52l0746te57y4wtl9rv0pxjvsg6w5p7vk2pcwk2":{"id":"pool12l8602apyt7a52l0746te57y4wtl9rv0pxjvsg6w5p7vk2pcwk2","vrfVerificationKeyHash":"254e89d363387a17fecaedaf04ff7cee91be656a25f9d4371416722b078c8c6f","pledge":{"lovelace":100000000},"cost":{"lovelace":345000000},"margin":"6969/10000","rewardAccount":"stake_test1uqjgdtza3mr6k9w76798vs3hpu4dm963rdkpxrlqrcvknmcn38xkh","owners":["2486ac5d8ec7ab15ded78a7642370f2add97511b6c130fe01e1969ef"],"relays":[{"type":"ipAddress","ipv4":"146.235.201.221","port":6000}],"metadata":{"url":"https://tinyurl.com/3rp46mu3","hash":"dc2e0b9de0a745efcfc863dbbb9a69553899c0bdc1daadf2656e9d32ec53cd93"}},"pool1tycl9a9cqgffccgsh0867u65qpk0qlm43kjqggepmflajsmcds6":{"id":"pool1tycl9a9cqgffccgsh0867u65qpk0qlm43kjqggepmflajsmcds6","vrfVerificationKeyHash":"e89c87e0d1527f047cdb4254d8139987124e9a06d07538bfb4ceda29f43ee098","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uzd5msh6y083l597yacq5pcgs82pzfrm50j3nemmynmqfcsg2m4r0","owners":["9b4dc2fa23cf1fd0be27700a070881d411247ba3e519e77b24f604e2"],"relays":[{"type":"hostname","hostname":"e566964e.cardano-relay.stagebison.net","port":1338}],"metadata":{"url":"https://e566964e.cardano-metadata.stagebison.net/metadata.json","hash":"c0719d1437e1bf09915b0dbfaae2e384d737e326f17d8f1ae82d6a40111a1035"}},"pool1t9uuagsat8hlr0n0ga4wzge0jxlyjuhl6mugrm8atc285vzkf2e":{"id":"pool1t9uuagsat8hlr0n0ga4wzge0jxlyjuhl6mugrm8atc285vzkf2e","vrfVerificationKeyHash":"957d1696507a9f88c641db39cc2e34274456efeee9538a2bb4f332f44fb1d25c","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uq9yp8wqvgpnucpe6s6yavnrvqnuykadx8y40sv0c5ur93gapzeka","owners":["0a409dc062033e6039d4344eb2636027c25bad31c957c18fc53832c5"],"relays":[{"type":"hostname","hostname":"mithril-signer-3.testing-preview.api.mithril.network","port":9092}],"metadata":{"url":"https://tinyurl.com/2qvmy5xy","hash":"adaff9f5327ad0a3b9a47ba88a14100235915c80da2806f9bf8d271dbc0a6e13"}},"pool1txg39f9mdatrvv3mp7nwfj07he3cqe0y4cach06e2z6ykmysytj":{"id":"pool1txg39f9mdatrvv3mp7nwfj07he3cqe0y4cach06e2z6ykmysytj","vrfVerificationKeyHash":"64e14353b2cc4050d5fa27c40acbea2556089d57527e595101ef0e1ef2986009","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uqe8qlh2xqneakexw06jgfl9pev9r5vqj743de0a6uqw8ygs0gw82","owners":["32707eea30279edb2673f52427e50e5851d18097ab16e5fdd700e391"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3001}],"metadata":{"url":"https://bit.ly/43u9ybcJ","hash":"c1ef608ac6ba33acba208cdbbb2eaa7eb8fc944103f84646040931b1284478e7"}},"pool1tfgdvuc8p8zrmyhxc2g82denxkrxuy9dx5qwzp9lx85xgjedvdg":{"id":"pool1tfgdvuc8p8zrmyhxc2g82denxkrxuy9dx5qwzp9lx85xgjedvdg","vrfVerificationKeyHash":"afb03550e8b2974b2ddeb22231132b361ca45d4b3d4fc45435c053c510dc6481","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uqz3lkuqxjh42yujn5l3zegcvc6a82lmyhr8ylc68sq44fcj9dppz","owners":["051fdb8034af5513929d3f1165186635d3abfb25c6727f1a3c015aa7"],"relays":[{"type":"hostname","hostname":"preview.frcan.com","port":6010}],"metadata":{"url":"https://raw.githubusercontent.com/Mikederel/p/main/p.json","hash":"ade52fe0bf2d23ed509ce2fc5b3990f4178ad8768f66ead1955a1f7e04b11c82"}},"pool1t3pl903zsy3wqgl4392hmuwx8a3f259f3yzhl2ns4xlhskxkr43":{"id":"pool1t3pl903zsy3wqgl4392hmuwx8a3f259f3yzhl2ns4xlhskxkr43","vrfVerificationKeyHash":"dd6686e356e2bec35ee51b17356d801e69917e3b472e2e59d3371e48207fd990","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1urp9rkuj73fqcuc47u3r92huffdmfgnxszkk8nl3dpdmwvqjwpjgz","owners":["c251db92f4520c7315f72232aafc4a5bb4a26680ad63cff1685bb730"],"relays":[{"type":"hostname","hostname":"sator89.ddns.net","port":25369}],"metadata":{"url":"https://capitalstakepool.info/CSP.json","hash":"04028c72c74f04d605fc0d1a04c99357c8563bcf5cc408a6b6e8c7e72176c9d9"}},"pool1tmhw3wga9qdvz5enyxkhm7h9j4u7lp60y9lvvsdv3323wa447y6":{"id":"pool1tmhw3wga9qdvz5enyxkhm7h9j4u7lp60y9lvvsdv3323wa447y6","vrfVerificationKeyHash":"697920a02a8ec26f6b77ad9c0b8744339b26433e80974cfc35f68e4e38fee2f2","pledge":{"lovelace":8000000000},"cost":{"lovelace":340000000},"margin":"29/1000","rewardAccount":"stake_test1uzwev96me9lpndczchkgaytxwrjlny97qh0dl4zk5hs3wagw9s0c3","owners":["9d96175bc97e19b702c5ec8e916670e5f990be05dedfd456a5e11775"],"relays":[{"type":"ipAddress","ipv4":"128.140.96.209","port":8000}],"metadata":{"url":"https://cardano24.com/premeta.json","hash":"bf9b1cfe6a7caf8adb5c868f49d6e2414960aa1fefd815694f4525622c73efd7"}},"pool1vzqtn3mtfvvuy8ghksy34gs9g97tszj5f8mr3sn7asy5vk577ec":{"id":"pool1vzqtn3mtfvvuy8ghksy34gs9g97tszj5f8mr3sn7asy5vk577ec","vrfVerificationKeyHash":"cc688f3f4c8152bbc71cd7b2e8da059856ea06e1520cda4a0724c4cd2632acd3","pledge":{"lovelace":250000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uzyzlml7sqd9kpdq5xv6y6dzme78xtgllpt3yv62mjmj9cg082gaa","owners":["882feffe801a5b05a0a199a269a2de7c732d1ff85712334adcb722e1"],"relays":[{"type":"hostname","hostname":"tn-preview.psilobyte.io","port":4201},{"type":"hostname","hostname":"tn-preview2.psilobyte.io","port":4202}],"metadata":{"url":"https://psilobyte.io/adatest/psb-meta.json","hash":"18c2dcb8d69024dbe95beebcef4a49a2bdc3f0b1c60e5e669007e5e39edd4a7f"}},"pool1vhdl0z496gxlkfpdzxhk80t4363puea6awp6hd0w0qwnw75auae":{"id":"pool1vhdl0z496gxlkfpdzxhk80t4363puea6awp6hd0w0qwnw75auae","vrfVerificationKeyHash":"db19e2b96aabf2a9dd42c8d91d88bca9feff8286e77ca6b0873d4de3b06f7d1e","pledge":{"lovelace":45000000000},"cost":{"lovelace":170000000},"margin":"0/1","rewardAccount":"stake_test1upylhjc96sxhmawg0z4vut0c2nku4nhayul28a0w2msnfdcjyehf0","owners":["49fbcb05d40d7df5c878aace2df854edcacefd273ea3f5ee56e134b7"],"relays":[{"type":"ipAddress","ipv4":"204.216.214.226","port":6000}],"metadata":{"url":"https://bit.ly/48BnVgU","hash":"c74260178b12b253edc70b950a9dc9dbbfb94c4e76f74172dbbe2ad4f06d0879"}},"pool1vhclwkzyf6ahyt260sh5gsr2udz47074q0slxp20sqn75xjy2xx":{"id":"pool1vhclwkzyf6ahyt260sh5gsr2udz47074q0slxp20sqn75xjy2xx","vrfVerificationKeyHash":"5cd33abcda61776fa52893373e96b8c63430635f74d2f604faf23ffdd7fe614c","pledge":{"lovelace":5000000000},"cost":{"lovelace":4321000000},"margin":"1/25","rewardAccount":"stake_test1upvhfqp8qywsyhe45zflp7ytphwuq8uzxtx0eed4agqsl3cx966vk","owners":["59748027011d025f35a093f0f88b0dddc01f8232ccfce5b5ea010fc7"],"relays":[{"type":"ipAddress","ipv4":"10.0.0.31","port":3000}],"metadata":{"url":"https://tinyurl.com/y2z4cvnt","hash":"91514f535468f45ee8bf8aae5c06e69bae95aeaec8775e2ee7c519ec42525c00"}},"pool1vc577hmjzpgz6mlccdv8ddwplfgvjtp639ykqd05anu6jcja69a":{"id":"pool1vc577hmjzpgz6mlccdv8ddwplfgvjtp639ykqd05anu6jcja69a","vrfVerificationKeyHash":"42d1ab64b06293ddcbf63dcf8466939bbfc470cf858b87be468abf46dca407ce","pledge":{"lovelace":1000000000},"cost":{"lovelace":345000000},"margin":"3/20","rewardAccount":"stake_test1uq2ktannndxkd639acvkf3hnllh04ddvmh8ctu9e6u2mstsu6fv2l","owners":["1565f6739b4d66ea25ee1964c6f3ffeefab5acddcf85f0b9d715b82e"],"relays":[{"type":"hostname","hostname":"0.0.0.0","port":6000}],"metadata":{"url":"shorturl.at/itHOW","hash":"d37a27a9a28ece2c898936eaf431287b5cd7b4cd09247a941289273ca70a06a4"}},"pool1vezalga3ge0mt0xf4txz66ctufk6nrmemhhpshwkhedk5jf0stw":{"id":"pool1vezalga3ge0mt0xf4txz66ctufk6nrmemhhpshwkhedk5jf0stw","vrfVerificationKeyHash":"41762f6a5cf97a405230e278c52b9d711937858c3f7c5d54e5d892ca626798c7","pledge":{"lovelace":125000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uz5ah77y8xvnxs6cyp979hg7fhxezjw39jfrpardqymnz7sg7ea8y","owners":["7981e93ea49a82b02369e8b16b3aca1dd0a015ada02cd72f5f23031b","a9dbfbc43999334358204be2dd1e4dcd9149d12c9230f46d0137317a"],"relays":[{"type":"ipAddress","ipv4":"73.222.122.247","port":23001}],"metadata":{"url":"https://bit.ly/3GNLlTI","hash":"251194136caedddada9227adfe30312af6c011a1628d178fa7377051bd385bd2"}},"pool1vevw38yxlyaxke29d40ace7jzz7d38qtcmd5kk36chf3shh02ek":{"id":"pool1vevw38yxlyaxke29d40ace7jzz7d38qtcmd5kk36chf3shh02ek","vrfVerificationKeyHash":"9b49ae80c094db2bb49ae40e21deb1d7921fde3c8b469e90667c58859836d16c","pledge":{"lovelace":30000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1ur5jhdf8a7lput2qhsa2hndls4h5yh5ukxr7yc7qkdm96jgnrtjmj","owners":["e92bb527efbe1e2d40bc3aabcdbf856f425e9cb187e263c0b3765d49"],"relays":[{"type":"ipAddress","ipv4":"113.43.231.41","port":3001},{"type":"ipAddress","ipv4":"113.43.231.41","port":4001},{"type":"hostname","hostname":"ada.nodes.mresearch.xyz","port":3001},{"type":"hostname","hostname":"ada.nodes.mresearch.xyz","port":4001}],"metadata":{"url":"https://git.io/Jo7m7","hash":"a40c9206f1ccb3e6ccfe71a7eaf7f6d4a0d15770d7b097829089468ed9be21ac"}},"pool1ve7vhcyde2d342wmqcwcudd906jk749t37y7fmz5e6mvgghrwh3":{"id":"pool1ve7vhcyde2d342wmqcwcudd906jk749t37y7fmz5e6mvgghrwh3","vrfVerificationKeyHash":"612e0b5b84ff4e48a924b51e511485a4884a31e9f8094d7ff9f1e190bc1af30d","pledge":{"lovelace":9147456725},"cost":{"lovelace":340000000},"margin":"1/25","rewardAccount":"stake_test1urwy6fkeyl4e38mws7f8k34pyltq6qy5gpn86ws3l67cthccls3hd","owners":["dc4d26d927eb989f6e87927b46a127d60d009440667d3a11febd85df"],"relays":[{"type":"ipAddress","ipv4":"192.168.200.132","port":3001}],"metadata":{"url":"https://raw.githubusercontent.com/mj83263/test/main/tPl.json","hash":"dc4bd67f3b9b6138fcd11b6222a1550d402d367e303cce3e07a683e9c6af8f41"}},"pool1vurgy6s6u7yq36shf9yspesh3rrnd36km8xkghpcr4smgfz278m":{"id":"pool1vurgy6s6u7yq36shf9yspesh3rrnd36km8xkghpcr4smgfz278m","vrfVerificationKeyHash":"1eec12eccea7cdfe494ac8b980a2c6d6a510d44ad87e3fa6f5092d34d86abae4","pledge":{"lovelace":10000000000},"cost":{"lovelace":340000000},"margin":"1/2","rewardAccount":"stake_test1ur0paqh4t5cwgflh4phdjkhvpwdvv3ps6zd8l7cv9ffk20qxjhqwf","owners":["de1e82f55d30e427f7a86ed95aec0b9ac64430d09a7ffb0c2a53653c"],"relays":[{"type":"ipAddress","ipv4":"185.43.205.110","port":3003},{"type":"hostname","hostname":"cardano.illusion.hu"}],"metadata":{"url":"https://www.illusion.hu/cardano/hunada-test.json","hash":"d93c4c6690186dfa973b6a7ee3203a16e953153616d7165895f4ab7b94de6212"}},"pool1vapqexnsx6hvc588yyysxpjecf3k43hcr5mvhmstutuvy085xpa":{"id":"pool1vapqexnsx6hvc588yyysxpjecf3k43hcr5mvhmstutuvy085xpa","vrfVerificationKeyHash":"9f6e5d16ea05c1905907e8aee60b426c7680c32870c2ebe0be50281d889d5cf0","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uzkxke5d0tjj0utd8tf2v75vytt6wjkx0tp4lr0885slcnqtq2ryf","owners":["ac6b668d7ae527f16d3ad2a67a8c22d7a74ac67ac35f8de73d21fc4c"],"relays":[{"type":"hostname","hostname":"mithril-signer-1.testing-preview.api.mithril.network","port":9091}],"metadata":{"url":"https://tinyurl.com/263p356z","hash":"276f035319f342a84f7e8abf8ec0befde2434bcb29f20f41afd09132fb083fd1"}},"pool1drrylt73ln8jcv0sthcenlkhuan2lfyhthkrrv3vhs9vv4eywdy":{"id":"pool1drrylt73ln8jcv0sthcenlkhuan2lfyhthkrrv3vhs9vv4eywdy","vrfVerificationKeyHash":"c2d3aa0b9ddf84ad6680c8d4dac3375664290b95a290ab7f27c2ebd52bd537cd","pledge":{"lovelace":100000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1up2ldekqxmad8gu89l4dw9r9nde58xvfsh00uhs98x33w4qxeeugs","owners":["55f6e6c036fad3a3872fead714659b7343998985defe5e0539a31754"],"relays":[{"type":"ipAddress","ipv6":"2a01:e0a:3d1:770:216:3eff:fe05:9009","port":6006}],"metadata":{"url":"https://api.monrma.ml/meta/GATOR.json","hash":"66bcc65cac5cb109e0bd4c89696d2dc010902cef15d29f0b73250fc8855af5d3"}},"pool1d4nsv4wa0h3cvdkzuj7trx9d3gz93cj4hkslhekhq0wmcdpwmps":{"id":"pool1d4nsv4wa0h3cvdkzuj7trx9d3gz93cj4hkslhekhq0wmcdpwmps","vrfVerificationKeyHash":"ca839c83356effe8d232fa8dd1335afcf923bf8d151cda561a6e94e0b9f38ac7","pledge":{"lovelace":1000000},"cost":{"lovelace":429000000},"margin":"2/25","rewardAccount":"stake_test1ur8csttjsny8t783dnfeylwangqh94zrahnps3qaw6rphcsswzsft","owners":["cf882d7284c875f8f16cd3927ddd9a0172d443ede618441d76861be2"],"relays":[{"type":"hostname","hostname":"relay.preview.crimsonpool.com","port":3000}],"metadata":{"url":"https://crimsonpool.com/red.metadata.json","hash":"e3db302e127a7929cd741de7df7744448906110f76fb6d7d793716937b7a49a6"}},"pool1dhheyj4y7q8c8nj3z3lkuv9vqfjw75rnt48eet8efcnvczeznr7":{"id":"pool1dhheyj4y7q8c8nj3z3lkuv9vqfjw75rnt48eet8efcnvczeznr7","vrfVerificationKeyHash":"922ce518a7130d31bf31b4501585e51ccb58db022fb4d6fe429ec56eae5f9db9","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzj0zcvrpkt6lv6c2543vshmxqptnxux0qz5nt744e0gjtgycwrj8","owners":["a4f161830d97afb358552b1642fb3002b99b86780549afd5ae5e892d"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/RSPO1","hash":"666f5ac6701133f3b54b43785b2ce4ed4a12432d9a27f3e07583e8714fd8229c"}},"pool1da3p2l74sr347ln6gpmmkkqnnupfxhfh2d7fuur2g7twvddm5ua":{"id":"pool1da3p2l74sr347ln6gpmmkkqnnupfxhfh2d7fuur2g7twvddm5ua","vrfVerificationKeyHash":"d67f65e8c4fa6346a631b6623b35951e63596920c2ccf1c9d4a836fcea66846c","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uzv69q0u5g7zdvepd96ljt0ngex4gdhules9pj9m73s8w3csm5xm5","owners":["99a281fca23c26b3216975f92df3464d5436fcfe6050c8bbf4607747"],"relays":[{"type":"hostname","hostname":"west.piada.io","port":6000}],"metadata":{"url":"https://piada.io/piada_preview.metadata.json","hash":"f4bf83eb38af4c225b5ee264085d5c0bb529e2016e50b731e590019d37c780f0"}},"pool1damnajda3jh3tch3zcpk9f5pajuyeud820n0q7qesxyyx62cel2":{"id":"pool1damnajda3jh3tch3zcpk9f5pajuyeud820n0q7qesxyyx62cel2","vrfVerificationKeyHash":"4afa907233b0f44c6d6293e323a986854fcb0bbc2ba818daa48dc5ef7dd8e048","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1uqnkzt5ju2c6enmg04k63hz9ryc4lgxrjr5ygfq88kfsymczryjw6","owners":["27612e92e2b1accf687d6da8dc4519315fa0c390e84424073d93026f"],"relays":[{"type":"ipAddress","ipv4":"52.166.113.150","port":6000}],"metadata":{"url":"https://raw.githubusercontent.com/aleincsharp/a/main/md.json","hash":"49222a06d7b62846b99583b1dcb76d835bb62b1cec8edf5c4744c1d398182a5e"}},"pool1wx2daxr2qgh4yhf9mn4se8kyadj4cnyad6zkt7eyufhwvz2ycyh":{"id":"pool1wx2daxr2qgh4yhf9mn4se8kyadj4cnyad6zkt7eyufhwvz2ycyh","vrfVerificationKeyHash":"45a81cd08738c9bdb890a312f394a8aabc344f9f5e17dae53a877aa966f3293a","pledge":{"lovelace":2000000000},"cost":{"lovelace":340000000},"margin":"3/100","rewardAccount":"stake_test1uzgcmw4nr5ytnfpvr7khq5nsgh87qc79yat66wzu7s7kzwcqdzjlz","owners":["918dbab31d08b9a42c1fad70527045cfe063c52757ad385cf43d613b"],"relays":[{"type":"hostname","hostname":"10.0.3.15","port":6000}],"metadata":{"url":"https://gaiastakepool.com/wp-content/uploads/2023/10/md.json","hash":"d123bf56ab892805ea6c215c88af2b73ba9e7eafc156fc19f27e9f6cf5441272"}},"pool1w83ux7vrwafrsuz044knxl9xxtr38q5jj2l3p28fl3g26faqqwg":{"id":"pool1w83ux7vrwafrsuz044knxl9xxtr38q5jj2l3p28fl3g26faqqwg","vrfVerificationKeyHash":"5c44de7dcbbf485040edf760fe91855693ea7e2290a6a9f4b25efdc42a37b025","pledge":{"lovelace":0},"cost":{"lovelace":10000000000},"margin":"1/2","rewardAccount":"stake_test1urqntq4wexjylnrdnp97qq79qkxxvrsa9lcnwr7ckjd6w0cr04y4p","owners":["c13582aec9a44fcc6d984be003c5058c660e1d2ff1370fd8b49ba73f"],"relays":[{"type":"hostname","hostname":"test.stakepool.at","port":9001}],"metadata":{"url":"https://my-ip.at/test/previewpool.metadata.json","hash":"069457ca9fdc1bbeac1f7b4602b9d8fe8ee4255f8af724de2f79702c464402fc"}},"pool1wwh3k3ldzujdvgxllfwlnnkxyheafkacqlufnvpr77n5q72f9hw":{"id":"pool1wwh3k3ldzujdvgxllfwlnnkxyheafkacqlufnvpr77n5q72f9hw","vrfVerificationKeyHash":"81fd203455043724337724f64e67ebbb208d3885ac0063c8b14c4b2bea0bec5e","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uz3s7gd3rhe9ptechqj7z2r7l6l2gr42rv3lvu4grsdnapg88utxm","owners":["a30f21b11df250af38b825e1287efebea40eaa1b23f672a81c1b3e85"],"relays":[{"type":"ipAddress","ipv4":"51.77.24.220","port":4003}],"metadata":{"url":"https://www.stakecool.io/pools/pvcool-001.metadata.json","hash":"aade4d000f39df2f9ebfc4e23c9a3c49850236fcb924edc1f4da9be844d9691f"}},"pool1wjz475nwhq3fnhfvrjesf4pw70k27fnc5mzvsrzqlxfhy60rmu3":{"id":"pool1wjz475nwhq3fnhfvrjesf4pw70k27fnc5mzvsrzqlxfhy60rmu3","vrfVerificationKeyHash":"663f0b5d8bebb6622de18c0121d3d5bbcb1824b749fe4cbd41a0b232ff4b982e","pledge":{"lovelace":0},"cost":{"lovelace":170000000},"margin":"1/100","rewardAccount":"stake_test1uq3n393q95qu7nswzvnx688ukq69e4p3r78euf2kfwsxg2sygp0rv","owners":["233896202d01cf4e0e13266d1cfcb0345cd4311f8f9e25564ba0642a"],"relays":[{"type":"hostname","hostname":"preview-relays.onyxstakepool.com","port":3001}],"metadata":{"url":"https://onyxstakepool.com/PV-ONYX1.json","hash":"c9e5e56c46dd015c183978583e6f9bc71f7abfc4dc4f949ca12a6f5aff8778fa"}},"pool1w75ukvh77hhz8c2u6rhfjvqlxyptwg37yrkddzatu99qxwwlqhd":{"id":"pool1w75ukvh77hhz8c2u6rhfjvqlxyptwg37yrkddzatu99qxwwlqhd","vrfVerificationKeyHash":"dedb7862c992b2fddfc5fe012e573aead78a0b844ca73748c9feb45a0d68666a","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1urelmc7gcf4ukdf0lakusaunerkm8h6hqzvfgx8z4sflpjc4xeg7h","owners":["f3fde3c8c26bcb352fff6dc87793c8edb3df5700989418e2ac13f0cb"],"relays":[],"metadata":{"url":"https://your_pool_website.com","hash":"6bf124f217d0e5a0a8adb1dbd8540e1334280d49ab861127868339f43b3948bf"}},"pool1w757a30j8cd6nlf5dn9q52lm5ee0fn5permvtlr7mycucpkn6c5":{"id":"pool1w757a30j8cd6nlf5dn9q52lm5ee0fn5permvtlr7mycucpkn6c5","vrfVerificationKeyHash":"6ee546ad0102c3576526fc600b4ab806d5ae3f2cd037110d4cd2505c31c05a18","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"9/500","rewardAccount":"stake_test1uzu2wh3mwjg0pua454hskmehvvte4ut9nn22tqxzuycdclq5kuf7g","owners":["b8a75e3b7490f0f3b5a56f0b6f3763179af1659cd4a580c2e130dc7c"],"relays":[{"type":"ipAddress","ipv4":"139.180.205.134","port":6000}],"metadata":{"url":"https://stakinghouse.com/poolMetaData.json","hash":"021ca91a9f24147bd20c4b7f9a4a1a329998e5fa2ac2a362b40850749ff54b1d"}},"pool10gqm62xy7caj6jhhefsl7h59kse3rv2esuh9rvx55eze2n8dlrj":{"id":"pool10gqm62xy7caj6jhhefsl7h59kse3rv2esuh9rvx55eze2n8dlrj","vrfVerificationKeyHash":"8a9f2e79f70743bdc43b20da993c90b9512849f939fb5b6c3bdad80b5ff3261e","pledge":{"lovelace":25000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqj0hyhn72p495gntxzt4g9au76ycpcvku693mpexqxdk5s7cwqed","owners":["24fb92f3f28352d1135984baa0bde7b44c070cb73458ec39300cdb52"],"relays":[{"type":"hostname","hostname":"preview.relay.beerpool.io","port":6000}],"metadata":{"url":"https://beerpool.io/poolmeta.json","hash":"3f2d006aa149ac16689d6dd5d0dbbe46d87b41d4b8a282e7621996b6a64cd819"}},"pool10d303wup90j39mmvysf0lhr2xmr3mf38y5vs577nmlq6yy8n666":{"id":"pool10d303wup90j39mmvysf0lhr2xmr3mf38y5vs577nmlq6yy8n666","vrfVerificationKeyHash":"7e076f5dd02cead70dcd2058305392b67f66b8e4e6dc553fa032b918c5ddbce0","pledge":{"lovelace":2090000000},"cost":{"lovelace":340000000},"margin":"1/25","rewardAccount":"stake_test1uqucdhr6kfvgzp2py95cqtqhvmpzswtgh8z6t2klnfr9vdgm7c25a","owners":["3986dc7ab2588105412169802c1766c2283968b9c5a5aadf9a465635"],"relays":[{"type":"hostname","hostname":"scarborough1.ddns.net","port":6000},{"type":"hostname","hostname":"scarborough1.ddns.net","port":6001},{"type":"hostname","hostname":"scarborough1.ddns.net","port":6002}],"metadata":{"url":"https://raw.githubusercontent.com/poonasor/cbcp/main/meta.json","hash":"c23b67ca0d0c470bc2816afa0f0bcf4a46374148be2bcf80a204c03dd1148d09"}},"pool105wx68zqse6v4wyx09nkqhxhmf7e0zj349pclyqsjqch7953j0x":{"id":"pool105wx68zqse6v4wyx09nkqhxhmf7e0zj349pclyqsjqch7953j0x","vrfVerificationKeyHash":"7b0cb25a2a5abf1a97523355002a173cd9ff4b2108b7ace2b4693ee406b06eef","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uz575pc99c8tr8n09u9ek3vhuys7202naetcj83l6fuzrxqpd3ml9","owners":["a9ea07052e0eb19e6f2f0b9b4597e121e53d53ee57891e3fd2782198"],"relays":[{"type":"hostname","hostname":"relay1.doctorstake.network","port":6061}],"metadata":{"url":"https://doctorstake.network/pvpoolmetadata.json","hash":"8ad1a438122bcbab46ab21bb077e818948b2d53d8c9798d0598cad713214663b"}},"pool1057njzaaz280688ppewa3df4qshspvh98njh5n4lq4cg7ntcsyj":{"id":"pool1057njzaaz280688ppewa3df4qshspvh98njh5n4lq4cg7ntcsyj","vrfVerificationKeyHash":"a63ae2342ab8c541978c1f12f0a2338b78b1486c9c6fcdc5d516df4f08bbd93f","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqmeldflttkgjsjelhzxmznfklc2d8awc9g2afs07m55kfcv70208","owners":["379fb53f5aec894259fdc46d8a69b7f0a69faec150aea60ff6e94b27"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/RSPO2","hash":"170ccb211dcc6ca0074b6f36077799a40a1d5aa421066feb09a5aa60692e9db0"}},"pool10cpz0zepq23hm6lrk8vgnsdwl772lasq9caaemvw9kh9ktxqygk":{"id":"pool10cpz0zepq23hm6lrk8vgnsdwl772lasq9caaemvw9kh9ktxqygk","vrfVerificationKeyHash":"d203f215f4ebd6374ca67745a4d7ca99caff1b1b364cc630d18519e5ddb118ac","pledge":{"lovelace":2000000000},"cost":{"lovelace":340000000},"margin":"3/100","rewardAccount":"stake_test1uzp6ykjc52zfcx5a5xqcxdwv20s66y0pqmzpn4pczuqpzqs83gzya","owners":["83a25a58a2849c1a9da1818335cc53e1ad11e106c419d43817001102"],"relays":[{"type":"hostname","hostname":"esq.ddns.net","port":6010},{"type":"hostname","hostname":"esq.ddns.net","port":6011}],"metadata":{"url":"https://raw.githubusercontent.com/bspdefi/esq/master/meta","hash":"7ae1ee1e5ad1645a9f8ee5bde677cbddafe60bcb1d014e655451ab5777aec7f7"}},"pool10c40pnzz3e00kuej05xfcs2ptkekhys48q7qc4jjcsysypj46qv":{"id":"pool10c40pnzz3e00kuej05xfcs2ptkekhys48q7qc4jjcsysypj46qv","vrfVerificationKeyHash":"904c35106259f1c80add13381d730f8bf6291499b9df48dd19a930d0ab865093","pledge":{"lovelace":8000000},"cost":{"lovelace":340000000},"margin":"3/20","rewardAccount":"stake_test1uqk6t7lajwssrzer6xjarc0n78y26d7p3lswnzrnnegng5ggr5lhm","owners":["2da5fbfd93a1018b23d1a5d1e1f3f1c8ad37c18fe0e988739e513451"],"relays":[{"type":"hostname","hostname":"preview.seaside-staking.best","port":18000}],"metadata":{"url":"https://raw.githubusercontent.com/Seaside-Staking/m/main/m.json","hash":"d843ac7c8ab3a17fe28d5a68c975dc846fe87479364bcff7dd3b30e5c442ca07"}},"pool106rnmvjt0n27y34py0qytashgm04v4hlqurp3w28z789v8scxat":{"id":"pool106rnmvjt0n27y34py0qytashgm04v4hlqurp3w28z789v8scxat","vrfVerificationKeyHash":"482a895958b40cb9b00aa0069ded71dc7516c203e8b30d3c9993d7a3e50d47f6","pledge":{"lovelace":10000000000},"cost":{"lovelace":345000000},"margin":"3/50","rewardAccount":"stake_test1ur8xh997mc3p7vduu0ufkm3wda6dan9wxv3zz4rhguzglqs3elq2d","owners":["ce6b94bede221f31bce3f89b6e2e6f74deccae332221547747048f82"],"relays":[{"type":"ipAddress","ipv4":"190.225.246.141","port":6000}],"metadata":{"url":"https://t.ly/QCIeZ","hash":"5dba9fe7cd4be8e0aebea2012090d3f0f5dcb6f14f86b2a9aa0596b568763bb1"}},"pool10u9jtq8xewg3x80fulh7tuucktckfqzm9h38lz3ldp64y57fku0":{"id":"pool10u9jtq8xewg3x80fulh7tuucktckfqzm9h38lz3ldp64y57fku0","vrfVerificationKeyHash":"2c1baf122a9eb546c89b8cd975461cf2a82fc0ef370cb53459e24d39ca852c4e","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1upq35kyukearpcp58waywdpxxwc3k8kt75cs05mz3mssm6g7ac95u","owners":["411a589cb67a30e0343bba47342633b11b1ecbf53107d3628ee10de9"],"relays":[{"type":"ipAddress","ipv4":"13.229.226.159","port":3001}],"metadata":{"url":"https://git.io/JJWdJ","hash":"d5688399cc3e9c839a21d4ae577e1e7ac4de2e97f54cc05b228e4b53bc6fd52d"}},"pool1srdhn8v6ly36vdvvzthjkv6jjp7wqnzated6unxujrmzkqn40hm":{"id":"pool1srdhn8v6ly36vdvvzthjkv6jjp7wqnzated6unxujrmzkqn40hm","vrfVerificationKeyHash":"8b69b1e8752c05884f3356cf375b648f62110997de4bb5f60f7ee2a75153b115","pledge":{"lovelace":100000000},"cost":{"lovelace":345000000},"margin":"3/20","rewardAccount":"stake_test1upzd8a7wtfwfumdlnf95shwezqg6hpqcvuah8t372atntas9rpfa6","owners":["44d3f7ce5a5c9e6dbf9a4b485dd91011ab8418673b73ae3e575735f6"],"relays":[{"type":"hostname","hostname":"cbfr.ddns.net","port":6000}],"metadata":{"url":"https://cardanoblockchain.fr/md.json","hash":"b29d5f3120ef7dd8cfbbf7204e5c923a6a21ae821f6870abb374a7adaedb76a4"}},"pool1stkzkvxqcd0vx0trg34wjntvs94kykk3260p6lrqsp8fjn8zqf5":{"id":"pool1stkzkvxqcd0vx0trg34wjntvs94kykk3260p6lrqsp8fjn8zqf5","vrfVerificationKeyHash":"c068cab82739462b7f5c3c937105e9194e09d6aba368c3ebdef1a235bca1d450","pledge":{"lovelace":1},"cost":{"lovelace":341000000},"margin":"9/10","rewardAccount":"stake_test1upps8qhch0n9a79fms75tgtxrvutt6qzj0lktz0fa7evyssnnpavx","owners":["31888329dde5e0bf984d564311c8d1f409212227301c6e63d9a0c80b","430382f8bbe65ef8a9dc3d45a1661b38b5e80293ff6589e9efb2c242"],"relays":[],"metadata":{"url":"https://www.where_metadata_file_is_located.com","hash":"767a3a2606485fd86800173f6878b387ab908523019e2b181b48196b41114db4"}},"pool1s337lucxxrhl8tz8c3r6c4crk784xtga225w3uh2tm0w2kqf0l9":{"id":"pool1s337lucxxrhl8tz8c3r6c4crk784xtga225w3uh2tm0w2kqf0l9","vrfVerificationKeyHash":"a34e2815232397c8680656eda7bb0a7f47531715a083e68432fd18c9a03049e8","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1urp5muju83v5853rwpe7g7yt7u8la35uqpa08ym07ht7jqqymvhfn","owners":["c34df25c3c5943d2237073e4788bf70ffec69c007af3936ff5d7e900"],"relays":[{"type":"ipAddress","ipv4":"69.244.216.147","port":6000}],"metadata":{"url":"https://arcadiastakepool.com/INDGO.metadata.json","hash":"874b5cffdb3cb0720d82802bfc9b68446d858d852dd7694be43a291000fdadbe"}},"pool1sj3gnahsms73uxxu43rgwczdw596en7dtsfcqf6297vzgcedquv":{"id":"pool1sj3gnahsms73uxxu43rgwczdw596en7dtsfcqf6297vzgcedquv","vrfVerificationKeyHash":"e8c4df26e49c8f3c7a033297fffb3732f54563e89e5db9ef812380eb708a1733","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"3/100","rewardAccount":"stake_test1up5zw8rhwj7ew09ggqtzdrrlg77xq3et7627wegaylgt5fc2lvmw7","owners":["68271c7774bd973ca84016268c7f47bc60472bf695e7651d27d0ba27"],"relays":[{"type":"ipAddress","ipv4":"5.12.45.138","port":1337}],"metadata":{"url":"https://tinyurl.com/mpde34ve","hash":"cb74d28b4cacd5153c146fb2bc5eaf3428d87db172ef4e8efb63575bb8b5e316"}},"pool1s5c2wws3s0trn7agdrwfgz3knq37pule65knyxh0s0dhkdvhn3h":{"id":"pool1s5c2wws3s0trn7agdrwfgz3knq37pule65knyxh0s0dhkdvhn3h","vrfVerificationKeyHash":"e57ecb6a02223c6e8ee503c94929947462fdd2acdad2190360478274a95d6bb1","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/25","rewardAccount":"stake_test1urj7dmqqqfd6qsl8638ezh3zu7lh0cjsfc92q2uf2d2calg458h8e","owners":["e5e6ec00025ba043e7d44f915e22e7bf77e2504e0aa02b8953558efd"],"relays":[{"type":"hostname","hostname":"0c563fdf.cardano-relay.stagebison.net","port":1338}],"metadata":{"url":"https://0c563fdf.cardano-metadata.stagebison.net/metadata.json","hash":"c0719d1437e1bf09915b0dbfaae2e384d737e326f17d8f1ae82d6a40111a1035"}},"pool1sk8n2v844jgpwzvpd4eze374pfvygzcrqlld2mfzx484yrtq74l":{"id":"pool1sk8n2v844jgpwzvpd4eze374pfvygzcrqlld2mfzx484yrtq74l","vrfVerificationKeyHash":"1cbfd07a6145d0d2859c4d114f7e71cb5b9fc7e29cbfa37a393db2637241ce92","pledge":{"lovelace":9000000000},"cost":{"lovelace":400000000},"margin":"0/1","rewardAccount":"stake_test1uqza4tpx4698h0w793fjhtnqh4amhyfcftyx78h54q2wh0qgq074z","owners":["05daac26ae8a7bbdde2c532bae60bd7bbb91384ac86f1ef4a814ebbc"],"relays":[{"type":"hostname","hostname":"relay1.dynip.org","port":28000}],"metadata":{"url":"http://panyvino.com","hash":"9ac046260b09e2befc7addb05b469f90279338821285da90f5cc6e8cb4c5ab15"}},"pool13q0eh32ptwmns8wyket34dnzal6jwltc6audq4s5ehcdg9e7xvs":{"id":"pool13q0eh32ptwmns8wyket34dnzal6jwltc6audq4s5ehcdg9e7xvs","vrfVerificationKeyHash":"66cf87b05688c2872b17f57da72550758a8cd23097484f68803b8f250d9f90bc","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uq90sudgsaa0wj4z27yeeeggwpjyzh6w2kxvujffcax0llc8aqm32","owners":["0af871a8877af74aa257899ce5087064415f4e558cce4929c74cffff"],"relays":[{"type":"ipAddress","ipv4":"127.0.0.1","port":6000}],"metadata":{"url":"https://raw.githubusercontent.com/politikoz/p/master/p.json","hash":"0321dff086209d0f90a1804199e4c296e91b2bbc6fdbb596af11a51c4d1d2c4f"}},"pool13zafxlpfgymf474uv52qt557z5k5frn9p83yr55zp267wj5mpu4":{"id":"pool13zafxlpfgymf474uv52qt557z5k5frn9p83yr55zp267wj5mpu4","vrfVerificationKeyHash":"628980b886a274e43a09810a91f8a1e1d8241a8c67ddf51e78c8efff1236698a","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1ur0vznanca5kzcwmjyscudf6f38wal8qxcr4nkefdh089mg2kg7lh","owners":["dec14fb3c7696161db91218e353a4c4eeefce0360759db296dde72ed"],"relays":[{"type":"hostname","hostname":"mithril-signer-2.pre-release-preview.api.mithril.network","port":9092}],"metadata":{"url":"https://tinyurl.com/2fej7w5a","hash":"85212d92b197fa7402e0047ed2f2411cabfab4ad1ee54201f5043c0a0fcbaeca"}},"pool13rh3005usjnr7ks76llpn07p0z4dxnxzp8aj33lnncaawfp9vn6":{"id":"pool13rh3005usjnr7ks76llpn07p0z4dxnxzp8aj33lnncaawfp9vn6","vrfVerificationKeyHash":"9ab23eba9fbe7912061f4e2dbc1a4f98ea684156f2811737452506c70cf54e44","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uq5j484c9yd0v2836knjpyldgpy3havq7252xjlyhd2kt2qfcesug","owners":["292a9eb8291af628f1d5a72093ed40491bf580f2a8a34be4bb5565a8"],"relays":[{"type":"hostname","hostname":"alpha.relays.preview.mochipool.com","port":7777}],"metadata":{"url":"https://preview.mochipool.com/poolmeta.json","hash":"96e877b9c2852f47a31570794f4845c3cf9c5e2a78687129a770d2c7768efd62"}},"pool1397kpa7ylzg4lqrmj3xr28xzq2548c8lafw90qyxvucsslap03v":{"id":"pool1397kpa7ylzg4lqrmj3xr28xzq2548c8lafw90qyxvucsslap03v","vrfVerificationKeyHash":"9381a0f5511d5f033eb8b707ae620e038e6c8abca7f6d0200331cbe2c7b3cb7e","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1ur2wt3rv5sty3eh6ge9fcxapn0v4ytne06tvdvg8vlv7y8cqvs5eh","owners":["d4e5c46ca41648e6fa464a9c1ba19bd9522e797e96c6b10767d9e21f"],"relays":[{"type":"hostname","hostname":"relay1.preview.stakepool.quebec","port":4000}],"metadata":{"url":"https://qcpol.stakepool.quebec/poolMetaData.json","hash":"ca053fef4b28242ebbdec5bfe99fdcd0ce37927a281dbfd3173f09a59a7a8432"}},"pool13gsw9kvuepwhm8dfw7g2a2fwthxrwa088yq5xjaf39hqsekhqsy":{"id":"pool13gsw9kvuepwhm8dfw7g2a2fwthxrwa088yq5xjaf39hqsekhqsy","vrfVerificationKeyHash":"c1cc951ff3f672f20e31ae5bce743ebef7cf1eed6594c2842cf76d29d6d91f09","pledge":{"lovelace":1},"cost":{"lovelace":341000000},"margin":"9/10","rewardAccount":"stake_test1uqh2r3mmdwgqqzjc3fqtfgx3a02tlx6dvjs6t56aeyqnnds9xydza","owners":["2ea1c77b6b90000a588a40b4a0d1ebd4bf9b4d64a1a5d35dc90139b6","d9cabfbd20d5e0250f063fc138f1c7dc401c1a84cf418059f4b3d5fa"],"relays":[],"metadata":{"url":"https://www.where_metadata_file_is_located.com","hash":"1cc405454be71cd728d3842d30ba187d5ea3287d05056e62df4a90f87b579891"}},"pool13vuxg9gw3fftvfg56xwl5rq82nqtjhhkeacxtg0jgqlfup9qz66":{"id":"pool13vuxg9gw3fftvfg56xwl5rq82nqtjhhkeacxtg0jgqlfup9qz66","vrfVerificationKeyHash":"96fd4b5bbeedf7fb46010d970875c434fc59ceecf566d240dd88489421ae3161","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/1","rewardAccount":"stake_test1up6hq4rnpfmykas4p3f6kytpuqzn0s2p3xwcegng9ysn0egzcqrr9","owners":["757054730a764b76150c53ab1161e00537c141899d8ca268292137e5"],"relays":[{"type":"hostname","hostname":"cardano-relay.int.t-dx.com","port":3000}],"metadata":{"url":"https://adastakepool.t-dx.com/test.json","hash":"20c5dfe0fc1aa2190ec6e344523adbbce96a03edd47f0009a40dca1fe4f260cd"}},"pool1jx2uun9v45gtnlkq83xj6w4chy8rl5g78qqd026e0w89wt4vq9s":{"id":"pool1jx2uun9v45gtnlkq83xj6w4chy8rl5g78qqd026e0w89wt4vq9s","vrfVerificationKeyHash":"d9d2fae43a1c6b3efa0ee48142292e4b2a864150e8030f1fedf2115a60bd0442","pledge":{"lovelace":15000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1up4l9hjwtqjwgx3n25q76tw757lagm20f6zk3dc9wmmrjeq0c0s3k","owners":["6bf2de4e5824e41a335501ed2ddea7bfd46d4f4e8568b70576f63964"],"relays":[{"type":"hostname","hostname":"koios-preview.themorphium.io","port":6969}],"metadata":{"url":"https://bit.ly/310ytob","hash":"1f71674f2483c9cdc3c65c77a910dd432d0ae9026157584e34380fdad3a6f44b"}},"pool1jsa3rv0dqtkv2dv2rcx349yfx6rxqyvrnvdye4ps3wxyws6q95m":{"id":"pool1jsa3rv0dqtkv2dv2rcx349yfx6rxqyvrnvdye4ps3wxyws6q95m","vrfVerificationKeyHash":"4c75e85016f939ff51b56b9e676ac7b164f36bc09f68782991c000ad54ef55e5","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1upq49hkcwpayt9dfwe3sfz94t32zqypytdp4lux7fh0uhwclxwzmm","owners":["4152ded8707a4595a976630488b55c542010245b435ff0de4ddfcbbb"],"relays":[{"type":"hostname","hostname":"cardano-preview-relay-1.syn.pizza","port":30800},{"type":"hostname","hostname":"cardano-preview-relay-2.syn.pizza","port":30800},{"type":"hostname","hostname":"cardano-preview-relay-3.syn.pizza","port":30800}],"metadata":{"url":"shorturl.at/acKO0","hash":"acba1a147fbce589cf1d556097b19e441fd2506f86417db03e5cdc06395c06ab"}},"pool1j3x329u0uxh9s9vjvsad9kx37tzal8gndz6ttxumcz4nw947djw":{"id":"pool1j3x329u0uxh9s9vjvsad9kx37tzal8gndz6ttxumcz4nw947djw","vrfVerificationKeyHash":"dccaf70188440911259f798f29caec271cb561d250fcdbe56b9eb0e3a73a12f9","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1upvzzxmzr02kw529cna76e9aga4udj7x45crxx83z2zgvqgu754de","owners":["58211b621bd5675145c4fbed64bd476bc6cbc6ad303318f112848601"],"relays":[{"type":"hostname","hostname":"relay01.preview.junglestakepool.com","port":3001}],"metadata":{"url":"https://csouza.me/jp-p.json","hash":"7fdeea9ed970f2e5eb06a7a8c272c84ce2ca2f6a48ab5912b75f25346a0acbf6"}},"pool1jnakc0ghqgu0x3ayg3yyut7hmm3f46g8ssrh4hkeaqz7vtylv84":{"id":"pool1jnakc0ghqgu0x3ayg3yyut7hmm3f46g8ssrh4hkeaqz7vtylv84","vrfVerificationKeyHash":"5d6cfbf6cb00aef9009058eec7e6a2aaa4f341d8ff0862a6cc2840c308a2f8b5","pledge":{"lovelace":50000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uzd3kkuwvul6ydz869tp8fym6602y24wqww7z5qtc2a9pnst74u6p","owners":["9b1b5b8e673fa23447d15613a49bd69ea22aae039de1500bc2ba50ce"],"relays":[],"metadata":{"url":"https://foo.bat/poolmeta.json","hash":"16ccef737d542fcc0ee71f8ed13526c7d7cd76858326cdd7ca417ab93e889bbc"}},"pool1n935yzlmu7528fx4qjf2gak0cdv2nune9cku730zg7vh707rnnd":{"id":"pool1n935yzlmu7528fx4qjf2gak0cdv2nune9cku730zg7vh707rnnd","vrfVerificationKeyHash":"829ee2ddb2984b5e23c93a8b67a7b7aa7af02da2340177ae386d54d8c7ad42ee","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/40","rewardAccount":"stake_test1uzflds3zydwqeqk28qy97zwwum7v862vm0uh4ll6uxkxrts92gtm7","owners":["93f6c222235c0c82ca38085f09cee6fcc3e94cdbf97afffae1ac61ae"],"relays":[{"type":"hostname","hostname":"pv-relays.digitalfortress.online","port":8001}],"metadata":{"url":"https://digitalfortress.online/digi3-pv.json","hash":"6588af1eb497556ea55193a3e0cc15686b95ac38695d42417ccc696063e8b21b"}},"pool1ntts25w3wvt7gjrxs58esflkge8ssel9p0l44pa3l83uqvsp5h5":{"id":"pool1ntts25w3wvt7gjrxs58esflkge8ssel9p0l44pa3l83uqvsp5h5","vrfVerificationKeyHash":"891823d960e31bb9f1fbd8c64b28771c917f46fbdc036ed29bbbef5005e780bb","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzklqrm9xmagw0t7r63mf8ce8x26yawrqcr6ux5r3x9ve5crp8sha","owners":["adf00f6536fa873d7e1ea3b49f193995a275c30607ae1a83898accd3"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSNF","hash":"8ed31aa584c62fe11967425b6596144ca7822128031d374fcc1a43e662c914f4"}},"pool1n5aacu3chuvxkm7p2mwcpdvnmkkkvpsje6mclnwj59c6x3wpghh":{"id":"pool1n5aacu3chuvxkm7p2mwcpdvnmkkkvpsje6mclnwj59c6x3wpghh","vrfVerificationKeyHash":"bad28ede267da0d5dc61af65cfa17285257d81ac106b74bd77f507a5b161498f","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/1","rewardAccount":"stake_test1upx0n32j5cne3p0n4pervdjy43j7222h656vgl2uksrxe6gxujj3l","owners":["4cf9c552a6279885f3a872363644ac65e52957d534c47d5cb4066ce9"],"relays":[{"type":"hostname","hostname":"cardano-relay.int.t-dx.com","port":3000}],"metadata":{"url":"https://bit.ly/3O7yle2","hash":"2ad5e7a64a28105e386ec12ad29c3bb6b8a28d07d69da93f11a0c99cc2f737e2"}},"pool1nk3uj4fdd6d42tx26y537xaejd76u6xyrn0ql8sr4r9tullk84y":{"id":"pool1nk3uj4fdd6d42tx26y537xaejd76u6xyrn0ql8sr4r9tullk84y","vrfVerificationKeyHash":"590be0c42cae1fa7e93ab166343a29c83237f297f6c10ea35e5c5e6cd2eb32fa","pledge":{"lovelace":1112000000},"cost":{"lovelace":413000000},"margin":"1/50","rewardAccount":"stake_test1ur9h9qtr739mhuypqmhfxvzux3g9h0tksew8w6ravaj3t8qacq6d9","owners":["c9dc49a676087ba0fb1ab1f28b209e647b4139626d732455bb7d5582","cb728163f44bbbf08106ee93305c34505bbd76865c77687d6765159c","f4cceaa5fff7b592e39519942ea8c3b823f3fee622bb3c81a5f5150f"],"relays":[{"type":"hostname","hostname":"us.netspectrum.com","port":13001}],"metadata":{"url":"http://us.netspectrum.com:13002/pool-meta-data.json","hash":"6e31d534b0d8bdde4ce9bd04ac8d7a6906b680304a3150400304c46f0f393af5"}},"pool1n6tcrkjjn7dr70e4vjmtayswl2rne947fue7w2htthaq6men4yp":{"id":"pool1n6tcrkjjn7dr70e4vjmtayswl2rne947fue7w2htthaq6men4yp","vrfVerificationKeyHash":"9792680b674d04b392cb637a223d327d7af568ef358080cea4d2e10790040f08","pledge":{"lovelace":14000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uq9f3jgmfywhgcmhtd0mv7m3qwp22ah08sd3x8s4ljylpxghkf2yx","owners":["0a98c91b491d7463775b5fb67b710382a576ef3c1b131e15fc89f099"],"relays":[{"type":"hostname","hostname":"preview.blockchainbill.lol","port":3003}],"metadata":{"url":"https://preview.blockchainbill.lol/SNSOB.metadata.json","hash":"4792d9a653baab097047724e97896697c4d1f04accd9e9d126f1786102f1e2d4"}},"pool15qlyejqxu99n2p3980wtwmne4ykzd9vn4mz7ldtncepnuh6rqeh":{"id":"pool15qlyejqxu99n2p3980wtwmne4ykzd9vn4mz7ldtncepnuh6rqeh","vrfVerificationKeyHash":"94ac627b9db9da8d083bd83a6e1e902788566b4db5ba691f5c7f12ef717ed1bf","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1urdj5j3jtsj9lsf6xdz27dzxfw92ezj34v5d0qhcrx4ztysksexxe","owners":["db2a4a325c245fc13a3344af34464b8aac8a51ab28d782f819aa2592"],"relays":[{"type":"hostname","hostname":"topo-test.topopool.com","port":3010}],"metadata":{"url":"https://cardanostakehouse.com/be39feb0-5cba-4552-a044-68f.json","hash":"54920331d130d8949bff1fd6b3f01bc693de7d36de32fc9a29ea2ef60a65da71"}},"pool15zu40d05gy43gyyxy7svumkxyac9qy6shlpdrgyz5gh8g48qaaj":{"id":"pool15zu40d05gy43gyyxy7svumkxyac9qy6shlpdrgyz5gh8g48qaaj","vrfVerificationKeyHash":"3b18c66658a5d9dd1a2bd876f1e0b076451641c41017017ccc6b448bcf38c529","pledge":{"lovelace":70000000000},"cost":{"lovelace":4321000000},"margin":"1/25","rewardAccount":"stake_test1uqz0vs8vnxqpdcuey0qcvufn95gydj6x5g37wgy975wlfwgdhyuk4","owners":["04f640ec998016e39923c18671332d1046cb46a223e72085f51df4b9"],"relays":[{"type":"ipAddress","ipv4":"184.73.135.122","port":3002}],"metadata":{"url":"bit.ly/3Eh3p7A","hash":"9b9d00fcec79d306e3dffcc6865d4088f35b13c268e32c7a2fabb1845947f9c7"}},"pool15rneqfpzde87huszzstymzxu6f5u2jqelsaczr99e3z62dywau7":{"id":"pool15rneqfpzde87huszzstymzxu6f5u2jqelsaczr99e3z62dywau7","vrfVerificationKeyHash":"74838ee89acb2caf072cd50705f0dd0a958af9cb20ec70500ee3c2c2e800b316","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1urx0fs8j3lqfkjtmuzd64futqtucqkmlj32ufgza2xhhutgmx79n2","owners":["ccf4c0f28fc09b497be09baaa78b02f9805b7f9455c4a05d51af7e2d"],"relays":[{"type":"hostname","hostname":"gateway.adavault.com","port":4061}],"metadata":{"url":"https://adavault.com/advpreview.json","hash":"336a78f742447c0af780583059167eff24a4268dad3947373397f5ccfe6a883e"}},"pool1580a362kwnqt7v2lgun5t02u0r7dyl70x9nsy37zj46xkq8mp22":{"id":"pool1580a362kwnqt7v2lgun5t02u0r7dyl70x9nsy37zj46xkq8mp22","vrfVerificationKeyHash":"69f0a026835764345061abdd6d566ae509c1cdfa630999cdc57b5e43a6d6c6f7","pledge":{"lovelace":2000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uqnxa67e6jc4dr89kdkr0e6ucvvzucd772p9vnalrr7h0xskjsgeg","owners":["266eebd9d4b1568ce5b36c37e75cc3182e61bef282564fbf18fd779a"],"relays":[{"type":"hostname","hostname":"s2.lost-in.tech","port":3001}],"metadata":{"url":"https://cardano.lost-in.tech/LIT-Pool.metadata.json","hash":"5e30e12a869cf6f5b8c8fd2d74cccd7e0825b37719a978914877b56e50e82bf9"}},"pool152x6q0ly050yr7cnatwq0087jzwyxxlkyuch6s4xex8ljaeu0ng":{"id":"pool152x6q0ly050yr7cnatwq0087jzwyxxlkyuch6s4xex8ljaeu0ng","vrfVerificationKeyHash":"c4b14fc6e1e4a632f51e245990b0d9a75096f26ad22930df52ac06ad2dc06149","pledge":{"lovelace":5000000000},"cost":{"lovelace":170000000},"margin":"1/20","rewardAccount":"stake_test1urc970azyxew8lf0s0wdw8z5pckjxcdn63v7575v4upprks6h5yys","owners":["f05f3fa221b2e3fd2f83dcd71c540e2d2361b3d459ea7a8caf0211da"],"relays":[{"type":"hostname","hostname":"testnet-relay.xstakepool.com","port":3001}],"metadata":{"url":"https://xstakepool.com/testnet-xstakepool.json","hash":"25d14c92cd852bbe666858ba040db7d5dd0767838e604e16c12b8fb842cf89ec"}},"pool15jqsjphnxg7hcx2rvd0ryhg5xwshg7xktthj3zf70nmxx9ffjet":{"id":"pool15jqsjphnxg7hcx2rvd0ryhg5xwshg7xktthj3zf70nmxx9ffjet","vrfVerificationKeyHash":"35cf12acb20ade24b4a1b09b8b033299e0551a556519b42ca47f32511e64531e","pledge":{"lovelace":9369000000},"cost":{"lovelace":369000000},"margin":"9369/10000","rewardAccount":"stake_test1uz7ne2udchys5e3kjfzpjj2f84v63csfhhpluz80kfwegpqawzmqc","owners":["bd3cab8dc5c90a663692441949493d59a8e209bdc3fe08efb25d9404"],"relays":[{"type":"hostname","hostname":"testicles.kiwipool.org","port":9720}],"metadata":{"url":"https://bit.ly/3R870ZK","hash":"19dcf5a17af5475da21aae1046a1bdae92ebac5e06e93e8c9a41b7a844fc6af8"}},"pool15j50kmtrmy3mxm0e5dej5vka9keapqtm3gv2zq96lqgjqc6sdh3":{"id":"pool15j50kmtrmy3mxm0e5dej5vka9keapqtm3gv2zq96lqgjqc6sdh3","vrfVerificationKeyHash":"e5ae4cca1fc629ef51b88e6224dddc93d9b87eabfeee18cfc90fd7b35e396dc3","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzjqrwex060z6w0f3j87sz6cehvmw2h5hk3szz0kyth9f7sd977ss","owners":["a401bb267e9e2d39e98c8fe80b58cdd9b72af4bda30109f622ee54fa"],"relays":[],"metadata":{"url":"https://pastebin.com/raw/xDxT4v5n","hash":"da9773e26d50eea8283a80ff5b0549c28ff2ec4d64015e7532b5acc22f0c57ee"}},"pool15e04rzx0lu7hryn68l5n8n6nd9yum4rn48j64kupadc4qalulgk":{"id":"pool15e04rzx0lu7hryn68l5n8n6nd9yum4rn48j64kupadc4qalulgk","vrfVerificationKeyHash":"678c83627cbe1378f39d12b5c7bdd27a2e90358a7b80fa0cece79e39139f08b2","pledge":{"lovelace":1000000000},"cost":{"lovelace":444000000},"margin":"1/100","rewardAccount":"stake_test1up28m49ylffdnc8fwty0d5waau8udzuzv6uh0e6m0n2n5lgactsc7","owners":["547dd4a4fa52d9e0e972c8f6d1ddef0fc68b8266b977e75b7cd53a7d"],"relays":[{"type":"hostname","hostname":"ava1.sytes.net","port":6031}],"metadata":{"url":"https://avacsp.com/metadata/ava-preview-MetaData.json","hash":"c0db5e94c1dbe73a6abd0f837b8165d06709e7c02ef02ca2d7400e04ae972db5"}},"pool15ecfwjfqcc35gvpqrmut0g5hr7e0u794ywkxg5tk8rl2q4zqu9j":{"id":"pool15ecfwjfqcc35gvpqrmut0g5hr7e0u794ywkxg5tk8rl2q4zqu9j","vrfVerificationKeyHash":"c85155a3402b3d36b205b7657eb1c787f7ea9c5ed02003a39c08ebb2530453bd","pledge":{"lovelace":10000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uz5h6parv7gfk7hk3kgna07svwq5qaumrfut437965r0p4gt650jf","owners":["a97d07a367909b7af68d913ebfd0638140779b1a78bac7c5d506f0d5"],"relays":[{"type":"ipAddress","ipv4":"185.2.100.31","port":6000}],"metadata":{"url":"https://me2.do/5QGindar","hash":"13ff652f003ffde0d19c92450f89b19b056f7976f758b3e1e4f95e5ec58f10eb"}},"pool14rn9dq87dgj2z8g3lp4n0a78fewxff3gkgjkmz72ew44ym79xpp":{"id":"pool14rn9dq87dgj2z8g3lp4n0a78fewxff3gkgjkmz72ew44ym79xpp","vrfVerificationKeyHash":"3e583b72203f1659bb73653baf0e2d7850d238d4c96435eff4331060bf926801","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uz7xx6hy2xnnrmz0av0xl7qn9vdkhage7myf0nd49e7mvcg6z0smn","owners":["bc636ae451a731ec4feb1e6ff8132b1b6bf519f6c897cdb52e7db661"],"relays":[{"type":"hostname","hostname":"f7ca89d1.cardano-relay.stagebison.net","port":1338}],"metadata":{"url":"https://f7ca89d1.cardano-metadata.stagebison.net/metadata.json","hash":"c0719d1437e1bf09915b0dbfaae2e384d737e326f17d8f1ae82d6a40111a1035"}},"pool14fdr8cpz0qpgzkrucu2q7hst2pa3u5ssfej7kuepdq4v7lkyxg3":{"id":"pool14fdr8cpz0qpgzkrucu2q7hst2pa3u5ssfej7kuepdq4v7lkyxg3","vrfVerificationKeyHash":"896bac573601caf048566f3562e99be9c742832ad7e4527b5b1cdc330e9384c1","pledge":{"lovelace":30000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqr9uznkqeuv6e7ez79yf8us678xus3y6ac0su9d253r0eg5l4clt","owners":["065e0a760678cd67d9178a449f90d78e6e4224d770f870ad552237e5"],"relays":[{"type":"ipAddress","ipv4":"75.119.130.108","port":6000}],"metadata":{"url":"https://hamster-stake-pool.de/preview_poolmeta.json","hash":"81813b6eb7904fb8533aa51f9aebc16f14e6ade80576078b83a8b307ace6b987"}},"pool140axp85wjr7qhwtf5y9utlht6eq42n4sl8wjh6fmlu02gel0aqg":{"id":"pool140axp85wjr7qhwtf5y9utlht6eq42n4sl8wjh6fmlu02gel0aqg","vrfVerificationKeyHash":"9b0cdfd880b67152d7b808ee37f33c0e9181ebda8ecab369b239fdbfdf3ecaad","pledge":{"lovelace":45000000000},"cost":{"lovelace":170000000},"margin":"1/1","rewardAccount":"stake_test1uzyvlggps4p4c0aejtr4qqxywwp9gg9xk6f9u49s7tzcdmqstww5s","owners":["88cfa10185435c3fb992c75000c473825420a6b6925e54b0f2c586ec"],"relays":[{"type":"hostname","hostname":"adrelay.hawak.cloud","port":6000}],"metadata":{"url":"https://tinyurl.com/hawakpool","hash":"f06c26e560a1395007149ef13dc7301348a77f43f67ce9f504f0be571cc59e6e"}},"pool14cwzrv0mtr68kp44t9fn5wplk9ku20g6rv98sxggd3azg60qukm":{"id":"pool14cwzrv0mtr68kp44t9fn5wplk9ku20g6rv98sxggd3azg60qukm","vrfVerificationKeyHash":"b8b2e69a0b590af68cbf1411aad7c93c1b48346047551461ec2a2ccf9dc182d6","pledge":{"lovelace":8000000000},"cost":{"lovelace":340000000},"margin":"1/1","rewardAccount":"stake_test17r76qtu38a29387whc40a5e6da3xqrkkf87sf78kjgggals8xt5hy","owners":["69c9b2655d27e06722905f4ae9e356a18886340964baa472f29d8586"],"relays":[{"type":"hostname","hostname":"preview-node.pool.milkomeda.com","port":3001}],"metadata":{"url":"https://is.gd/Ikn7kl","hash":"8fc709584d2f7d859a902539fc28e8c9a7f6d046b8c8d89a793aad1594fbdfc2"}},"pool14u22dyym8k2g2twvgct86njg3m9cc7j2fc74yamy6672s6up7a0":{"id":"pool14u22dyym8k2g2twvgct86njg3m9cc7j2fc74yamy6672s6up7a0","vrfVerificationKeyHash":"600f54b88675a354a87bea473ac776fb2684254d55431585904b89b71ef74620","pledge":{"lovelace":200000000000},"cost":{"lovelace":170000000},"margin":"0/1","rewardAccount":"stake_test1uzpck3ssxf3cw5mxs8umex3stuf4pk5m9qyfp57ymrkc3fg0mmtsj","owners":["838b4610326387536681f9bc9a305f1350da9b280890d3c4d8ed88a5","f999c5ee8ec8de584be7f07150c00a841c8b0be6ca6acb56c2c31c43"],"relays":[{"type":"hostname","hostname":"preview.leadstakepool.com","port":3001},{"type":"hostname","hostname":"preview.leadstakepool.com","port":3002}],"metadata":{"url":"https://raw.githubusercontent.com/lead-pool/l/master/p.json","hash":"91a080cf2aa797c24efe5b26330a634209ec152a0f079ffc0b31157a6f4a6993"}},"pool14lfkzjvlp2prlwt0ykxceemhdd4ej9rc0em4xt4cnpvt2fmtg9v":{"id":"pool14lfkzjvlp2prlwt0ykxceemhdd4ej9rc0em4xt4cnpvt2fmtg9v","vrfVerificationKeyHash":"71762169bc3dfc516e39854f78e572f24d5a7ab85d42a55c1bfd4e86e0b531a7","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"19/1000","rewardAccount":"stake_test1uperlgjrwsqv0gluun7xk670lnevmlc9v3m0zxjx76p7z3q95gj3k","owners":["723fa2437400c7a3fce4fc6b6bcffcf2cdff056476f11a46f683e144"],"relays":[{"type":"ipAddress","ipv4":"184.174.32.106","port":6002}],"metadata":{"url":"https://mladenlm.github.io/poolMetadata.json","hash":"30c5b5372462def97e466b84ff8179ab80dc4deac67b61981e9db947915c8558"}},"pool1krjtqew2jg203nvnec39vt77leqyfsc8e42u4ywx534t62h9fth":{"id":"pool1krjtqew2jg203nvnec39vt77leqyfsc8e42u4ywx534t62h9fth","vrfVerificationKeyHash":"3a238800d748179b955445d9c2488125785f1e271e8d43449e292d5a7c4b7b71","pledge":{"lovelace":1000000},"cost":{"lovelace":200000000},"margin":"1/2","rewardAccount":"stake_test1upxs40dqlfrh4gkd7djhwr5qlq225c3etv66f8m0mgsahxgk45c6j","owners":["4d0abda0fa477aa2cdf365770e80f814aa62395b35a49f6fda21db99"],"relays":[{"type":"ipAddress","ipv4":"212.24.98.109","port":5333}],"metadata":{"url":"https://adawallet.io/public_files/MDS_ST_meta_v2.json","hash":"ef3aca5a37d0bc4d81c4f85da513e3565be372e9bc3ecdf6fe5cb1a5bb55bff2"}},"pool1kfzv75la3rfgrh3uly7dt5syqxf0r2n2khr7s6ylhjmnkkdfwye":{"id":"pool1kfzv75la3rfgrh3uly7dt5syqxf0r2n2khr7s6ylhjmnkkdfwye","vrfVerificationKeyHash":"0b9f2a9f73eb7d35054626b561f9b4d4d4d5040a547c0cc2beffe50829b36c93","pledge":{"lovelace":1000000000},"cost":{"lovelace":345000000},"margin":"3/25","rewardAccount":"stake_test1urgqett9quhpsjm4cygp3uf7u63tz5gzx4czf5t965xejegd67zc0","owners":["d00cad65072e184b75c11018f13ee6a2b15102357024d165d50d9965"],"relays":[{"type":"hostname","hostname":"xsecpreview.infra.getlenses.co.uk","port":3000}],"metadata":{"url":"https://tinyurl.com/bdfmuct6","hash":"afb2956e054911e178c9d5556e560155e2f663022112bc476820348d1006eb32"}},"pool1k4rdvvuhy7h927psyew9syupwddy77t4j8lc74hpgzpvv7yklwg":{"id":"pool1k4rdvvuhy7h927psyew9syupwddy77t4j8lc74hpgzpvv7yklwg","vrfVerificationKeyHash":"ff8d88fd6b39985c9ddbef0363f87ec0ae32016c62a305e2497e4b54cb161d52","pledge":{"lovelace":6000000000},"cost":{"lovelace":340000000},"margin":"3/40","rewardAccount":"stake_test1uqw2h3092ka5mctav6d07cwumxagvcm9zs2aj9g2m4n74cgcf5r9x","owners":["1cabc5e555bb4de17d669aff61dcd9ba8663651415d9150add67eae1"],"relays":[{"type":"hostname","hostname":"preview-test.ahlnet.nu","port":2102}],"metadata":{"url":"https://ahlnet.nu/pool/preview-meta.json","hash":"8f52b4840726c157c50c1b972fadb21b2f0c852e99004a48e649319218960c55"}},"pool1kkhr6m0syfgqamr3klzhj2trjd3q4vyg8trzdjxdp64nqzshwea":{"id":"pool1kkhr6m0syfgqamr3klzhj2trjd3q4vyg8trzdjxdp64nqzshwea","vrfVerificationKeyHash":"b4ea03eb58cbfa9059e0b8478f09762f002e4cebc9aae7bf6de04b9ccebb9d94","pledge":{"lovelace":100000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uzx366cdgqv9lg69y7ufw59af3y7yh9jxflnym8z8qz3pfgmef2r8","owners":["8d1d6b0d40185fa34527b89750bd4c49e25cb2327f326ce2380510a5"],"relays":[{"type":"hostname","hostname":"preview.adanorthpool.com","port":9613}],"metadata":{"url":"https://www.adanorthpool.com/ANPPREVIEW.metadata.json","hash":"e4f9a2cf26e72b93955893bbcae4a37c27c061b04ab2a8d79856350e6dc3fb26"}},"pool1kewhspt8fsxk9kx6pw2nukcrs940dkwcwh89llj233ahghexeum":{"id":"pool1kewhspt8fsxk9kx6pw2nukcrs940dkwcwh89llj233ahghexeum","vrfVerificationKeyHash":"9d009cac22c72b8200e473c71330cc5907832880a2098c1fea0affb68df5f52f","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uptdhvz442mcem2lqd3y23nlypudpdm7d32aeyn3y72d8tcs7scmy","owners":["56dbb055aab78ced5f036245467f2078d0b77e6c55dc92712794d3af","b0348c669fe3cb7446b5084a669e304dd1cff63762352e8355e14482"],"relays":[{"type":"hostname","hostname":"605691fa.cardano-relay.stagebison.net","port":1338}],"metadata":{"url":"https://605691fa.cardano-metadata.stagebison.net/metadata.json","hash":"c0719d1437e1bf09915b0dbfaae2e384d737e326f17d8f1ae82d6a40111a1035"}},"pool1hykgd0kw0n6vx08j8vcyu7q0q6rqkwxr7cql03vf2at9kdmlxpy":{"id":"pool1hykgd0kw0n6vx08j8vcyu7q0q6rqkwxr7cql03vf2at9kdmlxpy","vrfVerificationKeyHash":"c636a7c8aa43ee105919d24a62f0d80bdc3981de0951672e7a316cc9a0f57b74","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uz5sce2cv9kkykjqhakrvma65xhlyzt3p7n4aamexkg0jtcf54jnu","owners":["a90c6558616d625a40bf6c366fbaa1aff209710fa75ef7793590f92f"],"relays":[{"type":"hostname","hostname":"node.armadacardano.io","port":6000},{"type":"hostname","hostname":"node2.armadacardano.io","port":6000}],"metadata":{"url":"https://armadacardano.io/metadata.json","hash":"45ce75ec2304fce3afb1a8c11316cedc5a20aea417b58ca59f6ad97ea4518112"}},"pool1h2wx7wnf079jfz6vyzs9jnjczme2nlufryyw68e2fhe2x0swk3e":{"id":"pool1h2wx7wnf079jfz6vyzs9jnjczme2nlufryyw68e2fhe2x0swk3e","vrfVerificationKeyHash":"d9a1ba9598e9613974ce89526c30d70bc9763af61b86d5e28638ecfc88e837ce","pledge":{"lovelace":45000000000},"cost":{"lovelace":340000000},"margin":"1/500","rewardAccount":"stake_test1upam5e8xunaktc2qwwq3aa6wumkya75x68ce32a0dkfh60qyxhst8","owners":["7bba64e6e4fb65e14073811ef74ee6ec4efa86d1f198abaf6d937d3c"],"relays":[{"type":"ipAddress","ipv4":"159.138.55.134","port":3001},{"type":"ipAddress","ipv4":"192.168.0.105","port":3001}],"metadata":{"url":"https://raw.githubusercontent.com/mj83263/test/main/tp2.json","hash":"5ff4cd6df6afda00a70f9480b72acaa0e2271371c2e6daf89e7c53ef6192ec90"}},"pool1htdmnme5s6d824trqq33czlm82f473w04h4xghprzaj3cff53mp":{"id":"pool1htdmnme5s6d824trqq33czlm82f473w04h4xghprzaj3cff53mp","vrfVerificationKeyHash":"98a662ae890d7c2d48b8bf5fb55602c20a04d59e499d0446586189680d039a9f","pledge":{"lovelace":8000000000},"cost":{"lovelace":340000000},"margin":"1/200","rewardAccount":"stake_test1uzsapk9c9x5frdk99wqktd6udusxhe6u0qnaryxmg4cqe9clhncf4","owners":["a1d0d8b829a891b6c52b8165b75c6f206be75c7827d190db45700c97"],"relays":[{"type":"hostname","hostname":"relaynode25t.irfada.co","port":6000},{"type":"hostname","hostname":"relaynode26t.irfada.co","port":6000}],"metadata":{"url":"https://tinyurl.com/munhhxv9","hash":"dfe61ced98cfa2fd81658686ea824910f3e6a5306c89bf1bc362f54e2000927c"}},"pool1hs2ah9q0kjy8rx7rf7qdavhmxznnesfctlu8lkqzukfdsp9kfcp":{"id":"pool1hs2ah9q0kjy8rx7rf7qdavhmxznnesfctlu8lkqzukfdsp9kfcp","vrfVerificationKeyHash":"9cd4eab04ea0073076b33c6501787d932edd031f49daa0c0fdecc4774a2ef977","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uzuahv2t7qhvgshhsnj47xhmh32n6hhpgjk5e296kwyr8lq5fvd5s","owners":["b9dbb14bf02ec442f784e55f1afbbc553d5ee144ad4ca8bab38833fc"],"relays":[{"type":"hostname","hostname":"c-pv-rn01.liv.io","port":30002},{"type":"hostname","hostname":"c-pv-rn02.liv.io","port":30002}],"metadata":{"url":"https://liv.io/poolMetaData.json","hash":"66309fa9a6726eaf1ede2bd73b1ffe02dcbc0f966730221b0cbc71702bb1742a"}},"pool1h7c2jq3pmvn3f8jht4ulhgha3h60k6syu3rw6pmkfrhqs9j7m0l":{"id":"pool1h7c2jq3pmvn3f8jht4ulhgha3h60k6syu3rw6pmkfrhqs9j7m0l","vrfVerificationKeyHash":"941c6ac6afb53de451e95ec203d6093ce6c8ef0fd58e8a78e406ac3bb668c796","pledge":{"lovelace":1000000000000},"cost":{"lovelace":340000000},"margin":"1/25","rewardAccount":"stake_test1uqkn6dhxl7mg542afm858jxudl7cwd9f0gys3qkuh3al5eq5zzhss","owners":["2d3d36e6ffb68a555d4ecf43c8dc6ffd8734a97a090882dcbc7bfa64"],"relays":[{"type":"hostname","hostname":"relay.test.lidonation.com","port":3010}],"metadata":{"url":"https://test.lidonation.com/metadata.json","hash":"edc82ecfb1cabeb15cb122bd6a65b6de6006e2201617e3c8dfdf8cc652baacfe"}},"pool1hlgaznlja8jau6wg3u4curvs7ng6yhxaxa2urp7qylxkc2e4pjk":{"id":"pool1hlgaznlja8jau6wg3u4curvs7ng6yhxaxa2urp7qylxkc2e4pjk","vrfVerificationKeyHash":"f727fdc0e656c1faea14c812b9cf7648795f5b606f6428f6e8dd68d0f729514d","pledge":{"lovelace":4000000000},"cost":{"lovelace":340000000},"margin":"3/200","rewardAccount":"stake_test1uzpp6e09x70k4wu4ccwujgwfdjwluf4nzyekkaa2l0dlgjq07ax2w","owners":["821d65e5379f6abb95c61dc921c96c9dfe26b311336b77aafbdbf448"],"relays":[{"type":"ipAddress","ipv4":"51.255.82.47","port":6000}],"metadata":{"url":"http://config.ada-staking.fr/metadatas_preview.json","hash":"86fd4e3118fe835008a699f339ec111ac35682de1d449b15255544b1570b601f"}},"pool1cyqx4ecp36gkca407ml2hf9pqauz3d3qchkpxndlnvqp60j2339":{"id":"pool1cyqx4ecp36gkca407ml2hf9pqauz3d3qchkpxndlnvqp60j2339","vrfVerificationKeyHash":"1764a62306c3f165ab2a890709c9b5c17559cfbadf77923948d3dc8fa41bcdf6","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1up0me0jesha4wvnnn5j28tdkdqpk0ufdwa8fk9wdl4q9kts8rpqh9","owners":["5fbcbe5985fb5732739d24a3adb6680367f12d774e9b15cdfd405b2e"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSNG","hash":"de0fcdf1da51661d27fbf97ce6e78d71a038e5582e90659eb216c19d66738cfa"}},"pool1cf88r4wgq4m2pa7phq6hevg798n0gfkteeq52vcvum8hc5czxas":{"id":"pool1cf88r4wgq4m2pa7phq6hevg798n0gfkteeq52vcvum8hc5czxas","vrfVerificationKeyHash":"fc012f1cd6346ba64f1faed6ad9676769d1cb12c46901c8b2c12f6bb71d90aed","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1up536agqy6nr5u0gpddwjlx5m2r9sevhd4nwp5su8ktg4wqlrp2vc","owners":["691d750026a63a71e80b5ae97cd4da865865976d66e0d21c3d968ab8"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/RSPO3","hash":"07945a19eb6413ce7b8523495d7670c3d2b6ce90f75a54c023845a87fdde2fb3"}},"pool1cv9fr477zeznqrk8uxa5hh72tsjukkuqtnet7wgyxx3rq700kl5":{"id":"pool1cv9fr477zeznqrk8uxa5hh72tsjukkuqtnet7wgyxx3rq700kl5","vrfVerificationKeyHash":"b1ab6692d0af93c5e61e99f4ba39a5a10352b729fe370145e35e5eb39bc53b13","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1upv2favfz6vqs782yg9kc8sxdely9g3dqd4w4v492jw6hvcypj9hu","owners":["58a4f58916980878ea220b6c1e066e7e42a22d036aeab2a5549dabb3"],"relays":[{"type":"hostname","hostname":"previewrelay.stakepoolcentral.com","port":15654}],"metadata":{"url":"https://bi-preview.stakepoolcentral.com/CENT.preview.json","hash":"fb6a7bdf6c6827d16c33b1173cb436897cdad7a3fe399c01813797180fe97db3"}},"pool1cwsvslzd5y2rp9qt6ne6hhrwdxuweupdfy243erke3euytp7j5m":{"id":"pool1cwsvslzd5y2rp9qt6ne6hhrwdxuweupdfy243erke3euytp7j5m","vrfVerificationKeyHash":"654ed6220e9cc5fd5ceb71f1bc1b4cf34e1826eea3261ba595cc290e9469a79f","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"1/1","rewardAccount":"stake_test1urk948umhqw2z6c95r0dhdr62898urgf46y2plpzre2fe7qzntp6f","owners":["ec5a9f9bb81ca16b05a0dedbb47a51ca7e0d09ae88a0fc221e549cf8"],"relays":[{"type":"hostname","hostname":"preview.relays.liqwid.finance","port":3001}],"metadata":{"url":"https://lqwdpool.s3.amazonaws.com/metadata","hash":"9af8ffcc01e792191a220e45b1342178ccd65ac6ce721ee3c37c3614ce18c2a4"}},"pool1ceact5c2pt4ynn5nwv2rqm04krzsm4jd26r468mdqannv5crxd6":{"id":"pool1ceact5c2pt4ynn5nwv2rqm04krzsm4jd26r468mdqannv5crxd6","vrfVerificationKeyHash":"c2075042ece1ad9b41000c53598349ec2735c649f456f3836901ade5b31eca10","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uq0r8cvtjnz8y0kw4x09rv3fk8gev98gp5fg28u0zk0kaqgwxl5eq","owners":["1e33e18b94c4723ecea99e51b229b1d19614e80d12851f8f159f6e81"],"relays":[{"type":"hostname","hostname":"9caee114.cardano-relay.stagebison.net","port":1338}],"metadata":{"url":"https://9caee114.cardano-metadata.stagebison.net/metadata.json","hash":"985e4efc3b6a10c375968c1de0a138fc75bd357d3e1ffa581aafbd96a43d37a5"}},"pool1cuxthc4lyescly7lq4tgvf72td75l2hrm8zmks2qnmffkqvpsyn":{"id":"pool1cuxthc4lyescly7lq4tgvf72td75l2hrm8zmks2qnmffkqvpsyn","vrfVerificationKeyHash":"46b2dca70839f8515b2d65cb7abe6c251aef8f0221025dc30c4b63af7bf355e3","pledge":{"lovelace":50000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1upedrdplfruuaplyaet524e4x6nxus2z3hss8gnwep62eqqsq4mym","owners":["72d1b43f48f9ce87e4ee5745573536a66e41428de103a26ec874ac80"],"relays":[{"type":"hostname","hostname":"172.30.100.12","port":6000},{"type":"hostname","hostname":"172.30.100.10","port":6000}],"metadata":{"url":"https://tinyurl.com/DVJMDG","hash":"56949b92b173ecdc5852d9fe5946411f384a1ef1659a26840f4467ffd1a62fb0"}},"pool1epeq86e8vuuar86kk9hgtn6ty3yzcjun5nrm2xyysfl07fsrwc4":{"id":"pool1epeq86e8vuuar86kk9hgtn6ty3yzcjun5nrm2xyysfl07fsrwc4","vrfVerificationKeyHash":"09f8f0bcd8dba98f8d0d5cf76624610eda099fcfd813df66b43ce23a3be7e35f","pledge":{"lovelace":9000000},"cost":{"lovelace":340000000},"margin":"9/100","rewardAccount":"stake_test1uza6wgdaec5kulpd5ft2xtchcfhgry6te8az8h5r2xzp7kgxc3hvp","owners":["bba721bdce296e7c2da256a32f17c26e81934bc9fa23de8351841f59"],"relays":[{"type":"ipAddress","ipv4":"127.0.0.1","port":80}],"metadata":{"url":"https://foo.bat/poolmeta.json","hash":"47fa1c955765325622a3d1bcff79d78ce719a8823ee3169998348cf585edc469"}},"pool1ez9khv2gx82mqrnj0qenr47dy8grecm8qkkrtnn69wzzwkvc9l6":{"id":"pool1ez9khv2gx82mqrnj0qenr47dy8grecm8qkkrtnn69wzzwkvc9l6","vrfVerificationKeyHash":"30ff40541e2c155acfcdfa844069e705dee1ae8eef9bdcde22de465de6fa8fdd","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"3/20","rewardAccount":"stake_test1up3pxcv3etz7d8h5e6csly3yggnmnwrgqrvhhjsqak7828ck4ytys","owners":["62136191cac5e69ef4ceb10f92244227b9b86800d97bca00edbc751f"],"relays":[{"type":"hostname","hostname":"c-pv-rn01.liv.io","port":30002},{"type":"hostname","hostname":"c-pv-rn02.liv.io","port":30002}],"metadata":{"url":"https://liv.io/poolMetaData.json","hash":"66309fa9a6726eaf1ede2bd73b1ffe02dcbc0f966730221b0cbc71702bb1742a"}},"pool1erufgazt3scqvjvsqv7ehayfscj93llzu3e6lknh2m6d5xcfjdr":{"id":"pool1erufgazt3scqvjvsqv7ehayfscj93llzu3e6lknh2m6d5xcfjdr","vrfVerificationKeyHash":"ee04d2c090ad7cfb572b32776eb694f336b2e26048a0423de1d66241deadeac8","pledge":{"lovelace":19000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqevz4f8d5z9pv7jx8rtlvxascwqx7v6ygrmf4kj2vta43q7kjpzk","owners":["32c155276d0450b3d231c6bfb0dd861c03799a2207b4d6d25317dac4"],"relays":[{"type":"hostname","hostname":"preview-testnet-relay.cardanistas.io","port":3001}],"metadata":{"url":"https://stakepool.page.link/cards-preview-testnet-metadata","hash":"ce0eb65620e544b8614517f495fd0bd371a6a5ee70c3ddc6b210c3dff0a3f8b3"}},"pool1erajsxw8ejry8flz6gwsd885dmx9uv6k9wd8dl5vme7cxrzv9hl":{"id":"pool1erajsxw8ejry8flz6gwsd885dmx9uv6k9wd8dl5vme7cxrzv9hl","vrfVerificationKeyHash":"b327686ee38df980c15a5c9f9eeefeb5a03f5079531805cfead05a33739d23b4","pledge":{"lovelace":5000000000},"cost":{"lovelace":340000000},"margin":"3/20","rewardAccount":"stake_test1upnsszyt4g7wtl4s729kqysjph9mpv9f8hy5tk2srxr5swqnl38cl","owners":["6708088baa3ce5feb0f28b6012120dcbb0b0a93dc945d95019874838"],"relays":[{"type":"hostname","hostname":"g5.datadyne.earth","port":3005}],"metadata":{"url":"http://datadyne.earth/cardano/dataDyneCardanoPool.json","hash":"23f3b6da129943598cc39d57de2569810e5564558f1db8ab0bb80bd85194b3c4"}},"pool1e8sfzuvrpqm9t42e4tekfeygs9pk8uwja0qewxxpeyxwg5hvvcn":{"id":"pool1e8sfzuvrpqm9t42e4tekfeygs9pk8uwja0qewxxpeyxwg5hvvcn","vrfVerificationKeyHash":"a6b8428cc8ef74f793adb8469e2a36b7ae063186f0b314f837397d71ae6bf974","pledge":{"lovelace":15000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1ur6paxqxatgnvwjedszllqn54wd0t0xu9tq7lj8qjx4py2su8z4zw","owners":["f41e9806ead1363a596c05ff8274ab9af5bcdc2ac1efc8e091aa122a"],"relays":[{"type":"hostname","hostname":"75.119.159.254","port":3001}],"metadata":{"url":"https://raw.githubusercontent.com/TurboEgon/ada/master/md.json","hash":"9e02e9270ef85cc9415878d079a9237f2d55a924438b5cbf03850d894130d7b2"}},"pool1et694n52r9scvec3n32jej0juh4za6xucaj3zy822wajkegmdh3":{"id":"pool1et694n52r9scvec3n32jej0juh4za6xucaj3zy822wajkegmdh3","vrfVerificationKeyHash":"7d96da7d962d2bf0b372f5626e34b124bd38e8996d1d8880ec902b12b3a6a47d","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1ursgmmafa26uqmacut9k9ewgxrja60gv5gxlevrgevmx28gm8c59h","owners":["e6f0fb6aa711a3ce9f89d3d85d75e9215d990586b899aa80837744ef"],"relays":[{"type":"ipAddress","ipv4":"1.1.1.1","port":11}],"metadata":{"url":"http://baidu.com/","hash":"5418650706007cbfb0f784cb6a4a274c3c00ef4345e76cb053c3046cf481e74b"}},"pool1ewxvkzqnvfzaf48092n4t2crdventhxhtmpvydxnsnj322qc47c":{"id":"pool1ewxvkzqnvfzaf48092n4t2crdventhxhtmpvydxnsnj322qc47c","vrfVerificationKeyHash":"9842080c08dfce55e9d6758b9c57c51a83003c29920cbb94a828399f2472bc64","pledge":{"lovelace":5000000000},"cost":{"lovelace":500000000},"margin":"392699/12500000","rewardAccount":"stake_test1upp6fr9evvqcprgr57vq0u9mdwxck2whdlyjhve750xl29gu5zexv","owners":["43a48cb96301808d03a79807f0bb6b8d8b29d76fc92bb33ea3cdf515"],"relays":[{"type":"hostname","hostname":"preview.canadastakes.ca","port":5002}],"metadata":{"url":"https://www.canadastakes.ca/metadata/can1-preview-metadata.json","hash":"756e0c7c2640e526c055d0fe4eb453c0c2e2c3af85138a99a8e0d74ef9c0eeb3"}},"pool1ewed82f7tdluggkj2qsrajyjakzqewj3e37p25cddurtwejl6tz":{"id":"pool1ewed82f7tdluggkj2qsrajyjakzqewj3e37p25cddurtwejl6tz","vrfVerificationKeyHash":"dca941225e309e0aa7a4ca3a2f49280fa860098a17ab231a5e9b4347a0f2d241","pledge":{"lovelace":167369000000},"cost":{"lovelace":369000000},"margin":"9369/10000","rewardAccount":"stake_test1uzn99jy8eud3f4jp7pg6natdt3mn76mn33fx5na0a9utk7q03ttkv","owners":["a652c887cf1b14d641f051a9f56d5c773f6b738c526a4fafe978bb78"],"relays":[{"type":"hostname","hostname":"testicles.kiwipool.org","port":9720}],"metadata":{"url":"https://bit.ly/3R870ZK","hash":"19dcf5a17af5475da21aae1046a1bdae92ebac5e06e93e8c9a41b7a844fc6af8"}},"pool1ekezegcepqmhwppzdj7mm5cm26uz6kzmf4l9r8s3lx4kw6y2veh":{"id":"pool1ekezegcepqmhwppzdj7mm5cm26uz6kzmf4l9r8s3lx4kw6y2veh","vrfVerificationKeyHash":"c6cdbfe1e04a602a85be83b553a44657a8dd69835d14255bc820f754b38d55b3","pledge":{"lovelace":555000000},"cost":{"lovelace":350000000},"margin":"3/20","rewardAccount":"stake_test1uqgvynv9sx5kvlpn5a2zs2y6c9hfwxzuwwlntq0s2uqdahspm9ss4","owners":["10c24d8581a9667c33a75428289ac16e97185c73bf3581f05700dede"],"relays":[{"type":"ipAddress","ipv4":"185.161.193.105","port":6012}],"metadata":{"url":"https://clio.one/metadata/clio1_testnet.json","hash":"47530ba97c12e2ac40462e9c86eeb07ea555877d2a1f9d74b6ff8471839267d8"}},"pool1eh39zxmk8z4hxndc2dx6awu6yfpufmckjnyzlpdcsfd7jf2qxtm":{"id":"pool1eh39zxmk8z4hxndc2dx6awu6yfpufmckjnyzlpdcsfd7jf2qxtm","vrfVerificationKeyHash":"04c92fa6798809d11f840b1b15bf94f4a1ca9faebc92b82453741b453c700f6c","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1uzz4zhcllemvlf6n5yr5nuyxrpws3k06nrs6cn200900m8qtufxcz","owners":["85515f1ffe76cfa753a10749f086185d08d9fa98e1ac4d4f795efd9c"],"relays":[{"type":"hostname","hostname":"relay1.afica.io","port":3001}],"metadata":{"url":"https://bit.ly/preview_afica_metadata","hash":"54467a19dd5d5379e1baf0112ce5c2c478d43b53629ba2440e4ad66a50b5cfa4"}},"pool1ecc3gej4jsaskjfq6phxkcklx8l0qtvalyzeefp9shmvj86hchr":{"id":"pool1ecc3gej4jsaskjfq6phxkcklx8l0qtvalyzeefp9shmvj86hchr","vrfVerificationKeyHash":"dc0c2cf51a1033db6cdae7a856d78989ea373d41567b4bd30e850021d84b8843","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uq6pyvmjrxem8gftst2v23adw5trzvxanhz9vv3p4ng9qkqgwyflc","owners":["3412337219b3b3a12b82d4c547ad75163130dd9dc4563221acd05058"],"relays":[{"type":"hostname","hostname":"relay1.cardano.teamplay.studio","port":6000}],"metadata":{"url":"https://tinyurl.com/2p93ec5b","hash":"6bfbe784117723dbd72811f1ac85acfe49d5ca913102320ae012f39533a97a96"}},"pool1elet8uart9cuw3lmntqhfn2f44rf52dg6v5ppzkcysxx268s43n":{"id":"pool1elet8uart9cuw3lmntqhfn2f44rf52dg6v5ppzkcysxx268s43n","vrfVerificationKeyHash":"e10abc12be25311013a194e97766854c732f0bad09ff6c8bf3554e30f1d21d02","pledge":{"lovelace":9000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1upyrg0gn898nnfeal4c8j0536d9hrdlh82cu9kd39s26mgsd90gfn","owners":["48343d13394f39a73dfd70793e91d34b71b7f73ab1c2d9b12c15ada2"],"relays":[{"type":"hostname","hostname":"1.tcp.au.ngrok.io","port":25432}],"metadata":{"url":"https://t.ly/IT5j2","hash":"d79139620ec27edc094bbf79051bb0b97e599d1826f9545718786a4f9ae4eed0"}},"pool16z5ej7zasdtuljm8r0s5k8pszdm8r7argy7aq0v4czv05kyez76":{"id":"pool16z5ej7zasdtuljm8r0s5k8pszdm8r7argy7aq0v4czv05kyez76","vrfVerificationKeyHash":"bf219f9491ead9d95d362259f14e6ac78e68f3e7b06972b631ba8ac80a82b1af","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"3/10","rewardAccount":"stake_test1up8yrvxz9vvc54jh3xhau9n4hgvp004yj2xgnxrsx665e6qvf8nhl","owners":["4e41b0c22b198a565789afde1675ba1817bea4928c89987036b54ce8"],"relays":[{"type":"hostname","hostname":"beta.stake-cardano-pool.com","port":7002}],"metadata":{"url":"https://bit.ly/prevRCADA","hash":"28b7537b13a8954f80ca50022dce103252a2d64262e62b17847482ff8b474ca0"}},"pool16y556gh885fw5nky8f8qmfwjeer7l8d2wjr8cl7f5vd8x7zgh0d":{"id":"pool16y556gh885fw5nky8f8qmfwjeer7l8d2wjr8cl7f5vd8x7zgh0d","vrfVerificationKeyHash":"968a613baf8ec8e434b663e0a1fdf1c710a7b760a67dfb15e8ede88b818236e9","pledge":{"lovelace":5000000000},"cost":{"lovelace":4321000000},"margin":"1/25","rewardAccount":"stake_test1uppyxzrrhyfh5ja2tgfm87u8h36xgr3a6d6p2ljztpfew8snugder","owners":["42430863b9137a4baa5a13b3fb87bc74640e3dd374157e425853971e"],"relays":[{"type":"ipAddress","ipv4":"123.121.123.121","port":3000}],"metadata":{"url":"https://git.io/JJWdJ","hash":"c5c38833176e2d575bd8693e206e3af2e1088e556def86cae9f6c2fc45579f36"}},"pool16dy6cwrdthfmhn85h56se7dmhp2m8vhg928lvg073r7dwkjvtpg":{"id":"pool16dy6cwrdthfmhn85h56se7dmhp2m8vhg928lvg073r7dwkjvtpg","vrfVerificationKeyHash":"a377abb415ee8e8ae9a15a2a68aa9800261c7ffc77ac9380d416703e7fed9ac8","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1urdj5j3jtsj9lsf6xdz27dzxfw92ezj34v5d0qhcrx4ztysksexxe","owners":["db2a4a325c245fc13a3344af34464b8aac8a51ab28d782f819aa2592"],"relays":[{"type":"hostname","hostname":"topo-test.topopool.com","port":3010}],"metadata":{"url":"https://cardanostakehouse.com/b44bf76a-f93d-491d-bffe-ebf.json","hash":"e0f5672cbb37d0564f5ba3f68fad2ea15484b65ece509500b27213a597a7df03"}},"pool16sjj3ykqznw2pd2m2ug00k0fujtqsmq4amfeeewqzvk7622xetd":{"id":"pool16sjj3ykqznw2pd2m2ug00k0fujtqsmq4amfeeewqzvk7622xetd","vrfVerificationKeyHash":"0cd296f8c5f1337827cacf997a68fc4e700e79632a72ef341419464cea335f87","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1up6g3hdqewdu96xcsaszvfg2jz422aq604ukkaw8cp686xcjnchlw","owners":["7488dda0cb9bc2e8d8876026250a90aaa5741a7d796b75c7c0747d1b"],"relays":[{"type":"hostname","hostname":"preview.happystaking.io","port":3003}],"metadata":{"url":"https://happystaking.io/poolMetadataPreview.json","hash":"cafacba1d7a1e22665204fd41daf451d767e5bb684856b5f58e70511cf8ac076"}},"pool16hphjcfga9jhk5j3rsgmys83kza983utn3zv9jwhjgpe2ah4j8x":{"id":"pool16hphjcfga9jhk5j3rsgmys83kza983utn3zv9jwhjgpe2ah4j8x","vrfVerificationKeyHash":"42b2725232523538f75c49436958209eeec9b0bd081b847816996c3faf1a3ed1","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"3/20","rewardAccount":"stake_test1uzxp3ahlzepch6r7vk43cwjsmyjvp7zvqy6973nw2ejktksa5yrqu","owners":["8c18f6ff16438be87e65ab1c3a50d924c0f84c01345f466e566565da"],"relays":[{"type":"ipAddress","ipv4":"168.138.37.117","port":6000}],"metadata":{"url":"https://tinyurl.com/yc3brjd5","hash":"13538c6980dd25aef3cad66fe9534145168e94e88bdb2db73f469b7b3e2faaeb"}},"pool16e3m59evvjmxsnyu2xqf5ns4zgcdc9m4fpm29avrc5y6qdnhzs6":{"id":"pool16e3m59evvjmxsnyu2xqf5ns4zgcdc9m4fpm29avrc5y6qdnhzs6","vrfVerificationKeyHash":"d35ac02a0872f631f2eeca690a00578d2522af70ee749c75a696b458dfc74a3b","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/200","rewardAccount":"stake_test1ure4jcjcvf0np3hfen3ngfvgqymmur783tdmjw0hnrf4q8s52ymvc","owners":["f3596258625f30c6e9cce33425880137be0fc78adbb939f798d3501e"],"relays":[{"type":"hostname","hostname":"relay1.afica.io","port":3001}],"metadata":{"url":"http://metadata.afica.io/preview.json","hash":"54467a19dd5d5379e1baf0112ce5c2c478d43b53629ba2440e4ad66a50b5cfa4"}},"pool1mykwc7325c2wrur785z22wj6c0fust2ttf6pvt5rh6rtjf2pemg":{"id":"pool1mykwc7325c2wrur785z22wj6c0fust2ttf6pvt5rh6rtjf2pemg","vrfVerificationKeyHash":"fa730318b97a085aa8722dbb7a2fd59ae35942f880e01c9c8b462d81c84dc4cc","pledge":{"lovelace":9069000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1urdcnx276w4g3h8mgdusutj3wc0uhflgt99ucemgfafd2fqmjjw3u","owners":["db89995ed3aa88dcfb43790e2e51761fcba7e8594bcc67684f52d524"],"relays":[{"type":"ipAddress","ipv4":"194.60.201.143","port":6001}],"metadata":{"url":"https://cardanotech.io/sancho/poolMetaData.json","hash":"ccb6217c050e86cc6128b6c40e9daf5650daeb40225c26abade57c22d68ce7b6"}},"pool1m80zlt567eqfessn6pvll5puhl049fkce0w55nmgx84mv74mrqa":{"id":"pool1m80zlt567eqfessn6pvll5puhl049fkce0w55nmgx84mv74mrqa","vrfVerificationKeyHash":"9255fd57d5e228c2228181d99087ab6551eb7d27fc5294813a48c3f1d2327d18","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1upzkdmu99wpclw7h9v8hvdd09vwygyj77qsma0gnef2znwqpk8aff","owners":["4566ef852b838fbbd72b0f7635af2b1c44125ef021bebd13ca5429b8"],"relays":[{"type":"hostname","hostname":"5.161.205.147","port":3001}],"metadata":{"url":"https://udknow.github.io/extend.github.io/pool_MetaData.json","hash":"f7f5329cbaf15b781d1a97f0f596697065f7c453aa2baf3ac034a67c2ac6d0be"}},"pool1mfwwn7k6h4k0qnrn4q4ck0l6lunra8fyvawalt6cpjvp6a253da":{"id":"pool1mfwwn7k6h4k0qnrn4q4ck0l6lunra8fyvawalt6cpjvp6a253da","vrfVerificationKeyHash":"c3e92038b50de0e70bd3066f83c067e1726f126a6cc4c9044f3c87582194bee6","pledge":{"lovelace":1000000},"cost":{"lovelace":568800000},"margin":"1/1","rewardAccount":"stake_test1urull23za5j968nez2952k0fpdzk49raz5qvadyer7d8fxqtpzyfh","owners":["f9ffaa22ed245d1e79128b4559e90b456a947d1500ceb4991f9a7498"],"relays":[{"type":"ipAddress","ipv4":"142.132.218.54","port":6001}],"metadata":{"url":"https://www.roastfrog.com/testpoolMetadata.json","hash":"f03b6faa03747b3657b1e5dd6c2f400421a609529654dbd1c1cfe6a774c5bd19"}},"pool1mfc42za8tj74zc66ez3slwtq4mumdl7yrylaxajd5xugujmhd0c":{"id":"pool1mfc42za8tj74zc66ez3slwtq4mumdl7yrylaxajd5xugujmhd0c","vrfVerificationKeyHash":"5261e39dc3a6a2c1107bded7a5cce9f9e5ba273d92b3832d028c24a23b83db48","pledge":{"lovelace":123000000},"cost":{"lovelace":171000000},"margin":"27/625","rewardAccount":"stake_test1uzckcmv9m39sx0jdvjn5snd8pkhtzwjed50tr9ayjcjdvfctmyegm","owners":["b16c6d85dc4b033e4d64a7484da70daeb13a596d1eb197a49624d627"],"relays":[{"type":"ipAddress","ipv4":"95.216.173.194","port":16000}],"metadata":{"url":"https://raw.githubusercontent.com/hodlonaut/a/master/t1.json","hash":"81986b8f246cb39979af55fc01215f193df2dc07107989b886e131633e880e43"}},"pool1m3d2flwq8kt6ys0e973xwawd042dnn6vfu82p8efyqsvu4wttaq":{"id":"pool1m3d2flwq8kt6ys0e973xwawd042dnn6vfu82p8efyqsvu4wttaq","vrfVerificationKeyHash":"e40dfd70145e63f2eb76398181f9e2f9b9f24aff6800228aa7ff1beef2a3c30c","pledge":{"lovelace":100000000},"cost":{"lovelace":345000000},"margin":"3/20","rewardAccount":"stake_test1ups3a2wv5lnrwusv06zxqrjpga4gwzuuw86y8vh23t9uhgsxarnft","owners":["611ea9cca7e637720c7e84600e41476a870b9c71f443b2ea8acbcba2"],"relays":[{"type":"hostname","hostname":"ada01.liv.io","port":30002}],"metadata":{"url":"liv.io/poolMetaData.json","hash":"78409be753a669ae5eb8c81ee7f3f1a48e8a265ebc6814e6247af4440d50b515"}},"pool1mndner6ppa2ww3zuahk8zg7tv4m235qtrt8tfne4jfl9k7kt8fd":{"id":"pool1mndner6ppa2ww3zuahk8zg7tv4m235qtrt8tfne4jfl9k7kt8fd","vrfVerificationKeyHash":"1077d0e618747203a2c133c9c758f9201a6666c8b342571650b441ed79a8b435","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzdz78y403tg3vr4qs5yz24yxdn5mg5knl09wnyta8sn6ds6xq8dv","owners":["9a2f1c957c5688b0750428412aa433674da2969fde574c8be9e13d36"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/LXSP2","hash":"8c3c4274796876b709eb9fc24b0ed08cdefd0574a011626c307ec83789dd0f61"}},"pool1m4n62kp59efunmu49qfyu38y8g6t9t3mgv4229z0lmpy6fxzdsv":{"id":"pool1m4n62kp59efunmu49qfyu38y8g6t9t3mgv4229z0lmpy6fxzdsv","vrfVerificationKeyHash":"78042dd9de14cb768582a928c234c4bda3c58ce993a2fb67e575eb5035a15335","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzmundjjeta9g6lkszul9zqvnnhnfjgqqkra5a6sfykljfq89ydly","owners":["b7c9b652cafa546bf680b9f2880c9cef34c9000587da7750492df924"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSNB","hash":"c15f332d03f1660ac02c025bd89bbb03b313d11f3c8e8a3c3f331709e422e56d"}},"pool1ufzepz9ugl5f72d3d4lk29x43uxexmae79dxj766s6pgu9axvav":{"id":"pool1ufzepz9ugl5f72d3d4lk29x43uxexmae79dxj766s6pgu9axvav","vrfVerificationKeyHash":"8eeabd1fa1f3b29dd9939e75e8ca450f88d77ec6be1f1a038515b0f0460e5312","pledge":{"lovelace":4567},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1upznunn78q5v6myxfmmgfe6czuhszmnwwpvszr2w8sf4aggtdp3ck","owners":["3b957bf2d0a2299394ce7dd21dd42ff0cb2ee8d517b0b2d297e31828","453e4e7e3828cd6c864ef684e758172f016e6e7059010d4e3c135ea1","5fe8542e18bde2f7469871e89b39839db8b782df86cf68b036450b73"],"relays":[],"metadata":{"url":"https://www.updated_location.com","hash":"997efa7ae731f7d203d790985f7ddf6ce37fe07944e2633e9acc386dae553dbe"}},"pool1u2pl6kx4yc77lnyapnveykkpnj07fmc7pd66fa40fvx3khw7cua":{"id":"pool1u2pl6kx4yc77lnyapnveykkpnj07fmc7pd66fa40fvx3khw7cua","vrfVerificationKeyHash":"b015beeb402d42c1607f69634ed3e53962354246f15e64073697aa03c704955b","pledge":{"lovelace":1000000000000},"cost":{"lovelace":500000000},"margin":"1/1","rewardAccount":"stake_test1urfjhemxd66mhxds7g6w07gsfy6dx2fheh6jv7zyd88l54qxghsqh","owners":["9b4052824b5cd89bb9c74ebe9405fbabf76003c5753e35d3bcc86531"],"relays":[{"type":"hostname","hostname":"preview-node.play.dev.cardano.org","port":3001}]},"pool1uk72vv6l3c4l83hw22crx9ytug7ud97grqg8am5p0qv45aa4ymr":{"id":"pool1uk72vv6l3c4l83hw22crx9ytug7ud97grqg8am5p0qv45aa4ymr","vrfVerificationKeyHash":"9003483796788e265a27728db0f83eb9bd41739f821924e286629999e10a88e5","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1urmdhhr5qhr5rgrsnw7wa2kernuahyemrr4pqta3lke6jxguxf7n4","owners":["f6dbdc7405c741a0709bbceeaad91cf9db933b18ea102fb1fdb3a919"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/RSPO4","hash":"611a69c0d90dbff124db9e3f5b21c846958e340fee72ed00bceb6e5e1f429a66"}},"pool1uh5xdjv70q5eyl5z644p23mvhd3dx0gwr8pjnlj9pwd3jgkvd0e":{"id":"pool1uh5xdjv70q5eyl5z644p23mvhd3dx0gwr8pjnlj9pwd3jgkvd0e","vrfVerificationKeyHash":"335399acf3228243efb0fec0e43f18d61a496d4fd740fd800f9b91b5fa7d0540","pledge":{"lovelace":100000000},"cost":{"lovelace":345000000},"margin":"3/4","rewardAccount":"stake_test1upv6ppwktpx45y3x4msy20fpm0fyyt4g6d9xh4ntlf9tykqyulqzd","owners":["59a085d6584d5a1226aee0453d21dbd2422ea8d34a6bd66bfa4ab258"],"relays":[{"type":"hostname","hostname":"lion474.duckdns.org","port":6000}],"metadata":{"url":"https://tinyurl.com/pkmer3hs","hash":"00ab354051a92cecb843d473c1bce7057e8d922c2f790da4326d1e4daff323e2"}},"pool1uh5sc3v77el8egy6rgz59mdgv0097j7nx3usrrkagvmsy6074k0":{"id":"pool1uh5sc3v77el8egy6rgz59mdgv0097j7nx3usrrkagvmsy6074k0","vrfVerificationKeyHash":"ae3c85580444e5a30cfad07b6a70e004c1875faf87851a06ce756e5ed42ee8f4","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uzds77htp7kk5txdk5e2zntrejgmv5gum445n26ygawv40ghak4zs","owners":["9b0f7aeb0fad6a2ccdb532a14d63cc91b6511cdd6b49ab44475ccabd"],"relays":[{"type":"hostname","hostname":"sp.altzpool.com","port":5001}],"metadata":{"url":"https://altzpool.com/WALTZ/poolmeta.json","hash":"5c8ab40789c4fdc8aeb4684deda3c85aa0202078e0f2d575977f76351da9e771"}},"pool1ayc7a29ray6yv4hn7ge72hpjafg9vvpmtscnq9v8r0zh7azas9c":{"id":"pool1ayc7a29ray6yv4hn7ge72hpjafg9vvpmtscnq9v8r0zh7azas9c","vrfVerificationKeyHash":"4888af16310dc9dd2600001ae7d5fc571cd15d38ffb47c802aac599f916207e0","pledge":{"lovelace":125000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1uzs5rxys8qy5jnr9g0mkj860ms5n92nrykmrgyumpf2ytmsejj4m6","owners":["a14198903809494c6543f7691f4fdc2932aa6325b634139b0a5445ee"],"relays":[{"type":"ipAddress","ipv4":"207.180.211.199","port":6007}],"metadata":{"url":"https://git.io/JW7b5","hash":"7296d38d3c67d769c38924679e132e7d9098e70891d7574cc5cf053574305629"}},"pool1agzq8htqr80dr0wu6ppvm4azkrmhelg4jy4x4qes9n5cuau7esc":{"id":"pool1agzq8htqr80dr0wu6ppvm4azkrmhelg4jy4x4qes9n5cuau7esc","vrfVerificationKeyHash":"fb27957133f79e8e308e0bb47f26a3b8c9c6ada920a4b1121410d55ad4f2f90a","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1urdj5j3jtsj9lsf6xdz27dzxfw92ezj34v5d0qhcrx4ztysksexxe","owners":["db2a4a325c245fc13a3344af34464b8aac8a51ab28d782f819aa2592"],"relays":[{"type":"hostname","hostname":"topo-test.topopool.com","port":3010}],"metadata":{"url":"https://cardanostakehouse.com/187d7406-a87e-449e-8849-9a8.json","hash":"68d0f12660b653892627f2c26c5206dd7cec9fe5c28680f30130aee36188cefd"}},"pool1ag29qua3amyl7fszngeqxnrxpamu6rychrxjjuju5e0tskdpwka":{"id":"pool1ag29qua3amyl7fszngeqxnrxpamu6rychrxjjuju5e0tskdpwka","vrfVerificationKeyHash":"a06673f1adeb90f1c228becf0d7467f750aa2ff22380297b92cba4af98c1f2ac","pledge":{"lovelace":10000000000},"cost":{"lovelace":340000000},"margin":"1/100","rewardAccount":"stake_test1upglkzseasr52vrwa8lyuare8vrlsgj7gd7u7qcapfr4rtcxzny4g","owners":["51fb0a19ec0745306ee9fe4e74793b07f8225e437dcf031d0a4751af"],"relays":[{"type":"ipAddress","ipv4":"144.126.157.40","port":3005}],"metadata":{"url":"https://onecommunityada.com/public/poolmeta-preview-v01.json","hash":"13789ef22250148bba4158df16011318b63a18110d64f2b449bb10df5648f2d6"}},"pool1ad2pw6ch9rpktqt4yfr5qlgt4z87g4v2lky067khwfe9khq246w":{"id":"pool1ad2pw6ch9rpktqt4yfr5qlgt4z87g4v2lky067khwfe9khq246w","vrfVerificationKeyHash":"6c3788da12fce689f7e7d6f50814ad1b21a2ec41f2689bd12770b72958d62689","pledge":{"lovelace":2000000000},"cost":{"lovelace":340000000},"margin":"1/50","rewardAccount":"stake_test1uqyjm25xx2jv62fydccgx036ahs7c5fvwl9a2vpempeemgcj594y7","owners":["092daa8632a4cd29246e30833e3aede1ec512c77cbd53039d8739da3"],"relays":[{"type":"ipAddress","ipv4":"159.203.25.174","port":6000}],"metadata":{"url":"https://tinyurl.com/uakazrpv","hash":"afdf5aa90ad33073ed75f0a72bc72b952e774deac00e7f4cb1020bfb7c6e91ef"}},"pool1aw4ylpwdt6dll08jzkqtpa00rvxpqj8k04g6kdyumwk9cyrqpk8":{"id":"pool1aw4ylpwdt6dll08jzkqtpa00rvxpqj8k04g6kdyumwk9cyrqpk8","vrfVerificationKeyHash":"168dc3fcbe016160b0bb58e60880b2cc422d63937a944e9522bd3c1847f429f0","pledge":{"lovelace":10000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uz2equk92h9kfjj3v80ls23t4hx4r4n3mwr8tcddgpc9ldcn3cvfz","owners":["959072c555cb64ca5161dff82a2badcd51d671db8675e1ad40705fb7"],"relays":[{"type":"ipAddress","ipv4":"190.225.246.140","port":6000}],"metadata":{"url":"https://t.ly/W1Nni","hash":"167d5e2610687507e54ed74f89c5705a09375e89199ed5c8fbd980a26ad84a7d"}},"pool1a3pepkeacs59d3lqfmk6hks4qc7k84xqsc4q664lpxfvyq9lf5f":{"id":"pool1a3pepkeacs59d3lqfmk6hks4qc7k84xqsc4q664lpxfvyq9lf5f","vrfVerificationKeyHash":"1786535ea1a4e6ee4addea9ea255643515698bfe927b7a631402a274172685ae","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqxcefkp07zelmy36y3jdpzajxz2w053h027sknlk4fkklqe96s62","owners":["0d8ca6c17f859fec91d12326845d9184a73e91bbd5e85a7fb5536b7c"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/LXSP4","hash":"2d9ef4dab347f7151dbdb884f61dbeb1d1322655d0835a002cba7072dc2baa41"}},"pool1a6ug5gelydu29djkuvxl869257e7v4d3zwqwt69ygu7dcfts59j":{"id":"pool1a6ug5gelydu29djkuvxl869257e7v4d3zwqwt69ygu7dcfts59j","vrfVerificationKeyHash":"1c3ba4a44d07d779d3b699936ead18a3dd9b20eeaa25281df144c404b611f864","pledge":{"lovelace":1000000000},"cost":{"lovelace":170000000},"margin":"1/100","rewardAccount":"stake_test1uqrw4g3al234sqskw87z6t45k42z2t9qyp9jyeec83wm0csq2u08c","owners":["06eaa23dfaa358021671fc2d2eb4b554252ca0204b2267383c5db7e2"],"relays":[{"type":"hostname","hostname":"testnet.valhallapool.net","port":3000}],"metadata":{"url":"https://raw.githubusercontent.com/t0m3kf/v/main/testnet.json","hash":"1d707d6861b2fdb6b46321270e40ea01ff9a49acc3858b5499b5f33fa4f3bebf"}},"pool1a7h89sr6ymj9g2a9tm6e6dddghl64tp39pj78f6cah5ewgd4px0":{"id":"pool1a7h89sr6ymj9g2a9tm6e6dddghl64tp39pj78f6cah5ewgd4px0","vrfVerificationKeyHash":"1d8199fd0a82c29b242d62f6aca7d166200e47c0596fab5b1d4cf56399b6eded","pledge":{"lovelace":100000000000},"cost":{"lovelace":340000000},"margin":"1/10","rewardAccount":"stake_test1uqd2nz8ugrn6kwkflvmt9he8dr966dszfmm5lt66qdmn28qt4wff9","owners":["1aa988fc40e7ab3ac9fb36b2df2768cbad36024ef74faf5a0377351c"],"relays":[{"type":"hostname","hostname":"prv-relay1.apexpool.info","port":3001}],"metadata":{"url":"https://apexpool.info/preview/poolmetadata.json","hash":"a207f23a6255eeb0b508945e5170b169eb5c3220109d7fa17a7d88d462c8a199"}},"pool1alaz72lzlude9flwewegv530za5pl0uuakxa02kdyddv67wpkwj":{"id":"pool1alaz72lzlude9flwewegv530za5pl0uuakxa02kdyddv67wpkwj","vrfVerificationKeyHash":"d2c415e4eb5c7295a10d17b1eecc7791f6217f0dfcf298e83eba53f44a792362","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"19/1000","rewardAccount":"stake_test1ur2pejlgfqa5e4stqg529tqj06k6gamweaawgphvewkdgtqqkuwlr","owners":["d41ccbe8483b4cd60b0228a2ac127eada4776ecf7ae406eccbacd42c"],"relays":[{"type":"ipAddress","ipv4":"194.163.158.69","port":6002}],"metadata":{"url":"https://solidsnakedev.github.io/poolMetadata.json","hash":"66e626854b9d86d419cba818f04e4958247cb7d613d55959cb8df924bdb99c03"}},"pool17wdfwsyksx7femcxzx7ycf84maqvdf3fmr7z92h2xguy7eanvdf":{"id":"pool17wdfwsyksx7femcxzx7ycf84maqvdf3fmr7z92h2xguy7eanvdf","vrfVerificationKeyHash":"b5ad4eb8d4d7d07c993670d34e475a0ebd3553b297eaec49f297645365f3319e","pledge":{"lovelace":19000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uzu4m5xsmd0lw2y7n3rrh70feevp5sghqk9nmkr30f0yyjcx0eu53","owners":["b95dd0d0db5ff7289e9c463bf9e9ce581a4117058b3dd8717a5e424b"],"relays":[{"type":"hostname","hostname":"preview-testnet-relay.junostakepool.com","port":4521},{"type":"hostname","hostname":"passive-preview-testnet-relay.junostakepool.com","port":4531}],"metadata":{"url":"https://junostakepool.com/juno-testnet.metadata.json","hash":"3a0d397aa9bf08753197678d93ee2f615daa4727671497bfd69fabd84c63d907"}},"pool17njlrn0jgdw626utskz0zmrnduz9ra8d3al6aw5hvszxkx88q2r":{"id":"pool17njlrn0jgdw626utskz0zmrnduz9ra8d3al6aw5hvszxkx88q2r","vrfVerificationKeyHash":"392d334b0670323093e6cf60edf36961e4005de35b2c86f01e41ce2f7428837a","pledge":{"lovelace":1000000000},"cost":{"lovelace":340000000},"margin":"1/1","rewardAccount":"stake_test1urmklja3h07ndxxrg6eu950x9glzws3gcu7wpphz2cdgujql0rxpn","owners":["10d1fd3cc499c8651bc9344fabe05739fa3e5777145eb638d39dc449"],"relays":[{"type":"ipAddress","ipv4":"210.54.38.228","port":4020}],"metadata":{"url":"https://bit.ly/3vlDN4w","hash":"ff6cdb1fba6074de46d95e0f878d9683d2ce2cf3acb57e6a4fdb9d97af8fe739"}},"pool17navl486tuwjg4t95vwtlqslx9225x5lguwuy6ahc58x5dnm9ma":{"id":"pool17navl486tuwjg4t95vwtlqslx9225x5lguwuy6ahc58x5dnm9ma","vrfVerificationKeyHash":"f4c30ed620cf34f18f8a03e87a178fa01dcd21f07aeaab8c69bd1ad168177b1a","pledge":{"lovelace":100000000},"cost":{"lovelace":340000000},"margin":"1/40","rewardAccount":"stake_test1urwheaxgd4llq93s85tlnazqtzqpgrxy3nagtagl97xswug363ct0","owners":["dd7cf4c86d7ff016303d17f9f4405880140cc48cfa85f51f2f8d0771"],"relays":[{"type":"hostname","hostname":"pv-relays.digitalfortress.online","port":8001}],"metadata":{"url":"https://digitalfortress.online/digi2-pv.json","hash":"9b7e689634956d37e264f89a9ff1dc9cc38f3f4feb2984193ba55b75fbbe4edc"}},"pool175vq9hqwm9c39uk085xefkr6frtejxcqsf6gh9kh2jaavttrv2p":{"id":"pool175vq9hqwm9c39uk085xefkr6frtejxcqsf6gh9kh2jaavttrv2p","vrfVerificationKeyHash":"54b1898f88cf3e41f0b2d961132a6d35aee6e6c1cd06b10676d07eaaddb739f2","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1uqy849fm6tqp8vvn69tmvtgnc26kkre9xhu236kxf2mpgcg4lusqv","owners":["087a953bd2c013b193d157b62d13c2b56b0f2535f8a8eac64ab61461"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/RSPO6","hash":"7fd82335e38dff9fcf4d7cbc685bc81120b34a8138a5f63ac49bbe34e52f5adf"}},"pool1lqj075ak5u2j9wul3kccll7jg6we27jkeuqwpjctmj9qstcxz2l":{"id":"pool1lqj075ak5u2j9wul3kccll7jg6we27jkeuqwpjctmj9qstcxz2l","vrfVerificationKeyHash":"51e8282e2675e4b384ca03ee2b001d3d430349a80b8c5147215f77a5739a66ba","pledge":{"lovelace":500000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1urvkry4v3ncrhzjhmwg0uluerrr0rx43eh3pafq75ufucpcherj5s","owners":["d96192ac8cf03b8a57db90fe7f9918c6f19ab1cde21ea41ea713cc07"],"relays":[{"type":"ipAddress","ipv4":"0.0.0.0","port":3533}],"metadata":{"url":"https://example.com/SSNC","hash":"ccd9b7349e6a97c5f670f93225c9596bff725a63f7f4f1a42f5ea1367c639a80"}},"pool1l9u9ss9xtww8qkt4zqda84z945f6tgq4753jqhtdr4r8yaw7d6g":{"id":"pool1l9u9ss9xtww8qkt4zqda84z945f6tgq4753jqhtdr4r8yaw7d6g","vrfVerificationKeyHash":"d510044198082bb3852d56c29d0901dfc7f2fe7cc9958fffdb2c0a10ca378495","pledge":{"lovelace":0},"cost":{"lovelace":340000000},"margin":"1/1","rewardAccount":"stake_test1up3pv0r49hevqvc23q7zfwnza6d0vs3qhf4w9lhg9w93c7qegmfv6","owners":["62163c752df2c0330a883c24ba62ee9af64220ba6ae2fee82b8b1c78"],"relays":[{"type":"ipAddress","ipv4":"18.219.254.123","port":3001}],"metadata":{"url":"https://tinyurl.com/ye2zvyf4","hash":"60586988c5245b4eb59aff8110da9ebe57d4c7e37aaf6e6a3587523aa14fdee1"}},"pool1l8k45jgjd58jcg84pclvhzwqt2ql9xk65xc5svggdkslswwlh37":{"id":"pool1l8k45jgjd58jcg84pclvhzwqt2ql9xk65xc5svggdkslswwlh37","vrfVerificationKeyHash":"28c7be4bfae439c34bbd00ee1f38fbdd6da7699348e1a2d8cc8f5a5f37ec0e0e","pledge":{"lovelace":20000000000},"cost":{"lovelace":340000000},"margin":"0/1","rewardAccount":"stake_test1upzyxqc689puxvznynchysv368j4jwjvghzszqsx4fsnsasec99jl","owners":["4443031a3943c3305324f1724191d1e5593a4c45c5010206aa613876"],"relays":[],"metadata":{"url":"http://bit.ly/rabbitholepools","hash":"618d89696eea579b5e4402f220109785e9039181d5a46fc7fff45e035a8cab61"}},"pool1l5u4zh84na80xr56d342d32rsdw62qycwaw97hy9wwsc6axdwla":{"id":"pool1l5u4zh84na80xr56d342d32rsdw62qycwaw97hy9wwsc6axdwla","vrfVerificationKeyHash":"39cf4275b0751ee453aee1737c97466543250ec50932dfa0a109a99c9678752b","pledge":{"lovelace":127813888409},"cost":{"lovelace":340000000},"margin":"1/20","rewardAccount":"stake_test1uzwfmyp6jjyupe3pf3h80k5j0p3pzxzn0gf5544p7qzmhmsat2s3z","owners":["9c9d903a9489c0e6214c6e77da9278621118537a134a56a1f005bbee"],"relays":[{"type":"hostname","hostname":"preview.euskalstakepool.win","port":6001}],"metadata":{"url":"https://git.io/JiZgb","hash":"2e421355eb7b4499dd8f0bca206178131f4c9ad90e2bf369ae78aa0c7c4d9472"}},"pool1leml52hm4fcp3hhe4zye08qz27llhj7d339p3gs0tl85cstx59q":{"id":"pool1leml52hm4fcp3hhe4zye08qz27llhj7d339p3gs0tl85cstx59q","vrfVerificationKeyHash":"9bce3347843eea739fe6978c347f08dd6de43443f1964369c42778b874c42783","pledge":{"lovelace":65000000000},"cost":{"lovelace":340000000},"margin":"3/100","rewardAccount":"stake_test1urpj2lxml8ml6dqv58l3f7skw4389e0vq7s22sl8zgekmmcy97awy","owners":["c3257cdbf9f7fd340ca1ff14fa16756272e5ec07a0a543e712336def"],"relays":[{"type":"hostname","hostname":"previewrelay1.intertreecryptoconsultants.com","port":6000}],"metadata":{"url":"https://tinyurl.com/intrtpreview","hash":"b9e21ae6844cd61c812c3d5aec7dbe6f8099962fe1e952d51f297258ba89879f"}},"pool1lleyxf5xxaxg633c2thh5ttjrf4qxrm3cqaw53kmp7e5q2nlg38":{"id":"pool1lleyxf5xxaxg633c2thh5ttjrf4qxrm3cqaw53kmp7e5q2nlg38","vrfVerificationKeyHash":"3256df2b38272c09c93044fa2702d5ffb1f38c5a2145dc3cb94d5800b28accce","pledge":{"lovelace":100000000000},"cost":{"lovelace":340000000},"margin":"3/10","rewardAccount":"stake_test1uzdgxac7lcan0v7qr4tre4v8aeurwtgk3cszpthf3fra68gc7wnk2","owners":["9a83771efe3b37b3c01d563cd587ee78372d168e2020aee98a47dd1d"],"relays":[{"type":"ipAddress","ipv4":"73.222.0.99","port":3001}],"metadata":{"url":"https://tinyurl.com/6br33xwj","hash":"12b539568a42859dd8a2fe2e9c9ab3095ca4f8dedbb8899f9943ecd54dc16047"}}},"method":"queryLedgerState/stakePools","jsonrpc":"2.0","id":"queryLedgerState/stakePools-3rvj1ml27d5loixowwa","error":null} \ No newline at end of file diff --git a/fixtures/test/ogmios/queryNetwork-startTime-02fa6f9e7ed04ebfe3294c7648be54d5.json b/fixtures/test/ogmios/queryNetwork-startTime-02fa6f9e7ed04ebfe3294c7648be54d5.json new file mode 100644 index 000000000..a70856486 --- /dev/null +++ b/fixtures/test/ogmios/queryNetwork-startTime-02fa6f9e7ed04ebfe3294c7648be54d5.json @@ -0,0 +1 @@ +{"result":"2022-10-25T00:00:00Z","method":"queryNetwork/startTime","jsonrpc":"2.0","id":"queryNetwork/startTime-3rvj1ml27d5loixoww6","error":null} \ No newline at end of file diff --git a/fixtures/test/ogmios/queryNetwork-tip-fbd01538064b3ef7b5e3a703dddcb32b.json b/fixtures/test/ogmios/queryNetwork-tip-fbd01538064b3ef7b5e3a703dddcb32b.json new file mode 100644 index 000000000..9bf66db46 --- /dev/null +++ b/fixtures/test/ogmios/queryNetwork-tip-fbd01538064b3ef7b5e3a703dddcb32b.json @@ -0,0 +1 @@ +{"result":{"slot":32379177,"id":"5f88efad29d47924ac3c275ad44ec1e1163d04c9e6d98927b1389ae87325a418"},"method":"queryNetwork/tip","jsonrpc":"2.0","id":"queryNetwork/tip-3rvj1ml27d5loixoww4","error":null} \ No newline at end of file diff --git a/fixtures/test/ogmios/systemStart-da1980dfd588d382e7298a4262f88182.json b/fixtures/test/ogmios/systemStart-da1980dfd588d382e7298a4262f88182.json deleted file mode 100644 index 401cb84ea..000000000 --- a/fixtures/test/ogmios/systemStart-da1980dfd588d382e7298a4262f88182.json +++ /dev/null @@ -1 +0,0 @@ -"2022-06-06T14:00:00Z" \ No newline at end of file diff --git a/fixtures/test/ogmios/systemStart-ed0caad81f6936e0c122ef6f3c7de5e8.json b/fixtures/test/ogmios/systemStart-ed0caad81f6936e0c122ef6f3c7de5e8.json deleted file mode 100644 index 39f1cfdc7..000000000 --- a/fixtures/test/ogmios/systemStart-ed0caad81f6936e0c122ef6f3c7de5e8.json +++ /dev/null @@ -1 +0,0 @@ -"2019-07-24T20:20:16Z" \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-06aaa562b5d1e86110656634e484222c.json b/fixtures/test/ogmios/utxo-06aaa562b5d1e86110656634e484222c.json deleted file mode 100644 index 2e3840808..000000000 --- a/fixtures/test/ogmios/utxo-06aaa562b5d1e86110656634e484222c.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"0074a3a2d65924937b30c3834730eea07a338b90243b3f24168420832185229e"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a77f5c2fb","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"09c5a4907a193848cd10274b9d297ce76e1a4b2c6bfbad87fd0208f3b3198c72"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a1b8c1dd0","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"0d44b4ceb9ec927593271615990249a8d9ba85e97980382fc8e72df9432fe374"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a6c232b7d","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"119b6e937ddb93c39352586a9d4642b487c06648bc33b019bbc7adbec3c3c498"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a274c2623","datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"11bb26804e8814bc1fd7e9b924ebe8744482f925497c841344da0769bc374b16"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a3dd4b1a7","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"11c11f55b1d1d4f9d0d8ed2eeb8303014c914578a4be316c60f33e0bad135ba9"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a274c2623","datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"132d3e8d3b5da558c1377ed9b969cb54803a3174681d44e04ea10a59a52dccaa"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a21cb9fda","datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"1dc0cf9972030302c089f6d7eb8dc695d32d8d4a3e66204c97c8f2db349aa0f2"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a270f45b4","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"1e74eb08a5fae28c378b117309e37964be2960f18e822d7b18016055db1372a6"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"1e74eb08a5fae28c378b117309e37964be2960f18e822d7b18016055db1372a6"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"2186a4514d1590bcee0cfcbea87789e00946cd111bb498aecfe61e1585fef9de"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a6d21ef96","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"23d955f32c62fffe6f61184b6760a7d4377e0e7e4239c48ed7db39e4180541e9"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a1ec31a0a","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"26e951fdb4a7b64460cfff06c5e843682778d94150e0eeba86a20e5d6c1c616b"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a08f62dc6","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"2909c7c9f372362d3ff07418167d188c9321bc99833f76275141ce282355b434"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a79108408","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"2a292a5b24c52ba3358b50788541de8fbcf591dd3ff25ff3fdcf812967968d50"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a7808caef","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"347adf885fe99976d9018a2726a112c0a1bfa7b31f154683183e611b9e962827"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a22e193e8","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"3719ce44a1513cf196b398fabef37042d4143cdc344692a302562470c5e6a826"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":926650}}],[{"index":0,"txId":"393c1c074650730e35744aafdd1c1cddbfd5239bd9158d146bab3169297f7f99"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a390e3cc9","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"3b2b92a4704866d7821025e2fc20a6efea0e72115ba679660b137ea285345084"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a4d26ced2","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"3e631d65e4242707c276a27efa93278b65e9b10f1cc0a34bd294a07d4db7537f"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a3d27e8b5","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"3faa9020075e96dc364465c77ef56bcf9a09a25db60cc31a4b42714e2d5c35c2"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a06232fd1","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"41dcc4cb19373722ae9d1efb2c6a3a83524b4aa1d4ea5ed6ba1978a0ae7a6b00"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a50c8756f","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"45cc78ffea0b00390b301cf86461f00cec830e4aeea289c14027d3094ad3ee39"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a5c48870f","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"4894c66fe14d87e87f456f2037bc0b44bde72e45149cb6b6d2f4cc5ff3a9be47"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a09942a26","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"4bc9283b51f92fa59054855ed5cbb25798ed380e05448e594167ce2233a3ea6d"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"7de95a2dd324e9004bc1b1d5e94bb041e1921e1df78f192f9556f2ab3709f949","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"4cbb34520afecaa10e5058818854511010f45803e435eb9812242c977618e130"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a624d1aab","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"4d44b226db2c07cee6ff2682fa760456fe2e204ac2b063e0be141bcd31d28719"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a267a75d2","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"528276157465ae8fdceba5c3496c246f1831e5d12ff0ca90b07e162fb0c140ff"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a0d5d04f4","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"534c05604a9c223c2d0572c85df07dfb2d98a7fd9780a1d8880a5aba9501678c"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a013d4966","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"53509651ab426b075be84a9fe51264ee0d1a58e263df21129a300ba28b64d072"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a6e0163a1","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"54af7f66a97be725752025c3e45c890e344565b021171c491785062c0e79aabe"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"54af7f66a97be725752025c3e45c890e344565b021171c491785062c0e79aabe"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"5a8ecdd0f7856249f92bb3fd50c19a8636a4a91757e5bd0ad4cc964efb0cd226"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a274c2623","datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"5d42080e3ea1bfafe000c87370713ea637a55cd82ea54311ecf41edcd2af7a83"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a1642e394","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"5f5b31926d82540c98c3960944aa17690b3c983591b6420c102e163bacaf080b"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a69e4c1d3","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"6159f59125a8689cd691c65c804fe71e0278d1d2eb57f2cfc6eac187e25eae9b"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a258c7936","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"6299d542d865062f68249393e351997c79d60d806ff8105d5b5b5fddfdc56087"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a5abffdea","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"665ddd9b392cf43219f2b0f17f10244f750f09564c76f2a6fd942982a8ee6af4"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a23717219","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"6699ee59376f16b4b3d306ec3b75f30509f20de2df4dfd3a07b7ed759a2ae524"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a4d60b90d","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"685b5033c8e8f97f168ea91d58a9c44d114415935b1add8b4da3352fcab4203a"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a0b9677a6","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"6ca49f6477a7817db14ddeb3073e753118da73e63fc2ae19fad3851bd55ea556"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a1e322447","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"6ccf833dd62ec5c63081c18f87990465c93fec2743ef55a1a05099965fd31f5c"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a175c8e68","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"70bdef66cbd950788b4ed27ff742db89becd15a6e429d41884134fb8dbf1455e"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a135223f7","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"74ac2932bd53fcd312018ef05a938aeae80052ca14f39cb0c2da7589fef6f7bf"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a33508e57","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"76f7e129d4271fac3375c8e634098c5dc3be7586319e253959037addcf7a7826"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"c2feb1fae3dfae20d90dd1738bc87409c127b7e853dd4a0654f0267c4aaa4e38","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"78cc10cfa517c0d8aad95f945cd4ab9fbe73896af4c325098de5ecf37447da70"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"78cc10cfa517c0d8aad95f945cd4ab9fbe73896af4c325098de5ecf37447da70"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"81530d50fb73c199cc19b7895e171049162724903d9db5388fb3c9533edda767"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a737f1853","datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"83c331fa555c21998bab8e1b568e94eac656959d2224c5b0749251dd4167d7d8"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"83c331fa555c21998bab8e1b568e94eac656959d2224c5b0749251dd4167d7d8"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"8b7c915dc45fc6448da21915dd64eb11c19430eec2324af13712c3fa110882a4"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a15153ea7","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"8d216ce97e7201712e1903c81e76dcdee50a38d4577627dcc9e01cec15284e2a"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a72206656","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"8d4867ab38e5967dc416a23efce8ee41da4e6cbdca378eeedd8875ca8fbc397c"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a5690936a","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"8d864e64a0a33907faf3fcba60af9213b050801bdb7ab5676fa4da698643e8dc"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a1ae10bbf","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"97f49eab1f98f9c3bbb77f189e853abe8fc3c5527564e59625ffa102542910af"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a0d0f1956","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"a2544e9d4786b57840bcb29d61ad0d85281ac4053251ebe3d080f577027895e5"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"7f45b413e7aec0b73ca18a34ccfb7ea31897969e46a59a2e917e02a8f5f6b216","script":null,"value":{"assets":{},"coins":2000000}}],[{"index":0,"txId":"a410d1629a9744a3b12d25e1b046b031226afb1fd9bf697f536e92d0060341f6"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a27b1c7b4","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"abb7ad283869b201a5aaa71d01b0804f51c69b443ec9a26228831edfe2dda4e9"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"abb7ad283869b201a5aaa71d01b0804f51c69b443ec9a26228831edfe2dda4e9"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"ac7f58c472e6e7da7717b24176719af90c6a7969656ce9f20f4290aa620c2a11"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a6a4fa640","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"ace24c2c6a5976893b95380bba658153a0ea12fe0c413e5eb5fabf511e0426e5"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"ef331684af26d2630746a87c1c799658c33bbd463fb1bb5200f9e08d75b1cfcf","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"b0a9cb08baf2343ed2e008fa99e0c40870bf4a5808ea3bd557152717b448786b"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a0a4b5385","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"b126c71859f49acb0e66c752d230bfaefa17ba911651d0c381dc06fb45c83f7a"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":null,"script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":926650}}],[{"index":0,"txId":"c1ee07a1900d710aedae646583ae2d0addb908e30dbb041cd5b68816ba29e013"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"c5762253b5980109929bbec82a87ef22374b3171f91fe2b05fc051e4106321b8","script":null,"value":{"assets":{},"coins":2000000}}],[{"index":0,"txId":"c3a79a6e33e9f819c64705bb9f8f78b400df5f689565bb0d5d0aa44be5d66c76"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a3b530b5f","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"c49db08605e218cbafb03166abdebe9a67df562f73b67ddd9118e354aa551652"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"c49db08605e218cbafb03166abdebe9a67df562f73b67ddd9118e354aa551652"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"c534b4f3b1eed7fd0e6ff8d3d36edac27a1a9ac5b8d286db73bbf858d8b8c87a"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a710422fd","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"c7e9913980eb4f6737247a14696b13cb4716df4947bf3df5ef34909b41ee628e"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a453d71d1","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"c8d016048e4b3267e33d3e09c3ba07c1e9b525eebf878853acfd42bb15b50caa"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a00d4be85","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"ca3970327b8b4459086de32f4b8e9219ef61b53c38908e71f6b2a1ddd6a0ca52"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"6165f70b9ef2e55b6afbcd76cb954e0db41ad590023efab3a7ece63279c9c131","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"ca6b44e54fa9d6e03b05605e120109f887080592e95fd2261a0701556e959ed2"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a1f6c8e7d","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"cf0f1ca292155e58f02c8e5bd043e7d7a977dbaea2da4e77855bfc88767bc68b"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a181a24b1","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"cfef52763eeaaf74708cfc8a1f3b279a27df592cea535c63dbeb2009ebc9f7be"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":2000000}}],[{"index":1,"txId":"cfef52763eeaaf74708cfc8a1f3b279a27df592cea535c63dbeb2009ebc9f7be"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":0,"txId":"d667feb00c63e74f1396a15b55f5162dc810e1e73ca368e7abc85c7c13a93e92"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a0aad5901","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"d857214d81c415bd5ee82436b3e7fac80b13330e65915e1106251815e5eb2367"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"a0f6354afef3b494eb2631fa373a3afdb5637a37cf7977d634c0f2b3585daa92","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"db4b5a5d720cde36d12b044bbb50416c413aea2ed2082041969d1eeffa1517c3"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a233f96c1","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"e273e33644929cf75c588c62b942bc3809d9f09b1d652011c11285f4a7e40f45"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a51daf29f","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"e486d2fa59c4180394548c91628ec83bde3316ba3aa6d5bffeedfaafedaf69dd"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"d37538ff128704b6f6cab063873adf7269fbc0d74c1c4e5569e6e20e7af10729","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"f175000b7c8c46a9c5833c09f46eaad8d01a6b23d45d647dff391013533f445c"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"d99f5663f726f3c92e5bb860c0d8ed2658e69e72e77ec1a43b74612579fa2f57","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"f7652df0913dcafc960038dc73eb5780a956eef26a60a1c3f6a9da3c77fd563d"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"266306eff745869c186d153fedcd133d2f4576ecf69734e5a5b744974a70b596","script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"f96ebbe62e69e7b5afe95e50d7a98cab213ffc18c14258d09f4f1f4d68731356"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a1196c6f7","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"f9de6364e6690517cdd249384f04e3d29a1ce687934a21fdb7e491e4647cc5dc"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"dcb9d57264b06bb8c8e49ca79e730ce070eeb5127f2b0cfe936565a71a215a34","script":null,"value":{"assets":{},"coins":2000000}}],[{"index":0,"txId":"fa748dfef25e10dcc3b17251e416fbb17f39a9119d5126019bf62e24497affcf"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"f675d9bd238e391f837ae177e94428de15ba66ea86839125055891f9a36d3a4b","script":null,"value":{"assets":{},"coins":2000000}}],[{"index":0,"txId":"fb0bcf0c2e92d13b38182a4c1524ace28b566612c6c4be54468fcf2d1a025673"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"3a4bfc9219","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"fcbf04f3b6ac37f1c3fd6fffd9e61bbb03bd29e9893f3da454a07eddf1fe1ff7"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a570607c5","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}],[{"index":0,"txId":"ff9b105e2f444fd2ba0df3525e83071eb6534cea4db892703259bd1a2d4a5ae6"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"1a06705579","datumHash":null,"script":null,"value":{"assets":{},"coins":2479280}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-0f3cfe461ef12cb8b4fe098809df8824.json b/fixtures/test/ogmios/utxo-0f3cfe461ef12cb8b4fe098809df8824.json deleted file mode 100644 index afe9dce6a..000000000 --- a/fixtures/test/ogmios/utxo-0f3cfe461ef12cb8b4fe098809df8824.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"8785a4bec46dd68d7a702fccf60848cea6c7b3046367a3e0687e8f8bd52ed352"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"8785a4bec46dd68d7a702fccf60848cea6c7b3046367a3e0687e8f8bd52ed352"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":490862302823}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-2a97de472129f4670274098942f89427.json b/fixtures/test/ogmios/utxo-2a97de472129f4670274098942f89427.json deleted file mode 100644 index f7087d662..000000000 --- a/fixtures/test/ogmios/utxo-2a97de472129f4670274098942f89427.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"4dc27ee8d5b45bb72fc1ac014e5af7f3eb269f8a4ab495771d6453878fb8eb8c"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"4dc27ee8d5b45bb72fc1ac014e5af7f3eb269f8a4ab495771d6453878fb8eb8c"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491166700409}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-3162d868573db1663f89bfe084a436b8.json b/fixtures/test/ogmios/utxo-3162d868573db1663f89bfe084a436b8.json deleted file mode 100644 index 943f3d868..000000000 --- a/fixtures/test/ogmios/utxo-3162d868573db1663f89bfe084a436b8.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"033c65b0499bbd41da82034c8e68de450818c5c4a1b8d170bfca3403b31804c6"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":2400161}}],[{"index":2,"txId":"1666a110a07082f562167f4e7ff6a2ae23b475165bb2f2a5e9ce49393b1ce3c9"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{"771367873e016d67ba313db39968e7798656c10d6c436f10d6155bc6.7161636f696e7a6575657230":80,"771367873e016d67ba313db39968e7798656c10d6c436f10d6155bc6.7161636f696e7a6575657231":80,"771367873e016d67ba313db39968e7798656c10d6c436f10d6155bc6.7161636f696e7a6575657232":80,"771367873e016d67ba313db39968e7798656c10d6c436f10d6155bc6.7161636f696e7a6575657233":80,"771367873e016d67ba313db39968e7798656c10d6c436f10d6155bc6.7161636f696e7a6575657234":80},"coins":4000000}}],[{"index":1,"txId":"17b960276e24ce28069c4138db864038e2a4338f23c82ed5e29e58c975e64927"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":200000000}}],[{"index":0,"txId":"2d4be224276cd7166f0459f7e360737737338cc69220fc19e16eb401e12e4aa0"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"9e1199a988ba72ffd6e9c269cadb3b53b5f360ff99f112d9b2ee30c4d74ad88b","script":null,"value":{"assets":{},"coins":2400161}}],[{"index":0,"txId":"3dc59138866848d3b3210baa1818aab660913164a96d21aaa9d1aaad7d7aa0fe"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":2000161}}],[{"index":1,"txId":"4565d86864b06b97551785a6819c2dd0188a48d25e778bc472f739293f8b035e"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":200000000}}],[{"index":0,"txId":"4998abdfd1e5396c1c4a62e9653e58232fb024aa45a3e65a67b92e13c32fcde3"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":2400161}}],[{"index":1,"txId":"4beecee79dba952a122b9e0beb102271a873a5936eab1a7db355f784bf4e0687"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d8799f182aff","datumHash":null,"script":null,"value":{"assets":{},"coins":200000000}}],[{"index":0,"txId":"5a53e5ebb8fa69cd4a83aa110790ec6e4d02f673c8cfdb60d70aa4880ada6372"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":2400161}}],[{"index":1,"txId":"718be7efcc112cd179735d70b1bada08230ab79995b51c8a5ec5657231300f3c"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":200000000}}],[{"index":0,"txId":"74de507e7680c9910f83de80b33f348f0652b85e8eae86287400fa1a9674ea63"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":199823022}}],[{"index":0,"txId":"8040fbc51c8a92af73fdd490f1606a35ebbe5bad7833e26915e4ecb3873852b3"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":2400161}}],[{"index":0,"txId":"c802bb75805c0801488cd94486150c06a65bd283067f86db2bd6c7b7acd61442"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":4400080}}],[{"index":1,"txId":"dc75c99fee1db1be63205459f4f37239775a571e542d6c238ff0f0b5d24cb8b8"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{"a835ddd50365fbd94dd5d3a664e0d071ede9b92a420827ecf3c2bc78.7161636f696e616565776d30":80,"a835ddd50365fbd94dd5d3a664e0d071ede9b92a420827ecf3c2bc78.7161636f696e616565776d31":80,"a835ddd50365fbd94dd5d3a664e0d071ede9b92a420827ecf3c2bc78.7161636f696e616565776d32":80,"a835ddd50365fbd94dd5d3a664e0d071ede9b92a420827ecf3c2bc78.7161636f696e616565776d33":80,"a835ddd50365fbd94dd5d3a664e0d071ede9b92a420827ecf3c2bc78.7161636f696e616565776d34":80},"coins":4000000}}],[{"index":0,"txId":"e7eabf0367fe570e5723079b06c3a6623b205909162058103e5a74e3b518aad0"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":"d87980","datumHash":null,"script":null,"value":{"assets":{},"coins":3000000}}],[{"index":1,"txId":"e7eabf0367fe570e5723079b06c3a6623b205909162058103e5a74e3b518aad0"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec","script":{"plutus:v2":"480100002221200101"},"value":{"assets":{},"coins":1094740}}],[{"index":1,"txId":"ebba51f61b02f91be19a2b62210ac16dc95d2d73ecc7b26936da9bda12eef9d2"},{"address":"addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla","datum":null,"datumHash":"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273","script":null,"value":{"assets":{},"coins":200000000}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-363a529fd7b30ecc96e734ef692d542a.json b/fixtures/test/ogmios/utxo-363a529fd7b30ecc96e734ef692d542a.json deleted file mode 100644 index 3e8cec99c..000000000 --- a/fixtures/test/ogmios/utxo-363a529fd7b30ecc96e734ef692d542a.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"df8242152b033550fc1ec4ceee1a2d9d1b1857c948214796f50ba5829a3f56f5"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":5000000}}],[{"index":1,"txId":"df8242152b033550fc1ec4ceee1a2d9d1b1857c948214796f50ba5829a3f56f5"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{"16af70780a170994e8e5e575f4401b1d89bddf7d1a11d6264e0b0c85.74426967546f6b656e4e616d653132":24063788,"17eb5925c69a2b88cada90d7e07eb3fcf19c2f41b66697820fc77231.74426967546f6b656e4e616d653135":24063788,"238c008ef8ead5ec20bab5733f765f897bb405c0ccb9f752d2194c0a.74426967546f6b656e4e616d653136":24063788,"2e2f143b3ccbe339145183dc2a799a469e92ab56e0d5b0bd04f54f15.112233221100":20,"34250edd1e9836f5378702fbf9416b709bc140e04f668cc355208518":4,"34250edd1e9836f5378702fbf9416b709bc140e04f668cc355208518.4154414441636f696e":20,"48664e8d76f2b15606677bd117a3eac9929c378ac547ed295518dfd5.74426967546f6b656e4e616d653032":24063788,"52366a9f74840bb47d0509393c18343f376250de1a01e0a43619e471.74426967546f6b656e4e616d653038":24063788,"540fc78fe3097c41590b696a23844f8d0c9cf2a46328bb7b77b1c7a6.74426967546f6b656e4e616d653031":24063788,"6090278d9171cd5762f24e0a63f85fabb3db950fe9944f396ffa51a1.74426967546f6b656e4e616d653230":24063788,"67ea41e56ef3f2c19765b8740c297a73048bc1615e5c537f0889d4a1.74426967546f6b656e4e616d653134":24063788,"698a6ea0ca99f315034072af31eaac6ec11fe8558d3f48e9775aab9d.7444524950":1000000000,"6d01f1c6f5ced9070db252fbf1fbd517f67e9e8966326205d4f0e5ea.74426967546f6b656e4e616d653131":24063788,"783c70029a88a1575459215b648ab11d182bb1acc7d709aaabc02756.74426967546f6b656e4e616d653139":24063788,"819de34b4f37b6ae3743e37f16887cacf634a4e61f40d7f0b81e2017.74426967546f6b656e4e616d653039":24063788,"8538fdebcdb68ecbf1fcfd8f2dcb478e04007e32a76047fdd86406da.74426967546f6b656e4e616d653137":24063788,"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6174616461":1,"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.66756e6473":1,"8d18d786e92776c824607fd8e193ec535c79dc61ea2405ddf3b09fe3.6d617274696e6c616e67":1,"9a7646844194fb7f71b72fe5310e26a0ae013b3916bb1a24e7066a5d.7441444f":1000005,"a465391790543ecd0f9f769ea24afbfde07007baa782724735e085a8.74426967546f6b656e4e616d653036":24063788,"ab49c4983ea2cfd43dcc32279c5ef045bb39d331309f7f0e98da939a.7453554e444145":1000000,"bdbdd5dfd883c6c00765652910091a650a21dddb3758365831bb1771.74426967546f6b656e4e616d653138":24063788,"ca757ea0352f38978a0c3737ca85f885eae4b8051cea1434a3b07f5b.74426967546f6b656e4e616d653133":24063788,"cfc398182e8197a6b39cf2db07a207866074dca9165c3c61c7972f5e.74426967546f6b656e4e616d653035":24063788,"cfdff341e1f47450c9f3a347c6d6be2f2029c891a289fc041e8f956e.74426967546f6b656e4e616d653037":24063788,"d2e5d6dd927372b34b5da66cc7bee5dffd01351a49ac007efc9cea2d.74426967546f6b656e4e616d653034":24063788,"d311d3488cc4fef19d05634adce8534977a3bc6fc18136ad65df1d4f.6c71205301":1,"d40ebd57f674645d5b1826bbbe3528280463cae8f82982586faa4592.74426967546f6b656e4e616d653130":24063788,"d93a9c6d85ce15c3f19105f3be5b80c21e6c4ad3fb6b936b5b701715.434c4150":67000,"e64e887a5311dccc5a20438415fdbfe4071277a4c2ad6d3d08f13da0.74426967546f6b656e4e616d653033":24063788},"coins":11432880671}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-5cdb46215d0a19903563d94f6dbf56da.json b/fixtures/test/ogmios/utxo-5cdb46215d0a19903563d94f6dbf56da.json deleted file mode 100644 index 4b2f06e8a..000000000 --- a/fixtures/test/ogmios/utxo-5cdb46215d0a19903563d94f6dbf56da.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"30f4c0e9bf2fde50cc8d259b037709d012ff9a8301b9c6d40fa8ef471d440fff"},{"address":"addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t","datum":null,"datumHash":null,"script":null,"value":{"assets":{"6b8d07d69639e9413dd637a1a815a7323c69c86abbafb66dbfdb1aa7":1},"coins":5497316}}],[{"index":1,"txId":"5085c259cc9e09d1cf84550b829c95dc158c3027e7022fc2177bf8086ab1f496"},{"address":"addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t","datum":null,"datumHash":null,"script":null,"value":{"assets":{"2f7e0f588efe4e2836c829c50619a498ddf5521255bf5e1e9f9f5a13.46616b65555344":261},"coins":71262996}}],[{"index":3,"txId":"8bdfcfa7faa87f32c624700d1bec7fb0cd3af0ed3fb9e7a5e1121bc52433e645"},{"address":"addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t","datum":null,"datumHash":null,"script":null,"value":{"assets":{"ac1eb8870807125c83e2629d4e833f6e658c70eff57be83fde97f632.7374756666":5,"ac1eb8870807125c83e2629d4e833f6e658c70eff57be83fde97f632.74686174":3},"coins":15000000}}],[{"index":0,"txId":"a57451725fffff3ab22d136f39a333f9e42247ef5f46dabfcc1ae00ef85d2ee1"},{"address":"addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":2760077706}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-5eabe578ab04685dfdd389f51fa49c74.json b/fixtures/test/ogmios/utxo-5eabe578ab04685dfdd389f51fa49c74.json deleted file mode 100644 index 1425109c1..000000000 --- a/fixtures/test/ogmios/utxo-5eabe578ab04685dfdd389f51fa49c74.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"1c7c5e1af95ff0250fc88d19cca393e21c28a2a2a944636f6255790a892f3f23"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"1c7c5e1af95ff0250fc88d19cca393e21c28a2a2a944636f6255790a892f3f23"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491136110345}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-681f7f01fe06ae75d83187cda28c376e.json b/fixtures/test/ogmios/utxo-681f7f01fe06ae75d83187cda28c376e.json deleted file mode 100644 index d0aafe844..000000000 --- a/fixtures/test/ogmios/utxo-681f7f01fe06ae75d83187cda28c376e.json +++ /dev/null @@ -1 +0,0 @@ -[[{"txId":"2208e439244a1d0ef238352e3693098aba9de9dd0154f9056551636c8ed15dc1","index":6},{"address":"addr_test12zckk4h4asryhe4v8j4kqd0046rtxekv8hz2p4t3vq7hpev2vcrqxw2dvk6","value":{"coins":15,"assets":{"0d94e174732ef9aae73f395ab44507bfa983d65023c11a951f0c32e4.0100050404":11,"0d94e174732ef9aae73f395ab44507bfa983d65023c11a951f0c32e4.0300070405":13,"a646474b8f5431261506b6c273d307c7569a4eb6c96b42dd4a29520a":8,"a646474b8f5431261506b6c273d307c7569a4eb6c96b42dd4a29520a.010504":1,"b16b56f5ec064be6ac3cab6035efae86b366cc3dc4a0d571603d70e5.00":11}},"datumHash":"4f539156bfbefc070a3b61cad3d1cedab3050e2b2a62f0ffe16a43eb0edc1ce8","datum":null,"script":null}],[{"txId":"4f539156bfbefc070a3b61cad3d1cedab3050e2b2a62f0ffe16a43eb0edc1ce8","index":2},{"address":"addr_test12rkvh76uvxt88ury3fpvctuz9jquhs62aeqjw33cazd84avrlg6q2qgqmtmc5","value":{"coins":6,"assets":{"3542acb3a64d80c29302260d62c3b87a742ad14abf855ebc6733081e.070403010000":6,"58e1b65718531b42494610c506cef10ff031fa817a8ff75c0ab180e7.010201":4,"65fc709a5e019b8aba76f6977c1c8770e4b36fa76f434efc588747b7":13,"b5ae663aaea8e500157bdf4baafd6f5ba0ce5759f7cd4101fc132f54.06050700":4,"bd039f956f4b302f3ab6fc7c4bac3350a540f44af81a8492194dd2c2.05":10}},"datumHash":"bfa726c3c149165b108e6ff550cb1a1c4f0fdc2e9f26a9a16f48babe73b600ce","datum":null,"script":null}],[{"txId":"e88bd757ad5b9bedf372d8d3f0cf6c962a469db61a265f6418e1ffed86da29ec","index":4},{"address":"addr_test1gq659t9n5excps5nqgnq6ckrhpa8g2k3f2lc2h4uvuess85ymgmsspswmq6kk","value":{"coins":2,"assets":{"3542acb3a64d80c29302260d62c3b87a742ad14abf855ebc6733081e.020802050801":11,"3542acb3a64d80c29302260d62c3b87a742ad14abf855ebc6733081e.0607000301":6,"65fc709a5e019b8aba76f6977c1c8770e4b36fa76f434efc588747b7":5,"a646474b8f5431261506b6c273d307c7569a4eb6c96b42dd4a29520a.020802040307":5}},"datumHash":"03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314","datum":null,"script":null}],[{"txId":"ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25","index":7},{"address":"addr_test1yz66ue36465w2qq40005h2hadad6pnjht8mu6sgplsfj74p4g2kt8fjdsrpfxq3xp43v8wr6ws4dzj4ls40tceenpq0qjnyppa","value":{"coins":12,"assets":{"58e1b65718531b42494610c506cef10ff031fa817a8ff75c0ab180e7.08":1,"bd039f956f4b302f3ab6fc7c4bac3350a540f44af81a8492194dd2c2.00070200":10}},"datumHash":null,"datum":"424893","script":{"native":{"all":[{"any":[{"startsAt":97176}]},{"expiresAt":20162},{"all":[{"all":["b16b56f5ec064be6ac3cab6035efae86b366cc3dc4a0d571603d70e5"]},{"any":["76e607db2a31c9a2c32761d2431a186a550cc321f79cd8d6a82b29b8"]},"e0a714319812c3f773ba04ec5d6b3ffcd5aad85006805b047b082541"]}]}}}],[{"txId":"e88bd757ad5b9bedf372d8d3f0cf6c962a469db61a265f6418e1ffed86da29ec","index":5},{"address":"addr12y659t9n5excps5nqgnq6ckrhpa8g2k3f2lc2h4uvuess85r390svpqf9ldq3","value":{"coins":0,"assets":{"4acf2773917c7b547c576a7ff110d2ba5733c1f1ca9cdc659aea3a56.040801":16,"4acf2773917c7b547c576a7ff110d2ba5733c1f1ca9cdc659aea3a56.06":6}},"datumHash":null,"datum":"448f9aabd7","script":null}],[{"txId":"0268be9dbd0446eaa217e1dec8f399249305e551d7fc1437dd84521f74aa621c","index":6},{"address":"addr1qx66ue36465w2qq40005h2hadad6pnjht8mu6sgplsfj74r9l3cf5hspnw9t5ahkja7pepmsujeklfm0gd80cky8g7ms5drrgh","value":{"coins":2,"assets":{}},"datumHash":null,"datum":"05","script":null}],[{"txId":"bb30a42c1e62f0afda5f0a4e8a562f7a13a24cea00ee81917b86b89e801314aa","index":5},{"address":"addr_test1xq659t9n5excps5nqgnq6ckrhpa8g2k3f2lc2h4uvuess8n9l3cf5hspnw9t5ahkja7pepmsujeklfm0gd80cky8g7msa0ujqs","value":{"coins":13,"assets":{"58e1b65718531b42494610c506cef10ff031fa817a8ff75c0ab180e7.080301000006":3,"bd039f956f4b302f3ab6fc7c4bac3350a540f44af81a8492194dd2c2.060501":7,"bd039f956f4b302f3ab6fc7c4bac3350a540f44af81a8492194dd2c2.0608":12}},"datumHash":null,"datum":null,"script":null}],[{"txId":"bfa726c3c149165b108e6ff550cb1a1c4f0fdc2e9f26a9a16f48babe73b600ce","index":4},{"address":"addr_test12q659t9n5excps5nqgnq6ckrhpa8g2k3f2lc2h4uvuess85y3y4swps9th6y4","value":{"coins":3,"assets":{"4acf2773917c7b547c576a7ff110d2ba5733c1f1ca9cdc659aea3a56.05060503":3,"58e1b65718531b42494610c506cef10ff031fa817a8ff75c0ab180e7.0104":10,"58e1b65718531b42494610c506cef10ff031fa817a8ff75c0ab180e7.02020402":4,"b5ae663aaea8e500157bdf4baafd6f5ba0ce5759f7cd4101fc132f54.01":7,"bd039f956f4b302f3ab6fc7c4bac3350a540f44af81a8492194dd2c2":15}},"datumHash":null,"datum":null,"script":null}],[{"txId":"0268be9dbd0446eaa217e1dec8f399249305e551d7fc1437dd84521f74aa621c","index":7},{"address":"addr1qx66ue36465w2qq40005h2hadad6pnjht8mu6sgplsfj74r9l3cf5hspnw9t5ahkja7pepmsujeklfm0gd80cky8g7ms5drrgh","value":{"coins":2,"assets":{}},"datumHash":null,"datum":null,"script":null}]] diff --git a/fixtures/test/ogmios/utxo-72527648b478af0745e650679f674f26.json b/fixtures/test/ogmios/utxo-72527648b478af0745e650679f674f26.json deleted file mode 100644 index 781004ea0..000000000 --- a/fixtures/test/ogmios/utxo-72527648b478af0745e650679f674f26.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"96b1e8dd41ac514beef5c2d1392a6753027303d1a70e38b869c22ec7f28146b2"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"96b1e8dd41ac514beef5c2d1392a6753027303d1a70e38b869c22ec7f28146b2"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491141134250}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-7736c8109ebdd6b31eff13fb763c211f.json b/fixtures/test/ogmios/utxo-7736c8109ebdd6b31eff13fb763c211f.json deleted file mode 100644 index 4d90b1b5b..000000000 --- a/fixtures/test/ogmios/utxo-7736c8109ebdd6b31eff13fb763c211f.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"9cc22a3462c774d916f81ce060b0aef9ea9ca0534b21c1e39902ab5145853b94"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"9cc22a3462c774d916f81ce060b0aef9ea9ca0534b21c1e39902ab5145853b94"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491088657701}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-9c0cc3314813f1354f1398e17ef66032.json b/fixtures/test/ogmios/utxo-9c0cc3314813f1354f1398e17ef66032.json deleted file mode 100644 index 796cce105..000000000 --- a/fixtures/test/ogmios/utxo-9c0cc3314813f1354f1398e17ef66032.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"2738534caeafd3240c23165c4c6a9b8297f120a49eecc1b2cb71922a3b3ca7fe"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"2738534caeafd3240c23165c4c6a9b8297f120a49eecc1b2cb71922a3b3ca7fe"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491097102147}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-b9d011480174e54980dc3c4026f9d0f1.json b/fixtures/test/ogmios/utxo-b9d011480174e54980dc3c4026f9d0f1.json deleted file mode 100644 index 25dcd82f4..000000000 --- a/fixtures/test/ogmios/utxo-b9d011480174e54980dc3c4026f9d0f1.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"145261618fb064284bc7f1d8fd3ecdcd893eabc2dc7cb5b91d5adf090c26b9d2"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"145261618fb064284bc7f1d8fd3ecdcd893eabc2dc7cb5b91d5adf090c26b9d2"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491142335552}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-d751713988987e9331980363e24189ce.json b/fixtures/test/ogmios/utxo-d751713988987e9331980363e24189ce.json deleted file mode 100644 index 0637a088a..000000000 --- a/fixtures/test/ogmios/utxo-d751713988987e9331980363e24189ce.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-e62e3b660031b7653f02efc9406fd692.json b/fixtures/test/ogmios/utxo-e62e3b660031b7653f02efc9406fd692.json deleted file mode 100644 index 390c26e41..000000000 --- a/fixtures/test/ogmios/utxo-e62e3b660031b7653f02efc9406fd692.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"16ec5aa777b1724c5bddce9077356cb1e59c04e4136e1b28415d1d7a825dae96"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":1000000}}],[{"index":1,"txId":"16ec5aa777b1724c5bddce9077356cb1e59c04e4136e1b28415d1d7a825dae96"},{"address":"addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":491143545038}}]] \ No newline at end of file diff --git a/fixtures/test/ogmios/utxo-ef19a5efd09808def062e916aa2e5df5.json b/fixtures/test/ogmios/utxo-ef19a5efd09808def062e916aa2e5df5.json deleted file mode 100644 index 482fe9f31..000000000 --- a/fixtures/test/ogmios/utxo-ef19a5efd09808def062e916aa2e5df5.json +++ /dev/null @@ -1 +0,0 @@ -[[{"index":0,"txId":"c6a1c03c473753c932277634a39e8a3bacf4ae792eac174ab1e1b272d142db1f"},{"address":"addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t","datum":null,"datumHash":null,"script":null,"value":{"assets":{},"coins":20186944}}]] \ No newline at end of file diff --git a/fixtures/test/parsing/JsonWsp/UtxoQueryResponse.json b/fixtures/test/parsing/JsonWsp/UtxoQueryResponse.json deleted file mode 100644 index c8e52beee..000000000 --- a/fixtures/test/parsing/JsonWsp/UtxoQueryResponse.json +++ /dev/null @@ -1,24 +0,0 @@ -[ - { - "type": "jsonwsp/response", - "version": "1.0", - "servicename": "ogmios", - "methodname": "Query", - "result": [ - [ - { - "index": 0, - "txId": "c6a1c03c473753c932277634a39e8a3bacf4ae792eac174ab1e1b272d142db1f" - }, - { - "address": "addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t", - "datum": null, - "datumHash": null, - "script": null, - "value": { "assets": {}, "coins": 20186944 } - } - ] - ], - "reflection": "Hello123" - } -] diff --git a/flake.lock b/flake.lock index a63ed223d..3a8562dcd 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "CHaP": { "flake": false, "locked": { - "lastModified": 1669917887, - "narHash": "sha256-9bsEaFh2lb26dZNUL+P4/LIzkTZH5NC7n9SprKzB/2A=", + "lastModified": 1702742788, + "narHash": "sha256-lSU0M27LC0d60cJ2C2Kdo6gBwTCCYRiALbD528CoTtc=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "85510200dd0dc758d72bc1ada11ff5855e5d46b7", + "rev": "4a236a8ad9e3c6d20235de27eacbe3d4de72479c", "type": "github" }, "original": { @@ -20,11 +20,11 @@ "CHaP_2": { "flake": false, "locked": { - "lastModified": 1666726035, - "narHash": "sha256-EBodp9DJb8Z+aVbuezVwLJ9Q9XIJUXFd/n2skay3FeU=", + "lastModified": 1686070892, + "narHash": "sha256-0yAYqvCg2/aby4AmW0QQK9RKnU1siQczfbUC6hOU02w=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "b074321c4c8cbf2c3789436ab11eaa43e1c441a7", + "rev": "596cf203a0a1ba252a083a79d384325000faeb49", "type": "github" }, "original": { @@ -37,28 +37,28 @@ "CHaP_3": { "flake": false, "locked": { - "lastModified": 1666726035, - "narHash": "sha256-EBodp9DJb8Z+aVbuezVwLJ9Q9XIJUXFd/n2skay3FeU=", + "lastModified": 1695160702, + "narHash": "sha256-+Mfc6eGA1ZwQ/ZjKzMoMWkHzd+sgR1JbxY0i849HjEU=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "b074321c4c8cbf2c3789436ab11eaa43e1c441a7", + "rev": "9932690af3713ef034c928850252eb1b88450ee6", "type": "github" }, "original": { "owner": "input-output-hk", + "ref": "repo", "repo": "cardano-haskell-packages", - "rev": "b074321c4c8cbf2c3789436ab11eaa43e1c441a7", "type": "github" } }, "CHaP_4": { "flake": false, "locked": { - "lastModified": 1669289866, - "narHash": "sha256-dnRYWjYZQuNJLXsn5PdcMBPaReDYVARqc8a2grokVZ0=", + "lastModified": 1694601145, + "narHash": "sha256-p7ZxorrOvoow6N+JKvfrCiRYFtUSPiEMgt8MR+rcTT4=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "c3cebaddd8b60c0b5bcef6d895adb30a79f495a8", + "rev": "e8298604717dbaa311c1e42e021b571670f4b039", "type": "github" }, "original": { @@ -84,7 +84,7 @@ "type": "github" } }, - "HTTP_10": { + "HTTP_2": { "flake": false, "locked": { "lastModified": 1451647621, @@ -100,7 +100,7 @@ "type": "github" } }, - "HTTP_11": { + "HTTP_3": { "flake": false, "locked": { "lastModified": 1451647621, @@ -116,7 +116,7 @@ "type": "github" } }, - "HTTP_12": { + "HTTP_4": { "flake": false, "locked": { "lastModified": 1451647621, @@ -132,7 +132,7 @@ "type": "github" } }, - "HTTP_2": { + "HTTP_5": { "flake": false, "locked": { "lastModified": 1451647621, @@ -148,7 +148,7 @@ "type": "github" } }, - "HTTP_3": { + "HTTP_6": { "flake": false, "locked": { "lastModified": 1451647621, @@ -164,7 +164,7 @@ "type": "github" } }, - "HTTP_4": { + "HTTP_7": { "flake": false, "locked": { "lastModified": 1451647621, @@ -180,537 +180,790 @@ "type": "github" } }, - "HTTP_5": { - "flake": false, + "agenix": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641576265, + "narHash": "sha256-G4W39k5hdu2kS13pi/RhyTOySAo7rmrs7yMUZRH0OZI=", + "owner": "ryantm", + "repo": "agenix", + "rev": "08b9c96878b2f9974fc8bde048273265ad632357", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "HTTP_6": { - "flake": false, + "agenix-cli": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_10" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641404293, + "narHash": "sha256-0+QVY1sDhGF4hAN6m2FdKZgm9V1cuGGjY4aitRBnvKg=", + "owner": "cole-h", + "repo": "agenix-cli", + "rev": "77fccec4ed922a0f5f55ed964022b0db7d99f07d", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "cole-h", + "repo": "agenix-cli", "type": "github" } }, - "HTTP_7": { - "flake": false, + "agenix-cli_2": { + "inputs": { + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_12" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641404293, + "narHash": "sha256-0+QVY1sDhGF4hAN6m2FdKZgm9V1cuGGjY4aitRBnvKg=", + "owner": "cole-h", + "repo": "agenix-cli", + "rev": "77fccec4ed922a0f5f55ed964022b0db7d99f07d", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "cole-h", + "repo": "agenix-cli", "type": "github" } }, - "HTTP_8": { - "flake": false, + "agenix-cli_3": { + "inputs": { + "flake-utils": "flake-utils_18", + "nixpkgs": "nixpkgs_41" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641404293, + "narHash": "sha256-0+QVY1sDhGF4hAN6m2FdKZgm9V1cuGGjY4aitRBnvKg=", + "owner": "cole-h", + "repo": "agenix-cli", + "rev": "77fccec4ed922a0f5f55ed964022b0db7d99f07d", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "cole-h", + "repo": "agenix-cli", "type": "github" } }, - "HTTP_9": { - "flake": false, + "agenix_2": { + "inputs": { + "nixpkgs": "nixpkgs_11" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641576265, + "narHash": "sha256-G4W39k5hdu2kS13pi/RhyTOySAo7rmrs7yMUZRH0OZI=", + "owner": "ryantm", + "repo": "agenix", + "rev": "08b9c96878b2f9974fc8bde048273265ad632357", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank": { + "agenix_3": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1640802000, + "narHash": "sha256-ZiI94Zv/IgW64fqKrtVaQqfUCkn9STvAjgfFmvtqcQ8=", + "owner": "ryantm", + "repo": "agenix", + "rev": "c5558c88b2941bf94886dfdede6926b1ba5f5629", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_2": { + "agenix_4": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1643841757, + "narHash": "sha256-9tKhu4JzoZvustC9IEWK6wKcDhPLuK/ICbLgm8QnLnk=", + "owner": "ryantm", + "repo": "agenix", + "rev": "a17d1f30550260f8b45764ddbd0391f4b1ed714a", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_3": { + "agenix_5": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1640802000, + "narHash": "sha256-ZiI94Zv/IgW64fqKrtVaQqfUCkn9STvAjgfFmvtqcQ8=", + "owner": "ryantm", + "repo": "agenix", + "rev": "c5558c88b2941bf94886dfdede6926b1ba5f5629", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_4": { + "agenix_6": { + "inputs": { + "nixpkgs": "nixpkgs_40" + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1641576265, + "narHash": "sha256-G4W39k5hdu2kS13pi/RhyTOySAo7rmrs7yMUZRH0OZI=", + "owner": "ryantm", + "repo": "agenix", + "rev": "08b9c96878b2f9974fc8bde048273265ad632357", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_5": { + "agenix_7": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1640802000, + "narHash": "sha256-ZiI94Zv/IgW64fqKrtVaQqfUCkn9STvAjgfFmvtqcQ8=", + "owner": "ryantm", + "repo": "agenix", + "rev": "c5558c88b2941bf94886dfdede6926b1ba5f5629", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "bot-plutus-interface": { + "agenix_8": { "inputs": { - "CHaP": "CHaP_4", - "flake-compat": "flake-compat_11", - "haskell-nix": "haskell-nix_4", - "iohk-nix": "iohk-nix_4", "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "nixpkgs-unstable" + "db-sync", + "cardano-world", + "capsules", + "ragenix", + "nixpkgs" ] }, "locked": { - "lastModified": 1670496765, - "narHash": "sha256-5feLJXmLFwTnGEoYmRFcGiViYU1egIlzuKbwlilTa7g=", - "owner": "mlabs-haskell", - "repo": "bot-plutus-interface", - "rev": "e80680777a761109eea6d47c8370aa55d318734d", + "lastModified": 1643841757, + "narHash": "sha256-9tKhu4JzoZvustC9IEWK6wKcDhPLuK/ICbLgm8QnLnk=", + "owner": "ryantm", + "repo": "agenix", + "rev": "a17d1f30550260f8b45764ddbd0391f4b1ed714a", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "bot-plutus-interface", - "rev": "e80680777a761109eea6d47c8370aa55d318734d", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "cabal-32": { - "flake": false, + "alejandra": { + "inputs": { + "flakeCompat": "flakeCompat", + "nixpkgs": "nixpkgs_35" + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1646360966, + "narHash": "sha256-fJ/WHSU45bMJRDqz9yA3B2lwXtW5DKooU+Pzn13GyZI=", + "owner": "kamadorueda", + "repo": "alejandra", + "rev": "511c3f6a88b6964e1496fb6f441f4ae5e58bd3ea", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "kamadorueda", + "repo": "alejandra", "type": "github" } }, - "cabal-32_10": { + "bats-assert": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1636059754, + "narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=", + "owner": "bats-core", + "repo": "bats-assert", + "rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-assert", "type": "github" } }, - "cabal-32_11": { + "bats-assert_2": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1636059754, + "narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=", + "owner": "bats-core", + "repo": "bats-assert", + "rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-assert", "type": "github" } }, - "cabal-32_12": { + "bats-assert_3": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1636059754, + "narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=", + "owner": "bats-core", + "repo": "bats-assert", + "rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-assert", "type": "github" } }, - "cabal-32_2": { + "bats-support": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1548869839, + "narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=", + "owner": "bats-core", + "repo": "bats-support", + "rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-support", "type": "github" } }, - "cabal-32_3": { + "bats-support_2": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1548869839, + "narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=", + "owner": "bats-core", + "repo": "bats-support", + "rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-support", "type": "github" } }, - "cabal-32_4": { + "bats-support_3": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1548869839, + "narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=", + "owner": "bats-core", + "repo": "bats-support", + "rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-support", "type": "github" } }, - "cabal-32_5": { - "flake": false, + "bitte": { + "inputs": { + "agenix": "agenix", + "agenix-cli": "agenix-cli", + "blank": "blank_2", + "capsules": "capsules", + "data-merge": "data-merge", + "deploy": "deploy_2", + "fenix": "fenix_4", + "hydra": "hydra_3", + "n2c": "n2c_2", + "nix": "nix_5", + "nixpkgs": "nixpkgs_29", + "nixpkgs-docker": "nixpkgs-docker", + "nixpkgs-unstable": "nixpkgs-unstable_3", + "nomad-driver-nix": "nomad-driver-nix_2", + "nomad-follower": "nomad-follower_2", + "ops-lib": "ops-lib_3", + "ragenix": "ragenix_3", + "std": "std_2", + "terranix": "terranix_2", + "utils": "utils_12" + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1661790449, + "narHash": "sha256-lh1MlCOJE/LJMChGLREATWPnN9oKkjFFjnTvc9pX4Uo=", + "owner": "input-output-hk", + "repo": "bitte", + "rev": "f452ea2c392a4a301c1feb20955c7d0a4ad38130", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "bitte", "type": "github" } }, - "cabal-32_6": { - "flake": false, + "bitte-cells": { + "inputs": { + "cardano-db-sync": [ + "db-sync", + "cardano-world", + "cardano-db-sync" + ], + "cardano-iohk-nix": [ + "db-sync", + "cardano-world", + "iohk-nix" + ], + "cardano-node": [ + "db-sync", + "cardano-world", + "cardano-node" + ], + "cardano-wallet": [ + "db-sync", + "cardano-world", + "cardano-wallet" + ], + "cicero": "cicero", + "data-merge": [ + "db-sync", + "cardano-world", + "data-merge" + ], + "n2c": [ + "db-sync", + "cardano-world", + "n2c" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "nixpkgs" + ], + "std": [ + "db-sync", + "cardano-world", + "std" + ] + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1660761733, + "narHash": "sha256-Xqf6yRnjJXJ8jbwL9rlci8Z91tVDVwk3lorD6SnZuIg=", + "owner": "input-output-hk", + "repo": "bitte-cells", + "rev": "433bbca40bf461a86d55f202d26f87c9f5206377", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "bitte-cells", "type": "github" } }, - "cabal-32_7": { - "flake": false, + "bitte_2": { + "inputs": { + "agenix": "agenix_2", + "agenix-cli": "agenix-cli_2", + "blank": "blank_3", + "deploy": "deploy", + "fenix": "fenix_2", + "hydra": "hydra_2", + "nix": "nix_2", + "nixpkgs": "nixpkgs_15", + "nixpkgs-unstable": "nixpkgs-unstable_2", + "nomad": "nomad", + "nomad-driver-nix": "nomad-driver-nix", + "nomad-follower": "nomad-follower", + "ops-lib": "ops-lib_2", + "ragenix": "ragenix", + "terranix": "terranix", + "utils": "utils_7", + "vulnix": "vulnix" + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1649886949, + "narHash": "sha256-tvOo6cTtJGGCCzntAK8L7s6EmQ+PIAdN0wUvnpVFPCs=", + "owner": "input-output-hk", + "repo": "bitte", + "rev": "5df2f7e2cac09f0755dc8615ea0bd3cbc8884cd5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "bitte", + "type": "github" + } + }, + "bitte_3": { + "inputs": { + "agenix": "agenix_6", + "agenix-cli": "agenix-cli_3", + "blank": "blank_4", + "deploy": "deploy_3", + "fenix": "fenix_6", + "hydra": "hydra_4", + "nix": "nix_9", + "nixpkgs": "nixpkgs_44", + "nixpkgs-unstable": "nixpkgs-unstable_4", + "nomad": "nomad_2", + "nomad-driver-nix": "nomad-driver-nix_3", + "nomad-follower": "nomad-follower_3", + "ops-lib": "ops-lib_4", + "ragenix": "ragenix_4", + "terranix": "terranix_3", + "utils": "utils_21", + "vulnix": "vulnix_2" + }, + "locked": { + "lastModified": 1649886949, + "narHash": "sha256-tvOo6cTtJGGCCzntAK8L7s6EmQ+PIAdN0wUvnpVFPCs=", + "owner": "input-output-hk", + "repo": "bitte", + "rev": "5df2f7e2cac09f0755dc8615ea0bd3cbc8884cd5", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "bitte", + "type": "github" + } + }, + "blank": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_2": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_3": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_4": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_5": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blockfrost": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1693412637, + "narHash": "sha256-uA2U7ZCdWv2Rxmi10uaMNNw8tiMbgcu2nnO6NTNp3VE=", + "owner": "blockfrost", + "repo": "blockfrost-backend-ryo", + "rev": "8d455ab1f710b7bd27d2aa87c82f0c5129101647", + "type": "github" + }, + "original": { + "owner": "blockfrost", + "ref": "v1.7.0", + "repo": "blockfrost-backend-ryo", "type": "github" } }, - "cabal-32_8": { + "blst": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1656163412, + "narHash": "sha256-xero1aTe2v4IhWIJaEDUsVDOfE77dOV5zKeHWntHogY=", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", "type": "github" } }, - "cabal-32_9": { + "blst_2": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1656163412, + "narHash": "sha256-xero1aTe2v4IhWIJaEDUsVDOfE77dOV5zKeHWntHogY=", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", "type": "github" } }, - "cabal-34": { + "byron-chain": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "lastModified": 1557232434, + "narHash": "sha256-2rclcOjIVq0lFCdYAa8S9imzZZHqySn2LZ/O48hUofw=", + "owner": "input-output-hk", + "repo": "cardano-mainnet-mirror", + "rev": "a31ac7534ec855b715b9a6bb6a06861ee94935d9", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "cardano-mainnet-mirror", "type": "github" } }, - "cabal-34_10": { + "cabal-32": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_11": { + "cabal-32_2": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_12": { + "cabal-32_3": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_2": { + "cabal-32_4": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_3": { + "cabal-32_5": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_4": { + "cabal-32_6": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_5": { + "cabal-32_7": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_6": { + "cabal-34": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1645834128, + "narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "5ff598c67f53f7c4f48e31d722ba37172230c462", "type": "github" }, "original": { @@ -720,7 +973,7 @@ "type": "github" } }, - "cabal-34_7": { + "cabal-34_2": { "flake": false, "locked": { "lastModified": 1640353650, @@ -737,14 +990,14 @@ "type": "github" } }, - "cabal-34_8": { + "cabal-34_3": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { @@ -754,14 +1007,14 @@ "type": "github" } }, - "cabal-34_9": { + "cabal-34_4": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { @@ -771,65 +1024,65 @@ "type": "github" } }, - "cabal-36": { + "cabal-34_5": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.6", + "ref": "3.4", "repo": "cabal", "type": "github" } }, - "cabal-36_10": { + "cabal-34_6": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "lastModified": 1645834128, + "narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=", "owner": "haskell", "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "rev": "5ff598c67f53f7c4f48e31d722ba37172230c462", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.6", + "ref": "3.4", "repo": "cabal", "type": "github" } }, - "cabal-36_2": { + "cabal-34_7": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.6", + "ref": "3.4", "repo": "cabal", "type": "github" } }, - "cabal-36_3": { + "cabal-36": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1669081697, + "narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144", "type": "github" }, "original": { @@ -839,14 +1092,14 @@ "type": "github" } }, - "cabal-36_4": { + "cabal-36_2": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1641652457, + "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "f27667f8ec360c475027dcaee0138c937477b070", "type": "github" }, "original": { @@ -856,7 +1109,7 @@ "type": "github" } }, - "cabal-36_5": { + "cabal-36_3": { "flake": false, "locked": { "lastModified": 1641652457, @@ -873,7 +1126,7 @@ "type": "github" } }, - "cabal-36_6": { + "cabal-36_4": { "flake": false, "locked": { "lastModified": 1641652457, @@ -890,14 +1143,14 @@ "type": "github" } }, - "cabal-36_7": { + "cabal-36_5": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1641652457, + "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "f27667f8ec360c475027dcaee0138c937477b070", "type": "github" }, "original": { @@ -907,14 +1160,14 @@ "type": "github" } }, - "cabal-36_8": { + "cabal-36_6": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1669081697, + "narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144", "type": "github" }, "original": { @@ -924,7 +1177,7 @@ "type": "github" } }, - "cabal-36_9": { + "cabal-36_7": { "flake": false, "locked": { "lastModified": 1641652457, @@ -941,152 +1194,147 @@ "type": "github" } }, - "cardano-configurations": { - "flake": false, + "capsules": { + "inputs": { + "bitte": "bitte_2", + "iogo": "iogo", + "nixpkgs": "nixpkgs_23", + "ragenix": "ragenix_2" + }, "locked": { - "lastModified": 1671845278, - "narHash": "sha256-oOycxAu9kARfyUvkdjeq80Em7b+vP9XsBii8836f9yQ=", + "lastModified": 1658156716, + "narHash": "sha256-c1lH7PIN0rTKdGgosD5fCsHoAklAtGR/E1DFT2exIkM=", "owner": "input-output-hk", - "repo": "cardano-configurations", - "rev": "36a75a920de312519c3a9086061daccb997f9cd0", + "repo": "devshell-capsules", + "rev": "88348a415130cee29ce187140e6f57d94d843d54", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-configurations", + "repo": "devshell-capsules", "type": "github" } }, - "cardano-configurations_2": { - "flake": false, + "capsules_2": { + "inputs": { + "bitte": "bitte_3", + "iogo": "iogo_2", + "nixpkgs": "nixpkgs_52", + "ragenix": "ragenix_5" + }, "locked": { - "lastModified": 1670462928, - "narHash": "sha256-nPeMzKeMAVTtWOBaYzC6xU/J0UCA79u3JBOk9mFKdF0=", + "lastModified": 1659466315, + "narHash": "sha256-VqR1PaC7lb4uT/s38lDNYvwhF2yQuD13KwGBoMCxF4g=", "owner": "input-output-hk", - "repo": "cardano-configurations", - "rev": "5d3dfead99eca0996c5b838a5fbccc94eb670df5", + "repo": "devshell-capsules", + "rev": "125b8665c6139e3a127d243534a4f0ce36e3a335", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-configurations", + "repo": "devshell-capsules", "type": "github" } }, - "cardano-configurations_3": { - "flake": false, - "locked": { - "lastModified": 1667387423, - "narHash": "sha256-oOycxAu9kARfyUvkdjeq80Em7b+vP9XsBii8836f9yQ=", - "owner": "input-output-hk", - "repo": "cardano-configurations", - "rev": "c0d11b5ff0c0200da00a50c17c38d9fd752ba532", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-configurations", - "type": "github" - } - }, - "cardano-mainnet-mirror": { + "cardano-automation": { "inputs": { - "nixpkgs": "nixpkgs_3" + "flake-utils": "flake-utils", + "haskellNix": [ + "cardano-node", + "haskellNix" + ], + "nixpkgs": [ + "cardano-node", + "nixpkgs" + ], + "tullia": [ + "cardano-node", + "tullia" + ] }, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1679408951, + "narHash": "sha256-xM78upkrXjRu/739V/IxFrA9m+6rvgOiolt4ReKLAog=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-automation", + "rev": "628f135d243d4a9e388c187e4c6179246038ee72", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "repo": "cardano-automation", "type": "github" } }, - "cardano-mainnet-mirror_2": { - "inputs": { - "nixpkgs": "nixpkgs_5" - }, + "cardano-configurations": { + "flake": false, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1699561895, + "narHash": "sha256-bLNN6lJUe5dR1EOdtDspReE2fu2EV7hQMHFGDinxf5Y=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-configurations", + "rev": "d952529afdfdf6d53ce190b1bf8af990a7ae9590", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "repo": "cardano-configurations", + "rev": "d952529afdfdf6d53ce190b1bf8af990a7ae9590", "type": "github" } }, - "cardano-mainnet-mirror_3": { - "inputs": { - "nixpkgs": "nixpkgs_6" - }, + "cardano-configurations_2": { + "flake": false, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1694019972, + "narHash": "sha256-TQEvb6W2VlOWxqIFa4r8UFBVbu82Bb2hRaDtN5Zbiuk=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-configurations", + "rev": "65ef979cf69f420efca0a7aaf0412a610bc48097", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "repo": "cardano-configurations", "type": "github" } }, - "cardano-mainnet-mirror_4": { - "inputs": { - "nixpkgs": "nixpkgs_11" - }, + "cardano-explorer-app": { + "flake": false, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1655291958, + "narHash": "sha256-OByt95cIJrA8pXsvCztsWmFcDaQaSYGohSOHoaZWKJs=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-explorer-app", + "rev": "a65938afe159adb1d1e2808305a7316738f5e634", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "ref": "fix-nix-system", + "repo": "cardano-explorer-app", "type": "github" } }, - "cardano-mainnet-mirror_5": { - "inputs": { - "nixpkgs": "nixpkgs_13" - }, + "cardano-graphql": { + "flake": false, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1657201429, + "narHash": "sha256-kx8Pe5HllnJceQHsBDB4hHcEQNSiq8D+OFFkRuuUFQE=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-graphql", + "rev": "ffb40028f51e23983c2ae27693bbdcd152208d9d", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "repo": "cardano-graphql", "type": "github" } }, - "cardano-mainnet-mirror_6": { + "cardano-mainnet-mirror": { "inputs": { - "nixpkgs": "nixpkgs_14" + "nixpkgs": "nixpkgs_2" }, "locked": { "lastModified": 1642701714, @@ -1106,149 +1354,51 @@ "cardano-node": { "inputs": { "CHaP": "CHaP_2", + "cardano-automation": "cardano-automation", "cardano-mainnet-mirror": "cardano-mainnet-mirror", - "cardano-node-workbench": [ - "ogmios", - "blank" - ], "customConfig": "customConfig", - "flake-compat": "flake-compat_2", + "em": "em", + "empty-flake": "empty-flake", + "flake-compat": "flake-compat", "hackageNix": "hackageNix", "haskellNix": "haskellNix", "hostNixpkgs": [ - "ogmios", "cardano-node", "nixpkgs" ], "iohkNix": "iohkNix", - "nixTools": "nixTools", + "nix2container": "nix2container", "nixpkgs": [ - "ogmios", "cardano-node", "haskellNix", "nixpkgs-unstable" ], - "node-measured": [ - "ogmios", - "blank" - ], - "node-process": "node-process", - "node-snapshot": "node-snapshot", - "plutus-apps": "plutus-apps", - "utils": "utils_4" - }, - "locked": { - "lastModified": 1667644902, - "narHash": "sha256-WRRzfpDc+YVmTNbN9LNYY4dS8o21p/6NoKxtcZmoAcg=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "ebc7be471b30e5931b35f9bbc236d21c375b91bb", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "1.35.4", - "repo": "cardano-node", - "type": "github" - } - }, - "cardano-node-snapshot": { - "inputs": { - "customConfig": "customConfig_3", - "haskellNix": "haskellNix_3", - "iohkNix": "iohkNix_3", - "membench": "membench_2", - "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "haskellNix", - "nixpkgs-2105" - ], - "utils": "utils" - }, - "locked": { - "lastModified": 1644954571, - "narHash": "sha256-c6MM1mQoS/AnTIrwaRmITK4L4i9lLNtkjOUHiseBtUs=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", - "type": "github" - } - }, - "cardano-node-snapshot_2": { - "inputs": { - "customConfig": "customConfig_7", - "haskellNix": "haskellNix_7", - "iohkNix": "iohkNix_7", - "membench": "membench_4", - "nixpkgs": [ - "ogmios-nixos", + "ops-lib": "ops-lib", + "std": [ "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "haskellNix", - "nixpkgs-2105" + "tullia", + "std" ], - "utils": "utils_6" + "tullia": "tullia", + "utils": "utils_2" }, "locked": { - "lastModified": 1644954571, - "narHash": "sha256-c6MM1mQoS/AnTIrwaRmITK4L4i9lLNtkjOUHiseBtUs=", + "lastModified": 1687190129, + "narHash": "sha256-JCa9+QhZ2RVSIKkhz2WCZqTKCgdUSuezWS2YsQ5vhM4=", "owner": "input-output-hk", "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", + "rev": "6f79e5c3ea109a70cd01910368e011635767305a", "type": "github" }, "original": { "owner": "input-output-hk", + "ref": "8.1.1", "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", "type": "github" } }, "cardano-node_2": { - "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_4", - "cardano-node-workbench": [ - "ogmios-nixos", - "blank" - ], - "customConfig": "customConfig_5", - "flake-compat": "flake-compat_7", - "hackageNix": "hackageNix_2", - "haskellNix": "haskellNix_5", - "hostNixpkgs": [ - "ogmios-nixos", - "cardano-node", - "nixpkgs" - ], - "iohkNix": "iohkNix_5", - "nixTools": "nixTools_2", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "haskellNix", - "nixpkgs-unstable" - ], - "node-measured": [ - "ogmios-nixos", - "blank" - ], - "node-process": "node-process_2", - "node-snapshot": "node-snapshot_2", - "plutus-apps": "plutus-apps_2", - "utils": "utils_9" - }, + "flake": false, "locked": { "lastModified": 1659625017, "narHash": "sha256-4IrheFeoWfvkZQndEk4fGUkOiOjcVhcyXZ6IqmvkDgg=", @@ -1280,7 +1430,7 @@ "type": "github" } }, - "cardano-shell_10": { + "cardano-shell_2": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1296,7 +1446,7 @@ "type": "github" } }, - "cardano-shell_11": { + "cardano-shell_3": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1312,7 +1462,7 @@ "type": "github" } }, - "cardano-shell_12": { + "cardano-shell_4": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1328,7 +1478,7 @@ "type": "github" } }, - "cardano-shell_2": { + "cardano-shell_5": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1344,7 +1494,7 @@ "type": "github" } }, - "cardano-shell_3": { + "cardano-shell_6": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1360,7 +1510,7 @@ "type": "github" } }, - "cardano-shell_4": { + "cardano-shell_7": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1376,83 +1526,115 @@ "type": "github" } }, - "cardano-shell_5": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" + "cardano-wallet": { + "inputs": { + "customConfig": "customConfig_2", + "ema": "ema", + "emanote": "emanote", + "flake-compat": "flake-compat_8", + "flake-utils": "flake-utils_25", + "haskellNix": "haskellNix_2", + "hostNixpkgs": [ + "db-sync", + "cardano-world", + "cardano-wallet", + "nixpkgs" + ], + "iohkNix": "iohkNix_2", + "nixpkgs": [ + "db-sync", + "cardano-world", + "cardano-wallet", + "haskellNix", + "nixpkgs-unstable" + ] }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_6": { - "flake": false, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1656674685, + "narHash": "sha256-Uq02O758v7U61a9Ol6VzSDyx3S/CVHn0l/OUM1UYJkY=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "cardano-wallet", + "rev": "c0ece6ad1868682b074708ffb810bdc2ea96934f", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", + "ref": "v2022-07-01", + "repo": "cardano-wallet", "type": "github" } }, - "cardano-shell_7": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" + "cardano-world": { + "inputs": { + "bitte": "bitte", + "bitte-cells": "bitte-cells", + "byron-chain": "byron-chain", + "capsules": "capsules_2", + "cardano-db-sync": [ + "db-sync" + ], + "cardano-explorer-app": "cardano-explorer-app", + "cardano-graphql": "cardano-graphql", + "cardano-node": "cardano-node_2", + "cardano-wallet": "cardano-wallet", + "data-merge": "data-merge_3", + "flake-compat": "flake-compat_9", + "hackage": "hackage_3", + "haskell-nix": "haskell-nix_2", + "iohk-nix": "iohk-nix", + "n2c": "n2c_3", + "nix-inclusive": "nix-inclusive", + "nixpkgs": "nixpkgs_63", + "nixpkgs-haskell": [ + "db-sync", + "cardano-world", + "haskell-nix", + "nixpkgs-unstable" + ], + "ogmios": "ogmios", + "std": "std_3", + "tullia": "tullia_2" }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_8": { - "flake": false, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1662508244, + "narHash": "sha256-s8kroVd8VAZ/Lfv2gNt+RzIuSnWpQxAAL0y90tn1i0o=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "cardano-world", + "rev": "0b6dcb5b61a0f7a2c048cb757463cbc0dfa0fe24", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", + "repo": "cardano-world", "type": "github" } }, - "cardano-shell_9": { - "flake": false, + "cicero": { + "inputs": { + "alejandra": "alejandra", + "data-merge": "data-merge_2", + "devshell": "devshell_8", + "driver": "driver", + "follower": "follower", + "haskell-nix": "haskell-nix", + "inclusive": "inclusive_8", + "nix": "nix_8", + "nix-cache-proxy": "nix-cache-proxy", + "nixpkgs": "nixpkgs_39", + "poetry2nix": "poetry2nix", + "utils": "utils_16" + }, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1647522107, + "narHash": "sha256-Kti1zv+GXnbujkJ0ODB2ukq4Eb2RVOpudZ1xVDhhbes=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "cicero", + "rev": "0fd8642fe437f6129fe6914f032d3fdc7591d4fe", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", + "repo": "cicero", "type": "github" } }, @@ -1488,106 +1670,198 @@ }, "customConfig_3": { "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", - "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", - "type": "github" + "lastModified": 1, + "narHash": "sha256-Zd5w1I1Dwt783Q4WuBuCpedcwG1DrIgQGqabyF87prM=", + "path": "./custom-config", + "type": "path" }, "original": { - "owner": "input-output-hk", - "repo": "empty-flake", - "type": "github" + "path": "./custom-config", + "type": "path" } }, - "customConfig_4": { + "data-merge": { + "inputs": { + "nixlib": "nixlib", + "yants": "yants_2" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", - "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "lastModified": 1648237091, + "narHash": "sha256-OtgcOt/CB0/9S0rh1eAog+AvAg9kF6GyAknyWOXiAZI=", + "owner": "divnix", + "repo": "data-merge", + "rev": "b21bcf7bd949ac92af3930ecb1d3df8786384722", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "empty-flake", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "customConfig_5": { + "data-merge_2": { + "inputs": { + "nixlib": "nixlib_2" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", - "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "lastModified": 1635967744, + "narHash": "sha256-01065dNad3BIepNzrpYuYInxq/ynqtGMSsIiNqjND7E=", + "owner": "divnix", + "repo": "data-merge", + "rev": "68bd71f980f75cf73bc5071982eddfe6bc089768", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "empty-flake", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "customConfig_6": { + "data-merge_3": { + "inputs": { + "nixlib": "nixlib_3", + "yants": "yants_4" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1655854240, + "narHash": "sha256-j74ixD7Y0bF3h0fBJFKPR9botlrMu0fgG/YsiUKybko=", + "owner": "divnix", + "repo": "data-merge", + "rev": "0bbe0a68d4ee090b8bbad0c5e1e85060d2bdfe98", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "db-sync": { + "inputs": { + "cardano-world": "cardano-world", + "customConfig": "customConfig_3", + "flake-compat": "flake-compat_10", + "haskellNix": "haskellNix_3", + "iohkNix": "iohkNix_3", + "nixpkgs": [ + "db-sync", + "haskellNix", + "nixpkgs-unstable" + ], + "utils": "utils_23" + }, + "locked": { + "lastModified": 1670313550, + "narHash": "sha256-Gkn/hyK0xiDJZY1O5JEwuosMzar+IskC9xxeBts+0H4=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "cardano-db-sync", + "rev": "1040fa9ec85fd75ce9f02dae2006170136793d02", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "ref": "13.1.0.0", + "repo": "cardano-db-sync", "type": "github" } }, - "customConfig_7": { + "deploy": { + "inputs": { + "fenix": "fenix", + "flake-compat": "flake-compat_4", + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "deploy", + "fenix", + "nixpkgs" + ], + "utils": "utils_3" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1638318651, + "narHash": "sha256-YsYBMa8Chtb6ccGZOVStReiZ33ZNmi7kNPLf/Ua2kY8=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "deploy-rs", + "rev": "1d3a4f4681a98479219c628165bb6b3a12eae843", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "repo": "deploy-rs", "type": "github" } }, - "customConfig_8": { + "deploy_2": { + "inputs": { + "fenix": "fenix_3", + "flake-compat": "flake-compat_5", + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "deploy", + "fenix", + "nixpkgs" + ], + "utils": "utils_9" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1638318651, + "narHash": "sha256-YsYBMa8Chtb6ccGZOVStReiZ33ZNmi7kNPLf/Ua2kY8=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "deploy-rs", + "rev": "1d3a4f4681a98479219c628165bb6b3a12eae843", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "repo": "deploy-rs", + "type": "github" + } + }, + "deploy_3": { + "inputs": { + "fenix": "fenix_5", + "flake-compat": "flake-compat_6", + "nixpkgs": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "deploy", + "fenix", + "nixpkgs" + ], + "utils": "utils_17" + }, + "locked": { + "lastModified": 1638318651, + "narHash": "sha256-YsYBMa8Chtb6ccGZOVStReiZ33ZNmi7kNPLf/Ua2kY8=", + "owner": "input-output-hk", + "repo": "deploy-rs", + "rev": "1d3a4f4681a98479219c628165bb6b3a12eae843", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "deploy-rs", "type": "github" } }, "devshell": { "inputs": { "flake-utils": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "flake-utils" ], "nixpkgs": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" @@ -1607,29 +1881,142 @@ "type": "github" } }, - "devshell_2": { + "devshell_10": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_11": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_12": { + "locked": { + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_13": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_14": { + "locked": { + "lastModified": 1637098489, + "narHash": "sha256-IWBYLSNSENI/fTrXdYDhuCavxcgN9+RERrPM81f6DXY=", + "owner": "numtide", + "repo": "devshell", + "rev": "e8c2d4967b5c498b12551d1bb49352dcf9efa3e4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_15": { "inputs": { "flake-utils": [ - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", "flake-utils" ], "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", + "db-sync", + "cardano-world", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1658746384, + "narHash": "sha256-CCJcoMOcXyZFrV1ag4XMTpAPjLWb4Anbv+ktXFI1ry0=", + "owner": "numtide", + "repo": "devshell", + "rev": "0ffc7937bb5e8141af03d462b468bd071eb18e1b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_16": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": [ + "db-sync", + "cardano-world", "tullia", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1663445644, - "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "lastModified": 1650900878, + "narHash": "sha256-qhNncMBSa9STnhiLfELEQpYC1L4GrYHNIzyCZ/pilsI=", "owner": "numtide", "repo": "devshell", - "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "rev": "d97df53b5ddaa1cfbea7cddbd207eb2634304733", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_2": { + "locked": { + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", "type": "github" }, "original": { @@ -1639,30 +2026,122 @@ } }, "devshell_3": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_4": { + "locked": { + "lastModified": 1637098489, + "narHash": "sha256-IWBYLSNSENI/fTrXdYDhuCavxcgN9+RERrPM81f6DXY=", + "owner": "numtide", + "repo": "devshell", + "rev": "e8c2d4967b5c498b12551d1bb49352dcf9efa3e4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_5": { + "locked": { + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_6": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_7": { "inputs": { "flake-utils": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "flake-utils" ], "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1663445644, - "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "lastModified": 1658746384, + "narHash": "sha256-CCJcoMOcXyZFrV1ag4XMTpAPjLWb4Anbv+ktXFI1ry0=", + "owner": "numtide", + "repo": "devshell", + "rev": "0ffc7937bb5e8141af03d462b468bd071eb18e1b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_8": { + "inputs": { + "flake-utils": "flake-utils_15", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1644227066, + "narHash": "sha256-FHcFZtpZEWnUh62xlyY3jfXAXHzJNEDLDzLsJxn+ve0=", + "owner": "numtide", + "repo": "devshell", + "rev": "7033f64dd9ef8d9d8644c5030c73913351d2b660", + "type": "github" + }, + "original": { "owner": "numtide", "repo": "devshell", - "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + } + }, + "devshell_9": { + "locked": { + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", "type": "github" }, "original": { @@ -1674,15 +2153,13 @@ "dmerge": { "inputs": { "nixlib": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" ], "yants": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "yants" @@ -1705,16 +2182,16 @@ "dmerge_2": { "inputs": { "nixlib": [ - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "nixpkgs" ], "yants": [ - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "yants" ] @@ -1736,18 +2213,14 @@ "dmerge_3": { "inputs": { "nixlib": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", "nixpkgs" ], "yants": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", "yants" ] @@ -1766,35 +2239,286 @@ "type": "github" } }, - "easy-purescript-nix": { - "flake": false, - "locked": { - "lastModified": 1666686938, - "narHash": "sha256-/UOLRdnEhIOcxcm5ouOipOiSgHRzJde0ccAx4xB1dnU=", - "owner": "justinwoo", - "repo": "easy-purescript-nix", - "rev": "da7acb2662961fd355f0a01a25bd32bf33577fa8", - "type": "github" + "driver": { + "inputs": { + "devshell": "devshell_9", + "inclusive": "inclusive_6", + "nix": "nix_7", + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ], + "utils": "utils_13" + }, + "locked": { + "lastModified": 1644418487, + "narHash": "sha256-nzFmmBYjNjWVy25bHLLmZECfwJm3nxcAr/mYVYxWggA=", + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "rev": "7f7adb6814b4bf926597e4b810b803140176122c", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "type": "github" + } + }, + "easy-purescript-nix": { + "flake": false, + "locked": { + "lastModified": 1696584097, + "narHash": "sha256-a9Hhqf/Fi0FkjRTcQr3pYDhrO9A9tdOkaeVgD23Cdrk=", + "owner": "justinwoo", + "repo": "easy-purescript-nix", + "rev": "d5fe5f4b210a0e4bac42ae0c159596a49c5eb016", + "type": "github" }, "original": { "owner": "justinwoo", "repo": "easy-purescript-nix", - "rev": "da7acb2662961fd355f0a01a25bd32bf33577fa8", + "type": "github" + } + }, + "em": { + "flake": false, + "locked": { + "lastModified": 1684791668, + "narHash": "sha256-JyPm0RiWCfy/8rs7wd/IRSWIz+bTkD78uxIMnKktU2g=", + "owner": "deepfire", + "repo": "em", + "rev": "302cdf6d654fb18baff0213bdfa41a653774585a", + "type": "github" + }, + "original": { + "owner": "deepfire", + "repo": "em", + "type": "github" + } + }, + "ema": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_22", + "nixpkgs": "nixpkgs_54", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1646661767, + "narHash": "sha256-5zxUr3nO4r04K5WGrW/+nW84qbOW8wNJLt902yQmyF4=", + "owner": "srid", + "repo": "ema", + "rev": "bcabc170b7de9cdd83b4bbcf59130b54933602ea", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "ema", + "type": "github" + } + }, + "ema_2": { + "flake": false, + "locked": { + "lastModified": 1655231448, + "narHash": "sha256-LmAnOFKiqOWW9cQNZCbqFF0N1Mx073908voXz+4Fzic=", + "owner": "srid", + "repo": "ema", + "rev": "da5b29f03c1edfb7f947666a5a818fb97cc3c229", + "type": "github" + }, + "original": { + "owner": "srid", + "ref": "multisite", + "repo": "ema", + "type": "github" + } + }, + "emanote": { + "inputs": { + "ema": "ema_2", + "flake-parts": "flake-parts", + "haskell-flake": "haskell-flake", + "nixpkgs": "nixpkgs_57", + "tailwind-haskell": "tailwind-haskell" + }, + "locked": { + "lastModified": 1655823900, + "narHash": "sha256-YEDJxa2gPf2+GGyrkFz4EliCml1FyDualZtbbZEmljA=", + "owner": "srid", + "repo": "emanote", + "rev": "147528d9df81b881214652ce0cefec0b3d52965e", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "emanote", + "type": "github" + } + }, + "empty-flake": { + "locked": { + "lastModified": 1630400035, + "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "owner": "input-output-hk", + "repo": "empty-flake", + "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "empty-flake", + "type": "github" + } + }, + "fenix": { + "inputs": { + "nixpkgs": "nixpkgs_13", + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1645165506, + "narHash": "sha256-PClhTeC1EhkHUQQmP9XyiR7y1d6hlEc7QY8nN1GuAzQ=", + "owner": "nix-community", + "repo": "fenix", + "rev": "380b82e3d3381b32f11dfe024cb7d135e36d0168", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "fenix_2": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "nixpkgs-unstable" + ], + "rust-analyzer-src": "rust-analyzer-src_2" + }, + "locked": { + "lastModified": 1649226351, + "narHash": "sha256-5fQwF5kYpPC7w0SOfdbE9Z7o5/i/dyo1BxMLVCA2h3E=", + "owner": "nix-community", + "repo": "fenix", + "rev": "c7e184561fe843abb861cd7d22c23066987078e2", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "fenix_3": { + "inputs": { + "nixpkgs": "nixpkgs_26", + "rust-analyzer-src": "rust-analyzer-src_3" + }, + "locked": { + "lastModified": 1645165506, + "narHash": "sha256-PClhTeC1EhkHUQQmP9XyiR7y1d6hlEc7QY8nN1GuAzQ=", + "owner": "nix-community", + "repo": "fenix", + "rev": "380b82e3d3381b32f11dfe024cb7d135e36d0168", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "fenix_4": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "nixpkgs-unstable" + ], + "rust-analyzer-src": "rust-analyzer-src_4" + }, + "locked": { + "lastModified": 1660631227, + "narHash": "sha256-LSXmaDhbPw+3ww63Rx5ewBNWwCQIrzQvzphCFm5BRbU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "41731c1a7ba1441c7544e8a0387aaf58e48f26b8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "fenix_5": { + "inputs": { + "nixpkgs": "nixpkgs_42", + "rust-analyzer-src": "rust-analyzer-src_5" + }, + "locked": { + "lastModified": 1645165506, + "narHash": "sha256-PClhTeC1EhkHUQQmP9XyiR7y1d6hlEc7QY8nN1GuAzQ=", + "owner": "nix-community", + "repo": "fenix", + "rev": "380b82e3d3381b32f11dfe024cb7d135e36d0168", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "fenix_6": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "nixpkgs-unstable" + ], + "rust-analyzer-src": "rust-analyzer-src_6" + }, + "locked": { + "lastModified": 1649226351, + "narHash": "sha256-5fQwF5kYpPC7w0SOfdbE9Z7o5/i/dyo1BxMLVCA2h3E=", + "owner": "nix-community", + "repo": "fenix", + "rev": "c7e184561fe843abb861cd7d22c23066987078e2", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, "flake-compat": { "flake": false, "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", + "lastModified": 1647532380, + "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", + "owner": "input-output-hk", "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "rev": "7da118186435255a30b5ffeabba9629c344c0bec", "type": "github" }, "original": { - "owner": "edolstra", + "owner": "input-output-hk", + "ref": "fixes", "repo": "flake-compat", "type": "github" } @@ -1802,15 +2526,16 @@ "flake-compat_10": { "flake": false, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", - "owner": "edolstra", + "lastModified": 1647532380, + "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", + "owner": "input-output-hk", "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "rev": "7da118186435255a30b5ffeabba9629c344c0bec", "type": "github" }, "original": { - "owner": "edolstra", + "owner": "input-output-hk", + "ref": "fixes", "repo": "flake-compat", "type": "github" } @@ -1818,11 +2543,11 @@ "flake-compat_11": { "flake": false, "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "owner": "edolstra", "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { @@ -1834,15 +2559,16 @@ "flake-compat_12": { "flake": false, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "lastModified": 1672831974, + "narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=", "owner": "input-output-hk", "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "rev": "45f2638735f8cdc40fe302742b79f248d23eb368", "type": "github" }, "original": { "owner": "input-output-hk", + "ref": "hkm/gitlab-fix", "repo": "flake-compat", "type": "github" } @@ -1850,11 +2576,11 @@ "flake-compat_13": { "flake": false, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", "owner": "edolstra", "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "type": "github" }, "original": { @@ -1866,11 +2592,11 @@ "flake-compat_14": { "flake": false, "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", "owner": "edolstra", "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "type": "github" }, "original": { @@ -1882,16 +2608,16 @@ "flake-compat_2": { "flake": false, "locked": { - "lastModified": 1647532380, - "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", + "lastModified": 1672831974, + "narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=", "owner": "input-output-hk", "repo": "flake-compat", - "rev": "7da118186435255a30b5ffeabba9629c344c0bec", + "rev": "45f2638735f8cdc40fe302742b79f248d23eb368", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "fixes", + "ref": "hkm/gitlab-fix", "repo": "flake-compat", "type": "github" } @@ -1899,15 +2625,15 @@ "flake-compat_3": { "flake": false, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", - "owner": "input-output-hk", + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", "type": "github" }, "original": { - "owner": "input-output-hk", + "owner": "edolstra", "repo": "flake-compat", "type": "github" } @@ -1915,11 +2641,11 @@ "flake-compat_4": { "flake": false, "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", "owner": "edolstra", "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", "type": "github" }, "original": { @@ -1931,15 +2657,15 @@ "flake-compat_5": { "flake": false, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", - "owner": "input-output-hk", + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", + "owner": "edolstra", "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", "type": "github" }, "original": { - "owner": "input-output-hk", + "owner": "edolstra", "repo": "flake-compat", "type": "github" } @@ -1947,11 +2673,11 @@ "flake-compat_6": { "flake": false, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", "owner": "edolstra", "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", "type": "github" }, "original": { @@ -1963,21 +2689,36 @@ "flake-compat_7": { "flake": false, "locked": { - "lastModified": 1647532380, - "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", + "lastModified": 1641205782, + "narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_8": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", "owner": "input-output-hk", "repo": "flake-compat", - "rev": "7da118186435255a30b5ffeabba9629c344c0bec", + "rev": "eca47d3377946315596da653862d341ee5341318", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "fixes", "repo": "flake-compat", "type": "github" } }, - "flake-compat_8": { + "flake-compat_9": { "flake": false, "locked": { "lastModified": 1650374568, @@ -1993,29 +2734,51 @@ "type": "github" } }, - "flake-compat_9": { - "flake": false, + "flake-parts": { + "inputs": { + "nixpkgs": "nixpkgs_56" + }, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", - "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "lastModified": 1655570068, + "narHash": "sha256-KUSd2a6KgYTHd2l3Goee/P+DrAC6n1Tau+7V68czSZU=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "6dbc77b9c0477f8a9a6a9081077bb38c6a3dbb3a", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "flake-compat", + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "hercules-ci-effects", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1696343447, + "narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4", "type": "github" + }, + "original": { + "id": "flake-parts", + "type": "indirect" } }, "flake-utils": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -2041,11 +2804,11 @@ }, "flake-utils_11": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { @@ -2056,11 +2819,11 @@ }, "flake-utils_12": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { @@ -2071,11 +2834,11 @@ }, "flake-utils_13": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1656928814, + "narHash": "sha256-RIFfgBuKz6Hp89yRr7+NR5tzIAbn52h8vT6vXkYjZoM=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "7e2a3b3dfd9af950a856d66b0a7d01e3c18aa249", "type": "github" }, "original": { @@ -2086,11 +2849,11 @@ }, "flake-utils_14": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1634851050, + "narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "c91f3de5adaf1de973b797ef7485e441a65b8935", "type": "github" }, "original": { @@ -2101,11 +2864,11 @@ }, "flake-utils_15": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", "type": "github" }, "original": { @@ -2116,11 +2879,11 @@ }, "flake-utils_16": { "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { @@ -2131,11 +2894,11 @@ }, "flake-utils_17": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", "type": "github" }, "original": { @@ -2145,6 +2908,67 @@ } }, "flake-utils_18": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1679360468, + "narHash": "sha256-LGnza3cfXF10Biw3ZTg0u9o9t7s680Ww200t5KkHTh8=", + "owner": "hamishmack", + "repo": "flake-utils", + "rev": "e1ea268ff47ad475443dbabcd54744b4e5b9d4f5", + "type": "github" + }, + "original": { + "owner": "hamishmack", + "ref": "hkm/nested-hydraJobs", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1634851050, + "narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c91f3de5adaf1de973b797ef7485e441a65b8935", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -2159,7 +2983,53 @@ "type": "github" } }, - "flake-utils_19": { + "flake-utils_22": { + "locked": { + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1619345332, + "narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1652776076, + "narHash": "sha256-gzTw/v1vj4dOVbpBSJX4J0DwUR6LIyXo7/SuuTJp1kM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "04c1b180862888302ddfb2e3ad9eaa63afc60cf8", + "type": "github" + }, + "original": { + "owner": "numtide", + "ref": "v1.0.0", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { "locked": { "lastModified": 1653893745, "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", @@ -2174,7 +3044,7 @@ "type": "github" } }, - "flake-utils_2": { + "flake-utils_26": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -2189,13 +3059,13 @@ "type": "github" } }, - "flake-utils_20": { + "flake-utils_27": { "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { @@ -2204,7 +3074,7 @@ "type": "github" } }, - "flake-utils_21": { + "flake-utils_28": { "locked": { "lastModified": 1653893745, "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", @@ -2219,13 +3089,28 @@ "type": "github" } }, + "flake-utils_29": { + "locked": { + "lastModified": 1656928814, + "narHash": "sha256-RIFfgBuKz6Hp89yRr7+NR5tzIAbn52h8vT6vXkYjZoM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e2a3b3dfd9af950a856d66b0a7d01e3c18aa249", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "flake-utils_3": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -2234,13 +3119,28 @@ "type": "github" } }, - "flake-utils_4": { + "flake-utils_30": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", "type": "github" }, "original": { @@ -2249,13 +3149,13 @@ "type": "github" } }, - "flake-utils_5": { + "flake-utils_32": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { @@ -2264,7 +3164,7 @@ "type": "github" } }, - "flake-utils_6": { + "flake-utils_33": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -2279,7 +3179,7 @@ "type": "github" } }, - "flake-utils_7": { + "flake-utils_4": { "locked": { "lastModified": 1653893745, "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", @@ -2294,7 +3194,7 @@ "type": "github" } }, - "flake-utils_8": { + "flake-utils_5": { "locked": { "lastModified": 1659877975, "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", @@ -2309,13 +3209,13 @@ "type": "github" } }, - "flake-utils_9": { + "flake-utils_6": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { @@ -2324,58 +3224,95 @@ "type": "github" } }, - "ghc-8.6.5-iohk": { - "flake": false, + "flake-utils_7": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_10": { - "flake": false, + "flake-utils_8": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1634851050, + "narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c91f3de5adaf1de973b797ef7485e441a65b8935", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_11": { + "flakeCompat": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "lastModified": 1641205782, + "narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "follower": { + "inputs": { + "devshell": "devshell_10", + "inclusive": "inclusive_7", + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ], + "utils": "utils_14" + }, + "locked": { + "lastModified": 1642008295, + "narHash": "sha256-yx3lLN/hlvEeKItHJ5jH0KSm84IruTWMo78IItVPji4=", "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "repo": "nomad-follower", + "rev": "b1b0b00e940026f72d16bdf13e36ad20f1826e8a", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "repo": "nomad-follower", "type": "github" } }, - "ghc-8.6.5-iohk_12": { + "ghc-8.6.5-iohk": { "flake": false, "locked": { "lastModified": 1600920045, @@ -2494,82 +3431,47 @@ "type": "github" } }, - "ghc-8.6.5-iohk_8": { + "ghc98X": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" + "lastModified": 1696643148, + "narHash": "sha256-E02DfgISH7EvvNAu0BHiPvl1E5FGMDi0pWdNZtIBC9I=", + "ref": "ghc-9.8", + "rev": "443e870d977b1ab6fc05f47a9a17bc49296adbd6", + "revCount": 61642, + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" + "ref": "ghc-9.8", + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" } }, - "ghc-8.6.5-iohk_9": { + "ghc99": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" + "lastModified": 1701580282, + "narHash": "sha256-drA01r3JrXnkKyzI+owMZGxX0JameMzjK0W5jJE/+V4=", + "ref": "refs/heads/master", + "rev": "f5eb0f2982e9cf27515e892c4bdf634bcfb28459", + "revCount": 62197, + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" } }, "gomod2nix": { "inputs": { - "nixpkgs": "nixpkgs_8", - "utils": "utils_5" - }, - "locked": { - "lastModified": 1655245309, - "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", - "owner": "tweag", - "repo": "gomod2nix", - "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", - "type": "github" - }, - "original": { - "owner": "tweag", - "repo": "gomod2nix", - "type": "github" - } - }, - "gomod2nix_2": { - "inputs": { - "nixpkgs": "nixpkgs_16", - "utils": "utils_10" - }, - "locked": { - "lastModified": 1655245309, - "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", - "owner": "tweag", - "repo": "gomod2nix", - "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", - "type": "github" - }, - "original": { - "owner": "tweag", - "repo": "gomod2nix", - "type": "github" - } - }, - "gomod2nix_3": { - "inputs": { - "nixpkgs": "nixpkgs_20", - "utils": "utils_11" + "nixpkgs": "nixpkgs_5", + "utils": "utils" }, "locked": { "lastModified": 1655245309, @@ -2588,27 +3490,11 @@ "hackage": { "flake": false, "locked": { - "lastModified": 1654219082, - "narHash": "sha256-sm59eg5wSrfIAjNXfBaaOBQ8daghF3g1NiGazYfj+no=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "fc90e7c5dea0483bacb01fc00bd2ab8f8e72500d", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackageNix": { - "flake": false, - "locked": { - "lastModified": 1665882657, - "narHash": "sha256-3eiHY9Lt2vTeMsrT6yssbd+nfx/i5avfxosigx7bCxU=", + "lastModified": 1646097829, + "narHash": "sha256-PcHDDV8NuUxZhPV/p++IkZC+SDZ1Db7m7K+9HN4/0S4=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "8e5b6856f99ed790c387fa76bdad9dcc94b3a54c", + "rev": "283f096976b48e54183905e7bdde7f213c6ee5cd", "type": "github" }, "original": { @@ -2617,14 +3503,14 @@ "type": "github" } }, - "hackageNix_2": { + "hackage-nix": { "flake": false, "locked": { - "lastModified": 1656898050, - "narHash": "sha256-jemAb/Wm/uT+QhV12GlyeA5euSWxYzr2HOYoK4MZps0=", + "lastModified": 1702772694, + "narHash": "sha256-KL6ZjbhPBCco1ho0lmh0/dfPSNxjF8qtrTlzQcTN3iw=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "4f1dd530219ca1165f523ffb2c62213ebede4046", + "rev": "20bd4b5f667f892230d4a28ea4607e85ce9bc44e", "type": "github" }, "original": { @@ -2633,14 +3519,14 @@ "type": "github" } }, - "hackage_10": { + "hackageNix": { "flake": false, "locked": { - "lastModified": 1669338728, - "narHash": "sha256-a+/QK3TeSgzLnL1z/EkqROo3cwB6VXV3BmvkvvGPSzM=", + "lastModified": 1685492843, + "narHash": "sha256-X8dNs5Gfc2ucfaWAgZ1VmkpBB4Cb44EQZu0b7tkvz2Y=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "d044e9fd6eb02330eda094e3b7a61d4d23f8544a", + "rev": "e7407bab324eb2445bda58c5ffac393e80dda1e4", "type": "github" }, "original": { @@ -2652,11 +3538,11 @@ "hackage_2": { "flake": false, "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", + "lastModified": 1655342080, + "narHash": "sha256-mF/clPxSJJkKAq6Y+0oYXrU3rGOuQXFN9btSde3uvvE=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", + "rev": "567e2e865d42d8e5cfe796bf03b6b38e42bc00ab", "type": "github" }, "original": { @@ -2668,11 +3554,11 @@ "hackage_3": { "flake": false, "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", + "lastModified": 1659489414, + "narHash": "sha256-AghgUkUv0hIBh+PvODngYL+ejwhCn2O2OUkVaAZYkCU=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", + "rev": "056c6ce7014adaf887b8e4cad15ef6fd926ea568", "type": "github" }, "original": { @@ -2684,11 +3570,11 @@ "hackage_4": { "flake": false, "locked": { - "lastModified": 1639098768, - "narHash": "sha256-DZ4sG8FeDxWvBLixrj0jELXjtebZ0SCCPmQW43HNzIE=", + "lastModified": 1650935983, + "narHash": "sha256-wZTCKzA4f7nk5sIdP2BhGz5qkt6ex5VTC/53U2Y4i9Y=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "c7b123af6b0b9b364cab03363504d42dca16a4b5", + "rev": "b65addc81b03406b3ee8b139549980591ed15be5", "type": "github" }, "original": { @@ -2700,59 +3586,11 @@ "hackage_5": { "flake": false, "locked": { - "lastModified": 1669857312, - "narHash": "sha256-m0jYF2gOKTaCcedV+dZkCjVbfv0CWkRziCeEk/NF/34=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "8299f5acc68f0e91563e7688f24cbc70391600bf", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_6": { - "flake": false, - "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_7": { - "flake": false, - "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_8": { - "flake": false, - "locked": { - "lastModified": 1639098768, - "narHash": "sha256-DZ4sG8FeDxWvBLixrj0jELXjtebZ0SCCPmQW43HNzIE=", + "lastModified": 1654219082, + "narHash": "sha256-sm59eg5wSrfIAjNXfBaaOBQ8daghF3g1NiGazYfj+no=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "c7b123af6b0b9b364cab03363504d42dca16a4b5", + "rev": "fc90e7c5dea0483bacb01fc00bd2ab8f8e72500d", "type": "github" }, "original": { @@ -2761,96 +3599,105 @@ "type": "github" } }, - "hackage_9": { - "flake": false, + "haskell-flake": { "locked": { - "lastModified": 1667783503, - "narHash": "sha256-25ZZPMQi9YQbXz3tZYPECVUI0FAQkJcDUIA/v8+mo9E=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "1f77f69e6dd92b5130cbe681b74e8fc0d29d63ff", + "lastModified": 1654001497, + "narHash": "sha256-GfrpyoQrVT9Z/j9its8BQs3I5O5X5Lc2IkK922bz7zg=", + "owner": "srid", + "repo": "haskell-flake", + "rev": "4c0b0ff295f0b97238a600d2381c37ee46b67f9c", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "srid", + "repo": "haskell-flake", "type": "github" } }, "haskell-nix": { "inputs": { - "HTTP": "HTTP", - "cabal-32": "cabal-32", - "cabal-34": "cabal-34", - "cabal-36": "cabal-36", - "cardano-shell": "cardano-shell", - "flake-utils": "flake-utils", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk", + "HTTP": "HTTP_2", + "cabal-32": "cabal-32_2", + "cabal-34": "cabal-34_2", + "cabal-36": "cabal-36_2", + "cardano-shell": "cardano-shell_2", + "flake-utils": "flake-utils_16", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_2", "hackage": "hackage", - "hpc-coveralls": "hpc-coveralls", - "hydra": "hydra", + "hpc-coveralls": "hpc-coveralls_2", "nix-tools": "nix-tools", "nixpkgs": [ - "kupo-nixos", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", "haskell-nix", "nixpkgs-unstable" ], - "nixpkgs-2003": "nixpkgs-2003", - "nixpkgs-2105": "nixpkgs-2105", - "nixpkgs-2111": "nixpkgs-2111", - "nixpkgs-unstable": "nixpkgs-unstable", - "old-ghc-nix": "old-ghc-nix", - "stackage": "stackage" + "nixpkgs-2003": "nixpkgs-2003_2", + "nixpkgs-2105": "nixpkgs-2105_2", + "nixpkgs-2111": "nixpkgs-2111_2", + "nixpkgs-unstable": [ + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ], + "old-ghc-nix": "old-ghc-nix_2", + "stackage": "stackage_2" }, "locked": { - "lastModified": 1654219238, - "narHash": "sha256-PMS7uSQjYCjsjUfVidTdKcuNtKNu5VPmeNvxruT72go=", + "lastModified": 1646097976, + "narHash": "sha256-EiyrBqayw67dw8pr1XCVU9tIZ+/jzXCQycW1S9a+KFA=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", + "rev": "f0308ed1df3ce9f10f9da1a7c0c8591921d0b4e5", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", "type": "github" } }, "haskell-nix_2": { "inputs": { - "HTTP": "HTTP_6", - "cabal-32": "cabal-32_6", - "cabal-34": "cabal-34_6", - "cabal-36": "cabal-36_5", - "cardano-shell": "cardano-shell_6", - "flake-compat": "flake-compat_5", - "flake-utils": "flake-utils_6", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_6", - "hackage": "hackage_5", - "hpc-coveralls": "hpc-coveralls_6", - "hydra": "hydra_3", - "iserv-proxy": "iserv-proxy", + "HTTP": "HTTP_4", + "cabal-32": "cabal-32_4", + "cabal-34": "cabal-34_4", + "cabal-36": "cabal-36_4", + "cardano-shell": "cardano-shell_4", + "flake-utils": "flake-utils_27", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_4", + "hackage": [ + "db-sync", + "cardano-world", + "hackage" + ], + "hpc-coveralls": "hpc-coveralls_4", + "hydra": "hydra_6", + "nix-tools": "nix-tools_3", "nixpkgs": [ - "ogmios", - "nixpkgs" + "db-sync", + "cardano-world", + "haskell-nix", + "nixpkgs-unstable" ], - "nixpkgs-2003": "nixpkgs-2003_6", - "nixpkgs-2105": "nixpkgs-2105_6", - "nixpkgs-2111": "nixpkgs-2111_6", + "nixpkgs-2003": "nixpkgs-2003_4", + "nixpkgs-2105": "nixpkgs-2105_4", + "nixpkgs-2111": "nixpkgs-2111_4", "nixpkgs-2205": "nixpkgs-2205_2", - "nixpkgs-2211": "nixpkgs-2211", "nixpkgs-unstable": "nixpkgs-unstable_6", - "old-ghc-nix": "old-ghc-nix_6", - "stackage": "stackage_6", - "tullia": "tullia" + "old-ghc-nix": "old-ghc-nix_4", + "stackage": "stackage_4" }, "locked": { - "lastModified": 1670464865, - "narHash": "sha256-OP4w1Cc2xXKya5GbViX2PwX4Gre/GyE2gT9NIVzcIyw=", + "lastModified": 1659439444, + "narHash": "sha256-qUK7OVpM8/piOImpPgzSUvOFHQq19sQpvOSns2nW8es=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "6c992eacf65c19e29ae5296b11def11813179643", + "rev": "ee6a6559e16a603677d7cbef7c4fe18ca801b48e", "type": "github" }, "original": { @@ -2861,36 +3708,46 @@ }, "haskell-nix_3": { "inputs": { - "HTTP": "HTTP_11", - "cabal-32": "cabal-32_11", - "cabal-34": "cabal-34_11", - "cabal-36": "cabal-36_9", - "cardano-shell": "cardano-shell_11", - "flake-compat": "flake-compat_9", - "flake-utils": "flake-utils_14", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_11", - "hackage": "hackage_9", - "hpc-coveralls": "hpc-coveralls_11", - "hydra": "hydra_5", + "HTTP": "HTTP_6", + "cabal-32": "cabal-32_6", + "cabal-34": "cabal-34_6", + "cabal-36": "cabal-36_6", + "cardano-shell": "cardano-shell_6", + "flake-compat": "flake-compat_12", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_6", + "ghc98X": "ghc98X", + "ghc99": "ghc99", + "hackage": [ + "hackage-nix" + ], + "hls-1.10": "hls-1.10_2", + "hls-2.0": "hls-2.0", + "hls-2.2": "hls-2.2", + "hls-2.3": "hls-2.3", + "hls-2.4": "hls-2.4", + "hpc-coveralls": "hpc-coveralls_6", + "hydra": "hydra_8", + "iserv-proxy": "iserv-proxy_2", "nixpkgs": [ - "ogmios-nixos", "nixpkgs" ], - "nixpkgs-2003": "nixpkgs-2003_11", - "nixpkgs-2105": "nixpkgs-2105_11", - "nixpkgs-2111": "nixpkgs-2111_11", + "nixpkgs-2003": "nixpkgs-2003_6", + "nixpkgs-2105": "nixpkgs-2105_6", + "nixpkgs-2111": "nixpkgs-2111_6", "nixpkgs-2205": "nixpkgs-2205_3", - "nixpkgs-unstable": "nixpkgs-unstable_11", - "old-ghc-nix": "old-ghc-nix_11", - "stackage": "stackage_11", - "tullia": "tullia_2" + "nixpkgs-2211": "nixpkgs-2211_2", + "nixpkgs-2305": "nixpkgs-2305", + "nixpkgs-2311": "nixpkgs-2311", + "nixpkgs-unstable": "nixpkgs-unstable_8", + "old-ghc-nix": "old-ghc-nix_6", + "stackage": "stackage_6" }, "locked": { - "lastModified": 1667783630, - "narHash": "sha256-IzbvNxsOVxHJGY70qAzaEOPmz4Fw93+4qLFd2on/ZAc=", + "lastModified": 1702774226, + "narHash": "sha256-QUQBV05VimFU0pasJlialCcL/jlCumzaTmCM9+6Ncpk=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "f1f330065199dc4eca017bc21de0c67bc46df393", + "rev": "6ce1c8ab2a6d4af5721b22bd95968439b8c3c307", "type": "github" }, "original": { @@ -2901,81 +3758,81 @@ }, "haskell-nix_4": { "inputs": { - "HTTP": "HTTP_12", - "cabal-32": "cabal-32_12", - "cabal-34": "cabal-34_12", - "cabal-36": "cabal-36_10", - "cardano-shell": "cardano-shell_12", - "flake-compat": "flake-compat_12", - "flake-utils": "flake-utils_18", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_12", - "hackage": "hackage_10", - "hpc-coveralls": "hpc-coveralls_12", - "hydra": "hydra_6", + "HTTP": "HTTP_7", + "cabal-32": "cabal-32_7", + "cabal-34": "cabal-34_7", + "cabal-36": "cabal-36_7", + "cardano-shell": "cardano-shell_7", + "flake-utils": "flake-utils_33", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_7", + "hackage": "hackage_5", + "hpc-coveralls": "hpc-coveralls_7", + "hydra": "hydra_9", + "nix-tools": "nix-tools_5", "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "nixpkgs" + "kupo-nixos", + "haskell-nix", + "nixpkgs-unstable" ], - "nixpkgs-2003": "nixpkgs-2003_12", - "nixpkgs-2105": "nixpkgs-2105_12", - "nixpkgs-2111": "nixpkgs-2111_12", - "nixpkgs-2205": "nixpkgs-2205_4", - "nixpkgs-unstable": "nixpkgs-unstable_12", - "old-ghc-nix": "old-ghc-nix_12", - "stackage": "stackage_12", - "tullia": "tullia_3" + "nixpkgs-2003": "nixpkgs-2003_7", + "nixpkgs-2105": "nixpkgs-2105_7", + "nixpkgs-2111": "nixpkgs-2111_7", + "nixpkgs-unstable": "nixpkgs-unstable_9", + "old-ghc-nix": "old-ghc-nix_7", + "stackage": "stackage_7" }, "locked": { - "lastModified": 1669338917, - "narHash": "sha256-jwZ/I4VXGvpDkC/59c3rQPNBpQdTirJwXEu5KejJIHo=", + "lastModified": 1654219238, + "narHash": "sha256-PMS7uSQjYCjsjUfVidTdKcuNtKNu5VPmeNvxruT72go=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "7f8ccbda20e5ab12780162f045656061334b531a", + "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "haskell.nix", + "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", "type": "github" } }, "haskellNix": { "inputs": { - "HTTP": "HTTP_2", - "cabal-32": "cabal-32_2", - "cabal-34": "cabal-34_2", - "cabal-36": "cabal-36_2", - "cardano-shell": "cardano-shell_2", - "flake-compat": "flake-compat_3", + "HTTP": "HTTP", + "cabal-32": "cabal-32", + "cabal-34": "cabal-34", + "cabal-36": "cabal-36", + "cardano-shell": "cardano-shell", + "flake-compat": "flake-compat_2", "flake-utils": "flake-utils_2", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_2", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk", "hackage": [ - "ogmios", "cardano-node", "hackageNix" ], - "hpc-coveralls": "hpc-coveralls_2", - "hydra": "hydra_2", + "hls-1.10": "hls-1.10", + "hpc-coveralls": "hpc-coveralls", + "hydra": "hydra", + "iserv-proxy": "iserv-proxy", "nixpkgs": [ - "ogmios", "cardano-node", "nixpkgs" ], - "nixpkgs-2003": "nixpkgs-2003_2", - "nixpkgs-2105": "nixpkgs-2105_2", - "nixpkgs-2111": "nixpkgs-2111_2", + "nixpkgs-2003": "nixpkgs-2003", + "nixpkgs-2105": "nixpkgs-2105", + "nixpkgs-2111": "nixpkgs-2111", "nixpkgs-2205": "nixpkgs-2205", - "nixpkgs-unstable": "nixpkgs-unstable_2", - "old-ghc-nix": "old-ghc-nix_2", - "stackage": "stackage_2" + "nixpkgs-2211": "nixpkgs-2211", + "nixpkgs-unstable": "nixpkgs-unstable", + "old-ghc-nix": "old-ghc-nix", + "stackage": "stackage" }, "locked": { - "lastModified": 1665882789, - "narHash": "sha256-vD9voCqq4F100RDO3KlfdKZE81NyD++NJjvf3KNNbHA=", + "lastModified": 1685495397, + "narHash": "sha256-BwbWroS1Qm8BiHatG5+iHMHN5U6kqOccewBROUYuMKw=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "9af167fb4343539ca99465057262f289b44f55da", + "rev": "d07c42cdb1cf88d0cab27d3090b00cb3899643c9", "type": "github" }, "original": { @@ -2991,30 +3848,31 @@ "cabal-34": "cabal-34_3", "cabal-36": "cabal-36_3", "cardano-shell": "cardano-shell_3", - "flake-utils": "flake-utils_3", + "flake-utils": "flake-utils_26", "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_3", "hackage": "hackage_2", "hpc-coveralls": "hpc-coveralls_3", + "hydra": "hydra_5", "nix-tools": "nix-tools_2", "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", + "db-sync", + "cardano-world", + "cardano-wallet", "nixpkgs" ], "nixpkgs-2003": "nixpkgs-2003_3", "nixpkgs-2105": "nixpkgs-2105_3", "nixpkgs-2111": "nixpkgs-2111_3", - "nixpkgs-unstable": "nixpkgs-unstable_3", + "nixpkgs-unstable": "nixpkgs-unstable_5", "old-ghc-nix": "old-ghc-nix_3", "stackage": "stackage_3" }, "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", + "lastModified": 1655369909, + "narHash": "sha256-Z3d17WvaXY2kWdfsOE6yPKViQ1RBfGi4d7XZgXA/j2I=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "rev": "5a310b0b3904d9b90239390eb2dfb59e4dcb0d96", "type": "github" }, "original": { @@ -3024,77 +3882,36 @@ } }, "haskellNix_3": { - "inputs": { - "HTTP": "HTTP_4", - "cabal-32": "cabal-32_4", - "cabal-34": "cabal-34_4", - "cabal-36": "cabal-36_4", - "cardano-shell": "cardano-shell_4", - "flake-utils": "flake-utils_4", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_4", - "hackage": "hackage_3", - "hpc-coveralls": "hpc-coveralls_4", - "nix-tools": "nix-tools_3", - "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_4", - "nixpkgs-2105": "nixpkgs-2105_4", - "nixpkgs-2111": "nixpkgs-2111_4", - "nixpkgs-unstable": "nixpkgs-unstable_4", - "old-ghc-nix": "old-ghc-nix_4", - "stackage": "stackage_4" - }, - "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskellNix_4": { "inputs": { "HTTP": "HTTP_5", "cabal-32": "cabal-32_5", "cabal-34": "cabal-34_5", + "cabal-36": "cabal-36_5", "cardano-shell": "cardano-shell_5", - "flake-utils": "flake-utils_5", + "flake-utils": "flake-utils_32", "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_5", "hackage": "hackage_4", "hpc-coveralls": "hpc-coveralls_5", + "hydra": "hydra_7", "nix-tools": "nix-tools_4", "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "plutus-example", - "nixpkgs" + "db-sync", + "haskellNix", + "nixpkgs-unstable" ], "nixpkgs-2003": "nixpkgs-2003_5", "nixpkgs-2105": "nixpkgs-2105_5", "nixpkgs-2111": "nixpkgs-2111_5", - "nixpkgs-unstable": "nixpkgs-unstable_5", + "nixpkgs-unstable": "nixpkgs-unstable_7", "old-ghc-nix": "old-ghc-nix_5", "stackage": "stackage_5" }, "locked": { - "lastModified": 1639098904, - "narHash": "sha256-7VrCNEaKGLm4pTOS11dt1dRL2033oqrNCfal0uONsqA=", + "lastModified": 1650936156, + "narHash": "sha256-B58b4OCSc6ohRjGEdbQ78r+TK/OZYsBXION90kfQDC4=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "b18c6ce0867fee77f12ecf41dc6c67f7a59d9826", + "rev": "9a502b8c8aac4d7b8033bc9affb87fd03d4740fc", "type": "github" }, "original": { @@ -3103,217 +3920,128 @@ "type": "github" } }, - "haskellNix_5": { + "hercules-ci-effects": { "inputs": { - "HTTP": "HTTP_7", - "cabal-32": "cabal-32_7", - "cabal-34": "cabal-34_7", - "cabal-36": "cabal-36_6", - "cardano-shell": "cardano-shell_7", - "flake-utils": "flake-utils_10", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_7", - "hackage": [ - "ogmios-nixos", - "cardano-node", - "hackageNix" - ], - "hpc-coveralls": "hpc-coveralls_7", - "hydra": "hydra_4", - "nix-tools": "nix-tools_5", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_7", - "nixpkgs-2105": "nixpkgs-2105_7", - "nixpkgs-2111": "nixpkgs-2111_7", - "nixpkgs-unstable": "nixpkgs-unstable_7", - "old-ghc-nix": "old-ghc-nix_7", - "stackage": "stackage_7" + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_70" }, "locked": { - "lastModified": 1656898207, - "narHash": "sha256-hshNfCnrmhIvM4T+O0/JRZymsHmq9YiIJ4bpzNVTD98=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "21230476adfef5fa77fb19fbda396f22006a02bc", + "lastModified": 1701009247, + "narHash": "sha256-GuX16rzRze2y7CsewJLTV6qXkXWyEwp6VCZXi8HLruU=", + "owner": "hercules-ci", + "repo": "hercules-ci-effects", + "rev": "31b6cd7569191bfcd0a548575b0e2ef953ed7d09", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "hercules-ci", + "repo": "hercules-ci-effects", "type": "github" } }, - "haskellNix_6": { - "inputs": { - "HTTP": "HTTP_8", - "cabal-32": "cabal-32_8", - "cabal-34": "cabal-34_8", - "cabal-36": "cabal-36_7", - "cardano-shell": "cardano-shell_8", - "flake-utils": "flake-utils_11", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_8", - "hackage": "hackage_6", - "hpc-coveralls": "hpc-coveralls_8", - "nix-tools": "nix-tools_6", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_8", - "nixpkgs-2105": "nixpkgs-2105_8", - "nixpkgs-2111": "nixpkgs-2111_8", - "nixpkgs-unstable": "nixpkgs-unstable_8", - "old-ghc-nix": "old-ghc-nix_8", - "stackage": "stackage_8" - }, + "hls-1.10": { + "flake": false, "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "lastModified": 1680000865, + "narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "haskell", + "ref": "1.10.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "haskellNix_7": { - "inputs": { - "HTTP": "HTTP_9", - "cabal-32": "cabal-32_9", - "cabal-34": "cabal-34_9", - "cabal-36": "cabal-36_8", - "cardano-shell": "cardano-shell_9", - "flake-utils": "flake-utils_12", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_9", - "hackage": "hackage_7", - "hpc-coveralls": "hpc-coveralls_9", - "nix-tools": "nix-tools_7", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_9", - "nixpkgs-2105": "nixpkgs-2105_9", - "nixpkgs-2111": "nixpkgs-2111_9", - "nixpkgs-unstable": "nixpkgs-unstable_9", - "old-ghc-nix": "old-ghc-nix_9", - "stackage": "stackage_9" - }, + "hls-1.10_2": { + "flake": false, "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "lastModified": 1680000865, + "narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "haskell", + "ref": "1.10.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "haskellNix_8": { - "inputs": { - "HTTP": "HTTP_10", - "cabal-32": "cabal-32_10", - "cabal-34": "cabal-34_10", - "cardano-shell": "cardano-shell_10", - "flake-utils": "flake-utils_13", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_10", - "hackage": "hackage_8", - "hpc-coveralls": "hpc-coveralls_10", - "nix-tools": "nix-tools_8", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "plutus-example", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_10", - "nixpkgs-2105": "nixpkgs-2105_10", - "nixpkgs-2111": "nixpkgs-2111_10", - "nixpkgs-unstable": "nixpkgs-unstable_10", - "old-ghc-nix": "old-ghc-nix_10", - "stackage": "stackage_10" - }, + "hls-2.0": { + "flake": false, "locked": { - "lastModified": 1639098904, - "narHash": "sha256-7VrCNEaKGLm4pTOS11dt1dRL2033oqrNCfal0uONsqA=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "b18c6ce0867fee77f12ecf41dc6c67f7a59d9826", + "lastModified": 1687698105, + "narHash": "sha256-OHXlgRzs/kuJH8q7Sxh507H+0Rb8b7VOiPAjcY9sM1k=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "783905f211ac63edf982dd1889c671653327e441", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "haskell", + "ref": "2.0.0.1", + "repo": "haskell-language-server", "type": "github" } }, - "hpc-coveralls": { + "hls-2.2": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1693064058, + "narHash": "sha256-8DGIyz5GjuCFmohY6Fa79hHA/p1iIqubfJUTGQElbNk=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "b30f4b6cf5822f3112c35d14a0cba51f3fe23b85", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "haskell", + "ref": "2.2.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "hpc-coveralls_10": { + "hls-2.3": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1695910642, + "narHash": "sha256-tR58doOs3DncFehHwCLczJgntyG/zlsSd7DgDgMPOkI=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "458ccdb55c9ea22cd5d13ec3051aaefb295321be", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "haskell", + "ref": "2.3.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "hpc-coveralls_11": { + "hls-2.4": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1696939266, + "narHash": "sha256-VOMf5+kyOeOmfXTHlv4LNFJuDGa7G3pDnOxtzYR40IU=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "362fdd1293efb4b82410b676ab1273479f6d17ee", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "haskell", + "ref": "2.4.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "hpc-coveralls_12": { + "hpc-coveralls": { "flake": false, "locked": { "lastModified": 1607498076, @@ -3425,68 +4153,133 @@ "type": "github" } }, - "hpc-coveralls_8": { - "flake": false, + "hydra": { + "inputs": { + "nix": "nix", + "nixpkgs": [ + "cardano-node", + "haskellNix", + "hydra", + "nix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1671755331, + "narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=", + "owner": "NixOS", + "repo": "hydra", + "rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "id": "hydra", + "type": "indirect" + } + }, + "hydra_2": { + "inputs": { + "nix": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "nix" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1631062883, + "narHash": "sha256-JZ6/gjHyX50fHCYpXy/FrX9C0e9k8X9In5Jb/SQYlT8=", + "owner": "kreisys", + "repo": "hydra", + "rev": "785326948be4b1cc2ce77435c806521565e9af45", + "type": "github" + }, + "original": { + "owner": "kreisys", + "ref": "hydra-server-includes", + "repo": "hydra", "type": "github" } }, - "hpc-coveralls_9": { - "flake": false, + "hydra_3": { + "inputs": { + "nix": [ + "db-sync", + "cardano-world", + "bitte", + "nix" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1631062883, + "narHash": "sha256-JZ6/gjHyX50fHCYpXy/FrX9C0e9k8X9In5Jb/SQYlT8=", + "owner": "kreisys", + "repo": "hydra", + "rev": "785326948be4b1cc2ce77435c806521565e9af45", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "kreisys", + "ref": "hydra-server-includes", + "repo": "hydra", "type": "github" } }, - "hydra": { + "hydra_4": { "inputs": { - "nix": "nix", + "nix": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "nix" + ], "nixpkgs": [ - "kupo-nixos", - "haskell-nix", - "hydra", - "nix", + "db-sync", + "cardano-world", + "capsules", + "bitte", "nixpkgs" ] }, "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", + "lastModified": 1631062883, + "narHash": "sha256-JZ6/gjHyX50fHCYpXy/FrX9C0e9k8X9In5Jb/SQYlT8=", + "owner": "kreisys", "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "rev": "785326948be4b1cc2ce77435c806521565e9af45", "type": "github" }, "original": { - "id": "hydra", - "type": "indirect" + "owner": "kreisys", + "ref": "hydra-server-includes", + "repo": "hydra", + "type": "github" } }, - "hydra_2": { + "hydra_5": { "inputs": { - "nix": "nix_2", + "nix": "nix_12", "nixpkgs": [ - "ogmios", - "cardano-node", + "db-sync", + "cardano-world", + "cardano-wallet", "haskellNix", "hydra", "nix", @@ -3506,11 +4299,12 @@ "type": "indirect" } }, - "hydra_3": { + "hydra_6": { "inputs": { - "nix": "nix_3", + "nix": "nix_13", "nixpkgs": [ - "ogmios", + "db-sync", + "cardano-world", "haskell-nix", "hydra", "nix", @@ -3530,12 +4324,11 @@ "type": "indirect" } }, - "hydra_4": { + "hydra_7": { "inputs": { - "nix": "nix_4", + "nix": "nix_14", "nixpkgs": [ - "ogmios-nixos", - "cardano-node", + "db-sync", "haskellNix", "hydra", "nix", @@ -3555,11 +4348,10 @@ "type": "indirect" } }, - "hydra_5": { + "hydra_8": { "inputs": { - "nix": "nix_5", + "nix": "nix_15", "nixpkgs": [ - "ogmios-nixos", "haskell-nix", "hydra", "nix", @@ -3567,11 +4359,11 @@ ] }, "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", + "lastModified": 1671755331, + "narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=", "owner": "NixOS", "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8", "type": "github" }, "original": { @@ -3579,12 +4371,11 @@ "type": "indirect" } }, - "hydra_6": { + "hydra_9": { "inputs": { - "nix": "nix_6", + "nix": "nix_16", "nixpkgs": [ - "plutip", - "bot-plutus-interface", + "kupo-nixos", "haskell-nix", "hydra", "nix", @@ -3604,174 +4395,283 @@ "type": "indirect" } }, - "iohk-nix": { + "incl": { "inputs": { - "nixpkgs": [ - "kupo-nixos", - "haskell-nix", + "nixlib": [ + "cardano-node", + "tullia", + "std", "nixpkgs" ] }, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "lastModified": 1669263024, + "narHash": "sha256-E/+23NKtxAqYG/0ydYgxlgarKnxmDbg6rCMWnOBqn9Q=", + "owner": "divnix", + "repo": "incl", + "rev": "ce7bebaee048e4cd7ebdb4cee7885e00c4e2abca", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "owner": "divnix", + "repo": "incl", "type": "github" } }, - "iohk-nix-environments": { + "inclusive": { "inputs": { - "nixpkgs": "nixpkgs" + "stdlib": "stdlib" }, "locked": { - "lastModified": 1675397182, - "narHash": "sha256-uVqKdtxUDSbLJfaHEs+t+wc9K4iMfPVmcYF5psbK4rI=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "03a6755865b7461b3b75dc34c3dd2d5e74920196", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "nix-inclusive", "type": "github" } }, - "iohk-nix_2": { + "inclusive_10": { "inputs": { - "nixpkgs": [ - "ogmios", - "nixpkgs" - ] + "stdlib": "stdlib_10" }, "locked": { - "lastModified": 1670489000, - "narHash": "sha256-JewWjqVJSt+7eZQT9bGdhlSsS9dmsSKsMzK9g11tcLU=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "61510bb482eaca8cb7d61f40f5d375d95ea1fbf7", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "nix-inclusive", "type": "github" } }, - "iohk-nix_3": { + "inclusive_11": { "inputs": { - "nixpkgs": [ - "ogmios-nixos", - "nixpkgs" - ] + "stdlib": "stdlib_11" }, "locked": { - "lastModified": 1649070135, - "narHash": "sha256-UFKqcOSdPWk3TYUCPHF22p1zf7aXQpCmmgf7UMg7fWA=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cecab9c71d1064f05f1615eead56ac0b9196bc20", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cecab9c71d1064f05f1615eead56ac0b9196bc20", + "repo": "nix-inclusive", "type": "github" } }, - "iohk-nix_4": { + "inclusive_2": { "inputs": { - "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "nixpkgs" - ] + "stdlib": "stdlib_2" }, "locked": { - "lastModified": 1667394105, - "narHash": "sha256-YhS7zGd6jK/QM/+wWyj0zUBZmE3HOXAL/kpJptGYIWg=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "nix-inclusive", "type": "github" } }, - "iohkNix": { + "inclusive_3": { "inputs": { - "nixpkgs": [ - "ogmios", - "cardano-node", - "nixpkgs" - ] + "stdlib": "stdlib_3" }, "locked": { - "lastModified": 1667394105, - "narHash": "sha256-YhS7zGd6jK/QM/+wWyj0zUBZmE3HOXAL/kpJptGYIWg=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "nix-inclusive", "type": "github" } }, - "iohkNix_2": { + "inclusive_4": { "inputs": { - "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "nixpkgs" - ] + "stdlib": "stdlib_4" }, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "nix-inclusive", "type": "github" } }, - "iohkNix_3": { + "inclusive_5": { + "inputs": { + "stdlib": "stdlib_5" + }, + "locked": { + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-inclusive", + "type": "github" + } + }, + "inclusive_6": { + "inputs": { + "stdlib": "stdlib_6" + }, + "locked": { + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-inclusive", + "type": "github" + } + }, + "inclusive_7": { + "inputs": { + "stdlib": "stdlib_7" + }, + "locked": { + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-inclusive", + "type": "github" + } + }, + "inclusive_8": { + "inputs": { + "stdlib": "stdlib_8" + }, + "locked": { + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-inclusive", + "type": "github" + } + }, + "inclusive_9": { + "inputs": { + "stdlib": "stdlib_9" + }, + "locked": { + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-inclusive", + "type": "github" + } + }, + "iogo": { + "inputs": { + "devshell": "devshell_4", + "inclusive": "inclusive_3", + "nixpkgs": "nixpkgs_22", + "utils": "utils_8" + }, + "locked": { + "lastModified": 1652212694, + "narHash": "sha256-baAY5wKzccNsm7OCEYuySrkXRmlshokCHQjs4EdYShM=", + "owner": "input-output-hk", + "repo": "bitte-iogo", + "rev": "e465975aa368b2d919e865f71eeed02828e55471", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "bitte-iogo", + "type": "github" + } + }, + "iogo_2": { + "inputs": { + "devshell": "devshell_14", + "inclusive": "inclusive_11", + "nixpkgs": "nixpkgs_51", + "utils": "utils_22" + }, + "locked": { + "lastModified": 1658302707, + "narHash": "sha256-E0FA1CEMQlfAsmtLBRoQE7IY4ItKlBdxZ44YX0tK5Hg=", + "owner": "input-output-hk", + "repo": "bitte-iogo", + "rev": "8751660009202bc95ea3a29e304c393c140a4231", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "bitte-iogo", + "type": "github" + } + }, + "iohk-nix": { "inputs": { "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", + "db-sync", + "cardano-world", "nixpkgs" ] }, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", + "lastModified": 1658222743, + "narHash": "sha256-yFH01psqx30y5Ws4dBElLkxYpIxxqZx4G+jCVhsXpnA=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "rev": "9a604d01bd4420ab7f396f14d1947fbe2ce7db8b", "type": "github" }, "original": { @@ -3780,22 +4680,21 @@ "type": "github" } }, - "iohkNix_4": { + "iohk-nix_2": { "inputs": { + "blst": "blst_2", "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "plutus-example", "nixpkgs" - ] + ], + "secp256k1": "secp256k1_2", + "sodium": "sodium_2" }, "locked": { - "lastModified": 1633964277, - "narHash": "sha256-7G/BK514WiMRr90EswNBthe8SmH9tjPaTBba/RW/VA8=", + "lastModified": 1702362799, + "narHash": "sha256-cU8cZXNuo5GRwrSvWqdaqoW5tJ2HWwDEOvWwIVPDPmo=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "1e51437aac8a0e49663cb21e781f34163c81ebfb", + "rev": "b426fb9e0b109a9d1dd2e1476f9e0bd8bb715142", "type": "github" }, "original": { @@ -3804,11 +4703,11 @@ "type": "github" } }, - "iohkNix_5": { + "iohk-nix_3": { "inputs": { "nixpkgs": [ - "ogmios-nixos", - "cardano-node", + "kupo-nixos", + "haskell-nix", "nixpkgs" ] }, @@ -3823,24 +4722,26 @@ "original": { "owner": "input-output-hk", "repo": "iohk-nix", + "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", "type": "github" } }, - "iohkNix_6": { + "iohkNix": { "inputs": { + "blst": "blst", "nixpkgs": [ - "ogmios-nixos", "cardano-node", - "node-snapshot", "nixpkgs" - ] + ], + "secp256k1": "secp256k1", + "sodium": "sodium" }, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", + "lastModified": 1684223806, + "narHash": "sha256-IyLoP+zhuyygLtr83XXsrvKyqqLQ8FHXTiySFf4FJOI=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "rev": "86421fdd89b3af43fa716ccd07638f96c6ecd1e4", "type": "github" }, "original": { @@ -3849,23 +4750,21 @@ "type": "github" } }, - "iohkNix_7": { + "iohkNix_2": { "inputs": { "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", + "db-sync", + "cardano-world", + "cardano-wallet", "nixpkgs" ] }, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", + "lastModified": 1653579289, + "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", "type": "github" }, "original": { @@ -3874,22 +4773,19 @@ "type": "github" } }, - "iohkNix_8": { + "iohkNix_3": { "inputs": { "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "plutus-example", + "db-sync", "nixpkgs" ] }, "locked": { - "lastModified": 1633964277, - "narHash": "sha256-7G/BK514WiMRr90EswNBthe8SmH9tjPaTBba/RW/VA8=", + "lastModified": 1667394105, + "narHash": "sha256-YhS7zGd6jK/QM/+wWyj0zUBZmE3HOXAL/kpJptGYIWg=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "1e51437aac8a0e49663cb21e781f34163c81ebfb", + "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", "type": "github" }, "original": { @@ -3901,17 +4797,35 @@ "iserv-proxy": { "flake": false, "locked": { - "lastModified": 1639165170, - "narHash": "sha256-QsWL/sBDL5GM8IXd/dE/ORiL4RvteEN+aok23tXgAoc=", - "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", - "revCount": 7, + "lastModified": 1670983692, + "narHash": "sha256-avLo34JnI9HNyOuauK5R69usJm+GfW3MlyGlYxZhTgY=", + "ref": "hkm/remote-iserv", + "rev": "50d0abb3317ac439a4e7495b185a64af9b7b9300", + "revCount": 10, "type": "git", - "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" }, "original": { - "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", + "ref": "hkm/remote-iserv", "type": "git", - "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" + } + }, + "iserv-proxy_2": { + "flake": false, + "locked": { + "lastModified": 1691634696, + "narHash": "sha256-MZH2NznKC/gbgBu8NgIibtSUZeJ00HTLJ0PlWKCBHb0=", + "ref": "hkm/remote-iserv", + "rev": "43a979272d9addc29fbffc2e8542c5d96e993d73", + "revCount": 14, + "type": "git", + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" + }, + "original": { + "ref": "hkm/remote-iserv", + "type": "git", + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" } }, "kupo": { @@ -3933,8 +4847,8 @@ }, "kupo-nixos": { "inputs": { - "haskell-nix": "haskell-nix", - "iohk-nix": "iohk-nix", + "haskell-nix": "haskell-nix_4", + "iohk-nix": "iohk-nix_3", "kupo": [ "kupo" ], @@ -3975,7 +4889,23 @@ "type": "github" } }, - "lowdown-src_2": { + "lowdown-src_10": { + "flake": false, + "locked": { + "lastModified": 1598695561, + "narHash": "sha256-gyH/5j+h/nWw0W8AcR2WKvNBUsiQ7QuxqSJNXAwV+8E=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "1705b4a26fbf065d9574dce47a94e8c7c79e052f", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_11": { "flake": false, "locked": { "lastModified": 1633514407, @@ -3991,7 +4921,7 @@ "type": "github" } }, - "lowdown-src_3": { + "lowdown-src_12": { "flake": false, "locked": { "lastModified": 1633514407, @@ -4007,7 +4937,7 @@ "type": "github" } }, - "lowdown-src_4": { + "lowdown-src_13": { "flake": false, "locked": { "lastModified": 1633514407, @@ -4023,7 +4953,7 @@ "type": "github" } }, - "lowdown-src_5": { + "lowdown-src_14": { "flake": false, "locked": { "lastModified": 1633514407, @@ -4039,7 +4969,7 @@ "type": "github" } }, - "lowdown-src_6": { + "lowdown-src_15": { "flake": false, "locked": { "lastModified": 1633514407, @@ -4055,228 +4985,192 @@ "type": "github" } }, - "mdbook-kroki-preprocessor": { + "lowdown-src_16": { "flake": false, "locked": { - "lastModified": 1661755005, - "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", "type": "github" }, "original": { - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", + "owner": "kristapsdz", + "repo": "lowdown", "type": "github" } }, - "mdbook-kroki-preprocessor_2": { + "lowdown-src_2": { "flake": false, "locked": { - "lastModified": 1661755005, - "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", "type": "github" }, "original": { - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", + "owner": "kristapsdz", + "repo": "lowdown", "type": "github" } }, - "mdbook-kroki-preprocessor_3": { + "lowdown-src_3": { "flake": false, "locked": { - "lastModified": 1661755005, - "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "lastModified": 1598695561, + "narHash": "sha256-gyH/5j+h/nWw0W8AcR2WKvNBUsiQ7QuxqSJNXAwV+8E=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "1705b4a26fbf065d9574dce47a94e8c7c79e052f", "type": "github" }, "original": { - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", + "owner": "kristapsdz", + "repo": "lowdown", "type": "github" } }, - "membench": { - "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_2", - "cardano-node-measured": [ - "ogmios", - "cardano-node", - "node-snapshot" - ], - "cardano-node-process": [ - "ogmios", - "cardano-node", - "node-snapshot" - ], - "cardano-node-snapshot": "cardano-node-snapshot", - "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "nixpkgs" - ], - "ouroboros-network": "ouroboros-network_2" - }, + "lowdown-src_4": { + "flake": false, "locked": { - "lastModified": 1645070579, - "narHash": "sha256-AxL6tCOnzYnE6OquoFzj+X1bLDr1PQx3d8/vXm+rbfA=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "65643e000186de1335e24ec89159db8ba85e1c1a", + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", + "owner": "kristapsdz", + "repo": "lowdown", "type": "github" } }, - "membench_2": { - "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_3", - "cardano-node-measured": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-process": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-snapshot": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ], - "ouroboros-network": "ouroboros-network" - }, + "lowdown-src_5": { + "flake": false, "locked": { - "lastModified": 1644547122, - "narHash": "sha256-8nWK+ScMACvRQLbA27gwXNoZver+Wx/cF7V37044koY=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "9d8ff4b9394de0421ee95caa511d01163de88b77", + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", + "owner": "kristapsdz", + "repo": "lowdown", "type": "github" } }, - "membench_3": { - "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_5", - "cardano-node-measured": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot" - ], - "cardano-node-process": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot" - ], - "cardano-node-snapshot": "cardano-node-snapshot_2", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "nixpkgs" - ], - "ouroboros-network": "ouroboros-network_4" - }, + "lowdown-src_6": { + "flake": false, "locked": { - "lastModified": 1645070579, - "narHash": "sha256-AxL6tCOnzYnE6OquoFzj+X1bLDr1PQx3d8/vXm+rbfA=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "65643e000186de1335e24ec89159db8ba85e1c1a", + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", + "owner": "kristapsdz", + "repo": "lowdown", "type": "github" } }, - "membench_4": { - "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_6", - "cardano-node-measured": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-process": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-snapshot": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ], - "ouroboros-network": "ouroboros-network_3" + "lowdown-src_7": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_8": { + "flake": false, "locked": { - "lastModified": 1644547122, - "narHash": "sha256-8nWK+ScMACvRQLbA27gwXNoZver+Wx/cF7V37044koY=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "9d8ff4b9394de0421ee95caa511d01163de88b77", + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_9": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "mdbook-kroki-preprocessor": { + "flake": false, + "locked": { + "lastModified": 1655670640, + "narHash": "sha256-JjqdxftHBjABTkOpFl3cWUJtc/KGwkQ3NRWGLjH2oUs=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "bb6e607437ecc3f22fd9036acee6b797a5b45dbc", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_2": { + "flake": false, + "locked": { + "lastModified": 1655670640, + "narHash": "sha256-JjqdxftHBjABTkOpFl3cWUJtc/KGwkQ3NRWGLjH2oUs=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "bb6e607437ecc3f22fd9036acee6b797a5b45dbc", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", "type": "github" } }, "n2c": { "inputs": { - "flake-utils": "flake-utils_9", + "flake-utils": [ + "cardano-node", + "tullia", + "std", + "flake-utils" + ], "nixpkgs": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" @@ -4298,21 +5192,15 @@ }, "n2c_2": { "inputs": { - "flake-utils": "flake-utils_17", - "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_27" }, "locked": { - "lastModified": 1665039323, - "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "lastModified": 1650568002, + "narHash": "sha256-CciO5C3k/a7sbA+lW4jeiU6WGletujMjWcRzc1513tI=", "owner": "nlewo", "repo": "nix2container", - "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "rev": "2cd391fc65847ea54e3657a491c379854b556262", "type": "github" }, "original": { @@ -4323,22 +5211,15 @@ }, "n2c_3": { "inputs": { - "flake-utils": "flake-utils_21", - "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] + "flake-utils": "flake-utils_28", + "nixpkgs": "nixpkgs_62" }, "locked": { - "lastModified": 1665039323, - "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "lastModified": 1655533513, + "narHash": "sha256-MAqvv2AZbyNYGJMpV5l9ydN7k66jDErFpaKOvZ1Y7f8=", "owner": "nlewo", "repo": "nix2container", - "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "rev": "2d47dbe633a059d75c7878f554420158712481cb", "type": "github" }, "original": { @@ -4350,123 +5231,92 @@ "nix": { "inputs": { "lowdown-src": "lowdown-src", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_3", "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "lastModified": 1661606874, + "narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=", "owner": "NixOS", "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f", "type": "github" }, "original": { "owner": "NixOS", - "ref": "2.6.0", + "ref": "2.11.0", "repo": "nix", "type": "github" } }, - "nix-nomad": { + "nix-cache-proxy": { "inputs": { - "flake-compat": "flake-compat_6", - "flake-utils": [ - "ogmios", - "haskell-nix", - "tullia", - "nix2container", - "flake-utils" + "devshell": "devshell_11", + "inclusive": [ + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "inclusive" ], - "gomod2nix": "gomod2nix", "nixpkgs": [ - "ogmios", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", "nixpkgs" ], - "nixpkgs-lib": [ - "ogmios", - "haskell-nix", - "tullia", - "nixpkgs" - ] + "utils": "utils_15" }, "locked": { - "lastModified": 1658277770, - "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", - "owner": "tristanpemble", - "repo": "nix-nomad", - "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "lastModified": 1644317729, + "narHash": "sha256-R9R1XHv69VvZ/c7lXYs18PHcnEBXS+hDfhjdkZ96lgw=", + "owner": "input-output-hk", + "repo": "nix-cache-proxy", + "rev": "378617d6b9865be96f7dfa16e0ce3f329da844ec", "type": "github" }, "original": { - "owner": "tristanpemble", - "repo": "nix-nomad", + "owner": "input-output-hk", + "repo": "nix-cache-proxy", "type": "github" } }, - "nix-nomad_2": { + "nix-inclusive": { "inputs": { - "flake-compat": "flake-compat_10", - "flake-utils": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "nix2container", - "flake-utils" - ], - "gomod2nix": "gomod2nix_2", - "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "nixpkgs" - ], - "nixpkgs-lib": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "nixpkgs" - ] + "stdlib": "stdlib_12" }, "locked": { - "lastModified": 1658277770, - "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", - "owner": "tristanpemble", - "repo": "nix-nomad", - "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { - "owner": "tristanpemble", - "repo": "nix-nomad", + "owner": "input-output-hk", + "repo": "nix-inclusive", "type": "github" } }, - "nix-nomad_3": { + "nix-nomad": { "inputs": { - "flake-compat": "flake-compat_13", + "flake-compat": "flake-compat_3", "flake-utils": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", + "cardano-node", "tullia", "nix2container", "flake-utils" ], - "gomod2nix": "gomod2nix_3", + "gomod2nix": "gomod2nix", "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", + "cardano-node", "tullia", "nixpkgs" ], "nixpkgs-lib": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", + "cardano-node", "tullia", "nixpkgs" ] @@ -4488,11 +5338,11 @@ "nix-tools": { "flake": false, "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "lastModified": 1644395812, + "narHash": "sha256-BVFk/BEsTLq5MMZvdy3ZYHKfaS3dHrsKh4+tb5t5b58=", "owner": "input-output-hk", "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "rev": "d847c63b99bbec78bf83be2a61dc9f09b8a9ccc1", "type": "github" }, "original": { @@ -4504,11 +5354,11 @@ "nix-tools_2": { "flake": false, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1649424170, + "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", "owner": "input-output-hk", "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", "type": "github" }, "original": { @@ -4520,11 +5370,11 @@ "nix-tools_3": { "flake": false, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1658968505, + "narHash": "sha256-UnbQ/Ig/23e9hUdDOBwYHwHgHmQawZ2uazpJ8DLIJgE=", "owner": "input-output-hk", "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "rev": "8a754bdcf20b20e116409c2341cf69065d083053", "type": "github" }, "original": { @@ -4536,11 +5386,11 @@ "nix-tools_4": { "flake": false, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1649424170, + "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", "owner": "input-output-hk", "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", "type": "github" }, "original": { @@ -4565,65 +5415,17 @@ "type": "github" } }, - "nix-tools_6": { - "flake": false, - "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_7": { - "flake": false, - "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_8": { - "flake": false, - "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, "nix2container": { "inputs": { - "flake-utils": "flake-utils_7", - "nixpkgs": "nixpkgs_9" + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1658567952, - "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "lastModified": 1671269339, + "narHash": "sha256-KR2SXh4c2Y+bgbCfXjTGJ74O9/u4CAPFA0KYZHhKf5Q=", "owner": "nlewo", "repo": "nix2container", - "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "rev": "6800fff45afecc7e47c334d14cf2b2f4f25601a0", "type": "github" }, "original": { @@ -4634,8 +5436,8 @@ }, "nix2container_2": { "inputs": { - "flake-utils": "flake-utils_15", - "nixpkgs": "nixpkgs_17" + "flake-utils": "flake-utils_4", + "nixpkgs": "nixpkgs_6" }, "locked": { "lastModified": 1658567952, @@ -4653,60 +5455,68 @@ }, "nix2container_3": { "inputs": { - "flake-utils": "flake-utils_19", - "nixpkgs": "nixpkgs_21" + "flake-utils": "flake-utils_30", + "nixpkgs": "nixpkgs_65" }, "locked": { - "lastModified": 1658567952, - "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "lastModified": 1653427219, + "narHash": "sha256-q6MzrIZq1BBFxYN+UQjW60LpQJXV6RIIUmO8gKRyMqg=", "owner": "nlewo", "repo": "nix2container", - "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "rev": "11a0e14c2468720f42ca8dec3b82862abf96c837", "type": "github" }, "original": { "owner": "nlewo", + "ref": "init-nix-db", "repo": "nix2container", "type": "github" } }, - "nixTools": { - "flake": false, + "nix_10": { + "inputs": { + "lowdown-src": "lowdown-src_10", + "nixpkgs": "nixpkgs_45" + }, "locked": { - "lastModified": 1644395812, - "narHash": "sha256-BVFk/BEsTLq5MMZvdy3ZYHKfaS3dHrsKh4+tb5t5b58=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "d847c63b99bbec78bf83be2a61dc9f09b8a9ccc1", + "lastModified": 1604400356, + "narHash": "sha256-PX1cSYv0Y6I2tidcuEwJTo8X5vAvf9vjdfHO51LD/J0=", + "owner": "NixOS", + "repo": "nix", + "rev": "cf82e14712b3be881b7c880468cd5486e8934638", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "nix-tools", + "owner": "NixOS", + "repo": "nix", "type": "github" } }, - "nixTools_2": { - "flake": false, + "nix_11": { + "inputs": { + "lowdown-src": "lowdown-src_11", + "nixpkgs": "nixpkgs_47", + "nixpkgs-regression": "nixpkgs-regression_9" + }, "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "lastModified": 1645189081, + "narHash": "sha256-yZA+07JTG9Z610DceiYyzm+C08yHhcIgfl/Cp7lY3ho=", + "owner": "nixos", + "repo": "nix", + "rev": "9bc03adbba5334663901c1136203bc07e4776be9", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "nix-tools", + "owner": "nixos", + "repo": "nix", "type": "github" } }, - "nix_2": { + "nix_12": { "inputs": { - "lowdown-src": "lowdown-src_2", - "nixpkgs": "nixpkgs_4", - "nixpkgs-regression": "nixpkgs-regression_2" + "lowdown-src": "lowdown-src_12", + "nixpkgs": "nixpkgs_59", + "nixpkgs-regression": "nixpkgs-regression_10" }, "locked": { "lastModified": 1643066034, @@ -4723,11 +5533,11 @@ "type": "github" } }, - "nix_3": { + "nix_13": { "inputs": { - "lowdown-src": "lowdown-src_3", - "nixpkgs": "nixpkgs_7", - "nixpkgs-regression": "nixpkgs-regression_3" + "lowdown-src": "lowdown-src_13", + "nixpkgs": "nixpkgs_61", + "nixpkgs-regression": "nixpkgs-regression_11" }, "locked": { "lastModified": 1643066034, @@ -4744,11 +5554,11 @@ "type": "github" } }, - "nix_4": { + "nix_14": { "inputs": { - "lowdown-src": "lowdown-src_4", - "nixpkgs": "nixpkgs_12", - "nixpkgs-regression": "nixpkgs-regression_4" + "lowdown-src": "lowdown-src_14", + "nixpkgs": "nixpkgs_68", + "nixpkgs-regression": "nixpkgs-regression_12" }, "locked": { "lastModified": 1643066034, @@ -4765,11 +5575,32 @@ "type": "github" } }, - "nix_5": { + "nix_15": { "inputs": { - "lowdown-src": "lowdown-src_5", - "nixpkgs": "nixpkgs_15", - "nixpkgs-regression": "nixpkgs-regression_5" + "lowdown-src": "lowdown-src_15", + "nixpkgs": "nixpkgs_69", + "nixpkgs-regression": "nixpkgs-regression_13" + }, + "locked": { + "lastModified": 1661606874, + "narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=", + "owner": "NixOS", + "repo": "nix", + "rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.11.0", + "repo": "nix", + "type": "github" + } + }, + "nix_16": { + "inputs": { + "lowdown-src": "lowdown-src_16", + "nixpkgs": "nixpkgs_71", + "nixpkgs-regression": "nixpkgs-regression_14" }, "locked": { "lastModified": 1643066034, @@ -4786,23 +5617,166 @@ "type": "github" } }, + "nix_2": { + "inputs": { + "lowdown-src": "lowdown-src_2", + "nixpkgs": "nixpkgs_14", + "nixpkgs-regression": "nixpkgs-regression_2" + }, + "locked": { + "lastModified": 1646164353, + "narHash": "sha256-Nj3ARvplf0Xa+h4F5Cq1r9cc81C2UIpbAKDgJLsDmUc=", + "owner": "kreisys", + "repo": "nix", + "rev": "45677cae8d474270ecd797eb40eb1f8836981604", + "type": "github" + }, + "original": { + "owner": "kreisys", + "ref": "goodnix-maybe-dont-functor", + "repo": "nix", + "type": "github" + } + }, + "nix_3": { + "inputs": { + "lowdown-src": "lowdown-src_3", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1604400356, + "narHash": "sha256-PX1cSYv0Y6I2tidcuEwJTo8X5vAvf9vjdfHO51LD/J0=", + "owner": "NixOS", + "repo": "nix", + "rev": "cf82e14712b3be881b7c880468cd5486e8934638", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nix", + "type": "github" + } + }, + "nix_4": { + "inputs": { + "lowdown-src": "lowdown-src_4", + "nixpkgs": "nixpkgs_18", + "nixpkgs-regression": "nixpkgs-regression_3" + }, + "locked": { + "lastModified": 1645189081, + "narHash": "sha256-yZA+07JTG9Z610DceiYyzm+C08yHhcIgfl/Cp7lY3ho=", + "owner": "nixos", + "repo": "nix", + "rev": "9bc03adbba5334663901c1136203bc07e4776be9", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "type": "github" + } + }, + "nix_5": { + "inputs": { + "lowdown-src": "lowdown-src_5", + "nixpkgs": "nixpkgs_28", + "nixpkgs-regression": "nixpkgs-regression_4" + }, + "locked": { + "lastModified": 1652510778, + "narHash": "sha256-zldZ4SiwkISFXxrbY/UdwooIZ3Z/I6qKxtpc3zD0T/o=", + "owner": "nixos", + "repo": "nix", + "rev": "65cd26eebbbf80eaf0d74092f09b737606cb4b5a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "2.8.1", + "repo": "nix", + "type": "github" + } + }, "nix_6": { "inputs": { "lowdown-src": "lowdown-src_6", - "nixpkgs": "nixpkgs_19", + "nixpkgs": "nixpkgs_30", + "nixpkgs-regression": "nixpkgs-regression_5" + }, + "locked": { + "lastModified": 1645189081, + "narHash": "sha256-yZA+07JTG9Z610DceiYyzm+C08yHhcIgfl/Cp7lY3ho=", + "owner": "nixos", + "repo": "nix", + "rev": "9bc03adbba5334663901c1136203bc07e4776be9", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "type": "github" + } + }, + "nix_7": { + "inputs": { + "lowdown-src": "lowdown-src_7", + "nixpkgs": "nixpkgs_37", "nixpkgs-regression": "nixpkgs-regression_6" }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "lastModified": 1644413094, + "narHash": "sha256-KLGaeSqvhuUFz6DxrB9r3w+lfp9bXIiCT9K1cqg7Ze8=", + "owner": "nixos", + "repo": "nix", + "rev": "52f52319ad21bdbd7a33bb85eccc83756648f110", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "rev": "52f52319ad21bdbd7a33bb85eccc83756648f110", + "type": "github" + } + }, + "nix_8": { + "inputs": { + "lowdown-src": "lowdown-src_8", + "nixpkgs": "nixpkgs_38", + "nixpkgs-regression": "nixpkgs-regression_7" + }, + "locked": { + "lastModified": 1645437800, + "narHash": "sha256-MAMIKi3sIQ0b3jzYyOb5VY29GRgv7JXl1VXoUM9xUZw=", "owner": "NixOS", "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "rev": "f22b9e72f51f97f8f2d334748d3e97123940a146", "type": "github" }, "original": { "owner": "NixOS", - "ref": "2.6.0", + "repo": "nix", + "rev": "f22b9e72f51f97f8f2d334748d3e97123940a146", + "type": "github" + } + }, + "nix_9": { + "inputs": { + "lowdown-src": "lowdown-src_9", + "nixpkgs": "nixpkgs_43", + "nixpkgs-regression": "nixpkgs-regression_8" + }, + "locked": { + "lastModified": 1646164353, + "narHash": "sha256-Nj3ARvplf0Xa+h4F5Cq1r9cc81C2UIpbAKDgJLsDmUc=", + "owner": "kreisys", + "repo": "nix", + "rev": "45677cae8d474270ecd797eb40eb1f8836981604", + "type": "github" + }, + "original": { + "owner": "kreisys", + "ref": "goodnix-maybe-dont-functor", "repo": "nix", "type": "github" } @@ -4810,22 +5784,19 @@ "nixago": { "inputs": { "flake-utils": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "flake-utils" ], "nixago-exts": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "blank" ], "nixpkgs": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" @@ -4845,36 +5816,60 @@ "type": "github" } }, + "nixago-exts": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago-exts_2": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, "nixago_2": { "inputs": { "flake-utils": [ - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "flake-utils" ], - "nixago-exts": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "blank" - ], + "nixago-exts": "nixago-exts", "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1661824785, - "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "lastModified": 1659153038, + "narHash": "sha256-g4npRU8YBR7CAqMF0SyXtkHnoY9q+NcxvZwcc6UvLBc=", "owner": "nix-community", "repo": "nixago", - "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "rev": "608abdd0fe6729d1f7244e03f1a7f8a5d6408898", "type": "github" }, "original": { @@ -4886,36 +5881,25 @@ "nixago_3": { "inputs": { "flake-utils": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", "flake-utils" ], - "nixago-exts": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "blank" - ], + "nixago-exts": "nixago-exts_2", "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1661824785, - "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "lastModified": 1659153038, + "narHash": "sha256-g4npRU8YBR7CAqMF0SyXtkHnoY9q+NcxvZwcc6UvLBc=", "owner": "nix-community", "repo": "nixago", - "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "rev": "608abdd0fe6729d1f7244e03f1a7f8a5d6408898", "type": "github" }, "original": { @@ -4924,69 +5908,68 @@ "type": "github" } }, - "nixpkgs": { + "nixlib": { "locked": { - "lastModified": 1676549890, - "narHash": "sha256-sq/WcOEAl7gWrrfGkWdnyYazRyTf+enEim/o6LOQzI8=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "8c66bd1b68f4708c90dcc97c6f7052a5a7b33257", + "lastModified": 1652576347, + "narHash": "sha256-52Wu7hkcIRcS4UenSSrt01J2sAbbQ6YqxZIDpuEPL/c=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "bdf553800c9c34ed00641785b02038f67f44d671", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" } }, - "nixpkgs-2003": { + "nixlib_2": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "lastModified": 1644107864, + "narHash": "sha256-Wrbt6Gs+hjXD3HUICPBJHKnHEUqiyx8rzHCgvqC1Bok=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "58eabcf65e7dba189eb0013f86831c159e3b2be6", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", + "owner": "nix-community", + "repo": "nixpkgs.lib", "type": "github" } }, - "nixpkgs-2003_10": { + "nixlib_3": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "lastModified": 1656809537, + "narHash": "sha256-pwXBYG3ThN4ccJjvcdNdonQ8Wyv0y/iYdnuesiFUY1U=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "40e271f69106323734b55e2ba74f13bebde324c0", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", + "owner": "nix-community", + "repo": "nixpkgs.lib", "type": "github" } }, - "nixpkgs-2003_11": { + "nixpkgs": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1687420147, + "narHash": "sha256-NILbmZVsoP2Aw0OAIXdbYXrWc/qggIDDyIwZ01yUx+Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "d449a456ba7d81038fc9ec9141eae7ee3aaf2982", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "release-23.05", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_12": { + "nixpkgs-2003": { "locked": { "lastModified": 1620055814, "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", @@ -5098,39 +6081,39 @@ "type": "github" } }, - "nixpkgs-2003_8": { + "nixpkgs-2105": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-21.05-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_9": { + "nixpkgs-2105_2": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1642244250, + "narHash": "sha256-vWpUEqQdVP4srj+/YLJRTN9vjpTs4je0cdWKXPbDItc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "0fd9ee1aa36ce865ad273f4f07fdc093adeb5c00", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-21.05-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105": { + "nixpkgs-2105_3": { "locked": { "lastModified": 1645296114, "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", @@ -5146,13 +6129,13 @@ "type": "github" } }, - "nixpkgs-2105_10": { + "nixpkgs-2105_4": { "locked": { - "lastModified": 1630481079, - "narHash": "sha256-leWXLchbAbqOlLT6tju631G40SzQWPqaAXQG3zH1Imw=", + "lastModified": 1655034179, + "narHash": "sha256-rf1/7AbzuYDw6+8Xvvf3PtEOygymLBrFsFxvext5ZjI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "110a2c9ebbf5d4a94486854f18a37a938cfacbbb", + "rev": "046ee4af7a9f016a364f8f78eeaa356ba524ac31", "type": "github" }, "original": { @@ -5162,13 +6145,13 @@ "type": "github" } }, - "nixpkgs-2105_11": { + "nixpkgs-2105_5": { "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "lastModified": 1645296114, + "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", "type": "github" }, "original": { @@ -5178,7 +6161,7 @@ "type": "github" } }, - "nixpkgs-2105_12": { + "nixpkgs-2105_6": { "locked": { "lastModified": 1659914493, "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", @@ -5194,87 +6177,7 @@ "type": "github" } }, - "nixpkgs-2105_2": { - "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_3": { - "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_4": { - "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_5": { - "locked": { - "lastModified": 1630481079, - "narHash": "sha256-leWXLchbAbqOlLT6tju631G40SzQWPqaAXQG3zH1Imw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "110a2c9ebbf5d4a94486854f18a37a938cfacbbb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_6": { - "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_7": { + "nixpkgs-2105_7": { "locked": { "lastModified": 1645296114, "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", @@ -5290,39 +6193,39 @@ "type": "github" } }, - "nixpkgs-2105_8": { + "nixpkgs-2111": { "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "ref": "nixpkgs-21.11-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105_9": { + "nixpkgs-2111_2": { "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", + "lastModified": 1644510859, + "narHash": "sha256-xjpVvL5ecbyi0vxtVl/Fh9bwGlMbw3S06zE5nUzFB8A=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", + "rev": "0d1d5d7e3679fec9d07f2eb804d9f9fdb98378d3", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "ref": "nixpkgs-21.11-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111": { + "nixpkgs-2111_3": { "locked": { "lastModified": 1648744337, "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", @@ -5338,13 +6241,13 @@ "type": "github" } }, - "nixpkgs-2111_10": { + "nixpkgs-2111_4": { "locked": { - "lastModified": 1638410074, - "narHash": "sha256-MQYI4k4XkoTzpeRjq5wl+1NShsl1CKq8MISFuZ81sWs=", + "lastModified": 1656782578, + "narHash": "sha256-1eMCBEqJplPotTo/SZ/t5HU6Sf2I8qKlZi9MX7jv9fw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5b80f23502f8e902612a8c631dfce383e1c56596", + "rev": "573603b7fdb9feb0eb8efc16ee18a015c667ab1b", "type": "github" }, "original": { @@ -5354,13 +6257,13 @@ "type": "github" } }, - "nixpkgs-2111_11": { + "nixpkgs-2111_5": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "lastModified": 1648744337, + "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", "type": "github" }, "original": { @@ -5370,7 +6273,7 @@ "type": "github" } }, - "nixpkgs-2111_12": { + "nixpkgs-2111_6": { "locked": { "lastModified": 1659446231, "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", @@ -5386,13 +6289,13 @@ "type": "github" } }, - "nixpkgs-2111_2": { + "nixpkgs-2111_7": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "lastModified": 1648744337, + "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", "type": "github" }, "original": { @@ -5402,199 +6305,212 @@ "type": "github" } }, - "nixpkgs-2111_3": { + "nixpkgs-2205": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", + "lastModified": 1682600000, + "narHash": "sha256-ha4BehR1dh8EnXSoE1m/wyyYVvHI9txjW4w5/oxsW5Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "50fc86b75d2744e1ab3837ef74b53f103a9b55a0", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-22.05-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_4": { + "nixpkgs-2205_2": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", + "lastModified": 1657876628, + "narHash": "sha256-URmf0O2cQ/3heg2DJOeLyU/JmfVMqG4X5t9crQXMaeY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "549d82bdd40f760a438c3c3497c1c61160f3de55", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-22.05-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_5": { + "nixpkgs-2205_3": { "locked": { - "lastModified": 1638410074, - "narHash": "sha256-MQYI4k4XkoTzpeRjq5wl+1NShsl1CKq8MISFuZ81sWs=", + "lastModified": 1685573264, + "narHash": "sha256-Zffu01pONhs/pqH07cjlF10NnMDLok8ix5Uk4rhOnZQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5b80f23502f8e902612a8c631dfce383e1c56596", + "rev": "380be19fbd2d9079f677978361792cb25e8a3635", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-22.05-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_6": { + "nixpkgs-2211": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "lastModified": 1682682915, + "narHash": "sha256-haR0u/j/nUvlMloYlaOYq1FMXTvkNHw+wGxc+0qXisM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "rev": "09f1b33fcc0f59263137e23e935c1bb03ec920e4", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-22.11-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_7": { + "nixpkgs-2211_2": { "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "lastModified": 1688392541, + "narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-22.11-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_8": { + "nixpkgs-2305": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", + "lastModified": 1701362232, + "narHash": "sha256-GVdzxL0lhEadqs3hfRLuj+L1OJFGiL/L7gCcelgBlsw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "d2332963662edffacfddfad59ff4f709dde80ffe", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-23.05-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_9": { + "nixpkgs-2311": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", + "lastModified": 1701386440, + "narHash": "sha256-xI0uQ9E7JbmEy/v8kR9ZQan6389rHug+zOtZeZFiDJk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "293822e55ec1872f715a66d0eda9e592dc14419f", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-23.11-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2205": { + "nixpkgs-docker": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", - "owner": "NixOS", + "lastModified": 1652739558, + "narHash": "sha256-znGkjGugajqF/sFS+H4+ENmGTaVPFE0uu1JjQZJLEaQ=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "ff691ed9ba21528c1b4e034f36a04027e4522c58", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", + "owner": "nixos", "repo": "nixpkgs", + "rev": "ff691ed9ba21528c1b4e034f36a04027e4522c58", "type": "github" } }, - "nixpkgs-2205_2": { + "nixpkgs-regression": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" } }, - "nixpkgs-2205_3": { + "nixpkgs-regression_10": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-2205_4": { + "nixpkgs-regression_11": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-regression_12": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" + }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-2211": { + "nixpkgs-regression_13": { "locked": { - "lastModified": 1669997163, - "narHash": "sha256-vhjC0kZMFoN6jzK0GR+tBzKi5KgBXgehadfidW8+Va4=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "6f87491a54d8d64d30af6663cb3bf5d2ee7db958", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-22.11-darwin", "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" } }, - "nixpkgs-regression": { + "nixpkgs-regression_14": { "locked": { "lastModified": 1643052045, "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", @@ -5684,61 +6600,58 @@ "type": "indirect" } }, - "nixpkgs-unstable": { + "nixpkgs-regression_7": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-unstable_10": { + "nixpkgs-regression_8": { "locked": { - "lastModified": 1635295995, - "narHash": "sha256-sGYiXjFlxTTMNb4NSkgvX+knOOTipE6gqwPUQpxNF+c=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "22a500a3f87bbce73bd8d777ef920b43a636f018", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-unstable_11": { + "nixpkgs-regression_9": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-unstable_12": { + "nixpkgs-unstable": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", + "lastModified": 1682656005, + "narHash": "sha256-fYplYo7so1O+rSQ2/aS+SbTPwLTeoUXk4ekKNtSl4P8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "6806b63e824f84b0f0e60b6d660d4ae753de0477", "type": "github" }, "original": { @@ -5750,15 +6663,15 @@ }, "nixpkgs-unstable_2": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", - "owner": "NixOS", + "lastModified": 1646331602, + "narHash": "sha256-cRuytTfel52z947yKfJcZU7zbQBgM16qqTf+oJkVwtg=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "ad267cc9cf3d5a6ae63940df31eb31382d6356e6", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" @@ -5766,15 +6679,15 @@ }, "nixpkgs-unstable_3": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", - "owner": "NixOS", + "lastModified": 1656338871, + "narHash": "sha256-+LOvZFt3MpWtrxXLH4igQtRVzyD43VnuTJjDVbt7phY=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "819e4d63fc7f337a822a049fd055cd7615a5e0d6", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" @@ -5782,15 +6695,15 @@ }, "nixpkgs-unstable_4": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", - "owner": "NixOS", + "lastModified": 1646331602, + "narHash": "sha256-cRuytTfel52z947yKfJcZU7zbQBgM16qqTf+oJkVwtg=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "ad267cc9cf3d5a6ae63940df31eb31382d6356e6", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" @@ -5798,11 +6711,11 @@ }, "nixpkgs-unstable_5": { "locked": { - "lastModified": 1635295995, - "narHash": "sha256-sGYiXjFlxTTMNb4NSkgvX+knOOTipE6gqwPUQpxNF+c=", + "lastModified": 1648219316, + "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "22a500a3f87bbce73bd8d777ef920b43a636f018", + "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", "type": "github" }, "original": { @@ -5814,11 +6727,11 @@ }, "nixpkgs-unstable_6": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", + "lastModified": 1657888067, + "narHash": "sha256-GnwJoFBTPfW3+mz7QEeJEEQ9OMHZOiIJ/qDhZxrlKh8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "65fae659e31098ca4ac825a6fef26d890aaf3f4e", "type": "github" }, "original": { @@ -5846,11 +6759,11 @@ }, "nixpkgs-unstable_8": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", + "lastModified": 1701336116, + "narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "f5c27c6136db4d76c30e533c20517df6864c46ee", "type": "github" }, "original": { @@ -5862,11 +6775,11 @@ }, "nixpkgs-unstable_9": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", + "lastModified": 1648219316, + "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", "type": "github" }, "original": { @@ -5878,15 +6791,15 @@ }, "nixpkgs_10": { "locked": { - "lastModified": 1665087388, - "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", - "owner": "nixos", + "lastModified": 1644972330, + "narHash": "sha256-6V2JFpTUzB9G+KcqtUR1yl7f6rd9495YrFECslEmbGw=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "rev": "19574af0af3ffaf7c9e359744ed32556f34536bd", "type": "github" }, "original": { - "owner": "nixos", + "owner": "NixOS", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" @@ -5894,11 +6807,11 @@ }, "nixpkgs_11": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1627969475, + "narHash": "sha256-MhVtkVt1MFfaDY3ObJu54NBcsaPk19vOBZ8ouhjO4qs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "bd27e2e8316ac6eab11aa35c586e743286f23ecf", "type": "github" }, "original": { @@ -5908,100 +6821,120 @@ }, "nixpkgs_12": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "lastModified": 1644972330, + "narHash": "sha256-6V2JFpTUzB9G+KcqtUR1yl7f6rd9495YrFECslEmbGw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "rev": "19574af0af3ffaf7c9e359744ed32556f34536bd", "type": "github" }, "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs_13": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" - } + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } }, "nixpkgs_14": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { "id": "nixpkgs", + "ref": "nixos-21.05-small", "type": "indirect" } }, "nixpkgs_15": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", + "lastModified": 1638452135, + "narHash": "sha256-5Il6hgrTgcWIsB7zug0yDFccYXx7pJCw8cwJdXMuLfM=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", "type": "github" }, "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" + "owner": "nixos", + "repo": "nixpkgs", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", + "type": "github" } }, "nixpkgs_16": { "locked": { - "lastModified": 1653581809, - "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", + "lastModified": 1602702596, + "narHash": "sha256-fqJ4UgOb4ZUnCDIapDb4gCrtAah5Rnr2/At3IzMitig=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "rev": "ad0d20345219790533ebe06571f82ed6b034db31", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-20.09-small", + "type": "indirect" } }, "nixpkgs_17": { "locked": { - "lastModified": 1654807842, - "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "lastModified": 1638887115, + "narHash": "sha256-emjtIeqyJ84Eb3X7APJruTrwcfnHQKs55XGljj62prs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "rev": "1bd4bbd49bef217a3d1adea43498270d6e779d65", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixos-21.11", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_18": { "locked": { - "lastModified": 1665087388, - "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1641909823, + "narHash": "sha256-Uxo+Wm6c/ijNhaJlYtFLJG9mh75FYZaBreMC2ZE0nEY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "rev": "f0f67400bc49c44f305d6fe17698a2f1ce1c29a0", "type": "github" }, "original": { @@ -6011,74 +6944,75 @@ "type": "github" } }, - "nixpkgs_19": { + "nixpkgs_2": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "lastModified": 1642336556, + "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", "type": "github" }, "original": { "id": "nixpkgs", - "ref": "nixos-21.05-small", "type": "indirect" } }, - "nixpkgs_2": { + "nixpkgs_20": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", + "lastModified": 1647350163, + "narHash": "sha256-OcMI+PFEHTONthXuEQNddt16Ml7qGvanL3x8QOl2Aao=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "rev": "3eb07eeafb52bcbf02ce800f032f18d666a9498d", "type": "github" }, "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_20": { + "nixpkgs_21": { "locked": { - "lastModified": 1653581809, - "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_21": { + "nixpkgs_22": { "locked": { - "lastModified": 1654807842, - "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "lastModified": 1646506091, + "narHash": "sha256-sWNAJE2m+HOh1jtXlHcnhxsj6/sXrHgbqVNcVRlveK4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "rev": "3e644bd62489b516292c816f70bf0052c693b3c7", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_22": { + "nixpkgs_23": { "locked": { - "lastModified": 1665087388, - "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "lastModified": 1658119717, + "narHash": "sha256-4upOZIQQ7Bc4CprqnHsKnqYfw+arJeAuU+QcpjYBXW0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "rev": "9eb60f25aff0d2218c848dd4574a0ab5e296cabe", "type": "github" }, "original": { @@ -6088,27 +7022,75 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_24": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_25": { + "locked": { + "lastModified": 1652576347, + "narHash": "sha256-52Wu7hkcIRcS4UenSSrt01J2sAbbQ6YqxZIDpuEPL/c=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "bdf553800c9c34ed00641785b02038f67f44d671", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1642451377, + "narHash": "sha256-hvAuYDUN8XIrcQKE6wDw4LjTCcwrTp2B1i1i/5vfDMQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "e5b47c5c21336e3fdd887d24c7e34363fa09c6d7", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_28": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "lastModified": 1645296114, + "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", "type": "github" }, "original": { @@ -6117,35 +7099,39 @@ "type": "indirect" } }, - "nixpkgs_5": { + "nixpkgs_29": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1652559422, + "narHash": "sha256-jPVTNImBTUIFdtur+d4IVot6eXmsvtOcBm0TzxmhWPk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "8b3398bc7587ebb79f93dfeea1b8c574d3c6dba1", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "nixos", + "ref": "nixos-21.11", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_6": { + "nixpkgs_3": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1657693803, + "narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "365e1b3a859281cf11b94f87231adeabbdd878a2", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-22.05-small", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_7": { + "nixpkgs_30": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -6160,1024 +7146,2513 @@ "type": "indirect" } }, - "nixpkgs_8": { + "nixpkgs_31": { "locked": { - "lastModified": 1653581809, - "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", - "owner": "NixOS", + "lastModified": 1641909823, + "narHash": "sha256-Uxo+Wm6c/ijNhaJlYtFLJG9mh75FYZaBreMC2ZE0nEY=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "rev": "f0f67400bc49c44f305d6fe17698a2f1ce1c29a0", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixos-unstable", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_9": { + "nixpkgs_32": { "locked": { - "lastModified": 1654807842, - "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", - "owner": "NixOS", + "lastModified": 1647350163, + "narHash": "sha256-OcMI+PFEHTONthXuEQNddt16Ml7qGvanL3x8QOl2Aao=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "rev": "3eb07eeafb52bcbf02ce800f032f18d666a9498d", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "node-process": { - "flake": false, + "nixpkgs_33": { "locked": { - "lastModified": 1648681325, - "narHash": "sha256-6oWDYmMb+V4x0jCoYDzKfBJMpr7Mx5zA3WMpNHspuSw=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "78675fbf8986c87c0d2356b727a0ec2060f1adba", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", "type": "github" } }, - "node-process_2": { - "flake": false, + "nixpkgs_34": { "locked": { - "lastModified": 1654323094, - "narHash": "sha256-zbmpZeBgUUly8QgR2mrVUN0A+0iLczufNvCCRxAo3GY=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "ec20745f17cb4fa8824fdf341d1412c774bc94b9", + "lastModified": 1658311025, + "narHash": "sha256-GqagY5YmaZB3YaO41kKcQhe5RcpS83wnsW8iCu5Znqo=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "cd8d1784506a7c7eb0796772b73437e0b82fad57", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", "type": "github" } }, - "node-snapshot": { - "inputs": { - "customConfig": "customConfig_2", - "haskellNix": "haskellNix_2", - "iohkNix": "iohkNix_2", - "membench": "membench", - "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "haskellNix", - "nixpkgs-2105" - ], - "plutus-example": "plutus-example", - "utils": "utils_3" - }, + "nixpkgs_35": { "locked": { - "lastModified": 1645120669, - "narHash": "sha256-2MKfGsYS5n69+pfqNHb4IH/E95ok1MD7mhEYfUpRcz4=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "lastModified": 1646331602, + "narHash": "sha256-cRuytTfel52z947yKfJcZU7zbQBgM16qqTf+oJkVwtg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ad267cc9cf3d5a6ae63940df31eb31382d6356e6", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", "type": "github" } }, - "node-snapshot_2": { - "inputs": { - "customConfig": "customConfig_6", - "haskellNix": "haskellNix_6", - "iohkNix": "iohkNix_6", - "membench": "membench_3", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "haskellNix", - "nixpkgs-2105" - ], - "plutus-example": "plutus-example_2", - "utils": "utils_8" - }, + "nixpkgs_36": { "locked": { - "lastModified": 1645120669, - "narHash": "sha256-2MKfGsYS5n69+pfqNHb4IH/E95ok1MD7mhEYfUpRcz4=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "lastModified": 1643381941, + "narHash": "sha256-pHTwvnN4tTsEKkWlXQ8JMY423epos8wUOhthpwJjtpc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5efc8ca954272c4376ac929f4c5ffefcc20551d5", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", "type": "github" } }, - "ogmios": { - "inputs": { - "CHaP": "CHaP", - "blank": "blank", - "cardano-configurations": "cardano-configurations_2", - "cardano-node": "cardano-node", - "flake-compat": "flake-compat_4", - "haskell-nix": "haskell-nix_2", - "iohk-nix": "iohk-nix_2", - "nixpkgs": [ - "ogmios", - "haskell-nix", - "nixpkgs-unstable" - ] - }, + "nixpkgs_37": { "locked": { - "lastModified": 1670513793, - "narHash": "sha256-A3qj7tUSjya+ZI4lFkdJbOxelQhgQLc9RNPhcNJLIkw=", - "owner": "mlabs-haskell", - "repo": "ogmios", - "rev": "a7687bc03b446bc74564abe1873fbabfa1aac196", - "type": "github" - }, + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_38": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_39": { + "locked": { + "lastModified": 1644486793, + "narHash": "sha256-EeijR4guVHgVv+JpOX3cQO+1XdrkJfGmiJ9XVsVU530=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1882c6b7368fd284ad01b0a5b5601ef136321292", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "locked": { + "lastModified": 1627969475, + "narHash": "sha256-MhVtkVt1MFfaDY3ObJu54NBcsaPk19vOBZ8ouhjO4qs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bd27e2e8316ac6eab11aa35c586e743286f23ecf", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_41": { + "locked": { + "lastModified": 1644972330, + "narHash": "sha256-6V2JFpTUzB9G+KcqtUR1yl7f6rd9495YrFECslEmbGw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "19574af0af3ffaf7c9e359744ed32556f34536bd", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_42": { + "locked": { + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_43": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1638452135, + "narHash": "sha256-5Il6hgrTgcWIsB7zug0yDFccYXx7pJCw8cwJdXMuLfM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1602702596, + "narHash": "sha256-fqJ4UgOb4ZUnCDIapDb4gCrtAah5Rnr2/At3IzMitig=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ad0d20345219790533ebe06571f82ed6b034db31", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-20.09-small", + "type": "indirect" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1638887115, + "narHash": "sha256-emjtIeqyJ84Eb3X7APJruTrwcfnHQKs55XGljj62prs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1bd4bbd49bef217a3d1adea43498270d6e779d65", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-21.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_48": { + "locked": { + "lastModified": 1641909823, + "narHash": "sha256-Uxo+Wm6c/ijNhaJlYtFLJG9mh75FYZaBreMC2ZE0nEY=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "f0f67400bc49c44f305d6fe17698a2f1ce1c29a0", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_49": { + "locked": { + "lastModified": 1647350163, + "narHash": "sha256-OcMI+PFEHTONthXuEQNddt16Ml7qGvanL3x8QOl2Aao=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "3eb07eeafb52bcbf02ce800f032f18d666a9498d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "locked": { + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1646506091, + "narHash": "sha256-sWNAJE2m+HOh1jtXlHcnhxsj6/sXrHgbqVNcVRlveK4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e644bd62489b516292c816f70bf0052c693b3c7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1658119717, + "narHash": "sha256-4upOZIQQ7Bc4CprqnHsKnqYfw+arJeAuU+QcpjYBXW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "9eb60f25aff0d2218c848dd4574a0ab5e296cabe", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1646470760, + "narHash": "sha256-dQISyucVCCPaFioUhy5ZgfBz8rOMKGI8k13aPDFTqEs=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1fc7212a2c3992eedc6eedf498955c321ad81cc2", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1fc7212a2c3992eedc6eedf498955c321ad81cc2", + "type": "github" + } + }, + "nixpkgs_55": { + "locked": { + "lastModified": 1619531122, + "narHash": "sha256-ovm5bo6PkZzNKh2YGXbRKYIjega0EjiEP0YDwyeXEYU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bb80d578e8ad3cb5a607f468ac00cc546d0396dc", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_56": { + "locked": { + "lastModified": 1656461576, + "narHash": "sha256-rlmmw6lIlkMQIiB+NsnO8wQYWTfle8TA41UREPLP5VY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "cf3ab54b4afe2b7477faa1dd0b65bf74c055d70c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1655567057, + "narHash": "sha256-Cc5hQSMsTzOHmZnYm8OSJ5RNUp22bd5NADWLHorULWQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e0a42267f73ea52adc061a64650fddc59906fc99", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1656401090, + "narHash": "sha256-bUS2nfQsvTQW2z8SK7oEFSElbmoBahOPtbXPm0AL3I4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "16de63fcc54e88b9a106a603038dd5dd2feb21eb", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1656809537, + "narHash": "sha256-pwXBYG3ThN4ccJjvcdNdonQ8Wyv0y/iYdnuesiFUY1U=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "40e271f69106323734b55e2ba74f13bebde324c0", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "locked": { + "lastModified": 1656947410, + "narHash": "sha256-htDR/PZvjUJGyrRJsVqDmXR8QeoswBaRLzHt13fd0iY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e8d47977286a44955262adbc76f2c8a66e7419d5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_64": { + "locked": { + "lastModified": 1658311025, + "narHash": "sha256-GqagY5YmaZB3YaO41kKcQhe5RcpS83wnsW8iCu5Znqo=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "cd8d1784506a7c7eb0796772b73437e0b82fad57", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1642451377, + "narHash": "sha256-hvAuYDUN8XIrcQKE6wDw4LjTCcwrTp2B1i1i/5vfDMQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e5b47c5c21336e3fdd887d24c7e34363fa09c6d7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1653920503, + "narHash": "sha256-BBeCZwZImtjP3oYy4WogkQYy5OxNyfNciVSc1AfZgLQ=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a634c8f6c1fbf9b9730e01764999666f3436f10a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-22.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1650469885, + "narHash": "sha256-BuILRZ6pzMnGey8/irbjGq1oo3vIvZa1pitSdZCmIXA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "df78cc4e2a46fca75d14508a5d2ed3494add28ff", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1657693803, + "narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "365e1b3a859281cf11b94f87231adeabbdd878a2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.05-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1674407282, + "narHash": "sha256-2qwc8mrPINSFdWffPK+ji6nQ9aGnnZyHSItVcYDZDlk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ab1254087f4cdf4af74b552d7fc95175d9bdbb49", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1697723726, + "narHash": "sha256-SaTWPkI8a5xSHX/rrKzUe+/uVNy6zCGMXgoeMb7T9rg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "7c9cc5a6e5d38010801741ac830a3f8fd667a7a0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1627969475, + "narHash": "sha256-MhVtkVt1MFfaDY3ObJu54NBcsaPk19vOBZ8ouhjO4qs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bd27e2e8316ac6eab11aa35c586e743286f23ecf", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nomad": { + "inputs": { + "nix": "nix_3", + "nixpkgs": "nixpkgs_17", + "utils": "utils_4" + }, + "locked": { + "lastModified": 1648128770, + "narHash": "sha256-iv5Zjddi28OJH7Kh8/oGJ0k32PQXiY+56qXKiLIxSEI=", + "owner": "input-output-hk", + "repo": "nomad", + "rev": "beb504f6c8bd832e1d4509e4104187774b8ecfc0", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "release-1.2.6", + "repo": "nomad", + "type": "github" + } + }, + "nomad-driver-nix": { + "inputs": { + "devshell": "devshell_2", + "inclusive": "inclusive", + "nix": "nix_4", + "nixpkgs": "nixpkgs_19", + "utils": "utils_5" + }, + "locked": { + "lastModified": 1648029666, + "narHash": "sha256-kShItLLtoWLqE+6Uzc8171a+NXST4arZgxEP0SYPp44=", + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "rev": "0be4fea24e1b747389b2e79813891805fed521b6", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "type": "github" + } + }, + "nomad-driver-nix_2": { + "inputs": { + "devshell": "devshell_5", + "inclusive": "inclusive_4", + "nix": "nix_6", + "nixpkgs": "nixpkgs_31", + "utils": "utils_10" + }, + "locked": { + "lastModified": 1648029666, + "narHash": "sha256-kShItLLtoWLqE+6Uzc8171a+NXST4arZgxEP0SYPp44=", + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "rev": "0be4fea24e1b747389b2e79813891805fed521b6", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "type": "github" + } + }, + "nomad-driver-nix_3": { + "inputs": { + "devshell": "devshell_12", + "inclusive": "inclusive_9", + "nix": "nix_11", + "nixpkgs": "nixpkgs_48", + "utils": "utils_19" + }, + "locked": { + "lastModified": 1648029666, + "narHash": "sha256-kShItLLtoWLqE+6Uzc8171a+NXST4arZgxEP0SYPp44=", + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "rev": "0be4fea24e1b747389b2e79813891805fed521b6", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-driver-nix", + "type": "github" + } + }, + "nomad-follower": { + "inputs": { + "devshell": "devshell_3", + "inclusive": "inclusive_2", + "nixpkgs": "nixpkgs_20", + "utils": "utils_6" + }, + "locked": { + "lastModified": 1649836589, + "narHash": "sha256-0mKWIfF7RtkwiJv2NlWKisdyivsSlHMTAQ3P72RSD3k=", + "owner": "input-output-hk", + "repo": "nomad-follower", + "rev": "18cafe87df773e61a6ce300d9ff91dee4aeae053", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-follower", + "type": "github" + } + }, + "nomad-follower_2": { + "inputs": { + "devshell": "devshell_6", + "inclusive": "inclusive_5", + "nixpkgs": "nixpkgs_32", + "utils": "utils_11" + }, + "locked": { + "lastModified": 1658244176, + "narHash": "sha256-oM+7WdbXcTiDEfuuiiVLlJi/MTRgSBwFdzVkFWsC8so=", + "owner": "input-output-hk", + "repo": "nomad-follower", + "rev": "bd8cc28c94ba8bd48c4d4be5ab14f3904328dde3", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-follower", + "type": "github" + } + }, + "nomad-follower_3": { + "inputs": { + "devshell": "devshell_13", + "inclusive": "inclusive_10", + "nixpkgs": "nixpkgs_49", + "utils": "utils_20" + }, + "locked": { + "lastModified": 1649836589, + "narHash": "sha256-0mKWIfF7RtkwiJv2NlWKisdyivsSlHMTAQ3P72RSD3k=", + "owner": "input-output-hk", + "repo": "nomad-follower", + "rev": "18cafe87df773e61a6ce300d9ff91dee4aeae053", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nomad-follower", + "type": "github" + } + }, + "nomad_2": { + "inputs": { + "nix": "nix_10", + "nixpkgs": "nixpkgs_46", + "utils": "utils_18" + }, + "locked": { + "lastModified": 1648128770, + "narHash": "sha256-iv5Zjddi28OJH7Kh8/oGJ0k32PQXiY+56qXKiLIxSEI=", + "owner": "input-output-hk", + "repo": "nomad", + "rev": "beb504f6c8bd832e1d4509e4104187774b8ecfc0", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "release-1.2.6", + "repo": "nomad", + "type": "github" + } + }, + "nosys": { + "locked": { + "lastModified": 1667881534, + "narHash": "sha256-FhwJ15uPLRsvaxtt/bNuqE/ykMpNAPF0upozFKhTtXM=", + "owner": "divnix", + "repo": "nosys", + "rev": "2d0d5207f6a230e9d0f660903f8db9807b54814f", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "nosys", + "type": "github" + } + }, + "ogmios": { + "flake": false, + "locked": { + "lastModified": 1657544501, + "narHash": "sha256-fAQEj/toAIyKTQWgw/fTVe3wpCsBnCCJgcQ7+QiMpO4=", + "owner": "CardanoSolutions", + "repo": "ogmios", + "rev": "a0dfd03117afe4db5daa7ebb818310d6bcef2990", + "type": "github" + }, + "original": { + "owner": "CardanoSolutions", + "ref": "v5.5.2", + "repo": "ogmios", + "type": "github" + } + }, + "ogmios-nixos": { + "inputs": { + "CHaP": "CHaP_3", + "blank": "blank_5", + "cardano-configurations": "cardano-configurations_2", + "cardano-node": [ + "cardano-node" + ], + "flake-compat": "flake-compat_13", + "haskell-nix": [ + "haskell-nix" + ], + "iohk-nix": [ + "iohk-nix" + ], + "nixpkgs": [ + "nixpkgs" + ], + "ogmios-src": [ + "ogmios" + ] + }, + "locked": { + "lastModified": 1695289922, + "narHash": "sha256-WeZkYCyvOqnVx9zYgyO2rh0rd3O2DmxH0HZ4OJnf/aw=", + "owner": "mlabs-haskell", + "repo": "ogmios-nixos", + "rev": "78e829e9ebd50c5891024dcd1004c2ac51facd80", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "repo": "ogmios-nixos", + "rev": "78e829e9ebd50c5891024dcd1004c2ac51facd80", + "type": "github" + } + }, + "ogmios_2": { + "flake": false, + "locked": { + "lastModified": 1691769233, + "narHash": "sha256-7CLprKq3RwJfvy31LAPux+DYFLjEmbRBFgvtYDpJA8Q=", + "owner": "CardanoSolutions", + "repo": "ogmios", + "rev": "3d3f359b0987c009ef66fb4d4b4bddce92b9aeb3", + "type": "github" + }, + "original": { + "owner": "CardanoSolutions", + "ref": "v6.0.0", + "repo": "ogmios", + "type": "github" + } + }, + "old-ghc-nix": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "old-ghc-nix_2": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "old-ghc-nix_3": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "old-ghc-nix_4": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "old-ghc-nix_5": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "old-ghc-nix_6": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "old-ghc-nix_7": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "ops-lib": { + "flake": false, + "locked": { + "lastModified": 1675186784, + "narHash": "sha256-HqDtrvk1l7YeREzCSEpUtChtlEgT6Tww9WrJiozjukc=", + "owner": "input-output-hk", + "repo": "ops-lib", + "rev": "5be29ed53b2a4cbbf4cf326fa2e9c1f2b754d26d", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "ops-lib", + "type": "github" + } + }, + "ops-lib_2": { + "flake": false, + "locked": { + "lastModified": 1649848729, + "narHash": "sha256-5zN9gpn+DwdB67bcHfDD8zgMnR0EaJd2JVNMyL6J1N0=", + "owner": "input-output-hk", + "repo": "ops-lib", + "rev": "517c747f4d5d56e626f62618803bfccb09f14019", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "ops-lib", + "type": "github" + } + }, + "ops-lib_3": { + "flake": false, + "locked": { + "lastModified": 1649848729, + "narHash": "sha256-5zN9gpn+DwdB67bcHfDD8zgMnR0EaJd2JVNMyL6J1N0=", + "owner": "input-output-hk", + "repo": "ops-lib", + "rev": "517c747f4d5d56e626f62618803bfccb09f14019", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "ops-lib", + "type": "github" + } + }, + "ops-lib_4": { + "flake": false, + "locked": { + "lastModified": 1649848729, + "narHash": "sha256-5zN9gpn+DwdB67bcHfDD8zgMnR0EaJd2JVNMyL6J1N0=", + "owner": "input-output-hk", + "repo": "ops-lib", + "rev": "517c747f4d5d56e626f62618803bfccb09f14019", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "ops-lib", + "type": "github" + } + }, + "plutip": { + "inputs": { + "CHaP": "CHaP_4", + "cardano-node": [ + "cardano-node" + ], + "flake-compat": "flake-compat_14", + "hackage-nix": [ + "hackage-nix" + ], + "haskell-nix": [ + "haskell-nix" + ], + "iohk-nix": [ + "iohk-nix" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1695131439, + "narHash": "sha256-7ZhZUDhlFvV2us4G27iAk6lHezKS/4WA07NQn88VtQU=", + "owner": "mlabs-haskell", + "repo": "plutip", + "rev": "1bf0b547cd3689c727586abb8385c008fb2a3d1c", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "ref": "gergely/version-bump", + "repo": "plutip", + "type": "github" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils_17", + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1641849362, + "narHash": "sha256-1K3NOM0ZoFRVxU3HJ2G8CMZEtyRn0RpuUjsws7jKsds=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "6b063a31bc8fea6c1d9fdc47e9078772b0ba283b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "fetched-projectdir-test", + "repo": "poetry2nix", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-utils": "flake-utils_23", + "nixpkgs": "nixpkgs_55" + }, + "locked": { + "lastModified": 1639823344, + "narHash": "sha256-jlsQb2y6A5dB1R0wVPLOfDGM0wLyfYqEJNzMtXuzCXw=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "ff9c0b459ddc4b79c06e19d44251daa8e9cd1746", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "ragenix": { + "inputs": { + "agenix": "agenix_3", + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_21", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1641119695, + "narHash": "sha256-fksD2ftdEdFfB4BiB9iQCJt2QJ/CJogqk4mBNy9rY/0=", + "owner": "yaxitech", + "repo": "ragenix", + "rev": "71147db3f221d0a5c86b393d5c60d51b70f39fe3", + "type": "github" + }, + "original": { + "owner": "yaxitech", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_2": { + "inputs": { + "agenix": "agenix_4", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_24", + "rust-overlay": "rust-overlay_2" + }, + "locked": { + "lastModified": 1645147603, + "narHash": "sha256-xraqK0vwr+AF9om7b3xIaP5AqEQqMb1DLVuUjGzM+98=", + "owner": "input-output-hk", + "repo": "ragenix", + "rev": "194a625a97262f704b619acfccf27a5b9e6faea8", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_3": { + "inputs": { + "agenix": "agenix_5", + "flake-utils": "flake-utils_12", + "nixpkgs": "nixpkgs_33", + "rust-overlay": "rust-overlay_3" + }, + "locked": { + "lastModified": 1641119695, + "narHash": "sha256-fksD2ftdEdFfB4BiB9iQCJt2QJ/CJogqk4mBNy9rY/0=", + "owner": "yaxitech", + "repo": "ragenix", + "rev": "71147db3f221d0a5c86b393d5c60d51b70f39fe3", + "type": "github" + }, + "original": { + "owner": "yaxitech", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_4": { + "inputs": { + "agenix": "agenix_7", + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_50", + "rust-overlay": "rust-overlay_4" + }, + "locked": { + "lastModified": 1641119695, + "narHash": "sha256-fksD2ftdEdFfB4BiB9iQCJt2QJ/CJogqk4mBNy9rY/0=", + "owner": "yaxitech", + "repo": "ragenix", + "rev": "71147db3f221d0a5c86b393d5c60d51b70f39fe3", + "type": "github" + }, + "original": { + "owner": "yaxitech", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_5": { + "inputs": { + "agenix": "agenix_8", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_53", + "rust-overlay": "rust-overlay_5" + }, + "locked": { + "lastModified": 1645147603, + "narHash": "sha256-xraqK0vwr+AF9om7b3xIaP5AqEQqMb1DLVuUjGzM+98=", + "owner": "input-output-hk", + "repo": "ragenix", + "rev": "194a625a97262f704b619acfccf27a5b9e6faea8", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "ragenix", + "type": "github" + } + }, + "root": { + "inputs": { + "CHaP": "CHaP", + "blockfrost": "blockfrost", + "cardano-configurations": "cardano-configurations", + "cardano-node": "cardano-node", + "db-sync": "db-sync", + "easy-purescript-nix": "easy-purescript-nix", + "flake-compat": "flake-compat_11", + "hackage-nix": "hackage-nix", + "haskell-nix": "haskell-nix_3", + "hercules-ci-effects": "hercules-ci-effects", + "iohk-nix": "iohk-nix_2", + "kupo": "kupo", + "kupo-nixos": "kupo-nixos", + "nixpkgs": [ + "haskell-nix", + "nixpkgs-unstable" + ], + "ogmios": "ogmios_2", + "ogmios-nixos": "ogmios-nixos", + "plutip": "plutip" + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1645024434, + "narHash": "sha256-ZYwqOkx9MYKmbuqkLJdRhIn7IghMRclbUzxJgR7OOhA=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "89faff7477e904f6820990f130a3aed72c1d7e6b", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_2": { + "flake": false, + "locked": { + "lastModified": 1649178056, + "narHash": "sha256-dcf7vKAkpdNvjd243LTGkUD6zLaLPN5deM2WTysG/Zs=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "2366d8e05f5f3585f95058fa7427cbde079914ed", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_3": { + "flake": false, + "locked": { + "lastModified": 1645024434, + "narHash": "sha256-ZYwqOkx9MYKmbuqkLJdRhIn7IghMRclbUzxJgR7OOhA=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "89faff7477e904f6820990f130a3aed72c1d7e6b", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_4": { + "flake": false, + "locked": { + "lastModified": 1660579619, + "narHash": "sha256-2+V7SO3mBd9Copi5yiSHNFzSXMuTNi4OH8JnY1Z82ds=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "3903243192d2bd6c38b43d12ffa9d2fa1601c2ec", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_5": { + "flake": false, + "locked": { + "lastModified": 1645024434, + "narHash": "sha256-ZYwqOkx9MYKmbuqkLJdRhIn7IghMRclbUzxJgR7OOhA=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "89faff7477e904f6820990f130a3aed72c1d7e6b", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_6": { + "flake": false, + "locked": { + "lastModified": 1649178056, + "narHash": "sha256-dcf7vKAkpdNvjd243LTGkUD6zLaLPN5deM2WTysG/Zs=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "2366d8e05f5f3585f95058fa7427cbde079914ed", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "ragenix", + "flake-utils" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1641017392, + "narHash": "sha256-xpsPFK67HRtlk+39l4I7vko7QKZLBg3AqbXK3MkQoDY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4000e09a515c0f046a1b8b067f7324111187b115", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_2": { + "inputs": { + "flake-utils": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "ragenix", + "flake-utils" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "capsules", + "ragenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1644633594, + "narHash": "sha256-Te6mBYYirUwsoqENvVx1K1EEoRq2CKrTnNkWF42jNgE=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "14c48021a9a5fe6ea8ae6b21c15caa106afa9d19", + "type": "github" + }, "original": { - "owner": "mlabs-haskell", - "repo": "ogmios", - "rev": "a7687bc03b446bc74564abe1873fbabfa1aac196", + "owner": "oxalica", + "repo": "rust-overlay", "type": "github" } }, - "ogmios-nixos": { + "rust-overlay_3": { "inputs": { - "CHaP": "CHaP_3", - "blank": "blank_3", - "cardano-configurations": "cardano-configurations_3", - "cardano-node": "cardano-node_2", - "flake-compat": "flake-compat_8", - "haskell-nix": "haskell-nix_3", - "iohk-nix": "iohk-nix_3", + "flake-utils": [ + "db-sync", + "cardano-world", + "bitte", + "ragenix", + "flake-utils" + ], "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", - "nixpkgs-unstable" + "db-sync", + "cardano-world", + "bitte", + "ragenix", + "nixpkgs" ] }, "locked": { - "lastModified": 1668087435, - "narHash": "sha256-pbx/+mP2pu4vQuTV3YtFXrOZOVOBS9JH9eDqgjnHyZ4=", - "owner": "mlabs-haskell", - "repo": "ogmios", - "rev": "3b229c1795efa30243485730b78ea053992fdc7a", + "lastModified": 1641017392, + "narHash": "sha256-xpsPFK67HRtlk+39l4I7vko7QKZLBg3AqbXK3MkQoDY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4000e09a515c0f046a1b8b067f7324111187b115", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "ogmios", + "owner": "oxalica", + "repo": "rust-overlay", "type": "github" } }, - "old-ghc-nix": { + "rust-overlay_4": { + "inputs": { + "flake-utils": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "ragenix", + "flake-utils" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1641017392, + "narHash": "sha256-xpsPFK67HRtlk+39l4I7vko7QKZLBg3AqbXK3MkQoDY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4000e09a515c0f046a1b8b067f7324111187b115", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_5": { + "inputs": { + "flake-utils": [ + "db-sync", + "cardano-world", + "capsules", + "ragenix", + "flake-utils" + ], + "nixpkgs": [ + "db-sync", + "cardano-world", + "capsules", + "ragenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1644633594, + "narHash": "sha256-Te6mBYYirUwsoqENvVx1K1EEoRq2CKrTnNkWF42jNgE=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "14c48021a9a5fe6ea8ae6b21c15caa106afa9d19", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "secp256k1": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1683999695, + "narHash": "sha256-9nJJVENMXjXEJZzw8DHzin1DkFkF8h9m/c6PuM7Uk4s=", + "owner": "bitcoin-core", + "repo": "secp256k1", + "rev": "acf5c55ae6a94e5ca847e07def40427547876101", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "bitcoin-core", + "ref": "v0.3.2", + "repo": "secp256k1", "type": "github" } }, - "old-ghc-nix_10": { + "secp256k1_2": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1683999695, + "narHash": "sha256-9nJJVENMXjXEJZzw8DHzin1DkFkF8h9m/c6PuM7Uk4s=", + "owner": "bitcoin-core", + "repo": "secp256k1", + "rev": "acf5c55ae6a94e5ca847e07def40427547876101", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "bitcoin-core", + "ref": "v0.3.2", + "repo": "secp256k1", "type": "github" } }, - "old-ghc-nix_11": { + "sodium": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1675156279, + "narHash": "sha256-0uRcN5gvMwO7MCXVYnoqG/OmeBFi8qRVnDWJLnBb9+Y=", + "owner": "input-output-hk", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "input-output-hk", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" } }, - "old-ghc-nix_12": { + "sodium_2": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1675156279, + "narHash": "sha256-0uRcN5gvMwO7MCXVYnoqG/OmeBFi8qRVnDWJLnBb9+Y=", + "owner": "input-output-hk", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "input-output-hk", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" } }, - "old-ghc-nix_2": { + "stackage": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1685491814, + "narHash": "sha256-OQX+h5hcDptW6HVrYkBL7dtgqiaiz9zn6iMYv+0CDzc=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "678b4297ccef8bbcd83294e47e1a9042034bdbd0", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "stackage_2": { + "flake": false, + "locked": { + "lastModified": 1646010978, + "narHash": "sha256-NpioQiTXyYm+Gm111kcDEE/ghflmnTNwPhWff54GYA4=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "9cce3e0d420f6c38cdbbe1c5e5bbc07fd2adfc3a", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "stackage_3": { + "flake": false, + "locked": { + "lastModified": 1655255731, + "narHash": "sha256-0C3RDc1Uoofcw3e1s+7Gj+KYQ2JiRiSNQB2BKzXI6Vo=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "3e945e88ffdf2d2251e56db002419627f32f17c9", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "stackage_4": { + "flake": false, + "locked": { + "lastModified": 1659402917, + "narHash": "sha256-zRDOtN4A2KmfzmZiqqxOAIw1YVPhnoIaszKKd+qCEcQ=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "778df3c4b35eac853d57fac7bafc7c9f2dde917f", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "stackage_5": { + "flake": false, + "locked": { + "lastModified": 1650936094, + "narHash": "sha256-9ibS+iszPXe3HQd8rexVfrQeO4JkXSPokhbPiJ/Lags=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "85f94546f85fb9b92080f958bec655a364b2f0e5", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "stackage_6": { + "flake": false, + "locked": { + "lastModified": 1702771826, + "narHash": "sha256-4jFlIYY/hzkRrt4mXpUV81wC9ge4VpC5zcmQANl8GQg=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "4aab61a73de63a828ac33eb588e1e65411020a0c", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "stackage_7": { + "flake": false, + "locked": { + "lastModified": 1654219171, + "narHash": "sha256-5kp4VTlum+AMmoIbhtrcVSEfYhR4oTKSrwe1iysD8uU=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "6d1fc076976ce6c45da5d077bf882487076efe5c", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "std": { + "inputs": { + "arion": [ + "cardano-node", + "tullia", + "std", + "blank" + ], + "blank": "blank", + "devshell": "devshell", + "dmerge": "dmerge", + "flake-utils": "flake-utils_5", + "incl": "incl", + "makes": [ + "cardano-node", + "tullia", + "std", + "blank" + ], + "microvm": [ + "cardano-node", + "tullia", + "std", + "blank" + ], + "n2c": "n2c", + "nixago": "nixago", + "nixpkgs": "nixpkgs_8", + "nosys": "nosys", + "yants": "yants" + }, + "locked": { + "lastModified": 1674526466, + "narHash": "sha256-tMTaS0bqLx6VJ+K+ZT6xqsXNpzvSXJTmogkraBGzymg=", + "owner": "divnix", + "repo": "std", + "rev": "516387e3d8d059b50e742a2ff1909ed3c8f82826", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_2": { + "inputs": { + "devshell": "devshell_7", + "dmerge": "dmerge_2", + "flake-utils": "flake-utils_13", + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor", + "nixago": "nixago_2", + "nixpkgs": "nixpkgs_34", + "yants": "yants_3" + }, + "locked": { + "lastModified": 1661370377, + "narHash": "sha256-LBKuwWajbv8osh5doIh7H8MQJgcdqjCGY0pW5eI/0Zk=", + "owner": "divnix", + "repo": "std", + "rev": "92503146d322c0c1ec3f2567925711b5fb59f7e2", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_3": { + "inputs": { + "devshell": "devshell_15", + "dmerge": "dmerge_3", + "flake-utils": "flake-utils_29", + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_2", + "nixago": "nixago_3", + "nixpkgs": "nixpkgs_64", + "yants": "yants_5" + }, + "locked": { + "lastModified": 1661367957, + "narHash": "sha256-5B94aTocy6Y6ZJFmzkGdPmg6L6gjNaMVAKcpsaw44Ns=", + "owner": "divnix", + "repo": "std", + "rev": "d39794e19e648b840e5a56aa1f354d43aee9abf7", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "divnix", + "repo": "std", "type": "github" } }, - "old-ghc-nix_3": { - "flake": false, + "std_4": { + "inputs": { + "devshell": "devshell_16", + "nixpkgs": "nixpkgs_67", + "yants": "yants_6" + }, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1652784712, + "narHash": "sha256-ofwGapSWqzUVgIxwwmjlrOVogfjV4yd6WpY8fNfMc2o=", + "owner": "divnix", + "repo": "std", + "rev": "3667d2d868352b0bf47c83440da48bee9f2fab47", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "divnix", + "repo": "std", "type": "github" } }, - "old-ghc-nix_4": { - "flake": false, + "stdlib": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "old-ghc-nix_5": { - "flake": false, + "stdlib_10": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "old-ghc-nix_6": { - "flake": false, + "stdlib_11": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "old-ghc-nix_7": { - "flake": false, + "stdlib_12": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "old-ghc-nix_8": { - "flake": false, + "stdlib_2": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "old-ghc-nix_9": { - "flake": false, + "stdlib_3": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "ouroboros-network": { - "flake": false, + "stdlib_4": { "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", - "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "ouroboros-network", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "ouroboros-network_2": { - "flake": false, + "stdlib_5": { "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", - "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "ouroboros-network", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "ouroboros-network_3": { - "flake": false, + "stdlib_6": { "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", - "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "ouroboros-network", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "ouroboros-network_4": { - "flake": false, + "stdlib_7": { "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", - "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "ouroboros-network", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "plutip": { - "inputs": { - "CHaP": [ - "plutip", - "bot-plutus-interface", - "CHaP" - ], - "bot-plutus-interface": "bot-plutus-interface", - "flake-compat": "flake-compat_14", - "haskell-nix": [ - "plutip", - "bot-plutus-interface", - "haskell-nix" - ], - "iohk-nix": [ - "plutip", - "bot-plutus-interface", - "iohk-nix" - ], - "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "nixpkgs" - ] - }, + "stdlib_8": { "locked": { - "lastModified": 1671024770, - "narHash": "sha256-IOH0eny/33gDe6JQUUnf/kL76eg1zrr9Tse/GGW6fPw=", - "owner": "mlabs-haskell", - "repo": "plutip", - "rev": "8d1795d9ac3f9c6f31381104b25c71576eeba009", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "plutip", - "rev": "8d1795d9ac3f9c6f31381104b25c71576eeba009", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "plutus-apps": { - "flake": false, + "stdlib_9": { "locked": { - "lastModified": 1647347289, - "narHash": "sha256-dxKZ1Zvflyt6igYm39POV6X/0giKbfb4U7D1TvevQls=", - "owner": "input-output-hk", - "repo": "plutus-apps", - "rev": "2a40552f4654d695f21783c86e8ae59243ce9dfa", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "plutus-apps", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } }, - "plutus-apps_2": { - "flake": false, + "tailwind-haskell": { + "inputs": { + "flake-utils": "flake-utils_24", + "nixpkgs": "nixpkgs_58" + }, "locked": { - "lastModified": 1654271253, - "narHash": "sha256-GQDPzyVtcbbESmckMvzoTEKa/UWWJH7djh1TWQjzFow=", - "owner": "input-output-hk", - "repo": "plutus-apps", - "rev": "61de89d33340279b8452a0dbb52a87111db87e82", + "lastModified": 1654211622, + "narHash": "sha256-N5Xa/JhF9PRgmt+ZVZFaHT7onezENxp7ktnGhhqOBaw=", + "owner": "srid", + "repo": "tailwind-haskell", + "rev": "8d08cda7a1cb67435de1ba1739f65e25b303364f", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "plutus-apps", + "owner": "srid", + "ref": "master", + "repo": "tailwind-haskell", "type": "github" } }, - "plutus-example": { + "terranix": { "inputs": { - "customConfig": "customConfig_4", - "haskellNix": "haskellNix_4", - "iohkNix": "iohkNix_4", + "bats-assert": "bats-assert", + "bats-support": "bats-support", + "flake-utils": "flake-utils_9", "nixpkgs": [ - "ogmios", - "cardano-node", - "node-snapshot", - "plutus-example", - "haskellNix", - "nixpkgs-2105" + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "blank" ], - "utils": "utils_2" + "terranix-examples": "terranix-examples" }, "locked": { - "lastModified": 1640022647, - "narHash": "sha256-M+YnF7Zj/7QK2pu0T75xNVaX0eEeijtBH8yz+jEHIMM=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "lastModified": 1637158331, + "narHash": "sha256-x5LEKtSkVq+D3BXHDBOb2wdCLxAhVmXIWONRi9lxDPg=", + "owner": "terranix", + "repo": "terranix", + "rev": "34198bb154af86d2a559446f10d7339e53126abe", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "owner": "terranix", + "repo": "terranix", "type": "github" } }, - "plutus-example_2": { - "inputs": { - "customConfig": "customConfig_8", - "haskellNix": "haskellNix_8", - "iohkNix": "iohkNix_8", - "nixpkgs": [ - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "plutus-example", - "haskellNix", - "nixpkgs-2105" - ], - "utils": "utils_7" - }, + "terranix-examples": { "locked": { - "lastModified": 1640022647, - "narHash": "sha256-M+YnF7Zj/7QK2pu0T75xNVaX0eEeijtBH8yz+jEHIMM=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "lastModified": 1636300201, + "narHash": "sha256-0n1je1WpiR6XfCsvi8ZK7GrpEnMl+DpwhWaO1949Vbc=", + "owner": "terranix", + "repo": "terranix-examples", + "rev": "a934aa1cf88f6bd6c6ddb4c77b77ec6e1660bd5e", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "owner": "terranix", + "repo": "terranix-examples", "type": "github" } }, - "root": { - "inputs": { - "cardano-configurations": "cardano-configurations", - "cardano-node": [ - "ogmios-nixos", - "cardano-node" - ], - "easy-purescript-nix": "easy-purescript-nix", - "flake-compat": "flake-compat", - "iohk-nix-environments": "iohk-nix-environments", - "kupo": "kupo", - "kupo-nixos": "kupo-nixos", - "nixpkgs": [ - "ogmios", - "nixpkgs" - ], - "ogmios": "ogmios", - "ogmios-nixos": "ogmios-nixos", - "plutip": "plutip" - } - }, - "stackage": { - "flake": false, + "terranix-examples_2": { "locked": { - "lastModified": 1654219171, - "narHash": "sha256-5kp4VTlum+AMmoIbhtrcVSEfYhR4oTKSrwe1iysD8uU=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "6d1fc076976ce6c45da5d077bf882487076efe5c", + "lastModified": 1636300201, + "narHash": "sha256-0n1je1WpiR6XfCsvi8ZK7GrpEnMl+DpwhWaO1949Vbc=", + "owner": "terranix", + "repo": "terranix-examples", + "rev": "a934aa1cf88f6bd6c6ddb4c77b77ec6e1660bd5e", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "terranix", + "repo": "terranix-examples", "type": "github" } }, - "stackage_10": { - "flake": false, + "terranix-examples_3": { "locked": { - "lastModified": 1639012797, - "narHash": "sha256-hiLyBa5XFBvxD+BcYPKyYd/0dNMccxAuywFNqYtIIvs=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "9ea6ea359da91c75a71e334b25aa7dc5ddc4b2c6", + "lastModified": 1636300201, + "narHash": "sha256-0n1je1WpiR6XfCsvi8ZK7GrpEnMl+DpwhWaO1949Vbc=", + "owner": "terranix", + "repo": "terranix-examples", + "rev": "a934aa1cf88f6bd6c6ddb4c77b77ec6e1660bd5e", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "terranix", + "repo": "terranix-examples", "type": "github" } }, - "stackage_11": { - "flake": false, + "terranix_2": { + "inputs": { + "bats-assert": "bats-assert_2", + "bats-support": "bats-support_2", + "flake-utils": "flake-utils_14", + "nixpkgs": [ + "db-sync", + "cardano-world", + "bitte", + "blank" + ], + "terranix-examples": "terranix-examples_2" + }, "locked": { - "lastModified": 1667610757, - "narHash": "sha256-H4dlMk5EW50xOtGo+5Srm3HGQV1+hY9ttgRQ+Sew5uA=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "01d8ea53f65b08910003a1990547bab75ed6068a", + "lastModified": 1637158331, + "narHash": "sha256-x5LEKtSkVq+D3BXHDBOb2wdCLxAhVmXIWONRi9lxDPg=", + "owner": "terranix", + "repo": "terranix", + "rev": "34198bb154af86d2a559446f10d7339e53126abe", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "terranix", + "repo": "terranix", "type": "github" } }, - "stackage_12": { - "flake": false, + "terranix_3": { + "inputs": { + "bats-assert": "bats-assert_3", + "bats-support": "bats-support_3", + "flake-utils": "flake-utils_20", + "nixpkgs": [ + "db-sync", + "cardano-world", + "capsules", + "bitte", + "blank" + ], + "terranix-examples": "terranix-examples_3" + }, "locked": { - "lastModified": 1669338854, - "narHash": "sha256-D9WBn+cC8t8Xu+z+H0nDGoeOCcqsbDGXHsaO7qY45O4=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "e9c817e14342ebef9fcf433f6ba3aa00c6df3e3f", + "lastModified": 1637158331, + "narHash": "sha256-x5LEKtSkVq+D3BXHDBOb2wdCLxAhVmXIWONRi9lxDPg=", + "owner": "terranix", + "repo": "terranix", + "rev": "34198bb154af86d2a559446f10d7339e53126abe", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "terranix", + "repo": "terranix", "type": "github" } }, - "stackage_2": { - "flake": false, + "tullia": { + "inputs": { + "nix-nomad": "nix-nomad", + "nix2container": "nix2container_2", + "nixpkgs": "nixpkgs_7", + "std": "std" + }, "locked": { - "lastModified": 1665537461, - "narHash": "sha256-60tLFJ0poKp3IIPMvIDx3yzmjwrX7CngypfCQqV+oXE=", + "lastModified": 1675695930, + "narHash": "sha256-B7rEZ/DBUMlK1AcJ9ajnAPPxqXY6zW2SBX+51bZV0Ac=", "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "fbf47f75f32aedcdd97143ec59c578f403fae35f", + "repo": "tullia", + "rev": "621365f2c725608f381b3ad5b57afef389fd4c31", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "stackage.nix", + "repo": "tullia", "type": "github" } }, - "stackage_3": { - "flake": false, + "tullia_2": { + "inputs": { + "nix2container": "nix2container_3", + "nixpkgs": "nixpkgs_66", + "std": "std_4" + }, "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", + "lastModified": 1657811465, + "narHash": "sha256-KHNWwKuUIG08CUg/ol81zf26RRlnsQsyqMr63vXcCes=", "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "repo": "tullia", + "rev": "f025fcf3676d1d1281de184e89c5f7c8e7f74ebe", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "stackage.nix", + "repo": "tullia", "type": "github" } }, - "stackage_4": { - "flake": false, + "utils": { "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "stackage_5": { - "flake": false, + "utils_10": { "locked": { - "lastModified": 1639012797, - "narHash": "sha256-hiLyBa5XFBvxD+BcYPKyYd/0dNMccxAuywFNqYtIIvs=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "9ea6ea359da91c75a71e334b25aa7dc5ddc4b2c6", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "kreisys", + "repo": "flake-utils", "type": "github" } }, - "stackage_6": { - "flake": false, + "utils_11": { "locked": { - "lastModified": 1669857425, - "narHash": "sha256-pmGWQ8poIUqU0V02Zm8aMPimcW2JHqKCFOnLSYX22Ow=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "76e7487150da63a6061c63fa83e69da97ec56ede", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "kreisys", + "repo": "flake-utils", "type": "github" } }, - "stackage_7": { - "flake": false, + "utils_12": { "locked": { - "lastModified": 1656898145, - "narHash": "sha256-EMgMzdANg6r5gEUkMtv5ujDo2/Kx7JJXoXiDKjDVoLw=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "835a5f2d2a1acafb77add430fc8c2dd47282ef32", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "stackage_8": { - "flake": false, + "utils_13": { "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "kreisys", + "repo": "flake-utils", "type": "github" } }, - "stackage_9": { - "flake": false, + "utils_14": { "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "kreisys", + "repo": "flake-utils", "type": "github" } }, - "std": { - "inputs": { - "blank": "blank_2", - "devshell": "devshell", - "dmerge": "dmerge", - "flake-utils": "flake-utils_8", - "makes": [ - "ogmios", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor", - "microvm": [ - "ogmios", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "n2c": "n2c", - "nixago": "nixago", - "nixpkgs": "nixpkgs_10", - "yants": "yants" - }, + "utils_15": { "locked": { - "lastModified": 1665513321, - "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", - "owner": "divnix", - "repo": "std", - "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "divnix", - "repo": "std", + "owner": "kreisys", + "repo": "flake-utils", "type": "github" } }, - "std_2": { - "inputs": { - "blank": "blank_4", - "devshell": "devshell_2", - "dmerge": "dmerge_2", - "flake-utils": "flake-utils_16", - "makes": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_2", - "microvm": [ - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "n2c": "n2c_2", - "nixago": "nixago_2", - "nixpkgs": "nixpkgs_18", - "yants": "yants_2" - }, + "utils_16": { "locked": { - "lastModified": 1665513321, - "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", - "owner": "divnix", - "repo": "std", - "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "divnix", - "repo": "std", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "std_3": { - "inputs": { - "blank": "blank_5", - "devshell": "devshell_3", - "dmerge": "dmerge_3", - "flake-utils": "flake-utils_20", - "makes": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_3", - "microvm": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "n2c": "n2c_3", - "nixago": "nixago_3", - "nixpkgs": "nixpkgs_22", - "yants": "yants_3" - }, + "utils_17": { "locked": { - "lastModified": 1665513321, - "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", - "owner": "divnix", - "repo": "std", - "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "lastModified": 1637014545, + "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "type": "github" }, "original": { - "owner": "divnix", - "repo": "std", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "tullia": { - "inputs": { - "nix-nomad": "nix-nomad", - "nix2container": "nix2container", - "nixpkgs": [ - "ogmios", - "haskell-nix", - "nixpkgs" - ], - "std": "std" - }, + "utils_18": { "locked": { - "lastModified": 1668711738, - "narHash": "sha256-CBjky16o9pqsGE1bWu6nRlRajgSXMEk+yaFQLibqXcE=", - "owner": "input-output-hk", - "repo": "tullia", - "rev": "ead1f515c251f0e060060ef0e2356a51d3dfe4b0", + "lastModified": 1601282935, + "narHash": "sha256-WQAFV6sGGQxrRs3a+/Yj9xUYvhTpukQJIcMbIi7LCJ4=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "588973065fce51f4763287f0fda87a174d78bf48", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "tullia", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "tullia_2": { - "inputs": { - "nix-nomad": "nix-nomad_2", - "nix2container": "nix2container_2", - "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", - "nixpkgs" - ], - "std": "std_2" - }, + "utils_19": { "locked": { - "lastModified": 1666200256, - "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", - "owner": "input-output-hk", - "repo": "tullia", - "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "tullia", + "owner": "kreisys", + "repo": "flake-utils", "type": "github" } }, - "tullia_3": { - "inputs": { - "nix-nomad": "nix-nomad_3", - "nix2container": "nix2container_3", - "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", - "nixpkgs" - ], - "std": "std_3" - }, + "utils_2": { "locked": { - "lastModified": 1666200256, - "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", - "owner": "input-output-hk", - "repo": "tullia", - "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "tullia", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "utils": { + "utils_20": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } }, - "utils_10": { + "utils_21": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { @@ -7186,22 +9661,22 @@ "type": "github" } }, - "utils_11": { + "utils_22": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } }, - "utils_2": { + "utils_23": { "locked": { "lastModified": 1638122382, "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", @@ -7218,11 +9693,11 @@ }, "utils_3": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1637014545, + "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "type": "github" }, "original": { @@ -7233,11 +9708,11 @@ }, "utils_4": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1601282935, + "narHash": "sha256-WQAFV6sGGQxrRs3a+/Yj9xUYvhTpukQJIcMbIi7LCJ4=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "588973065fce51f4763287f0fda87a174d78bf48", "type": "github" }, "original": { @@ -7248,30 +9723,30 @@ }, "utils_5": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } }, "utils_6": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } @@ -7293,26 +9768,26 @@ }, "utils_8": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } }, "utils_9": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1637014545, + "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "type": "github" }, "original": { @@ -7321,22 +9796,55 @@ "type": "github" } }, + "vulnix": { + "flake": false, + "locked": { + "lastModified": 1632431644, + "narHash": "sha256-iePIr+z/YxrST5pLKnhF666cAMme90dAOS5vgAiwmxg=", + "owner": "dermetfan", + "repo": "vulnix", + "rev": "cea4e8973a39377aa42541b9dbf3a13ab46d51db", + "type": "github" + }, + "original": { + "owner": "dermetfan", + "ref": "runtime-deps", + "repo": "vulnix", + "type": "github" + } + }, + "vulnix_2": { + "flake": false, + "locked": { + "lastModified": 1632431644, + "narHash": "sha256-iePIr+z/YxrST5pLKnhF666cAMme90dAOS5vgAiwmxg=", + "owner": "dermetfan", + "repo": "vulnix", + "rev": "cea4e8973a39377aa42541b9dbf3a13ab46d51db", + "type": "github" + }, + "original": { + "owner": "dermetfan", + "ref": "runtime-deps", + "repo": "vulnix", + "type": "github" + } + }, "yants": { "inputs": { "nixpkgs": [ - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1660507851, - "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "lastModified": 1667096281, + "narHash": "sha256-wRRec6ze0gJHmGn6m57/zhz/Kdvp9HS4Nl5fkQ+uIuA=", "owner": "divnix", "repo": "yants", - "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "rev": "d18f356ec25cb94dc9c275870c3a7927a10f8c3c", "type": "github" }, "original": { @@ -7346,21 +9854,39 @@ } }, "yants_2": { + "inputs": { + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", + "owner": "divnix", + "repo": "yants", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_3": { "inputs": { "nixpkgs": [ - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1660507851, - "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", "owner": "divnix", "repo": "yants", - "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", "type": "github" }, "original": { @@ -7369,23 +9895,63 @@ "type": "github" } }, - "yants_3": { + "yants_4": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "locked": { + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", + "owner": "divnix", + "repo": "yants", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_5": { "inputs": { "nixpkgs": [ - "plutip", - "bot-plutus-interface", - "haskell-nix", + "db-sync", + "cardano-world", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", + "owner": "divnix", + "repo": "yants", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_6": { + "inputs": { + "nixpkgs": [ + "db-sync", + "cardano-world", "tullia", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1660507851, - "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", "owner": "divnix", "repo": "yants", - "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 1137d5bdd..a38d4555d 100644 --- a/flake.nix +++ b/flake.nix @@ -1,44 +1,94 @@ { description = "cardano-transaction-lib"; - nixConfig.bash-prompt = "\\[\\e[0m\\][\\[\\e[0;2m\\]nix-develop \\[\\e[0;1m\\]CTL@\\[\\033[33m\\]$(git rev-parse --abbrev-ref HEAD) \\[\\e[0;32m\\]\\w\\[\\e[0m\\]]\\[\\e[0m\\]$ \\[\\e[0m\\]"; + nixConfig = { + extra-substituters = [ "https://plutonomicon.cachix.org" ]; + extra-trusted-public-keys = [ "plutonomicon.cachix.org-1:evUxtNULjCjOipxwAnYhNFeF/lyYU1FeNGaVAnm+QQw=" ]; + bash-prompt = "\\[\\e[0m\\][\\[\\e[0;2m\\]nix-develop \\[\\e[0;1m\\]CTL@\\[\\033[33m\\]$(git rev-parse --abbrev-ref HEAD) \\[\\e[0;32m\\]\\w\\[\\e[0m\\]]\\[\\e[0m\\]$ \\[\\e[0m\\]"; + }; inputs = { - nixpkgs.follows = "ogmios/nixpkgs"; + nixpkgs.follows = "haskell-nix/nixpkgs-unstable"; + hackage-nix = { + url = "github:input-output-hk/hackage.nix"; + flake = false; + }; + haskell-nix = { + url = "github:input-output-hk/haskell.nix"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.hackage.follows = "hackage-nix"; + }; + CHaP = { + url = "github:input-output-hk/cardano-haskell-packages?ref=repo"; + flake = false; + }; + iohk-nix = { + url = "github:input-output-hk/iohk-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; flake-compat = { url = "github:edolstra/flake-compat"; flake = false; }; - ogmios.url = "github:mlabs-haskell/ogmios/a7687bc03b446bc74564abe1873fbabfa1aac196"; - plutip.url = "github:mlabs-haskell/plutip?rev=8d1795d9ac3f9c6f31381104b25c71576eeba009"; - kupo-nixos.url = "github:mlabs-haskell/kupo-nixos/6f89cbcc359893a2aea14dd380f9a45e04c6aa67"; - kupo-nixos.inputs.kupo.follows = "kupo"; + cardano-node.url = "github:input-output-hk/cardano-node/8.1.1"; - kupo = { - url = "github:CardanoSolutions/kupo/v2.2.0"; + ogmios-nixos = { + url = "github:mlabs-haskell/ogmios-nixos/78e829e9ebd50c5891024dcd1004c2ac51facd80"; + inputs = { + nixpkgs.follows = "nixpkgs"; + iohk-nix.follows = "iohk-nix"; + haskell-nix.follows = "haskell-nix"; + cardano-node.follows = "cardano-node"; + ogmios-src.follows = "ogmios"; + }; + }; + + ogmios = { + url = "github:CardanoSolutions/ogmios/v6.0.0"; flake = false; }; - # ogmios nixos module (remove and replace with the above after merging and updating) - ogmios-nixos.url = "github:mlabs-haskell/ogmios"; + kupo-nixos = { + url = "github:mlabs-haskell/kupo-nixos/6f89cbcc359893a2aea14dd380f9a45e04c6aa67"; + inputs.kupo.follows = "kupo"; + }; - cardano-node.follows = "ogmios-nixos/cardano-node"; - # for new environments like preview and preprod. TODO: remove this when cardano-node is updated - iohk-nix-environments.url = "github:input-output-hk/iohk-nix"; - cardano-node.inputs.iohkNix.follows = "iohk-nix-environments"; + kupo = { + url = "github:CardanoSolutions/kupo/v2.2.0"; + flake = false; + }; # Repository with network parameters + # NOTE(bladyjoker): Cardano configurations (yaml/json) often change format and break, that's why we pin to a specific known version. cardano-configurations = { # Override with "path:/path/to/cardano-configurations"; - url = "github:input-output-hk/cardano-configurations"; + url = "github:input-output-hk/cardano-configurations?rev=d952529afdfdf6d53ce190b1bf8af990a7ae9590"; flake = false; }; easy-purescript-nix = { - url = "github:justinwoo/easy-purescript-nix/da7acb2662961fd355f0a01a25bd32bf33577fa8"; + url = "github:justinwoo/easy-purescript-nix"; flake = false; }; + + blockfrost.url = "github:blockfrost/blockfrost-backend-ryo/v1.7.0"; + db-sync.url = "github:input-output-hk/cardano-db-sync/13.1.0.0"; + + # Plutip server related inputs + plutip = { + url = "github:mlabs-haskell/plutip?ref=gergely/version-bump"; + # TODO(bladyjoker): Why are we overriding inputs here? + inputs = { + nixpkgs.follows = "nixpkgs"; + iohk-nix.follows = "iohk-nix"; + haskell-nix.follows = "haskell-nix"; + hackage-nix.follows = "hackage-nix"; + cardano-node.follows = "cardano-node"; + }; + }; + + hercules-ci-effects.url = "github:hercules-ci/hercules-ci-effects"; }; outputs = @@ -83,11 +133,20 @@ function on_file () { local path=$1 - local parent="$(basename "$(dirname "$path")")" - if command=$(pcregrep -o1 -o2 -o3 'Query\[(.*)\]|(EvaluateTx)|(SubmitTx)' <<< "$path") + match_A=$(pcregrep -o1 'QueryLedgerState([a-zA-Z]+)\/' <<< "$path") + match_B=$(pcregrep -o1 '([a-zA-Z]+)Response' <<< "$path") + command="" + if [ ! -z $match_A ] + then + command="QueryLedgerState-$match_A" + elif [ ! -z $match_B ] + then + command="$match_B" + fi + if [ ! -z $command ] then echo "$path" - json=$(jq -c .result "$path") + json=$(cat "$path") md5=($(md5sum <<< "$json")) printf "%s" "$json" > "ogmios/$command-$md5.json" fi @@ -130,6 +189,7 @@ nixpkgs-fmt nodePackages.eslint nodePackages.prettier + blockfrost-backend-ryo ]; }; }; @@ -140,9 +200,14 @@ in rec { packages = { - ctl-example-bundle-web = project.bundlePursProject { + ctl-purs-project = project.buildPursProject { }; + + ctl-example-bundle-web-esbuild = project.bundlePursProjectEsbuild { + main = "Ctl.Examples.ByUrl"; + }; + + ctl-example-bundle-web-webpack = project.bundlePursProjectWebpack { main = "Ctl.Examples.ByUrl"; - entrypoint = "examples/index.js"; }; ctl-runtime = pkgs.arion.build { @@ -150,7 +215,7 @@ modules = [ (buildCtlRuntime pkgs { }) ]; }; - docs = project.buildSearchablePursDocs { + docs = project.buildPursDocs { packageName = projectName; }; }; @@ -158,14 +223,13 @@ checks = { ctl-e2e-test = project.runE2ETest { name = "ctl-e2e-test"; - testMain = "Test.Ctl.E2E"; - env = { OGMIOS_FIXTURES = "${ogmiosFixtures}"; }; + runnerMain = "Test.Ctl.E2E"; + testMain = "Ctl.Examples.ByUrl"; buildInputs = [ inputs.kupo-nixos.packages.${pkgs.system}.kupo ]; }; ctl-plutip-test = project.runPlutipTest { name = "ctl-plutip-test"; testMain = "Test.Ctl.Plutip"; - env = { OGMIOS_FIXTURES = "${ogmiosFixtures}"; }; }; ctl-staking-test = project.runPlutipTest { name = "ctl-staking-test"; @@ -181,10 +245,29 @@ devShell = project.devShell; apps = { - docs = project.launchSearchablePursDocs { - builtDocs = packages.docs; - }; + # TODO: restore this + # https://github.com/Plutonomicon/cardano-transaction-lib/issues/1578 + # docs = project.launchSearchablePursDocs { + # builtDocs = packages.docs; + # }; + }; + }; + + plutipServerFor = system: + let + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ + inputs.haskell-nix.overlay + inputs.iohk-nix.overlays.crypto + ]; }; + in + import ./plutip-server { + inherit pkgs; + inherit (inputs) plutip CHaP cardano-node; + inherit (pkgs) system; + src = ./plutip-server; }; in { @@ -206,19 +289,19 @@ spago = final: prev: { easy-ps = prev.easy-ps // { spago = prev.easy-ps.spago.overrideAttrs (_: rec { - version = "0.20.7"; + version = "0.21.0"; src = if final.stdenv.isDarwin then final.fetchurl { url = "https://github.com/purescript/spago/releases/download/${version}/macOS.tar.gz"; - sha256 = "0s5zgz4kqglsavyh7h70zmn16vayg30alp42w3nx0zwaqkp79xla"; + sha256 = "19c0kdg7gk1c7v00lnkcsxidffab84d50d6l6vgrjy4i86ilhzd5"; } else final.fetchurl { url = "https://github.com/purescript/spago/releases/download/${version}/Linux.tar.gz"; - sha256 = "0bh15dr1fg306kifqipnakv3rxab7hjfpcfzabw7vmg0gsfx8xka"; + sha256 = "1klczy04vwn5b39cnxflcqzap0d5kysp4dsw73i95xm5m7s37049"; }; }); }; @@ -231,9 +314,11 @@ in { plutip-server = - inputs.plutip.packages.${system}."plutip:exe:plutip-server"; - ogmios = ogmios.packages.${system}."ogmios:exe:ogmios"; + (plutipServerFor system).hsPkgs.plutip-server.components.exes.plutip-server; + ogmios = ogmios-nixos.packages.${system}."ogmios:exe:ogmios"; kupo = inputs.kupo-nixos.packages.${system}.kupo; + cardano-db-sync = inputs.db-sync.packages.${system}.cardano-db-sync; + blockfrost-backend-ryo = inputs.blockfrost.packages.${system}.blockfrost-backend-ryo; buildCtlRuntime = buildCtlRuntime final; launchCtlRuntime = launchCtlRuntime final; inherit cardano-configurations; @@ -241,14 +326,21 @@ ); }; + # flake from haskell.nix project + hsFlake = perSystem (system: (plutipServerFor system).flake { }); + devShells = perSystem (system: { # This is the default `devShell` and can be run without specifying # it (i.e. `nix develop`) default = (psProjectFor (nixpkgsFor system)).devShell; + + # This can be used with `nix develop .#devPlutipServer` to work with `./plutip-server` + devPlutipServer = ((plutipServerFor system).flake { }).devShell; }); packages = perSystem (system: (psProjectFor (nixpkgsFor system)).packages + // ((plutipServerFor system).flake { }).packages ); apps = perSystem (system: @@ -257,6 +349,7 @@ in (psProjectFor pkgs).apps // { ctl-runtime = pkgs.launchCtlRuntime { }; + ctl-runtime-blockfrost = pkgs.launchCtlRuntime { blockfrost.enable = true; }; default = self.apps.${system}.ctl-runtime; vm = { type = "app"; @@ -420,10 +513,6 @@ modules = [ inputs.cardano-node.nixosModules.cardano-node inputs.ogmios-nixos.nixosModules.ogmios - { - services.ogmios.package = - inputs.ogmios.packages.x86_64-linux."ogmios:exe:ogmios"; - } inputs.kupo-nixos.nixosModules.kupo ./nix/test-nixos-configuration.nix ]; @@ -432,6 +521,20 @@ }; }; - herculesCI.ciSystems = [ "x86_64-linux" ]; + herculesCI = inputs.hercules-ci-effects.lib.mkHerculesCI { inherit inputs; } { + hercules-ci.flake-update = { + enable = true; + updateBranch = "updated-flake-lock"; + createPullRequest = true; + autoMergeMethod = null; + when = { + minute = 00; + hour = 12; + dayOfWeek = "Sun"; + }; + }; + + herculesCI.ciSystems = [ "x86_64-linux" ]; + }; }; } diff --git a/nix/default.nix b/nix/default.nix index 9d364cef1..9821b1e6b 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -10,14 +10,19 @@ # this in explicitly, even if it can be derived from the `src` argument. By # doing so, you will prevent frequent rebuilds of your generated `node_modules` , packageLock ? "${src}/package-lock.json" - # If warnings generated from project source files will trigger a build error -, strictComp ? true - # Warnings from `purs` to silence during compilation, independent of `strictComp` -, censorCodes ? [ "UserDefinedWarning" ] # The version of node to use across all project components -, nodejs ? pkgs.nodejs-14_x +, nodejs ? pkgs.nodejs-18_x # Autogenerated Nix from `spago2nix generate` , spagoPackages ? "${src}/spago-packages.nix" + # Extra Purescript sources to build and provide in the `devShell` as `extraSourcesDir` +, extraSources ? [ ] +, extraSourcesDir ? ".extras" + # Data directory to add to the build and provide in the `devShell` as `dataDir` + # E.g. [ { name = "my-data"; path = ./. ; }] + # will be available at `data/my-data` in the `buildPursProject`s output, +, data ? [ ] + # A directory to store `data` entries in. +, dataDir ? "data" # Configuration that will be used to generate a `devShell` for the project , shell ? { } , ... @@ -25,7 +30,7 @@ let inherit (pkgs) system; - purs = pkgs.easy-ps.purs-0_14_9; + purs = pkgs.easy-ps.purs-0_15_8; spagoPkgs = import spagoPackages { inherit pkgs; }; @@ -93,7 +98,7 @@ let # available in the shell environment. This can help with ensuring that # any e2e tests that you write and run with `Contract.Test.E2E` are # reproducible - , withChromium ? true + , withChromium ? pkgs.stdenv.isLinux }: assert pkgs.lib.assertOneOf "formatter" formatter [ "purs-tidy" "purty" ]; with pkgs.lib; @@ -112,7 +117,6 @@ let pkgs.easy-ps.spago2nix pkgs.nodePackages.node2nix pkgs.unzip - # Required to fix initdb locale issue in shell # https://github.com/Plutonomicon/cardano-transaction-lib/issues/828 # Well, not really, as we set initdb locale to C for all cases now @@ -136,12 +140,75 @@ let ]; shellHook = '' export NODE_PATH="${nodeModules}/lib/node_modules" + ln -sfn $NODE_PATH node_modules export PATH="${nodeModules}/bin:$PATH" ${pkgs.lib.optionalString packageLockOnly "export NPM_CONFIG_PACKAGE_LOCK_ONLY=true"} + ${linkExtraSources} + ${linkData} '' + shellHook; }; + # Extra sources + extra-sources = pkgs.linkFarm "extra-sources" (builtins.map (drv: { name = drv.name; path = "${drv}/src"; }) extraSources); + hasExtraSources = builtins.length extraSources > 0; + linkExtraSources = pkgs.lib.optionalString hasExtraSources '' + if [ -e ./${extraSourcesDir} ]; then rm ./${extraSourcesDir}; fi + ln -s ${extra-sources} ./${extraSourcesDir} + ''; + + # Data + data-drv = pkgs.linkFarm "data" data; + hasData = builtins.length data > 0; + linkData = pkgs.lib.optionalString hasData '' + if [ -e ./${dataDir} ]; then rm ./${dataDir}; fi + ln -s ${data-drv} ./${dataDir} + ''; + + # Compiles the dependencies of a Purescript project and copies the `output` + # and `.spago` directories into the Nix store. + # Intended to be used in `buildPursProject` to not recompile the entire + # package set every time. + buildPursDependencies = + { + # Can be used to override the name given to the resulting derivation + name ? "${projectName}-ps-deps" + # If warnings generated from project source files will trigger a build error. + # Controls `--strict` purescript-psa flag + , strictComp ? true + # Warnings from `purs` to silence during compilation, independent of `strictComp` + # Controls `--censor-codes` purescript-psa flag + , censorCodes ? [ "UserDefinedWarning" ] + , ... + }: + pkgs.stdenv.mkDerivation { + inherit name; + buildInputs = [ + ]; + nativeBuildInputs = [ + spagoPkgs.installSpagoStyle + pkgs.easy-ps.psa + purs + pkgs.easy-ps.spago + ]; + # Make the derivation independent of the source files. + # `src` is not needed + unpackPhase = "true"; + buildPhase = '' + install-spago-style + psa ${pkgs.lib.optionalString strictComp "--strict" } \ + --censor-lib \ + --is-lib=.spago ".spago/*/*/src/**/*.purs" \ + --censor-codes=${builtins.concatStringsSep "," censorCodes} \ + -gsourcemaps,js + ''; + installPhase = '' + mkdir $out + mv output $out/ + mv .spago $out/ + ''; + }; + # Compiles your Purescript project and copies the `output` directory into the # Nix store. Also copies the local sources to be made available later as `purs` # does not include any external files to its `output` (if we attempted to refer @@ -153,38 +220,55 @@ let # Generated `node_modules` in the Nix store. Can be passed to have better # control over individual project components , nodeModules ? projectNodeModules + # If warnings generated from project source files will trigger a build error. + # Controls `--strict` purescript-psa flag + , strictComp ? true + # Warnings from `purs` to silence during compilation, independent of `strictComp` + # Controls `--censor-codes` purescript-psa flag + , censorCodes ? [ "UserDefinedWarning" ] + , pursDependencies ? buildPursDependencies { + inherit name strictComp censorCodes; + } , ... }: - let - # This is what spago2nix does - spagoGlob = pkg: - ''".spago/${pkg.name}/${pkg.version}/src/**/*.purs"''; - spagoGlobs = builtins.toString ( - builtins.map spagoGlob (builtins.attrValues spagoPkgs.inputs) - ); - in pkgs.stdenv.mkDerivation { inherit name src; buildInputs = [ nodeModules - spagoPkgs.installSpagoStyle - pkgs.easy-ps.psa ]; nativeBuildInputs = [ + spagoPkgs.installSpagoStyle + pkgs.easy-ps.psa purs pkgs.easy-ps.spago ]; unpackPhase = '' export HOME="$TMP" export NODE_PATH="${nodeModules}/lib/node_modules" + ln -sfn $NODE_PATH node_modules export PATH="${nodeModules}/bin:$PATH" - cp -r $src . - install-spago-style + ${linkExtraSources} + ${linkData} + + # copy the dependency build artifacts and sources + # preserve the modification date so that we don't rebuild them + mkdir -p output .spago + cp -rp ${pursDependencies}/.spago/* .spago + cp -rp ${pursDependencies}/output/* output + # note that we copy the entire source directory, not just $src/src, + # because we need sources in ./examples and ./test + cp -rp $src ./src + + # add write permissions for the PS compiler to use + # `output/cache-db.json` + chmod -R +w output/ ''; buildPhase = '' psa ${pkgs.lib.optionalString strictComp "--strict" } \ - --censor-lib --is-lib=.spago ${spagoGlobs} \ - --censor-codes=${builtins.concatStringsSep "," censorCodes} "./**/*.purs" + --censor-lib \ + --is-lib=.spago ".spago/*/*/src/**/*.purs" ${pkgs.lib.optionalString hasExtraSources ''--is-lib=./${extraSourcesDir} "${extraSourcesDir}/*/**/*.purs"''} \ + --censor-codes=${builtins.concatStringsSep "," censorCodes} "./src/**/*.purs" \ + -gsourcemaps,js ''; # We also need to copy all of `src` here, since compiled modules in `output` # might refer to paths that will point to nothing if we use `src` directly @@ -192,18 +276,19 @@ let # module) installPhase = '' mkdir $out - mv output $out/ - cp -r $src/* $out/ + cp -r output $out/ + ${pkgs.lib.optionalString hasExtraSources ''cp -r ./${extraSourcesDir} $out/''} + ${pkgs.lib.optionalString hasData ''cp -r ./${dataDir} $out/''} ''; }; - project = buildPursProject { }; - # Runs a test written in Purescript using NodeJS. runPursTest = { - # The name of the main Purescript module - testMain ? "Test.Main" + # The main Purescript module + testMain + # The entry point function in the main PureScript module + , psEntryPoint ? "main" # Can be used to override the name of the resulting derivation , name ? "${projectName}-check" # Generated `node_modules` in the Nix store. Can be passed to have better @@ -214,20 +299,30 @@ let # Passed through to the `buildInputs` of the derivation. Use this to add # additional packages to the test environment , buildInputs ? [ ] + , builtProject ? buildPursProject { main = testMain; } , ... }: pkgs.runCommand "${name}" ( { - buildInputs = [ project nodeModules ] ++ buildInputs; + inherit src; + nativeBuildInputs = [ builtProject nodeModules ] ++ buildInputs; NODE_PATH = "${nodeModules}/lib/node_modules"; } // env ) - # spago will attempt to download things, which will fail in the - # sandbox, so we can just use node instead - # (idea taken from `plutus-playground-client`) '' - cd ${project} - ${nodejs}/bin/node -e 'require("./output/${testMain}").main()' + # Copy the purescript project files + cp -r ${builtProject}/* . + + # The tests may depend on sources + cp -r $src/* . + + # Provide NPM dependencies to the test suite scripts + ln -sfn ${nodeModules}/lib/node_modules node_modules + + # Call the main module and execute the entry point function + ${nodejs}/bin/node --enable-source-maps -e 'import("./output/${testMain}/index.js").then(m => m.${psEntryPoint}())' + + # Create output file to tell Nix we succeeded touch $out ''; @@ -255,8 +350,18 @@ let runE2ETest = { - # The name of the main Purescript module - testMain ? "Test.Ctl.E2E" + # The name of the main Purescript module for the runner + runnerMain + # Entry point function of the `runnerMain` module + , runnerPsEntryPoint ? "main" + # The name of the test module that will be bundled and served via a + # webserver + , testMain + # Environment file with E2E test definitions, relative to `src` + , envFile ? "test/e2e-ci.env" + # A file with empty settings for chromium, relative to `src` + , emptySettingsFile ? "test-data/empty-settings.tar.gz" + , testTimeout ? 200 # Can be used to override the name of the resulting derivation , name ? "${projectName}-e2e" # Generated `node_modules` in the Nix store. Can be passed to have better @@ -267,13 +372,15 @@ let # Passed through to the `buildInputs` of the derivation. Use this to add # additional packages to the test environment , buildInputs ? [ ] + , bundledPursProject ? (bundlePursProjectWebpack { + main = testMain; + }) + , builtRunnerProject ? (buildPursProject { + main = runnerMain; + }) , ... }@args: let - bundledPursProject = bundlePursProject { - main = "Ctl.Examples.ByUrl"; - entrypoint = "examples/index.js"; - }; # We need fonts if we are going to use chromium etc_fonts = let @@ -321,8 +428,10 @@ let in pkgs.runCommand "${name}" ({ - buildInputs = with pkgs; [ - project + inherit src; + nativeBuildInputs = with pkgs; [ + builtRunnerProject + bundledPursProject nodeModules ogmios kupo @@ -339,44 +448,111 @@ let '' chmod -R +rw . - source ${project}/test/e2e-ci.env + # Load the test definitions from file + source $src/${envFile} - export E2E_SETTINGS_ARCHIVE="${project}/test-data/empty-settings.tar.gz" + export E2E_SETTINGS_ARCHIVE="$src/${emptySettingsFile}" export E2E_CHROME_USER_DATA="./test-data/chrome-user-data" - export E2E_TEST_TIMEOUT=200 + export E2E_TEST_TIMEOUT=${toString testTimeout} export E2E_BROWSER=${chromium}/bin/chromium # use custom bwrap-ed chromium export E2E_NO_HEADLESS=false export PLUTIP_PORT=8087 export OGMIOS_PORT=1345 - export E2E_SKIP_JQUERY_DOWNLOAD=true export E2E_EXTRA_BROWSER_ARGS="--disable-web-security" - python -m http.server 4008 --directory ${bundledPursProject}/dist & + # Move bundle files to the served dir + mkdir -p serve + cp -r ${bundledPursProject}/* serve/ + + # Create an HTML that just serves entry point to the bundle + cat << EOF > serve/index.html + + + + + EOF + + # Launch a webserver and wait for the content to become available + python -m http.server 4008 --directory serve 2>/dev/null & until curl -S http://127.0.0.1:4008/index.html &>/dev/null; do echo "Trying to connect to webserver..."; sleep 0.1; done; + ln -sfn $NODE_PATH node_modules + + cp -r ${builtRunnerProject}/output . + cp -r $src/* . + chmod -R +rw . + + ${nodejs}/bin/node \ + --enable-source-maps \ + -e 'import("./output/${runnerMain}/index.js").then(m => m.${runnerPsEntryPoint}())' \ + e2e-test run - ${nodejs}/bin/node -e 'require("${project}/output/${testMain}").main()' e2e-test run mkdir $out '' ; + # Bundles a Purescript project using esbuild, typically for the browser + bundlePursProjectEsbuild = + { + # Can be used to override the name given to the resulting derivation + name ? "${projectName}-bundle-" + + (if browserRuntime then "web" else "nodejs") + # The main Purescript module + , main + # The entry point function in the main PureScript module + , psEntryPoint ? "main" + # Whether this bundle is being produced for a browser environment or not + , browserRuntime ? true + , esbuildBundleScript ? "esbuild/bundle.js" + # Generated `node_modules` in the Nix store. Can be passed to have better + # control over individual project components + , nodeModules ? projectNodeModules + , builtProject ? buildPursProject { inherit main; } + , ... + }: pkgs.runCommand "${name}" + { + inherit src; + buildInputs = [ + nodejs + nodeModules + ]; + nativeBuildInputs = [ + purs + pkgs.easy-ps.spago + builtProject + ]; + } + '' + export HOME="$TMP" + export NODE_PATH="${nodeModules}/lib/node_modules" + ln -sfn $NODE_PATH node_modules + export PATH="${nodeModules}/bin:$PATH" + ${pkgs.lib.optionalString browserRuntime "export BROWSER_RUNTIME=1"} + cp -r ${builtProject}/* . + cp -r $src/* . + chmod -R +rw . + echo 'import("./output/${main}/index.js").then(m => m.${psEntryPoint}());' > entrypoint.js + mkdir $out + node ${esbuildBundleScript} ./entrypoint.js $out/index.js + ''; + # Bundles a Purescript project using Webpack, typically for the browser - bundlePursProject = + bundlePursProjectWebpack = { # Can be used to override the name given to the resulting derivation name ? "${projectName}-bundle-" + (if browserRuntime then "web" else "nodejs") - # The Webpack `entrypoint` - , entrypoint ? "index.js" # The main Purescript module - , main ? "Main" + , main + # The entry point function in the main PureScript module + , psEntryPoint ? "main" # If this bundle is being produced for a browser environment or not , browserRuntime ? true # Path to the Webpack config to use - , webpackConfig ? "webpack.config.js" + , webpackConfig ? "webpack.config.cjs" # The name of the bundled JS module that `spago bundle-module` will produce , bundledModuleName ? "output.js" # Generated `node_modules` in the Nix store. Can be passed to have better @@ -384,15 +560,17 @@ let , nodeModules ? projectNodeModules # If the spago bundle-module output should be included in the derivation , includeBundledModule ? false + , builtProject ? buildPursProject { inherit main; } , ... }: pkgs.runCommand "${name}" { + inherit src; buildInputs = [ - nodejs - nodeModules - project ]; nativeBuildInputs = [ + nodejs + nodeModules + builtProject purs pkgs.easy-ps.spago ]; @@ -402,154 +580,45 @@ let export NODE_PATH="${nodeModules}/lib/node_modules" export PATH="${nodeModules}/bin:$PATH" ${pkgs.lib.optionalString browserRuntime "export BROWSER_RUNTIME=1"} - cp -r ${project}/* . - chmod -R +rwx . - spago bundle-module --no-install --no-build -m "${main}" \ - --to ${bundledModuleName} - mkdir ./dist + cp -r ${builtProject}/* . + cp -r $src/* . + chmod -R +rw . + mkdir -p ./dist + echo 'import("./output/${main}/index.js").then(m => m.${psEntryPoint}());' > entrypoint.js ${pkgs.lib.optionalString includeBundledModule "cp ${bundledModuleName} ./dist"} - webpack --mode=production -c ${webpackConfig} -o ./dist \ - --entry ./${entrypoint} mkdir $out - mv dist $out + webpack --mode=production -c ${webpackConfig} -o $out/ \ + --entry ./entrypoint.js ''; - pursDocsSearchNpm = - let - fakePackage = builtins.toJSON { - name = "pursDocsSearch"; - version = "0.0.0"; - dependencies = { "purescript-docs-search" = "0.0.12"; }; - }; - fakePackageLock = builtins.toJSON { - requires = true; - lockfileVersion = 1; - dependencies = { - punycode = { - version = "2.1.1"; - resolved = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"; - integrity = "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="; - }; - purescript-docs-search = { - version = "0.0.12"; - resolved = "https://registry.npmjs.org/purescript-docs-search/-/purescript-docs-search-0.0.12.tgz"; - integrity = "sha512-NdhQ3AxbKR2wO+WT2fGa8Rw26JydL6Bgnf73WOazmlfHt4uszblYqiWfaZygyUMOQFnXtpqz5TQj6DW6nk4nEg=="; - }; - }; - }; - in - import - (pkgs.runCommand "purescript-docs-search-npm" - { - buildInputs = [ pkgs.nodePackages.node2nix ]; - } - '' - mkdir $out - cd $out - cat > package.json < package-lock.json <=10.0.0" + } + }, + "node_modules/@emurgo/cardano-message-signing-browser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-message-signing-browser/-/cardano-message-signing-browser-1.0.1.tgz", + "integrity": "sha512-yC4Ymq44WR0bXO1wzxCoyc2W/RD1KSAla0oYhin7IYoVkp2raGp8wt7QNF4pDdNnTcejn5fyPyYY9dL4666H1w==" + }, + "node_modules/@emurgo/cardano-message-signing-nodejs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-message-signing-nodejs/-/cardano-message-signing-nodejs-1.0.1.tgz", + "integrity": "sha512-PoKh1tQnJX18f8iEr8Jk1KXxKCn9eqaSslMI1pyOJvYRJhQVDLCh0+9YReufjp0oFJIY1ShcrR+4/WnECVZUKQ==" + }, + "node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.4.0.tgz", + "integrity": "sha512-VWMvLRBFo7MAYh42zledURFs5BpMTWvkP4DzsLNbyJxZlwjDS+bPyehJVyGc116d2gq8NHFmANbfdeuK8ffJ7A==" + }, + "node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.4.0.tgz", + "integrity": "sha512-dMiofDcqv+IrAITCgWBZmsMLqwv2xImDsJDSrKiYYG1zRKaL8XfMOxx6S0WEnKVj5/343Q5FFURYcSu3iBRNMQ==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", + "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", + "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", + "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", + "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", + "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", + "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", + "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", + "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", + "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", + "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", + "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", + "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", + "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", + "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", + "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", + "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", + "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", + "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", + "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", + "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", + "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", + "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jspm/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", + "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mlabs-haskell/cardano-serialization-lib-gc-browser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-browser/-/cardano-serialization-lib-gc-browser-1.0.6.tgz", + "integrity": "sha512-b7dLrrhjUJSdsmjzariCZO734NB+M/ONLGBiQ/TQzMRtsMydqSFQg6WbMdwYPustoNmQOg6a8bm9+RgllqdmFw==", + "dependencies": { + "@emurgo/cardano-serialization-lib-browser": "^11.2.1", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" + } + }, + "node_modules/@mlabs-haskell/cardano-serialization-lib-gc-nodejs": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-nodejs/-/cardano-serialization-lib-gc-nodejs-1.0.6.tgz", + "integrity": "sha512-I1FqhjEHgib+y0+6K1tSqvrtldRvqjrM5mL+TW9224ezEDScQeCroPWbgGBwwi6rjkN9YpS8Uz6gC0vo8lua1A==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.4.0", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" + } + }, + "node_modules/@mlabs-haskell/csl-gc-wrapper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/csl-gc-wrapper/-/csl-gc-wrapper-1.0.1.tgz", + "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" + }, + "node_modules/@mlabs-haskell/json-bigint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-2.0.0.tgz", + "integrity": "sha512-JX9TON+nZbt+1TJ5MNV1Gcpxp3/m56x1/glDwzGtydrzQzyZbKg4XFw9Frib6fh89YVqjSFJ9xmVeIyDJ5DxTQ==" + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@textlint/ast-node-types": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-12.6.1.tgz", + "integrity": "sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==", + "dev": true + }, + "node_modules/@textlint/markdown-to-ast": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-12.6.1.tgz", + "integrity": "sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==", + "dev": true, + "dependencies": { + "@textlint/ast-node-types": "^12.6.1", + "debug": "^4.3.4", + "mdast-util-gfm-autolink-literal": "^0.1.3", + "remark-footnotes": "^3.0.0", + "remark-frontmatter": "^3.0.0", + "remark-gfm": "^1.0.0", + "remark-parse": "^9.0.0", + "traverse": "^0.6.7", + "unified": "^9.2.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "dev": true, + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", + "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==", + "devOptional": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", + "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/anchor-markdown-header": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.6.0.tgz", + "integrity": "sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==", + "dev": true, + "dependencies": { + "emoji-regex": "~10.1.0" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apply-args-browser": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/apply-args-browser/-/apply-args-browser-0.0.1.tgz", + "integrity": "sha512-gq4ldo4Fk5SEVpeW/0yBe0v5g3VDEWAm9LB80zGarYtDvojTD7ar0Y/WvIy9gYAkKmlE3USu5wYwKKCqOXfNkg==" + }, + "node_modules/apply-args-nodejs": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/apply-args-nodejs/-/apply-args-nodejs-0.0.1.tgz", + "integrity": "sha512-JwZPEvEDrL+4y16Un6FcNjDSITpsBykchgwPh8UtxnziYrbxKAc2BUfyC5uvA6ZVIhQjiO4r+Kg1MQ3nqWk+1Q==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/devtools-protocol": { + "version": "0.0.1019158", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1019158.tgz", + "integrity": "sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctoc": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/doctoc/-/doctoc-2.2.1.tgz", + "integrity": "sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==", + "dev": true, + "dependencies": { + "@textlint/markdown-to-ast": "^12.1.1", + "anchor-markdown-header": "^0.6.0", + "htmlparser2": "^7.2.0", + "minimist": "^1.2.6", + "underscore": "^1.13.2", + "update-section": "^0.3.3" + }, + "bin": { + "doctoc": "doctoc.js" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", + "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", + "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" + } + }, + "node_modules/esbuild-plugin-polyfill-node": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-polyfill-node/-/esbuild-plugin-polyfill-node-0.3.0.tgz", + "integrity": "sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==", + "dev": true, + "dependencies": { + "@jspm/core": "^2.0.1", + "import-meta-resolve": "^3.0.0" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/esbuild-plugin-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-wasm/-/esbuild-plugin-wasm-1.1.0.tgz", + "integrity": "sha512-0bQ6+1tUbySSnxzn5jnXHMDvYnT0cN/Wd4Syk8g/sqAIJUg7buTIi22svS3Qz6ssx895NT+TgLPb33xi1OkZig==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "individual", + "url": "https://ko-fi.com/tschrock" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dev": true, + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/jssha": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.2.0.tgz", + "integrity": "sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==", + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", + "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-footnote": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz", + "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "^0.6.0", + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "dev": true, + "dependencies": { + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", + "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", + "dev": true, + "dependencies": { + "mdast-util-gfm-autolink-literal": "^0.1.0", + "mdast-util-gfm-strikethrough": "^0.2.0", + "mdast-util-gfm-table": "^0.1.0", + "mdast-util-gfm-task-list-item": "^0.1.0", + "mdast-util-to-markdown": "^0.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", + "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", + "dev": true, + "dependencies": { + "ccount": "^1.0.0", + "mdast-util-find-and-replace": "^1.1.0", + "micromark": "^2.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", + "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", + "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", + "dev": true, + "dependencies": { + "markdown-table": "^2.0.0", + "mdast-util-to-markdown": "~0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", + "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "~0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromark-extension-footnote": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz", + "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==", + "dev": true, + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "dev": true, + "dependencies": { + "fault": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", + "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", + "dev": true, + "dependencies": { + "micromark": "~2.11.0", + "micromark-extension-gfm-autolink-literal": "~0.5.0", + "micromark-extension-gfm-strikethrough": "~0.6.5", + "micromark-extension-gfm-table": "~0.4.0", + "micromark-extension-gfm-tagfilter": "~0.3.0", + "micromark-extension-gfm-task-list-item": "~0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", + "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", + "dev": true, + "dependencies": { + "micromark": "~2.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", + "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", + "dev": true, + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", + "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", + "dev": true, + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", + "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", + "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", + "dev": true, + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.22.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^4.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-15.5.0.tgz", + "integrity": "sha512-5Q8EmF++MARczJD1JcRehVePlctxGG2TFHSxdCV8NqPOk44/cMySmZw2nETn+lwUOyp0L9afosMFTnT4KgmWgw==", + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1019158", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.0" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reconnecting-websocket": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", + "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" + }, + "node_modules/remark-footnotes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", + "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==", + "dev": true, + "dependencies": { + "mdast-util-footnote": "^0.1.0", + "micromark-extension-footnote": "^0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "dev": true, + "dependencies": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", + "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", + "dev": true, + "dependencies": { + "mdast-util-gfm": "^0.1.0", + "micromark-extension-gfm": "^0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/uniqid": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", + "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==" + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-section": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/update-section/-/update-section-0.3.3.tgz", + "integrity": "sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.0.tgz", + "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, "dependencies": { "@discoveryjs/json-ext": { "version": "0.5.7", @@ -21,19 +6394,173 @@ "integrity": "sha512-PoKh1tQnJX18f8iEr8Jk1KXxKCn9eqaSslMI1pyOJvYRJhQVDLCh0+9YReufjp0oFJIY1ShcrR+4/WnECVZUKQ==" }, "@emurgo/cardano-serialization-lib-browser": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.2.1.tgz", - "integrity": "sha512-J9Pmeta7y1GYnMCxtb3GnGCRw6zk1wiQ8EdCYQRn/Yqa/ss1zoBjd41euVi02Eb58aLuOJS81nNU+BcMLGXvUg==" + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.4.0.tgz", + "integrity": "sha512-VWMvLRBFo7MAYh42zledURFs5BpMTWvkP4DzsLNbyJxZlwjDS+bPyehJVyGc116d2gq8NHFmANbfdeuK8ffJ7A==" }, "@emurgo/cardano-serialization-lib-nodejs": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.2.1.tgz", - "integrity": "sha512-+Rw35NW4Qv/9uFaPxhKtxiIPmoBEIFMAgdqQxZTw6hNT/wvBp2TvwTBPnOW8ODs7GUAA8nrO1rJJAaxF+mAG2w==" + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.4.0.tgz", + "integrity": "sha512-dMiofDcqv+IrAITCgWBZmsMLqwv2xImDsJDSrKiYYG1zRKaL8XfMOxx6S0WEnKVj5/343Q5FFURYcSu3iBRNMQ==" + }, + "@esbuild/android-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", + "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", + "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", + "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", + "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", + "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", + "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", + "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", + "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", + "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", + "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", + "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", + "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", + "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", + "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", + "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", + "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", + "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", + "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", + "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", + "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", + "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", + "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "dev": true, + "optional": true }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", @@ -42,9 +6569,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { @@ -54,9 +6581,9 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", @@ -64,78 +6591,84 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@mlabs-haskell/csl-gc-wrapper": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mlabs-haskell/csl-gc-wrapper/-/csl-gc-wrapper-1.0.1.tgz", - "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" + "@jspm/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", + "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", + "dev": true }, - "@mlabs-haskell/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-Opo07yXP/OU9mIoGmY5VVuDy5kxmb3fBAG3U9dbC15qK1OCpVLJAlxbdOfBmLOja94SnIfZINUU2xvYtVfk65w==", + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@mlabs-haskell/cardano-serialization-lib-gc-browser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-browser/-/cardano-serialization-lib-gc-browser-1.0.6.tgz", + "integrity": "sha512-b7dLrrhjUJSdsmjzariCZO734NB+M/ONLGBiQ/TQzMRtsMydqSFQg6WbMdwYPustoNmQOg6a8bm9+RgllqdmFw==", "requires": { - "bignumber.js": "^9.0.0" + "@emurgo/cardano-serialization-lib-browser": "^11.2.1", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" } }, - "@noble/secp256k1": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.0.tgz", - "integrity": "sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-nodejs/-/cardano-serialization-lib-gc-nodejs-1.0.6.tgz", + "integrity": "sha512-I1FqhjEHgib+y0+6K1tSqvrtldRvqjrM5mL+TW9224ezEDScQeCroPWbgGBwwi6rjkN9YpS8Uz6gC0vo8lua1A==", "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@emurgo/cardano-serialization-lib-nodejs": "^11.4.0", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "@mlabs-haskell/csl-gc-wrapper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/csl-gc-wrapper/-/csl-gc-wrapper-1.0.1.tgz", + "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" + }, + "@mlabs-haskell/json-bigint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-2.0.0.tgz", + "integrity": "sha512-JX9TON+nZbt+1TJ5MNV1Gcpxp3/m56x1/glDwzGtydrzQzyZbKg4XFw9Frib6fh89YVqjSFJ9xmVeIyDJ5DxTQ==" + }, + "@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==" }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" }, "@textlint/ast-node-types": { - "version": "12.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-12.2.2.tgz", - "integrity": "sha512-VQAXUSGdmEajHXrMxeM9ZTS8UBJSVB0ghJFHpFfqYKlcDsjIqClSmTprY6521HoCoSLoUIGBxTC3jQyUMJFIWw==", + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-12.6.1.tgz", + "integrity": "sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==", "dev": true }, "@textlint/markdown-to-ast": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-12.2.3.tgz", - "integrity": "sha512-omZqcZV1Q8t9K0IKvlHNIdTV3SKNaS2P5qkbTjzDj7PuTuvG20JFqL9Naiwwi9ty3NzTzq+W8lLG3H2HgX0WvA==", + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-12.6.1.tgz", + "integrity": "sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==", "dev": true, "requires": { - "@textlint/ast-node-types": "^12.2.2", + "@textlint/ast-node-types": "^12.6.1", "debug": "^4.3.4", "mdast-util-gfm-autolink-literal": "^0.1.3", "remark-footnotes": "^3.0.0", @@ -144,23 +6677,6 @@ "remark-parse": "^9.0.0", "traverse": "^0.6.7", "unified": "^9.2.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@types/body-parser": { @@ -192,9 +6708,9 @@ } }, "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -202,9 +6718,9 @@ } }, "@types/eslint": { - "version": "8.4.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", - "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, "requires": { "@types/estree": "*", @@ -212,9 +6728,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "requires": { "@types/eslint": "*", @@ -222,62 +6738,63 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", "dev": true }, "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", "dev": true, "requires": { - "@types/unist": "*" + "@types/unist": "^2" } }, "@types/mime": { @@ -287,9 +6804,10 @@ "dev": true }, "@types/node": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", - "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" + "version": "20.4.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", + "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==", + "devOptional": true }, "@types/qs": { "version": "6.9.7", @@ -309,6 +6827,16 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -319,12 +6847,13 @@ } }, "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "requires": { - "@types/mime": "^1", + "@types/http-errors": "*", + "@types/mime": "*", "@types/node": "*" } }, @@ -338,15 +6867,15 @@ } }, "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", + "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==", "dev": true }, "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "requires": { "@types/node": "*" @@ -362,171 +6891,171 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} }, "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -540,6 +7069,15 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -551,16 +7089,17 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} }, "agent-base": { "version": "6.0.2", @@ -568,31 +7107,6 @@ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" } }, "ajv": { @@ -617,9 +7131,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -640,7 +7154,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "anchor-markdown-header": { "version": "0.6.0", @@ -657,16 +7172,10 @@ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -689,16 +7198,11 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -709,7 +7213,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -717,6 +7222,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, "requires": { "es6-object-assign": "^1.1.0", "is-nan": "^1.2.1", @@ -724,19 +7230,11 @@ "util": "^0.12.0" } }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true }, "bail": { "version": "1.0.5", @@ -760,11 +7258,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - }, "bignumber.js": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", @@ -776,6 +7269,14 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "requires": { + "@noble/hashes": "^1.2.0" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -794,6 +7295,16 @@ "base64-js": "^1.3.1", "ieee754": "^1.1.13" } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } } } }, @@ -805,12 +7316,13 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { "bytes": "3.1.2", @@ -821,7 +7333,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -832,29 +7344,45 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -876,12 +7404,14 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -895,6 +7425,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -905,6 +7436,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -916,6 +7448,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -925,6 +7458,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -935,32 +7469,47 @@ "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "requires": { "pako": "~1.0.5" } }, "browserslist": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", - "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001358", - "electron-to-chromium": "^1.4.164", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.0" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" } }, "buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -977,16 +7526,11 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true }, "bufferutil": { "version": "4.0.5", @@ -999,7 +7543,8 @@ "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true }, "bytes": { "version": "3.0.0", @@ -1011,25 +7556,16 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "caniuse-lite": { - "version": "1.0.30001358", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz", - "integrity": "sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw==", + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", "dev": true }, "ccount": { @@ -1087,26 +7623,12 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, - "clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -1119,15 +7641,9 @@ } }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "compressible": { @@ -1154,6 +7670,21 @@ "vary": "~1.1.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1168,20 +7699,22 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true }, "content-disposition": { "version": "0.5.4", @@ -1193,9 +7726,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "cookie": { @@ -1220,6 +7753,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -1228,7 +7762,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -1236,6 +7771,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -1248,6 +7784,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -1280,6 +7817,7 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -1294,46 +7832,12 @@ "randomfill": "^1.0.3" } }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "ms": "2.1.2" } }, "default-gateway": { @@ -1352,30 +7856,15 @@ "dev": true }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1383,9 +7872,10 @@ "dev": true }, "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -1404,14 +7894,15 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.1011705", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1011705.tgz", - "integrity": "sha512-OKvTvu9n3swmgYshvsyVHYX0+aPzCoYUnyXUacfQMmFtBtBKewV/gT4I9jkAbpTqtTi2E4S9MXLlvzBDUlqg0Q==" + "version": "0.0.1019158", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1019158.tgz", + "integrity": "sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -1421,19 +7912,11 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -1441,22 +7924,12 @@ "dev": true }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctoc": { @@ -1471,35 +7944,6 @@ "minimist": "^1.2.6", "underscore": "^1.13.2", "update-section": "^0.3.3" - }, - "dependencies": { - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true - }, - "htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } - } - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" } }, "dom-serializer": { @@ -1511,12 +7955,21 @@ "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } } }, "domain-browser": { "version": "4.22.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==" + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true }, "domelementtype": { "version": "2.3.0", @@ -1544,16 +7997,6 @@ "domhandler": "^4.2.0" } }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1561,15 +8004,16 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.167", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.167.tgz", - "integrity": "sha512-lPHuHXBwpkr4RcfaZBKm6TKOWG/1N9mVggUpP4fY3l1JIUU2x4fkM8928smYdZ5lF+6KCTAxo1aK9JmqT+X71Q==", + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", "dev": true }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -1583,7 +8027,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -1608,9 +8053,9 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -1618,67 +8063,74 @@ } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true }, "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "esbuild": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", + "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" + } + }, + "esbuild-plugin-polyfill-node": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-polyfill-node/-/esbuild-plugin-polyfill-node-0.3.0.tgz", + "integrity": "sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@jspm/core": "^2.0.1", + "import-meta-resolve": "^3.0.0" } }, - "es6-object-assign": { + "esbuild-plugin-wasm": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + "resolved": "https://registry.npmjs.org/esbuild-plugin-wasm/-/esbuild-plugin-wasm-1.1.0.tgz", + "integrity": "sha512-0bQ6+1tUbySSnxzn5jnXHMDvYnT0cN/Wd4Syk8g/sqAIJUg7buTIi22svS3Qz6ssx895NT+TgLPb33xi1OkZig==", + "dev": true }, "escalade": { "version": "3.1.1", @@ -1737,6 +8189,12 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -1746,12 +8204,14 @@ "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -1772,17 +8232,25 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -1801,7 +8269,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -1818,6 +8286,30 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -1836,29 +8328,6 @@ "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "fast-deep-equal": { @@ -1867,19 +8336,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1887,20 +8343,11 @@ "dev": true }, "fastest-levenshtein": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", - "integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, "fault": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", @@ -1939,7 +8386,8 @@ "filter-obj": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==" + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true }, "finalhandler": { "version": "1.2.0", @@ -1954,6 +8402,23 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } } }, "find-up": { @@ -1966,15 +8431,16 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -2003,9 +8469,9 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "fs.realpath": { @@ -2023,47 +8489,27 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "pump": "^3.0.0" } }, "glob": { @@ -2094,24 +8540,19 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "get-intrinsic": "^1.1.3" } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "handle-thing": { @@ -2124,15 +8565,11 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2143,19 +8580,28 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -2164,31 +8610,41 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -2208,9 +8664,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -2240,49 +8696,21 @@ } }, "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", "dev": true, "requires": { "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" } }, "http-deceiver": { @@ -2305,9 +8733,9 @@ } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "http-proxy": { @@ -2332,12 +8760,21 @@ "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + } } }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true }, "https-proxy-agent": { "version": "5.0.1", @@ -2346,21 +8783,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "human-signals": { @@ -2383,12 +8805,6 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2399,10 +8815,10 @@ "resolve-cwd": "^3.0.0" } }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "import-meta-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", "dev": true }, "inflight": { @@ -2419,32 +8835,16 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true }, "is-alphabetical": { @@ -2467,19 +8867,12 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2489,15 +8882,6 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -2505,27 +8889,20 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", @@ -2548,6 +8925,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -2571,46 +8949,22 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, "is-plain-object": { @@ -2622,63 +8976,19 @@ "isobject": "^3.0.1" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, "requires": { - "call-bind": "^1.0.2" + "which-typed-array": "^1.1.11" } }, "is-wsl": { @@ -2719,10 +9029,10 @@ "supports-color": "^8.0.0" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema-traverse": { @@ -2742,6 +9052,16 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2756,27 +9076,12 @@ "p-locate": "^4.1.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "longest-streak": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", "dev": true }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, "markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", @@ -2790,6 +9095,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -2918,12 +9224,12 @@ "dev": true }, "memfs": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.6.tgz", - "integrity": "sha512-rH9mjopto6Wkr7RFuH9l9dk3qb2XGOcYKr7xMhaYqfzuJqOqhRrcFvfD7JMuPj6SLmPreh5+6eAuv36NFAU+Mw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" } }, "merge-descriptors": { @@ -2938,12 +9244,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2958,23 +9258,6 @@ "requires": { "debug": "^4.0.0", "parse-entities": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "micromark-extension-footnote": { @@ -3065,6 +9348,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -3073,7 +9357,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -3107,12 +9392,14 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true }, "minimatch": { "version": "3.1.2", @@ -3123,47 +9410,31 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -3176,43 +9447,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } } }, "node-forge": { @@ -3222,14 +9462,15 @@ "dev": true }, "node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" }, "node-polyfill-webpack-plugin": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", - "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "dev": true, "requires": { "assert": "^2.0.0", "browserify-zlib": "^0.2.0", @@ -3237,7 +9478,7 @@ "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^4.22.0", "events": "^3.3.0", "filter-obj": "^2.0.2", "https-browserify": "^1.0.0", @@ -3246,21 +9487,22 @@ "process": "^0.11.10", "punycode": "^2.1.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^4.0.0", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", "url": "^0.11.0", "util": "^0.12.4", "vm-browserify": "^1.1.2" } }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-path": { @@ -3278,24 +9520,17 @@ "path-key": "^3.0.0" } }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, "object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -3304,18 +9539,8 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "obuf": { "version": "1.1.2", @@ -3356,9 +9581,9 @@ } }, "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -3369,7 +9594,8 @@ "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true }, "p-limit": { "version": "2.3.0", @@ -3387,15 +9613,6 @@ "p-limit": "^2.2.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -3414,22 +9631,14 @@ "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -3458,20 +9667,11 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, "path-exists": { "version": "4.0.0", @@ -3501,16 +9701,11 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -3544,48 +9739,11 @@ "find-up": "^4.0.0" } }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -3625,6 +9783,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -3637,7 +9796,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -3651,18 +9811,19 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true }, "puppeteer-core": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-15.3.2.tgz", - "integrity": "sha512-Fmca9UzXmJkRrvGBgUmrffGD2BlulUTfsVefV1+vqfNm4PnlZ/U1bfD6X8XQ0nftyyg520tmSKd81yH3Z2tszg==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-15.5.0.tgz", + "integrity": "sha512-5Q8EmF++MARczJD1JcRehVePlctxGG2TFHSxdCV8NqPOk44/cMySmZw2nETn+lwUOyp0L9afosMFTnT4KgmWgw==", "requires": { "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.1011705", + "devtools-protocol": "0.0.1019158", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", "pkg-dir": "4.2.0", @@ -3674,55 +9835,34 @@ "ws": "8.8.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "ws": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", - "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==" + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "requires": {} } } }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "requires": { "side-channel": "^1.0.4" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" - }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "dev": true }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -3731,6 +9871,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -3763,13 +9904,16 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "readdirp": { @@ -3782,12 +9926,12 @@ } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" } }, "reconnecting-websocket": { @@ -3795,22 +9939,6 @@ "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, "remark-footnotes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz", @@ -3850,19 +9978,6 @@ "mdast-util-from-markdown": "^0.8.0" } }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -3882,12 +9997,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -3913,12 +10028,6 @@ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3931,20 +10040,12 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3953,12 +10054,13 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -3973,9 +10075,9 @@ "dev": true }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "requires": { "node-forge": "^1" @@ -4002,6 +10104,23 @@ "statuses": "2.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4011,9 +10130,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -4034,6 +10153,15 @@ "parseurl": "~1.3.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4058,6 +10186,12 @@ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -4087,7 +10221,8 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "setprototypeof": { "version": "1.2.0", @@ -4099,6 +10234,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -4128,10 +10264,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -4144,12 +10287,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -4188,23 +10325,6 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "spdy-transport": { @@ -4221,20 +10341,16 @@ "wbuf": "^1.7.3" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { - "ms": "2.1.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -4248,40 +10364,48 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "string_decoder": { @@ -4292,15 +10416,6 @@ "safe-buffer": "~5.2.0" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -4349,16 +10464,28 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -4372,16 +10499,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" } }, "through": { @@ -4399,6 +10526,7 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, "requires": { "setimmediate": "^1.0.4" } @@ -4418,6 +10546,11 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "traverse": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", @@ -4430,16 +10563,17 @@ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "dev": true }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -4451,17 +10585,6 @@ "mime-types": "~2.1.24" } }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -4500,14 +10623,6 @@ "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } } }, "uniqid": { @@ -4547,9 +10662,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.3.tgz", - "integrity": "sha512-ufSazemeh9Gty0qiWtoRpJ9F5Q5W3xdIPm1UZQqYQv/q0Nyb9EMHUB2lu+O9x1re9WsorpMAUu4Y6Lxcs5n+XQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -4572,31 +10687,41 @@ } }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true } } }, + "utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -4605,12 +10730,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -4654,12 +10773,13 @@ "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -4675,62 +10795,68 @@ "minimalistic-assert": "^1.0.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" } }, "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } @@ -4749,9 +10875,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4776,61 +10902,61 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } } } }, "webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4848,12 +10974,6 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4861,38 +10981,30 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" + "ajv-keywords": "^5.1.0" } }, "ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", - "dev": true + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} } } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -4922,6 +11034,15 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4931,35 +11052,23 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "wrappy": { @@ -4970,7 +11079,8 @@ "ws": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.0.tgz", - "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==" + "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==", + "requires": {} }, "xhr2": { "version": "0.2.1", @@ -4980,7 +11090,8 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index 97a463cbf..9cf1dee5f 100755 --- a/package.json +++ b/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "cardano-transaction-lib", "version": "5.0.0", "description": "", @@ -12,54 +13,62 @@ "scripts": { "test": "npm run unit-test && npm run integration-test && npm run plutip-test && npm run staking-test", "start-runtime": "nix run -L .#ctl-runtime", + "start-blockfrost-runtime": "nix run -L .#ctl-runtime-blockfrost", "integration-test": "spago run --main Test.Ctl.Integration", "blockfrost-test": "source ./test/blockfrost.env && spago run --main Test.Ctl.Blockfrost.Contract", + "blockfrost-local-test": "source ./test/blockfrost-local.env && spago run --main Test.Ctl.Blockfrost.Contract", "unit-test": "spago run --main Test.Ctl.Unit", "plutip-test": "spago run --main Test.Ctl.Plutip", "staking-test": "spago run --main Test.Ctl.Plutip.Staking", - "e2e-serve": "spago bundle-module -m Ctl.Examples.ByUrl --to output.js && BROWSER_RUNTIME=1 webpack-dev-server --progress", - "e2e-test": "source ./test/e2e.env && spago test --main Test.Ctl.E2E -a 'e2e-test run'", - "e2e-test-debug": "source ./test/e2e.env && spago test --main Test.Ctl.E2E -a 'e2e-test run --no-headless'", - "e2e-browser": "source ./test/e2e.env && spago run --main Test.Ctl.E2E -a 'e2e-test browser'", - "e2e-pack-settings": "source ./test/e2e.env && spago run --main Test.Ctl.E2E -a 'e2e-test pack'", - "e2e-unpack-settings": "source ./test/e2e.env && spago run --main Test.Ctl.E2E -a 'e2e-test unpack'", - "dev": "make run-dev", - "build": "make run-build" + "e2e-serve": "make esbuild-serve", + "e2e-test": "source ./test/e2e.env && spago test --main Test.Ctl.E2E -a 'run'", + "e2e-test-debug": "source ./test/e2e.env && spago test --main Test.Ctl.E2E -a 'run --no-headless'", + "e2e-browser": "source ./test/e2e.env && spago run --main Test.Ctl.E2E -a 'browser'", + "e2e-pack-settings": "source ./test/e2e.env && spago run --main Test.Ctl.E2E -a 'pack'", + "e2e-unpack-settings": "source ./test/e2e.env && spago run --main Test.Ctl.E2E -a 'unpack'", + "esbuild-bundle": "make esbuild-bundle", + "esbuild-serve": "make esbuild-serve", + "webpack-bundle": "make webpack-bundle", + "webpack-serve": "make webpack-serve" }, "author": "", "license": "MIT", "dependencies": { "@emurgo/cardano-message-signing-browser": "1.0.1", "@emurgo/cardano-message-signing-nodejs": "1.0.1", - "@emurgo/cardano-serialization-lib-browser": "11.2.1", - "@emurgo/cardano-serialization-lib-nodejs": "11.2.1", + "@mlabs-haskell/cardano-serialization-lib-gc-browser": "^1.0.6", + "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": "^1.0.6", "@mlabs-haskell/csl-gc-wrapper": "^1.0.1", - "@mlabs-haskell/json-bigint": " 1.0.0", + "@mlabs-haskell/json-bigint": "2.0.0", "@noble/secp256k1": "^1.7.0", "apply-args-browser": "0.0.1", "apply-args-nodejs": "0.0.1", "base64-js": "^1.5.1", - "big-integer": "1.6.51", "bignumber.js": "^9.1.1", + "bip39": "^3.1.0", "blakejs": "1.2.1", "bufferutil": "4.0.5", "jssha": "3.2.0", - "node-polyfill-webpack-plugin": "1.1.4", "puppeteer-core": "^15.3.2", "reconnecting-websocket": "4.4.0", "uniqid": "5.4.0", + "utf-8-validate": "^5.0.10", "ws": "8.4.0", "xhr2": "0.2.1" }, "devDependencies": { "buffer": "6.0.3", "doctoc": "^2.2.1", - "html-webpack-plugin": "5.5.0", - "webpack": "5.67.0", - "webpack-cli": "4.10", - "webpack-dev-server": "4.7.4" + "esbuild": "0.18.11", + "esbuild-plugin-polyfill-node": "^0.3.0", + "esbuild-plugin-wasm": "^1.1.0", + "node-polyfill-webpack-plugin": "2.0.1", + "webpack": "5.88.1", + "webpack-cli": "5.1.4", + "webpack-dev-server": "4.15.1" }, "prettier": { - "arrowParens": "avoid" + "arrowParens": "avoid", + "trailingComma": "none" } } diff --git a/packages.dhall b/packages.dhall index ab77a7438..43c24759f 100644 --- a/packages.dhall +++ b/packages.dhall @@ -105,8 +105,8 @@ in upstream ------------------------------- -} let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.14.5-20220224/packages.dhall - sha256:67cc3d4f0e8fb72bb1413ba94ddd72a3ceb0783eb725e3b22ad7568b3b581163 + https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20230105/packages.dhall + sha256:3e9fbc9ba03e9a1fcfd895f65e2d50ee2f5e86c4cd273f3d5c841b655a0e1bda let additions = { aeson = @@ -117,8 +117,6 @@ let additions = , "argonaut-core" , "arrays" , "bifunctors" - , "bigints" - , "bignumber" , "const" , "control" , "effect" @@ -127,6 +125,7 @@ let additions = , "foldable-traversable" , "foreign-object" , "integers" + , "js-bigints" , "lists" , "maybe" , "mote" @@ -136,7 +135,6 @@ let additions = , "prelude" , "quickcheck" , "record" - , "sequences" , "spec" , "strings" , "tuples" @@ -146,7 +144,7 @@ let additions = , "untagged-union" ] , repo = "https://github.com/mlabs-haskell/purescript-aeson.git" - , version = "bfd8f4dcd0522a076320f9dc710c24817438e02e" + , version = "v2.0.0" } , bignumber = { dependencies = @@ -161,30 +159,7 @@ let additions = , "tuples" ] , repo = "https://github.com/mlabs-haskell/purescript-bignumber" - , version = "705923edd892a3397b90d28ce7db9a7181dcd599" - } - , sequences = - { dependencies = - [ "arrays" - , "assert" - , "console" - , "effect" - , "lazy" - , "maybe" - , "newtype" - , "nonempty" - , "partial" - , "prelude" - , "profunctor" - , "psci-support" - , "quickcheck" - , "quickcheck-laws" - , "tuples" - , "unfoldable" - , "unsafe-coerce" - ] - , repo = "https://github.com/hdgarrood/purescript-sequences" - , version = "v3.0.2" + , version = "760d11b41ece31b8cdd3c53349c5c2fd48d3ff89" } , properties = { dependencies = [ "prelude", "console" ] @@ -201,52 +176,7 @@ let additions = , repo = "https://github.com/garyb/purescript-mote" , version = "v1.1.0" } - , medea = - { dependencies = - [ "aff" - , "argonaut" - , "arrays" - , "bifunctors" - , "control" - , "effect" - , "either" - , "enums" - , "exceptions" - , "foldable-traversable" - , "foreign-object" - , "free" - , "integers" - , "lists" - , "maybe" - , "mote" - , "naturals" - , "newtype" - , "node-buffer" - , "node-fs-aff" - , "node-path" - , "nonempty" - , "ordered-collections" - , "parsing" - , "partial" - , "prelude" - , "psci-support" - , "quickcheck" - , "quickcheck-combinators" - , "safely" - , "spec" - , "strings" - , "these" - , "transformers" - , "typelevel" - , "tuples" - , "unicode" - , "unordered-collections" - , "unsafe-coerce" - ] - , repo = "https://github.com/juspay/medea-ps.git" - , version = "8b215851959aa8bbf33e6708df6bd683c89d1a5a" - } - , purescript-toppokki = + , toppokki = { dependencies = [ "prelude" , "record" @@ -256,8 +186,8 @@ let additions = , "node-buffer" , "node-fs-aff" ] - , repo = "https://github.com/firefrorefiddle/purescript-toppokki" - , version = "6983e07bf0aa55ab779bcef12df3df339a2b5bd9" + , repo = "https://github.com/mlabs-haskell/purescript-toppokki" + , version = "5992e93396a734c980ef61c74df5b6ab46108920" } , noble-secp256k1 = { dependencies = @@ -271,9 +201,48 @@ let additions = ] , repo = "https://github.com/mlabs-haskell/purescript-noble-secp256k1.git" - , version = "710c15c48c5afae5e0623664d982a587ff2bd177" + , version = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd" + } + , js-bigints = + { dependencies = [ "integers", "maybe", "prelude" ] + , repo = "https://github.com/purescript-contrib/purescript-js-bigints" + , version = "36a7d8ac75a7230043ae511f3145f9ed130954a9" + } + , cip30 = + { dependencies = + [ "aff" + , "aff-promise" + , "arrays" + , "console" + , "effect" + , "literals" + , "maybe" + , "newtype" + , "nullable" + , "prelude" + , "untagged-union" + ] + , repo = "https://github.com/mlabs-haskell/purescript-cip30" + , version = "8f1b34b48825fcec5e9c67f33e255770b1e0bc45" + } + , cip30-typesafe = + { dependencies = + [ "aff" + , "bifunctors" + , "cip30" + , "control" + , "effect" + , "either" + , "exceptions" + , "maybe" + , "prelude" + , "spec" + , "transformers" + , "variant" + ] + , repo = "https://github.com/mlabs-haskell/purescript-cip30-typesafe" + , version = "d72e51fbc0255eb3246c9132d295de7f65e16a99" } } -in (upstream // additions) - with parsing.version = "v7.0.1" +in upstream // additions diff --git a/plutip-server/.gitignore b/plutip-server/.gitignore new file mode 100644 index 000000000..838458f20 --- /dev/null +++ b/plutip-server/.gitignore @@ -0,0 +1 @@ +/dist/ \ No newline at end of file diff --git a/plutip-server/LICENSE b/plutip-server/LICENSE new file mode 100644 index 000000000..2d81c86b8 --- /dev/null +++ b/plutip-server/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2022 MLabs Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plutip-server/README.md b/plutip-server/README.md new file mode 100644 index 000000000..d07d943d7 --- /dev/null +++ b/plutip-server/README.md @@ -0,0 +1,13 @@ +# plutip-server + +Plutip-server is a simple HTTP interface for [Plutip](https://github.com/mlabs-haskell/plutip) to start and stop local plutip clusters on demand. + +CTL handles communication with Plutip via this server and there's usually no need to use it directly, though `plutip-server` can be useful if you need to control Plutip from a different service (although [`plutip-local-cluster`](https://github.com/mlabs-haskell/plutip/tree/master/local-cluster), which is a CLI program, is probably more convenient for that). + +Server exposes two POST endpoints for starting and stopping clusters (only up to one active cluster is allowed at a time). + +You can configure cluster parameters like slot length, max tx size, etc. and specify how many wallets to create, including Ada UTxO distribution in each wallet (see [here](../doc/plutip-testing.md#cluster-configuration-options) for how to configure this via CTL). + +On a successful cluster startup `plutip-server` responds with a list of keys of the newly created wallets, node configuration, directory with public and private keys for the wallets and a path to the socket of one of the nodes from the cluster (usually it's the one that finished startup the first). + +`plutip-server` uses Plutip as a [Haskell library](https://github.com/mlabs-haskell/plutip/tree/master#as-a-library) in Servant API handlers via `startFundedCluster` and `stopCluster` functions. diff --git a/plutip-server/cabal.project b/plutip-server/cabal.project new file mode 100644 index 000000000..c1a038651 --- /dev/null +++ b/plutip-server/cabal.project @@ -0,0 +1,114 @@ +repository cardano-haskell-packages + url: https://input-output-hk.github.io/cardano-haskell-packages + secure: True + root-keys: + 3e0cce471cf09815f930210f7827266fd09045445d65923e6d0238a6cd15126f + 443abb7fb497a134c343faf52f0b659bd7999bc06b7f63fa76dc99d631f9bea1 + a86a1f6ce86c449c46666bda44268677abf29b5b2d2eb5ec7af903ec2f117a82 + bcec67e8e99cabfa7764d75ad9b158d72bfacf70ca1d0ec8bc6b4406d1bf8413 + c00aae8461a256275598500ea0e187588c35a5d5d7454fb57eac18d9edb86a56 + d4a35cd3121aa00d18544bb0ac01c3e1691d618f462c46129271bccf39f7e8ee + +-- Align index-states with cardano-wallet +index-state: 2023-06-06T00:00:00Z + +packages: ./. + +tests: true +benchmarks: true +test-show-details: direct +constraints: + -- TH Name shadowing warnings nconstraints: + bimap >= 0.4.0 + , openapi3 >= 3.2.0 + , libsystemd-journal >= 1.4.4 + , systemd >= 2.3.0 + -- dependency of systemd-2.3.0 + , network >= 3.1.1.1 + -- choose versions that work with base >= 4.12 + , hjsonpointer >= 1.5.0 + , hjsonschema >= 1.10.0 + , Cabal >= 3.4.0.0 + , async-timer >= 0.2.0.0 + , unliftio-core >= 0.2.0.1 + , generic-arbitrary >= 0.2.2 + , iohk-monitoring >= 0.1.11 + + -- lower versions of katip won't build with the Win32-2.12.0.1 + -- which is shipped with the ghc-9.2.8 + , katip >= 0.8.7.4 + + -- Cardano Node dependencies: + , cardano-api ^>=8.2 + , cardano-slotting >= 0.1 + , ouroboros-network ^>= 0.8.1.0 + , persistent == 2.13.3.3 + +package cardano-wallet + optimization: False +package cardano-wallet-core + optimization: False +package cardano-wallet-cli + optimization: False +package cardano-wallet-launcher + optimization: False +package cardano-wallet-core-integration + optimization: False + +allow-newer: + hjsonschema:* + , hjsonpointer:* + , *:aeson + , *:hashable + , async-timer:unliftio-core + , ekg:* + , ntp-client:* + , libsystemd-journal:base + +source-repository-package + type: git + location: https://github.com/cardano-foundation/cardano-wallet + tag: ae6e90b99ff14eda88769211218aaae2b0fe528b + --sha256: 060r6z9sy9r1jr8iinlyirprw4k3s54malp9sz732vl7byh6vylf + subdir: + lib/application-extras + lib/balance-tx + lib/crypto-hash-extra + lib/coin-selection + lib/delta-store + lib/delta-table + lib/delta-types + lib/iohk-monitoring-extra + lib/launcher + lib/local-cluster + lib/numeric + lib/primitive + lib/read + lib/temporary-extra + lib/test-utils + lib/text-class + lib/wai-middleware-logging + lib/wallet-benchmarks + lib/wallet + lib/wallet-e2e + +source-repository-package + type: git + location: https://github.com/input-output-hk/cardano-addresses + tag: 44d5a9eb3505b6bfbf281d40fa88531c3253b771 + --sha256: 16rja48ryfjw3531kf15w0h3cdmscqgs8l1z1i2mvahq1vlhr2y6 + subdir: command-line + core + +source-repository-package + type: git + location: https://github.com/cardano-foundation/cardano-wallet-client.git + tag: 353412ca621dc28af53e4a19795338b19bab1b7b + --sha256: 04q58c82wy6x9nkwqbvcxbv6s61fx08h5kf62sb511aqp08id4bb + subdir: generated + +source-repository-package + type: git + location: https://github.com/mlabs-haskell/plutip.git + tag: 1bf0b547cd3689c727586abb8385c008fb2a3d1c + --sha256: sha256-7ZhZUDhlFvV2us4G27iAk6lHezKS/4WA07NQn88VtQU= diff --git a/plutip-server/default.nix b/plutip-server/default.nix new file mode 100644 index 000000000..f6bcc4a10 --- /dev/null +++ b/plutip-server/default.nix @@ -0,0 +1,59 @@ +{ pkgs, system, src, plutip, CHaP, cardano-node }: +let + haskellModules = + plutip.haskellModules.${system} ++ [ + ({ config, pkgs, ... }: + let + nodeExes = cardano-node.packages.${system}; + in + { + packages.plutip-server.components.exes.plutip-server = { + pkgconfig = [ [ pkgs.makeWrapper ] ]; + postInstall = with pkgs; '' + wrapProgram $out/bin/plutip-server \ + --prefix PATH : "${lib.makeBinPath [ + nodeExes.cardano-node + nodeExes.cardano-cli + ]}" + ''; + }; + }) + ]; +in +pkgs.haskell-nix.cabalProject { + name = "plutip-server"; + + inherit src; + + inputMap = { + "https://input-output-hk.github.io/cardano-haskell-packages" = CHaP; + }; + + compiler-nix-name = "ghc8107"; + + shell = { + withHoogle = true; + exactDeps = true; + + tools.haskell-language-server = "1.5.0.0"; # Newer versions failed to build + + nativeBuildInputs = with pkgs; [ + # Haskell Tools + haskellPackages.fourmolu + haskellPackages.cabal-install + haskellPackages.cabal-fmt + nixpkgs-fmt + hlint + entr + ghcid + git + fd + + # Cardano tools + cardano-node.packages.${system}.cardano-cli + cardano-node.packages.${system}.cardano-node + ]; + }; + + modules = haskellModules; +} diff --git a/plutip-server/fourmolu.yaml b/plutip-server/fourmolu.yaml new file mode 100644 index 000000000..fc79883a8 --- /dev/null +++ b/plutip-server/fourmolu.yaml @@ -0,0 +1,8 @@ +indentation: 2 +comma-style: leading +record-brace-space: true +indent-wheres: true +diff-friendly-import-export: true +respectful: true +haddock-style: single-line +newlines-between-decls: 1 diff --git a/plutip-server/hie.yaml b/plutip-server/hie.yaml new file mode 100644 index 000000000..14f279877 --- /dev/null +++ b/plutip-server/hie.yaml @@ -0,0 +1,4 @@ +cradle: + cabal: + - path: "./src/" + component: "exe:plutip-server" diff --git a/plutip-server/plutip-server.cabal b/plutip-server/plutip-server.cabal new file mode 100644 index 000000000..da121dc1b --- /dev/null +++ b/plutip-server/plutip-server.cabal @@ -0,0 +1,96 @@ +cabal-version: 3.0 +name: plutip-server +version: 0.2 +license-file: LICENSE +author: mlabs +maintainer: TODO +build-type: Simple +extra-source-files: CHANGELOG.md + +common common-language + default-extensions: + BangPatterns + DataKinds + DeriveAnyClass + DeriveFoldable + DeriveFunctor + DeriveGeneric + DeriveLift + DeriveTraversable + DerivingStrategies + EmptyDataDecls + ExplicitForAll + FlexibleContexts + FlexibleInstances + GeneralizedNewtypeDeriving + ImportQualifiedPost + LambdaCase + MonoLocalBinds + MultiParamTypeClasses + NamedFieldPuns + NumericUnderscores + OverloadedStrings + QuasiQuotes + RankNTypes + RecordWildCards + ScopedTypeVariables + StandaloneDeriving + TemplateHaskell + TupleSections + TypeApplications + TypeFamilies + TypeOperators + TypeSynonymInstances + ViewPatterns + +common common-configs + default-language: Haskell2010 + +common common-ghc-options + ghc-options: + -fno-ignore-interface-pragmas -fno-omit-interface-pragmas + -fno-specialize -fno-strictness -fno-warn-orphans -fobject-code + -fplugin-opt PlutusTx.Plugin:defer-errors + +executable plutip-server + import: common-language + import: common-ghc-options + main-is: Main.hs + hs-source-dirs: src + default-language: Haskell2010 + build-depends: + , aeson + , async + , base + , base16-bytestring + , bytestring + , cardano-api + , cardano-ledger-core + , cardano-wallet + , cardano-wallet-launcher + , data-default + , directory + , exceptions + , extra + , filepath + , http-types + , mtl + , optparse-applicative + , plutip-core + , positive + , servant-server + , stm + , text + , time + , unliftio + , wai + , wai-cors + , wai-logger + , warp + + other-modules: + Api + Api.Handlers + Types + + ghc-options: -Wall -threaded -rtsopts diff --git a/plutip-server/src/Api.hs b/plutip-server/src/Api.hs new file mode 100644 index 000000000..b3c6fcc93 --- /dev/null +++ b/plutip-server/src/Api.hs @@ -0,0 +1,67 @@ +module Api where + +import Api.Handlers ( + startClusterHandler, + stopClusterHandler, + ) +import Control.Monad.IO.Class (liftIO) +import Control.Monad.Reader (runReaderT) +import Data.Kind (Type) +import Network.Wai.Middleware.Cors qualified as Cors +import Servant ( + Application, + Handler, + JSON, + Post, + Proxy (Proxy), + ReqBody, + Server, + ServerT, + hoistServer, + serve, + (:<|>) ((:<|>)), + (:>), + ) +import Types ( + AppM (AppM), + Env (Env), + ServerOptions, + StartClusterRequest, + StartClusterResponse, + StopClusterRequest, + StopClusterResponse, + options, + ) + +type Api = + "start" + :> ReqBody '[JSON] StartClusterRequest + :> Post '[JSON] StartClusterResponse + :<|> "stop" + :> ReqBody '[JSON] StopClusterRequest + :> Post '[JSON] StopClusterResponse + +app :: Env -> Application +app = Cors.cors (const $ Just policy) . serve api . appServer + where + policy :: Cors.CorsResourcePolicy + policy = + Cors.simpleCorsResourcePolicy + { Cors.corsRequestHeaders = ["Content-Type"] + , Cors.corsMethods = ["OPTIONS", "GET", "POST"] + } + +api :: Proxy Api +api = Proxy + +server :: ServerOptions -> ServerT Api AppM +server serverOptions = + startClusterHandler serverOptions + :<|> stopClusterHandler + +appServer :: Env -> Server Api +appServer env@Env {options} = + hoistServer api appHandler (server options) + where + appHandler :: forall (a :: Type). AppM a -> Handler a + appHandler (AppM x) = liftIO $ runReaderT x env diff --git a/plutip-server/src/Api/Handlers.hs b/plutip-server/src/Api/Handlers.hs new file mode 100644 index 000000000..33452b14a --- /dev/null +++ b/plutip-server/src/Api/Handlers.hs @@ -0,0 +1,118 @@ +module Api.Handlers ( + startClusterHandler, + stopClusterHandler, +) where + +import Cardano.Launcher.Node (nodeSocketFile) + +import Control.Concurrent.MVar (isEmptyMVar, putMVar, tryTakeMVar) +import Control.Monad (unless) +import Control.Monad.Except (runExceptT, throwError) +import Control.Monad.Extra (unlessM) +import Control.Monad.IO.Class (liftIO) +import Control.Monad.Reader (asks) +import Data.Default (def) +import Data.Foldable (for_) +import Data.Maybe (fromMaybe) +import Plutip.Cluster (startFundedCluster, stopCluster) +import Plutip.Config ( + ExtraConfig (ExtraConfig, ecEpochSize, ecMaxTxSize, ecSlotLength), + PlutipConfig (extraConfig), + ecRaiseExUnitsToMax, + ) +import Plutip.Keys (signKeyCBORHex) +import Plutip.Types (ClusterEnv (runningNode), RunningNode (RunningNode), keysDir) +import System.Directory (doesFileExist) +import System.FilePath (replaceFileName) +import Types ( + AppM, + ClusterStartupFailureReason ( + ClusterIsRunningAlready, + NegativeLovelaces, + NodeConfigNotFound + ), + ClusterStartupParameters ( + ClusterStartupParameters, + keysDirectory, + nodeConfigPath, + nodeSocketPath, + privateKeys + ), + Env (status), + Lovelace (unLovelace), + ServerOptions, + StartClusterRequest ( + StartClusterRequest, + epochSize, + keysToGenerate, + maxTxSize, + raiseExUnitsToMax, + slotLength + ), + StartClusterResponse ( + ClusterStartupFailure, + ClusterStartupSuccess + ), + StopClusterRequest (StopClusterRequest), + StopClusterResponse (StopClusterFailure, StopClusterSuccess), + ) + +startClusterHandler :: ServerOptions -> StartClusterRequest -> AppM StartClusterResponse +startClusterHandler + _ + StartClusterRequest + { keysToGenerate + , slotLength + , epochSize + , maxTxSize + , raiseExUnitsToMax + } = interpret $ do + -- Check that lovelace amounts are positive + for_ keysToGenerate $ \lovelaceAmounts -> + for_ lovelaceAmounts $ \lovelaces -> + unless (unLovelace lovelaces > 0) $ + throwError NegativeLovelaces + statusMVar <- asks status + isClusterDown <- liftIO $ isEmptyMVar statusMVar + unless isClusterDown $ throwError ClusterIsRunningAlready + let cfg = def {extraConfig = extraConf} + keysToGenerate' = map fromIntegral <$> keysToGenerate + (statusTVar, (clusterEnv, keys)) <- liftIO $ startFundedCluster cfg keysToGenerate' (curry pure) + liftIO $ putMVar statusMVar statusTVar + + let nodeConfigPath = getNodeConfigFile clusterEnv + -- safeguard against directory tree structure changes + unlessM (liftIO $ doesFileExist nodeConfigPath) $ throwError NodeConfigNotFound + pure $ + ClusterStartupSuccess $ + ClusterStartupParameters + { privateKeys = signKeyCBORHex <$> keys + , nodeSocketPath = getNodeSocketFile clusterEnv + , nodeConfigPath = nodeConfigPath + , keysDirectory = keysDir clusterEnv + } + where + getNodeSocketFile (runningNode -> RunningNode conn _ _) = nodeSocketFile conn + getNodeConfigFile = + -- assumption is that node.config lies in the same directory as node.socket + flip replaceFileName "node.config" . getNodeSocketFile + interpret = fmap (either ClusterStartupFailure id) . runExceptT + + extraConf :: ExtraConfig + extraConf = + let defConfig = def + in ExtraConfig + (fromMaybe (ecSlotLength defConfig) slotLength) + (fromMaybe (ecEpochSize defConfig) epochSize) + (fromMaybe (ecMaxTxSize defConfig) maxTxSize) + (fromMaybe (ecRaiseExUnitsToMax defConfig) raiseExUnitsToMax) + +stopClusterHandler :: StopClusterRequest -> AppM StopClusterResponse +stopClusterHandler StopClusterRequest = do + statusMVar <- asks status + maybeClusterStatus <- liftIO $ tryTakeMVar statusMVar + case maybeClusterStatus of + Nothing -> pure $ StopClusterFailure "Cluster is not running" + Just statusTVar -> do + liftIO $ stopCluster statusTVar + pure StopClusterSuccess diff --git a/plutip-server/src/Main.hs b/plutip-server/src/Main.hs new file mode 100644 index 000000000..35f26c573 --- /dev/null +++ b/plutip-server/src/Main.hs @@ -0,0 +1,59 @@ +module Main (main) where + +import Api (app) +import Control.Applicative ((<**>)) +import Control.Concurrent.MVar (newEmptyMVar) +import Data.Function ((&)) +import Network.HTTP.Types (Status) +import Network.Wai (Request) +import Network.Wai.Handler.Warp ( + Port, + Settings, + defaultSettings, + runSettings, + setLogger, + setPort, + ) +import Network.Wai.Logger (withStdoutLogger) +import Options.Applicative qualified as Options +import System.Exit (die) +import Types (Env (Env, options, status), ServerOptions (ServerOptions, port)) + +main :: IO () +main = do + serverOptions@ServerOptions {port} <- Options.execParser opts + withStdoutLogger $ \logger -> do + putStrLn $ "Plutip server starting on port " <> show port + runSettings (mkSettings port logger) + . app + =<< either die pure + =<< newEnvIO serverOptions + where + mkSettings :: + Port -> (Request -> Status -> Maybe Integer -> IO ()) -> Settings + mkSettings port logger = defaultSettings & setPort port & setLogger logger + +newEnvIO :: ServerOptions -> IO (Either String Env) +newEnvIO options = do + status <- newEmptyMVar + pure . Right $ Env {status, options} + +opts :: Options.ParserInfo ServerOptions +opts = + Options.info (serverOptionsParser <**> Options.helper) $ + Options.fullDesc + <> Options.progDesc + "plutip-server is used for integration with cardano-transaction-lib" + +serverOptionsParser :: Options.Parser ServerOptions +serverOptionsParser = + ServerOptions + <$> Options.option + Options.auto + ( Options.long "port" + <> Options.short 'p' + <> Options.help "Server port" + <> Options.showDefault + <> Options.value 8082 + <> Options.metavar "INT" + ) diff --git a/plutip-server/src/Types.hs b/plutip-server/src/Types.hs new file mode 100644 index 000000000..9d7d5227c --- /dev/null +++ b/plutip-server/src/Types.hs @@ -0,0 +1,135 @@ +module Types ( + AppM (AppM), + ClusterStartupFailureReason ( + ClusterIsRunningAlready, + NegativeLovelaces, + NodeConfigNotFound + ), + Env (Env, status, options), + ErrorMessage, + Lovelace (unLovelace), + PrivateKey, + ServerOptions (ServerOptions, port), + StartClusterRequest ( + StartClusterRequest, + keysToGenerate, + slotLength, + epochSize, + maxTxSize, + raiseExUnitsToMax + ), + StartClusterResponse ( + ClusterStartupSuccess, + ClusterStartupFailure + ), + ClusterStartupParameters ( + ClusterStartupParameters, + keysDirectory, + nodeSocketPath, + privateKeys, + nodeConfigPath + ), + StopClusterRequest (StopClusterRequest), + StopClusterResponse (StopClusterSuccess, StopClusterFailure), +) where + +import Cardano.Ledger.Slot (EpochSize) +import Control.Concurrent.MVar (MVar) +import Control.Monad.Catch (MonadThrow) +import Control.Monad.IO.Class (MonadIO) +import Control.Monad.Reader (MonadReader, ReaderT) +import Data.Aeson (FromJSON, ToJSON, parseJSON) +import Data.Kind (Type) +import Data.Text (Text) +import GHC.Generics (Generic) +import Network.Wai.Handler.Warp (Port) +import Numeric.Natural (Natural) +import Plutip.Config (NominalDiffTimeMicro) +import Plutip.Cluster (StopClusterRef) + +-- TVar is used for signaling by 'startCluster'/'stopCluster' (STM is used +-- for blocking). +-- MVar is used by plutip-server to store current TVar (we allow maximum of one +-- cluster at any given moment). +-- This MVar is used by start/stop handlers. +-- The payload of ClusterStatus is irrelevant. +type ClusterStatusRef = MVar StopClusterRef + +data Env = Env + { status :: ClusterStatusRef + , options :: ServerOptions + } + +data ServerOptions = ServerOptions + { port :: Port + } + deriving stock (Generic) + +newtype AppM (a :: Type) = AppM (ReaderT Env IO a) + deriving newtype + ( Functor + , Applicative + , Monad + , MonadIO + , MonadReader Env + , MonadThrow + ) + +type ErrorMessage = Text + +newtype Lovelace = Lovelace {unLovelace :: Integer} + deriving stock (Show, Eq, Generic) + deriving newtype (ToJSON, Num, Enum, Ord, Real, Integral) + +instance FromJSON Lovelace where + parseJSON json = do + Lovelace <$> parseJSON json + +data StartClusterRequest = StartClusterRequest + { keysToGenerate :: [[Lovelace]] + -- ^ Lovelace amounts for each UTXO of each wallet + , slotLength :: Maybe NominalDiffTimeMicro + -- ^ Set the SlotLength. If set to Nothing use the default + , epochSize :: Maybe EpochSize + -- ^ Set the EpochSize. If set to Nothing use the default + , maxTxSize :: Maybe Natural + -- ^ Set The maxTxSize. If set to Nothing use the default + , raiseExUnitsToMax :: Maybe Bool + -- ^ Raise the execution units to the maximum when true. + -- If set to Nothing use the default + } + deriving stock (Show, Eq, Generic) + deriving anyclass (FromJSON, ToJSON) + +-- CborHex +type PrivateKey = Text + +data ClusterStartupFailureReason + = ClusterIsRunningAlready + | NegativeLovelaces + | NodeConfigNotFound + deriving stock (Show, Eq, Generic) + deriving anyclass (FromJSON, ToJSON) + +data ClusterStartupParameters = ClusterStartupParameters + { privateKeys :: [PrivateKey] + , nodeSocketPath :: FilePath + , nodeConfigPath :: FilePath + , keysDirectory :: FilePath + } + deriving stock (Show, Eq, Generic) + deriving anyclass (FromJSON, ToJSON) + +data StartClusterResponse + = ClusterStartupFailure ClusterStartupFailureReason + | ClusterStartupSuccess ClusterStartupParameters + deriving stock (Show, Eq, Generic) + deriving anyclass (FromJSON, ToJSON) + +data StopClusterRequest = StopClusterRequest + deriving stock (Show, Eq, Generic) + deriving anyclass (FromJSON, ToJSON) + +data StopClusterResponse = StopClusterSuccess | StopClusterFailure ErrorMessage + deriving stock (Show, Eq, Generic) + deriving anyclass (FromJSON, ToJSON) diff --git a/scripts/examples-imports-check.sh b/scripts/examples-imports-check.sh index 1f6132db3..99625f02a 100644 --- a/scripts/examples-imports-check.sh +++ b/scripts/examples-imports-check.sh @@ -1,5 +1,7 @@ #!/bin/sh +# Checks that no internal modules are used in examples + examples_imports_check() { local examples_path="./examples" local examples_with_internal_imports="" diff --git a/scripts/generate-keys.sh b/scripts/generate-keys.sh new file mode 100755 index 000000000..d5e5b0259 --- /dev/null +++ b/scripts/generate-keys.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +# This script can be used to generate two private keys and print the address. +# It is based on this guide: +# https://developers.cardano.org/docs/stake-pool-course/handbook/keys-addresses/ + +if [[ -e payment.skey ]]; then echo 'payment.skey already exists!'; exit 1; fi +if [[ -e stake.skey ]]; then echo 'stake.skey already exists!'; exit 1; fi + +# Generate a payment key +cardano-cli address key-gen \ + --verification-key-file payment.vkey \ + --signing-key-file payment.skey + +# Generate a stake key +cardano-cli stake-address key-gen \ + --verification-key-file stake.vkey \ + --signing-key-file stake.skey + +# Build an address +cardano-cli address build \ + --payment-verification-key-file payment.vkey \ + --stake-verification-key-file stake.vkey \ + --out-file payment.addr \ + --testnet-magic 1 # preview network, use 2 for preprod or `--mainnet` for mainnet + +# Print info +echo "Created: payment.skey, payment.vkey, stake.skey, stake.vkey" +echo "Your address:" +cat payment.addr +echo +echo "Open https://docs.cardano.org/cardano-testnet/tools/faucet/ to fund it" diff --git a/scripts/whitespace-check.sh b/scripts/whitespace-check.sh index 4ebf22247..2e0f26cfb 100755 --- a/scripts/whitespace-check.sh +++ b/scripts/whitespace-check.sh @@ -1,5 +1,7 @@ #!/bin/sh +# Checks that files don't have trailing whitespaces in them + files=" *.md *.nix @@ -9,24 +11,24 @@ files=" .tidyrc.json LICENSE Makefile -webpack.config.js +webpack.config.cjs package.json doc/*.md examples/ fixtures/scripts/ scripts/ src/ +esbuild/ templates/ctl-scaffold/*.md templates/ctl-scaffold/*.nix templates/ctl-scaffold/*.dhall -templates/ctl-scaffold/index.html -templates/ctl-scaffold/index.js templates/ctl-scaffold/package.json -templates/ctl-scaffold/webpack.config.js +templates/ctl-scaffold/webpack.config.cjs templates/ctl-scaffold/Makefile templates/ctl-scaffold/exe/ templates/ctl-scaffold/src/ templates/ctl-scaffold/test/ +templates/ctl-scaffold/esbuild/ test/ " diff --git a/spago-packages.nix b/spago-packages.nix index 465ce6127..a8b01cd41 100644 --- a/spago-packages.nix +++ b/spago-packages.nix @@ -7,11 +7,11 @@ let "aeson" = pkgs.stdenv.mkDerivation { name = "aeson"; - version = "bfd8f4dcd0522a076320f9dc710c24817438e02e"; + version = "v2.0.0"; src = pkgs.fetchgit { url = "https://github.com/mlabs-haskell/purescript-aeson.git"; - rev = "bfd8f4dcd0522a076320f9dc710c24817438e02e"; - sha256 = "1ywm51wqvwjqfrmhav6m4hyl9il3h77yyhzgyhvkvg0lkc0nn575"; + rev = "4fddd518a143de563299d484272a0ef18daa7dcd"; + sha256 = "1bz1z9l6nwf5yk45sbbjllmqvci0n1l92cvk3lgmni19g9silbrl"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -19,11 +19,11 @@ let "aff" = pkgs.stdenv.mkDerivation { name = "aff"; - version = "v6.0.0"; + version = "v7.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-aff.git"; - rev = "d0eb009f2f47cb1f5ba1d8592d90c95e8e7ff75d"; - sha256 = "1780sgqyvbdgh8ynxmxn5d44vvhaz7kn9sv3l44c2s9q8xfjkfgm"; + rev = "6adec6ff048a7876f74c294c440374cd21342d39"; + sha256 = "1viplap030ym9ya033xl6x41hvdc12v9ngwp1v64ayl40a5m1d47"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -31,11 +31,11 @@ let "aff-promise" = pkgs.stdenv.mkDerivation { name = "aff-promise"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/nwolverson/purescript-aff-promise.git"; - rev = "45cfba7f663fce12fe69285fe5acaa4ff025144c"; - sha256 = "12fnlwcrj5p6kc5rls7qxwg53zd83gkdpklpmp8jyav945hlgbj2"; + rev = "3aa74e68e3e4c3e38d821375703e0b2f49d831eb"; + sha256 = "10gv3b05dxnlmr9zmigqs1hz4xqrx7da30aqh12kqg3zrg49k9cc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -43,11 +43,11 @@ let "aff-retry" = pkgs.stdenv.mkDerivation { name = "aff-retry"; - version = "v1.2.1"; + version = "v2.0.0"; src = pkgs.fetchgit { url = "https://github.com/Unisay/purescript-aff-retry.git"; - rev = "936fad803e3610f149df724ead288657a905cb84"; - sha256 = "08651ly153ywzviab0ipd0zrhwdr8nz4xfym45dlpbgabgrh8pra"; + rev = "4464f4bf62151651c8a86b33fc3c3149f7c71580"; + sha256 = "00xmfrx41giflrbdxm6hzmr23iqzr34x656kjpbmk3zvm49n6726"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -55,11 +55,11 @@ let "affjax" = pkgs.stdenv.mkDerivation { name = "affjax"; - version = "v12.0.0"; + version = "v13.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-affjax.git"; - rev = "5be197edc213fbededb8da908f77b69908eaa6f8"; - sha256 = "1f2snaimnl9ry8f3kankfcyy50wkba54vvin4wsrglahqgs1nrgb"; + rev = "87a8ffce89a476c1425370eb4b2b7e15408e0d1c"; + sha256 = "02hd0pfa1lb06a8qg2mqmkhyn3cz8hbvh6r9h2i6xcfqh0r8jg7s"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -67,11 +67,11 @@ let "ansi" = pkgs.stdenv.mkDerivation { name = "ansi"; - version = "v6.1.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/hdgarrood/purescript-ansi.git"; - rev = "e89e6fede616bd16b001841cf30ac320c95313a6"; - sha256 = "1jsll0h7nz13zgscs036cnkkc6frnlcnk6fwjdwsyp6wbmjri2zm"; + rev = "7d898732d643a977a78004851112a4417909e126"; + sha256 = "1aml84m5p1s14kj29m39182byg44nf275p4cinx3kgwhv1gj0qcp"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -79,11 +79,11 @@ let "argonaut" = pkgs.stdenv.mkDerivation { name = "argonaut"; - version = "v8.0.0"; + version = "v9.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut.git"; - rev = "e5137df76065c14e5de70c4e2820222bd7c78fc2"; - sha256 = "05sq1102rl1phm2gadx0gp966yvk9q1r492bb30q1m0nz762q4v2"; + rev = "7505a47f2edb0c9cacaac4f11dcedf4723a3e9c8"; + sha256 = "18yxhlrwri6q858krz1klyq29fx8nvfm16c04wm2rn91mgyasn6x"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -91,11 +91,11 @@ let "argonaut-codecs" = pkgs.stdenv.mkDerivation { name = "argonaut-codecs"; - version = "v8.1.0"; + version = "v9.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-codecs.git"; - rev = "b0a041d92bfd548e2cd793cc7c02363464325a13"; - sha256 = "11vmlq98s4jmg5grvdrrlfkqj9vk3la44ky8158a440ipcpinjkq"; + rev = "f8fdc1e34142fa84e66022ea5d417a008d709146"; + sha256 = "1ncpl512k2xdaf7r5ixwxkm6i4vym7a6a3ih71z489h9ad781q73"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -103,11 +103,11 @@ let "argonaut-core" = pkgs.stdenv.mkDerivation { name = "argonaut-core"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-core.git"; - rev = "673971dee79667882a83f9fda7097e50530726f1"; - sha256 = "13ka4xybc8ql54xlkkhy4919nnapfigdlk51ja85f8xwhr64x9kq"; + rev = "68da81dd80ec36d3b013eff46dc067a972c22e5d"; + sha256 = "0hxl17ddbflkk0hchjgk5xj6j9fwp3b182w4g073p0dwscdl4f08"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -115,11 +115,11 @@ let "argonaut-traversals" = pkgs.stdenv.mkDerivation { name = "argonaut-traversals"; - version = "v9.0.0"; + version = "v10.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-traversals.git"; - rev = "36f2e368ceea1ed681bd8e2884eaca451945fc44"; - sha256 = "0bj88s7rz50jfhyawq4h97lvbr3h7pksbqnz4lmh714f5fda6ncx"; + rev = "8d2403d8d57afb568933dbb36063d5670ce770a0"; + sha256 = "0v965bcl1hdp1hacbzxcm35kxxclixj0kpsdm816gs7m548z6l43"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -127,11 +127,11 @@ let "arraybuffer-types" = pkgs.stdenv.mkDerivation { name = "arraybuffer-types"; - version = "v3.0.1"; + version = "v3.0.2"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-arraybuffer-types.git"; - rev = "48cd7f4887791db1d9c2daf5fd98b62ba00e15bd"; - sha256 = "09r6bhsiq9iqdsjf9p8m3p31qkszsipsafvy836mfdi8af6h5fv6"; + rev = "9b0b7a0f9ee034e039f3d3a2a9c3f74eb7c9264a"; + sha256 = "1q3111jk6jj64bxy86lc7ik6q5mgdz87bc086wj5rm57dmlivlxx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -139,11 +139,11 @@ let "arrays" = pkgs.stdenv.mkDerivation { name = "arrays"; - version = "v6.0.1"; + version = "v7.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-arrays.git"; - rev = "c0aa3176b077ad7a46b11ef34487485c28142e53"; - sha256 = "0lm0m5hapimchzgfywr648pkw1hpggr6qibh8d19p2impbnc94c0"; + rev = "bb1b821530d368110eebf8a3541af90823e8af65"; + sha256 = "1mb9a4pb1bd7fj4vqj6msv5z27jbb5f89w3nczgjjhs02909phk9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -151,11 +151,11 @@ let "assert" = pkgs.stdenv.mkDerivation { name = "assert"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-assert.git"; - rev = "71a3b1f3b9917c23691fdbb1858de171be871a10"; - sha256 = "0r1l7j67an8dy1w4xdpr8nc30lsxv31xwqph9mkfh3nd49jlyyd3"; + rev = "27c0edb57d2ee497eb5fab664f5601c35b613eda"; + sha256 = "02qpcsijil64qq4kcikv2ynxl85zkryvv0vmzjm6752956ymzi0j"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -163,11 +163,11 @@ let "avar" = pkgs.stdenv.mkDerivation { name = "avar"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-avar.git"; - rev = "ac3cbbb8d4b71ff19a78a3178355c089e44d3b4d"; - sha256 = "005046wl61w6r5v3qwd16srhcx82vdz3yvp4xzad2xaasb6iq55l"; + rev = "d00f5784d9cc8f079babd62740f5c52b87e5caa5"; + sha256 = "132g0ccmjr8328xpaycww8b5wmx1vi3li4irxxqcjk5wi47i8c9h"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -175,23 +175,11 @@ let "bifunctors" = pkgs.stdenv.mkDerivation { name = "bifunctors"; - version = "v5.0.0"; - src = pkgs.fetchgit { - url = "https://github.com/purescript/purescript-bifunctors.git"; - rev = "a31d0fc4bbebf19d5e9b21b65493c28b8d3fba62"; - sha256 = "0xc2hf8ccdgqw3m9qcmr38kmzv05fsxvakd07wyrqshvkzg3xn0d"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "bigints" = pkgs.stdenv.mkDerivation { - name = "bigints"; version = "v6.0.0"; src = pkgs.fetchgit { - url = "https://github.com/sharkdp/purescript-bigints.git"; - rev = "d5151e04db7e18641fbb2b5892f4198b1cab5907"; - sha256 = "0x8s6d6q2rpfkk56bmayg57a7hl2h7sq9ljrxfc8sjnwd7mfs193"; + url = "https://github.com/purescript/purescript-bifunctors.git"; + rev = "16ba2fb6dd7f05528ebd9e2f9ca3a068b325e5b3"; + sha256 = "1qz5aaiq5w4g1rhjb63z47h6nqhw8hw23x1zw5alam047pq4vfkg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -199,11 +187,11 @@ let "bignumber" = pkgs.stdenv.mkDerivation { name = "bignumber"; - version = "705923edd892a3397b90d28ce7db9a7181dcd599"; + version = "760d11b41ece31b8cdd3c53349c5c2fd48d3ff89"; src = pkgs.fetchgit { url = "https://github.com/mlabs-haskell/purescript-bignumber"; - rev = "705923edd892a3397b90d28ce7db9a7181dcd599"; - sha256 = "0wddkx161xk457r1mb1f1r79l8qgxja0xhdvxjd1ai43nwp9cgkf"; + rev = "760d11b41ece31b8cdd3c53349c5c2fd48d3ff89"; + sha256 = "03py821gnkgi5p7zaxwr4rqsiv67v83y5c04i6x4v15nr6aaf7vz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -211,11 +199,11 @@ let "catenable-lists" = pkgs.stdenv.mkDerivation { name = "catenable-lists"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-catenable-lists.git"; - rev = "ee03395f2c5d59a7fd8529a0faac6ec1ebcbb682"; - sha256 = "1lz06fx0za5sl65wccn5fl37mw3x4jnvrriz1gg0aqsmm9lag7ss"; + rev = "09abe1f4888bc00841ad2b59e56a9e7ce7ebd4ab"; + sha256 = "0fn6caspdnb0nrlj31sy7d5hxrhndfz7a2b9wfkxf5bv5vpjyawb"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -233,13 +221,37 @@ let installPhase = "ln -s $src $out"; }; + "cip30" = pkgs.stdenv.mkDerivation { + name = "cip30"; + version = "8f1b34b48825fcec5e9c67f33e255770b1e0bc45"; + src = pkgs.fetchgit { + url = "https://github.com/mlabs-haskell/purescript-cip30"; + rev = "8f1b34b48825fcec5e9c67f33e255770b1e0bc45"; + sha256 = "1rb7kv99rd50b6vhl90sirmzh43wgnyafpmn7w45n3d4nrvf1046"; + }; + phases = "installPhase"; + installPhase = "ln -s $src $out"; + }; + + "cip30-typesafe" = pkgs.stdenv.mkDerivation { + name = "cip30-typesafe"; + version = "d72e51fbc0255eb3246c9132d295de7f65e16a99"; + src = pkgs.fetchgit { + url = "https://github.com/mlabs-haskell/purescript-cip30-typesafe"; + rev = "d72e51fbc0255eb3246c9132d295de7f65e16a99"; + sha256 = "0mlmifd1svi0havf2wgxzq23ycsqbhlvh4n35g3z7nqr7hhwh8s3"; + }; + phases = "installPhase"; + installPhase = "ln -s $src $out"; + }; + "console" = pkgs.stdenv.mkDerivation { name = "console"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-console.git"; - rev = "d7cb69ef8fed8a51466afe1b623868bb29e8586e"; - sha256 = "0fzzzqjgrz33pb2jf7cdqpg09ilxb7bsrc7sbfq52wjg0sx9aq6g"; + rev = "3b83d7b792d03872afeea5e62b4f686ab0f09842"; + sha256 = "0fr5l1myhscp910mybp04cg6g8f2hy3ikjfc8fkqlb2dm2cqzdfs"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -247,11 +259,11 @@ let "const" = pkgs.stdenv.mkDerivation { name = "const"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-const.git"; - rev = "3a3a4bdc44f71311cf27de9bd22039b110277540"; - sha256 = "0aq9qjbrvf8mf8hmas6imv4mg6n3zi13hkf449ns1hn12lw8qv4g"; + rev = "ab9570cf2b6e67f7e441178211db1231cfd75c37"; + sha256 = "0mcpwqqf5bcwxlzk53smvsjjz1ymlnq0ypphg6sc83ibw70g64f6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -259,11 +271,11 @@ let "contravariant" = pkgs.stdenv.mkDerivation { name = "contravariant"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-contravariant.git"; - rev = "ae1a765f7ddbfd96ae1f12e399e46d554d8e3b38"; - sha256 = "029hb8i3n4759x4gc06wkfgr7wim5x1w5jy2bsiy42n0g731h5qc"; + rev = "9ad3e105b8855bcc25f4e0893c784789d05a58de"; + sha256 = "1xkd3rfs8v20w7mj6sj6dmhfb2vb1zpmjv245xj1rahk3g16qm7m"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -271,11 +283,11 @@ let "control" = pkgs.stdenv.mkDerivation { name = "control"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-control.git"; - rev = "18d582e311f1f8523f9eb55fb93c91bd21e22837"; - sha256 = "06dc06yli4g5yr8fb9sdpqbhiaff37g977qcsbds9q2mlhnjgfx9"; + rev = "a6033808790879a17b2729e73747a9ed3fb2264e"; + sha256 = "05sdgywprwpav62d2bvlb80yd39brxhnmhhl1f116mm9hw5clqia"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -283,11 +295,11 @@ let "crypto" = pkgs.stdenv.mkDerivation { name = "crypto"; - version = "v4.0.0"; + version = "v5.0.1"; src = pkgs.fetchgit { url = "https://github.com/oreshinya/purescript-crypto.git"; - rev = "cbc19e06c5e4d528e7733633e50c070b1aa0f77e"; - sha256 = "142p9f0mg1yi4bccg3jwhhyn4k4yy5fskh08p05n9sfym27ss126"; + rev = "c72b4b789e52a1fb31c65cd318ea82bf295af1ec"; + sha256 = "07p7153j3brsfyc1pik4y760g054zx1kwy2ap67pfs41zv982s03"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -295,11 +307,11 @@ let "datetime" = pkgs.stdenv.mkDerivation { name = "datetime"; - version = "v5.0.2"; + version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-datetime.git"; - rev = "e110462829ea656d2bc0924266d4edff222108d4"; - sha256 = "1mhzn2ymdkzki7wjlr9xrdbngm0886wmfbh2c46flnf9lmfyw54y"; + rev = "7f6062346055e654942caed6c44612b59031f059"; + sha256 = "0z5f62arrli0dgmggv6z2qkv1qc9isdivcn7njywsa8wmc4vd47n"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -307,11 +319,11 @@ let "debug" = pkgs.stdenv.mkDerivation { name = "debug"; - version = "v5.0.0"; + version = "v6.0.2"; src = pkgs.fetchgit { url = "https://github.com/garyb/purescript-debug.git"; - rev = "144305842dba81169a93b3a3cc75429d5c8389e9"; - sha256 = "09j69bgrq8nzw1l3aj1hka3y5ycmcsn9dlgf22k5ifrd74iic60y"; + rev = "a37b82f62c89734934c0962ece3412913020460a"; + sha256 = "0q3r21zh0kjy9aq8q2siaf8841q63cmxjl2fbk0z3r0z4cfihccg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -319,11 +331,11 @@ let "distributive" = pkgs.stdenv.mkDerivation { name = "distributive"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-distributive.git"; - rev = "11f3f87ca5720899e1739cedb58dd6227cae6ad5"; - sha256 = "0788znmdyh6b1c9pln624ah397l88xmd3fxlxiy3z1qy8bzr4r54"; + rev = "6005e513642e855ebf6f884d24a35c2803ca252a"; + sha256 = "0x6cfsx9ff66kvw9l10pxd5vv16r91mmfxrfc68w1xfdfi81lhdx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -331,11 +343,11 @@ let "effect" = pkgs.stdenv.mkDerivation { name = "effect"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-effect.git"; - rev = "985d97bd5721ddcc41304c55a7ca2bb0c0bfdc2a"; - sha256 = "1n9qr85knvpm4i0qhm8xbgfk46v9y843p76j278phfs9l6aywzsn"; + rev = "a192ddb923027d426d6ea3d8deb030c9aa7c7dda"; + sha256 = "0aa10lc6h9mlf4xf3g3ziig7v6kxdqvbh20kma8ay59w0b1bhmj1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -343,11 +355,11 @@ let "either" = pkgs.stdenv.mkDerivation { name = "either"; - version = "v5.0.0"; + version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-either.git"; - rev = "c1a1af35684f10eecaf6ac7d38dbf6bd48af2ced"; - sha256 = "18dk159yyv7vs0xsnh9m5fajd7zy6zw5b2mpyd6nqdh3c6bb9wh6"; + rev = "af655a04ed2fd694b6688af39ee20d7907ad0763"; + sha256 = "05zps4klvgmvlm06f4hrycssm8q0pysbqnjsrk26lfvmid6mmg63"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -355,11 +367,11 @@ let "encoding" = pkgs.stdenv.mkDerivation { name = "encoding"; - version = "v0.0.7"; + version = "v0.0.8"; src = pkgs.fetchgit { url = "https://github.com/menelaos/purescript-encoding.git"; - rev = "0a4187136f9ea4ea51ddf635e3b3c2cd2461faac"; - sha256 = "1rsnn8g2lx24k9wflr1jj12281i0smprb76nfm2f61yqqiwgij4d"; + rev = "a9d1913de736821c133ecd7944a08b2ab07ad774"; + sha256 = "0c23bpfw67ik1n821bq3s0w036sk7yqi4fy5fd7dgf4325abk6zn"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -367,11 +379,11 @@ let "enums" = pkgs.stdenv.mkDerivation { name = "enums"; - version = "v5.0.0"; + version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-enums.git"; - rev = "170d959644eb99e0025f4ab2e38f5f132fd85fa4"; - sha256 = "1lci5iy6s6cmh93bpkfcmp0j4n5dnij7dswb0075bk0kzd9xp7rs"; + rev = "cd373c580b69fdc00e412bddbc299adabe242cc5"; + sha256 = "1wk98ddmgyii1ifqawnhqkiqlrs405qcp3m12jsg1yp8jv6ppv47"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -379,11 +391,11 @@ let "exceptions" = pkgs.stdenv.mkDerivation { name = "exceptions"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-exceptions.git"; - rev = "410d0b8813592bda3c25028540eeb2cda312ddc9"; - sha256 = "1yjbrx34a0rnxgpvywb63n9jzhkdgb2q2acyzbwh290mrrggc95x"; + rev = "afab3c07c820bb49b6c5be50049db46a964a6161"; + sha256 = "04xrbrcjwsv8gj465ygrlqhv1majxmr6m242iazg6apxlr89hgvg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -391,11 +403,11 @@ let "exists" = pkgs.stdenv.mkDerivation { name = "exists"; - version = "v5.1.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-exists.git"; - rev = "c34820f8b2d15be29abdd5097c3d636f5df8f28c"; - sha256 = "15qp52cpp2yvxihkzfmn6gabyvx5s6iz5lafvqhyfgp4wfnz0bds"; + rev = "f765b4ace7869c27b9c05949e18c843881f9173b"; + sha256 = "0xnxi8fsmi15wrpq5d99gg94glk8a45hpx7pf4pmxg5r6rn1vjvx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -415,11 +427,11 @@ let "fixed-points" = pkgs.stdenv.mkDerivation { name = "fixed-points"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-fixed-points.git"; - rev = "3b643d948479aee7cd3e36c95258f1f84df0c35f"; - sha256 = "0w2j0sarylzsmg8b228pmn3qndif0bzw2vmxrx30ar15qy7jdb5d"; + rev = "2b7f480038a15c707adf49178181cefed167afb2"; + sha256 = "1iib0yxl749lg4m7ysqmb9aby67a9829x38xc2rma5fk9fv30cw7"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -427,11 +439,11 @@ let "foldable-traversable" = pkgs.stdenv.mkDerivation { name = "foldable-traversable"; - version = "v5.0.1"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foldable-traversable.git"; - rev = "d581caf260772b1b446c11ac3c8be807b290b220"; - sha256 = "182na4np7hk2dqyxywy4jij2csrzx4bz02m6bq8yx1j27hlgjvsd"; + rev = "b3926f870532d287ea59e2d5cd3873b81ef2a93a"; + sha256 = "0xg8qvyc6r9wqgy7wnw1rjqljl4wpgdrkxsm5x9rsagj2k5brxip"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -439,11 +451,11 @@ let "foreign" = pkgs.stdenv.mkDerivation { name = "foreign"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foreign.git"; - rev = "7ee18c6689c56c89755172ea53326f948da10bd3"; - sha256 = "16j7712cck79p8q53xbhn4hs886bm0ls5wvmchrhqnaghj48m85g"; + rev = "2dd222d1ec7363fa0a0a7adb0d8eaf81bb7006dd"; + sha256 = "0ycjaal8b2rsg3zl3b7acv166vjfdvziiza3fs8nhfw0rx0xmm1m"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -451,11 +463,11 @@ let "foreign-object" = pkgs.stdenv.mkDerivation { name = "foreign-object"; - version = "v3.0.0"; + version = "v4.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foreign-object.git"; - rev = "c9a7b7bb8bed1b87c5545c4ebe85a70f86c0e6b1"; - sha256 = "0accw6qd93qqry19rskjgl7y54xi2wd70rglbqyjx6c5ybcjnavr"; + rev = "9bfb4eb6271b151414594cfec669fb4b18b91bd1"; + sha256 = "1fr5hwzkan7yv2kbgvii2b8kanhjkqrbixcyj7kyv9fwkk8dk96a"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -463,11 +475,11 @@ let "fork" = pkgs.stdenv.mkDerivation { name = "fork"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-fork.git"; - rev = "153cc29e6e51fb1108368efc622d41d9f80bd707"; - sha256 = "1hyvaixza8151zbylk2kv859x48yyhla536lcjghcwd62vzfwmdn"; + rev = "a5c3bc6f357e97669e8c29c6f79f5f55be0d42c0"; + sha256 = "0yzh55vfrhrr660ni3sbbljypjirbka5jlks4zibqmhwrmy3wnj9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -475,11 +487,11 @@ let "form-urlencoded" = pkgs.stdenv.mkDerivation { name = "form-urlencoded"; - version = "v6.0.2"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-form-urlencoded.git"; - rev = "860b2c4bf0a848322d2077faaefbeb98762cb8d6"; - sha256 = "1pi3vxix10crisisnd94li1vmmgiawlh5lgl51z7ssd9azygg0b0"; + rev = "e0e3eebc76f62f2594a0e823e8d6241ca00b2459"; + sha256 = "1ay946w7gkgqrxxv5qf28w83mh59r1q4j8kk6pndhripz9pby68w"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -487,11 +499,11 @@ let "formatters" = pkgs.stdenv.mkDerivation { name = "formatters"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-formatters.git"; - rev = "b2e65b2bccd09a3c17a396f07e13e5cdca90e4e4"; - sha256 = "02c43sv6ci2698mjkmvkv3cjv99ilxv8ii8x7n9wqf18r4hlmk0y"; + rev = "0b4deda4c6664209173e3e21b8fcbc6151a4549c"; + sha256 = "0z3w5qbfd8z8bakir3rwanq6dcf554f3apacxw5l2vxscvikyra3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -499,23 +511,11 @@ let "free" = pkgs.stdenv.mkDerivation { name = "free"; - version = "v6.2.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-free.git"; - rev = "c185c0b2144ddfb2bc3ac2b345df32e33221b21d"; - sha256 = "10zsw49wzlzz78882b3grl19gpca5llpdk3ph608075h0ygk3q3k"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "freet" = pkgs.stdenv.mkDerivation { - name = "freet"; - version = "v6.0.0"; - src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-freet.git"; - rev = "507c2edd9173cda5ad44dd0638133edd69fd9acd"; - sha256 = "0f5bibw604sd9ffmp51b3jppka88r54mh7sdz91zy5b92wgsy5yr"; + rev = "e2d8fa8023a864363857834e11393483bced5e38"; + sha256 = "0gyy0k297m26gw76w7kx8k1zjczlqbqb3nmh2h4gb3r84gl05g6r"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -523,11 +523,11 @@ let "functions" = pkgs.stdenv.mkDerivation { name = "functions"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-functions.git"; - rev = "691b3345bc2feaf914e5299796c606b6a6bf9ca9"; - sha256 = "1gnk6xh5x04zcahn82gwp49qpglxd5jkfqn0i58m27jfihvblaxd"; + rev = "f626f20580483977c5b27a01aac6471e28aff367"; + sha256 = "1bsf2y8hx103a92yrc6m05q2dv51ckag1srd7q5n9vaf2k9byrj9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -535,11 +535,11 @@ let "functors" = pkgs.stdenv.mkDerivation { name = "functors"; - version = "v4.1.1"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-functors.git"; - rev = "e936f7a8d2ec53a344c478ccada5add93273848c"; - sha256 = "0i1x14r54758s5jx5d7zy4l07mg6gabljadgybldnbpmdqk6b966"; + rev = "022ffd7a2a7ec12080314f3d217b400674a247b4"; + sha256 = "1pnw3r1nk0rx8mrw3ajjml40zvx9v26qrqwj77pz7hpwxigxfbff"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -547,11 +547,11 @@ let "gen" = pkgs.stdenv.mkDerivation { name = "gen"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-gen.git"; - rev = "85c369f56545a3de834b7e7475a56bc9193bb4b4"; - sha256 = "1h396rqn1fc2c155i58vnaksqjrpajly128ah6wq1w426vwr1vrf"; + rev = "9fbcc2a1261c32e30d79c5418edef4d96fe76931"; + sha256 = "0kajzcp9a8dmqvb3ga27hlf18m2smbp98a0bmzzb9vv156ckw0b4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -559,11 +559,11 @@ let "heterogeneous" = pkgs.stdenv.mkDerivation { name = "heterogeneous"; - version = "v0.5.1"; + version = "v0.6.0"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-heterogeneous.git"; - rev = "550445cf7932e158395423fc087cdc05bab41c40"; - sha256 = "08bpgm9p8ib1jzrmssqpa1bqqzfmba43lsih1xvr3pf1jfizayxg"; + rev = "5b7542bdd9547c5aef95b8878f103f0ce4ee1383"; + sha256 = "0ff1wjq2ayhy67ydggbb2qlzbhvmv1m1z8dcp48p9zhxiq9fpfsz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -571,11 +571,11 @@ let "http-methods" = pkgs.stdenv.mkDerivation { name = "http-methods"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-http-methods.git"; - rev = "d373066a45017e886d1580cd359372368231de47"; - sha256 = "1g0ywd5zpckmhq28mr14yr4k28hiii1px8r8xbdx8nv45ryw69l3"; + rev = "99b48d54b978e4e6438d850015d59e57ac64824e"; + sha256 = "126x1cqr1769a3yzigpp8sp33n6s4fadai7w30mb2nk9dbxy0hw5"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -583,11 +583,11 @@ let "identity" = pkgs.stdenv.mkDerivation { name = "identity"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-identity.git"; - rev = "5c150ac5ee4fa6f145932f6322a1020463dae8e9"; - sha256 = "0a58y71ihvb5b7plnn2sxsbphqzd9nzfafak4d5a576agn76q0ql"; + rev = "ef6768f8a52ab0bc943a85f5761ba07c257f639f"; + sha256 = "1lh0pkwwdyd8q9bgf4l1m96gdnardki4r2s359cnhrwp94b43fyr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -595,11 +595,11 @@ let "integers" = pkgs.stdenv.mkDerivation { name = "integers"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-integers.git"; - rev = "8a783f2d92596c43afca53066ac18eb389d15981"; - sha256 = "1rrygw0ai61brnvgap7dfhdzacyhg5439pz6yrmmyg32cvf0znhv"; + rev = "54d712b25c594833083d15dc9ff2418eb9c52822"; + sha256 = "04j9sqvkgyxxvbm8jfc2118wzmgswn8jva9fysgbsnmsg9vcxfm6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -607,35 +607,35 @@ let "invariant" = pkgs.stdenv.mkDerivation { name = "invariant"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-invariant.git"; - rev = "c421b49dec7a1511073bb408a08bdd8c9d17d7b1"; - sha256 = "0vwkbh7kv00g50xjgvxc0mv5b99mrj6q0sxznxwk32hb9hkbhy5l"; + rev = "1d2a196d51e90623adb88496c2cfd759c6736894"; + sha256 = "07rqag47ykdiqc5yfbc1a64ijaqliljhcw1vgbv81m7ljzzd2xna"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "js-date" = pkgs.stdenv.mkDerivation { - name = "js-date"; - version = "v7.0.0"; + "js-bigints" = pkgs.stdenv.mkDerivation { + name = "js-bigints"; + version = "36a7d8ac75a7230043ae511f3145f9ed130954a9"; src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-js-date.git"; - rev = "a6834eef986e3af0490cb672dc4a8b4b089dcb15"; - sha256 = "1dpiwn65qww862ilpfbd06gwfazpxvz3jwvsjsdrcxqqfcbjp8n8"; + url = "https://github.com/purescript-contrib/purescript-js-bigints"; + rev = "36a7d8ac75a7230043ae511f3145f9ed130954a9"; + sha256 = "0q3j7jl6ga63ygw2hmfigxjq8nbj56p3bn94x7vnhnhq7996bkpd"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "js-timers" = pkgs.stdenv.mkDerivation { - name = "js-timers"; - version = "v5.0.1"; + "js-date" = pkgs.stdenv.mkDerivation { + name = "js-date"; + version = "v8.0.0"; src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-js-timers.git"; - rev = "86afef13f457b9506acdfe88559ee18f1cd2c2d8"; - sha256 = "0008paz0qkz5n1pfrzagkkac6jny9z2rd1ij10ww2k1pkb9cy59z"; + url = "https://github.com/purescript-contrib/purescript-js-date.git"; + rev = "1ea020316946cc4b87195bca9c54d0c16abaa490"; + sha256 = "03535g8hc4bzyzig25hf75dls9ypsgrdk2nc45h8zw4xyy4ha0gz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -643,11 +643,11 @@ let "js-uri" = pkgs.stdenv.mkDerivation { name = "js-uri"; - version = "v2.0.0"; + version = "v3.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-js-uri.git"; - rev = "6145d5e631be3d57d8a4a9cf976ae140713dee35"; - sha256 = "1q34ir93cqbcl9g49vv1qfj8jxbbdj7f85a14y4mzd7yjq0a042g"; + rev = "06f7ae755ccb36bfa80bc3702533165af5c7ef06"; + sha256 = "0c9k1fpf4ljlqsnb07i3gwa6jiwlli0046pnglmk56ls53l6d4aj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -667,11 +667,11 @@ let "lazy" = pkgs.stdenv.mkDerivation { name = "lazy"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lazy.git"; - rev = "2f73f61e7ac1ae1cfe05564112e3313530e673ff"; - sha256 = "1wxfx019911gbkifq266hgn67zwm89pxhi83bai77mva5n9j3f6l"; + rev = "48347841226b27af5205a1a8ec71e27a93ce86fd"; + sha256 = "0dxlc3b2bdqsri45i7a9bvwvv0gg43cc1gq61zi41f290a29ny2q"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -679,11 +679,11 @@ let "lcg" = pkgs.stdenv.mkDerivation { name = "lcg"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lcg.git"; - rev = "8fb2eb16bbba2cee1d115a6729659ac649da811b"; - sha256 = "04r9bmx9kc3jqx59hh9yqqkl95mf869la9as5h36jv85ynn464dx"; + rev = "67c6c6483a563a59ae036d9dca0f1be2835326a5"; + sha256 = "1shzn6zvc1cxd7v0bvfsk7x3xf59vxby8c5lfjvd746r6396zn65"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -691,11 +691,11 @@ let "lists" = pkgs.stdenv.mkDerivation { name = "lists"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lists.git"; - rev = "6383c4f202b3f69474f9f7da182c2d42fcc3111c"; - sha256 = "0xmg918s3mqvfvwgjfqcs1yvcz6hy2n7h3ygqz2iyvk868gz25qs"; + rev = "b113451e5b41cad87d669a3165f955c71cd863e2"; + sha256 = "1mg7vy44k8jlqkri7x4ikciixx92b17wi35887x09dwdsicjf0sx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -703,23 +703,11 @@ let "literals" = pkgs.stdenv.mkDerivation { name = "literals"; - version = "v0.2.0"; - src = pkgs.fetchgit { - url = "https://github.com/jvliwanag/purescript-literals.git"; - rev = "11457380e1b28c9526c41381eeb0ee840982db5c"; - sha256 = "1jjnpfmh9qfmffyrmcfnn9p25irmsmaji6lwrsrd2r9xdhpzmqg7"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "math" = pkgs.stdenv.mkDerivation { - name = "math"; - version = "v3.0.0"; + version = "v1.0.2"; src = pkgs.fetchgit { - url = "https://github.com/purescript/purescript-math.git"; - rev = "59746cc74e23fb1f04e09342884c5d1e3943a04f"; - sha256 = "0hkf0vyiga21992d9vbvdbnzdkvgljmsi497jjas1rk3vhblx8sq"; + url = "https://github.com/rowtype-yoga/purescript-literals.git"; + rev = "ae3ef4e9c1ae7c57ec77bd13906fa60ae8abba4a"; + sha256 = "1dvzi3qx6jbfw2g28wgbh1s9zv8z59wrf7r7jhib4g5ibgzq5r8q"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -727,23 +715,11 @@ let "maybe" = pkgs.stdenv.mkDerivation { name = "maybe"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-maybe.git"; - rev = "8e96ca0187208e78e8df6a464c281850e5c9400c"; - sha256 = "0vyk3r9gklvv7awzpph7ra53zxxbin1ngmqflb5vvr2365v5xyqy"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "medea" = pkgs.stdenv.mkDerivation { - name = "medea"; - version = "8b215851959aa8bbf33e6708df6bd683c89d1a5a"; - src = pkgs.fetchgit { - url = "https://github.com/juspay/medea-ps.git"; - rev = "8b215851959aa8bbf33e6708df6bd683c89d1a5a"; - sha256 = "05gnar9l1li0v1vv12kga0sssskfm4f1x9y6smpmqbqg9396pmsq"; + rev = "c6f98ac1088766287106c5d9c8e30e7648d36786"; + sha256 = "0n33g8c579vcs06ii0r7f14jjdwzjw7p583w4nmrv9h442q2cvlz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -751,11 +727,11 @@ let "media-types" = pkgs.stdenv.mkDerivation { name = "media-types"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-media-types.git"; - rev = "b6efa4c1e6808b31f399d8030b5938acec87cb48"; - sha256 = "0l51nd1w52756pyy3zliwmhfbin0px4pxr7d2h5vchl1wq895fja"; + rev = "af853de226592f319a953637069a943dd261cba3"; + sha256 = "0bxpsd2yw3zg58ay649v3xld7n17n7j7n9y8l841cjih9bc7ccxx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -763,11 +739,11 @@ let "mmorph" = pkgs.stdenv.mkDerivation { name = "mmorph"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/Thimoteus/purescript-mmorph.git"; - rev = "ebe16afbfa16dd600f3379ccedc7529417402393"; - sha256 = "0ds88hray8v0519n9k546qsc4qs8bj1k5h5az7nwfp0gaq0r5wpk"; + rev = "94bc558ac34184d5236a7a9b2463dcc7551ced8e"; + sha256 = "0m3m1kjy4i9lwzj8l5qlafxawyhbdxj035wa5ys4j8v4013a92xg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -797,25 +773,13 @@ let installPhase = "ln -s $src $out"; }; - "naturals" = pkgs.stdenv.mkDerivation { - name = "naturals"; - version = "v3.0.0"; - src = pkgs.fetchgit { - url = "https://github.com/LiamGoodacre/purescript-naturals.git"; - rev = "53aaa11516cd1bb8429f33032802bf43a5b04644"; - sha256 = "0jaly95g46rbb7xwfv655pgm2bsp11p1iriasa0w79ryv0p488hi"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - "newtype" = pkgs.stdenv.mkDerivation { name = "newtype"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-newtype.git"; - rev = "7b292fcd2ac7c4a25d7a7a8d3387d0ee7de89b13"; - sha256 = "1fgzbxslckva2psn0sia30hfakx8xchz3wx2kkh3w8rr4nn2py8v"; + rev = "29d8e6dd77aec2c975c948364ec3faf26e14ee7b"; + sha256 = "0kfc644zn2f9rpx8fy4gjvmz04k9mv1c2xrqis8m3s0ydnhbffd7"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -823,11 +787,11 @@ let "noble-secp256k1" = pkgs.stdenv.mkDerivation { name = "noble-secp256k1"; - version = "710c15c48c5afae5e0623664d982a587ff2bd177"; + version = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd"; src = pkgs.fetchgit { url = "https://github.com/mlabs-haskell/purescript-noble-secp256k1.git"; - rev = "710c15c48c5afae5e0623664d982a587ff2bd177"; - sha256 = "014wapsgg6xa76i3f368aag4kps644g8qqqha9xbgyxmrhxsln6q"; + rev = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd"; + sha256 = "0n2q83n210ih5l54p6wrrjqmy40xhhdd3mam5mzixgr2hszm8969"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -835,11 +799,11 @@ let "node-buffer" = pkgs.stdenv.mkDerivation { name = "node-buffer"; - version = "v7.0.1"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-buffer.git"; - rev = "0721f1e8d768df48ae429547c8c60b121ca120cb"; - sha256 = "14bf3llsa20ivkwp5hlyk8v8zfzpzhhsni9pd8rfqdyzp6zrdx3b"; + rev = "7be7bd082b7d3e15de2ed5a626d43af746bdb35e"; + sha256 = "1l1j4ml0lyhnxs1zcy3jchlc0mbsn40g1pxyb4lv6slhp0qdhjhp"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -847,11 +811,11 @@ let "node-child-process" = pkgs.stdenv.mkDerivation { name = "node-child-process"; - version = "v7.1.0"; + version = "v9.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-child-process.git"; - rev = "5c4e560eceead04efc1d5a3ec1f6de91bb1d512e"; - sha256 = "18va367xims00hmjwiasiifdfak3cbs0sp4sr52ihb20n19n6h5b"; + rev = "ceaa5dcd21697da24a916b81c73ba013592cf378"; + sha256 = "1h93r8q0gpdp3vz89b9aazdr0dc99kyx0wx8xb1ap8v2img8xid1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -859,11 +823,11 @@ let "node-fs" = pkgs.stdenv.mkDerivation { name = "node-fs"; - version = "v6.2.0"; + version = "v8.1.1"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-fs.git"; - rev = "3cb63cc55a02e506fe07d3940a50d6f0eb6ca2f2"; - sha256 = "1b89sxr6asxvgx59myhfbahiiz1z6sg2qfrm9bqd46h93ai8bhn1"; + rev = "a9da8b9860f8a1f67e38701f5cce72a0f2c3901d"; + sha256 = "0ywv0d8w2fbqnj9z1dxbm2a9na10g960b5gznjcf7d70gs22ixhj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -871,11 +835,11 @@ let "node-fs-aff" = pkgs.stdenv.mkDerivation { name = "node-fs-aff"; - version = "v7.0.0"; + version = "v9.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-fs-aff.git"; - rev = "1da5d326573c3b17c6d4dba3d0e0157e60869f91"; - sha256 = "10aglq89gbchykwlckmg5xsln705qha76f125snkmk056kq2w89h"; + rev = "ac9b6fd272eb52c906b490be1c714423dd36a5bf"; + sha256 = "0mi91kd1b0ix8ygaaj5jspw0m53b8rv5mingrk2lvxhimsxa3f81"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -883,11 +847,11 @@ let "node-http" = pkgs.stdenv.mkDerivation { name = "node-http"; - version = "v6.0.0"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-http.git"; - rev = "48a4da07051f0cc9a9d08fbfe8179ebf55aff39a"; - sha256 = "1521ab70jx7a9d7kk4gn1sk4w6knfi13pai1kanhrvwp5lfys5wl"; + rev = "9baab9d9b45064e8cc1d53913bb1668bfa799b16"; + sha256 = "1bi7kwai15l4lqcnaq14mi906cppcjm3iqax4qq3vjihf68b66r4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -895,11 +859,11 @@ let "node-net" = pkgs.stdenv.mkDerivation { name = "node-net"; - version = "v2.0.1"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-net.git"; - rev = "e25a2c538dfa524cd9b75bf12fd7a393efe2f7e9"; - sha256 = "17sx9r74kdjq85dafm5kisbvgdb0wn11lq9gaazpdirhshpm2wl5"; + rev = "812ce3142b67c33db225a0f94fabd6a6776bf0be"; + sha256 = "18z42zqinm357qzr8r7w7lwhjnmd2693ywqkb1ndjd2p3dz7x4zm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -907,11 +871,11 @@ let "node-path" = pkgs.stdenv.mkDerivation { name = "node-path"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-path.git"; - rev = "a2d7cf05e40b607ef7d048a3684cda788cd42890"; - sha256 = "1384qyf4v84wbahafzvqdxjllqy8qkd5dpkhsl3js444vsm2aplr"; + rev = "d5f08cfde829b831408c4c6587cec83f2cd6a58e"; + sha256 = "1d38ipij4lb1nq8wkv7kmpk77z5ac0spfc89hfc9yn6jnscl6sky"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -919,11 +883,11 @@ let "node-process" = pkgs.stdenv.mkDerivation { name = "node-process"; - version = "v8.2.0"; + version = "v10.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-process.git"; - rev = "e1e807ac7831d1a8a15e242964f7e5005e42f76b"; - sha256 = "0nl9r271s8f71a9wqfkadq9b490h8phwgqc61jbzhm4ags23pqpg"; + rev = "9d126d9d4f898723e7cab69895770bbac0c3a0b8"; + sha256 = "07gcg33g56f74ph2bqmj5lysy752f6y31y7mkrgd2m0jzi7wknn3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -931,11 +895,11 @@ let "node-readline" = pkgs.stdenv.mkDerivation { name = "node-readline"; - version = "v5.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-readline.git"; - rev = "c59deb30c7ff5cc91d6b062120c5a3979bd4ccff"; - sha256 = "0c299bvkhrdbij88fxb75sdm7bl4wpgv9fz7wsj0hw6gkxmplpj9"; + rev = "fbe80a949275f15643b80f9db7c01d5a6b4031ed"; + sha256 = "1gxldf016w8xjm6jj95mshglgb4gcs9scxfr5ckxry1rzk6fzz1d"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -943,11 +907,11 @@ let "node-streams" = pkgs.stdenv.mkDerivation { name = "node-streams"; - version = "v5.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-streams.git"; - rev = "886bb2045685e3b9031687d69ccfed29972147bb"; - sha256 = "1jc3d4x0v77h8qcwq7hpwprsdr3gqmdfiyr1ph0kiy7r9bbrqwfx"; + rev = "8395652f9f347101fe042f58726edc592ae5086c"; + sha256 = "1cgkh3dwnhv90r7dak3x4dq698gh30ghfxncrw0ngwrv5pismn0x"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -955,11 +919,11 @@ let "node-url" = pkgs.stdenv.mkDerivation { name = "node-url"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-url.git"; - rev = "d5671f5e38051f4fa7acacd9ec157ed9dc6ded46"; - sha256 = "0w78q23vxa2nldy0dfj4nb5kv0pcrc1yq7dp1mysz7cdi9f72zp9"; + rev = "de7b279df13a9eeef2455af561525f37568c190e"; + sha256 = "14qkni1138jn02s8hpchc0i73n7brj1j9d3gwc8kh1wz1ddhjypw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -967,11 +931,11 @@ let "nonempty" = pkgs.stdenv.mkDerivation { name = "nonempty"; - version = "v6.1.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-nonempty.git"; - rev = "7696eaf915da5333173bca7d779a51f91a525b83"; - sha256 = "0hhhw5x5xvs2bd9373gklja1545glnzi1xc2sj16kkznnayrmvsn"; + rev = "28150ecc7419238b187abd609a92a645273348bb"; + sha256 = "1mwdc2sny2ygp67kyk7h2493vq7syf7j18s3d9a5gwf1y7jlf7gh"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -979,11 +943,11 @@ let "now" = pkgs.stdenv.mkDerivation { name = "now"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-now.git"; - rev = "4c994dae8bb650787de1e4d9e709f2565fb354fb"; - sha256 = "1wa4j2h5rlw1lgfpm7rif3v6ksm8lplxl1x69zpk8hdf0cfyz4qm"; + rev = "b5ffed2381e5fefc063f484e607e8499e79eaf32"; + sha256 = "01khmqs4iz7dhlvd43zxj19q0c0vvqf1m128vgvgxz5mv430zfgr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -991,11 +955,11 @@ let "nullable" = pkgs.stdenv.mkDerivation { name = "nullable"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-nullable.git"; - rev = "8b19c16b16593102ae5d5d9f5b42eea0e213e2f5"; - sha256 = "0jbmks8kwhpb5fr2b9nb70fjwh6zdnwirycvzr77jafcny24yrnl"; + rev = "3202744c6c65e8d1fbba7f4256a1c482078e7fb5"; + sha256 = "10s3b54pjmr2rxlyzvc8yc99k1dpn0qrijnc4y65yj5z6bxf2791"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1003,11 +967,11 @@ let "numbers" = pkgs.stdenv.mkDerivation { name = "numbers"; - version = "v8.0.0"; + version = "v9.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-numbers.git"; - rev = "f5bbd96cbed58403c4445bd4c73df50fc8d86f46"; - sha256 = "00pm2x4kh4fm91r7nmik1v5jclkgh7gpxz13ambyqxbxbiqjq0vg"; + rev = "2a53528f18f9415334bae28e7bb3cf3be86342c2"; + sha256 = "1h4v6ir1hq6gvkk0kla38vlcd6bv73xkc8pv71jygwqxrdwfxxgw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1027,11 +991,11 @@ let "options" = pkgs.stdenv.mkDerivation { name = "options"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-options.git"; - rev = "0309a42692251ce5e3d1d0be57d4f63f7143f858"; - sha256 = "04f70wfik1pi6nzfq2cn3la9z735akkadpx5cxbs4mx8xg032sjd"; + rev = "93e4eb4610975cb7b3bb290273396707e7384c38"; + sha256 = "1c8qkln40i1sf2lz8c6wn4ijj7jmfgzmgsrn9ax7m4ix9c05r5sq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1039,11 +1003,11 @@ let "optparse" = pkgs.stdenv.mkDerivation { name = "optparse"; - version = "v4.1.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/f-o-a-m/purescript-optparse.git"; - rev = "04f2ed818f32390a9feff04b892f23c96ccb84cb"; - sha256 = "0b05wczcjnann0xw6vdaq2c1a2n9rcgvq9l29wa5461b5mvjyb80"; + rev = "dbc4c385e6c436eed4299ae2c0bb2cc278cf2410"; + sha256 = "05sd1ziz6rx1k0wz1nnhfnl1gz3s6qld3whkkjz8lilrvycxxn47"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1051,11 +1015,11 @@ let "ordered-collections" = pkgs.stdenv.mkDerivation { name = "ordered-collections"; - version = "v2.0.2"; + version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-ordered-collections.git"; - rev = "1929b706b07e251995b6be51baa7995c61eb4d83"; - sha256 = "0g57043ylj3kldkm5vn233yd6hiamryhdfh72cxx9h3mn0ra8ghd"; + rev = "9826b7632d0d0a691173bde308a634195f42a419"; + sha256 = "1wk8mcn1zsxi0yk9ybas2v7m0drb492806gld1xxxic8x1i19ws0"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1063,11 +1027,11 @@ let "orders" = pkgs.stdenv.mkDerivation { name = "orders"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-orders.git"; - rev = "c25b7075426cf82bcb960495f28d2541c9a75510"; - sha256 = "0wwy3ycjll0s590ra35zf5gjvs86w97rln09bj428axhg7cvfl0a"; + rev = "f86db621ec5eef1274145f8b1fd8ebbfe0ed4a2c"; + sha256 = "14fjls3v14ia6fr2w4p0i5dqv10zk343wg28m4c77a17jmvbs9r4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1075,11 +1039,11 @@ let "parallel" = pkgs.stdenv.mkDerivation { name = "parallel"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-parallel.git"; - rev = "16b38a2e148639b04ae67e0ce63cc220da8857f7"; - sha256 = "0x8mvhgs8ygqj34xgyhk6gixqm32p2ymm00zg0zdw13g3lil9p4x"; + rev = "85290dca837771ac4870071008c933d315ef678f"; + sha256 = "0bpwvzq4dn7vx5mfj12w1zvvnamc6w2c45c2v54b9yw36snnwpcf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1087,11 +1051,11 @@ let "parsing" = pkgs.stdenv.mkDerivation { name = "parsing"; - version = "v7.0.1"; + version = "v10.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-parsing.git"; - rev = "a3e82c26ce2c74b5fa38ff7814d7c35bf9233af5"; - sha256 = "15yx51khg3niqiryc6qdii6lwdvni77ak7dkbf9w5zw4h1y51p9a"; + rev = "6dc1e9cab195f4af3394b48c508b4794328edeac"; + sha256 = "1i2idq5l7vanxrd8k6yg4fjp6l3cigrq266qyjs07ri5cc4k8879"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1099,11 +1063,11 @@ let "partial" = pkgs.stdenv.mkDerivation { name = "partial"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-partial.git"; - rev = "2f0a5239efab68179a684603263bcec8f1489b08"; - sha256 = "0acxf686hvaj793hyb7kfn9lf96kv3nk0lls2p9j095ylp55sldb"; + rev = "0fa0646f5ea1ec5f0c46dcbd770c705a6c9ad3ec"; + sha256 = "04s1h0r3slyd8kcamhqqrr6piksl9y76nmf2418j0ifhp16qwxmm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1111,11 +1075,11 @@ let "pipes" = pkgs.stdenv.mkDerivation { name = "pipes"; - version = "v7.0.1"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/felixschl/purescript-pipes.git"; - rev = "42e43f0961ad0fc3f1cef6986fe23ca9f48f6dda"; - sha256 = "0jzgzi34wqqdcfgznbpfv4b8al2prd36yshnndlvkqfv70smx3kh"; + rev = "e3bdc0b0db0a67e89a717b6118b23e78a380e23f"; + sha256 = "1jz3bfbl8b0hgbcm9y98bv2z29b072v1k8snp19vb2xql1zd40sx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1123,11 +1087,11 @@ let "posix-types" = pkgs.stdenv.mkDerivation { name = "posix-types"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-posix-types.git"; - rev = "e562680fce64b67e26741a61a51160a04fd3e7fb"; - sha256 = "1knhdnnmxx77qsjz3gk1ga7n713l303dxyn8zs46qh7p2hnkalkc"; + rev = "b79ff37f87846ca5caab2123cf84148e700d40d1"; + sha256 = "1zcm2hikfigh5fbwg12c61gvvjhmwgy6fplfcm6bc5aqb7w3czll"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1135,11 +1099,11 @@ let "prelude" = pkgs.stdenv.mkDerivation { name = "prelude"; - version = "v5.0.1"; + version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-prelude.git"; - rev = "68f8012bc2309d9bf5832cdf7316ad052d586905"; - sha256 = "1x0cacvv9mmw80vy6f40y0p959q1dz28fwjswhyd7ws6npbklcy0"; + rev = "f4cad0ae8106185c9ab407f43cf9abf05c256af4"; + sha256 = "0j6mb9w728ifcp10jdv7l9k7k5pw8j1f0fa7xyb8xmbxzc59xqpy"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1147,11 +1111,11 @@ let "profunctor" = pkgs.stdenv.mkDerivation { name = "profunctor"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-profunctor.git"; - rev = "4551b8e437a00268cc9b687cbe691d75e812e82b"; - sha256 = "0fvd2xiv77sp4jd4spgdp4i9812p6pdzzbg4pa96mbr0h19jf39c"; + rev = "0a966a14e7b0c827d44657dc1710cdc712d2e034"; + sha256 = "07rhk8micbc74my6s53xbj2smvvwah2w1drqrcmcnncxdks3lqg3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1159,11 +1123,11 @@ let "profunctor-lenses" = pkgs.stdenv.mkDerivation { name = "profunctor-lenses"; - version = "v7.0.1"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-profunctor-lenses.git"; - rev = "9c3d87a6dab8eb785a93bff11aa183796dc93183"; - sha256 = "1wknj7g6vwk2ga1rq57l470h322308ddjn5bd3x2hhfkiy039kc3"; + rev = "973d567afe458fd802cf4f0d9725b6dc35ad9297"; + sha256 = "0axz7nznn12iqh6sn9qjg6i8qglpdsqgkp30ndwdj98czcnbnybv"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1183,23 +1147,11 @@ let "psci-support" = pkgs.stdenv.mkDerivation { name = "psci-support"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-psci-support.git"; - rev = "f26fe8266a63494080476333e22f971404ea8846"; - sha256 = "16vhf8hapd7rcgmafmjpiq7smhzdh3300f2idk1q4kk01yxn8ddj"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "purescript-toppokki" = pkgs.stdenv.mkDerivation { - name = "purescript-toppokki"; - version = "6983e07bf0aa55ab779bcef12df3df339a2b5bd9"; - src = pkgs.fetchgit { - url = "https://github.com/firefrorefiddle/purescript-toppokki"; - rev = "6983e07bf0aa55ab779bcef12df3df339a2b5bd9"; - sha256 = "01arx2sp2k287cr4y96frnn6jlghcias9hwdr27yr28k4xa5bhfv"; + rev = "897cdb543548cb6078d69b6413b54841404eda72"; + sha256 = "1ix53r8avkn3fw72mngwzw7v6c6mv7j4miw5mrgjrh9hb8p2ydl1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1207,11 +1159,11 @@ let "quickcheck" = pkgs.stdenv.mkDerivation { name = "quickcheck"; - version = "v7.1.0"; + version = "v8.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-quickcheck.git"; - rev = "990fa1cf14b48b827d9b2d115b1c6977c4b0a76d"; - sha256 = "1dxchng3r2mad0505a0c7cc35vs1f7y2xb5i13p59jpdz6ijqa9k"; + rev = "bf5029f97e6c0d7552d3a08d2ab793a19e2c5e3d"; + sha256 = "142dvh57fl8b6i7mm37a38v7vkc1znbqz6l6wqa704m53hkikvyd"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1231,11 +1183,11 @@ let "quickcheck-laws" = pkgs.stdenv.mkDerivation { name = "quickcheck-laws"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-quickcheck-laws.git"; - rev = "464597522e5e001adc2619676584871f423b9ea0"; - sha256 = "1m397bh2w5a0wvms8rjgfxh71m7krmfkgk11j5krhz86b72k3izd"; + rev = "04f00fb78d88f38a2f2bb73b75f97ce5bf5624fc"; + sha256 = "0izp71wq253k9wih2hspfs4p1s36yins2a5mh13yl57pf1srbrky"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1243,11 +1195,11 @@ let "random" = pkgs.stdenv.mkDerivation { name = "random"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-random.git"; - rev = "3e02da113c7afbac37ea4e16188c39d3057314d5"; - sha256 = "1v6ykgp8jmx488hq8mgb0l0sf1nyhjs6wq0w279iyibk9jxc6nib"; + rev = "9540bc965a9596da02fefd9949418bb19c92533a"; + sha256 = "0qz14qviz5053j9h1jwpk0gnn692hcdx6fp90wckzrnw31d53174"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1255,11 +1207,11 @@ let "rationals" = pkgs.stdenv.mkDerivation { name = "rationals"; - version = "v5.0.0"; + version = "v5.0.1"; src = pkgs.fetchgit { - url = "https://github.com/anttih/purescript-rationals.git"; - rev = "8c52d8cc891d1223150a31416220aa9b99404442"; - sha256 = "1idvjvvx5kwmi8kj2ps95bcvlsgij1xgin4jfw3rmcqd930wqq6q"; + url = "https://github.com/purescript-contrib/purescript-rationals.git"; + rev = "b480bc41dbfc926977ebdf4e2a4b9fed253c91a1"; + sha256 = "06fczcfc937iwpj4r8qhprgw35ryn0hfqgjxmn2rcljx37q70xka"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1267,11 +1219,11 @@ let "record" = pkgs.stdenv.mkDerivation { name = "record"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-record.git"; - rev = "091495d61fcaa9d8d8232e7b800f403a3165a38f"; - sha256 = "0yidfvwiajiv8xflfsi2p8dqnp0qmmcz9jry58jyn9ga82z2pqn6"; + rev = "c89cd1ada6b636692571fc374196b1c39c4c9f70"; + sha256 = "1g7s2h1as5cz824wpm0jhjprrh66shha5i4gq37q73yw0s5p2ahm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1279,11 +1231,11 @@ let "refs" = pkgs.stdenv.mkDerivation { name = "refs"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-refs.git"; - rev = "f66d3cdf6a6bf4510e5181b3fac215054d8f1e2e"; - sha256 = "1jhc2v784jy8bvkqy4zsh2z7pnqrhwa8n5kx98xhxx73n1bf38sg"; + rev = "f8e6216da4cb9309fde1f20cd6f69ac3a3b7f9e8"; + sha256 = "09bvfxhjfwfwv55py45s71maazwrr68k0rk4v8ynfqv91h34319h"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1291,35 +1243,11 @@ let "safe-coerce" = pkgs.stdenv.mkDerivation { name = "safe-coerce"; - version = "v1.0.0"; + version = "v2.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-safe-coerce.git"; - rev = "e719defd227d932da067a1f0d62a60b3d3ff3637"; - sha256 = "0m942lc23317izspz1sxw957mwl9yb9bgk8dh23f7b3a8w9hh8ff"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "safely" = pkgs.stdenv.mkDerivation { - name = "safely"; - version = "v4.0.1"; - src = pkgs.fetchgit { - url = "https://github.com/paf31/purescript-safely.git"; - rev = "19f854737e17b4d058e5a1504a960821db36e4ab"; - sha256 = "1mrpz19smjsamz4cci287z89q715chzxna0gpbvdgivlca4z6879"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "sequences" = pkgs.stdenv.mkDerivation { - name = "sequences"; - version = "v3.0.2"; - src = pkgs.fetchgit { - url = "https://github.com/hdgarrood/purescript-sequences"; - rev = "1f1d828ef30070569c812d0af23eb7253bb1e990"; - sha256 = "0mc0jjs1119c2nyd08yhdmliq3s47lhrdknhziga3lnbzja889k4"; + rev = "7fa799ae80a38b8d948efcb52608e58e198b3da7"; + sha256 = "00m4l733gpl0153cbl6n5kly7jr8ids399apza2rbczif40brp9g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1327,11 +1255,11 @@ let "spec" = pkgs.stdenv.mkDerivation { name = "spec"; - version = "v5.0.1"; + version = "v7.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-spec/purescript-spec.git"; - rev = "2cfa11573dbb695c117efce0a8f76a3daba12e87"; - sha256 = "0hpca1sa738029ww74zpw31br5x339q35kzb10iqd55lp6611k80"; + rev = "1ae536c4d9848d26087fe5e0606409740aa421b7"; + sha256 = "1vyk0fn39qfwx4i7vanazr5v0q0w0sxsxzmlliwlpcb9kvd1b2b3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1339,11 +1267,11 @@ let "spec-quickcheck" = pkgs.stdenv.mkDerivation { name = "spec-quickcheck"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-spec/purescript-spec-quickcheck.git"; - rev = "c2991f475b8fa11de8b68bcb5895b36be04d1e82"; - sha256 = "01xcbfyqzax9c5najbfy12q0nvfklfm37llj2vkmi3wgkskg4prz"; + rev = "c83de337db1f74ff75e0d7c574a2f7407bc5f2b2"; + sha256 = "1y9rzb8kbahhchplswdxrjqm4qjkv1bnv9mzg8v62m1ipk3kdndj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1351,11 +1279,11 @@ let "st" = pkgs.stdenv.mkDerivation { name = "st"; - version = "v5.0.1"; + version = "v6.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-st.git"; - rev = "994eb5e650f3caedac385dcc61694f691df57983"; - sha256 = "14hz254f1y0k3v83z719np0ddrgbca0hdsd9dvv244i07vlvm2zj"; + rev = "fc2fe2972bb12e6a2bd3b295baf01577240c23ac"; + sha256 = "17syc11gxhi1law4lskrr4swr62n4r7irj5imdyjjp8z0p5c6p8z"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1363,11 +1291,11 @@ let "strings" = pkgs.stdenv.mkDerivation { name = "strings"; - version = "v5.0.0"; + version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-strings.git"; - rev = "157e372a23e4becd594d7e7bff6f372a6f63dd82"; - sha256 = "0hyaa4d8gyyvac2nxnwqkn2rvi5vax4bi4yv10mpk7rgb8rv7mb8"; + rev = "3d3e2f7197d4f7aacb15e854ee9a645489555fff"; + sha256 = "1dx6l4j4yw6w6nxa687gf04q4caa99ccl4cp4q22nda6ghsz7yjl"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1375,11 +1303,11 @@ let "stringutils" = pkgs.stdenv.mkDerivation { name = "stringutils"; - version = "v0.0.11"; + version = "v0.0.12"; src = pkgs.fetchgit { url = "https://github.com/menelaos/purescript-stringutils.git"; - rev = "e149d04cd5bcc25222c1807f2e1edafb36b5f70e"; - sha256 = "1hbr936bvnm5iil4cfr9qhkbzd1i00yrxf5jd0rnny29df5wsq1w"; + rev = "51d92cacd8c8102fc4e6137b4f709a2b11ca5186"; + sha256 = "0wdmishvnlfw8r6b3ivzr8d7300cxg1m77qd74ip4c0gd4zqvhs4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1387,35 +1315,35 @@ let "tailrec" = pkgs.stdenv.mkDerivation { name = "tailrec"; - version = "v5.0.1"; + version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-tailrec.git"; - rev = "5fbf0ac05dc6ab1a228b2897630195eb7483b962"; - sha256 = "1jjl2q2hyhjcdxpamzr1cdlxhmq2bl170x5p3jajb9zgwkqx0x22"; + rev = "5661a10afbd4849bd2e45139ea567beb40b20f9f"; + sha256 = "0snhrvkpd429r0d0bzs0mxwwz3am9bpa1m9f5a9hpmyjjkl7gddw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "test-unit" = pkgs.stdenv.mkDerivation { - name = "test-unit"; - version = "v16.0.0"; + "these" = pkgs.stdenv.mkDerivation { + name = "these"; + version = "v6.0.0"; src = pkgs.fetchgit { - url = "https://github.com/bodil/purescript-test-unit.git"; - rev = "56d06897b621df5d2f619433d19ababb5bb8ebd1"; - sha256 = "0qz903phxkgrn7qdz1xi49bydkf5cbxssyb4xk029zi4lshb35mw"; + url = "https://github.com/purescript-contrib/purescript-these.git"; + rev = "ad4de7d2bb9ce684a9dff5def6489630736985b8"; + sha256 = "1i73qz7pk11mbiymhfg21i3nq92hqjmqzj4gjp1n6l2zkm0lmql3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "these" = pkgs.stdenv.mkDerivation { - name = "these"; - version = "v5.0.0"; + "toppokki" = pkgs.stdenv.mkDerivation { + name = "toppokki"; + version = "5992e93396a734c980ef61c74df5b6ab46108920"; src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-these.git"; - rev = "38dcf86a9bd772091e1153f2f1c13223703599b7"; - sha256 = "0d6yg3lwgralh1kcm5cd4myyz66k9qzld61hc5dg3z92d96zbvlr"; + url = "https://github.com/mlabs-haskell/purescript-toppokki"; + rev = "5992e93396a734c980ef61c74df5b6ab46108920"; + sha256 = "12sbs5x20rmr6xrh9y69aw7bmiwnmj8a0s5s9s1mh66fyh7gfh3s"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1423,11 +1351,11 @@ let "transformers" = pkgs.stdenv.mkDerivation { name = "transformers"; - version = "v5.2.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-transformers.git"; - rev = "1e5d4193b38c613c97ea1ebdb721c6b94cd8c50a"; - sha256 = "0lggimnq016v98ib6h68gnciraambxrfqm2s033wm34srcy8xs06"; + rev = "be72ab52357d9a665cbf93d73ba1c07c4b0957ee"; + sha256 = "0ijrdsppl8vx0rlbwc9p0vjbmvwlcy4ia7xymvk6y34zbxzjlzm6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1435,11 +1363,11 @@ let "tuples" = pkgs.stdenv.mkDerivation { name = "tuples"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-tuples.git"; - rev = "d4fe8ffe9e8c512111ee0bc18a6ba0fd056a6773"; - sha256 = "0s2ar2gih4r34km8r8dqngh21s8899yb93mb7mips08ndy3ajq3a"; + rev = "4f52da2729b448c8564369378f1232d8d2dc1d8b"; + sha256 = "1m1ng0xxicb73945jymcl1hn2y2hmynlnmhb2k0kkn1jrjwgcc3d"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1447,11 +1375,11 @@ let "type-equality" = pkgs.stdenv.mkDerivation { name = "type-equality"; - version = "v4.0.0"; + version = "v4.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-type-equality.git"; - rev = "f7644468f22ed267a15d398173d234fa6f45e2e0"; - sha256 = "126pg4zg3bsrn8dzvv75xp586nznxyswzgjlr7cag3ij3j1z0kl0"; + rev = "0525b7d39e0fbd81b4209518139fb8ab02695774"; + sha256 = "1ass38jdycsjisdimdc4drg2w8vkkwp6lkvz3kvy7q0h98vdmlbr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1471,11 +1399,11 @@ let "typelevel-prelude" = pkgs.stdenv.mkDerivation { name = "typelevel-prelude"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-typelevel-prelude.git"; - rev = "83ddcdb23d06c8d5ea6196596a70438f42cd4afd"; - sha256 = "1vwf3yhn8mir5y41wvlyszkgd5fxvrcyfd0l8cn20c8vfq36yzgk"; + rev = "dca2fe3c8cfd5527d4fe70c4bedfda30148405bf"; + sha256 = "0x86mrg33kpnrnsfp4p3c92j5lpyqzy87bxdynwf7smk3inqr2jc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1483,23 +1411,11 @@ let "uint" = pkgs.stdenv.mkDerivation { name = "uint"; - version = "v6.0.3"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-uint.git"; - rev = "17fda2aff989ad7fa9f29171bf4c1196ca9ed504"; - sha256 = "1lwbkwc3yj0d5qmw7gni924wj47npgy1aqbc0ika4phc4q0shw8d"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "undefined" = pkgs.stdenv.mkDerivation { - name = "undefined"; - version = "v1.0.2"; - src = pkgs.fetchgit { - url = "https://github.com/bklaric/purescript-undefined.git"; - rev = "4012dc06b58feae301140bc081135d0f24c432b0"; - sha256 = "0kj504j3r9wr7m3yhm53bcfdzai0c2g99d2pdxlfinxk4pmixyrd"; + rev = "9e4f76ffd5192472f75583844172fe8ab3c0cb9f"; + sha256 = "173bhrd006q53s7agwyasxhfbr89x9jpz5b47vm2fr74l3jcw3lq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1507,11 +1423,11 @@ let "unfoldable" = pkgs.stdenv.mkDerivation { name = "unfoldable"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-unfoldable.git"; - rev = "bbcc2b062b9b7d3d61f123cfb32cc8c7fb811aa6"; - sha256 = "1v3bz04wj6hj7s6mcf49hajylg6w58n78q54sqi2ra2zq8h99kpw"; + rev = "493dfe04ed590e20d8f69079df2f58486882748d"; + sha256 = "15z2k639ph8wdkrc2y838m5am1z7szw2vqymmv021skzisyn7zwf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1519,23 +1435,11 @@ let "unicode" = pkgs.stdenv.mkDerivation { name = "unicode"; - version = "v5.0.1"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-unicode.git"; - rev = "2b66dcdb2ea533c7bc864574e860012c57ace2aa"; - sha256 = "0xh9wwyrl9nsw3h3wzalc1gaph39drj0i6k648cf9bnbb96nxa4z"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "unordered-collections" = pkgs.stdenv.mkDerivation { - name = "unordered-collections"; - version = "v2.1.4"; - src = pkgs.fetchgit { - url = "https://github.com/fehrenbach/purescript-unordered-collections.git"; - rev = "1be289188cef093520098e318ec910cf3ea5b40d"; - sha256 = "0vgfpdymxvgqf3sh8ji2w2b01w3s294v5mh04046s21qaywdi1jh"; + rev = "6454d59d9e1fd1bc5a72e80e985d8282022a567a"; + sha256 = "0w2gsmqcy7pj5vd22qzpig20bdgzmbagyqxrg9mm1njjfsmcm8cv"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1543,11 +1447,11 @@ let "unsafe-coerce" = pkgs.stdenv.mkDerivation { name = "unsafe-coerce"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-unsafe-coerce.git"; - rev = "ee24f0d3b94bf925d9c50fcc2b449579580178c0"; - sha256 = "0l2agnm1k910v4yp1hz19wrsrywsr5scb397762y7pigm3frzs8r"; + rev = "ab956f82e66e633f647fb3098e8ddd3ec58d689f"; + sha256 = "0r6d3dx8jalfzvrvkagz9v05yxwkkhgbzlpswg4w1cyl03zjcla4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1555,11 +1459,11 @@ let "untagged-union" = pkgs.stdenv.mkDerivation { name = "untagged-union"; - version = "v0.3.0"; + version = "v1.0.0"; src = pkgs.fetchgit { - url = "https://github.com/jvliwanag/purescript-untagged-union.git"; - rev = "364e172e759ebe722bd7ec12a599d532b527c0ef"; - sha256 = "06013431acz8xry9dish8p2qyj18bi505fgfikpjiblxgjazl9zx"; + url = "https://github.com/rowtype-yoga/purescript-untagged-union.git"; + rev = "ed8262a966e15e751322c327e2759a9b9c0ef3f3"; + sha256 = "163blv01abd3dhcpqz499851lhwnmb4dlfbzkr3cs53d30w3yldx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1567,11 +1471,11 @@ let "variant" = pkgs.stdenv.mkDerivation { name = "variant"; - version = "v7.0.3"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-variant.git"; - rev = "3f12411ede5edd342d25340c1babce9ae81d6793"; - sha256 = "1q2pky3gf177ihy2zjzqvp1cj18ycaki9vm4ghw18p7hf256lqmc"; + rev = "8b2bd73a4202257d80a955c4dd36f6055f149823"; + sha256 = "18nyxnaqqg1zzydwd2hh9hbzr31j509g5yb1lnd0m60bma4l9h5g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1579,11 +1483,11 @@ let "web-dom" = pkgs.stdenv.mkDerivation { name = "web-dom"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-dom.git"; - rev = "03dfc2f512e124615ab183ade357e3d54007c79d"; - sha256 = "06g9cp9fkzyfwbz5cs0wxjxgdydm9hy7756p2w4vx94myki20hgx"; + rev = "568a1ee158b29e6e739e7a9aaed3e35ca4c4305a"; + sha256 = "0angs86ld0h3ld889ag55lh62101dfn3fknyqrfv0imgn40vwm44"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1591,11 +1495,11 @@ let "web-events" = pkgs.stdenv.mkDerivation { name = "web-events"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-events.git"; - rev = "c8a50893f04f54e2a59be7f885d25caef3589c57"; - sha256 = "1dxwrl2r39vazb3g1ka4dkpy6idyi17aq4hf9vvdsmcwf2jjwbn9"; + rev = "2124356117be7b764a2f3948032255ac4dab7051"; + sha256 = "0l47gsgj71x0gjbhjqwsar2y44ljhq3xa0nkgr1qvqxmcm00llqf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1603,11 +1507,11 @@ let "web-file" = pkgs.stdenv.mkDerivation { name = "web-file"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-file.git"; - rev = "3e42263b4392d82c0e379b7a481bbee9b38b1308"; - sha256 = "11x1inhr5pvs2iyg818cywwdskb33q777592sd3b4g4jyczcb1li"; + rev = "023786ae62bbb8bf58156dd7f02011fa38221ef1"; + sha256 = "1wjf1m5y2qsba83is297icv9zyl7jilxdga0192mm1rp0j16jjln"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1615,11 +1519,11 @@ let "web-html" = pkgs.stdenv.mkDerivation { name = "web-html"; - version = "v3.2.0"; + version = "v4.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-html.git"; - rev = "3a249b966ee72c19874b4a2ec6db4059087500e4"; - sha256 = "1ds26vwyba0chhpa09m938brw9q8pxjk6z1n3d4nc30hvdkrjnbh"; + rev = "40e9a0c5c927e4d9f7ba7c1204e4792f4d24cc27"; + sha256 = "0ifvk7swjn58nbk19pi4f19r247d67zhl5xgvcwb56vlmrk2pk83"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1627,11 +1531,11 @@ let "web-storage" = pkgs.stdenv.mkDerivation { name = "web-storage"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-storage.git"; - rev = "22fa56bac204c708e521e746ad4ca2b5810f62c5"; - sha256 = "1viy027k9qyr7mckqkvizwbwkfskc6frppsa1v9a0hq6gc08mpjx"; + rev = "6b74461e136755db70c271dc898d51776363d7e2"; + sha256 = "0q1grh8cp6h1szsqg3xmwlzrc1bbz8yzlwxlcl1iym5mjiyzgkcs"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1639,11 +1543,11 @@ let "web-xhr" = pkgs.stdenv.mkDerivation { name = "web-xhr"; - version = "v4.1.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-xhr.git"; - rev = "997b87caa6dcdf66b6db22f29f522d722559956b"; - sha256 = "0hzmqga8l24l20kyd98bcpd8bmz7by14vl311m9yfdg5mjkjg42g"; + rev = "476122fe3ad19031aeb69186209b480e2fc9ef25"; + sha256 = "1swpprc000gfqid6r05pxs8wvlc5xjry5s2kk8lk3ah2dgv297sf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; diff --git a/spago.dhall b/spago.dhall index 605931265..7c92449b8 100644 --- a/spago.dhall +++ b/spago.dhall @@ -9,15 +9,17 @@ You can edit this file as you like. , "aff-promise" , "aff-retry" , "affjax" + , "ansi" , "argonaut" , "argonaut-codecs" , "arraybuffer-types" , "arrays" , "avar" , "bifunctors" - , "bigints" , "bignumber" , "checked-exceptions" + , "cip30" + , "cip30-typesafe" , "console" , "control" , "crypto" @@ -38,12 +40,11 @@ You can edit this file as you like. , "http-methods" , "identity" , "integers" + , "js-bigints" , "js-date" , "lattice" , "lists" - , "math" , "maybe" - , "medea" , "media-types" , "monad-logger" , "mote" @@ -69,7 +70,6 @@ You can edit this file as you like. , "prelude" , "profunctor" , "profunctor-lenses" - , "purescript-toppokki" , "quickcheck" , "quickcheck-combinators" , "quickcheck-laws" @@ -84,12 +84,12 @@ You can edit this file as you like. , "stringutils" , "tailrec" , "these" + , "toppokki" , "transformers" , "tuples" , "typelevel" , "typelevel-prelude" , "uint" - , "undefined" , "unfoldable" , "untagged-union" , "variant" diff --git a/src/Contract/Address.purs b/src/Contract/Address.purs index 6477e4c4d..0fbab38e0 100644 --- a/src/Contract/Address.purs +++ b/src/Contract/Address.purs @@ -1,4 +1,4 @@ --- | A module for Address-related functionality and querying own wallet. +-- | A module for Address-related functionality. module Contract.Address ( addressPaymentValidatorHash , addressStakeValidatorHash @@ -7,22 +7,8 @@ module Contract.Address , addressWithNetworkTagToBech32 , addressFromBech32 , addressToBech32 - , getWalletAddress - , getWalletAddresses - , getWalletAddressWithNetworkTag - , getWalletAddressesWithNetworkTag - , getWalletCollateral - , module ByteArray - , module ExportAddress - , module ExportPubKeyHash - , module ExportUnbalancedTransaction - , module Hash - , module SerializationAddress + , module X , module TypeAliases - , ownPaymentPubKeyHash - , ownPaymentPubKeysHashes - , ownStakePubKeyHash - , ownStakePubKeysHashes , payPubKeyHashBaseAddress , payPubKeyHashEnterpriseAddress , payPubKeyHashRewardAddress @@ -30,34 +16,23 @@ module Contract.Address , pubKeyHashEnterpriseAddress , pubKeyHashRewardAddress , stakePubKeyHashRewardAddress - , typedValidatorBaseAddress - , typedValidatorEnterpriseAddress , validatorHashBaseAddress , validatorHashEnterpriseAddress ) where import Prelude -import Contract.Monad (Contract, liftContractM, liftedM) -import Contract.Prelude (liftM) +import Contract.Monad (Contract, liftContractM) import Control.Monad.Error.Class (throwError) import Control.Monad.Reader.Class (asks) import Ctl.Internal.Address ( addressPaymentValidatorHash , addressStakeValidatorHash ) as Address -import Ctl.Internal.Contract.Wallet - ( getWalletAddresses - , getWalletCollateral - , ownPaymentPubKeyHashes - , ownStakePubKeysHashes - ) as Contract import Ctl.Internal.Plutus.Conversion ( fromPlutusAddress , fromPlutusAddressWithNetworkTag , toPlutusAddress - , toPlutusAddressWithNetworkTag - , toPlutusTxUnspentOutput ) import Ctl.Internal.Plutus.Types.Address ( Address @@ -71,14 +46,9 @@ import Ctl.Internal.Plutus.Types.Address , toPubKeyHash , toStakingCredential , toValidatorHash - ) as ExportAddress -import Ctl.Internal.Plutus.Types.TransactionUnspentOutput - ( TransactionUnspentOutput - ) + ) as X import Ctl.Internal.Scripts - ( typedValidatorBaseAddress - , typedValidatorEnterpriseAddress - , validatorHashBaseAddress + ( validatorHashBaseAddress , validatorHashEnterpriseAddress ) as Scripts import Ctl.Internal.Serialization.Address @@ -89,17 +59,17 @@ import Ctl.Internal.Serialization.Address , Pointer , Slot(Slot) , TransactionIndex(TransactionIndex) - ) as SerializationAddress + ) as X import Ctl.Internal.Serialization.Address ( NetworkId(MainnetId) , addressBech32 , addressNetworkId ) import Ctl.Internal.Serialization.Address (addressFromBech32) as SA -import Ctl.Internal.Serialization.Hash (Ed25519KeyHash) as Hash +import Ctl.Internal.Serialization.Hash (Ed25519KeyHash) as X import Ctl.Internal.Types.Aliases (Bech32String) import Ctl.Internal.Types.Aliases (Bech32String) as TypeAliases -import Ctl.Internal.Types.ByteArray (ByteArray) as ByteArray +import Ctl.Internal.Types.PaymentPubKey (PaymentPubKey(PaymentPubKey)) as X import Ctl.Internal.Types.PubKeyHash ( PaymentPubKeyHash , PubKeyHash @@ -109,7 +79,7 @@ import Ctl.Internal.Types.PubKeyHash ( PaymentPubKeyHash(PaymentPubKeyHash) , PubKeyHash(PubKeyHash) , StakePubKeyHash(StakePubKeyHash) - ) as ExportPubKeyHash + ) as X import Ctl.Internal.Types.PubKeyHash ( payPubKeyHashBaseAddress , payPubKeyHashEnterpriseAddress @@ -120,94 +90,8 @@ import Ctl.Internal.Types.PubKeyHash , stakePubKeyHashRewardAddress ) as PubKeyHash import Ctl.Internal.Types.Scripts (StakeValidatorHash, ValidatorHash) -import Ctl.Internal.Types.TypedValidator (TypedValidator) -import Ctl.Internal.Types.UnbalancedTransaction (PaymentPubKey(PaymentPubKey)) as ExportUnbalancedTransaction -import Data.Array (head) import Data.Maybe (Maybe) -import Data.Traversable (for, traverse) import Effect.Exception (error) -import Prim.TypeError (class Warn, Text) - --- | Get an `Address` of the browser wallet. -getWalletAddress - :: Warn - ( Text - "This function returns only one `Adress` even in case multiple `Adress`es are available. Use `getWalletAdresses` instead" - ) - => Contract (Maybe Address) -getWalletAddress = head <$> getWalletAddresses - --- | Get all the `Address`es of the browser wallet. -getWalletAddresses :: Contract (Array Address) -getWalletAddresses = do - addresses <- Contract.getWalletAddresses - traverse - ( liftM - (error "getWalletAddresses: failed to deserialize `Address`") - <<< toPlutusAddress - ) - addresses - --- | Get an `AddressWithNetworkTag` of the browser wallet. -getWalletAddressWithNetworkTag - :: Warn - ( Text - "This function returns only one `AddressWithNetworkTag` even in case multiple `AddressWithNetworkTag` are available. Use `getWalletAddressesWithNetworkTag` instead" - ) - => Contract (Maybe AddressWithNetworkTag) -getWalletAddressWithNetworkTag = head <$> getWalletAddressesWithNetworkTag - --- | Get all the `AddressWithNetworkTag`s of the browser wallet discarding errors. -getWalletAddressesWithNetworkTag :: Contract (Array AddressWithNetworkTag) -getWalletAddressesWithNetworkTag = do - addresses <- Contract.getWalletAddresses - traverse - ( liftM - ( error - "getWalletAddressesWithNetworkTag: failed to deserialize `Address`" - ) - <<< toPlutusAddressWithNetworkTag - ) - addresses - --- | Get the collateral of the browser wallet. This collateral will vary --- | depending on the wallet. --- | E.g. Nami creates a hard-coded 5 Ada collateral. --- | Throws on `Promise` rejection by wallet, returns `Nothing` if no collateral --- | is available. -getWalletCollateral - :: Contract (Maybe (Array TransactionUnspentOutput)) -getWalletCollateral = do - mtxUnspentOutput <- Contract.getWalletCollateral - for mtxUnspentOutput $ traverse $ - liftedM - "getWalletCollateral: failed to deserialize TransactionUnspentOutput" - <<< pure - <<< toPlutusTxUnspentOutput - --- | Gets a wallet `PaymentPubKeyHash` via `getWalletAddresses`. -ownPaymentPubKeyHash - :: Warn - ( Text - "This function returns only one `PaymentPubKeyHash` even in case multiple `PaymentPubKeysHash`es are available. Use `ownPaymentPubKeysHashes` instead" - ) - => Contract (Maybe PaymentPubKeyHash) -ownPaymentPubKeyHash = head <$> ownPaymentPubKeysHashes - --- | Gets all wallet `PaymentPubKeyHash`es via `getWalletAddresses`. -ownPaymentPubKeysHashes :: Contract (Array PaymentPubKeyHash) -ownPaymentPubKeysHashes = Contract.ownPaymentPubKeyHashes - -ownStakePubKeyHash - :: Warn - ( Text - "This function returns only one `StakePubKeyHash` even in case multiple `StakePubKeysHash`es are available. Use `ownStakePubKeysHashes` instead" - ) - => Contract (Maybe StakePubKeyHash) -ownStakePubKeyHash = join <<< head <$> ownStakePubKeysHashes - -ownStakePubKeysHashes :: Contract (Array (Maybe StakePubKeyHash)) -ownStakePubKeysHashes = Contract.ownStakePubKeysHashes getNetworkId :: Contract NetworkId getNetworkId = asks _.networkId @@ -270,29 +154,6 @@ addressStakeValidatorHash = Address.addressStakeValidatorHash <<< fromPlutusAddress MainnetId --- | Converts a Plutus `TypedValidator` to a Plutus (`BaseAddress`) `Address` -typedValidatorBaseAddress - :: forall (a :: Type) - . NetworkId - -> TypedValidator a - -> Maybe Address -typedValidatorBaseAddress networkId = - toPlutusAddress - <<< Scripts.typedValidatorBaseAddress networkId - --- | Converts a Plutus `TypedValidator` to a Plutus (`EnterpriseAddress`) `Address`. --- | This is likely what you will use since Plutus currently uses --- | `scriptHashAddress` on non-staking addresses which is invoked in --- | `validatorAddress` -typedValidatorEnterpriseAddress - :: forall (a :: Type) - . NetworkId - -> TypedValidator a - -> Maybe Address -typedValidatorEnterpriseAddress networkId = - toPlutusAddress - <<< Scripts.typedValidatorEnterpriseAddress networkId - -- | Converts a Plutus `ValidatorHash` to a `Address` as a Plutus (`BaseAddress`) -- | `Address` validatorHashBaseAddress diff --git a/src/Contract/AuxiliaryData.purs b/src/Contract/AuxiliaryData.purs index 2da38355f..718ca81ad 100644 --- a/src/Contract/AuxiliaryData.purs +++ b/src/Contract/AuxiliaryData.purs @@ -1,3 +1,4 @@ +-- | A module for setting Auxiliary Data or metadata to an `UnbalancedTx`. module Contract.AuxiliaryData ( setAuxiliaryData , setGeneralTxMetadata @@ -7,12 +8,10 @@ module Contract.AuxiliaryData import Prelude import Contract.Monad (Contract) -import Contract.ScriptLookups - ( UnattachedUnbalancedTx(UnattachedUnbalancedTx) - ) import Ctl.Internal.Cardano.Types.Transaction ( AuxiliaryData(AuxiliaryData) , AuxiliaryDataHash + , Transaction ) import Ctl.Internal.Cardano.Types.Transaction ( _auxiliaryData @@ -23,36 +22,31 @@ import Ctl.Internal.Metadata.MetadataType ( class MetadataType , toGeneralTxMetadata ) +import Ctl.Internal.ProcessConstraints.UnbalancedTx (UnbalancedTx) import Ctl.Internal.Serialization.AuxiliaryData (hashAuxiliaryData) import Ctl.Internal.Types.TransactionMetadata (GeneralTransactionMetadata) -import Ctl.Internal.Types.UnbalancedTransaction (UnbalancedTx, _transaction) import Data.Lens (lens', (?~)) import Data.Lens.Getter (view) +import Data.Lens.Iso.Newtype (_Newtype) +import Data.Lens.Record (prop) import Data.Lens.Types (Lens') import Data.Maybe (Maybe, fromMaybe) import Data.Tuple (Tuple(Tuple)) import Effect.Class (liftEffect) - --- These functions involve `UnattachedUnbalancedTx`, --- which in turn involve `UnbalancedTx`. These functions involve ScriptOutput, --- which is the type currently being used in more recent Plutus code (as opposed to `TransactionOutput`). --- As a result, no conversion will be provided. --- It is worth noting that `UnattachedUnbalancedTx` also includes Cardano-style Redeemers, --- which must be reattached later on (see Types.ScriptLookups for more information). --- There does not appear to be a way around this. +import Type.Proxy (Proxy(Proxy)) setAuxiliaryData - :: UnattachedUnbalancedTx + :: UnbalancedTx -> AuxiliaryData - -> Contract UnattachedUnbalancedTx + -> Contract UnbalancedTx setAuxiliaryData tx auxData = liftEffect do auxDataHash <- hashAuxiliaryData auxData pure (tx # _auxiliaryData ?~ auxData # _auxiliaryDataHash ?~ auxDataHash) setGeneralTxMetadata - :: UnattachedUnbalancedTx + :: UnbalancedTx -> GeneralTransactionMetadata - -> Contract UnattachedUnbalancedTx + -> Contract UnbalancedTx setGeneralTxMetadata tx generalMetadata = let auxData = fromMaybe mempty (view _auxiliaryData tx) @@ -62,9 +56,9 @@ setGeneralTxMetadata tx generalMetadata = setTxMetadata :: forall (m :: Type) . MetadataType m - => UnattachedUnbalancedTx + => UnbalancedTx -> m - -> Contract UnattachedUnbalancedTx + -> Contract UnbalancedTx setTxMetadata tx = setGeneralTxMetadata tx <<< toGeneralTxMetadata @@ -72,17 +66,16 @@ setTxMetadata tx = -- Lenses -------------------------------------------------------------------------------- -_unbalancedTx :: Lens' UnattachedUnbalancedTx UnbalancedTx -_unbalancedTx = lens' \(UnattachedUnbalancedTx rec@{ unbalancedTx }) -> - Tuple unbalancedTx \ubTx -> UnattachedUnbalancedTx rec { unbalancedTx = ubTx } +_transaction :: Lens' UnbalancedTx Transaction +_transaction = _Newtype <<< prop (Proxy :: Proxy "transaction") -_auxiliaryData :: Lens' UnattachedUnbalancedTx (Maybe AuxiliaryData) +_auxiliaryData :: Lens' UnbalancedTx (Maybe AuxiliaryData) _auxiliaryData = - _unbalancedTx <<< _transaction <<< Tx._auxiliaryData + _transaction <<< Tx._auxiliaryData -_auxiliaryDataHash :: Lens' UnattachedUnbalancedTx (Maybe AuxiliaryDataHash) +_auxiliaryDataHash :: Lens' UnbalancedTx (Maybe AuxiliaryDataHash) _auxiliaryDataHash = - _unbalancedTx <<< _transaction <<< Tx._body <<< Tx._auxiliaryDataHash + _transaction <<< Tx._body <<< Tx._auxiliaryDataHash _metadata :: Lens' AuxiliaryData (Maybe GeneralTransactionMetadata) _metadata = lens' \(AuxiliaryData rec@{ metadata }) -> diff --git a/src/Contract/Backend/Ogmios.purs b/src/Contract/Backend/Ogmios.purs index 226202c33..fc74f7702 100644 --- a/src/Contract/Backend/Ogmios.purs +++ b/src/Contract/Backend/Ogmios.purs @@ -1,15 +1,19 @@ -- | Module for backend-specific functions that only work with Ogmios/Kupo backends module Contract.Backend.Ogmios ( getPoolParameters + , submitTxE ) where -import Prelude +import Contract.Prelude import Contract.Monad (Contract) import Contract.Transaction (PoolPubKeyHash) import Ctl.Internal.Cardano.Types.Transaction (PoolRegistrationParams) import Ctl.Internal.Contract.Monad (wrapQueryM) -import Ctl.Internal.QueryM.Pools as QueryM +import Ctl.Internal.QueryM (submitTxOgmios) as QueryM +import Ctl.Internal.QueryM.Ogmios (SubmitTxR, TxHash) +import Ctl.Internal.QueryM.Pools (getPoolParameters) as QueryM +import Ctl.Internal.Types.CborBytes (CborBytes) -- | **This function can only run with Ogmios backend** -- | @@ -19,3 +23,7 @@ getPoolParameters :: PoolPubKeyHash -> Contract PoolRegistrationParams getPoolParameters = wrapQueryM <<< QueryM.getPoolParameters + +-- | Error returning variant +submitTxE :: TxHash -> CborBytes -> Contract SubmitTxR +submitTxE txhash cbor = wrapQueryM $ QueryM.submitTxOgmios txhash cbor diff --git a/src/Contract/Backend/Ogmios/Mempool.purs b/src/Contract/Backend/Ogmios/Mempool.purs new file mode 100644 index 000000000..55bc13f3d --- /dev/null +++ b/src/Contract/Backend/Ogmios/Mempool.purs @@ -0,0 +1,105 @@ +-- | A module for interacting with Ogmios' Local TX Monitor +-- | These functions only work with Ogmios backend (not Blockfrost!). +-- | https://ogmios.dev/mini-protocols/local-tx-monitor/ +module Contract.Backend.Ogmios.Mempool + ( module Ogmios + , acquireMempoolSnapshot + , fetchMempoolTxs + , mempoolSnapshotHasTx + , mempoolSnapshotNextTx + , mempoolSnapshotSizeAndCapacity + , releaseMempool + , withMempoolSnapshot + ) where + +import Contract.Prelude + +import Contract.Monad (Contract) +import Control.Monad.Error.Class (liftMaybe, try) +import Ctl.Internal.Cardano.Types.Transaction (Transaction) +import Ctl.Internal.Contract.Monad (wrapQueryM) +import Ctl.Internal.Deserialization.Transaction (deserializeTransaction) +import Ctl.Internal.QueryM + ( acquireMempoolSnapshot + , mempoolSnapshotHasTx + , mempoolSnapshotNextTx + , mempoolSnapshotSizeAndCapacity + , releaseMempool + ) as QueryM +import Ctl.Internal.QueryM.Ogmios + ( MempoolSizeAndCapacity(MempoolSizeAndCapacity) + , MempoolSnapshotAcquired + , MempoolTransaction(MempoolTransaction) + , TxHash + ) as Ogmios +import Ctl.Internal.Types.ByteArray (hexToByteArray) +import Ctl.Internal.Types.Transaction (TransactionHash) +import Data.Array as Array +import Data.List (List(Cons)) +import Data.Maybe (Maybe(Just, Nothing)) +import Effect.Exception (error) + +-- | Establish a connection with the Local TX Monitor. +-- | Instantly accquires the current mempool snapshot, and will wait for the next +-- | mempool snapshot if used again before using `releaseMempool`. +acquireMempoolSnapshot :: Contract Ogmios.MempoolSnapshotAcquired +acquireMempoolSnapshot = wrapQueryM QueryM.acquireMempoolSnapshot + +-- | Check to see if a TxHash is present in the current mempool snapshot. +mempoolSnapshotHasTx + :: Ogmios.MempoolSnapshotAcquired -> TransactionHash -> Contract Boolean +mempoolSnapshotHasTx ms = wrapQueryM <<< QueryM.mempoolSnapshotHasTx ms <<< + unwrap + +-- | Get the first received TX in the current mempool snapshot. This function can +-- | be recursively called to traverse the finger-tree of the mempool data set. +-- | This will return `Nothing` once it has reached the end of the current mempool. +mempoolSnapshotNextTx + :: Ogmios.MempoolSnapshotAcquired + -> Contract (Maybe Transaction) +mempoolSnapshotNextTx mempoolAcquired = do + mbTx <- wrapQueryM $ QueryM.mempoolSnapshotNextTx mempoolAcquired + for mbTx \(Ogmios.MempoolTransaction { raw }) -> do + byteArray <- liftMaybe (error "Failed to decode transaction") + $ hexToByteArray raw + liftMaybe (error "Failed to decode tx") + $ hush + $ deserializeTransaction + $ wrap byteArray + +-- | The acquired snapshot’s size (in bytes), number of transactions, and +-- | capacity (in bytes). +mempoolSnapshotSizeAndCapacity + :: Ogmios.MempoolSnapshotAcquired -> Contract Ogmios.MempoolSizeAndCapacity +mempoolSnapshotSizeAndCapacity = wrapQueryM <<< + QueryM.mempoolSnapshotSizeAndCapacity + +-- | Release the connection to the Local TX Monitor. +releaseMempool + :: Ogmios.MempoolSnapshotAcquired -> Contract Unit +releaseMempool = wrapQueryM <<< QueryM.releaseMempool + +-- | A bracket-style function for working with mempool snapshots - ensures +-- | release in the presence of exceptions +withMempoolSnapshot + :: forall a + . (Ogmios.MempoolSnapshotAcquired -> Contract a) + -> Contract a +withMempoolSnapshot f = do + s <- acquireMempoolSnapshot + res <- try $ f s + releaseMempool s + liftEither res + +-- | Recursively request the next TX in the mempool until Ogmios does not +-- | respond with a new TX. +fetchMempoolTxs + :: Ogmios.MempoolSnapshotAcquired + -> Contract (Array Transaction) +fetchMempoolTxs ms = Array.fromFoldable <$> go + where + go = do + nextTX <- mempoolSnapshotNextTx ms + case nextTX of + Just tx -> Cons tx <$> go + Nothing -> pure mempty diff --git a/src/Contract/BalanceTxConstraints.purs b/src/Contract/BalanceTxConstraints.purs index ca6afa007..531e16c63 100644 --- a/src/Contract/BalanceTxConstraints.purs +++ b/src/Contract/BalanceTxConstraints.purs @@ -8,8 +8,10 @@ import Ctl.Internal.BalanceTx.Constraints , mustNotSpendUtxoWithOutRef , mustNotSpendUtxosWithOutRefs , mustSendChangeToAddress + , mustSendChangeWithDatum , mustUseAdditionalUtxos , mustUseCoinSelectionStrategy + , mustUseCollateralUtxos , mustUseUtxosAtAddress , mustUseUtxosAtAddresses ) as BalanceTxConstraints diff --git a/src/Contract/Config.purs b/src/Contract/Config.purs index 9ca9e43e4..9bf4a5dee 100644 --- a/src/Contract/Config.purs +++ b/src/Contract/Config.purs @@ -7,6 +7,7 @@ module Contract.Config , testnetEternlConfig , testnetLodeConfig , testnetNuFiConfig + , testnetLaceConfig , mainnetConfig , mainnetNamiConfig , mainnetGeroConfig @@ -14,8 +15,11 @@ module Contract.Config , mainnetEternlConfig , mainnetLodeConfig , mainnetNuFiConfig + , mainnetLaceConfig + , defaultSynchronizationParams + , strictSynchronizationParams + , defaultTimeParams , module Contract.Address - , module Ctl.Internal.Contract.Monad , module Data.Log.Level , module Data.Log.Message , module Ctl.Internal.Deserialization.Keys @@ -26,9 +30,21 @@ module Contract.Config ) where import Contract.Address (NetworkId(MainnetId, TestnetId)) +import Ctl.Internal.BalanceTx.Sync + ( disabledSynchronizationParams + ) as X import Ctl.Internal.Contract.Hooks (Hooks, emptyHooks) as X import Ctl.Internal.Contract.Hooks (emptyHooks) -import Ctl.Internal.Contract.Monad (ContractParams) +import Ctl.Internal.Contract.Monad + ( ContractParams + , ContractSynchronizationParams + , ContractTimeParams + ) +import Ctl.Internal.Contract.Monad + ( ContractParams + , ContractSynchronizationParams + , ContractTimeParams + ) as X import Ctl.Internal.Contract.QueryBackend ( BlockfrostBackendParams , CtlBackend @@ -40,6 +56,7 @@ import Ctl.Internal.Contract.QueryBackend , getCtlBackend , mkBlockfrostBackendParams , mkCtlBackendParams + , mkSelfHostedBlockfrostBackendParams ) as X import Ctl.Internal.Contract.QueryBackend (mkCtlBackendParams) import Ctl.Internal.Deserialization.Keys (privateKeyFromBytes) @@ -49,6 +66,7 @@ import Ctl.Internal.ServerConfig , blockfrostPublicMainnetServerConfig , blockfrostPublicPreprodServerConfig , blockfrostPublicPreviewServerConfig + , blockfrostSelfHostedServerConfig , defaultKupoServerConfig , defaultOgmiosWsConfig ) @@ -57,21 +75,29 @@ import Ctl.Internal.Wallet.Key , PrivateStakeKey(PrivateStakeKey) ) import Ctl.Internal.Wallet.Spec - ( PrivatePaymentKeySource(PrivatePaymentKeyFile, PrivatePaymentKeyValue) + ( Cip1852DerivationPath + , MnemonicSource(MnemonicString, MnemonicFile) + , PrivatePaymentKeySource(PrivatePaymentKeyFile, PrivatePaymentKeyValue) , PrivateStakeKeySource(PrivateStakeKeyFile, PrivateStakeKeyValue) + , StakeKeyPresence(WithStakeKey, WithoutStakeKey) , WalletSpec ( UseKeys + , UseMnemonic , ConnectToNami , ConnectToGero , ConnectToFlint , ConnectToEternl , ConnectToLode , ConnectToNuFi + , ConnectToLace + , ConnectToGenericCip30 ) ) import Data.Log.Level (LogLevel(Trace, Debug, Info, Warn, Error)) import Data.Log.Message (Message) import Data.Maybe (Maybe(Just, Nothing)) +import Data.Number (infinity) +import Data.Time.Duration (Milliseconds(Milliseconds), Seconds(Seconds)) testnetConfig :: ContractParams testnetConfig = @@ -85,6 +111,55 @@ testnetConfig = , customLogger: Nothing , suppressLogs: false , hooks: emptyHooks + , timeParams: defaultTimeParams + , synchronizationParams: defaultSynchronizationParams + } + +-- | - `syncWallet` specifies delay and timeout for `syncWalletWithTransaction` +-- | and `syncWalletWithTxInputs` synchronization primitives. +-- | See `doc/query-layers.md` for more info. +-- | - `syncBackend` specifies delay and timeout for `syncBackendWithWallet` +-- | synchronization primitive. +-- | See `doc/query-layers.md` for more info. +-- | - `awaitTxConfirmed` specifies default delay and timeout for +-- | `awaitTxConfirmed` call. +defaultTimeParams :: ContractTimeParams +defaultTimeParams = + { syncWallet: + -- As clarified in Eternl discord, they synchronize with the server every 2 + -- minutes, so 125 seconds would probably be enough. + -- For other wallets, it is not very important + { delay: Milliseconds 1_000.0, timeout: Seconds 125.0 } + , syncBackend: + -- Operations are costly, so the delay is 3 set to seconds + { delay: Milliseconds 3_000.0, timeout: Seconds 120.0 } + , awaitTxConfirmed: + -- CIP-30 calls are cheap, so the delay can be just 1 second + { delay: Milliseconds 1_000.0, timeout: Seconds infinity } + , waitUntilSlot: { delay: Milliseconds 1_000.0 } + } + +-- | Default synchronization parameters with all synchronization primitives +-- | enabled. `errorOnTimeout` options are all set to `false`. +-- | See `doc/query-layers.md` for more info. +defaultSynchronizationParams :: ContractSynchronizationParams +defaultSynchronizationParams = + { syncBackendWithWallet: + { errorOnTimeout: false, beforeCip30Methods: true, beforeBalancing: true } + , syncWalletWithTxInputs: { errorOnTimeout: false, beforeCip30Sign: true } + , syncWalletWithTransaction: + { errorOnTimeout: false, beforeTxConfirmed: true } + } + +-- | Synchronization parameters with all synchronization primitives enabled +-- | and `errorOnTimeout` values set to `true`. +-- | See `doc/query-layers.md` for more info. +strictSynchronizationParams :: ContractSynchronizationParams +strictSynchronizationParams = + { syncBackendWithWallet: + { errorOnTimeout: true, beforeCip30Methods: true, beforeBalancing: true } + , syncWalletWithTxInputs: { errorOnTimeout: true, beforeCip30Sign: true } + , syncWalletWithTransaction: { errorOnTimeout: true, beforeTxConfirmed: true } } testnetNamiConfig :: ContractParams @@ -105,6 +180,9 @@ testnetLodeConfig = testnetConfig { walletSpec = Just ConnectToLode } testnetNuFiConfig :: ContractParams testnetNuFiConfig = testnetConfig { walletSpec = Just ConnectToNuFi } +testnetLaceConfig :: ContractParams +testnetLaceConfig = testnetConfig { walletSpec = Just ConnectToLace } + mainnetConfig :: ContractParams mainnetConfig = testnetConfig { networkId = MainnetId } @@ -125,3 +203,6 @@ mainnetLodeConfig = mainnetConfig { walletSpec = Just ConnectToLode } mainnetNuFiConfig :: ContractParams mainnetNuFiConfig = mainnetConfig { walletSpec = Just ConnectToNuFi } + +mainnetLaceConfig :: ContractParams +mainnetLaceConfig = mainnetConfig { walletSpec = Just ConnectToLace } diff --git a/src/Contract/Hashing.purs b/src/Contract/Hashing.purs index 863c49c27..b17ae3854 100644 --- a/src/Contract/Hashing.purs +++ b/src/Contract/Hashing.purs @@ -1,8 +1,20 @@ module Contract.Hashing ( module X + , transactionHash + , publicKeyHash + , auxiliaryDataHash ) where +import Prelude + import Contract.Scripts (plutusScriptStakeValidatorHash) as X +import Ctl.Internal.Cardano.Types.Transaction + ( AuxiliaryData + , AuxiliaryDataHash + , PublicKey + , Transaction + , convertPubKey + ) import Ctl.Internal.Hashing ( blake2b224Hash , blake2b224HashHex @@ -16,7 +28,22 @@ import Ctl.Internal.Hashing , sha256HashHex , sha3_256Hash , sha3_256HashHex - , transactionHash ) as X +import Ctl.Internal.Hashing (transactionHash) as Internal import Ctl.Internal.NativeScripts (nativeScriptHash) as X -import Ctl.Internal.Serialization (publicKeyHash) as X +import Ctl.Internal.Serialization (convertTransaction) +import Ctl.Internal.Serialization (publicKeyHash) as Internal +import Ctl.Internal.Serialization.AuxiliaryData (hashAuxiliaryData) +import Ctl.Internal.Types.PubKeyHash (PubKeyHash) +import Ctl.Internal.Types.Transaction (TransactionHash) +import Data.Newtype (wrap) +import Effect (Effect) + +transactionHash :: Transaction -> Effect TransactionHash +transactionHash tx = Internal.transactionHash <$> convertTransaction tx + +publicKeyHash :: PublicKey -> PubKeyHash +publicKeyHash pk = wrap $ Internal.publicKeyHash $ convertPubKey pk + +auxiliaryDataHash :: AuxiliaryData -> Effect AuxiliaryDataHash +auxiliaryDataHash = hashAuxiliaryData diff --git a/src/Contract/JsSdk.purs b/src/Contract/JsSdk.purs new file mode 100644 index 000000000..29c8e3a02 --- /dev/null +++ b/src/Contract/JsSdk.purs @@ -0,0 +1,47 @@ +-- | This module contains helper functions for CTL-based JS SDK developers. +-- | See `doc/using-from-js.md`. +module Contract.JsSdk + ( runContractJS + , runContractInEnvJS + , mkContractEnvJS + , stopContractEnvJS + , withContractEnvJS + ) where + +import Prelude + +import Contract.Monad + ( Contract + , ContractEnv + , ContractParams + , mkContractEnv + , runContract + , runContractInEnv + , stopContractEnv + , withContractEnv + ) +import Control.Promise (Promise, fromAff, toAff) +import Data.Function.Uncurried (Fn1, Fn2, mkFn1, mkFn2, runFn1) +import Effect.Unsafe (unsafePerformEffect) + +runContractJS :: forall (a :: Type). Fn2 ContractParams (Contract a) (Promise a) +runContractJS = mkFn2 \params contract -> + unsafePerformEffect $ fromAff $ runContract params contract + +runContractInEnvJS + :: forall (a :: Type). Fn2 ContractEnv (Contract a) (Promise a) +runContractInEnvJS = mkFn2 \env contract -> + unsafePerformEffect $ fromAff $ runContractInEnv env contract + +mkContractEnvJS + :: Fn1 ContractParams (Promise ContractEnv) +mkContractEnvJS = mkFn1 $ unsafePerformEffect <<< fromAff <<< mkContractEnv + +stopContractEnvJS :: Fn1 ContractEnv (Promise Unit) +stopContractEnvJS = mkFn1 $ unsafePerformEffect <<< fromAff <<< stopContractEnv + +withContractEnvJS + :: forall a. Fn2 ContractParams (Fn1 ContractEnv (Promise a)) (Promise a) +withContractEnvJS = mkFn2 \params callback -> + unsafePerformEffect $ fromAff $ withContractEnv params + (toAff <<< runFn1 callback) diff --git a/src/Contract/Plutarch/Types.purs b/src/Contract/Plutarch/Types.purs index e7959a975..68cd2fbf4 100644 --- a/src/Contract/Plutarch/Types.purs +++ b/src/Contract/Plutarch/Types.purs @@ -23,7 +23,7 @@ import Contract.PlutusData , class ToData , PlutusData(List, Integer) ) -import Data.BigInt (BigInt) +import JS.BigInt (BigInt) newtype PRational = PRational R.Rational diff --git a/src/Contract/PlutusData.purs b/src/Contract/PlutusData.purs index 4255b0e3d..1d5334ea0 100644 --- a/src/Contract/PlutusData.purs +++ b/src/Contract/PlutusData.purs @@ -24,7 +24,7 @@ import Prelude import Contract.Monad (Contract) import Control.Parallel (parTraverse) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.Deserialization.PlutusData (deserializeData) as Deserialization import Ctl.Internal.FromData ( class FromData diff --git a/src/Contract/Prelude.purs b/src/Contract/Prelude.purs index abf720b6a..721c776f5 100644 --- a/src/Contract/Prelude.purs +++ b/src/Contract/Prelude.purs @@ -16,7 +16,6 @@ module Contract.Prelude , module Traversable , module Tuple , module TupleNested - , module Undefined ) where -- Imports for extra functions: @@ -334,7 +333,6 @@ import Prelude , (>>>) , (||) ) as PurescriptPrelude -import Undefined (undefined) as Undefined mconcat :: forall (f :: Type -> Type) (m :: Type). Foldable f => Monoid m => f m -> m diff --git a/src/Contract/ScriptLookups.purs b/src/Contract/ScriptLookups.purs index 89cb3c098..3e489fba0 100644 --- a/src/Contract/ScriptLookups.purs +++ b/src/Contract/ScriptLookups.purs @@ -1,101 +1,19 @@ -- | A module for creating off-chain script lookups, and an unbalanced -- | transaction. --- | --- | The lookup functions come in pairs. If the function cannot fail, there --- | is another version contained in a `Maybe` context (that also does not fail). --- | This is to aid users who wish to utilise the underlying `ScriptLookups` --- | `Monoid` for `foldMap` etc. --- | --- | Otherwise, there are lookups that may fail with `Maybe` (because of --- | hashing) and an unsafe counterpart via `fromJust`. -module Contract.ScriptLookups - ( mkUnbalancedTx - , mkUnbalancedTxM - , module ScriptLookups - ) where +module Contract.ScriptLookups (module X) where -import Prelude - -import Contract.Monad (Contract) -import Ctl.Internal.IsData (class IsData) +import Ctl.Internal.ProcessConstraints.UnbalancedTx (UnbalancedTx(UnbalancedTx)) as X import Ctl.Internal.Types.ScriptLookups - ( MkUnbalancedTxError - ( TypeCheckFailed - , ModifyTx - , TxOutRefNotFound - , TxOutRefWrongType - , DatumNotFound - , MintingPolicyNotFound - , MintingPolicyHashNotCurrencySymbol - , CannotMakeValue - , ValidatorHashNotFound - , OwnPubKeyAndStakeKeyMissing - , TypedValidatorMissing - , DatumWrongHash - , CannotQueryDatum - , CannotHashDatum - , CannotConvertPOSIXTimeRange - , CannotGetMintingPolicyScriptIndex - , CannotGetValidatorHashFromAddress - , TypedTxOutHasNoDatumHash - , CannotHashMintingPolicy - , CannotHashValidator - , CannotConvertPaymentPubKeyHash - , CannotSatisfyAny - ) - , ScriptLookups(ScriptLookups) - , UnattachedUnbalancedTx(UnattachedUnbalancedTx) + ( ScriptLookups(ScriptLookups) , datum - , generalise , mintingPolicy , mintingPolicyM , ownPaymentPubKeyHash , ownPaymentPubKeyHashM , ownStakePubKeyHash , ownStakePubKeyHashM - , typedValidatorLookups - , typedValidatorLookupsM - -- , paymentPubKeyM , unspentOutputs , unspentOutputsM - -- , unsafePaymentPubKey , validator , validatorM - ) as ScriptLookups -import Ctl.Internal.Types.ScriptLookups (mkUnbalancedTx) as SL -import Ctl.Internal.Types.TxConstraints (TxConstraints) -import Ctl.Internal.Types.TypedValidator (class ValidatorTypes) -import Data.Either (Either, hush) -import Data.Maybe (Maybe) - --- | Create an `UnattachedUnbalancedTx` given `ScriptLookups` and --- | `TxConstraints`. You will probably want to use this version as it returns --- | datums and redeemers that require attaching (and maybe reindexing) in --- | a separate call. In particular, this should be called in conjuction with --- | `balanceTx` and `signTransaction`. -mkUnbalancedTx - :: forall (validator :: Type) (datum :: Type) - (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups.ScriptLookups validator - -> TxConstraints redeemer datum - -> Contract - ( Either - ScriptLookups.MkUnbalancedTxError - ScriptLookups.UnattachedUnbalancedTx - ) -mkUnbalancedTx = SL.mkUnbalancedTx - --- | Same as `mkUnbalancedTx` but hushes the error. -mkUnbalancedTxM - :: forall (validator :: Type) (datum :: Type) - (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups.ScriptLookups validator - -> TxConstraints redeemer datum - -> Contract (Maybe ScriptLookups.UnattachedUnbalancedTx) -mkUnbalancedTxM lookups = map hush <<< mkUnbalancedTx lookups + ) as X diff --git a/src/Contract/Scripts.purs b/src/Contract/Scripts.purs index d9f5686fc..6a19018d8 100644 --- a/src/Contract/Scripts.purs +++ b/src/Contract/Scripts.purs @@ -7,7 +7,6 @@ module Contract.Scripts , module ExportScripts , module Hash , module NativeScript - , module TypedValidator , module TypesScripts , module X ) where @@ -28,7 +27,7 @@ import Ctl.Internal.Cardano.Types.NativeScript ) ) as NativeScript import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.NativeScripts (NativeScriptHash(NativeScriptHash)) as X import Ctl.Internal.Scripts ( mintingPolicyHash @@ -49,18 +48,6 @@ import Ctl.Internal.Types.Scripts , Validator(Validator) , ValidatorHash(ValidatorHash) ) as TypesScripts -import Ctl.Internal.Types.TypedValidator - ( class DatumType - , class RedeemerType - , class ValidatorTypes - , TypedValidator(TypedValidator) - , ValidatorType - , WrappedValidatorType - , forwardingMintingPolicy - , generalise - , typedValidatorHash - , typedValidatorScript - ) as TypedValidator import Data.Either (Either) import Data.Map (Map) import Data.Map as Map diff --git a/src/Contract/Staking.purs b/src/Contract/Staking.purs index db7792e8f..0cef956ff 100644 --- a/src/Contract/Staking.purs +++ b/src/Contract/Staking.purs @@ -10,7 +10,7 @@ import Prelude import Contract.Monad (Contract) import Control.Monad.Reader (asks) import Ctl.Internal.Cardano.Types.Transaction (PoolPubKeyHash) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.QueryM.Pools (DelegationsAndRewards) import Ctl.Internal.QueryM.Pools (DelegationsAndRewards) as X import Ctl.Internal.Types.PubKeyHash (StakePubKeyHash) diff --git a/src/Contract/Sync.purs b/src/Contract/Sync.purs new file mode 100644 index 000000000..636ff473d --- /dev/null +++ b/src/Contract/Sync.purs @@ -0,0 +1,12 @@ +-- | A module for wallet/backend synchronization control. +-- | See `doc/query-layers.md`. +module Contract.Sync + ( module X + ) where + +import Ctl.Internal.BalanceTx.Sync + ( syncBackendWithWallet + , syncWalletWithTransaction + , syncWalletWithTxInputs + , withoutSync + ) as X diff --git a/src/Contract/Test.purs b/src/Contract/Test.purs index 591ba8e5a..598250d86 100644 --- a/src/Contract/Test.purs +++ b/src/Contract/Test.purs @@ -8,6 +8,9 @@ import Ctl.Internal.Test.ContractTest , noWallet , withWallets ) as X +import Ctl.Internal.Test.KeyDir + ( runContractTestsWithKeyDir + ) as X import Ctl.Internal.Test.UtxoDistribution ( class UtxoDistribution , InitialUTxODistribution diff --git a/src/Contract/Test/Assert.purs b/src/Contract/Test/Assert.purs index 6715872dc..1577e0e1e 100644 --- a/src/Contract/Test/Assert.purs +++ b/src/Contract/Test/Assert.purs @@ -11,42 +11,56 @@ module Contract.Test.Assert , UnexpectedMetadataValue , UnexpectedRefScriptInOutput , UnexpectedTokenDelta + , FailedToGetExpectedValue ) , ContractAssertion , ContractCheck , ExpectedActual(ExpectedActual) , Label , Labeled(Labeled) - , assertContractExpectedActual , assertContract + , assertContractEqual + , assertContractExpectedActual , assertContractMaybe - , assertLovelaceDeltaAtAddress + , assertNewUtxosAtAddress + , assertNewUtxosInWallet , assertOutputHasDatum , assertOutputHasRefScript , assertTxHasMetadata - , assertValueDeltaAtAddress , assertionToCheck , checkExUnitsNotExceed , checkGainAtAddress , checkGainAtAddress' + , checkGainInWallet + , checkGainInWallet' , checkLossAtAddress , checkLossAtAddress' - , checkNewUtxosAtAddress + , checkLossInWallet + , checkLossInWallet' + , checkLovelaceDeltaAtAddress + , checkLovelaceDeltaInWallet , checkTokenDeltaAtAddress + , checkTokenDeltaInWallet , checkTokenGainAtAddress , checkTokenGainAtAddress' + , checkTokenGainInWallet + , checkTokenGainInWallet' , checkTokenLossAtAddress , checkTokenLossAtAddress' + , checkTokenLossInWallet + , checkTokenLossInWallet' + , checkValueDeltaAtAddress + , checkValueDeltaInWallet , collectAssertionFailures , label , noLabel + , printContractAssertionFailure + , printContractAssertionFailures + , printExpectedActual + , printLabeled , runChecks , tellFailure , unlabel - , printLabeled - , printExpectedActual - , printContractAssertionFailure - , printContractAssertionFailures ) where import Prelude @@ -63,6 +77,7 @@ import Contract.Transaction ) import Contract.Utxos (utxosAt) import Contract.Value (CurrencySymbol, TokenName, Value, valueOf, valueToCoin') +import Contract.Wallet (getWalletBalance, getWalletUtxos) import Control.Monad.Error.Class (liftEither, throwError) import Control.Monad.Error.Class as E import Control.Monad.Reader (ReaderT, ask, local, mapReaderT, runReaderT) @@ -85,24 +100,24 @@ import Ctl.Internal.Plutus.Types.Transaction import Ctl.Internal.Types.ByteArray (byteArrayToHex) import Data.Array (foldr) import Data.Array (fromFoldable, length, mapWithIndex, partition) as Array -import Data.BigInt (BigInt) import Data.Either (Either, either, hush) -import Data.Foldable (foldMap, null, sum) +import Data.Foldable (fold, foldMap, null, sum) import Data.Generic.Rep (class Generic) import Data.Lens (non, to, traversed, view, (%~), (^.), (^..)) import Data.Lens.Record (prop) import Data.List (List(Cons, Nil)) -import Data.Map (filterKeys, lookup, values) as Map -import Data.Maybe (Maybe(Just, Nothing), maybe) +import Data.Map (empty, filterKeys, lookup, values) as Map +import Data.Maybe (Maybe(Just, Nothing), fromMaybe, maybe) import Data.Newtype (unwrap) import Data.Show.Generic (genericShow) import Data.String (trim) as String import Data.String.Common (joinWith) as String import Data.Tuple.Nested (type (/\), (/\)) import Effect.Class (liftEffect) -import Effect.Exception (Error, error, throw, try) +import Effect.Exception (Error, error, message, throw, try) import Effect.Ref (Ref) import Effect.Ref as Ref +import JS.BigInt (BigInt) import Type.Proxy (Proxy(Proxy)) -- | Monad allowing for accumulation of assertion failures. @@ -119,11 +134,13 @@ data ContractAssertionFailure | TransactionHasNoMetadata TransactionHash (Maybe Label) | UnexpectedDatumInOutput (Labeled TransactionOutputWithRefScript) (ExpectedActual OutputDatum) - | UnexpectedLovelaceDelta (Labeled Address) (ExpectedActual BigInt) + | UnexpectedLovelaceDelta (Maybe (Labeled Address)) (ExpectedActual BigInt) | UnexpectedMetadataValue Label (ExpectedActual String) | UnexpectedRefScriptInOutput (Labeled TransactionOutputWithRefScript) (ExpectedActual (Maybe ScriptRef)) - | UnexpectedTokenDelta (Labeled Address) TokenName (ExpectedActual BigInt) + | UnexpectedTokenDelta (Maybe (Labeled Address)) TokenName + (ExpectedActual BigInt) + | FailedToGetExpectedValue String | MaxExUnitsExceeded (ExpectedActual ExUnits) | CustomFailure String | SkippedTest String @@ -153,7 +170,8 @@ printContractAssertionFailures failures = ) errorText = if Array.length errors > 0 then - "The following `Contract` assertions have failed: \n " + "In addition to the error above, the following `Contract` assertions" + <> " have failed:\n\n " <> listFailures errors <> "\n\n" else "" @@ -182,9 +200,13 @@ printContractAssertionFailure = case _ of "Unexpected datum in output " <> printLabeled txOutput <> " " <> printExpectedActual expectedActual - UnexpectedLovelaceDelta addr expectedActual -> + UnexpectedLovelaceDelta (Just addr) expectedActual -> "Unexpected lovelace delta at address " - <> (printLabeled addr <> printExpectedActual expectedActual) + <> printLabeled addr + <> printExpectedActual expectedActual + UnexpectedLovelaceDelta Nothing expectedActual -> + "Unexpected lovelace delta in wallet: " + <> printExpectedActual expectedActual UnexpectedMetadataValue mdLabel expectedActual -> "Unexpected " <> mdLabel <> " metadata value" <> printExpectedActual @@ -194,9 +216,17 @@ printContractAssertionFailure = case _ of "Unexpected reference script in output " <> (printLabeled txOutput <> printExpectedActual expectedActual) - UnexpectedTokenDelta addr tn expectedActual -> + UnexpectedTokenDelta (Just addr) tn expectedActual -> "Unexpected token delta " <> show tn <> " at address " - <> (printLabeled addr <> printExpectedActual expectedActual) + <> printLabeled addr + <> printExpectedActual expectedActual + + UnexpectedTokenDelta Nothing tn expectedActual -> + "Unexpected token delta " <> show tn <> " in wallet: " + <> printExpectedActual expectedActual + + FailedToGetExpectedValue err -> + "Error while trying to get expected value: " <> err MaxExUnitsExceeded expectedActual -> "ExUnits limit exceeded: " <> printExpectedActual expectedActual @@ -244,7 +274,7 @@ derive instance Functor ExpectedActual printExpectedActual :: forall (a :: Type). Show a => ExpectedActual a -> String printExpectedActual (ExpectedActual expected actual) = - " (Expected: " <> show expected <> ", Actual: " <> show actual <> ")" + " Expected: " <> show expected <> ", Actual: " <> show actual <> " " -------------------------------------------------------------------------------- -- Different types of assertions, Assertion composition, Basic functions @@ -260,7 +290,8 @@ type ContractCheck a = -- | Create a check that simply asserts something about a `Contract` result. -- | -- | If a `Contract` throws an exception, the assertion is never checked, --- | because the result is never computed. +-- | because the result is never computed. In this case, a warning will be +-- | printed, containing the given description. assertionToCheck :: forall (a :: Type) . String @@ -303,6 +334,19 @@ assertContractExpectedActual mkAssertionFailure expected actual = assertContract (mkAssertionFailure $ ExpectedActual expected actual) (expected == actual) +assertContractEqual + :: forall (a :: Type) + . Eq a + => Show a + => a + -> a + -> ContractAssertion Unit +assertContractEqual = assertContractExpectedActual + \(ExpectedActual expected actual) -> CustomFailure $ + "assertContractEqual: failure, expected:\n" <> show expected + <> "\ngot:\n" + <> show actual + -- | Like `runChecks`, but does not throw a user-readable report, collecting -- | the exceptions instead. collectAssertionFailures @@ -348,26 +392,41 @@ runChecks assertions contract = do liftEffect $ throwError $ error errorReport where reportException :: Error -> String - reportException error = "\n\nAn exception has been thrown: \n\n" <> show error + reportException error = "\n\nAn exception has been thrown: \n\n" <> message + error -tellFailure - :: ContractAssertionFailure -> ContractAssertion Unit -tellFailure failure = do - ask >>= liftEffect <<< Ref.modify_ (Cons failure) +----------------------- UTxOs --------------------------------------------------- -checkNewUtxosAtAddress +-- | Assert some property of address UTxOs created by a Transaction. +assertNewUtxosAtAddress :: forall (a :: Type) . Labeled Address -> TransactionHash -> (Array TransactionOutputWithRefScript -> ContractAssertion a) -> ContractAssertion a -checkNewUtxosAtAddress addr txHash check = +assertNewUtxosAtAddress addr txHash check = lift (utxosAt $ unlabel addr) >>= \utxos -> check $ Array.fromFoldable $ Map.values $ Map.filterKeys (\oref -> (unwrap oref).transactionId == txHash) utxos --- | Sets a limit on `ExUnits` budget. All ExUnits values of all submitted transactions are combined. Transactions that are constructed, but not submitted, are not considered. --- | The execution of the `Contract` will not be interrupted in case the `ExUnits` limit is reached. +-- | Assert some property of wallet UTxOs created by a Transaction. +assertNewUtxosInWallet + :: forall (a :: Type) + . TransactionHash + -> (Array TransactionOutputWithRefScript -> ContractAssertion a) + -> ContractAssertion a +assertNewUtxosInWallet txHash check = + lift getWalletUtxos >>= fromMaybe Map.empty >>> \utxos -> + check $ Array.fromFoldable $ Map.values $ + Map.filterKeys (\oref -> (unwrap oref).transactionId == txHash) utxos + +------------------------ Execution units ---------------------------------------- + +-- | Sets a limit on `ExUnits` budget. All ExUnits values of all submitted +-- | transactions are combined. Transactions that are constructed, but not +-- | submitted, are not considered. +-- | The execution of the `Contract` will not be interrupted in case the +-- | `ExUnits` limit is reached. checkExUnitsNotExceed :: forall (a :: Type) . ExUnits @@ -404,12 +463,7 @@ checkExUnitsNotExceed maxExUnits contract = do pure (mapReaderT (local setSubmitHook) contract /\ finalize) -valueAtAddress' - :: Labeled Address - -> ContractAssertion Value -valueAtAddress' = map (foldMap (view (_output <<< _amount))) <<< lift - <<< utxosAt - <<< unlabel +-------------- Values at address ------------------------------------------------ -- | Arguments are: -- | @@ -417,17 +471,17 @@ valueAtAddress' = map (foldMap (view (_output <<< _amount))) <<< lift -- | - a callback that implements the assertion, accepting `Contract` execution -- | result, and values (before and after). The value may not be computed due -- | to an exception, hence it's wrapped in `Maybe`. -assertValueDeltaAtAddress +checkValueDeltaAtAddress :: forall (a :: Type) . Labeled Address -> (Maybe a -> Value -> Value -> ContractAssertion Unit) -> ContractCheck a -assertValueDeltaAtAddress addr check contract = do - valueBefore <- valueAtAddress' addr +checkValueDeltaAtAddress addr check contract = do + valueBefore <- getValueAtAddress addr ref <- liftEffect $ Ref.new Nothing let finalize = do - valueAfter <- valueAtAddress' addr + valueAfter <- getValueAtAddress addr liftEffect (Ref.read ref) >>= \res -> check res valueBefore valueAfter run = do res <- contract @@ -435,27 +489,29 @@ assertValueDeltaAtAddress addr check contract = do pure res pure (run /\ finalize) -assertLovelaceDeltaAtAddress +checkLovelaceDeltaAtAddress :: forall (a :: Type) . Labeled Address -> (Maybe a -> Contract BigInt) -> (BigInt -> BigInt -> Boolean) -> ContractCheck a -assertLovelaceDeltaAtAddress addr getExpected comp contract = do - assertValueDeltaAtAddress addr check contract +checkLovelaceDeltaAtAddress addr getExpected comp contract = do + checkValueDeltaAtAddress addr check contract where check :: Maybe a -> Value -> Value -> ContractAssertion Unit check result valueBefore valueAfter = do - expected <- lift $ getExpected result - let - actual :: BigInt - actual = valueToCoin' valueAfter - valueToCoin' valueBefore + lift (E.try $ getExpected result) >>= either + (tellFailure <<< FailedToGetExpectedValue <<< message) + \expected -> do + let + actual :: BigInt + actual = valueToCoin' valueAfter - valueToCoin' valueBefore - unexpectedLovelaceDelta :: ContractAssertionFailure - unexpectedLovelaceDelta = - UnexpectedLovelaceDelta addr (ExpectedActual expected actual) + unexpectedLovelaceDelta :: ContractAssertionFailure + unexpectedLovelaceDelta = + UnexpectedLovelaceDelta (Just addr) (ExpectedActual expected actual) - assertContract unexpectedLovelaceDelta (comp actual expected) + assertContract unexpectedLovelaceDelta (comp actual expected) -- | Requires that the computed amount of lovelace was gained at the address -- | by calling the contract. @@ -465,7 +521,7 @@ checkGainAtAddress -> (Maybe a -> Contract BigInt) -> ContractCheck a checkGainAtAddress addr getMinGain = - assertLovelaceDeltaAtAddress addr getMinGain eq + checkLovelaceDeltaAtAddress addr getMinGain eq -- | Requires that the passed amount of lovelace was gained at the address -- | by calling the contract. @@ -485,7 +541,7 @@ checkLossAtAddress -> (Maybe a -> Contract BigInt) -> ContractCheck a checkLossAtAddress addr getMinLoss = - assertLovelaceDeltaAtAddress addr (map negate <<< getMinLoss) eq + checkLovelaceDeltaAtAddress addr (map negate <<< getMinLoss) eq -- | Requires that the passed amount of lovelace was lost at the address -- | by calling the contract. @@ -505,20 +561,22 @@ checkTokenDeltaAtAddress -> (BigInt -> BigInt -> Boolean) -> ContractCheck a checkTokenDeltaAtAddress addr (cs /\ tn) getExpected comp contract = - assertValueDeltaAtAddress addr check contract + checkValueDeltaAtAddress addr check contract where check :: Maybe a -> Value -> Value -> ContractAssertion Unit check result valueBefore valueAfter = do - expected <- lift $ getExpected result - let - actual :: BigInt - actual = valueOf valueAfter cs tn - valueOf valueBefore cs tn + lift (E.try $ getExpected result) >>= either + (tellFailure <<< FailedToGetExpectedValue <<< message) + \expected -> do + let + actual :: BigInt + actual = valueOf valueAfter cs tn - valueOf valueBefore cs tn - unexpectedTokenDelta :: ContractAssertionFailure - unexpectedTokenDelta = - UnexpectedTokenDelta addr tn (ExpectedActual expected actual) + unexpectedTokenDelta :: ContractAssertionFailure + unexpectedTokenDelta = + UnexpectedTokenDelta (Just addr) tn (ExpectedActual expected actual) - assertContract unexpectedTokenDelta (comp actual expected) + assertContract unexpectedTokenDelta (comp actual expected) -- | Requires that the computed number of tokens was gained at the address -- | by calling the contract. @@ -562,6 +620,150 @@ checkTokenLossAtAddress' checkTokenLossAtAddress' addr (cs /\ tn /\ minLoss) = checkTokenLossAtAddress addr (cs /\ tn) (const $ pure minLoss) +------------------- Values in wallet -------------------------------------------- + +-- | Accepts a callback that implements the assetion. The result value of type +-- | `a` may not be computed due to an exception, hence it's wrapped in `Maybe`. +checkValueDeltaInWallet + :: forall (a :: Type) + . (Maybe a -> Value -> Value -> ContractAssertion Unit) + -> ContractCheck a +checkValueDeltaInWallet check contract = do + valueBefore <- lift $ getWalletBalance <#> fold + ref <- liftEffect $ Ref.new Nothing + let + finalize = do + valueAfter <- lift $ getWalletBalance <#> fold + liftEffect (Ref.read ref) >>= \res -> check res valueBefore valueAfter + run = do + res <- contract + liftEffect $ Ref.write (Just res) ref + pure res + pure (run /\ finalize) + +checkLovelaceDeltaInWallet + :: forall (a :: Type) + . (Maybe a -> Contract BigInt) + -> (BigInt -> BigInt -> Boolean) + -> ContractCheck a +checkLovelaceDeltaInWallet getExpected comp contract = do + checkValueDeltaInWallet check contract + where + check :: Maybe a -> Value -> Value -> ContractAssertion Unit + check result valueBefore valueAfter = do + lift (E.try $ getExpected result) >>= either + (tellFailure <<< FailedToGetExpectedValue <<< message) + \expected -> do + let + actual :: BigInt + actual = valueToCoin' valueAfter - valueToCoin' valueBefore + + unexpectedLovelaceDelta :: ContractAssertionFailure + unexpectedLovelaceDelta = + UnexpectedLovelaceDelta Nothing (ExpectedActual expected actual) + + assertContract unexpectedLovelaceDelta (comp actual expected) + +-- | Requires that the computed amount of lovelace was gained in the wallet +-- | by calling the contract. +checkGainInWallet + :: forall (a :: Type) + . (Maybe a -> Contract BigInt) + -> ContractCheck a +checkGainInWallet getMinGain = + checkLovelaceDeltaInWallet getMinGain eq + +-- | Requires that the passed amount of lovelace was gained in the wallet +-- | by calling the contract. +checkGainInWallet' + :: forall (a :: Type) + . BigInt + -> ContractCheck a +checkGainInWallet' minGain = + checkGainInWallet (const $ pure minGain) + +-- | Requires that the computed amount of lovelace was lost in the wallet +-- | by calling the contract. +checkLossInWallet + :: forall (a :: Type) + . (Maybe a -> Contract BigInt) + -> ContractCheck a +checkLossInWallet getMinLoss = + checkLovelaceDeltaInWallet (map negate <<< getMinLoss) eq + +-- | Requires that the passed amount of lovelace was lost in the wallet +-- | by calling the contract. +checkLossInWallet' + :: forall (a :: Type) + . BigInt + -> ContractCheck a +checkLossInWallet' minLoss = + checkLossInWallet (const $ pure minLoss) + +checkTokenDeltaInWallet + :: forall (a :: Type) + . (CurrencySymbol /\ TokenName) + -> (Maybe a -> Contract BigInt) + -> (BigInt -> BigInt -> Boolean) + -> ContractCheck a +checkTokenDeltaInWallet (cs /\ tn) getExpected comp contract = + checkValueDeltaInWallet check contract + where + check :: Maybe a -> Value -> Value -> ContractAssertion Unit + check result valueBefore valueAfter = do + lift (E.try $ getExpected result) >>= either + (tellFailure <<< FailedToGetExpectedValue <<< message) + \expected -> do + let + actual :: BigInt + actual = valueOf valueAfter cs tn - valueOf valueBefore cs tn + + unexpectedTokenDelta :: ContractAssertionFailure + unexpectedTokenDelta = + UnexpectedTokenDelta Nothing tn (ExpectedActual expected actual) + + assertContract unexpectedTokenDelta (comp actual expected) + +-- | Requires that the computed number of tokens was gained in the wallet +-- | by calling the contract. +checkTokenGainInWallet + :: forall (a :: Type) + . (CurrencySymbol /\ TokenName) + -> (Maybe a -> Contract BigInt) + -> ContractCheck a +checkTokenGainInWallet token getMinGain = + checkTokenDeltaInWallet token getMinGain eq + +-- | Requires that the passed number of tokens was gained in the wallet +-- | by calling the contract. +checkTokenGainInWallet' + :: forall (a :: Type) + . (CurrencySymbol /\ TokenName /\ BigInt) + -> ContractCheck a +checkTokenGainInWallet' (cs /\ tn /\ minGain) = + checkTokenGainInWallet (cs /\ tn) (const $ pure minGain) + +-- | Requires that the computed number of tokens was lost in the wallet +-- | by calling the contract. +checkTokenLossInWallet + :: forall (a :: Type) + . (CurrencySymbol /\ TokenName) + -> (Maybe a -> Contract BigInt) + -> ContractCheck a +checkTokenLossInWallet token getMinLoss = + checkTokenDeltaInWallet token (map negate <<< getMinLoss) eq + +-- | Requires that the passed number of tokens was lost in the wallet +-- | by calling the contract. +checkTokenLossInWallet' + :: forall (a :: Type) + . (CurrencySymbol /\ TokenName /\ BigInt) + -> ContractCheck a +checkTokenLossInWallet' (cs /\ tn /\ minLoss) = + checkTokenLossInWallet (cs /\ tn) (const $ pure minLoss) + +--------------------- Datums and scripts ---------------------------------------- + -- | Requires that the transaction output contains the specified datum or -- | datum hash. assertOutputHasDatum @@ -586,18 +788,7 @@ assertOutputHasRefScript expectedRefScript txOutput = do (Just expectedRefScript) actualRefScript -tieRef - :: forall (a :: Type) - . ContractAssertion - ((a -> ContractAssertion a) /\ ContractAssertion (Maybe a)) -tieRef = do - ref <- liftEffect $ Ref.new Nothing - let - putResult result = do - liftEffect $ Ref.write (Just result) ref - pure result - getResult = liftEffect (Ref.read ref) - pure (putResult /\ getResult) +------------------------- Metadata --------------------------------------------- assertTxHasMetadata :: forall (metadata :: Type) (a :: Type) @@ -626,3 +817,30 @@ assertTxHasMetadata mdLabel txHash expectedMetadata = do let expectedActual = show <$> ExpectedActual expectedMetadata metadata assertContract (UnexpectedMetadataValue mdLabel expectedActual) (metadata == expectedMetadata) + +-------------------------- Utils ----------------------------------------------- + +getValueAtAddress + :: Labeled Address + -> ContractAssertion Value +getValueAtAddress = map (foldMap (view (_output <<< _amount))) <<< lift + <<< utxosAt + <<< unlabel + +tellFailure + :: ContractAssertionFailure -> ContractAssertion Unit +tellFailure failure = do + ask >>= liftEffect <<< Ref.modify_ (Cons failure) + +tieRef + :: forall (a :: Type) + . ContractAssertion + ((a -> ContractAssertion a) /\ ContractAssertion (Maybe a)) +tieRef = do + ref <- liftEffect $ Ref.new Nothing + let + putResult result = do + liftEffect $ Ref.write (Just result) ref + pure result + getResult = liftEffect (Ref.read ref) + pure (putResult /\ getResult) diff --git a/src/Contract/Test/Blockfrost.purs b/src/Contract/Test/Blockfrost.purs index 88c3d5802..b446c5675 100644 --- a/src/Contract/Test/Blockfrost.purs +++ b/src/Contract/Test/Blockfrost.purs @@ -19,13 +19,19 @@ import Contract.Config ) import Contract.Test.Mote (TestPlanM, interpretWithConfig) import Control.Monad.Error.Class (liftMaybe) +import Ctl.Internal.ServerConfig (defaultKupoServerConfig) import Ctl.Internal.Test.ContractTest (ContractTest) import Ctl.Internal.Test.E2E.Runner (readBoolean) import Ctl.Internal.Test.KeyDir (runContractTestsWithKeyDir) -import Data.Maybe (Maybe(Just, Nothing), fromMaybe, isNothing, maybe) +import Data.Array (any) +import Data.Maybe (Maybe(Just, Nothing), fromMaybe, isJust, isNothing, maybe) import Data.Newtype (unwrap) import Data.Number as Number +import Data.String (joinWith) import Data.Time.Duration (Seconds(Seconds)) +import Data.Traversable (traverse) +import Data.Tuple (Tuple(Tuple)) +import Data.Tuple.Nested (type (/\), (/\)) import Data.UInt as UInt import Effect (Effect) import Effect.Aff (Aff) @@ -104,20 +110,11 @@ runContractTestsWithBlockfrost executeContractTestsWithBlockfrost :: Config -> ContractParams - -> Maybe CtlBackendParams -> TestPlanM ContractTest Unit -> Aff Unit -executeContractTestsWithBlockfrost - testConfig - contractParams - mbCtlBackendParams - suite = do +executeContractTestsWithBlockfrost testConfig contractParams suite = do blockfrostApiKey <- liftEffect $ lookupEnv "BLOCKFROST_API_KEY" <#> notEmptyString - when (isNothing blockfrostApiKey) do - liftEffect $ Console.warn $ - "Warning: BLOCKFROST_API_KEY is not set. " <> - "If you are using a public instance, the tests will fail" privatePaymentKeyFile <- getEnvVariable "PRIVATE_PAYMENT_KEY_FILE" "Please specify a payment key file" @@ -134,7 +131,12 @@ executeContractTestsWithBlockfrost <> "s." testKeysDirectory <- getEnvVariable "BACKUP_KEYS_DIR" "Please specify a directory to store temporary private keys in" - blockfrostConfig <- liftEffect $ readBlockfrostServerConfig + blockfrostConfig /\ mbOgmiosConfig <- + liftEffect $ readBlockfrostServerConfigs + when (isNothing blockfrostApiKey && isNothing mbOgmiosConfig) do + liftEffect $ Console.warn $ + "Warning: BLOCKFROST_API_KEY is not set. " <> + "If you are using a public instance, the tests will fail" let backendParams = { blockfrostConfig @@ -143,7 +145,11 @@ executeContractTestsWithBlockfrost } interpretWithConfig testConfig $ runContractTestsWithBlockfrost contractParams backendParams - mbCtlBackendParams + ( mbOgmiosConfig <#> \ogmiosConfig -> + { ogmiosConfig: ogmiosConfig + , kupoConfig: defaultKupoServerConfig -- will never be used + } + ) { privateKeySources: { payment: PrivatePaymentKeyFile privatePaymentKeyFile , stake: PrivateStakeKeyFile <$> mbPrivateStakeKeyFile @@ -159,13 +165,6 @@ executeContractTestsWithBlockfrost Just result -> pure result pure res - -- Treat env variables set to "" as empty - notEmptyString :: Maybe String -> Maybe String - notEmptyString = - case _ of - Just "" -> Nothing - other -> other - parseConfirmationDelay :: Maybe String -> Effect (Maybe Seconds) parseConfirmationDelay = notEmptyString >>> maybe (pure Nothing) \str -> @@ -174,18 +173,67 @@ executeContractTestsWithBlockfrost "TX_CONFIRMATION_DELAY_SECONDS must be set to a valid number" Just number -> pure $ Just $ Seconds number -readBlockfrostServerConfig :: Effect ServerConfig -readBlockfrostServerConfig = do - port <- lookupEnv "BLOCKFROST_PORT" >>= \mbPort -> - liftMaybe (error "Unable to read BLOCKFROST_PORT environment variable") +readBlockfrostServerConfigs :: Effect (ServerConfig /\ Maybe ServerConfig) +readBlockfrostServerConfigs = + Tuple <$> readServerConfig "BLOCKFROST" <*> readServerConfigMaybe "OGMIOS" + +readServerConfig :: String -> Effect ServerConfig +readServerConfig service = do + port <- lookupEnv (service <> "_PORT") >>= \mbPort -> + liftMaybe + (error $ "Unable to read " <> service <> "_PORT environment variable") (mbPort >>= UInt.fromString) - host <- lookupEnv "BLOCKFROST_HOST" >>= - liftMaybe (error "Unable to read BLOCKFROST_HOST") - secure <- lookupEnv "BLOCKFROST_SECURE" >>= \mbSecure -> + host <- lookupEnv (service <> "_HOST") >>= + liftMaybe (error $ "Unable to read " <> service <> "_HOST") + secure <- lookupEnv (service <> "_SECURE") >>= \mbSecure -> liftMaybe - ( error - "Unable to read BLOCKFROST_SECURE ('true' - use HTTPS, 'false' - use HTTP)" + ( error $ + "Unable to read " <> service <> + "_SECURE ('true' - use HTTPS, 'false' - use HTTP)" ) (mbSecure >>= readBoolean) - path <- lookupEnv "BLOCKFROST_PATH" + path <- lookupEnv $ service <> "_PATH" pure { port, host, secure, path } + +readServerConfigMaybe :: String -> Effect (Maybe ServerConfig) +readServerConfigMaybe service = do + mbPort <- (lookupEnv (service <> "_PORT") <#> notEmptyString) >>= traverse + \port -> + liftMaybe + (error $ "Unable to read " <> service <> "_PORT environment variable") + (UInt.fromString port) + mbHost <- lookupEnv (service <> "_HOST") <#> notEmptyString + mbSecure <- lookupEnv (service <> "_SECURE") >>= traverse \secure -> + liftMaybe + ( error $ + "Unable to read " <> service <> + "_SECURE ('true' - use HTTPS, 'false' - use HTTP)" + ) + (readBoolean secure) + mbPath <- lookupEnv (service <> "_PATH") + let + vars = [ void mbPort, void mbHost, void mbSecure, void mbPath ] + when (any isJust vars && any isNothing vars) do + liftEffect $ throw $ forgotSomethingError + pure $ do + port <- mbPort + host <- mbHost + secure <- mbSecure + pure { port, host, secure, path: mbPath } + where + forgotSomethingError = + "All of " + <> joinWith ", " + [ service <> "_HOST" + , service <> "_PORT" + , service <> "_SECURE" + , service <> "_PATH" + ] + <> " must be provided!" + +-- | Treat env variables set to "" as empty +notEmptyString :: Maybe String -> Maybe String +notEmptyString = + case _ of + Just "" -> Nothing + other -> other diff --git a/src/Contract/Test/E2E.purs b/src/Contract/Test/E2E.purs index e9acb4c89..7f8582ba8 100644 --- a/src/Contract/Test/E2E.purs +++ b/src/Contract/Test/E2E.purs @@ -2,7 +2,7 @@ module Contract.Test.E2E ( module X ) where -import Ctl.Internal.E2E.Route (E2EConfigName, E2ETestName, addLinks, route) as X import Ctl.Internal.Test.E2E.Feedback.Hooks (e2eFeedbackHooks) as X import Ctl.Internal.Test.E2E.Options (parseCliArgs) as X +import Ctl.Internal.Test.E2E.Route (E2EConfigName, E2ETestName, addLinks, route) as X import Ctl.Internal.Test.E2E.Runner (runE2ECommand, runE2ETests) as X diff --git a/src/Contract/Test/Plutip.purs b/src/Contract/Test/Plutip.purs index 9c1371d82..47df5ee5c 100644 --- a/src/Contract/Test/Plutip.purs +++ b/src/Contract/Test/Plutip.purs @@ -2,6 +2,7 @@ -- | environment. module Contract.Test.Plutip ( testPlutipContracts + , defaultPlutipConfig , module X , PlutipTest ) where @@ -10,21 +11,14 @@ import Prelude import Contract.Monad (runContractInEnv) as X import Contract.Wallet (withKeyWallet) as X -import Ctl.Internal.Plutip.Server - ( runPlutipContract - , withPlutipContractEnv - ) as X +import Ctl.Internal.Contract.Hooks (emptyHooks) +import Ctl.Internal.Plutip.Server (runPlutipContract, withPlutipContractEnv) as X import Ctl.Internal.Plutip.Server (testPlutipContracts) as Server import Ctl.Internal.Plutip.Types (PlutipConfig) -import Ctl.Internal.Plutip.Types - ( PlutipConfig - ) as X +import Ctl.Internal.Plutip.Types (PlutipConfig) as X import Ctl.Internal.Test.ContractTest (ContractTest) import Ctl.Internal.Test.ContractTest (ContractTest) as Server -import Ctl.Internal.Test.ContractTest - ( noWallet - , withWallets - ) as X +import Ctl.Internal.Test.ContractTest (noWallet, withWallets) as X import Ctl.Internal.Test.UtxoDistribution ( class UtxoDistribution , InitialUTxODistribution @@ -33,6 +27,10 @@ import Ctl.Internal.Test.UtxoDistribution , UtxoAmount , withStakeKey ) as X +import Data.Log.Level (LogLevel(Trace)) +import Data.Maybe (Maybe(Nothing)) +import Data.Time.Duration (Seconds(Seconds)) +import Data.UInt as UInt import Effect.Aff (Aff) import Mote (MoteT) @@ -45,3 +43,33 @@ testPlutipContracts = Server.testPlutipContracts -- | Type synonym for backwards compatibility. type PlutipTest = ContractTest + +-- | A default value for `PlutipConfig` type. +defaultPlutipConfig :: PlutipConfig +defaultPlutipConfig = + { host: "127.0.0.1" + , port: UInt.fromInt 8082 + , logLevel: Trace + -- Server configs are used to deploy the corresponding services. + , ogmiosConfig: + { port: UInt.fromInt 1338 + , host: "127.0.0.1" + , secure: false + , path: Nothing + } + , kupoConfig: + { port: UInt.fromInt 1443 + , host: "127.0.0.1" + , secure: false + , path: Nothing + } + , suppressLogs: true + , customLogger: Nothing + , hooks: emptyHooks + , clusterConfig: + { slotLength: Seconds 0.1 + , epochSize: Nothing + , maxTxSize: Nothing + , raiseExUnitsToMax: false + } + } diff --git a/src/Contract/Test/Utils.js b/src/Contract/Test/Utils.js index a9592efa5..aab2e892a 100644 --- a/src/Contract/Test/Utils.js +++ b/src/Contract/Test/Utils.js @@ -1,3 +1,5 @@ -exports.exitCode = code => () => { - process.exitCode = code; -}; +export function exitCode(code) { + return () => { + process.exitCode = code; + }; +} diff --git a/src/Contract/Test/Utils.purs b/src/Contract/Test/Utils.purs index c1eafe197..8ad509696 100644 --- a/src/Contract/Test/Utils.purs +++ b/src/Contract/Test/Utils.purs @@ -17,7 +17,7 @@ import Node.Process as Process foreign import exitCode :: Int -> Effect Unit --- | Attaches a custom handler on SIGINt to kill the fiber. +-- | Attaches a custom handler on SIGINT to kill the fiber. -- | see https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/plutip-testing.md#note-on-sigint interruptOnSignal :: forall a. Signal -> Fiber a -> Effect Unit interruptOnSignal signal fiber = Process.onSignal signal do diff --git a/src/Contract/Time.purs b/src/Contract/Time.purs index 726fb8578..0fc401650 100644 --- a/src/Contract/Time.purs +++ b/src/Contract/Time.purs @@ -3,6 +3,8 @@ module Contract.Time ( getCurrentEpoch , getEraSummaries , getSystemStart + , getCurrentEra + , normalizeTimeInterval , module Chain , module ExportEraSummaries , module ExportOgmios @@ -13,16 +15,13 @@ module Contract.Time import Prelude -import Contract.Chain - ( BlockHeaderHash(BlockHeaderHash) - , ChainTip(ChainTip) - , Tip(Tip, TipAtGenesis) - , getTip - ) as Chain -import Contract.Monad (Contract, liftedE) +import Contract.Chain (getTip) as Chain +import Contract.Log (logInfo') +import Contract.Monad (Contract, liftContractM, liftedE) import Control.Monad.Reader.Class (asks) import Ctl.Internal.Cardano.Types.Transaction (Epoch(Epoch)) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract (getChainTip) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.Helpers (liftM) import Ctl.Internal.QueryM.Ogmios (CurrentEpoch(CurrentEpoch)) import Ctl.Internal.QueryM.Ogmios @@ -30,6 +29,12 @@ import Ctl.Internal.QueryM.Ogmios , OgmiosEraSummaries(OgmiosEraSummaries) ) as ExportOgmios import Ctl.Internal.Serialization.Address (BlockId(BlockId), Slot(Slot)) as SerializationAddress +import Ctl.Internal.Serialization.Address (Slot) +import Ctl.Internal.Types.Chain + ( BlockHeaderHash(BlockHeaderHash) + , ChainTip(ChainTip) + , Tip(TipAtGenesis, Tip) + ) as Chain import Ctl.Internal.Types.EraSummaries ( EpochLength(EpochLength) , EraSummaries(EraSummaries) @@ -39,12 +44,15 @@ import Ctl.Internal.Types.EraSummaries , SafeZone(SafeZone) , SlotLength(SlotLength) ) as ExportEraSummaries -import Ctl.Internal.Types.EraSummaries (EraSummaries) +import Ctl.Internal.Types.EraSummaries + ( EraSummaries + , EraSummary + ) import Ctl.Internal.Types.Interval ( AbsTime(AbsTime) , Closure , Extended(NegInf, Finite, PosInf) - , Interval + , Interval(FiniteInterval) , LowerBound(LowerBound) , ModTime(ModTime) , OnchainPOSIXTimeRange(OnchainPOSIXTimeRange) @@ -55,7 +63,6 @@ import Ctl.Internal.Types.Interval , PosixTimeBeforeSystemStart , StartTimeGreaterThanTime , EndSlotLessThanSlotOrModNonZero - , CannotGetBigIntFromNumber' ) , RelTime(RelTime) , SlotRange @@ -97,10 +104,75 @@ import Ctl.Internal.Types.Interval ) as Interval import Ctl.Internal.Types.SystemStart (SystemStart) import Ctl.Internal.Types.SystemStart (SystemStart(SystemStart)) as ExportSystemStart -import Data.BigInt as BigInt +import Data.Array as Array +import Data.Foldable (find) +import Data.Maybe (Maybe(Just, Nothing)) +import Data.Newtype (unwrap) import Data.UInt as UInt +import Effect.Aff (delay) import Effect.Aff.Class (liftAff) import Effect.Exception (error) +import JS.BigInt as BigInt + +-- | Get a summary of the current era. +getCurrentEra :: Contract EraSummary +getCurrentEra = do + eraSummaries <- getEraSummaries + currentSlot <- getCurrentSlot + logInfo' $ "getCurrentEra: era summaries: " <> show eraSummaries + logInfo' $ "getCurrentEra: current slot: " <> show currentSlot + liftContractM "getCurrentEra: Could not find era summary" + $ find (slotInRange currentSlot) + $ Array.sortBy (comparing getStartSlot) + $ unwrap eraSummaries + where + getStartSlot :: EraSummary -> Slot + getStartSlot = unwrap >>> _.start >>> unwrap >>> _.slot + + slotInRange :: Slot -> EraSummary -> Boolean + slotInRange currentSlot era = + let + eraStartSlot = getStartSlot era + startNotAfterUs = eraStartSlot <= currentSlot + in + case era # unwrap # _.end of + Nothing -> startNotAfterUs + Just eraEnd -> startNotAfterUs && + ( (eraEnd # unwrap # _.slot) > + currentSlot + ) + + getCurrentSlot :: Contract Slot + getCurrentSlot = do + { delay: delayMs } <- asks $ _.timeParams >>> _.awaitTxConfirmed + getChainTip >>= case _ of + Chain.TipAtGenesis -> do + liftAff $ delay delayMs + getCurrentSlot + Chain.Tip (Chain.ChainTip { slot }) -> pure slot + +-- | Given a desired range, tighten it to fit onchain. +normalizeTimeInterval + :: Interval.Interval Interval.POSIXTime + -> Contract (Interval.Interval Interval.POSIXTime) +normalizeTimeInterval = case _ of + desired@(Interval.FiniteInterval start end) -> do + era <- getCurrentEra + let params = unwrap (unwrap era).parameters + slotLength <- liftContractM "Could not get slot length" $ BigInt.fromNumber + $ unwrap params.slotLength + let offset = unwrap params.safeZone + slotLength + let endTime = start + Interval.POSIXTime offset + let oneSecond = Interval.POSIXTime $ BigInt.fromInt 1_000 + let + range = Interval.FiniteInterval (start + oneSecond) + (min end (endTime - oneSecond)) + logInfo' $ "normalizeTimeInterval: desired range: " <> show desired + logInfo' $ "normalizeTimeInterval: computed range: " <> show range + pure range + i -> liftContractM + ("normalizeTimeInterval: could not convert to start-end range: " <> show i) + Nothing -- | Get the current Epoch. getCurrentEpoch :: Contract Epoch diff --git a/src/Contract/Transaction.purs b/src/Contract/Transaction.purs index 9966627de..ecbb79892 100644 --- a/src/Contract/Transaction.purs +++ b/src/Contract/Transaction.purs @@ -3,8 +3,9 @@ module Contract.Transaction ( BalancedSignedTransaction(BalancedSignedTransaction) , balanceTx - , balanceTxM + , balanceTxE , balanceTxWithConstraints + , balanceTxWithConstraintsE , balanceTxs , balanceTxsWithConstraints , calculateMinFee @@ -17,12 +18,9 @@ module Contract.Transaction , module OutputDatum , module PTransaction , module PTransactionUnspentOutput - , module ReindexRedeemersExport - , module ScriptLookups , module ScriptRef , module Scripts , module Transaction - , module UnbalancedTx , module X , signTransaction , submit @@ -43,19 +41,13 @@ import Contract.Metadata (GeneralTransactionMetadata) import Contract.Monad ( Contract , liftContractM - , liftedE - , liftedM , runContractInEnv ) -import Contract.PlutusData (class IsData) -import Contract.ScriptLookups (mkUnbalancedTx) -import Contract.Scripts (class ValidatorTypes) import Contract.TxConstraints (TxConstraints) +import Contract.UnbalancedTx (mkUnbalancedTx) import Control.Monad.Error.Class (catchError, liftEither, throwError) import Control.Monad.Reader (ReaderT, asks, runReaderT) import Control.Monad.Reader.Class (ask) -import Ctl.Internal.BalanceTx (FinalizedTransaction) -import Ctl.Internal.BalanceTx (FinalizedTransaction(FinalizedTransaction)) as FinalizedTransaction import Ctl.Internal.BalanceTx (balanceTxWithConstraints) as BalanceTx import Ctl.Internal.BalanceTx.Constraints (BalanceTxConstraintsBuilder) import Ctl.Internal.BalanceTx.Error @@ -63,8 +55,8 @@ import Ctl.Internal.BalanceTx.Error , BalanceTxError ( BalanceInsufficientError , CouldNotConvertScriptOutputToTxInput - , CouldNotGetChangeAddress , CouldNotGetCollateral + , InsufficientCollateralUtxos , CouldNotGetUtxos , CollateralReturnError , CollateralReturnMinAdaValueCalcError @@ -75,9 +67,11 @@ import Ctl.Internal.BalanceTx.Error , UtxoMinAdaValueCalculationFailed ) , Expected(Expected) - , ImpossibleError(Impossible) - , InvalidInContext(InvalidInContext) + , explainBalanceTxError ) as BalanceTxError +import Ctl.Internal.BalanceTx.Types (FinalizedTransaction) +import Ctl.Internal.BalanceTx.Types (FinalizedTransaction(FinalizedTransaction)) as FinalizedTransaction +import Ctl.Internal.BalanceTx.UnattachedTx (UnindexedTx) import Ctl.Internal.Cardano.Types.NativeScript ( NativeScript ( ScriptPubkey @@ -171,7 +165,7 @@ import Ctl.Internal.Contract.AwaitTxConfirmed , isTxConfirmed ) as X import Ctl.Internal.Contract.MinFee (calculateMinFee) as Contract -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.Contract.QueryHandle.Error (GetTxMetadataError) import Ctl.Internal.Contract.QueryHandle.Error ( GetTxMetadataError @@ -200,10 +194,7 @@ import Ctl.Internal.Plutus.Types.TransactionUnspentOutput , mkTxUnspentOut ) as PTransactionUnspentOutput import Ctl.Internal.Plutus.Types.Value (Coin) -import Ctl.Internal.ReindexRedeemers - ( ReindexErrors(CannotGetTxOutRefIndexForRedeemer) - ) as ReindexRedeemersExport -import Ctl.Internal.ReindexRedeemers (reindexSpentScriptRedeemers) as X +import Ctl.Internal.ProcessConstraints.UnbalancedTx (UnbalancedTx(UnbalancedTx)) import Ctl.Internal.Serialization (convertTransaction) import Ctl.Internal.Types.OutputDatum ( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum) @@ -217,34 +208,7 @@ import Ctl.Internal.Types.RewardAddress , rewardAddressToBech32 , rewardAddressToBytes ) as X -import Ctl.Internal.Types.ScriptLookups - ( MkUnbalancedTxError - ( TypeCheckFailed - , ModifyTx - , TxOutRefNotFound - , TxOutRefWrongType - , DatumNotFound - , MintingPolicyNotFound - , MintingPolicyHashNotCurrencySymbol - , CannotMakeValue - , ValidatorHashNotFound - , OwnPubKeyAndStakeKeyMissing - , TypedValidatorMissing - , DatumWrongHash - , CannotQueryDatum - , CannotHashDatum - , CannotConvertPOSIXTimeRange - , CannotGetMintingPolicyScriptIndex - , CannotGetValidatorHashFromAddress - , TypedTxOutHasNoDatumHash - , CannotHashMintingPolicy - , CannotHashValidator - , CannotConvertPaymentPubKeyHash - , CannotSatisfyAny - ) - , ScriptLookups - ) as ScriptLookups -import Ctl.Internal.Types.ScriptLookups (UnattachedUnbalancedTx) +import Ctl.Internal.Types.ScriptLookups (ScriptLookups) import Ctl.Internal.Types.Scripts ( Language(PlutusV1, PlutusV2) , plutusV1Script @@ -259,12 +223,6 @@ import Ctl.Internal.Types.Transaction ( TransactionHash , TransactionInput(TransactionInput) ) -import Ctl.Internal.Types.UnbalancedTransaction - ( UnbalancedTx(UnbalancedTx) - , _transaction - , _utxoIndex - , emptyUnbalancedTx - ) as UnbalancedTx import Ctl.Internal.Types.UsedTxOuts ( UsedTxOuts , lockTransactionInputs @@ -277,13 +235,12 @@ import Ctl.Internal.Types.VRFKeyHash ) as X import Data.Array.NonEmpty as NonEmptyArray import Data.Bifunctor (lmap) -import Data.BigInt (BigInt) -import Data.Either (Either, hush) +import Data.Either (Either(Left, Right)) import Data.Foldable (foldl, length) import Data.Generic.Rep (class Generic) import Data.Lens.Getter (view) +import Data.Map (Map) import Data.Map (empty, insert) as Map -import Data.Maybe (Maybe) import Data.Newtype (class Newtype, unwrap) import Data.Show.Generic (genericShow) import Data.Traversable (class Traversable, for_, traverse) @@ -294,6 +251,7 @@ import Effect.Aff (bracket, error) import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) import Effect.Exception (try) +import JS.BigInt (BigInt) -- | Signs a transaction with potential failure. signTransaction @@ -303,7 +261,6 @@ signTransaction -> Contract BalancedSignedTransaction signTransaction = map BalancedSignedTransaction - <<< liftedM "Error signing the transaction" <<< Contract.signTransaction <<< unwrap @@ -392,7 +349,7 @@ withSingleTransaction prepare extract utx action = -- | Errors will be thrown. withBalancedTxsWithConstraints :: forall (a :: Type) - . Array (UnattachedUnbalancedTx /\ BalanceTxConstraintsBuilder) + . Array (UnbalancedTx /\ BalanceTxConstraintsBuilder) -> (Array FinalizedTransaction -> Contract a) -> Contract a withBalancedTxsWithConstraints = @@ -402,7 +359,7 @@ withBalancedTxsWithConstraints = -- | constraints. withBalancedTxs :: forall (a :: Type) - . Array UnattachedUnbalancedTx + . Array UnbalancedTx -> (Array FinalizedTransaction -> Contract a) -> Contract a withBalancedTxs = withTransactions balanceTxs unwrap @@ -415,7 +372,7 @@ withBalancedTxs = withTransactions balanceTxs unwrap -- | Errors will be thrown. withBalancedTxWithConstraints :: forall (a :: Type) - . UnattachedUnbalancedTx + . UnbalancedTx -> BalanceTxConstraintsBuilder -> (FinalizedTransaction -> Contract a) -> Contract a @@ -427,26 +384,68 @@ withBalancedTxWithConstraints unbalancedTx = -- | constraints. withBalancedTx :: forall (a :: Type) - . UnattachedUnbalancedTx + . UnbalancedTx -> (FinalizedTransaction -> Contract a) -> Contract a withBalancedTx = withSingleTransaction balanceAndLock unwrap --- | Attempts to balance an `UnattachedUnbalancedTx` using the specified +unUnbalancedTx + :: UnbalancedTx -> UnindexedTx /\ Map TransactionInput TransactionOutput +unUnbalancedTx + ( UnbalancedTx + { transaction + , datums + , redeemers + , usedUtxos + } + ) = + { transaction, datums, redeemers } /\ usedUtxos + +-- | Attempts to balance an `UnbalancedTx` using the specified -- | balancer constraints. -balanceTxWithConstraints - :: UnattachedUnbalancedTx +-- | +-- | `balanceTxWithConstraints` is a throwing variant. +balanceTxWithConstraintsE + :: UnbalancedTx -> BalanceTxConstraintsBuilder -> Contract (Either BalanceTxError.BalanceTxError FinalizedTransaction) -balanceTxWithConstraints = - BalanceTx.balanceTxWithConstraints +balanceTxWithConstraintsE tx = + let + tx' /\ ix = unUnbalancedTx tx + in + BalanceTx.balanceTxWithConstraints tx' ix --- | Same as `balanceTxWithConstraints`, but uses the default balancer --- | constraints. -balanceTx - :: UnattachedUnbalancedTx +-- | Attempts to balance an `UnbalancedTx` using the specified +-- | balancer constraints. +-- | +-- | 'Throwing' variant of `balanceTxWithConstraintsE`. +balanceTxWithConstraints + :: UnbalancedTx + -> BalanceTxConstraintsBuilder + -> Contract FinalizedTransaction +balanceTxWithConstraints tx bcb = do + result <- balanceTxWithConstraintsE tx bcb + case result of + Left err -> throwError $ error $ BalanceTxError.explainBalanceTxError err + Right ftx -> pure ftx + +-- | Balance a transaction without providing balancer constraints. +-- | +-- | `balanceTx` is a throwing variant. +balanceTxE + :: UnbalancedTx -> Contract (Either BalanceTxError.BalanceTxError FinalizedTransaction) -balanceTx = flip balanceTxWithConstraints mempty +balanceTxE = flip balanceTxWithConstraintsE mempty + +-- | Balance a transaction without providing balancer constraints. +-- | +-- | `balanceTxE` is a non-throwing version of this function. +balanceTx :: UnbalancedTx -> Contract FinalizedTransaction +balanceTx utx = do + result <- balanceTxE utx + case result of + Left err -> throwError $ error $ BalanceTxError.explainBalanceTxError err + Right ftx -> pure ftx -- | Balances each transaction using specified balancer constraint sets and -- | locks the used inputs so that they cannot be reused by subsequent @@ -454,7 +453,7 @@ balanceTx = flip balanceTxWithConstraints mempty balanceTxsWithConstraints :: forall (t :: Type -> Type) . Traversable t - => t (UnattachedUnbalancedTx /\ BalanceTxConstraintsBuilder) + => t (UnbalancedTx /\ BalanceTxConstraintsBuilder) -> Contract (t FinalizedTransaction) balanceTxsWithConstraints unbalancedTxs = unlockAllOnError $ traverse balanceAndLockWithConstraints unbalancedTxs @@ -465,36 +464,29 @@ balanceTxsWithConstraints unbalancedTxs = withUsedTxOuts <<< unlockTransactionInputs <<< uutxToTx <<< fst throwError e - uutxToTx :: UnattachedUnbalancedTx -> Transaction - uutxToTx = _.transaction <<< unwrap <<< _.unbalancedTx <<< unwrap + uutxToTx :: UnbalancedTx -> Transaction + uutxToTx = _.transaction <<< unwrap -- | Same as `balanceTxsWithConstraints`, but uses the default balancer -- | constraints. balanceTxs :: forall (t :: Type -> Type) . Traversable t - => t UnattachedUnbalancedTx + => t UnbalancedTx -> Contract (t FinalizedTransaction) balanceTxs = balanceTxsWithConstraints <<< map (flip Tuple mempty) --- | Attempts to balance an `UnattachedUnbalancedTx` hushing the error. -balanceTxM - :: UnattachedUnbalancedTx - -> Contract (Maybe FinalizedTransaction) -balanceTxM = map hush <<< balanceTx - balanceAndLockWithConstraints - :: UnattachedUnbalancedTx /\ BalanceTxConstraintsBuilder + :: UnbalancedTx /\ BalanceTxConstraintsBuilder -> Contract FinalizedTransaction balanceAndLockWithConstraints (unbalancedTx /\ constraints) = do - balancedTx <- - liftedE $ balanceTxWithConstraints unbalancedTx constraints + balancedTx <- balanceTxWithConstraints unbalancedTx constraints void $ withUsedTxOuts $ lockTransactionInputs (unwrap balancedTx) pure balancedTx balanceAndLock - :: UnattachedUnbalancedTx + :: UnbalancedTx -> Contract FinalizedTransaction balanceAndLock = balanceAndLockWithConstraints <<< flip Tuple mempty @@ -550,29 +542,19 @@ createAdditionalUtxos tx = do foldl (\utxo txOut -> Map.insert (txIn $ length utxo) txOut utxo) Map.empty submitTxFromConstraintsReturningFee - :: forall (validator :: Type) (datum :: Type) - (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups.ScriptLookups validator - -> TxConstraints redeemer datum + :: ScriptLookups + -> TxConstraints -> Contract { txHash :: TransactionHash, txFinalFee :: BigInt } submitTxFromConstraintsReturningFee lookups constraints = do - unbalancedTx <- liftedE $ mkUnbalancedTx lookups constraints - balancedTx <- liftedE $ balanceTx unbalancedTx + unbalancedTx <- mkUnbalancedTx lookups constraints + balancedTx <- balanceTx unbalancedTx balancedSignedTx <- signTransaction balancedTx txHash <- submit balancedSignedTx pure { txHash, txFinalFee: getTxFinalFee balancedSignedTx } submitTxFromConstraints - :: forall (validator :: Type) (datum :: Type) - (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups.ScriptLookups validator - -> TxConstraints redeemer datum + :: ScriptLookups + -> TxConstraints -> Contract TransactionHash submitTxFromConstraints lookups constraints = _.txHash <$> submitTxFromConstraintsReturningFee lookups constraints diff --git a/src/Contract/TxConstraints.purs b/src/Contract/TxConstraints.purs index 12cd07f0f..0ccfdde20 100644 --- a/src/Contract/TxConstraints.purs +++ b/src/Contract/TxConstraints.purs @@ -8,7 +8,6 @@ import Ctl.Internal.Types.TxConstraints , InputWithScriptRef(RefInput, SpendInput) , OutputConstraint(OutputConstraint) , TxConstraints(TxConstraints) - , addTxIn , isSatisfiable , mustBeSignedBy , mustDelegateStakeNativeScript diff --git a/src/Contract/UnbalancedTx.purs b/src/Contract/UnbalancedTx.purs new file mode 100644 index 000000000..1bb9ceec5 --- /dev/null +++ b/src/Contract/UnbalancedTx.purs @@ -0,0 +1,69 @@ +-- | A module for creating off-chain script lookups, and an unbalanced +-- | transaction. +module Contract.UnbalancedTx + ( mkUnbalancedTx + , mkUnbalancedTxE + , module X + ) where + +import Prelude + +import Contract.Monad (Contract) +import Control.Monad.Error.Class (throwError) +import Ctl.Internal.ProcessConstraints (mkUnbalancedTxImpl) as PC +import Ctl.Internal.ProcessConstraints.Error + ( MkUnbalancedTxError + , explainMkUnbalancedTxError + ) +import Ctl.Internal.ProcessConstraints.Error + ( MkUnbalancedTxError + ( CannotFindDatum + , CannotQueryDatum + , CannotConvertPOSIXTimeRange + , CannotSolveTimeConstraints + , CannotGetMintingPolicyScriptIndex + , CannotGetValidatorHashFromAddress + , CannotMakeValue + , CannotWithdrawRewardsPubKey + , CannotWithdrawRewardsPlutusScript + , CannotWithdrawRewardsNativeScript + , DatumNotFound + , DatumWrongHash + , MintingPolicyHashNotCurrencySymbol + , MintingPolicyNotFound + , OwnPubKeyAndStakeKeyMissing + , TxOutRefNotFound + , TxOutRefWrongType + , WrongRefScriptHash + , ValidatorHashNotFound + , CannotSatisfyAny + , ExpectedPlutusScriptGotNativeScript + , CannotMintZero + ) + , explainMkUnbalancedTxError + ) as X +import Ctl.Internal.ProcessConstraints.UnbalancedTx (UnbalancedTx) +import Ctl.Internal.ProcessConstraints.UnbalancedTx (UnbalancedTx(UnbalancedTx)) as X +import Ctl.Internal.Types.ScriptLookups (ScriptLookups) +import Ctl.Internal.Types.TxConstraints (TxConstraints) +import Data.Either (Either(Left, Right)) +import Effect.Exception (error) + +-- | Create an `UnbalancedTx` given `ScriptLookups` and +-- | `TxConstraints`. This should be called in conjuction with +-- | `balanceTx` and `signTransaction`. +-- | +-- | This is a 'non-throwing' variant; if you need the 'throwing' variant, use +-- | `mkUnbalancedTx` instead. +mkUnbalancedTxE + :: ScriptLookups + -> TxConstraints + -> Contract (Either MkUnbalancedTxError UnbalancedTx) +mkUnbalancedTxE = PC.mkUnbalancedTxImpl + +-- | As `mkUnbalancedTxE`, but 'throwing'. +mkUnbalancedTx :: ScriptLookups -> TxConstraints -> Contract UnbalancedTx +mkUnbalancedTx lookups constraints = + mkUnbalancedTxE lookups constraints >>= case _ of + Left err -> throwError $ error $ explainMkUnbalancedTxError err + Right res -> pure res diff --git a/src/Contract/Utxos.purs b/src/Contract/Utxos.purs index dc5efb861..6064192d1 100644 --- a/src/Contract/Utxos.purs +++ b/src/Contract/Utxos.purs @@ -3,44 +3,60 @@ -- | a given `Address` is defined. module Contract.Utxos ( getUtxo - , getWalletBalance - , getWalletUtxos , utxosAt , module X ) where import Prelude +import Contract.Log (logWarn') import Contract.Monad (Contract, liftContractM, liftedE) import Contract.Prelude (for) -import Contract.Transaction (TransactionInput, TransactionOutput) import Control.Monad.Reader.Class (asks) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) -import Ctl.Internal.Contract.Wallet (getWalletBalance, getWalletUtxos) as Utxos +import Ctl.Internal.BalanceTx.Sync (getControlledAddresses, isCip30Wallet) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.Plutus.Conversion ( fromPlutusAddress , toPlutusTxOutput , toPlutusUtxoMap ) -import Ctl.Internal.Plutus.Conversion.Value (toPlutusValue) import Ctl.Internal.Plutus.Types.Address (class PlutusAddress, getAddress) -import Ctl.Internal.Plutus.Types.Transaction (UtxoMap) +import Ctl.Internal.Plutus.Types.Transaction (TransactionOutput, UtxoMap) import Ctl.Internal.Plutus.Types.Transaction (UtxoMap) as X -import Ctl.Internal.Plutus.Types.Value (Value) +import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Maybe (Maybe) +import Data.Set (member) as Set import Effect.Aff.Class (liftAff) --- | Queries for utxos at the given Plutus `Address`. +-- | Queries for UTxOs at the given `Address`. +-- | +-- | **Note**: calling `utxosAt` on an address controlled by the light +-- | wallet may result in hard-to-debug problems with wallet interactions. +-- | The developers should not assume that all UTxOs that are available on +-- | wallet addresses are actually spendable. See the docs for UTxO locking +-- | in `doc/query-layers.md`. Using `getWalletUtxos` is a way to avoid the +-- | potential problems. This function will raise a warning in the logs if +-- | wallet address is used. utxosAt :: forall (address :: Type) . PlutusAddress address => address -> Contract UtxoMap -utxosAt address = do +utxosAt addressAny = do networkId <- asks _.networkId + let address = fromPlutusAddress networkId $ getAddress addressAny queryHandle <- getQueryHandle - let cardanoAddr = fromPlutusAddress networkId (getAddress address) - cardanoUtxoMap <- liftedE $ liftAff $ queryHandle.utxosAt cardanoAddr + whenM isCip30Wallet do + walletAddresses <- getControlledAddresses + when (address `Set.member` walletAddresses) do + logWarn' $ + "utxosAt: you are calling `utxosAt` on an address controlled by the" + <> " wallet. This may result in hard-to-debug problems with wallet " + <> "interactions. The developers should not assume that all UTxOs " + <> "that are available on wallet addresses are actually spendable. " + <> "See the docs for UTxO locking in `doc/query-layers.md`. Using " + <> "`getWalletUtxos` is a way to avoid the potential problems." + cardanoUtxoMap <- liftedE $ liftAff $ queryHandle.utxosAt address liftContractM "utxosAt: failed to convert utxos" $ toPlutusUtxoMap cardanoUtxoMap @@ -54,21 +70,3 @@ getUtxo oref = do cardanoTxOutput <- liftedE $ liftAff $ queryHandle.getUtxoByOref oref for cardanoTxOutput (liftContractM "getUtxo: failed to convert tx output" <<< toPlutusTxOutput) - -getWalletBalance - :: Contract (Maybe Value) -getWalletBalance = Utxos.getWalletBalance <#> map toPlutusValue - --- | Similar to `utxosAt` called on own address, except that it uses CIP-30 --- | wallet state and not query layer state. --- | The user should not expect these states to be in sync. --- | When active wallet is `KeyWallet`, query layer state is used. --- | This function is expected to be more performant than `utxosAt` when there --- | is a large number of assets. -getWalletUtxos - :: Contract (Maybe UtxoMap) -getWalletUtxos = do - mCardanoUtxos <- Utxos.getWalletUtxos - for mCardanoUtxos $ - liftContractM "getWalletUtxos: unable to deserialize UTxOs" <<< - toPlutusUtxoMap diff --git a/src/Contract/Wallet.purs b/src/Contract/Wallet.purs index db283b5f4..cf2dbeead 100644 --- a/src/Contract/Wallet.purs +++ b/src/Contract/Wallet.purs @@ -2,76 +2,266 @@ module Contract.Wallet ( mkKeyWalletFromPrivateKeys , withKeyWallet - , module Contract.Address - , module Contract.Utxos + , withKeyWalletFromMnemonic + , ownStakePubKeyHash + , ownPaymentPubKeyHash + , getWalletBalance + , getWalletUtxos + , getWalletCollateral + , getWalletAddress + , getWalletAddresses + , getWalletAddressWithNetworkTag + , getWalletAddressesWithNetworkTag , module X - , module Deserialization.Keys - , module Wallet - , module Ctl.Internal.Wallet.Key - , module Ctl.Internal.Wallet.KeyFile - , module Ctl.Internal.Wallet.Spec ) where import Prelude -import Contract.Address (getWalletAddress, getWalletCollateral) -import Contract.Monad (Contract) -import Contract.Utxos (getWalletUtxos) as Contract.Utxos -import Control.Monad.Reader (local) +import Contract.Address + ( Address + , AddressWithNetworkTag + , PaymentPubKeyHash + , StakePubKeyHash + ) +import Contract.Config (PrivatePaymentKey, PrivateStakeKey) +import Contract.Log (logTrace') +import Contract.Monad (Contract, liftContractM, liftedM) +import Contract.Sync (syncBackendWithWallet, withoutSync) +import Contract.Transaction (TransactionUnspentOutput) +import Contract.Utxos (UtxoMap) +import Contract.Value (Value) +import Contract.Value as Value +import Contract.Wallet.Key (KeyWallet, privateKeysToKeyWallet) +import Control.Monad.Error.Class (liftEither) +import Control.Monad.Reader (asks, local) import Ctl.Internal.Contract.Wallet ( getChangeAddress , getRewardAddresses , getUnusedAddresses , getWallet + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes , signData ) as X -import Ctl.Internal.Deserialization.Keys (privateKeyFromBytes) as Deserialization.Keys +import Ctl.Internal.Contract.Wallet (getWalletUtxos) as Wallet +import Ctl.Internal.Contract.Wallet + ( ownPaymentPubKeyHashes + , ownStakePubKeyHashes + ) +import Ctl.Internal.Contract.Wallet as Contract +import Ctl.Internal.Deserialization.Keys (privateKeyFromBytes) as X +import Ctl.Internal.Helpers (liftM) +import Ctl.Internal.Plutus.Conversion + ( toPlutusAddress + , toPlutusTxUnspentOutput + , toPlutusUtxoMap + ) +import Ctl.Internal.Plutus.Conversion.Address (toPlutusAddressWithNetworkTag) +import Ctl.Internal.Wallet (Wallet(KeyWallet)) as Wallet import Ctl.Internal.Wallet - ( Wallet(Gero, Nami, Flint, Lode, Eternl, KeyWallet) + ( Wallet(KeyWallet, GenericCip30) , WalletExtension - , apiVersion - , icon - , isEnabled - , isEternlAvailable - , isFlintAvailable - , isGeroAvailable - , isLodeAvailable - , isNamiAvailable + ( NamiWallet + , GeroWallet + , FlintWallet + , EternlWallet + , LodeWallet + , LaceWallet + , NuFiWallet + , GenericCip30Wallet + ) , isWalletAvailable - , name - , walletToWalletExtension - ) as Wallet -import Ctl.Internal.Wallet (Wallet(KeyWallet)) -import Ctl.Internal.Wallet.Key (KeyWallet, privateKeysToKeyWallet) as Wallet + ) as X import Ctl.Internal.Wallet.Key - ( PrivatePaymentKey(PrivatePaymentKey) + ( KeyWallet + , PrivatePaymentKey(PrivatePaymentKey) , PrivateStakeKey(PrivateStakeKey) , privateKeysToKeyWallet + ) as X +import Ctl.Internal.Wallet.KeyFile (formatPaymentKey, formatStakeKey) as X +import Ctl.Internal.Wallet.Spec + ( Cip1852DerivationPath + , StakeKeyPresence + , mkKeyWalletFromMnemonic ) -import Ctl.Internal.Wallet.KeyFile (formatPaymentKey, formatStakeKey) import Ctl.Internal.Wallet.Spec - ( PrivatePaymentKeySource(PrivatePaymentKeyFile, PrivatePaymentKeyValue) + ( MnemonicSource(MnemonicString, MnemonicFile) + , PrivatePaymentKeySource(PrivatePaymentKeyFile, PrivatePaymentKeyValue) , PrivateStakeKeySource(PrivateStakeKeyFile, PrivateStakeKeyValue) , WalletSpec ( UseKeys + , UseMnemonic , ConnectToNami , ConnectToGero , ConnectToFlint , ConnectToLode + , ConnectToLace , ConnectToEternl + , ConnectToNuFi + , ConnectToGenericCip30 ) - ) -import Data.Maybe (Maybe(Just)) + ) as X +import Data.Array (head) +import Data.Bifunctor (lmap) +import Data.Foldable (fold, foldr) +import Data.Map as Map +import Data.Maybe (Maybe(Just), fromMaybe) +import Data.Newtype (unwrap) +import Data.Traversable (for, traverse) +import Data.Tuple.Nested ((/\)) +import Effect.Exception (error) +import Prim.TypeError (class Warn, Text) withKeyWallet :: forall (a :: Type) - . Wallet.KeyWallet + . KeyWallet -> Contract a -> Contract a withKeyWallet wallet = - local _ { wallet = Just $ KeyWallet wallet } + local _ { wallet = Just $ Wallet.KeyWallet wallet } + +withKeyWalletFromMnemonic + :: forall (a :: Type) + . String + -> Cip1852DerivationPath + -> StakeKeyPresence + -> Contract a + -> Contract a +withKeyWalletFromMnemonic mnemonic derivationPath stakeKeyPresence contract = do + keyWallet <- liftEither $ lmap (error <<< addNote) $ + mkKeyWalletFromMnemonic mnemonic derivationPath stakeKeyPresence + withKeyWallet keyWallet contract + where + addNote = append "withKeyWalletFromMnemonic: " mkKeyWalletFromPrivateKeys - :: PrivatePaymentKey -> Maybe PrivateStakeKey -> Wallet.KeyWallet + :: PrivatePaymentKey -> Maybe PrivateStakeKey -> KeyWallet mkKeyWalletFromPrivateKeys payment mbStake = privateKeysToKeyWallet payment mbStake + +-- | Get an `Address` of the browser wallet. +getWalletAddress + :: Warn + ( Text + "This function returns only one `Adress` even in case multiple `Adress`es are available. Use `getWalletAdresses` instead" + ) + => Contract (Maybe Address) +getWalletAddress = head <$> getWalletAddresses + +-- | Get all the `Address`es of the browser wallet. +getWalletAddresses :: Contract (Array Address) +getWalletAddresses = do + addresses <- Contract.getWalletAddresses + traverse + ( liftM + (error "getWalletAddresses: failed to deserialize `Address`") + <<< toPlutusAddress + ) + addresses + +-- | Get an `AddressWithNetworkTag` of the browser wallet. +getWalletAddressWithNetworkTag + :: Warn + ( Text + "This function returns only one `AddressWithNetworkTag` even in case multiple `AddressWithNetworkTag` are available. Use `getWalletAddressesWithNetworkTag` instead" + ) + => Contract (Maybe AddressWithNetworkTag) +getWalletAddressWithNetworkTag = head <$> getWalletAddressesWithNetworkTag + +-- | Get all the `AddressWithNetworkTag`s of the browser wallet discarding errors. +getWalletAddressesWithNetworkTag :: Contract (Array AddressWithNetworkTag) +getWalletAddressesWithNetworkTag = do + addresses <- Contract.getWalletAddresses + traverse + ( liftM + ( error + "getWalletAddressesWithNetworkTag: failed to deserialize `Address`" + ) + <<< toPlutusAddressWithNetworkTag + ) + addresses + +-- | Gets a wallet `PaymentPubKeyHash` via `getWalletAddresses`. +ownPaymentPubKeyHash + :: Warn + ( Text + "This function returns only one `PaymentPubKeyHash` even in case multiple `PaymentPubKeysHash`es are available. Use `ownPaymentPubKeyHashes` instead" + ) + => Contract (Maybe PaymentPubKeyHash) +ownPaymentPubKeyHash = head <$> ownPaymentPubKeyHashes + +ownStakePubKeyHash + :: Warn + ( Text + "This function returns only one `StakePubKeyHash` even in case multiple `StakePubKeysHash`es are available. Use `ownStakePubKeyHashes` instead" + ) + => Contract (Maybe StakePubKeyHash) +ownStakePubKeyHash = join <<< head <$> ownStakePubKeyHashes + +-- | Similar to `utxosAt` called on own address, except that it uses CIP-30 +-- | wallet state and not query layer state. +-- | The user should not expect these states to be in sync. +-- | When active wallet is `KeyWallet`, query layer state is used. +-- | This function is expected to be more performant than `utxosAt` when there +-- | is a large number of assets. +getWalletUtxos + :: Contract (Maybe UtxoMap) +getWalletUtxos = do + logTrace' "getWalletUtxos" + whenM + ( asks $ + _.synchronizationParams + >>> _.syncBackendWithWallet + >>> _.beforeCip30Methods + ) + syncBackendWithWallet + mCardanoUtxos <- Wallet.getWalletUtxos + for mCardanoUtxos $ + liftContractM "getWalletUtxos: unable to deserialize UTxOs" <<< + toPlutusUtxoMap + +getWalletBalance + :: Contract (Maybe Value) +getWalletBalance = do + logTrace' "getWalletBalance" + whenM + ( asks $ _.synchronizationParams + >>> _.syncBackendWithWallet + >>> _.beforeCip30Methods + ) + syncBackendWithWallet + let + getUtxoValue = unwrap >>> _.output >>> unwrap >>> _.amount + sumValues = foldr (Value.unionWith add) mempty + -- include both spendable UTxOs and collateral + utxos <- getWalletUtxos <#> fromMaybe Map.empty + collateralUtxos <- withoutSync getWalletCollateral <#> fold >>> toUtxoMap + let allUtxos = Map.union utxos collateralUtxos + pure $ pure $ sumValues $ map getUtxoValue $ Map.values allUtxos + where + toUtxoMap = Map.fromFoldable <<< map + (unwrap >>> \({ input, output }) -> input /\ output) + +-- | Get the collateral of the browser wallet. This collateral will vary +-- | depending on the wallet. +-- | E.g. Nami creates a hard-coded 5 Ada collateral. +-- | Throws on `Promise` rejection by wallet, returns `Nothing` if no collateral +-- | is available. +getWalletCollateral + :: Contract (Maybe (Array TransactionUnspentOutput)) +getWalletCollateral = do + logTrace' "getWalletCollateral" + whenM + ( asks + ( _.synchronizationParams + >>> _.syncBackendWithWallet + >>> _.beforeCip30Methods + ) + ) + syncBackendWithWallet + mtxUnspentOutput <- Contract.getWalletCollateral + for mtxUnspentOutput $ traverse $ + liftedM + "getWalletCollateral: failed to deserialize TransactionUnspentOutput" + <<< pure + <<< toPlutusTxUnspentOutput diff --git a/src/Contract/Wallet/Key.purs b/src/Contract/Wallet/Key.purs index 4defcd9e6..cf5c33441 100644 --- a/src/Contract/Wallet/Key.purs +++ b/src/Contract/Wallet/Key.purs @@ -1,11 +1,25 @@ +-- | `KeyWallet` type and its utility functions. module Contract.Wallet.Key ( module X + , publicKeyFromPrivateKey ) where -import Ctl.Internal.Serialization.Keys (publicKeyFromPrivateKey) as X +import Prelude + +import Ctl.Internal.Cardano.Types.Transaction (PublicKey, mkFromCslPubKey) +import Ctl.Internal.Serialization.Keys (publicKeyFromPrivateKey) as Internal +import Ctl.Internal.Serialization.Types (PrivateKey) import Ctl.Internal.Wallet.Key ( KeyWallet(KeyWallet) , keyWalletPrivatePaymentKey , keyWalletPrivateStakeKey , privateKeysToKeyWallet ) as X +import Ctl.Internal.Wallet.Spec + ( Cip1852DerivationPath + , StakeKeyPresence(WithStakeKey, WithoutStakeKey) + , mkKeyWalletFromMnemonic + ) as X + +publicKeyFromPrivateKey :: PrivateKey -> PublicKey +publicKeyFromPrivateKey = mkFromCslPubKey <<< Internal.publicKeyFromPrivateKey diff --git a/src/Internal/Address.purs b/src/Internal/Address.purs index fd09718a4..746c8b23f 100644 --- a/src/Internal/Address.purs +++ b/src/Internal/Address.purs @@ -32,12 +32,12 @@ import Data.Maybe (Maybe) -------------------------------------------------------------------------------- -- Conversion between various address types -------------------------------------------------------------------------------- --- JsonWsp.Address is a bech32 string, so wrap to Transaction.Types.Bech32 --- | Converts an `JsonWsp.Address` (bech32string) to internal `Address` +-- JsonRpc2.Address is a bech32 string, so wrap to Transaction.Types.Bech32 +-- | Converts an `JsonRpc2.Address` (bech32string) to internal `Address` ogmiosAddressToAddress :: Ogmios.OgmiosAddress -> Maybe Address ogmiosAddressToAddress = addressFromBech32 --- | Converts an (internal) `Address` to `JsonWsp.Address` (bech32string) +-- | Converts an (internal) `Address` to `JsonRpc2.Address` (bech32string) addressToOgmiosAddress :: Address -> Ogmios.OgmiosAddress addressToOgmiosAddress = addressBech32 diff --git a/src/Internal/Affjax.js b/src/Internal/Affjax.js new file mode 100644 index 000000000..83a9091df --- /dev/null +++ b/src/Internal/Affjax.js @@ -0,0 +1,39 @@ +/* global BROWSER_RUNTIME */ + +export const driver = async () => { + if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { + return browserDriver; + } else { + return await nodeDriver(); + } +}; + +const browserDriver = { + newXHR: function () { + return new XMLHttpRequest(); + }, + fixupUrl: function (url) { + return url || "/"; + } +}; + +async function nodeDriver() { + const { default: XHR } = await import("xhr2"); + const { default: urllib } = await import("url"); + + return { + newXHR: function () { + return new XHR(); + }, + fixupUrl: function (url, xhr) { + if (xhr.nodejsBaseUrl === null) { + let u = urllib.parse(url); + u.protocol = u.protocol || "http:"; + u.hostname = u.hostname || "localhost"; + return urllib.format(u); + } else { + return url || "/"; + } + } + }; +} diff --git a/src/Internal/Affjax.purs b/src/Internal/Affjax.purs new file mode 100644 index 000000000..e50e9b7a2 --- /dev/null +++ b/src/Internal/Affjax.purs @@ -0,0 +1,35 @@ +module Ctl.Internal.Affjax + ( request + ) where + +import Prelude + +import Affjax (AffjaxDriver) +import Affjax (Error, Request, Response, request) as Affjax +import Control.Promise (Promise, toAffE) +import Data.Either (Either) +import Effect (Effect) +import Effect.Aff (Aff) + +foreign import driver :: Effect (Promise AffjaxDriver) + +-- | Makes an HTTP request. +-- | +-- | The example below performs a `GET` request to the URL `/resource` and +-- | interprets the response body as JSON. +-- | +-- | ```purescript +-- | import Affjax.ResponseFormat (json) +-- | ... +-- | request (defaultRequest { url = "/resource", method = Left GET, responseFormat = json}) +-- | ``` +-- | +-- | For common cases helper functions can often be used insteAX of `request` . +-- | For instance, the above example is equivalent to the following. +-- | +-- | ```purescript +-- | get json "/resource" +-- | ``` +request + :: forall a. Affjax.Request a -> Aff (Either Affjax.Error (Affjax.Response a)) +request req = toAffE driver >>= flip Affjax.request req diff --git a/src/Internal/ApplyArgs.js b/src/Internal/ApplyArgs.js index 1afe7de8d..9ff670298 100644 --- a/src/Internal/ApplyArgs.js +++ b/src/Internal/ApplyArgs.js @@ -3,14 +3,12 @@ let lib; let apply_args; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); - apply_args = require("apply-args-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); + apply_args = await import("apply-args-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); - apply_args = require("apply-args-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); + apply_args = await import("apply-args-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -apply_args = require("@mlabs-haskell/csl-gc-wrapper")(apply_args); /** * @param {} left @@ -19,23 +17,25 @@ apply_args = require("@mlabs-haskell/csl-gc-wrapper")(apply_args); * @param {PlutusScript} script * @returns {Either String PlutusScript} */ -exports.apply_params_to_script = left => right => args => script => { - let version = script.language_version(); - let appliedScript; - try { - let scriptBytes = script.bytes(); // raw bytes - let argsBytes = args.to_bytes(); // cbor - +export function apply_params_to_script(left) { + return right => args => script => { + let version = script.language_version(); + let appliedScript; try { - appliedScript = apply_args.apply_params_to_script_no_panic( - argsBytes, - scriptBytes - ); - } catch (e) { - return left("Error applying argument to script: ".concat(e.toString())); + let scriptBytes = script.bytes(); // raw bytes + let argsBytes = args.to_bytes(); // cbor + + try { + appliedScript = apply_args.apply_params_to_script_no_panic( + argsBytes, + scriptBytes + ); + } catch (e) { + return left("Error applying argument to script: ".concat(e.toString())); + } + } catch (e1) { + return left("Error serializing arguments: ".concat(e1.toString())); } - } catch (e1) { - return left("Error serializing arguments: ".concat(e1.toString())); - } - return right(lib.PlutusScript.new_with_version(appliedScript, version)); -}; + return right(lib.PlutusScript.new_with_version(appliedScript, version)); + }; +} diff --git a/src/Internal/BalanceTx/BalanceTx.purs b/src/Internal/BalanceTx/BalanceTx.purs index 45da66fa5..c9d95b8ba 100644 --- a/src/Internal/BalanceTx/BalanceTx.purs +++ b/src/Internal/BalanceTx/BalanceTx.purs @@ -1,14 +1,13 @@ module Ctl.Internal.BalanceTx - ( module BalanceTxErrorExport - , module FinalizedTransaction - , balanceTxWithConstraints + ( balanceTxWithConstraints ) where import Prelude -import Control.Monad.Error.Class (catchError, liftMaybe, throwError) +import Contract.Log (logWarn') import Control.Monad.Except.Trans (ExceptT(ExceptT), except, runExceptT) -import Control.Monad.Logger.Class (trace) as Logger +import Control.Monad.Logger.Class (info) as Logger +import Control.Monad.Reader (asks) import Control.Parallel (parTraverse) import Ctl.Internal.BalanceTx.CoinSelection ( SelectionState @@ -21,54 +20,43 @@ import Ctl.Internal.BalanceTx.Collateral ( addTxCollateral , addTxCollateralReturn ) -import Ctl.Internal.BalanceTx.Constraints (BalanceTxConstraintsBuilder) +import Ctl.Internal.BalanceTx.Collateral.Select (selectCollateral) +import Ctl.Internal.BalanceTx.Constraints + ( BalanceTxConstraintsBuilder + , _collateralUtxos + , _nonSpendableInputs + ) import Ctl.Internal.BalanceTx.Constraints ( _changeAddress + , _changeDatum , _maxChangeOutputTokenQuantity , _nonSpendableInputs , _selectionStrategy , _srcAddresses ) as Constraints -import Ctl.Internal.BalanceTx.Error - ( Actual(Actual) - , BalanceTxError - ( CouldNotGetChangeAddress - , CouldNotGetCollateral - , CouldNotGetUtxos - , ExUnitsEvaluationFailed - , ReindexRedeemersError - , UtxoLookupFailedFor - , UtxoMinAdaValueCalculationFailed - ) - , Expected(Expected) - , printTxEvaluationFailure - ) as BalanceTxErrorExport import Ctl.Internal.BalanceTx.Error ( BalanceTxError - ( CouldNotGetChangeAddress + ( UtxoLookupFailedFor + , UtxoMinAdaValueCalculationFailed + , ReindexRedeemersError + , InsufficientCollateralUtxos , CouldNotGetCollateral , CouldNotGetUtxos - , UtxoLookupFailedFor - , UtxoMinAdaValueCalculationFailed - , BalanceInsufficientError ) - , InvalidInContext(InvalidInContext) ) import Ctl.Internal.BalanceTx.ExUnitsAndMinFee ( evalExUnitsAndMinFee , finalizeTransaction ) -import Ctl.Internal.BalanceTx.Helpers - ( _body' - , _redeemersTxIns - , _transaction' - , _unbalancedTx +import Ctl.Internal.BalanceTx.RedeemerIndex + ( attachIndexedRedeemers + , indexRedeemers + , mkRedeemersContext ) +import Ctl.Internal.BalanceTx.Sync (isCip30Wallet, syncBackendWithWallet) import Ctl.Internal.BalanceTx.Types ( BalanceTxM , FinalizedTransaction - , PrebalancedTransaction - , askCip30Wallet , askCoinsPerUtxoUnit , askNetworkId , asksConstraints @@ -76,7 +64,12 @@ import Ctl.Internal.BalanceTx.Types , liftEitherContract , withBalanceTxConstraints ) -import Ctl.Internal.BalanceTx.Types (FinalizedTransaction(FinalizedTransaction)) as FinalizedTransaction +import Ctl.Internal.BalanceTx.UnattachedTx + ( EvaluatedTx + , UnindexedTx + , _transaction + , indexTx + ) import Ctl.Internal.BalanceTx.UtxoMinAda (utxoMinAdaValue) import Ctl.Internal.Cardano.Types.Transaction ( Certificate(StakeRegistration, StakeDeregistration) @@ -95,6 +88,10 @@ import Ctl.Internal.Cardano.Types.Transaction , _referenceInputs , _withdrawals , _witnessSet + , pprintUtxoMap + ) +import Ctl.Internal.Cardano.Types.TransactionUnspentOutput + ( transactionUnspentOutputsToUtxoMap ) import Ctl.Internal.Cardano.Types.Value ( AssetClass @@ -107,31 +104,35 @@ import Ctl.Internal.Cardano.Types.Value , minus , mkValue , posNonAdaAsset + , pprintValue , valueToCoin' ) import Ctl.Internal.Cardano.Types.Value as Value import Ctl.Internal.CoinSelection.UtxoIndex (UtxoIndex, buildUtxoIndex) import Ctl.Internal.Contract (getProtocolParameters) -import Ctl.Internal.Contract.Monad (Contract, filterLockedUtxos) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) -import Ctl.Internal.Contract.Wallet (getChangeAddress, getWalletAddresses) as Contract.Wallet -import Ctl.Internal.Contract.Wallet (getWalletCollateral) -import Ctl.Internal.Helpers ((??)) +import Ctl.Internal.Contract.Monad (Contract, filterLockedUtxos, getQueryHandle) +import Ctl.Internal.Contract.Wallet + ( getChangeAddress + , getWalletCollateral + , getWalletUtxos + ) as Wallet +import Ctl.Internal.Helpers (liftEither, pprintTagSet, (??)) import Ctl.Internal.Partition (equipartition, partition) -import Ctl.Internal.Plutus.Conversion (toPlutusValue) +import Ctl.Internal.Plutus.Conversion (fromPlutusUtxoMap) import Ctl.Internal.Serialization.Address (Address) import Ctl.Internal.Types.OutputDatum (OutputDatum(NoOutputDatum, OutputDatum)) -import Ctl.Internal.Types.ScriptLookups (UnattachedUnbalancedTx) +import Ctl.Internal.Types.ProtocolParameters + ( ProtocolParameters(ProtocolParameters) + ) import Ctl.Internal.Types.Scripts ( Language(PlutusV1) , PlutusScript(PlutusScript) ) -import Ctl.Internal.Types.UnbalancedTransaction (_utxoIndex) +import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Array as Array import Data.Array.NonEmpty (NonEmptyArray) import Data.Array.NonEmpty - ( cons' - , fromArray + ( fromArray , replicate , singleton , sortWith @@ -141,97 +142,162 @@ import Data.Array.NonEmpty , zipWith ) as NEArray import Data.Array.NonEmpty as NEA -import Data.BigInt (BigInt) +import Data.Bifunctor (lmap) import Data.Either (Either, hush, note) import Data.Foldable (fold, foldMap, foldr, length, null, sum) import Data.Function (on) import Data.Lens.Getter ((^.)) import Data.Lens.Setter ((%~), (.~), (?~)) -import Data.Log.Tag (TagSet) -import Data.Log.Tag (fromArray, tag) as TagSet -import Data.Map (empty, insert, lookup, toUnfoldable, union) as Map +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag (fromArray) as TagSet +import Data.Map (Map) +import Data.Map (empty, filterKeys, insert, lookup, toUnfoldable, union) as Map import Data.Maybe (Maybe(Just, Nothing), fromMaybe, isJust, maybe) import Data.Newtype (class Newtype, unwrap, wrap) +import Data.Set (Set) import Data.Set as Set import Data.Traversable (for, traverse) import Data.Tuple (fst) import Data.Tuple.Nested (type (/\), (/\)) +import Data.UInt (toInt) as UInt import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) +import JS.BigInt (BigInt) +import JS.BigInt (toString) as BigInt -- | Balances an unbalanced transaction using the specified balancer -- | constraints. balanceTxWithConstraints - :: UnattachedUnbalancedTx + :: UnindexedTx + -> Map TransactionInput TransactionOutput -> BalanceTxConstraintsBuilder -> Contract (Either BalanceTxError FinalizedTransaction) -balanceTxWithConstraints unbalancedTx constraintsBuilder = do +balanceTxWithConstraints transaction extraUtxos constraintsBuilder = do pparams <- getProtocolParameters - queryHandle <- getQueryHandle withBalanceTxConstraints constraintsBuilder $ runExceptT do let depositValuePerCert = (unwrap pparams).stakeAddressDeposit - certsFee = getStakingBalance (unbalancedTx ^. _transaction') + certsFee = getStakingBalance (transaction.transaction) depositValuePerCert - srcAddrs <- - asksConstraints Constraints._srcAddresses - >>= maybe (liftContract Contract.Wallet.getWalletAddresses) pure + changeAddress <- getChangeAddress - changeAddr <- getChangeAddress + mbSrcAddrs <- asksConstraints Constraints._srcAddresses - utxos <- liftEitherContract $ - parTraverse (queryHandle.utxosAt >>> liftAff >>> map hush) srcAddrs <#> - traverse (note CouldNotGetUtxos) - >>> map (foldr Map.union Map.empty) -- merge all utxos into one map + changeDatum' <- asksConstraints Constraints._changeDatum - unbalancedCollTx <- - case Array.null (unbalancedTx ^. _redeemersTxIns) of - true -> - -- Don't set collateral if tx doesn't contain phase-2 scripts: - unbalancedTxWithNetworkId - false -> - setTransactionCollateral changeAddr =<< unbalancedTxWithNetworkId + utxos <- liftEitherContract do + case mbSrcAddrs of + -- Use wallet UTxOs. + Nothing -> do + whenM + ( asks $ _.synchronizationParams + >>> _.syncBackendWithWallet + >>> _.beforeBalancing + ) + syncBackendWithWallet + note CouldNotGetUtxos <$> do + Wallet.getWalletUtxos + -- Use UTxOs from source addresses + Just srcAddrs -> do + queryHandle <- getQueryHandle + -- Even though some of the addresses may be controlled by the wallet, + -- we can't query the wallet for available UTxOs, because there's no + -- way to tell it to return UTxOs only from specific subset of the + -- addresses controlled by a CIP-30 wallet. + -- `utxosAt` calls are expensive when there are a lot of addresses to + -- check. + parTraverse (queryHandle.utxosAt >>> liftAff >>> map hush) srcAddrs + <#> traverse (note CouldNotGetUtxos) + >>> map (foldr Map.union Map.empty) -- merge all utxos into one map + + unbalancedCollTx <- transactionWithNetworkId >>= + if Array.null (transaction # _.redeemers) + -- Don't set collateral if tx doesn't contain phase-2 scripts: + then pure + else setTransactionCollateral changeAddress let allUtxos :: UtxoMap allUtxos = -- Combine utxos at the user address and those from any scripts -- involved with the contract in the unbalanced transaction: - utxos `Map.union` (unbalancedTx ^. _unbalancedTx <<< _utxoIndex) + utxos `Map.union` extraUtxos availableUtxos <- liftContract $ filterLockedUtxos allUtxos + Logger.info (pprintUtxoMap allUtxos) "balanceTxWithConstraints: all UTxOs" + Logger.info (pprintUtxoMap availableUtxos) + "balanceTxWithConstraints: available UTxOs" + selectionStrategy <- asksConstraints Constraints._selectionStrategy + -- Reindex redeemers and update transaction + reindexedRedeemers <- liftEither $ lmap ReindexRedeemersError $ + indexRedeemers (mkRedeemersContext unbalancedCollTx) transaction.redeemers + let + reindexedTransaction = transaction + { transaction = attachIndexedRedeemers reindexedRedeemers + unbalancedCollTx + } + -- Balance and finalize the transaction: runBalancer { strategy: selectionStrategy - , unbalancedTx: unbalancedTx # _transaction' .~ unbalancedCollTx - , changeAddress: changeAddr + , transaction: reindexedTransaction + , changeAddress + , changeDatum: fromMaybe NoOutputDatum changeDatum' , allUtxos , utxos: availableUtxos , certsFee } where getChangeAddress :: BalanceTxM Address - getChangeAddress = - liftMaybe CouldNotGetChangeAddress - =<< maybe (liftContract Contract.Wallet.getChangeAddress) (pure <<< Just) - =<< asksConstraints Constraints._changeAddress - - unbalancedTxWithNetworkId :: BalanceTxM Transaction - unbalancedTxWithNetworkId = do - let transaction = unbalancedTx ^. _transaction' - networkId <- maybe askNetworkId pure (transaction ^. _body <<< _networkId) - pure (transaction # _body <<< _networkId ?~ networkId) - - setTransactionCollateral :: Address -> Transaction -> BalanceTxM Transaction - setTransactionCollateral changeAddr transaction = do - collateral <- - liftEitherContract $ note CouldNotGetCollateral <$> getWalletCollateral - let collaterisedTx = addTxCollateral collateral transaction - addTxCollateralReturn collateral collaterisedTx changeAddr + getChangeAddress = maybe (liftContract Wallet.getChangeAddress) pure + =<< asksConstraints Constraints._changeAddress + + transactionWithNetworkId :: BalanceTxM Transaction + transactionWithNetworkId = do + networkId <- maybe askNetworkId pure + (transaction ^. _transaction <<< _body <<< _networkId) + pure (transaction.transaction # _body <<< _networkId ?~ networkId) + +setTransactionCollateral :: Address -> Transaction -> BalanceTxM Transaction +setTransactionCollateral changeAddr transaction = do + nonSpendableSet <- asksConstraints _nonSpendableInputs + mbCollateralUtxos <- asksConstraints _collateralUtxos + -- We must filter out UTxOs that are set as non-spendable in the balancer + -- constraints + let isSpendable = not <<< flip Set.member nonSpendableSet + collateral <- case mbCollateralUtxos of + -- if no collateral utxos are specified, use the wallet, but filter + -- the unspendable ones + Nothing -> do + let isSpendableUtxo = isSpendable <<< _.input <<< unwrap + { yes: spendableUtxos, no: filteredUtxos } <- + Array.partition isSpendableUtxo <$> do + liftEitherContract $ note CouldNotGetCollateral <$> + Wallet.getWalletCollateral + when (not $ Array.null filteredUtxos) do + logWarn' $ pprintTagSet + "Some of the collateral UTxOs returned by the wallet were marked as non-spendable and ignored" + (pprintUtxoMap (transactionUnspentOutputsToUtxoMap filteredUtxos)) + pure spendableUtxos + -- otherwise, get all the utxos, filter out unspendable, and select + -- collateral using internal algo, that is also used in KeyWallet + Just utxoMap -> do + ProtocolParameters params <- liftContract getProtocolParameters + networkId <- askNetworkId + let + coinsPerUtxoUnit = params.coinsPerUtxoUnit + maxCollateralInputs = UInt.toInt $ params.maxCollateralInputs + utxoMap' = fromPlutusUtxoMap networkId $ Map.filterKeys isSpendable + utxoMap + mbCollateral <- liftEffect $ map Array.fromFoldable <$> + selectCollateral coinsPerUtxoUnit maxCollateralInputs utxoMap' + liftEither $ note (InsufficientCollateralUtxos utxoMap') mbCollateral + addTxCollateralReturn collateral (addTxCollateral collateral transaction) + changeAddr -------------------------------------------------------------------------------- -- Balancing Algorithm @@ -239,53 +305,44 @@ balanceTxWithConstraints unbalancedTx constraintsBuilder = do type BalancerParams = { strategy :: SelectionStrategy - , unbalancedTx :: UnattachedUnbalancedTx + , transaction :: UnindexedTx , changeAddress :: Address + , changeDatum :: OutputDatum , allUtxos :: UtxoMap , utxos :: UtxoMap , certsFee :: Coin } -type BalancerState = - { transaction :: UnattachedUnbalancedTx +type BalancerState tx = + { transaction :: tx , leftoverUtxos :: UtxoIndex , changeOutputs :: Array TransactionOutput , minFee :: BigInt } initBalancerState - :: UnattachedUnbalancedTx + :: UnindexedTx -> UtxoMap - -> BalancerState + -> BalancerState UnindexedTx initBalancerState transaction = buildUtxoIndex >>> { transaction, leftoverUtxos: _, changeOutputs: mempty, minFee: zero } data BalancerStep - = PrebalanceTx BalancerState - | BalanceChangeAndMinFee BalancerState + = PrebalanceTx (BalancerState UnindexedTx) + | BalanceChangeAndMinFee (BalancerState UnindexedTx) runBalancer :: BalancerParams -> BalanceTxM FinalizedTransaction runBalancer p = do utxos <- partitionAndFilterUtxos - unbalancedTx <- addLovelacesToTransactionOutputs p.unbalancedTx - addInvalidInContext (foldMap (_.amount <<< unwrap) utxos.invalidInContext) do - mainLoop (initBalancerState unbalancedTx utxos.spendable) + transaction <- addLovelacesToTransactionOutputs p.transaction + mainLoop (initBalancerState transaction utxos.spendable) where - addInvalidInContext - :: forall (a :: Type). Value -> BalanceTxM a -> BalanceTxM a - addInvalidInContext invalidInContext m = catchError m $ throwError <<< - case _ of - BalanceInsufficientError e a (InvalidInContext v) -> - BalanceInsufficientError e a - (InvalidInContext (v <> toPlutusValue invalidInContext)) - e -> e - -- We check if the transaction uses a plutusv1 script, so that we can filter -- out utxos which use plutusv2 features if so. txHasPlutusV1 :: Boolean txHasPlutusV1 = - case p.unbalancedTx ^. _transaction' ^. _witnessSet ^. _plutusScripts of + case p.transaction ^. _transaction <<< _witnessSet <<< _plutusScripts of Just scripts -> flip Array.any scripts case _ of PlutusScript (_ /\ PlutusV1) -> true _ -> false @@ -294,12 +351,12 @@ runBalancer p = do partitionAndFilterUtxos :: BalanceTxM { spendable :: UtxoMap, invalidInContext :: UtxoMap } partitionAndFilterUtxos = do - isCip30 <- isJust <$> askCip30Wallet + isCip30 <- liftContract $ isCip30Wallet -- Get collateral inputs to mark them as unspendable. -- Some CIP-30 wallets don't allow to sign Txs that spend it. nonSpendableCollateralInputs <- if isCip30 then - liftContract $ getWalletCollateral <#> + liftContract $ Wallet.getWalletCollateral <#> fold >>> map (unwrap >>> _.input) >>> Set.fromFoldable else mempty asksConstraints Constraints._nonSpendableInputs <#> @@ -319,7 +376,9 @@ runBalancer p = do spendable :: Boolean spendable = not $ Set.member oref nonSpendableInputs || Set.member oref - (p.unbalancedTx ^. _body' <<< _referenceInputs) + ( p.transaction ^. _transaction <<< _body <<< + _referenceInputs + ) validInContext :: Boolean validInContext = not $ txHasPlutusV1 && @@ -339,36 +398,41 @@ runBalancer p = do } (Map.toUnfoldable p.utxos :: Array _) - mainLoop :: BalancerState -> BalanceTxM FinalizedTransaction + mainLoop :: BalancerState UnindexedTx -> BalanceTxM FinalizedTransaction mainLoop = worker <<< PrebalanceTx where worker :: BalancerStep -> BalanceTxM FinalizedTransaction worker (PrebalanceTx state) = do logBalancerState "Pre-balancing (Stage 1)" p.allUtxos state prebalanceTx state >>= runNextBalancerStep - worker (BalanceChangeAndMinFee s@{ transaction, minFee, leftoverUtxos }) = + worker (BalanceChangeAndMinFee state@{ transaction, minFee, leftoverUtxos }) = do - logBalancerState "Balancing change and fees (Stage 2)" p.allUtxos s - { transaction: balancedTx, minFee: newMinFee } <- evaluateTx s + logBalancerState "Balancing change and fees (Stage 2)" p.allUtxos state + { transaction: evaluatedTx, minFee: newMinFee } <- evaluateTx state case newMinFee <= minFee of - true -> - if (Set.isEmpty $ balancedTx ^. _body' <<< _inputs) then do - selectionState <- - performMultiAssetSelection p.strategy leftoverUtxos - (lovelaceValueOf one) - runNextBalancerStep $ s - { transaction = - balancedTx # _body' <<< _inputs %~ - Set.union (selectedInputs selectionState) - , leftoverUtxos = - selectionState ^. _leftoverUtxos - } - else - logTransaction "Balanced transaction (Done)" p.allUtxos balancedTx - *> finalizeTransaction balancedTx p.allUtxos + true -> do + logTransaction "Balanced transaction (Done)" p.allUtxos + evaluatedTx.transaction + if Set.isEmpty $ evaluatedTx.transaction ^. _body <<< _inputs then + do + selectionState <- + performMultiAssetSelection p.strategy leftoverUtxos + (lovelaceValueOf one) + runNextBalancerStep $ state + { transaction = transaction # + _transaction <<< _body <<< _inputs %~ Set.union + (selectedInputs selectionState) + , leftoverUtxos = + selectionState ^. _leftoverUtxos + } + else do + logTransaction "Balanced transaction (Done)" p.allUtxos + transaction.transaction + finalizeTransaction evaluatedTx p.allUtxos false -> - runNextBalancerStep $ s - { transaction = transaction # _body' <<< _fee .~ Coin newMinFee + runNextBalancerStep $ state + { transaction = transaction + # _transaction <<< _body <<< _fee .~ Coin newMinFee , minFee = newMinFee } @@ -377,28 +441,40 @@ runBalancer p = do -- | If the transaction remains unbalanced (i.e. `requiredValue != mempty`) -- | after generation of change, the first balancing step `PrebalanceTx` -- | is performed, otherwise we proceed to `BalanceChangeAndMinFee`. - runNextBalancerStep :: BalancerState -> BalanceTxM FinalizedTransaction + runNextBalancerStep + :: BalancerState UnindexedTx -> BalanceTxM FinalizedTransaction runNextBalancerStep state@{ transaction } = do - let txBody = transaction ^. _body' + let txBody = transaction ^. _transaction <<< _body inputValue <- except $ getInputValue p.allUtxos txBody - changeOutputs <- makeChange p.changeAddress inputValue p.certsFee txBody + ownWalletAddresses <- asks _.ownAddresses + changeOutputs <- makeChange ownWalletAddresses p.changeAddress + p.changeDatum + inputValue + p.certsFee + txBody requiredValue <- except $ getRequiredValue p.certsFee p.allUtxos - (setTxChangeOutputs changeOutputs transaction ^. _body') + $ setTxChangeOutputs changeOutputs transaction ^. _transaction <<< + _body - worker $ state { changeOutputs = changeOutputs } # - if requiredValue == mempty then BalanceChangeAndMinFee else PrebalanceTx + worker $ + if requiredValue == mempty then BalanceChangeAndMinFee $ state + { changeOutputs = changeOutputs, transaction = transaction } + else PrebalanceTx $ state { changeOutputs = changeOutputs } -- | Selects a combination of unspent transaction outputs from the wallet's -- | utxo set so that the total input value is sufficient to cover all -- | transaction outputs, including generated change and min fee. - prebalanceTx :: BalancerState -> BalanceTxM BalancerState + prebalanceTx + :: BalancerState UnindexedTx -> BalanceTxM (BalancerState UnindexedTx) prebalanceTx state@{ transaction, changeOutputs, leftoverUtxos } = performCoinSelection <#> \selectionState -> state { transaction = - transaction # _body' <<< _inputs %~ - Set.union (selectedInputs selectionState) + ( transaction # + _transaction <<< _body <<< _inputs %~ + Set.union (selectedInputs selectionState) + ) , leftoverUtxos = selectionState ^. _leftoverUtxos } @@ -407,7 +483,8 @@ runBalancer p = do performCoinSelection = let txBody :: TxBody - txBody = setTxChangeOutputs changeOutputs transaction ^. _body' + txBody = setTxChangeOutputs changeOutputs transaction ^. _transaction + <<< _body in except (getRequiredValue p.certsFee p.allUtxos txBody) >>= performMultiAssetSelection p.strategy leftoverUtxos @@ -418,23 +495,28 @@ runBalancer p = do -- | The transaction must be pre-balanced before evaluating execution units, -- | since this pre-condition is sometimes required for successfull script -- | execution during transaction evaluation. - evaluateTx :: BalancerState -> BalanceTxM BalancerState + evaluateTx + :: BalancerState UnindexedTx -> BalanceTxM (BalancerState EvaluatedTx) evaluateTx state@{ transaction, changeOutputs } = do let - prebalancedTx :: PrebalancedTransaction - prebalancedTx = wrap $ setTxChangeOutputs changeOutputs transaction - - transaction' /\ minFee <- evalExUnitsAndMinFee prebalancedTx p.allUtxos - pure $ state { transaction = transaction', minFee = minFee } + prebalancedTx :: UnindexedTx + prebalancedTx = setTxChangeOutputs changeOutputs transaction + indexedTx <- liftEither $ lmap ReindexRedeemersError $ indexTx + prebalancedTx + evaluatedTx /\ minFee <- evalExUnitsAndMinFee indexedTx p.allUtxos + pure $ state { transaction = evaluatedTx, minFee = minFee } -- | For each transaction output, if necessary, adds some number of lovelaces -- | to cover the utxo min-ada-value requirement. addLovelacesToTransactionOutputs - :: UnattachedUnbalancedTx -> BalanceTxM UnattachedUnbalancedTx -addLovelacesToTransactionOutputs unbalancedTx = - map (\txOutputs -> unbalancedTx # _body' <<< _outputs .~ txOutputs) $ + :: UnindexedTx -> BalanceTxM UnindexedTx +addLovelacesToTransactionOutputs transaction = + map + ( \txOutputs -> transaction # + _transaction <<< _body <<< _outputs .~ txOutputs + ) $ traverse addLovelacesToTransactionOutput - (unbalancedTx ^. _body' <<< _outputs) + (transaction ^. _transaction <<< _body <<< _outputs) addLovelacesToTransactionOutput :: TransactionOutput -> BalanceTxM TransactionOutput @@ -456,8 +538,9 @@ addLovelacesToTransactionOutput txOutput = do { amount = mkValue newCoin (getNonAdaAsset txOutputValue) } setTxChangeOutputs - :: Array TransactionOutput -> UnattachedUnbalancedTx -> UnattachedUnbalancedTx -setTxChangeOutputs outputs = _body' <<< _outputs %~ flip append outputs + :: Array TransactionOutput -> UnindexedTx -> UnindexedTx +setTxChangeOutputs outputs tx = + tx # _transaction <<< _body <<< _outputs %~ flip append outputs -------------------------------------------------------------------------------- -- Making change @@ -473,15 +556,33 @@ setTxChangeOutputs outputs = _body' <<< _outputs %~ flip append outputs -- | -- | Taken from cardano-wallet: -- | https://github.com/input-output-hk/cardano-wallet/blob/4c2eb651d79212157a749d8e69a48fff30862e93/lib/wallet/src/Cardano/Wallet/CoinSelection/Internal/Balance.hs#L1396 +-- | +-- | Differences from cardano-wallet: +-- | +-- | - We only consider outputs that go back to our wallet when deciding on +-- | the number of desired outputs for change generation. See +-- | https://github.com/Plutonomicon/cardano-transaction-lib/issues/1530 makeChange - :: Address -> Value -> Coin -> TxBody -> BalanceTxM (Array TransactionOutput) -makeChange changeAddress inputValue certsFee txBody = + :: Set Address + -> Address + -> OutputDatum + -> Value + -> Coin + -> TxBody + -> BalanceTxM (Array TransactionOutput) +makeChange + ownWalletAddresses + changeAddress + changeDatum + inputValue + certsFee + txBody = -- Always generate change when a transaction has no outputs to avoid issues -- with transaction confirmation: -- FIXME: https://github.com/Plutonomicon/cardano-transaction-lib/issues/1293 if excessValue == mempty && (txBody ^. _outputs) /= mempty then pure mempty else - map (mkChangeOutput changeAddress) <$> + map (mkChangeOutput changeAddress changeDatum) <$> ( assignCoinsToChangeValues changeAddress excessCoin =<< splitOversizedValues changeValueOutputCoinPairs ) @@ -498,6 +599,12 @@ makeChange changeAddress inputValue certsFee txBody = changeValueOutputCoinPairs = outputCoins # NEArray.zip changeForAssets # NEArray.sortWith (AssetCount <<< fst) + where + outputCoins :: NonEmptyArray BigInt + outputCoins = + NEArray.fromArray + (valueToCoin' <<< _.amount <<< unwrap <$> ownAddressOutputs) + ?? NEArray.singleton zero splitOversizedValues :: NonEmptyArray (Value /\ BigInt) @@ -517,20 +624,19 @@ makeChange changeAddress inputValue certsFee txBody = unbundle :: Value -> Value /\ BigInt unbundle (Value coin assets) = mkValue mempty assets /\ unwrap coin + -- outputs belonging to one of the wallet's addresses. + ownAddressOutputs :: Array TransactionOutput + ownAddressOutputs = Array.filter isOwnWalletAddress $ txBody ^. _outputs + where + isOwnWalletAddress = unwrap >>> _.address >>> flip Set.member + ownWalletAddresses + changeForAssets :: NonEmptyArray Value changeForAssets = foldr - (NEArray.zipWith (<>) <<< makeChangeForAsset txOutputs) - (NEArray.replicate (length txOutputs) mempty) + (NEArray.zipWith (<>) <<< makeChangeForAsset ownAddressOutputs) + (NEArray.replicate (length ownAddressOutputs) mempty) excessAssets - outputCoins :: NonEmptyArray BigInt - outputCoins = - NEArray.fromArray (valueToCoin' <<< _.amount <<< unwrap <$> txOutputs) - ?? NEArray.singleton zero - - txOutputs :: Array TransactionOutput - txOutputs = txBody ^. _outputs - excessAssets :: Array (AssetClass /\ BigInt) excessAssets = Value.valueAssets excessValue @@ -560,8 +666,10 @@ makeChange changeAddress inputValue certsFee txBody = -- | Taken from cardano-wallet: -- | https://github.com/input-output-hk/cardano-wallet/blob/4c2eb651d79212157a749d8e69a48fff30862e93/lib/wallet/src/Cardano/Wallet/CoinSelection/Internal/Balance.hs#L1729 makeChangeForAsset - :: Array TransactionOutput -> (AssetClass /\ BigInt) -> NonEmptyArray Value -makeChangeForAsset txOutputs (assetClass /\ excess) = + :: Array TransactionOutput + -> (AssetClass /\ BigInt) + -> NonEmptyArray Value +makeChangeForAsset ownAddressOutputs (assetClass /\ excess) = Value.assetToValue assetClass <$> partition excess weights ?? equipartition excess (length weights) where @@ -570,7 +678,8 @@ makeChangeForAsset txOutputs (assetClass /\ excess) = assetQuantities :: Array BigInt assetQuantities = - txOutputs <#> Value.getAssetQuantity assetClass <<< _.amount <<< unwrap + ownAddressOutputs <#> Value.getAssetQuantity assetClass <<< _.amount <<< + unwrap -- | Constructs an array of ada change outputs based on the given distribution. -- | @@ -623,22 +732,22 @@ assignCoinsToChangeValues changeAddress adaAvailable pairsAtStart = worker (adaRequiredAtStart changeValues) changeValues where worker :: BigInt -> NonEmptyArray ChangeValue -> Array Value - worker adaRequired = NEArray.uncons >>> case _ of + worker adaRequired changeValues = changeValues # NEArray.uncons >>> case _ of { head: x, tail } | Just xs <- NEA.fromArray tail , adaAvailable < adaRequired && noTokens x -> worker (adaRequired - x.minCoin) xs - { head: x, tail: xs } -> + _ -> let - changeValues :: NonEmptyArray ChangeValue - changeValues = NEArray.cons' x xs - adaRemaining :: BigInt adaRemaining = max zero (adaAvailable - adaRequired) changeValuesForOutputCoins :: NonEmptyArray Value changeValuesForOutputCoins = - makeChangeForCoin (_.outputAda <$> changeValues) adaRemaining + let + weights = _.outputAda <$> changeValues + in + makeChangeForCoin weights adaRemaining changeValuesWithMinCoins :: NonEmptyArray Value changeValuesWithMinCoins = assignMinCoin <$> changeValues @@ -664,7 +773,9 @@ assignCoinsToChangeValues changeAddress adaAvailable pairsAtStart = minCoinFor :: Value -> BalanceTxM BigInt minCoinFor value = do - let txOutput = mkChangeOutput changeAddress value + let + -- NOTE: Datum here doesn't matter, we deconstruct UTxO immediately anyway + txOutput = mkChangeOutput changeAddress NoOutputDatum value coinsPerUtxoUnit <- askCoinsPerUtxoUnit ExceptT $ liftEffect $ utxoMinAdaValue coinsPerUtxoUnit txOutput <#> note UtxoMinAdaValueCalculationFailed @@ -679,9 +790,9 @@ derive newtype instance Eq AssetCount instance Ord AssetCount where compare = compare `on` (Array.length <<< Value.valueAssets <<< unwrap) -mkChangeOutput :: Address -> Value -> TransactionOutput -mkChangeOutput changeAddress amount = wrap - { address: changeAddress, amount, datum: NoOutputDatum, scriptRef: Nothing } +mkChangeOutput :: Address -> OutputDatum -> Value -> TransactionOutput +mkChangeOutput changeAddress datum amount = wrap + { address: changeAddress, amount, datum, scriptRef: Nothing } -------------------------------------------------------------------------------- -- Getters for various `Value`s @@ -739,12 +850,17 @@ getStakingBalance tx depositLovelacesPerCert = -- Helpers -------------------------------------------------------------------------------- -logBalancerState :: String -> UtxoMap -> BalancerState -> BalanceTxM Unit -logBalancerState message utxos { transaction, changeOutputs } = +logBalancerState + :: forall rest + . String + -> UtxoMap + -> BalancerState { transaction :: Transaction | rest } + -> BalanceTxM Unit +logBalancerState message utxos { transaction: { transaction }, changeOutputs } = logTransactionWithChange message utxos (Just changeOutputs) transaction logTransaction - :: String -> UtxoMap -> UnattachedUnbalancedTx -> BalanceTxM Unit + :: String -> UtxoMap -> Transaction -> BalanceTxM Unit logTransaction message utxos = logTransactionWithChange message utxos Nothing @@ -752,31 +868,29 @@ logTransactionWithChange :: String -> UtxoMap -> Maybe (Array TransactionOutput) - -> UnattachedUnbalancedTx + -> Transaction -> BalanceTxM Unit -logTransactionWithChange message utxos mChangeOutputs unbalancedTx = +logTransactionWithChange message utxos mChangeOutputs tx = let txBody :: TxBody - txBody = unbalancedTx ^. _body' - - tag :: forall (a :: Type). Show a => String -> a -> TagSet - tag title = TagSet.tag title <<< show + txBody = tx ^. _body outputValuesTagSet :: Maybe (Array TransactionOutput) -> Array TagSet outputValuesTagSet Nothing = - [ "Output Value" `tag` outputValue txBody ] + [ "Output Value" `tagSetTag` pprintValue (outputValue txBody) ] outputValuesTagSet (Just changeOutputs) = - [ "Output Value without change" `tag` outputValue txBody - , "Change Value" `tag` foldMap getAmount changeOutputs + [ "Output Value without change" `tagSetTag` pprintValue + (outputValue txBody) + , "Change Value" `tagSetTag` pprintValue (foldMap getAmount changeOutputs) ] transactionInfo :: Value -> TagSet transactionInfo inputValue = TagSet.fromArray $ - [ "Input Value" `tag` inputValue - , "Mint Value" `tag` mintValue txBody - , "Fees" `tag` (txBody ^. _fee) + [ "Input Value" `tagSetTag` pprintValue inputValue + , "Mint Value" `tagSetTag` pprintValue (mintValue txBody) + , "Fees" `tag` BigInt.toString (unwrap (txBody ^. _fee)) ] <> outputValuesTagSet mChangeOutputs in except (getInputValue utxos txBody) - >>= (flip Logger.trace (message <> ":") <<< transactionInfo) + >>= (flip Logger.info (message <> ":") <<< transactionInfo) diff --git a/src/Internal/BalanceTx/CoinSelection.purs b/src/Internal/BalanceTx/CoinSelection.purs index ede499faf..19b2796cc 100644 --- a/src/Internal/BalanceTx/CoinSelection.purs +++ b/src/Internal/BalanceTx/CoinSelection.purs @@ -29,8 +29,6 @@ import Ctl.Internal.BalanceTx.Error , InsufficientUtxoBalanceToCoverAsset ) , Expected(Expected) - , ImpossibleError(Impossible) - , InvalidInContext(InvalidInContext) ) import Ctl.Internal.Cardano.Types.Transaction (UtxoMap) import Ctl.Internal.Cardano.Types.Value (AssetClass(AssetClass), Coin, Value) @@ -60,8 +58,6 @@ import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Array (snoc, uncons) as Array import Data.Array.NonEmpty (NonEmptyArray) import Data.Array.NonEmpty (cons', fromArray, singleton, uncons) as NEArray -import Data.BigInt (BigInt) -import Data.BigInt (abs, fromInt, toString) as BigInt import Data.Foldable (foldMap) as Foldable import Data.Function (applyFlipped) import Data.Generic.Rep (class Generic) @@ -79,6 +75,8 @@ import Data.Show.Generic (genericShow) import Data.Tuple (fst) as Tuple import Data.Tuple.Nested (type (/\), (/\)) import Effect.Class (class MonadEffect) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt, toString) as BigInt import Test.QuickCheck.Arbitrary (class Arbitrary) import Test.QuickCheck.Gen (elements) as Arbitrary import Type.Proxy (Proxy(Proxy)) @@ -142,7 +140,6 @@ performMultiAssetSelection strategy utxoIndex requiredValue = BalanceInsufficientError (Expected $ toPlutusValue requiredValue) (Actual $ toPlutusValue availableValue) - (InvalidInContext $ toPlutusValue mempty) availableValue :: Value availableValue = balance (utxoIndexUniverse utxoIndex) @@ -356,7 +353,7 @@ runSelectionStep lens state let balanceInsufficientError :: BalanceTxError balanceInsufficientError = - InsufficientUtxoBalanceToCoverAsset Impossible lens.assetDisplayString + InsufficientUtxoBalanceToCoverAsset lens.assetDisplayString in lens.selectQuantityCover state >>= maybe (throwError balanceInsufficientError) (pure <<< Just) @@ -374,7 +371,10 @@ runSelectionStep lens state distanceFromTarget :: SelectionState -> BigInt distanceFromTarget = - BigInt.abs <<< sub targetQuantity <<< lens.currentQuantity + bigIntAbs <<< sub targetQuantity <<< lens.currentQuantity + + bigIntAbs :: BigInt -> BigInt + bigIntAbs x = if x < zero then negate x else x targetMultiplier :: Int targetMultiplier = diff --git a/src/Internal/BalanceTx/Collateral.purs b/src/Internal/BalanceTx/Collateral.purs index f7eccf29e..a6dc1a8f2 100644 --- a/src/Internal/BalanceTx/Collateral.purs +++ b/src/Internal/BalanceTx/Collateral.purs @@ -30,7 +30,6 @@ import Ctl.Internal.Cardano.Types.Value (getNonAdaAsset, mkValue, valueToCoin') import Ctl.Internal.Serialization.Address (Address) import Ctl.Internal.Types.BigNum (maxValue, toBigInt) as BigNum import Ctl.Internal.Types.OutputDatum (OutputDatum(NoOutputDatum)) -import Data.BigInt (BigInt) import Data.Either (Either(Left, Right), note) import Data.Foldable (foldMap, foldl) import Data.Lens.Setter ((?~)) @@ -38,6 +37,7 @@ import Data.Maybe (Maybe(Nothing)) import Data.Newtype (unwrap, wrap) import Data.Ord.Max (Max(Max)) import Effect.Class (liftEffect) +import JS.BigInt (BigInt) addTxCollateral :: Array TransactionUnspentOutput -> Transaction -> Transaction addTxCollateral collateral transaction = @@ -92,10 +92,14 @@ addTxCollateralReturn collateral transaction ownAddress = coinsPerUtxoUnit <- askCoinsPerUtxoUnit -- Calculate the required min ada value for the collateral return output: - minAdaValue <- + minAdaValue <- do + let returnAsTxOut = wrap collReturnOutputRec ExceptT $ - liftEffect (utxoMinAdaValue coinsPerUtxoUnit (wrap collReturnOutputRec)) - <#> note CollateralReturnMinAdaValueCalcError + liftEffect (utxoMinAdaValue coinsPerUtxoUnit returnAsTxOut) + <#> note + ( CollateralReturnMinAdaValueCalcError coinsPerUtxoUnit + returnAsTxOut + ) let -- Determine the actual ada value of the collateral return output: @@ -119,9 +123,7 @@ addTxCollateralReturn collateral transaction ownAddress = Right $ transaction # _body <<< _collateralReturn ?~ collReturnOutput # _body <<< _totalCollateral ?~ wrap totalCollateral - false -> - Left $ CollateralReturnError - "Negative totalCollateral after covering min-utxo-ada requirement." + false -> Left CollateralReturnError -------------------------------------------------------------------------------- -- Helpers diff --git a/src/Internal/BalanceTx/Collateral/Select.purs b/src/Internal/BalanceTx/Collateral/Select.purs index 642ee1f31..992471d0a 100644 --- a/src/Internal/BalanceTx/Collateral/Select.purs +++ b/src/Internal/BalanceTx/Collateral/Select.purs @@ -19,8 +19,6 @@ import Ctl.Internal.Cardano.Types.Value (NonAdaAsset) import Ctl.Internal.Cardano.Types.Value (getNonAdaAsset, valueToCoin') as Value import Ctl.Internal.Types.ProtocolParameters (CoinsPerUtxoUnit) import Ctl.Internal.Types.Transaction (TransactionInput) -import Data.BigInt (BigInt) -import Data.BigInt (fromInt) as BigInt import Data.Foldable (foldMap, foldl) import Data.Function (on) import Data.List (List(Nil, Cons)) @@ -34,6 +32,8 @@ import Data.Tuple (Tuple(Tuple)) import Data.Tuple (fst, snd) as Tuple import Data.Tuple.Nested (type (/\), (/\)) import Effect (Effect) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt) as BigInt minRequiredCollateral :: BigInt minRequiredCollateral = BigInt.fromInt 5_000_000 @@ -85,7 +85,7 @@ instance Ord CollateralCandidate where byNumOfInputs = List.length <<< Tuple.fst <<< unwrap byAdaValue :: CollateralCandidate -> BigInt - byAdaValue = foldl adaValue' zero <<< Tuple.fst <<< unwrap + byAdaValue = foldl consumeUtxoAdaValue zero <<< Tuple.fst <<< unwrap mkCollateralCandidate :: List TransactionUnspentOutput /\ Maybe ReturnOutMinAdaValue @@ -125,7 +125,8 @@ selectCollateral coinsPerUtxoUnit maxCollateralInputs = (\x -> Tuple x <$> collateralReturnMinAdaValue coinsPerUtxoUnit x) -- Filter out all utxo combinations -- with total Ada value < `minRequiredCollateral`: - <<< List.filter (\x -> foldl adaValue' zero x >= minRequiredCollateral) + <<< List.filter + (\x -> foldl consumeUtxoAdaValue zero x >= minRequiredCollateral) -- Get all possible non-empty utxo combinations -- with the number of utxos <= `maxCollateralInputs`: <<< combinations maxCollateralInputs @@ -161,8 +162,8 @@ adaValue :: TransactionUnspentOutput -> BigInt adaValue = Value.valueToCoin' <<< _.amount <<< unwrap <<< _.output <<< unwrap -adaValue' :: BigInt -> TransactionUnspentOutput -> BigInt -adaValue' init = add init <<< adaValue +consumeUtxoAdaValue :: BigInt -> TransactionUnspentOutput -> BigInt +consumeUtxoAdaValue acc = add acc <<< adaValue nonAdaAsset :: TransactionUnspentOutput -> NonAdaAsset nonAdaAsset = diff --git a/src/Internal/BalanceTx/Constraints.purs b/src/Internal/BalanceTx/Constraints.purs index 32b33ec49..b6a2c8327 100644 --- a/src/Internal/BalanceTx/Constraints.purs +++ b/src/Internal/BalanceTx/Constraints.purs @@ -6,12 +6,16 @@ module Ctl.Internal.BalanceTx.Constraints , mustNotSpendUtxosWithOutRefs , mustNotSpendUtxoWithOutRef , mustSendChangeToAddress + , mustSendChangeWithDatum , mustUseAdditionalUtxos , mustUseCoinSelectionStrategy + , mustUseCollateralUtxos , mustUseUtxosAtAddress , mustUseUtxosAtAddresses , _additionalUtxos + , _collateralUtxos , _changeAddress + , _changeDatum , _maxChangeOutputTokenQuantity , _nonSpendableInputs , _selectionStrategy @@ -31,37 +35,43 @@ import Ctl.Internal.Plutus.Types.Address ( Address , AddressWithNetworkTag(AddressWithNetworkTag) ) as Plutus -import Ctl.Internal.Plutus.Types.Transaction (UtxoMap) as Plutus +import Ctl.Internal.Plutus.Types.Transaction (UtxoMap) import Ctl.Internal.Serialization.Address (Address, NetworkId) +import Ctl.Internal.Types.OutputDatum (OutputDatum) import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Array (singleton) as Array -import Data.BigInt (BigInt) import Data.Function (applyFlipped) import Data.Lens (Lens') import Data.Lens.Iso.Newtype (_Newtype) import Data.Lens.Record (prop) import Data.Lens.Setter (appendOver, set, setJust) import Data.Map (empty) as Map -import Data.Maybe (Maybe(Nothing)) +import Data.Maybe (Maybe(Just, Nothing)) import Data.Newtype (class Newtype, over2, unwrap, wrap) import Data.Set (Set) import Data.Set (singleton) as Set +import JS.BigInt (BigInt) import Type.Proxy (Proxy(Proxy)) newtype BalanceTxConstraints = BalanceTxConstraints - { additionalUtxos :: Plutus.UtxoMap + { additionalUtxos :: UtxoMap + , collateralUtxos :: Maybe UtxoMap , maxChangeOutputTokenQuantity :: Maybe BigInt , nonSpendableInputs :: Set TransactionInput , srcAddresses :: Maybe (Array Address) , changeAddress :: Maybe Address + , changeDatum :: Maybe OutputDatum , selectionStrategy :: SelectionStrategy } derive instance Newtype BalanceTxConstraints _ -_additionalUtxos :: Lens' BalanceTxConstraints Plutus.UtxoMap +_additionalUtxos :: Lens' BalanceTxConstraints UtxoMap _additionalUtxos = _Newtype <<< prop (Proxy :: Proxy "additionalUtxos") +_collateralUtxos :: Lens' BalanceTxConstraints (Maybe UtxoMap) +_collateralUtxos = _Newtype <<< prop (Proxy :: Proxy "collateralUtxos") + _maxChangeOutputTokenQuantity :: Lens' BalanceTxConstraints (Maybe BigInt) _maxChangeOutputTokenQuantity = _Newtype <<< prop (Proxy :: Proxy "maxChangeOutputTokenQuantity") @@ -75,6 +85,9 @@ _srcAddresses = _Newtype <<< prop (Proxy :: Proxy "srcAddresses") _changeAddress :: Lens' BalanceTxConstraints (Maybe Address) _changeAddress = _Newtype <<< prop (Proxy :: Proxy "changeAddress") +_changeDatum :: Lens' BalanceTxConstraints (Maybe OutputDatum) +_changeDatum = _Newtype <<< prop (Proxy :: Proxy "changeDatum") + _selectionStrategy :: Lens' BalanceTxConstraints SelectionStrategy _selectionStrategy = _Newtype <<< prop (Proxy :: Proxy "selectionStrategy") @@ -95,9 +108,11 @@ buildBalanceTxConstraints = applyFlipped defaultConstraints <<< unwrap defaultConstraints :: BalanceTxConstraints defaultConstraints = wrap { additionalUtxos: Map.empty + , collateralUtxos: Nothing , maxChangeOutputTokenQuantity: Nothing , nonSpendableInputs: mempty , srcAddresses: Nothing + , changeDatum: Nothing , changeAddress: Nothing , selectionStrategy: SelectionStrategyOptimal } @@ -113,6 +128,12 @@ mustSendChangeToAddress mustSendChangeToAddress = wrap <<< setJust _changeAddress <<< fromPlutusAddressWithNetworkTag +-- | Tells the balancer to include the datum in each change UTxO. Useful when +-- | balancing a transactions for script owned UTxOs. +mustSendChangeWithDatum :: OutputDatum -> BalanceTxConstraintsBuilder +mustSendChangeWithDatum = + wrap <<< setJust _changeDatum + -- | Tells the balancer to use UTxO's at given addresses. -- | If this constraint is not set, then the default addresses owned by the -- | wallet are used. @@ -156,10 +177,14 @@ mustNotSpendUtxoWithOutRef = mustNotSpendUtxosWithOutRefs <<< Set.singleton -- | execution units (sets `additionalUtxoSet` of Ogmios `EvaluateTx`). -- | Note that you need to use `unspentOutputs` lookup to make these UTxO's -- | spendable by the transaction (see `Examples.TxChaining` for reference). -mustUseAdditionalUtxos :: Plutus.UtxoMap -> BalanceTxConstraintsBuilder +mustUseAdditionalUtxos :: UtxoMap -> BalanceTxConstraintsBuilder mustUseAdditionalUtxos = wrap <<< set _additionalUtxos +-- | Tells the balancer to select from the provided UTxO set when choosing +-- | collateral UTxOs, instead of UTxOs provided by the browser wallet. +mustUseCollateralUtxos :: UtxoMap -> BalanceTxConstraintsBuilder +mustUseCollateralUtxos = wrap <<< set _collateralUtxos <<< Just + -- | Tells the balancer to use the given strategy for coin selection. mustUseCoinSelectionStrategy :: SelectionStrategy -> BalanceTxConstraintsBuilder mustUseCoinSelectionStrategy = wrap <<< set _selectionStrategy - diff --git a/src/Internal/BalanceTx/Error.purs b/src/Internal/BalanceTx/Error.purs index c1cad37ec..ced8db218 100644 --- a/src/Internal/BalanceTx/Error.purs +++ b/src/Internal/BalanceTx/Error.purs @@ -3,12 +3,11 @@ -- | that may be returned from Ogmios when calculating ex units. module Ctl.Internal.BalanceTx.Error ( Actual(Actual) - , InvalidInContext(InvalidInContext) , BalanceTxError ( BalanceInsufficientError , CouldNotConvertScriptOutputToTxInput - , CouldNotGetChangeAddress , CouldNotGetCollateral + , InsufficientCollateralUtxos , CouldNotGetUtxos , CollateralReturnError , CollateralReturnMinAdaValueCalcError @@ -19,13 +18,25 @@ module Ctl.Internal.BalanceTx.Error , UtxoMinAdaValueCalculationFailed ) , Expected(Expected) - , ImpossibleError(Impossible) , printTxEvaluationFailure + , explainBalanceTxError ) where import Prelude -import Ctl.Internal.Cardano.Types.Transaction (Redeemer(Redeemer)) +import Ctl.Internal.BalanceTx.RedeemerIndex (UnindexedRedeemer) +import Ctl.Internal.Cardano.Types.Transaction + ( Redeemer(Redeemer) + , Transaction + , TransactionOutput + , UtxoMap + , _redeemers + , _witnessSet + , pprintUtxoMap + ) +import Ctl.Internal.Cardano.Types.Value (pprintValue) +import Ctl.Internal.Helpers (bugTrackerLink, pprintTagSet) +import Ctl.Internal.Plutus.Conversion.Value (fromPlutusValue) import Ctl.Internal.Plutus.Types.Value (Value) import Ctl.Internal.QueryM.Ogmios ( RedeemerPointer @@ -38,56 +49,99 @@ import Ctl.Internal.QueryM.Ogmios , NonScriptInputReferencedByRedeemer , IllFormedExecutionBudget , NoCostModelForLanguage + , InternalLedgerTypeConversionError ) - , TxEvaluationFailure(UnparsedError, ScriptFailures) + , TxEvaluationFailure(UnparsedError, AdditionalUtxoOverlap, ScriptFailures) ) as Ogmios -import Ctl.Internal.ReindexRedeemers (ReindexErrors) import Ctl.Internal.Types.Natural (toBigInt) as Natural -import Ctl.Internal.Types.ScriptLookups - ( UnattachedUnbalancedTx(UnattachedUnbalancedTx) - ) +import Ctl.Internal.Types.ProtocolParameters (CoinsPerUtxoUnit) import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Array (catMaybes, filter, uncons) as Array import Data.Bifunctor (bimap) -import Data.BigInt (toString) as BigInt import Data.Either (Either(Left, Right), either, isLeft) import Data.Foldable (find, foldMap, foldl, length) import Data.FoldableWithIndex (foldMapWithIndex) import Data.Function (applyN) import Data.Generic.Rep (class Generic) import Data.Int (ceil, decimal, toNumber, toStringAs) +import Data.Lens (non, (^.)) import Data.Maybe (Maybe(Just, Nothing)) -import Data.Newtype (class Newtype) +import Data.Newtype (class Newtype, unwrap) import Data.Show.Generic (genericShow) import Data.String (Pattern(Pattern)) import Data.String.CodePoints (length) as String import Data.String.Common (joinWith, split) as String import Data.String.Utils (padEnd) -import Data.Tuple (snd) -import Data.Tuple.Nested (type (/\), (/\)) +import JS.BigInt (toString) as BigInt -- | Errors conditions that may possibly arise during transaction balancing data BalanceTxError - = BalanceInsufficientError Expected Actual InvalidInContext + = BalanceInsufficientError Expected Actual | CouldNotConvertScriptOutputToTxInput - | CouldNotGetChangeAddress | CouldNotGetCollateral + | InsufficientCollateralUtxos UtxoMap | CouldNotGetUtxos - | CollateralReturnError String - | CollateralReturnMinAdaValueCalcError - | ExUnitsEvaluationFailed UnattachedUnbalancedTx Ogmios.TxEvaluationFailure - | InsufficientUtxoBalanceToCoverAsset ImpossibleError String - | ReindexRedeemersError ReindexErrors + | CollateralReturnError + | CollateralReturnMinAdaValueCalcError CoinsPerUtxoUnit TransactionOutput + | ExUnitsEvaluationFailed Transaction Ogmios.TxEvaluationFailure + | InsufficientUtxoBalanceToCoverAsset String + | ReindexRedeemersError UnindexedRedeemer | UtxoLookupFailedFor TransactionInput | UtxoMinAdaValueCalculationFailed derive instance Generic BalanceTxError _ instance Show BalanceTxError where - show (ExUnitsEvaluationFailed tx failure) = - "ExUnitsEvaluationFailed: " <> printTxEvaluationFailure tx failure show e = genericShow e +explainBalanceTxError :: BalanceTxError -> String +explainBalanceTxError = case _ of + BalanceInsufficientError expected actual -> + "Insufficient balance. " <> prettyValue "Expected" (unwrap expected) + <> ", " + <> prettyValue "actual" (unwrap actual) + InsufficientCollateralUtxos utxos -> + "Could not cover collateral requirements. " <> + pprintTagSet "UTxOs for collateral selection:" (pprintUtxoMap utxos) + CouldNotConvertScriptOutputToTxInput -> + "Could not convert script output to transaction input" + CouldNotGetCollateral -> "Could not get collateral from wallet" + CouldNotGetUtxos -> + "Could not get UTxOs from the wallet or the specified source addresses" + CollateralReturnError -> + "Negative totalCollateral after covering min-utxo-ada requirement." + <> "This should be impossible: please report this as a bug to " + <> bugTrackerLink + CollateralReturnMinAdaValueCalcError coinsPerUtxoUnit txOut -> + "Could not calculate minimum Ada for collateral return.\n" + <> "Coins per UTxO unit: " + <> show coinsPerUtxoUnit + <> "\nTransaction output: " + <> show txOut + ExUnitsEvaluationFailed _ _ -> + "Script evaluation failure while trying to estimate ExUnits" + InsufficientUtxoBalanceToCoverAsset asset -> + "Insufficient UTxO balance to cover asset named " + <> asset + <> "\nThis should be impossible: please report this as a bug to " + <> bugTrackerLink + ReindexRedeemersError uir -> + "Could not reindex redeemer " + <> show uir + <> "\nThis should be impossible: please report this as a bug to " + <> bugTrackerLink + UtxoLookupFailedFor ti -> + "Could not look up UTxO for " + <> show ti + <> " from a given set of UTxOs.\n" + <> "This should be impossible: please report this as a bug to " + <> bugTrackerLink + UtxoMinAdaValueCalculationFailed -> + "Could not calculate min ADA for UTxO" + where + prettyValue :: String -> Value -> String + prettyValue str = fromPlutusValue >>> pprintValue >>> pprintTagSet str + newtype Actual = Actual Value derive instance Generic Actual _ @@ -96,14 +150,6 @@ derive instance Newtype Actual _ instance Show Actual where show = genericShow -newtype InvalidInContext = InvalidInContext Value - -derive instance Generic InvalidInContext _ -derive instance Newtype InvalidInContext _ - -instance Show InvalidInContext where - show = genericShow - newtype Expected = Expected Value derive instance Generic Expected _ @@ -112,14 +158,6 @@ derive instance Newtype Expected _ instance Show Expected where show = genericShow --- | Indicates that an error should be impossible. -data ImpossibleError = Impossible - -derive instance Generic ImpossibleError _ - -instance Show ImpossibleError where - show = genericShow - -------------------------------------------------------------------------------- -- Failure parsing for Ogmios.EvaluateTx -------------------------------------------------------------------------------- @@ -168,18 +206,21 @@ number ary = freeze (foldl go [] ary) -- | Exported to allow testing, use `Test.Ogmios.Aeson.printEvaluateTxFailures` -- | to visually verify the printing of errors without a context on fixtures. printTxEvaluationFailure - :: UnattachedUnbalancedTx -> Ogmios.TxEvaluationFailure -> String -printTxEvaluationFailure (UnattachedUnbalancedTx { redeemersTxIns }) e = + :: Transaction -> Ogmios.TxEvaluationFailure -> String +printTxEvaluationFailure transaction e = runPrettyString $ case e of Ogmios.UnparsedError error -> line $ "Unknown error: " <> error + Ogmios.AdditionalUtxoOverlap utxos -> + line $ "AdditionalUtxoOverlap: " <> show utxos Ogmios.ScriptFailures sf -> line "Script failures:" <> bullet (foldMapWithIndex printScriptFailures sf) where lookupRedeemerPointer - :: Ogmios.RedeemerPointer -> Maybe (Redeemer /\ Maybe TransactionInput) - lookupRedeemerPointer ptr = flip find redeemersTxIns - $ \(Redeemer rdmr /\ _) -> rdmr.tag == ptr.redeemerTag && rdmr.index == - Natural.toBigInt ptr.redeemerIndex + :: Ogmios.RedeemerPointer -> Maybe Redeemer + lookupRedeemerPointer ptr = + flip find (transaction ^. _witnessSet <<< _redeemers <<< non []) + $ \(Redeemer { index, tag }) -> tag == ptr.redeemerTag && index == + Natural.toBigInt ptr.redeemerIndex printRedeemerPointer :: Ogmios.RedeemerPointer -> PrettyString printRedeemerPointer ptr = @@ -195,9 +236,8 @@ printTxEvaluationFailure (UnattachedUnbalancedTx { redeemersTxIns }) e = printRedeemerDetails ptr = let mbRedeemerTxIn = lookupRedeemerPointer ptr - mbData = mbRedeemerTxIn <#> \(Redeemer r /\ _) -> "Redeemer: " <> show - r.data - mbTxIn = (mbRedeemerTxIn >>= snd) <#> \txIn -> "Input: " <> show txIn + mbData = mbRedeemerTxIn <#> \(Redeemer r) -> "Redeemer: " <> show r.data + mbTxIn = mbRedeemerTxIn <#> \txIn -> "Input: " <> show txIn in foldMap line $ Array.catMaybes [ mbData, mbTxIn ] @@ -214,22 +254,26 @@ printTxEvaluationFailure (UnattachedUnbalancedTx { redeemersTxIns }) e = <> bullet (foldMap (foldMap line) provided) <> line "But missing required datums:" <> bullet (foldMap line missing) - Ogmios.MissingRequiredScripts { resolved, missing } + Ogmios.MissingRequiredScripts { resolved: mresolved, missing } -> line "Supplied with scripts:" <> bullet - ( foldMapWithIndex - (\ptr scr -> printRedeemer ptr <> line ("Script: " <> scr)) - resolved + ( foldMap + ( foldMapWithIndex + (\ptr scr -> printRedeemer ptr <> line ("Script: " <> show scr)) + ) + mresolved ) <> line "But missing required scripts:" - <> bullet (foldMap line missing) + <> bullet (foldMap printRedeemer missing) Ogmios.ValidatorFailed { error, traces } -> line error <> line "Trace:" <> number (foldMap line traces) Ogmios.UnknownInputReferencedByRedeemer txIn -> line ("Unknown input referenced by redeemer: " <> show txIn) Ogmios.NonScriptInputReferencedByRedeemer txIn -> line - ("Non script input referenced by redeemer: " <> show txIn) + ( "Non-script input, or input without datum, referenced by redeemer: " <> + show txIn + ) Ogmios.IllFormedExecutionBudget Nothing -> line ("Ill formed execution budget: Execution budget missing") Ogmios.IllFormedExecutionBudget (Just { memory, steps }) -> @@ -238,8 +282,14 @@ printTxEvaluationFailure (UnattachedUnbalancedTx { redeemersTxIns }) e = ( line ("Memory: " <> BigInt.toString (Natural.toBigInt memory)) <> line ("Steps: " <> BigInt.toString (Natural.toBigInt steps)) ) - Ogmios.NoCostModelForLanguage language -> line - ("No cost model for language \"" <> language <> "\"") + Ogmios.NoCostModelForLanguage languages -> + line "No cost model for languages:" + <> bullet (foldMap line languages) + Ogmios.InternalLedgerTypeConversionError error -> + line $ + "Internal ledger type conversion error, if you ever run into this, please report the issue as you've likely discoverd a critical bug: \"" + <> error + <> "\"" printScriptFailures :: Ogmios.RedeemerPointer -> Array Ogmios.ScriptFailure -> PrettyString diff --git a/src/Internal/BalanceTx/ExUnitsAndMinFee.purs b/src/Internal/BalanceTx/ExUnitsAndMinFee.purs index 567a4cdc5..c902223a8 100644 --- a/src/Internal/BalanceTx/ExUnitsAndMinFee.purs +++ b/src/Internal/BalanceTx/ExUnitsAndMinFee.purs @@ -5,26 +5,30 @@ module Ctl.Internal.BalanceTx.ExUnitsAndMinFee import Prelude -import Control.Monad.Error.Class (liftEither, throwError) +import Contract.Numeric.Natural (fromInt') as Natural +import Control.Monad.Error.Class (throwError) import Control.Monad.Except.Trans (except) -import Ctl.Internal.BalanceTx.Constraints (_additionalUtxos) as Constraints +import Ctl.Internal.BalanceTx.Constraints + ( _additionalUtxos + , _collateralUtxos + ) as Constraints import Ctl.Internal.BalanceTx.Error - ( BalanceTxError - ( ExUnitsEvaluationFailed - , ReindexRedeemersError - , UtxoLookupFailedFor - ) + ( BalanceTxError(UtxoLookupFailedFor, ExUnitsEvaluationFailed) + ) +import Ctl.Internal.BalanceTx.RedeemerIndex + ( IndexedRedeemer + , attachRedeemers + , indexedRedeemerToRedeemer ) -import Ctl.Internal.BalanceTx.Helpers (_body', _redeemersTxIns) import Ctl.Internal.BalanceTx.Types ( BalanceTxM , FinalizedTransaction(FinalizedTransaction) - , PrebalancedTransaction(PrebalancedTransaction) , askCostModelsForLanguages , askNetworkId , asksConstraints , liftContract ) +import Ctl.Internal.BalanceTx.UnattachedTx (EvaluatedTx, IndexedTx) import Ctl.Internal.Cardano.Types.ScriptRef as ScriptRef import Ctl.Internal.Cardano.Types.Transaction ( Costmdls @@ -35,124 +39,126 @@ import Ctl.Internal.Cardano.Types.Transaction , TxBody(TxBody) , UtxoMap , _body - , _inputs , _isValid , _plutusData - , _redeemers , _witnessSet ) import Ctl.Internal.Contract.MinFee (calculateMinFee) as Contract.MinFee -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.Plutus.Conversion (fromPlutusUtxoMap) import Ctl.Internal.QueryM.Ogmios ( AdditionalUtxoSet + , TxEvaluationFailure(AdditionalUtxoOverlap) , TxEvaluationResult(TxEvaluationResult) ) as Ogmios -import Ctl.Internal.ReindexRedeemers - ( ReindexErrors - , reindexSpentScriptRedeemers' - ) +import Ctl.Internal.QueryM.Ogmios (TxEvaluationFailure(UnparsedError)) import Ctl.Internal.Transaction (setScriptDataHash) import Ctl.Internal.TxOutput ( transactionInputToTxOutRef , transactionOutputToOgmiosTxOut ) import Ctl.Internal.Types.Datum (Datum) -import Ctl.Internal.Types.Natural (fromBigInt', toBigInt) as Natural -import Ctl.Internal.Types.ScriptLookups - ( UnattachedUnbalancedTx(UnattachedUnbalancedTx) - ) +import Ctl.Internal.Types.Natural (toBigInt) as Natural import Ctl.Internal.Types.Scripts (Language, PlutusScript) import Ctl.Internal.Types.Transaction (TransactionInput) -import Ctl.Internal.Types.UnbalancedTransaction (_transaction) import Data.Array (catMaybes) -import Data.Array (fromFoldable) as Array -import Data.Bifunctor (bimap, lmap) -import Data.BigInt (BigInt) +import Data.Array (fromFoldable, notElem) as Array +import Data.Bifunctor (bimap) import Data.Either (Either(Left, Right), note) import Data.Foldable (foldMap) import Data.Lens.Getter ((^.)) -import Data.Lens.Setter ((%~), (.~), (?~)) -import Data.Map (empty, fromFoldable, lookup, toUnfoldable) as Map -import Data.Maybe (Maybe, fromMaybe, maybe) +import Data.Lens.Setter ((?~)) +import Data.Map (empty, filterKeys, fromFoldable, lookup, toUnfoldable, union) as Map +import Data.Maybe (Maybe(Just, Nothing), fromMaybe) import Data.Newtype (unwrap, wrap) import Data.Set (Set) import Data.Set as Set import Data.Traversable (for) -import Data.Tuple (fst, snd) +import Data.Tuple (snd) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) +import JS.BigInt (BigInt) evalTxExecutionUnits :: Transaction - -> UnattachedUnbalancedTx -> BalanceTxM Ogmios.TxEvaluationResult -evalTxExecutionUnits tx unattachedTx = do - queryHandle <- liftContract getQueryHandle - additionalUtxos <- getOgmiosAdditionalUtxoSet - evalResult <- - unwrap <$> liftContract - (liftAff $ queryHandle.evaluateTx tx additionalUtxos) - - case evalResult of - Right a -> pure a - Left evalFailure | tx ^. _isValid -> - throwError $ ExUnitsEvaluationFailed unattachedTx evalFailure - Left _ -> pure $ wrap Map.empty +evalTxExecutionUnits tx = do + networkId <- askNetworkId + additionalUtxos <- + fromPlutusUtxoMap networkId <$> asksConstraints Constraints._additionalUtxos + worker $ toOgmiosAdditionalUtxos additionalUtxos where - getOgmiosAdditionalUtxoSet :: BalanceTxM Ogmios.AdditionalUtxoSet - getOgmiosAdditionalUtxoSet = do - networkId <- askNetworkId - additionalUtxos <- - asksConstraints Constraints._additionalUtxos - <#> fromPlutusUtxoMap networkId - pure $ wrap $ Map.fromFoldable + toOgmiosAdditionalUtxos :: UtxoMap -> Ogmios.AdditionalUtxoSet + toOgmiosAdditionalUtxos additionalUtxos = + wrap $ Map.fromFoldable ( bimap transactionInputToTxOutRef transactionOutputToOgmiosTxOut <$> (Map.toUnfoldable :: _ -> Array _) additionalUtxos ) + worker :: Ogmios.AdditionalUtxoSet -> BalanceTxM Ogmios.TxEvaluationResult + worker additionalUtxos = do + queryHandle <- liftContract getQueryHandle + evalResult <- + unwrap <$> liftContract + (liftAff $ queryHandle.evaluateTx tx additionalUtxos) + case evalResult of + Right a -> pure a + Left (Ogmios.AdditionalUtxoOverlap overlappingUtxos) -> + -- Remove overlapping additional utxos and retry evaluation: + worker $ wrap $ Map.filterKeys (flip Array.notElem overlappingUtxos) + (unwrap additionalUtxos) + Left evalFailure | tx ^. _isValid -> + throwError $ ExUnitsEvaluationFailed tx evalFailure + Left _ -> + pure $ wrap Map.empty + -- Calculates the execution units needed for each script in the transaction -- and the minimum fee, including the script fees. --- Returns a tuple consisting of updated `UnattachedUnbalancedTx` and --- the minimum fee. +-- Returns a tuple consisting of updated `UnbalancedTx` and the minimum fee. evalExUnitsAndMinFee - :: PrebalancedTransaction + :: IndexedTx -> UtxoMap - -> BalanceTxM (UnattachedUnbalancedTx /\ BigInt) -evalExUnitsAndMinFee (PrebalancedTransaction unattachedTx) allUtxos = do - -- Reindex `Spent` script redeemers: - reindexedUnattachedTx <- liftEither $ - reindexRedeemers unattachedTx # lmap ReindexRedeemersError + -> BalanceTxM (EvaluatedTx /\ BigInt) +evalExUnitsAndMinFee unattachedTx allUtxos = do -- Reattach datums and redeemers before evaluating ex units: - let attachedTx = reattachDatumsAndRedeemers reindexedUnattachedTx + let attachedTx = reattachDatumsAndFakeRedeemers unattachedTx -- Evaluate transaction ex units: - rdmrPtrExUnitsList <- evalTxExecutionUnits attachedTx reindexedUnattachedTx - let - -- Set execution units received from the server: - reindexedUnattachedTxWithExUnits = - updateTxExecutionUnits reindexedUnattachedTx rdmrPtrExUnitsList + exUnits <- evalTxExecutionUnits attachedTx + -- Set execution units received from the server: + txWithExUnits <- + case updateTxExecutionUnits unattachedTx exUnits of + Just res -> pure res + Nothing + | not (attachedTx ^. _isValid) -> pure $ + unattachedTx + { redeemers = indexedRedeemerToRedeemer <$> unattachedTx.redeemers + } + _ -> throwError $ ExUnitsEvaluationFailed attachedTx + (UnparsedError "Unable to extract ExUnits from Ogmios response") -- Attach datums and redeemers, set the script integrity hash: - FinalizedTransaction finalizedTx <- - finalizeTransaction reindexedUnattachedTxWithExUnits allUtxos + FinalizedTransaction finalizedTx <- finalizeTransaction txWithExUnits allUtxos -- Calculate the minimum fee for a transaction: networkId <- askNetworkId additionalUtxos <- fromPlutusUtxoMap networkId <$> asksConstraints Constraints._additionalUtxos + collateralUtxos <- + fromPlutusUtxoMap networkId <<< fromMaybe Map.empty + <$> asksConstraints Constraints._collateralUtxos minFee <- liftContract $ Contract.MinFee.calculateMinFee finalizedTx - additionalUtxos - pure $ reindexedUnattachedTxWithExUnits /\ unwrap minFee + (Map.union additionalUtxos collateralUtxos) + pure $ txWithExUnits /\ unwrap minFee -- | Attaches datums and redeemers, sets the script integrity hash, -- | for use after reindexing. finalizeTransaction - :: UnattachedUnbalancedTx -> UtxoMap -> BalanceTxM FinalizedTransaction -finalizeTransaction reindexedUnattachedTxWithExUnits utxos = do + :: EvaluatedTx -> UtxoMap -> BalanceTxM FinalizedTransaction +finalizeTransaction tx utxos = do let attachedTxWithExUnits :: Transaction attachedTxWithExUnits = - reattachDatumsAndRedeemers reindexedUnattachedTxWithExUnits + reattachDatumsAndRedeemers tx txBody :: TxBody txBody = attachedTxWithExUnits ^. _body @@ -195,44 +201,43 @@ finalizeTransaction reindexedUnattachedTxWithExUnits utxos = do getPlutusScript (TransactionOutput { scriptRef }) = ScriptRef.getPlutusScript =<< scriptRef -reindexRedeemers - :: UnattachedUnbalancedTx - -> Either ReindexErrors UnattachedUnbalancedTx -reindexRedeemers - unattachedTx@(UnattachedUnbalancedTx { redeemersTxIns }) = - let - inputs = Array.fromFoldable $ unattachedTx ^. _body' <<< _inputs - in - reindexSpentScriptRedeemers' inputs redeemersTxIns <#> - \redeemersTxInsReindexed -> - unattachedTx # _redeemersTxIns .~ redeemersTxInsReindexed +reattachDatumsAndFakeRedeemers :: IndexedTx -> Transaction +reattachDatumsAndFakeRedeemers + { transaction, datums, redeemers } = + reattachDatumsAndRedeemers + { transaction, datums, redeemers: indexedRedeemerToRedeemer <$> redeemers } -reattachDatumsAndRedeemers :: UnattachedUnbalancedTx -> Transaction +reattachDatumsAndRedeemers :: EvaluatedTx -> Transaction reattachDatumsAndRedeemers - (UnattachedUnbalancedTx { unbalancedTx, datums, redeemersTxIns }) = + ({ transaction, datums, redeemers }) = let - transaction = unbalancedTx ^. _transaction + transaction' = attachRedeemers redeemers transaction in - transaction # _witnessSet <<< _plutusData ?~ map unwrap datums - # _witnessSet <<< _redeemers ?~ map fst redeemersTxIns + transaction' + # _witnessSet <<< _plutusData ?~ map unwrap datums updateTxExecutionUnits - :: UnattachedUnbalancedTx - -> Ogmios.TxEvaluationResult - -> UnattachedUnbalancedTx -updateTxExecutionUnits unattachedTx rdmrPtrExUnitsList = - unattachedTx # - _redeemersTxIns %~ flip setRdmrsExecutionUnits rdmrPtrExUnitsList - -setRdmrsExecutionUnits - :: Array (Redeemer /\ Maybe TransactionInput) + :: IndexedTx -> Ogmios.TxEvaluationResult - -> Array (Redeemer /\ Maybe TransactionInput) -setRdmrsExecutionUnits rs (Ogmios.TxEvaluationResult evalR) = - rs <#> \r@(Redeemer rec@{ tag: redeemerTag, index } /\ oref) -> - Map.lookup { redeemerTag, redeemerIndex: Natural.fromBigInt' index } evalR - # maybe r \{ memory, steps } -> - Redeemer rec - { exUnits = - { mem: Natural.toBigInt memory, steps: Natural.toBigInt steps } - } /\ oref + -> Maybe EvaluatedTx +updateTxExecutionUnits tx@{ redeemers } result = + getRedeemersExUnits result redeemers <#> \redeemers' -> tx + { redeemers = redeemers' } + +getRedeemersExUnits + :: Ogmios.TxEvaluationResult + -> Array IndexedRedeemer + -> Maybe (Array Redeemer) +getRedeemersExUnits (Ogmios.TxEvaluationResult result) redeemers = do + for redeemers \indexedRedeemer -> do + { memory, steps } <- Map.lookup + { redeemerTag: (unwrap indexedRedeemer).tag + , redeemerIndex: Natural.fromInt' (unwrap indexedRedeemer).index + } + result + pure $ Redeemer $ (unwrap $ indexedRedeemerToRedeemer indexedRedeemer) + { exUnits = + { mem: Natural.toBigInt memory + , steps: Natural.toBigInt steps + } + } diff --git a/src/Internal/BalanceTx/Helpers.purs b/src/Internal/BalanceTx/Helpers.purs deleted file mode 100644 index 1aa5f7439..000000000 --- a/src/Internal/BalanceTx/Helpers.purs +++ /dev/null @@ -1,46 +0,0 @@ -module Ctl.Internal.BalanceTx.Helpers - ( _body' - , _redeemersTxIns - , _transaction' - , _unbalancedTx - ) where - -import Prelude - -import Ctl.Internal.Cardano.Types.Transaction - ( Redeemer - , Transaction - , TxBody - , _body - ) -import Ctl.Internal.Types.ScriptLookups - ( UnattachedUnbalancedTx(UnattachedUnbalancedTx) - ) -import Ctl.Internal.Types.Transaction (TransactionInput) -import Ctl.Internal.Types.UnbalancedTransaction (UnbalancedTx, _transaction) -import Data.Lens (Lens', lens') -import Data.Lens.Getter ((^.)) -import Data.Lens.Setter ((%~), (.~)) -import Data.Maybe (Maybe) -import Data.Tuple.Nested (type (/\), (/\)) - -_unbalancedTx :: Lens' UnattachedUnbalancedTx UnbalancedTx -_unbalancedTx = lens' \(UnattachedUnbalancedTx rec@{ unbalancedTx }) -> - unbalancedTx /\ - \ubTx -> UnattachedUnbalancedTx rec { unbalancedTx = ubTx } - -_transaction' :: Lens' UnattachedUnbalancedTx Transaction -_transaction' = lens' \unattachedTx -> - unattachedTx ^. _unbalancedTx <<< _transaction /\ - \tx -> unattachedTx # _unbalancedTx %~ (_transaction .~ tx) - -_body' :: Lens' UnattachedUnbalancedTx TxBody -_body' = lens' \unattachedTx -> - unattachedTx ^. _transaction' <<< _body /\ - \txBody -> unattachedTx # _transaction' %~ (_body .~ txBody) - -_redeemersTxIns - :: Lens' UnattachedUnbalancedTx (Array (Redeemer /\ Maybe TransactionInput)) -_redeemersTxIns = lens' \(UnattachedUnbalancedTx rec@{ redeemersTxIns }) -> - redeemersTxIns /\ - \rdmrs -> UnattachedUnbalancedTx rec { redeemersTxIns = rdmrs } diff --git a/src/Internal/BalanceTx/RedeemerIndex.purs b/src/Internal/BalanceTx/RedeemerIndex.purs new file mode 100644 index 000000000..3308e1db7 --- /dev/null +++ b/src/Internal/BalanceTx/RedeemerIndex.purs @@ -0,0 +1,175 @@ +-- | Redeemer indexing refers to the process of updating redeemer's `index` +-- | value based on its `RedeemerPurpose` and context from the transaction. +-- | Redeemer indexing is needed, because at the Tx construction stage we +-- | don't know the exact indices redeemers will have after balancing. +-- | For the algorithm, see `indexof` description in +-- | "Combining Scripts with Their Inputs" chapter of "A Formal Specification +-- | of the Cardano Ledger integrating Plutus Core" +-- | https://github.com/input-output-hk/cardano-ledger/releases/latest/download/alonzo-ledger.pdf +module Ctl.Internal.BalanceTx.RedeemerIndex + ( IndexedRedeemer(IndexedRedeemer) + , RedeemerPurpose(ForReward, ForCert, ForMint, ForSpend) + , RedeemersContext + , UnindexedRedeemer(UnindexedRedeemer) + , attachIndexedRedeemers + , attachRedeemers + , indexRedeemers + , indexedRedeemerToRedeemer + , mkRedeemersContext + , unindexedRedeemerToRedeemer + ) where + +import Prelude + +import Aeson (class EncodeAeson, encodeAeson) +import Ctl.Internal.Cardano.Types.Transaction + ( Certificate + , Redeemer(Redeemer) + , Transaction(Transaction) + , TxBody(TxBody) + , _redeemers + , _witnessSet + ) +import Ctl.Internal.Cardano.Types.Value (currencyMPSHash, unwrapNonAdaAsset) +import Ctl.Internal.Types.PlutusData (PlutusData) +import Ctl.Internal.Types.RedeemerTag (RedeemerTag(Spend, Mint, Cert, Reward)) +import Ctl.Internal.Types.RewardAddress (RewardAddress) +import Ctl.Internal.Types.Scripts (MintingPolicyHash) +import Ctl.Internal.Types.Transaction (TransactionInput) +import Data.Array (findIndex) +import Data.Either (Either, note) +import Data.Foldable (fold) +import Data.Generic.Rep (class Generic) +import Data.Lens ((.~)) +import Data.Map as Map +import Data.Maybe (Maybe(Just), fromMaybe) +import Data.Newtype (class Newtype, unwrap) +import Data.Set as Set +import Data.Show.Generic (genericShow) +import Data.Traversable (for) +import JS.BigInt as BigInt + +attachRedeemers :: Array Redeemer -> Transaction -> Transaction +attachRedeemers redeemers = _witnessSet <<< _redeemers .~ Just redeemers + +attachIndexedRedeemers :: Array IndexedRedeemer -> Transaction -> Transaction +attachIndexedRedeemers = attachRedeemers <<< map indexedRedeemerToRedeemer + +-- | Redeemer that hasn't yet been indexed, that tracks its purpose info +-- | that is enough to find its index given a `RedeemersContext`. +newtype UnindexedRedeemer = UnindexedRedeemer + { datum :: PlutusData + , purpose :: RedeemerPurpose + } + +derive instance Generic UnindexedRedeemer _ +derive instance Newtype UnindexedRedeemer _ +derive newtype instance Eq UnindexedRedeemer +derive newtype instance EncodeAeson UnindexedRedeemer + +instance Show UnindexedRedeemer where + show = genericShow + +-- | Ignore the value that the redeemer points to +redeemerPurposeToRedeemerTag :: RedeemerPurpose -> RedeemerTag +redeemerPurposeToRedeemerTag = case _ of + ForSpend _ -> Spend + ForMint _ -> Mint + ForReward _ -> Reward + ForCert _ -> Cert + +unindexedRedeemerToRedeemer :: UnindexedRedeemer -> Redeemer +unindexedRedeemerToRedeemer (UnindexedRedeemer { datum, purpose }) = + Redeemer + { tag: redeemerPurposeToRedeemerTag purpose + , "data": datum + , index: zero + , exUnits: zero + } + +-- | A redeemer with an index, but without `ExUnits` +newtype IndexedRedeemer = IndexedRedeemer + { tag :: RedeemerTag + , datum :: PlutusData + , index :: Int + } + +derive instance Generic IndexedRedeemer _ +derive instance Newtype IndexedRedeemer _ +derive newtype instance Eq IndexedRedeemer +derive newtype instance EncodeAeson IndexedRedeemer + +instance Show IndexedRedeemer where + show = genericShow + +-- | Sets `ExUnits` to `zero` +indexedRedeemerToRedeemer :: IndexedRedeemer -> Redeemer +indexedRedeemerToRedeemer (IndexedRedeemer { tag, datum, index }) = + Redeemer + { tag + , index: BigInt.fromInt index + , data: datum + , exUnits: { mem: zero, steps: zero } + } + +-- | Contains a value redeemer corresponds to, different for each possible +-- | `RedeemerTag`. +-- | Allows to uniquely compute redeemer index, given a `RedeemersContext` that +-- | is valid for the transaction. +data RedeemerPurpose + = ForSpend TransactionInput + | ForMint MintingPolicyHash + | ForReward RewardAddress + | ForCert Certificate + +derive instance Generic RedeemerPurpose _ +derive instance Eq RedeemerPurpose + +instance EncodeAeson RedeemerPurpose where + encodeAeson = case _ of + ForSpend txo -> encodeAeson { tag: "ForSpend", value: encodeAeson txo } + ForMint mps -> encodeAeson { tag: "ForMint", value: encodeAeson mps } + ForReward addr -> encodeAeson { tag: "ForReward", value: encodeAeson addr } + ForCert cert -> encodeAeson { tag: "ForCert", value: encodeAeson cert } + +instance Show RedeemerPurpose where + show = genericShow + +-- | Contains parts of a transaction that are important when indexing redeemers +type RedeemersContext = + { inputs :: Array TransactionInput + , mintingPolicyHashes :: Array MintingPolicyHash + , rewardAddresses :: Array RewardAddress + , certs :: Array Certificate + } + +mkRedeemersContext :: Transaction -> RedeemersContext +mkRedeemersContext + (Transaction { body: TxBody { inputs, mint, withdrawals, certs } }) = + { inputs: Set.toUnfoldable inputs + , mintingPolicyHashes: Set.toUnfoldable (Map.keys mintedAssets) <#> + currencyMPSHash + , rewardAddresses: Set.toUnfoldable $ Map.keys $ fromMaybe Map.empty + withdrawals + , certs: fold certs + } + where + mintedAssets = fromMaybe Map.empty (map unwrapNonAdaAsset $ map unwrap mint) + +indexRedeemers + :: RedeemersContext + -> Array UnindexedRedeemer + -> Either UnindexedRedeemer (Array IndexedRedeemer) +indexRedeemers ctx redeemers = do + for redeemers \redeemer -> note redeemer $ indexRedeemer ctx redeemer + +indexRedeemer :: RedeemersContext -> UnindexedRedeemer -> Maybe IndexedRedeemer +indexRedeemer ctx (UnindexedRedeemer { purpose, datum }) = case purpose of + ForSpend input -> findIndex (eq input) ctx.inputs <#> \index -> + IndexedRedeemer { tag: Spend, index, datum } + ForMint mps -> findIndex (eq mps) ctx.mintingPolicyHashes <#> \index -> + IndexedRedeemer { tag: Mint, index, datum } + ForReward addr -> findIndex (eq addr) ctx.rewardAddresses <#> \index -> + IndexedRedeemer { tag: Reward, index, datum } + ForCert cert -> findIndex (eq cert) ctx.certs <#> \index -> + IndexedRedeemer { tag: Cert, index, datum } diff --git a/src/Internal/BalanceTx/Sync.purs b/src/Internal/BalanceTx/Sync.purs new file mode 100644 index 000000000..7895b6e39 --- /dev/null +++ b/src/Internal/BalanceTx/Sync.purs @@ -0,0 +1,286 @@ +-- | Internal module that handles UTxO set synchronization between backend +-- | and wallet query layers. +module Ctl.Internal.BalanceTx.Sync + ( syncBackendWithWallet + , syncWalletWithTransaction + , syncWalletWithTxInputs + , isCip30Wallet + , getControlledAddresses + , withoutSync + , disabledSynchronizationParams + ) where + +import Prelude + +import Contract.Log (logError', logTrace', logWarn') +import Contract.Monad (Contract, liftedE) +import Control.Monad.Reader (local) +import Control.Monad.Reader.Class (asks) +import Control.Parallel (parOneOf, parTraverse, parallel, sequential) +import Ctl.Internal.Cardano.Types.Transaction (UtxoMap) +import Ctl.Internal.Cardano.Types.Transaction as Cardano +import Ctl.Internal.Cardano.Types.TransactionUnspentOutput + ( TransactionUnspentOutput + ) +import Ctl.Internal.Contract.Monad + ( ContractSynchronizationParams + , getQueryHandle + ) +import Ctl.Internal.Contract.Wallet + ( getChangeAddress + , getUnusedAddresses + , getWalletAddresses + , getWalletCollateral + , getWalletUtxos + ) +import Ctl.Internal.Helpers (liftEither, liftedM) +import Ctl.Internal.Serialization.Address (Address) +import Ctl.Internal.Types.ByteArray (byteArrayToHex) +import Ctl.Internal.Types.Transaction (TransactionHash, TransactionInput) +import Ctl.Internal.Wallet (Wallet(GenericCip30)) +import Data.Array as Array +import Data.Bifunctor (bimap) +import Data.Map as Map +import Data.Maybe (Maybe(Just), fromMaybe, isJust, maybe) +import Data.Monoid (guard) +import Data.Newtype (unwrap) +import Data.Set (Set) +import Data.Set as Set +import Data.Time.Duration (Milliseconds, fromDuration) +import Data.Tuple (Tuple(Tuple), fst, snd) +import Data.Tuple.Nested ((/\)) +import Effect.Aff (delay) +import Effect.Aff.Class (liftAff) +import Effect.Class (liftEffect) +import Effect.Exception (error, throw) +import Effect.Ref as Ref + +-- | Wait until all UTxOs that the wallet returns are visible in the +-- | query layer. +syncBackendWithWallet :: Contract Unit +syncBackendWithWallet = whenM isCip30Wallet do + { delay: delayMs, timeout } <- asks $ _.timeParams >>> _.syncBackend + { errorOnTimeout } <- asks $ + _.synchronizationParams >>> _.syncBackendWithWallet + let + errorMessage = "Failed to wait for wallet state synchronization (timeout). " + <> guard (not errorOnTimeout) "Continuing anyway. " + <> "Consider increasing `timeParams.syncBackend.timeout`" + <> " in `ContractParams`" + knownTxsRef <- asks (_.knownTxs >>> _.backend) + let + sync :: Contract Unit + sync = do + utxos <- getControlledUtxos + alreadyFoundTxs <- liftEffect $ Ref.read knownTxsRef + let + isAlreadyFoundUtxo = + flip Set.member alreadyFoundTxs <<< _.transactionId <<< unwrap + + -- all utxos from the wallet, except of those we have already seen + notYetFoundUtxos :: Array TransactionInput + notYetFoundUtxos = + Array.filter (not <<< isAlreadyFoundUtxo) + $ fst <$> Map.toUnfoldableUnordered utxos + -- split the UTxOs into known to the query layer and not yet known + { yes: newlyFound, no: stillNotFound } <- Array.partition (snd >>> isJust) + <$> parTraverse (\input -> Tuple input <$> getUtxo' input) + notYetFoundUtxos + -- Mark newly found TxIds as known + liftEffect $ Ref.modify_ + ( Set.union + $ Set.fromFoldable + $ newlyFound <#> fst >>> unwrap >>> _.transactionId + ) + knownTxsRef + if Array.null stillNotFound then do + logTrace' "syncBackendWithWallet: synchronization finished" + else do + logTrace' $ + "syncBackendWithWallet: waiting for query layer state " <> + "synchronization with the wallet..." + liftAff (delay delayMs) + sync + parOneOf + [ sync + , waitAndError errorOnTimeout (fromDuration timeout) errorMessage + ] + +-- | Wait until the wallet can see the UTxOs created by a given transaction. +-- | This function assumes that the transaction has already been confirmed +-- | (i.e. the backend query layer can see its UTxOs). +-- | This function does not have any effect if `KeyWallet` is used. +-- | This function does not have any effect if none of the outputs are at +-- | addresses controlled by the wallet. +-- | The assumption is that the transaction has at least one output and that it +-- | hasn't been consumed by another transaction yet. +-- | You don't need to use this function if you use `awaitTxConfirmed*`. +-- | +-- | Theoretically, this function does not work well with UTxO locking feature +-- | of Eternl wallet, but in practice, there's a very low chance that the user +-- | will lock a UTxO right after submitting a Tx before we see it. +-- | Please read `doc/query-layers.md` for more context. +syncWalletWithTransaction :: TransactionHash -> Contract Unit +syncWalletWithTransaction txHash = whenM isCip30Wallet do + { delay: delayMs, timeout } <- asks (_.timeParams >>> _.syncWallet) + { errorOnTimeout } <- asks $ + _.synchronizationParams >>> _.syncWalletWithTransaction + let + errorMessage = "syncWalletWithTransaction: Failed to wait for wallet state " + <> "synchronization. " + <> guard (not errorOnTimeout) "Continuing anyway. " + <> "This may indicate UTxO locking" + <> " in use in the wallet. Consider increasing " + <> "`timeParams.syncWallet.timeout` in `ContractParams`. " + <> "See `doc/query-layers.md` for more info." + queryHandle <- getQueryHandle + let + sync :: Contract Unit + sync = do + inputs <- map fst <<< Map.toUnfoldable <$> getControlledUtxos + -- We can wait for just one, because once we have it, we know that + -- the tx effects have propagated to the wallet (Txs are atomic) + if Array.any (\input -> (unwrap input).transactionId == txHash) inputs then + do + logTrace' "syncWalletWithTransaction: synchronization finished" + else do + logTrace' $ + "syncWalletWithTransaction: waiting for wallet state synchronization " + <> "with the query layer, querying for Tx: " + <> byteArrayToHex (unwrap txHash) + liftAff (delay delayMs) + sync + -- Collect all the addresses controlled by the wallet + -- (reward addresses are omitted on purpose, we don't need them) + ownAddresses /\ outputAddresses <- sequential do + Tuple <$> parallel getControlledAddresses <*> parallel do + liftAff $ liftEither =<< do + queryHandle.getOutputAddressesByTxHash txHash <#> + bimap (error <<< show) Set.fromFoldable + if Set.isEmpty (Set.intersection ownAddresses outputAddresses) then do + logWarn' $ "syncWalletWithTransaction: " + <> "Skipping wait for wallet state synchronization, because the " + <> "transaction does not include outputs controlled by this wallet." + logTrace' $ + "Wallet addresses: " <> show ownAddresses + logTrace' $ + "Transaction output addresses: " <> show ownAddresses + else do + parOneOf + [ sync + , waitAndError errorOnTimeout (fromDuration timeout) errorMessage + ] + +-- | Waits until all provided transaction inputs appear in the UTxO +-- | set provided by the wallet. +-- | This is a hacky solution to the problem of wallets not seeing UTxOs that +-- | hasn't been fully confirmed at the moment of a `sign()` call. +-- | The problem is, since the wallet can't detect UTxO origin, it can't decide +-- | which of the private keys to use for signing. +-- | As a result, we get `MissingVKeyWitnesses`. +-- | You don't have to call this function before `signTx`, because its use is +-- | enabled by default. +syncWalletWithTxInputs :: Array TransactionInput -> Contract Unit +syncWalletWithTxInputs txInputs = whenM isCip30Wallet do + { delay: delayMs, timeout } <- asks (_.timeParams >>> _.syncWallet) + { errorOnTimeout } <- asks $ + _.synchronizationParams >>> _.syncWalletWithTxInputs + ownAddrs <- getControlledAddresses + ownInputUtxos <- txInputs # + parTraverse + ( \txInput -> do + utxo <- liftedM (error "Could not get utxo") $ getUtxo' txInput + pure (txInput /\ utxo) + ) >>> map + ( Map.fromFoldable >>> Map.filter + ( flip Set.member ownAddrs + <<< _.address + <<< unwrap + ) + ) + logTrace' $ + "syncWalletWithTxInputs: waiting for UTxO set to synchronize with the " + <> "following inputs: " + <> show ownInputUtxos + let + sync = do + walletUtxos <- getControlledUtxos + let difference = ownInputUtxos `Map.difference` walletUtxos + if Map.isEmpty difference then do + logTrace' "syncWalletWithTxInputs: synchronization finished" + else do + logTrace' $ "syncWalletWithTxInputs: remaining UTxOs that the wallet " + <> "does not know about: " + <> show difference + liftAff $ delay delayMs + sync + parOneOf + [ sync, waitAndError errorOnTimeout (fromDuration timeout) errorMessage ] + where + errorMessage = + "syncWalletWithTxInputs: timeout while waiting for wallet" + <> " UTxO set and CTL query layer UTxO set to synchronize " + <> "(see `timeParams.syncWallet.timeout` in `ContractParams`)" + +-- | A helper to set `synchronizationParams` to `disabledSynchronizationParams` +-- | locally, thus skipping the synchronization process during execution of +-- | the `Contract`. +withoutSync :: forall (a :: Type). Contract a -> Contract a +withoutSync = do + local _ { synchronizationParams = disabledSynchronizationParams } + +-- | Synchronization parameters that make all synchronization primitives +-- | a no-op. +-- | See `doc/query-layers.md` for more info. +disabledSynchronizationParams :: ContractSynchronizationParams +disabledSynchronizationParams = + { syncBackendWithWallet: + { errorOnTimeout: false + , beforeCip30Methods: false + , beforeBalancing: false + } + , syncWalletWithTxInputs: { errorOnTimeout: false, beforeCip30Sign: false } + , syncWalletWithTransaction: + { errorOnTimeout: false, beforeTxConfirmed: false } + } + +-- | A version without plutus conversion for internal use. +getUtxo' :: TransactionInput -> Contract (Maybe Cardano.TransactionOutput) +getUtxo' oref = do + queryHandle <- getQueryHandle + liftedE $ liftAff $ queryHandle.getUtxoByOref oref + +-- | Get all addresses contolled by a wallet: +-- | `getUsedAddresses`, `getUnusedAddresses` and `getChangeAddress` combined. +-- | Reward addresses are not included. +getControlledAddresses :: Contract (Set Address) +getControlledAddresses = do + sequential $ combine + <$> parallel (getWalletAddresses <#> Set.fromFoldable) + <*> parallel (getUnusedAddresses <#> Set.fromFoldable) + <*> parallel (getChangeAddress <#> Set.singleton) + where + combine used unused change = used `Set.union` unused `Set.union` change + +getControlledUtxos :: Contract UtxoMap +getControlledUtxos = do + sequential $ Map.union + <$> parallel (getWalletCollateral <#> maybe Map.empty toUtxoMap) + <*> parallel (getWalletUtxos <#> fromMaybe Map.empty) + where + toUtxoMap :: Array TransactionUnspentOutput -> UtxoMap + toUtxoMap = Map.fromFoldable <<< map + (unwrap >>> \({ input, output }) -> input /\ output) + +isCip30Wallet :: Contract Boolean +isCip30Wallet = asks $ _.wallet >>> case _ of + Just (GenericCip30 _) -> true + _ -> false + +-- | If the first argument is true, it will throw. Otherwise, that would be a +-- | console.error call. +waitAndError :: Boolean -> Milliseconds -> String -> Contract Unit +waitAndError errorOnTimeout timeout errorMessage = do + liftAff $ delay timeout + if errorOnTimeout then liftEffect $ throw errorMessage + else logError' errorMessage diff --git a/src/Internal/BalanceTx/Types.purs b/src/Internal/BalanceTx/Types.purs index 2aa25fec0..10cfa2a59 100644 --- a/src/Internal/BalanceTx/Types.purs +++ b/src/Internal/BalanceTx/Types.purs @@ -2,8 +2,6 @@ module Ctl.Internal.BalanceTx.Types ( BalanceTxM , BalanceTxMContext , FinalizedTransaction(FinalizedTransaction) - , PrebalancedTransaction(PrebalancedTransaction) - , askCip30Wallet , askCoinsPerUtxoUnit , askCostModelsForLanguages , askNetworkId @@ -23,29 +21,27 @@ import Ctl.Internal.BalanceTx.Constraints ( BalanceTxConstraints , BalanceTxConstraintsBuilder ) -import Ctl.Internal.BalanceTx.Constraints - ( buildBalanceTxConstraints - ) as Constraints +import Ctl.Internal.BalanceTx.Constraints (buildBalanceTxConstraints) as Constraints import Ctl.Internal.BalanceTx.Error (BalanceTxError) import Ctl.Internal.Cardano.Types.Transaction (Costmdls(Costmdls), Transaction) import Ctl.Internal.Contract.Monad (Contract, ContractEnv) +import Ctl.Internal.Contract.Wallet (getWalletAddresses) import Ctl.Internal.Serialization.Address (NetworkId) +import Ctl.Internal.Serialization.Address as Csl import Ctl.Internal.Types.ProtocolParameters (CoinsPerUtxoUnit) -import Ctl.Internal.Types.ScriptLookups (UnattachedUnbalancedTx) import Ctl.Internal.Types.Scripts (Language) -import Ctl.Internal.Wallet (Cip30Wallet, cip30Wallet) import Data.Either (Either) import Data.Generic.Rep (class Generic) import Data.Lens (Lens') import Data.Lens.Getter (view) import Data.Map (filterKeys) as Map -import Data.Maybe (Maybe) import Data.Newtype (class Newtype, over, unwrap) import Data.Set (Set) -import Data.Set (member) as Set +import Data.Set (fromFoldable, member) as Set import Data.Show.Generic (genericShow) -type BalanceTxMContext = { constraints :: BalanceTxConstraints } +type BalanceTxMContext = + { constraints :: BalanceTxConstraints, ownAddresses :: Set Csl.Address } type BalanceTxM (a :: Type) = ExceptT BalanceTxError (ReaderT BalanceTxMContext Contract) a @@ -69,9 +65,6 @@ askCoinsPerUtxoUnit = asksContractEnv (_.coinsPerUtxoUnit <<< unwrap <<< _.pparams <<< _.ledgerConstants) -askCip30Wallet :: BalanceTxM (Maybe Cip30Wallet) -askCip30Wallet = asksContractEnv (cip30Wallet <=< _.wallet) - askNetworkId :: BalanceTxM NetworkId askNetworkId = asksContractEnv _.networkId @@ -80,8 +73,11 @@ withBalanceTxConstraints . BalanceTxConstraintsBuilder -> ReaderT BalanceTxMContext Contract a -> Contract a -withBalanceTxConstraints constraintsBuilder = - flip runReaderT { constraints } +withBalanceTxConstraints constraintsBuilder m = do + -- we can ignore failures due to reward addresses because reward addresses + -- do not receive transaction outputs from dApps + ownAddresses <- Set.fromFoldable <$> getWalletAddresses + flip runReaderT { constraints, ownAddresses } m where constraints :: BalanceTxConstraints constraints = Constraints.buildBalanceTxConstraints constraintsBuilder @@ -99,11 +95,3 @@ derive newtype instance Eq FinalizedTransaction instance Show FinalizedTransaction where show = genericShow - -newtype PrebalancedTransaction = PrebalancedTransaction UnattachedUnbalancedTx - -derive instance Generic PrebalancedTransaction _ -derive instance Newtype PrebalancedTransaction _ - -instance Show PrebalancedTransaction where - show = genericShow diff --git a/src/Internal/BalanceTx/UnattachedTx.purs b/src/Internal/BalanceTx/UnattachedTx.purs new file mode 100644 index 000000000..49f1345cd --- /dev/null +++ b/src/Internal/BalanceTx/UnattachedTx.purs @@ -0,0 +1,52 @@ +module Ctl.Internal.BalanceTx.UnattachedTx + ( UnattachedTx + , UnindexedTx + , IndexedTx + , EvaluatedTx + , indexTx + , _transaction + ) where + +import Prelude + +import Ctl.Internal.BalanceTx.RedeemerIndex + ( IndexedRedeemer + , UnindexedRedeemer + , attachIndexedRedeemers + , indexRedeemers + , mkRedeemersContext + ) +import Ctl.Internal.Cardano.Types.Transaction (Redeemer, Transaction) +import Ctl.Internal.Types.Datum (Datum) +import Data.Either (Either) +import Data.Lens (Lens') +import Data.Lens.Record (prop) +import Type.Proxy (Proxy(Proxy)) + +type UnattachedTx redeemer = + { transaction :: Transaction + , datums :: Array Datum + , redeemers :: Array redeemer + } + +-- | A Tx with unindexed redeemers +type UnindexedTx = UnattachedTx UnindexedRedeemer + +-- | A Tx with indexed, but not yet evaluated redeemers +type IndexedTx = UnattachedTx IndexedRedeemer + +-- | A Tx with fully indexed and evaluated redeemers +type EvaluatedTx = UnattachedTx Redeemer + +indexTx :: UnindexedTx -> Either UnindexedRedeemer IndexedTx +indexTx { transaction, datums, redeemers } = do + redeemers' <- indexRedeemers (mkRedeemersContext transaction) redeemers + pure + { transaction: attachIndexedRedeemers redeemers' transaction + , datums + , redeemers: redeemers' + } + +_transaction + :: forall (redeemer :: Type). Lens' (UnattachedTx redeemer) Transaction +_transaction = prop (Proxy :: Proxy "transaction") diff --git a/src/Internal/BalanceTx/UtxoMinAda.js b/src/Internal/BalanceTx/UtxoMinAda.js index 626faddd4..5b6910c84 100644 --- a/src/Internal/BalanceTx/UtxoMinAda.js +++ b/src/Internal/BalanceTx/UtxoMinAda.js @@ -2,19 +2,25 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.minAdaForOutput = maybe => txOutput => dataCost => { - try { - return maybe.just(lib.min_ada_for_output(txOutput, dataCost)); - } catch (_) { - return maybe.nothing; - } -}; +export function minAdaForOutput(maybe) { + return txOutput => dataCost => { + try { + return maybe.just(lib.min_ada_for_output(txOutput, dataCost)); + } catch (_) { + return maybe.nothing; + } + }; +} + +export function newCoinsPerWord(n) { + return lib.DataCost.new_coins_per_word(n); +} -exports.newCoinsPerWord = n => lib.DataCost.new_coins_per_word(n); -exports.newCoinsPerByte = n => lib.DataCost.new_coins_per_byte(n); +export function newCoinsPerByte(n) { + return lib.DataCost.new_coins_per_byte(n); +} diff --git a/src/Internal/BalanceTx/UtxoMinAda.purs b/src/Internal/BalanceTx/UtxoMinAda.purs index 8258f3017..e1d37dba3 100644 --- a/src/Internal/BalanceTx/UtxoMinAda.purs +++ b/src/Internal/BalanceTx/UtxoMinAda.purs @@ -22,10 +22,10 @@ import Ctl.Internal.Types.BigNum import Ctl.Internal.Types.ProtocolParameters ( CoinsPerUtxoUnit(CoinsPerUtxoWord, CoinsPerUtxoByte) ) -import Data.BigInt (BigInt) import Data.Maybe (Maybe, fromJust) import Effect (Effect) import Effect.Exception (error) +import JS.BigInt (BigInt) import Partial.Unsafe (unsafePartial) foreign import minAdaForOutput diff --git a/src/Internal/Base64.js b/src/Internal/Base64.js deleted file mode 100644 index 5bd33d96a..000000000 --- a/src/Internal/Base64.js +++ /dev/null @@ -1,13 +0,0 @@ -const base64 = require("base64-js"); - -exports.fromByteArray = base64.fromByteArray; - -exports.toByteArray = base64.toByteArray; - -exports._decodeBase64 = maybe => str => { - try { - return maybe.just(base64.toByteArray(str)); - } catch (_) { - return maybe.nothing; - } -}; diff --git a/src/Internal/Base64.purs b/src/Internal/Base64.purs deleted file mode 100644 index 241169839..000000000 --- a/src/Internal/Base64.purs +++ /dev/null @@ -1,57 +0,0 @@ -module Ctl.Internal.Base64 - ( Base64String - , mkBase64String - , unBase64String - , toByteArray - , fromByteArray - , decodeBase64 - ) where - -import Prelude - -import Aeson - ( class DecodeAeson - , class EncodeAeson - , JsonDecodeError(TypeMismatch) - , decodeAeson - ) -import Ctl.Internal.FfiHelpers (MaybeFfiHelper, maybeFfiHelper) -import Ctl.Internal.Types.ByteArray (ByteArray) -import Data.Either (Either(Left)) -import Data.Maybe (Maybe, maybe) -import Test.QuickCheck (class Arbitrary, arbitrary) - -newtype Base64String = Base64String String - -derive newtype instance Eq Base64String -derive newtype instance Ord Base64String - -instance Show Base64String where - show str = "(fromByteArray " <> show (toByteArray str) <> ")" - -instance DecodeAeson Base64String where - decodeAeson json = do - decodeAeson json >>= mkBase64String >>> - maybe (Left $ TypeMismatch "Base64String") pure - -derive newtype instance EncodeAeson Base64String - --- | Wraps a `String` into `Base64String` if it is valid. -mkBase64String :: String -> Maybe Base64String -mkBase64String str = decodeBase64 str $> Base64String str - -unBase64String :: Base64String -> String -unBase64String (Base64String str) = str - -foreign import toByteArray :: Base64String -> ByteArray - -foreign import fromByteArray :: ByteArray -> Base64String - -foreign import _decodeBase64 :: MaybeFfiHelper -> String -> Maybe ByteArray - -decodeBase64 :: String -> Maybe ByteArray -decodeBase64 = _decodeBase64 maybeFfiHelper - -instance Arbitrary Base64String where - arbitrary = do - fromByteArray <$> arbitrary diff --git a/src/Internal/Cardano/Types/NativeScript.purs b/src/Internal/Cardano/Types/NativeScript.purs index 4f39e1c74..8014cf544 100644 --- a/src/Internal/Cardano/Types/NativeScript.purs +++ b/src/Internal/Cardano/Types/NativeScript.purs @@ -7,6 +7,7 @@ module Ctl.Internal.Cardano.Types.NativeScript , TimelockStart , TimelockExpiry ) + , pprintNativeScript ) where import Prelude @@ -22,14 +23,22 @@ import Aeson import Ctl.Internal.Helpers (contentsProp, encodeTagged', tagProp) import Ctl.Internal.Metadata.Helpers (errExpectedObject) import Ctl.Internal.Serialization.Address (Slot) -import Ctl.Internal.Serialization.Hash (Ed25519KeyHash, ed25519KeyHashFromBytes) +import Ctl.Internal.Serialization.Hash + ( Ed25519KeyHash + , ed25519KeyHashFromBytes + , ed25519KeyHashToBytes + ) import Ctl.Internal.Types.BigNum (fromString) +import Ctl.Internal.Types.BigNum as BigNum import Ctl.Internal.Types.ByteArray (hexToByteArrayUnsafe) +import Ctl.Internal.Types.RawBytes (rawBytesToHex) import Data.Array.NonEmpty (fromFoldable) import Data.Either (Either(Left)) import Data.Generic.Rep (class Generic) +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag as TagSet import Data.Maybe (fromJust) -import Data.Newtype (wrap) +import Data.Newtype (unwrap, wrap) import Data.Show.Generic (genericShow) import Partial.Unsafe (unsafePartial) import Test.QuickCheck (class Arbitrary) @@ -41,8 +50,8 @@ data NativeScript | ScriptAll (Array NativeScript) | ScriptAny (Array NativeScript) | ScriptNOfK Int (Array NativeScript) - | TimelockStart Slot - | TimelockExpiry Slot + | TimelockStart Slot -- spend after + | TimelockExpiry Slot -- spend before derive instance Eq NativeScript derive instance Generic NativeScript _ @@ -99,3 +108,16 @@ instance EncodeAeson NativeScript where { n, nativeScripts } TimelockStart r -> encodeTagged' "TimelockStart" r TimelockExpiry r -> encodeTagged' "TimelockExpiry" r + +pprintNativeScript :: NativeScript -> TagSet +pprintNativeScript = case _ of + ScriptPubkey kh -> TagSet.fromArray + [ "PubKey" `tag` rawBytesToHex (ed25519KeyHashToBytes kh) ] + ScriptAll scripts -> "All of" `tagSetTag` TagSet.fromArray + (pprintNativeScript <$> scripts) + ScriptAny scripts -> "Any of" `tagSetTag` TagSet.fromArray + (pprintNativeScript <$> scripts) + ScriptNOfK n scripts -> ("At least " <> show n <> " of ") + `tagSetTag` TagSet.fromArray (pprintNativeScript <$> scripts) + TimelockStart slot -> "Timelock start" `tag` BigNum.toString (unwrap slot) + TimelockExpiry slot -> "Timelock expiry" `tag` BigNum.toString (unwrap slot) diff --git a/src/Internal/Cardano/Types/Transaction.purs b/src/Internal/Cardano/Types/Transaction.purs index c443f23fb..3aebed07a 100644 --- a/src/Internal/Cardano/Types/Transaction.purs +++ b/src/Internal/Cardano/Types/Transaction.purs @@ -54,6 +54,7 @@ module Ctl.Internal.Cardano.Types.Transaction , UnitInterval , Update , UtxoMap + , pprintUtxoMap , Vkey(Vkey) , Vkeywitness(Vkeywitness) , _auxiliaryData @@ -94,13 +95,13 @@ import Aeson , caseAesonString , decodeAeson , encodeAeson - , partialFiniteNumber + , finiteNumber ) import Control.Alternative ((<|>)) import Control.Apply (lift2) import Ctl.Internal.Cardano.Types.NativeScript (NativeScript) import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef) -import Ctl.Internal.Cardano.Types.Value (Coin, NonAdaAsset, Value) +import Ctl.Internal.Cardano.Types.Value (Coin, NonAdaAsset, Value, pprintValue) import Ctl.Internal.Deserialization.FromBytes (fromBytes) import Ctl.Internal.Deserialization.Keys ( ed25519SignatureFromBech32 @@ -113,6 +114,7 @@ import Ctl.Internal.Serialization.Address , NetworkId , Slot(Slot) , StakeCredential + , addressBech32 ) import Ctl.Internal.Serialization.Hash ( Ed25519KeyHash @@ -130,39 +132,45 @@ import Ctl.Internal.Serialization.Types (Ed25519Signature, PublicKey) as Seriali import Ctl.Internal.ToData (class ToData, toData) import Ctl.Internal.Types.Aliases (Bech32String) import Ctl.Internal.Types.BigNum (BigNum) -import Ctl.Internal.Types.ByteArray (ByteArray) +import Ctl.Internal.Types.ByteArray (ByteArray, byteArrayToHex) import Ctl.Internal.Types.Int as Int -import Ctl.Internal.Types.OutputDatum (OutputDatum) -import Ctl.Internal.Types.PlutusData (PlutusData) -import Ctl.Internal.Types.PubKeyHash (PaymentPubKeyHash) +import Ctl.Internal.Types.OutputDatum + ( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum) + ) +import Ctl.Internal.Types.PlutusData (PlutusData, pprintPlutusData) +import Ctl.Internal.Types.PubKeyHash (PaymentPubKeyHash, PubKeyHash(PubKeyHash)) import Ctl.Internal.Types.RawBytes (RawBytes) import Ctl.Internal.Types.RedeemerTag (RedeemerTag) import Ctl.Internal.Types.RewardAddress (RewardAddress) import Ctl.Internal.Types.Scripts (Language, PlutusScript) -import Ctl.Internal.Types.Transaction (TransactionInput) +import Ctl.Internal.Types.Transaction (TransactionInput(TransactionInput)) import Ctl.Internal.Types.TransactionMetadata (GeneralTransactionMetadata) import Ctl.Internal.Types.VRFKeyHash (VRFKeyHash) import Data.Array (union) -import Data.BigInt (BigInt) import Data.Either (Either(Left), note) import Data.Generic.Rep (class Generic) import Data.Lens (lens') import Data.Lens.Iso.Newtype (_Newtype) import Data.Lens.Record (prop) import Data.Lens.Types (Lens') +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag as TagSet import Data.Map (Map) -import Data.Maybe (Maybe(Nothing), fromJust) +import Data.Map as Map +import Data.Maybe (Maybe(Just, Nothing), fromJust) import Data.Monoid (guard) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Set (Set) import Data.Set (union) as Set import Data.Show.Generic (genericShow) import Data.String.Utils (startsWith) -import Data.Symbol (SProxy(SProxy)) import Data.Tuple (Tuple(Tuple)) -import Data.Tuple.Nested (type (/\)) +import Data.Tuple.Nested (type (/\), (/\)) import Data.UInt (UInt) +import Data.UInt as UInt +import JS.BigInt (BigInt) import Partial.Unsafe (unsafePartial) +import Type.Proxy (Proxy(Proxy)) -------------------------------------------------------------------------------- -- `Transaction` @@ -597,10 +605,10 @@ instance EncodeAeson MoveInstantaneousReward where encodeAeson = case _ of ToOtherPot r -> encodeTagged' "ToOtherPot" r -- We assume the numbers are finite - { pot = unsafePartial partialFiniteNumber r.pot } + { pot = unsafePartial $ fromJust $ finiteNumber r.pot } ToStakeCreds r -> encodeTagged' "ToStakeCreds" r -- We assume the numbers are finite - { pot = unsafePartial partialFiniteNumber r.pot } + { pot = unsafePartial $ fromJust $ finiteNumber r.pot } type PoolRegistrationParams = { operator :: PoolPubKeyHash -- cwitness (cert) @@ -616,37 +624,41 @@ type PoolRegistrationParams = , poolMetadata :: Maybe PoolMetadata } -newtype PoolPubKeyHash = PoolPubKeyHash Ed25519KeyHash +newtype PoolPubKeyHash = PoolPubKeyHash PubKeyHash derive instance Newtype PoolPubKeyHash _ derive instance Eq PoolPubKeyHash derive instance Ord PoolPubKeyHash derive instance Generic PoolPubKeyHash _ +derive newtype instance ToData PoolPubKeyHash +derive newtype instance FromData PoolPubKeyHash instance EncodeAeson PoolPubKeyHash where encodeAeson (PoolPubKeyHash kh) = - encodeAeson (ed25519KeyHashToBech32 "pool" kh) + encodeAeson (ed25519KeyHashToBech32 "pool" $ unwrap kh) instance DecodeAeson PoolPubKeyHash where decodeAeson aeson = do str <- decodeAeson aeson - PoolPubKeyHash <$> note (TypeMismatch "PoolPubKeyHash") + PoolPubKeyHash <<< PubKeyHash <$> note (TypeMismatch "PoolPubKeyHash") (ed25519KeyHashFromBech32 str) instance Show PoolPubKeyHash where show (PoolPubKeyHash kh) = "(PoolPubKeyHash (Ed25519KeyHash (unsafePartial $ fromJust $ \ \ed25519KeyHashFromBech32 " - <> show (ed25519KeyHashToBech32 "pool" kh) + <> show (ed25519KeyHashToBech32 "pool" $ unwrap kh) <> ")))" mkPoolPubKeyHash :: Bech32String -> Maybe PoolPubKeyHash mkPoolPubKeyHash str - | startsWith "pool" str = PoolPubKeyHash <$> ed25519KeyHashFromBech32 str + | startsWith "pool" str = PoolPubKeyHash <<< PubKeyHash <$> + ed25519KeyHashFromBech32 str | otherwise = Nothing poolPubKeyHashToBech32 :: PoolPubKeyHash -> Bech32String -poolPubKeyHashToBech32 = unwrap >>> ed25519KeyHashToBech32Unsafe "pool" +poolPubKeyHashToBech32 = unwrap >>> unwrap >>> ed25519KeyHashToBech32Unsafe + "pool" data Certificate = StakeRegistration StakeCredential @@ -691,56 +703,56 @@ instance EncodeAeson Certificate where -------------------------------------------------------------------------------- _inputs :: Lens' TxBody (Set TransactionInput) -_inputs = _Newtype <<< prop (SProxy :: SProxy "inputs") +_inputs = _Newtype <<< prop (Proxy :: Proxy "inputs") _outputs :: Lens' TxBody (Array TransactionOutput) -_outputs = _Newtype <<< prop (SProxy :: SProxy "outputs") +_outputs = _Newtype <<< prop (Proxy :: Proxy "outputs") _fee :: Lens' TxBody (Coin) -_fee = _Newtype <<< prop (SProxy :: SProxy "fee") +_fee = _Newtype <<< prop (Proxy :: Proxy "fee") _ttl :: Lens' TxBody (Maybe Slot) -_ttl = _Newtype <<< prop (SProxy :: SProxy "ttl") +_ttl = _Newtype <<< prop (Proxy :: Proxy "ttl") _certs :: Lens' TxBody (Maybe (Array Certificate)) -_certs = _Newtype <<< prop (SProxy :: SProxy "certs") +_certs = _Newtype <<< prop (Proxy :: Proxy "certs") _withdrawals :: Lens' TxBody (Maybe (Map RewardAddress Coin)) -_withdrawals = _Newtype <<< prop (SProxy :: SProxy "withdrawals") +_withdrawals = _Newtype <<< prop (Proxy :: Proxy "withdrawals") _update :: Lens' TxBody (Maybe Update) -_update = _Newtype <<< prop (SProxy :: SProxy "update") +_update = _Newtype <<< prop (Proxy :: Proxy "update") _auxiliaryDataHash :: Lens' TxBody (Maybe AuxiliaryDataHash) -_auxiliaryDataHash = _Newtype <<< prop (SProxy :: SProxy "auxiliaryDataHash") +_auxiliaryDataHash = _Newtype <<< prop (Proxy :: Proxy "auxiliaryDataHash") _validityStartInterval :: Lens' TxBody (Maybe Slot) _validityStartInterval = - _Newtype <<< prop (SProxy :: SProxy "validityStartInterval") + _Newtype <<< prop (Proxy :: Proxy "validityStartInterval") _mint :: Lens' TxBody (Maybe Mint) -_mint = _Newtype <<< prop (SProxy :: SProxy "mint") +_mint = _Newtype <<< prop (Proxy :: Proxy "mint") _scriptDataHash :: Lens' TxBody (Maybe ScriptDataHash) -_scriptDataHash = _Newtype <<< prop (SProxy :: SProxy "scriptDataHash") +_scriptDataHash = _Newtype <<< prop (Proxy :: Proxy "scriptDataHash") _collateral :: Lens' TxBody (Maybe (Array TransactionInput)) -_collateral = _Newtype <<< prop (SProxy :: SProxy "collateral") +_collateral = _Newtype <<< prop (Proxy :: Proxy "collateral") _requiredSigners :: Lens' TxBody (Maybe (Array RequiredSigner)) -_requiredSigners = _Newtype <<< prop (SProxy :: SProxy "requiredSigners") +_requiredSigners = _Newtype <<< prop (Proxy :: Proxy "requiredSigners") _networkId :: Lens' TxBody (Maybe NetworkId) -_networkId = _Newtype <<< prop (SProxy :: SProxy "networkId") +_networkId = _Newtype <<< prop (Proxy :: Proxy "networkId") _referenceInputs :: Lens' TxBody (Set TransactionInput) -_referenceInputs = _Newtype <<< prop (SProxy :: SProxy "referenceInputs") +_referenceInputs = _Newtype <<< prop (Proxy :: Proxy "referenceInputs") _collateralReturn :: Lens' TxBody (Maybe TransactionOutput) -_collateralReturn = _Newtype <<< prop (SProxy :: SProxy "collateralReturn") +_collateralReturn = _Newtype <<< prop (Proxy :: Proxy "collateralReturn") _totalCollateral :: Lens' TxBody (Maybe Coin) -_totalCollateral = _Newtype <<< prop (SProxy :: SProxy "totalCollateral") +_totalCollateral = _Newtype <<< prop (Proxy :: Proxy "totalCollateral") -------------------------------------------------------------------------------- -- `TransactionWitnessSet` @@ -963,3 +975,33 @@ instance Show TransactionOutput where show = genericShow type UtxoMap = Map TransactionInput TransactionOutput + +pprintUtxoMap :: UtxoMap -> TagSet +pprintUtxoMap utxos = TagSet.fromArray $ + Map.toUnfoldable utxos <#> + \( TransactionInput { transactionId, index } /\ + TransactionOutput { address, amount, datum, scriptRef } + ) -> + let + datumTagSets = case datum of + NoOutputDatum -> [] + OutputDatumHash datumHash -> + [ TagSet.fromArray + [ "datum hash" `tag` byteArrayToHex (unwrap datumHash) ] + ] + OutputDatum plutusData -> + [ TagSet.fromArray + [ "datum" `tagSetTag` pprintPlutusData (unwrap plutusData) ] + ] + scriptRefTagSets = case scriptRef of + Nothing -> [] + Just ref -> [ "Script Reference" `tag` show ref ] + outputTagSet = + [ "amount" `tagSetTag` pprintValue amount + , "address" `tag` addressBech32 address + ] + <> datumTagSets + <> scriptRefTagSets + in + (byteArrayToHex (unwrap transactionId) <> "#" <> UInt.toString index) + `tagSetTag` TagSet.fromArray outputTagSet diff --git a/src/Internal/Cardano/Types/TransactionUnspentOutput.purs b/src/Internal/Cardano/Types/TransactionUnspentOutput.purs index 286c779a6..b73ac506a 100644 --- a/src/Internal/Cardano/Types/TransactionUnspentOutput.purs +++ b/src/Internal/Cardano/Types/TransactionUnspentOutput.purs @@ -1,15 +1,18 @@ module Ctl.Internal.Cardano.Types.TransactionUnspentOutput ( TransactionUnspentOutput(TransactionUnspentOutput) + , transactionUnspentOutputsToUtxoMap ) where import Prelude import Aeson (class EncodeAeson) -import Ctl.Internal.Cardano.Types.Transaction (TransactionOutput) +import Ctl.Internal.Cardano.Types.Transaction (TransactionOutput, UtxoMap) import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Generic.Rep (class Generic) +import Data.Map as Map import Data.Newtype (class Newtype) import Data.Show.Generic (genericShow) +import Data.Tuple (Tuple(Tuple)) newtype TransactionUnspentOutput = TransactionUnspentOutput { input :: TransactionInput @@ -23,3 +26,7 @@ derive newtype instance EncodeAeson TransactionUnspentOutput instance Show TransactionUnspentOutput where show = genericShow + +transactionUnspentOutputsToUtxoMap :: Array TransactionUnspentOutput -> UtxoMap +transactionUnspentOutputsToUtxoMap = Map.fromFoldable <<< map + \(TransactionUnspentOutput { input, output }) -> Tuple input output diff --git a/src/Internal/Cardano/Types/Value.purs b/src/Internal/Cardano/Types/Value.purs index 4553bd676..567a189c0 100644 --- a/src/Internal/Cardano/Types/Value.purs +++ b/src/Internal/Cardano/Types/Value.purs @@ -43,9 +43,11 @@ module Ctl.Internal.Cardano.Types.Value , numNonAdaCurrencySymbols , numTokenNames , posNonAdaAsset + , pprintNonAdaAsset + , pprintValue + , scriptHashAsCurrencySymbol , split , sumTokenNameLengths - , scriptHashAsCurrencySymbol , unionWith , unionWithNonAda , unwrapNonAdaAsset @@ -90,6 +92,7 @@ import Ctl.Internal.Types.Scripts (MintingPolicyHash(MintingPolicyHash)) import Ctl.Internal.Types.TokenName ( TokenName , adaToken + , fromTokenName , getTokenName , mkTokenName , mkTokenNames @@ -99,7 +102,6 @@ import Data.Array (fromFoldable) as Array import Data.Array.NonEmpty (NonEmptyArray) import Data.Array.NonEmpty (replicate, singleton, zipWith) as NEArray import Data.Bifunctor (bimap) -import Data.BigInt (BigInt, fromInt, toNumber) import Data.Bitraversable (bitraverse, ltraverse) import Data.Either (Either(Left), note) import Data.Foldable (any, fold, foldl, length) @@ -110,6 +112,8 @@ import Data.Int (ceil) as Int import Data.Lattice (class JoinSemilattice, class MeetSemilattice, join, meet) import Data.List (List(Nil), all, (:)) import Data.List (nubByEq) as List +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag as TagSet import Data.Map (Map, keys, lookup, toUnfoldable, unions, values) import Data.Map as Map import Data.Map.Gen (genMap) @@ -121,6 +125,8 @@ import Data.These (These(Both, That, This)) import Data.Traversable (class Traversable, traverse) import Data.Tuple (fst) import Data.Tuple.Nested (type (/\), (/\)) +import JS.BigInt (BigInt, fromInt, toNumber) +import JS.BigInt as BigInt import Partial.Unsafe (unsafePartial) import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary) import Test.QuickCheck.Gen (Gen, chooseInt, suchThat, vectorOf) @@ -131,7 +137,7 @@ import Test.QuickCheck.Gen (Gen, chooseInt, suchThat, vectorOf) -- to `split` and `negate` (it's just 6 functions) in total without the need of -- a somewhat meaningless typeclass. --- We could write a Ring instance to get `negate` but I'm not sure this would +-- We could write a Group instance to get `negate` but I'm not sure this would -- make much sense for Value. Plutus uses a custom AdditiveGroup. -- We could define a Data.Group although zero-valued tokens don't degenerate -- from our map currently - I don't think we'd want this behaviour. @@ -160,6 +166,10 @@ derive newtype instance Ord Coin derive newtype instance DecodeAeson Coin derive newtype instance EncodeAeson Coin derive newtype instance Equipartition Coin +derive newtype instance Semiring Coin +derive newtype instance Ring Coin +derive newtype instance CommutativeRing Coin +derive newtype instance EuclideanRing Coin instance Arbitrary Coin where arbitrary = Coin <<< fromInt <$> suchThat arbitrary (_ >= zero) @@ -334,6 +344,15 @@ instance Equipartition NonAdaAsset where map (mkSingletonNonAdaAsset cs tn) (equipartition tokenQuantity numParts) +pprintNonAdaAsset :: NonAdaAsset -> TagSet +pprintNonAdaAsset mp = TagSet.fromArray $ + Map.toUnfoldable (unwrapNonAdaAsset mp) <#> \(currency /\ tokens) -> + byteArrayToHex (getCurrencySymbol currency) `tagSetTag` TagSet.fromArray + ( Map.toUnfoldable tokens <#> \(tokenName /\ amount) -> + fromTokenName byteArrayToHex show tokenName `tag` BigInt.toString + amount + ) + -- | Partitions a `NonAdaAsset` into smaller `NonAdaAsset`s, where the -- | quantity of each token is equipartitioned across the resultant -- | `NonAdaAsset`s, with the goal that no token quantity in any of the @@ -479,6 +498,16 @@ instance Equipartition Value where (equipartition coin numParts) (equipartition nonAdaAssets numParts) +pprintValue :: Value -> TagSet +pprintValue value = TagSet.fromArray $ + [ "Lovelace" `tag` BigInt.toString (unwrap (valueToCoin value)) ] + <> + if nonAdaAssets /= mempty then + [ "Assets" `tagSetTag` pprintNonAdaAsset nonAdaAssets ] + else [] + where + nonAdaAssets = getNonAdaAsset value + -- | Partitions a `Value` into smaller `Value`s, where the Ada amount and the -- | quantity of each token is equipartitioned across the resultant `Value`s, -- | with the goal that no token quantity in any of the resultant `Value`s diff --git a/src/Internal/CoinSelection/UtxoIndex.purs b/src/Internal/CoinSelection/UtxoIndex.purs index cbfe56a70..3ee70c1fe 100644 --- a/src/Internal/CoinSelection/UtxoIndex.purs +++ b/src/Internal/CoinSelection/UtxoIndex.purs @@ -38,8 +38,6 @@ import Data.Array (all, foldl) as Array import Data.Array ((!!)) import Data.Array.NonEmpty (cons') import Data.Bifunctor (bimap) -import Data.BigInt (BigInt) -import Data.BigInt (fromInt) as BigInt import Data.Foldable (all, length) as Foldable import Data.Foldable (foldl) import Data.Function (on) @@ -72,6 +70,8 @@ import Data.Show.Generic (genericShow) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Class (class MonadEffect, liftEffect) import Effect.Random (randomInt) as Random +import JS.BigInt (BigInt) +import JS.BigInt (fromInt) as BigInt import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary) import Test.QuickCheck.Gen (oneOf) import Type.Proxy (Proxy(Proxy)) diff --git a/src/Internal/Contract.purs b/src/Internal/Contract.purs index 8c84aecff..17ac25415 100644 --- a/src/Internal/Contract.purs +++ b/src/Internal/Contract.purs @@ -3,8 +3,7 @@ module Ctl.Internal.Contract (getChainTip, getProtocolParameters) where import Prelude import Control.Monad.Reader.Class (asks) -import Ctl.Internal.Contract.Monad (Contract) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (Contract, getQueryHandle) import Ctl.Internal.Types.Chain (Tip) import Ctl.Internal.Types.ProtocolParameters (ProtocolParameters) import Data.Either (either) diff --git a/src/Internal/Contract/AwaitTxConfirmed.purs b/src/Internal/Contract/AwaitTxConfirmed.purs index 7946b16f3..e2100035c 100644 --- a/src/Internal/Contract/AwaitTxConfirmed.purs +++ b/src/Internal/Contract/AwaitTxConfirmed.purs @@ -10,10 +10,10 @@ import Prelude import Contract.Monad (liftedE) import Control.Monad.Reader.Class (asks) import Control.Parallel (parOneOf) +import Ctl.Internal.BalanceTx.Sync (syncWalletWithTransaction) import Ctl.Internal.Contract (getChainTip) -import Ctl.Internal.Contract.Monad (Contract) +import Ctl.Internal.Contract.Monad (Contract, getQueryHandle) import Ctl.Internal.Contract.QueryBackend (getBlockfrostBackend) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) import Ctl.Internal.Serialization.Address (Slot) import Ctl.Internal.Types.BigNum as BigNum import Ctl.Internal.Types.Chain as Chain @@ -25,11 +25,7 @@ import Data.Either (either) import Data.Maybe (isJust, maybe) import Data.Newtype (unwrap, wrap) import Data.Number (infinity) -import Data.Time.Duration - ( Milliseconds(Milliseconds) - , Seconds(Seconds) - , fromDuration - ) +import Data.Time.Duration (Milliseconds, Seconds, fromDuration) import Data.Traversable (for_) import Data.UInt as UInt import Effect.Aff (delay) @@ -42,14 +38,16 @@ import Effect.Exception (throw) -- | Will fail to confirm if the transaction includes no outputs. -- | https://github.com/Plutonomicon/cardano-transaction-lib/issues/1293 awaitTxConfirmed :: TransactionHash -> Contract Unit -awaitTxConfirmed = awaitTxConfirmedWithTimeout (Seconds infinity) +awaitTxConfirmed txHash = do + { timeout } <- asks (_.timeParams >>> _.awaitTxConfirmed) + awaitTxConfirmedWithTimeout timeout txHash -- | Same as `awaitTxConfirmed`, but allows to specify a timeout in seconds for waiting. -- | Throws an exception on timeout. -- | Will fail to confirm if the transaction includes no outputs. -- | https://github.com/Plutonomicon/cardano-transaction-lib/issues/1293 awaitTxConfirmedWithTimeout :: Seconds -> TransactionHash -> Contract Unit -awaitTxConfirmedWithTimeout timeoutSeconds txHash = +awaitTxConfirmedWithTimeout timeoutSeconds txHash = do -- If timeout is infinity, do not use a timeout at all. if unwrap timeoutSeconds == infinity then void waitForConfirmation else do @@ -81,17 +79,21 @@ awaitTxConfirmedWithTimeout timeoutSeconds txHash = -- query, so we need to check for the utxos separately. waitForConfirmation :: Contract Boolean waitForConfirmation = do - tryUntilTrue delayTime (doesTxExist txHash) + { delay: delayMs } <- asks (_.timeParams >>> _.awaitTxConfirmed) + tryUntilTrue delayMs (doesTxExist txHash) confirmTxDelay <- asks _.backend <#> (getBlockfrostBackend >=> _.confirmTxDelay) isBlockfrost <- asks _.backend <#> getBlockfrostBackend >>> isJust when isBlockfrost do - tryUntilTrue delayTime (utxosPresentForTxHash txHash) + tryUntilTrue delayMs (utxosPresentForTxHash txHash) for_ confirmTxDelay (liftAff <<< delay <<< fromDuration) + whenM + ( asks $ _.synchronizationParams + >>> _.syncWalletWithTransaction + >>> _.beforeTxConfirmed + ) + $ syncWalletWithTransaction txHash pure true - where - delayTime :: Milliseconds - delayTime = wrap 1000.0 -- Perform the check until it returns true. tryUntilTrue :: Milliseconds -> Contract Boolean -> Contract Unit @@ -118,13 +120,20 @@ utxosPresentForTxHash txHash = do -- | https://github.com/Plutonomicon/cardano-transaction-lib/issues/1293 awaitTxConfirmedWithTimeoutSlots :: Int -> TransactionHash -> Contract Unit awaitTxConfirmedWithTimeoutSlots timeoutSlots txHash = do + { delay: delayMs } <- asks (_.timeParams >>> _.awaitTxConfirmed) limitSlot <- getCurrentSlot >>= addSlots timeoutSlots - tryUntilTrue delayTime do + tryUntilTrue delayMs do checkSlotLimit limitSlot doesTxExist txHash - tryUntilTrue delayTime do + tryUntilTrue delayMs do checkSlotLimit limitSlot utxosPresentForTxHash txHash + whenM + ( asks $ _.synchronizationParams + >>> _.syncWalletWithTransaction + >>> _.beforeTxConfirmed + ) + $ syncWalletWithTransaction txHash where addSlots :: Int -> Slot -> Contract Slot addSlots n slot = @@ -132,11 +141,13 @@ awaitTxConfirmedWithTimeoutSlots timeoutSlots txHash = do unwrap slot `BigNum.add` BigNum.fromInt n getCurrentSlot :: Contract Slot - getCurrentSlot = getChainTip >>= case _ of - Chain.TipAtGenesis -> do - liftAff $ delay $ wrap 1000.0 - getCurrentSlot - Chain.Tip (Chain.ChainTip { slot }) -> pure slot + getCurrentSlot = do + { delay: delayMs } <- asks $ _.timeParams >>> _.awaitTxConfirmed + getChainTip >>= case _ of + Chain.TipAtGenesis -> do + liftAff $ delay delayMs + getCurrentSlot + Chain.Tip (Chain.ChainTip { slot }) -> pure slot checkSlotLimit :: Slot -> Contract Unit checkSlotLimit limitSlot = do @@ -146,9 +157,6 @@ awaitTxConfirmedWithTimeoutSlots timeoutSlots txHash = do "awaitTxConfirmedWithTimeoutSlots: \ \ timeout exceeded, Transaction not confirmed" - delayTime :: Milliseconds - delayTime = Milliseconds 1000.0 - -- | Checks if a Tx is known to the query layer. It may still be unconfirmed. doesTxExist :: TransactionHash -> Contract Boolean doesTxExist txHash = do diff --git a/src/Internal/Contract/LogParams.purs b/src/Internal/Contract/LogParams.purs new file mode 100644 index 000000000..f21194a9d --- /dev/null +++ b/src/Internal/Contract/LogParams.purs @@ -0,0 +1,15 @@ +module Ctl.Internal.Contract.LogParams (LogParams) where + +import Prelude + +import Data.Log.Level (LogLevel) +import Data.Log.Message (Message) +import Data.Maybe (Maybe) +import Effect.Aff (Aff) + +type LogParams rest = + { logLevel :: LogLevel + , customLogger :: Maybe (LogLevel -> Message -> Aff Unit) + , suppressLogs :: Boolean + | rest + } diff --git a/src/Internal/Contract/MinFee.purs b/src/Internal/Contract/MinFee.purs index a2a04a0f1..7e0f9da5c 100644 --- a/src/Internal/Contract/MinFee.purs +++ b/src/Internal/Contract/MinFee.purs @@ -9,14 +9,10 @@ import Ctl.Internal.Cardano.Types.Transaction , _collateral , _inputs ) -import Ctl.Internal.Cardano.Types.TransactionUnspentOutput - ( TransactionUnspentOutput - ) import Ctl.Internal.Cardano.Types.Value (Coin) import Ctl.Internal.Contract (getProtocolParameters) -import Ctl.Internal.Contract.Monad (Contract) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) -import Ctl.Internal.Contract.Wallet (getWalletAddresses, getWalletCollateral) +import Ctl.Internal.Contract.Monad (Contract, getQueryHandle) +import Ctl.Internal.Contract.Wallet (getWalletAddresses) import Ctl.Internal.Helpers (liftM, liftedM) import Ctl.Internal.Serialization.Address ( Address @@ -30,14 +26,14 @@ import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Array (fromFoldable, mapMaybe) import Data.Array as Array import Data.Either (hush) +import Data.Lens (non) import Data.Lens.Getter ((^.)) -import Data.Map (empty, fromFoldable, keys, lookup, values) as Map -import Data.Maybe (fromMaybe, maybe) +import Data.Map (keys, lookup, values) as Map +import Data.Maybe (Maybe(Just, Nothing)) import Data.Newtype (unwrap) import Data.Set (Set) import Data.Set (difference, fromFoldable, intersection, mapMaybe, union) as Set import Data.Traversable (for) -import Data.Tuple.Nested ((/\)) import Effect.Aff (error) import Effect.Aff.Class (liftAff) @@ -48,6 +44,8 @@ calculateMinFee tx additionalUtxos = do pparams <- getProtocolParameters calculateMinFeeCsl pparams selfSigners tx +-- | This function estimates the set of keys that must be used +-- | for signing to make the transaction valid for the network. getSelfSigners :: Transaction -> UtxoMap -> Contract (Set Ed25519KeyHash) getSelfSigners tx additionalUtxos = do queryHandle <- getQueryHandle @@ -65,31 +63,33 @@ getSelfSigners tx additionalUtxos = do (_.address <<< unwrap) <$> Map.values additionalUtxos (inUtxosAddrs :: Set Address) <- setFor txInputs $ \txInput -> - liftedM (error $ "Couldn't get tx output for " <> show txInput) $ - (map <<< map) (_.address <<< unwrap) - (liftAff $ queryHandle.getUtxoByOref txInput <#> hush >>> join) + liftedM (error $ "Couldn't get tx output for " <> show txInput) + $ (map <<< map) (_.address <<< unwrap) + $ case Map.lookup txInput additionalUtxos of + Nothing -> + liftAff (queryHandle.getUtxoByOref txInput <#> hush >>> join) + Just utxo -> pure $ Just utxo - -- Get all tx output addressses let - txCollats :: Set TransactionInput - txCollats = Set.fromFoldable <<< fromMaybe [] $ tx ^. _body <<< _collateral - - walletCollats <- maybe Map.empty toUtxoMap <$> getWalletCollateral + collateralInputs = tx ^. _body <<< _collateral <<< non [] - (inCollatAddrs :: Set Address) <- setFor txCollats - ( \txCollat -> - liftM (error $ "Couldn't get tx output for " <> show txCollat) - $ (map (_.address <<< unwrap) <<< Map.lookup txCollat) - $ walletCollats - ) + (collateralAddresses :: Set Address) <- + setFor (Set.fromFoldable collateralInputs) $ \txInput -> + liftedM (error $ "Couldn't get tx output for " <> show txInput) + $ (map <<< map) (_.address <<< unwrap) + $ case Map.lookup txInput additionalUtxos of + Nothing -> + liftAff (queryHandle.getUtxoByOref txInput <#> hush >>> join) + Just utxo -> pure $ Just utxo -- Get own addressses (ownAddrs :: Set Address) <- Set.fromFoldable <$> getWalletAddresses -- Combine to get all self tx input addresses let - txOwnAddrs = ownAddrs `Set.intersection` - (additionalUtxosAddrs `Set.union` inUtxosAddrs `Set.union` inCollatAddrs) + txOwnAddrs = + (additionalUtxosAddrs `Set.union` ownAddrs) `Set.intersection` + (inUtxosAddrs `Set.union` collateralAddresses) -- Extract payment pub key hashes from addresses. paymentPkhs <- map (Set.mapMaybe identity) $ setFor txOwnAddrs $ \addr -> do @@ -117,8 +117,3 @@ getSelfSigners tx additionalUtxos = do -> (a -> m b) -> m (Set b) setFor txIns f = Set.fromFoldable <$> for (fromFoldable txIns) f - - toUtxoMap :: Array TransactionUnspentOutput -> UtxoMap - toUtxoMap = Map.fromFoldable <<< map - (unwrap >>> \({ input, output }) -> input /\ output) - diff --git a/src/Internal/Contract/Monad.purs b/src/Internal/Contract/Monad.purs index 5b61130e0..8c811989e 100644 --- a/src/Internal/Contract/Monad.purs +++ b/src/Internal/Contract/Monad.purs @@ -2,6 +2,8 @@ module Ctl.Internal.Contract.Monad ( Contract(Contract) , ContractEnv , ContractParams + , ContractTimeParams + , ContractSynchronizationParams , LedgerConstants , ParContract(ParContract) , mkContractEnv @@ -14,6 +16,8 @@ module Ctl.Internal.Contract.Monad , buildBackend , getLedgerConstants , filterLockedUtxos + , getQueryHandle + , mkQueryHandle ) where import Prelude @@ -34,6 +38,7 @@ import Control.Parallel (class Parallel, parallel, sequential) import Control.Plus (class Plus) import Ctl.Internal.Cardano.Types.Transaction (UtxoMap) import Ctl.Internal.Contract.Hooks (Hooks) +import Ctl.Internal.Contract.LogParams (LogParams) import Ctl.Internal.Contract.QueryBackend ( CtlBackend , CtlBackendParams @@ -41,6 +46,12 @@ import Ctl.Internal.Contract.QueryBackend , QueryBackendParams(BlockfrostBackendParams, CtlBackendParams) , getCtlBackend ) +import Ctl.Internal.Contract.QueryHandle + ( queryHandleForBlockfrostBackend + , queryHandleForCtlBackend + , queryHandleForSelfHostedBlockfrostBackend + ) +import Ctl.Internal.Contract.QueryHandle.Type (QueryHandle) import Ctl.Internal.Helpers (filterMapWithKeyM, liftM, logWithLevel) import Ctl.Internal.JsWebSocket (_wsClose, _wsFinalize) import Ctl.Internal.Logging (Logger, mkLogger, setupLogs) @@ -63,22 +74,27 @@ import Ctl.Internal.Service.Blockfrost as Blockfrost import Ctl.Internal.Service.Error (ClientError) import Ctl.Internal.Types.ProtocolParameters (ProtocolParameters) import Ctl.Internal.Types.SystemStart (SystemStart) +import Ctl.Internal.Types.Transaction (TransactionHash) import Ctl.Internal.Types.UsedTxOuts (UsedTxOuts, isTxOutRefUsed, newUsedTxOuts) -import Ctl.Internal.Wallet (Wallet, actionBasedOnWallet) +import Ctl.Internal.Wallet (Wallet(GenericCip30)) import Ctl.Internal.Wallet.Spec (WalletSpec, mkWalletBySpec) import Data.Bifunctor (lmap) import Data.Either (Either(Left, Right), isRight) import Data.Log.Level (LogLevel) import Data.Log.Message (Message) -import Data.Maybe (Maybe(Just), fromMaybe) +import Data.Maybe (Maybe(Just, Nothing), fromMaybe) import Data.Newtype (class Newtype, unwrap, wrap) +import Data.Set (Set) +import Data.Set as Set +import Data.Time.Duration (Milliseconds, Seconds) import Data.Traversable (for_, traverse, traverse_) import Effect (Effect) import Effect.Aff (Aff, ParAff, attempt, error, finally, supervise) -import Effect.Aff.Class (liftAff) +import Effect.Aff.Class (class MonadAff, liftAff) import Effect.Class (class MonadEffect, liftEffect) import Effect.Exception (Error, throw, try) -import MedeaPrelude (class MonadAff) +import Effect.Ref (Ref) +import Effect.Ref as Ref import Record.Builder (build, merge) -------------------------------------------------------------------------------- @@ -158,26 +174,50 @@ runContractInEnv contractEnv = -- ContractEnv -------------------------------------------------------------------------------- --- `LedgerConstants` contains values that technically may change, but we assume --- to be constant during Contract evaluation +-- | `LedgerConstants` contains values that technically may change, but we assume +-- | to be constant during Contract evaluation. type LedgerConstants = { pparams :: ProtocolParameters , systemStart :: SystemStart } +-- | A record containing `Contract` environment - everything a `Contract` needs +-- | to run. It is recommended to use one environment per application to save +-- | on websocket connections and to keep track of `UsedTxOuts`. type ContractEnv = { backend :: QueryBackend + , handle :: QueryHandle , networkId :: NetworkId , logLevel :: LogLevel - , walletSpec :: Maybe WalletSpec , customLogger :: Maybe (LogLevel -> Message -> Aff Unit) , suppressLogs :: Boolean , hooks :: Hooks , wallet :: Maybe Wallet , usedTxOuts :: UsedTxOuts , ledgerConstants :: LedgerConstants + , timeParams :: ContractTimeParams + , synchronizationParams :: ContractSynchronizationParams + , knownTxs :: + { backend :: Ref (Set TransactionHash) + } } +getQueryHandle :: Contract QueryHandle +getQueryHandle = asks _.handle + +mkQueryHandle + :: forall (rest :: Row Type). LogParams rest -> QueryBackend -> QueryHandle +mkQueryHandle params queryBackend = + case queryBackend of + CtlBackend ctlBackend _ -> + queryHandleForCtlBackend runQueryM params ctlBackend + BlockfrostBackend blockfrostBackend Nothing -> do + queryHandleForBlockfrostBackend params blockfrostBackend + BlockfrostBackend blockfrostBackend (Just ctlBackend) -> do + queryHandleForSelfHostedBlockfrostBackend params blockfrostBackend + runQueryM + ctlBackend + -- | Initializes a `Contract` environment. Does not ensure finalization. -- | Consider using `withContractEnv` if possible - otherwise use -- | `stopContractEnv` to properly finalize. @@ -188,18 +228,25 @@ mkContractEnv params = do for_ params.hooks.beforeInit (void <<< liftEffect <<< try) usedTxOuts <- newUsedTxOuts + backend <- liftEffect $ Ref.new Set.empty envBuilder <- sequential ado b1 <- parallel do backend <- buildBackend logger params.backendParams ledgerConstants <- getLedgerConstants params backend - pure $ merge { backend, ledgerConstants } + pure $ merge + { backend, ledgerConstants, handle: mkQueryHandle params backend } b2 <- parallel do wallet <- buildWallet pure $ merge { wallet } -- Compose the sub-builders together - in b1 >>> b2 >>> merge { usedTxOuts } - + in + b1 >>> b2 >>> merge + { usedTxOuts + , timeParams: params.timeParams + , synchronizationParams: params.synchronizationParams + , knownTxs: { backend } + } pure $ build envBuilder constants where logger :: Logger @@ -211,7 +258,6 @@ mkContractEnv params = do constants = { networkId: params.networkId , logLevel: params.logLevel - , walletSpec: params.walletSpec , customLogger: params.customLogger , suppressLogs: params.suppressLogs , hooks: params.hooks @@ -271,11 +317,13 @@ getLedgerConstants params = case _ of -- | Ensure that `NetworkId` from wallet is the same as specified in the -- | `ContractEnv`. +-- todo: reimplement uniformly walletNetworkCheck :: NetworkId -> Wallet -> Aff Unit walletNetworkCheck envNetworkId = - actionBasedOnWallet - (\w -> check <=< intToNetworkId <=< _.getNetworkId w) - (pure $ pure unit) + case _ of + GenericCip30 wallet -> do + check =<< intToNetworkId =<< wallet.getNetworkId + _ -> pure unit where check :: NetworkId -> Aff Unit check networkId = unless (envNetworkId == networkId) do @@ -341,6 +389,31 @@ withContractEnv params action = do -- ContractParams -------------------------------------------------------------------------------- +-- | Delays and timeouts for internal query functions. +-- | +-- | - `awaitTxConfirmed.delay` - how frequently should we query for Tx in +-- | `Contract.Transaction.awaitTxConfirmed` +-- | +-- | - For info on `syncBackend` and syncWallet` see `doc/query-layers.md` +type ContractTimeParams = + { awaitTxConfirmed :: { delay :: Milliseconds, timeout :: Seconds } + , waitUntilSlot :: { delay :: Milliseconds } + , syncWallet :: { delay :: Milliseconds, timeout :: Seconds } + , syncBackend :: { delay :: Milliseconds, timeout :: Seconds } + } + +type ContractSynchronizationParams = + { syncBackendWithWallet :: + { errorOnTimeout :: Boolean + , beforeCip30Methods :: Boolean + , beforeBalancing :: Boolean + } + , syncWalletWithTxInputs :: + { errorOnTimeout :: Boolean, beforeCip30Sign :: Boolean } + , syncWalletWithTransaction :: + { errorOnTimeout :: Boolean, beforeTxConfirmed :: Boolean } + } + -- | Options to construct an environment for a `Contract` to run. -- | -- | See `Contract.Config` for pre-defined values for testnet and mainnet. @@ -357,6 +430,8 @@ type ContractParams = -- | Suppress logs until an exception is thrown , suppressLogs :: Boolean , hooks :: Hooks + , timeParams :: ContractTimeParams + , synchronizationParams :: ContractSynchronizationParams } -------------------------------------------------------------------------------- @@ -372,17 +447,23 @@ wrapQueryM qm = do contractEnv <- ask liftAff $ runQueryM contractEnv ctlBackend qm -runQueryM :: forall (a :: Type). ContractEnv -> CtlBackend -> QueryM a -> Aff a -runQueryM contractEnv ctlBackend = - flip runReaderT (mkQueryEnv contractEnv ctlBackend) <<< unwrap - -mkQueryEnv :: ContractEnv -> CtlBackend -> QueryEnv -mkQueryEnv contractEnv ctlBackend = +runQueryM + :: forall (a :: Type) (rest :: Row Type) + . LogParams rest + -> CtlBackend + -> QueryM a + -> Aff a +runQueryM params ctlBackend = + flip runReaderT (mkQueryEnv params ctlBackend) <<< unwrap + +mkQueryEnv + :: forall (rest :: Row Type). LogParams rest -> CtlBackend -> QueryEnv +mkQueryEnv params ctlBackend = { config: { kupoConfig: ctlBackend.kupoConfig - , logLevel: contractEnv.logLevel - , customLogger: contractEnv.customLogger - , suppressLogs: contractEnv.suppressLogs + , logLevel: params.logLevel + , customLogger: params.customLogger + , suppressLogs: params.suppressLogs } , runtime: { ogmiosWs: ctlBackend.ogmios.ws diff --git a/src/Internal/Contract/QueryBackend.purs b/src/Internal/Contract/QueryBackend.purs index 711a7154a..766266128 100644 --- a/src/Internal/Contract/QueryBackend.purs +++ b/src/Internal/Contract/QueryBackend.purs @@ -9,6 +9,7 @@ module Ctl.Internal.Contract.QueryBackend , getBlockfrostBackend , getCtlBackend , mkBlockfrostBackendParams + , mkSelfHostedBlockfrostBackendParams , mkCtlBackendParams ) where @@ -76,3 +77,8 @@ mkCtlBackendParams = flip CtlBackendParams Nothing mkBlockfrostBackendParams :: BlockfrostBackendParams -> QueryBackendParams mkBlockfrostBackendParams = flip BlockfrostBackendParams Nothing + +mkSelfHostedBlockfrostBackendParams + :: BlockfrostBackendParams -> CtlBackendParams -> QueryBackendParams +mkSelfHostedBlockfrostBackendParams bf ctl = BlockfrostBackendParams bf + (Just ctl) diff --git a/src/Internal/Contract/QueryHandle.purs b/src/Internal/Contract/QueryHandle.purs index 3c4ebc255..5531fe5ae 100644 --- a/src/Internal/Contract/QueryHandle.purs +++ b/src/Internal/Contract/QueryHandle.purs @@ -1,28 +1,16 @@ module Ctl.Internal.Contract.QueryHandle - ( getQueryHandle - , QueryHandle - , AffE + ( queryHandleForCtlBackend + , queryHandleForBlockfrostBackend + , queryHandleForSelfHostedBlockfrostBackend ) where import Prelude -import Contract.Log (logDebug', logWarn') +import Contract.Log (logDebug') import Control.Monad.Error.Class (throwError) -import Control.Monad.Reader.Class (ask) -import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef) -import Ctl.Internal.Cardano.Types.Transaction - ( PoolPubKeyHash - , Transaction - , TransactionOutput - , UtxoMap - ) -import Ctl.Internal.Contract.Monad (Contract, ContractEnv, runQueryM) -import Ctl.Internal.Contract.QueryBackend - ( BlockfrostBackend - , CtlBackend - , QueryBackend(BlockfrostBackend, CtlBackend) - ) -import Ctl.Internal.Contract.QueryHandle.Error (GetTxMetadataError) +import Ctl.Internal.Contract.LogParams (LogParams) +import Ctl.Internal.Contract.QueryBackend (BlockfrostBackend, CtlBackend) +import Ctl.Internal.Contract.QueryHandle.Type (QueryHandle) import Ctl.Internal.Hashing (transactionHash) as Hashing import Ctl.Internal.Helpers (logWithLevel) import Ctl.Internal.QueryM (QueryM) @@ -31,85 +19,44 @@ import Ctl.Internal.QueryM.CurrentEpoch (getCurrentEpoch) as QueryM import Ctl.Internal.QueryM.EraSummaries (getEraSummaries) as QueryM import Ctl.Internal.QueryM.Kupo ( getDatumByHash + , getOutputAddressesByTxHash , getScriptByHash , getTxMetadata , getUtxoByOref , isTxConfirmed , utxosAt ) as Kupo -import Ctl.Internal.QueryM.Ogmios - ( AdditionalUtxoSet - , CurrentEpoch - , SubmitTxR(SubmitFail, SubmitTxSuccess) - , TxEvaluationR - ) -import Ctl.Internal.QueryM.Pools (DelegationsAndRewards) +import Ctl.Internal.QueryM.Ogmios (SubmitTxR(SubmitFail, SubmitTxSuccess)) import Ctl.Internal.QueryM.Pools ( getPoolIds , getPubKeyHashDelegationsAndRewards , getValidatorHashDelegationsAndRewards ) as QueryM import Ctl.Internal.Serialization (convertTransaction, toBytes) as Serialization -import Ctl.Internal.Serialization.Address (Address, NetworkId) -import Ctl.Internal.Serialization.Hash (ScriptHash) import Ctl.Internal.Service.Blockfrost ( BlockfrostServiceM , runBlockfrostServiceM ) import Ctl.Internal.Service.Blockfrost as Blockfrost import Ctl.Internal.Service.Error (ClientError(ClientOtherError)) -import Ctl.Internal.Types.Chain as Chain -import Ctl.Internal.Types.Datum (DataHash, Datum) -import Ctl.Internal.Types.EraSummaries (EraSummaries) -import Ctl.Internal.Types.PubKeyHash (StakePubKeyHash) -import Ctl.Internal.Types.Scripts (StakeValidatorHash) -import Ctl.Internal.Types.Transaction (TransactionHash, TransactionInput) -import Ctl.Internal.Types.TransactionMetadata (GeneralTransactionMetadata) import Data.Either (Either(Left, Right)) -import Data.Map as Map -import Data.Maybe (Maybe, fromMaybe, isJust) +import Data.Maybe (fromMaybe, isJust) import Data.Newtype (unwrap, wrap) import Effect.Aff (Aff) import Effect.Class (liftEffect) import Effect.Exception (error) -type AffE (a :: Type) = Aff (Either ClientError a) - -type QueryHandle = - { getDatumByHash :: DataHash -> AffE (Maybe Datum) - , getScriptByHash :: ScriptHash -> AffE (Maybe ScriptRef) - , getTxMetadata :: - TransactionHash - -> Aff (Either GetTxMetadataError GeneralTransactionMetadata) - , getUtxoByOref :: TransactionInput -> AffE (Maybe TransactionOutput) - , doesTxExist :: TransactionHash -> AffE Boolean - , utxosAt :: Address -> AffE UtxoMap - , getChainTip :: AffE Chain.Tip - , getCurrentEpoch :: Aff CurrentEpoch - -- TODO Capture errors from all backends - , submitTx :: Transaction -> Aff (Either ClientError TransactionHash) - , evaluateTx :: Transaction -> AdditionalUtxoSet -> Aff TxEvaluationR - , getEraSummaries :: AffE EraSummaries - , getPoolIds :: AffE (Array PoolPubKeyHash) - , getPubKeyHashDelegationsAndRewards :: - NetworkId -> StakePubKeyHash -> AffE (Maybe DelegationsAndRewards) - , getValidatorHashDelegationsAndRewards :: - NetworkId -> StakeValidatorHash -> AffE (Maybe DelegationsAndRewards) - } - -getQueryHandle :: Contract QueryHandle -getQueryHandle = ask <#> \contractEnv -> - case contractEnv.backend of - CtlBackend backend _ -> - queryHandleForCtlBackend contractEnv backend - BlockfrostBackend backend _ -> do - queryHandleForBlockfrostBackend contractEnv backend - -queryHandleForCtlBackend :: ContractEnv -> CtlBackend -> QueryHandle -queryHandleForCtlBackend contractEnv backend = +queryHandleForCtlBackend + :: forall rest + . (forall (a :: Type). LogParams rest -> CtlBackend -> QueryM a -> Aff a) + -> LogParams rest + -> CtlBackend + -> QueryHandle +queryHandleForCtlBackend runQueryM params backend = { getDatumByHash: runQueryM' <<< Kupo.getDatumByHash , getScriptByHash: runQueryM' <<< Kupo.getScriptByHash , getUtxoByOref: runQueryM' <<< Kupo.getUtxoByOref + , getOutputAddressesByTxHash: runQueryM' <<< Kupo.getOutputAddressesByTxHash , doesTxExist: runQueryM' <<< map (map isJust) <<< Kupo.isTxConfirmed , getTxMetadata: runQueryM' <<< Kupo.getTxMetadata , utxosAt: runQueryM' <<< Kupo.utxosAt @@ -140,14 +87,16 @@ queryHandleForCtlBackend contractEnv backend = where runQueryM' :: forall (a :: Type). QueryM a -> Aff a - runQueryM' = runQueryM contractEnv backend + runQueryM' = runQueryM params backend queryHandleForBlockfrostBackend - :: ContractEnv -> BlockfrostBackend -> QueryHandle -queryHandleForBlockfrostBackend contractEnv backend = + :: forall rest. LogParams rest -> BlockfrostBackend -> QueryHandle +queryHandleForBlockfrostBackend logParams backend = { getDatumByHash: runBlockfrostServiceM' <<< Blockfrost.getDatumByHash , getScriptByHash: runBlockfrostServiceM' <<< Blockfrost.getScriptByHash , getUtxoByOref: runBlockfrostServiceM' <<< Blockfrost.getUtxoByOref + , getOutputAddressesByTxHash: runBlockfrostServiceM' <<< + Blockfrost.getOutputAddressesByTxHash , doesTxExist: runBlockfrostServiceM' <<< Blockfrost.doesTxExist , getTxMetadata: runBlockfrostServiceM' <<< Blockfrost.getTxMetadata , utxosAt: runBlockfrostServiceM' <<< Blockfrost.utxosAt @@ -157,10 +106,8 @@ queryHandleForBlockfrostBackend contractEnv backend = Right epoch -> pure $ wrap epoch Left err -> throwError $ error $ show err , submitTx: runBlockfrostServiceM' <<< Blockfrost.submitTx - , evaluateTx: \tx additionalUtxos -> runBlockfrostServiceM' do - unless (Map.isEmpty $ unwrap additionalUtxos) do - logWarn' "Blockfrost does not support explicit additional utxos" - Blockfrost.evaluateTx tx + , evaluateTx: \tx additionalUtxos -> + runBlockfrostServiceM' $ Blockfrost.evaluateTx tx additionalUtxos , getEraSummaries: runBlockfrostServiceM' Blockfrost.getEraSummaries , getPoolIds: runBlockfrostServiceM' Blockfrost.getPoolIds , getPubKeyHashDelegationsAndRewards: \networkId stakePubKeyHash -> @@ -177,5 +124,27 @@ queryHandleForBlockfrostBackend contractEnv backend = where runBlockfrostServiceM' :: forall (a :: Type). BlockfrostServiceM a -> Aff a runBlockfrostServiceM' = runBlockfrostServiceM - (fromMaybe logWithLevel contractEnv.customLogger contractEnv.logLevel) + (fromMaybe logWithLevel logParams.customLogger logParams.logLevel) backend + +queryHandleForSelfHostedBlockfrostBackend + :: forall rest + . LogParams rest + -> BlockfrostBackend + -> (forall (a :: Type). LogParams rest -> CtlBackend -> QueryM a -> Aff a) + -> CtlBackend + -> QueryHandle +queryHandleForSelfHostedBlockfrostBackend + params + blockfrostBackend + runQueryM + ctlBackend = + let + blockfrostQueryHandle = queryHandleForBlockfrostBackend params + blockfrostBackend + ctlQueryHandle = queryHandleForCtlBackend runQueryM params ctlBackend + in + blockfrostQueryHandle + { evaluateTx = ctlQueryHandle.evaluateTx + , submitTx = ctlQueryHandle.submitTx + } diff --git a/src/Internal/Contract/QueryHandle/Type.purs b/src/Internal/Contract/QueryHandle/Type.purs new file mode 100644 index 000000000..6102dfdb4 --- /dev/null +++ b/src/Internal/Contract/QueryHandle/Type.purs @@ -0,0 +1,57 @@ +module Ctl.Internal.Contract.QueryHandle.Type + ( QueryHandle + , AffE + ) where + +import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef) +import Ctl.Internal.Cardano.Types.Transaction + ( PoolPubKeyHash + , Transaction + , TransactionOutput + , UtxoMap + ) +import Ctl.Internal.Contract.QueryHandle.Error (GetTxMetadataError) +import Ctl.Internal.QueryM.Ogmios + ( AdditionalUtxoSet + , CurrentEpoch + , TxEvaluationR + ) +import Ctl.Internal.QueryM.Pools (DelegationsAndRewards) +import Ctl.Internal.Serialization.Address (Address, NetworkId) +import Ctl.Internal.Serialization.Hash (ScriptHash) +import Ctl.Internal.Service.Error (ClientError) +import Ctl.Internal.Types.Chain as Chain +import Ctl.Internal.Types.Datum (DataHash, Datum) +import Ctl.Internal.Types.EraSummaries (EraSummaries) +import Ctl.Internal.Types.PubKeyHash (StakePubKeyHash) +import Ctl.Internal.Types.Scripts (StakeValidatorHash) +import Ctl.Internal.Types.Transaction (TransactionHash, TransactionInput) +import Ctl.Internal.Types.TransactionMetadata (GeneralTransactionMetadata) +import Data.Either (Either) +import Data.Maybe (Maybe) +import Effect.Aff (Aff) + +type AffE (a :: Type) = Aff (Either ClientError a) + +type QueryHandle = + { getDatumByHash :: DataHash -> AffE (Maybe Datum) + , getScriptByHash :: ScriptHash -> AffE (Maybe ScriptRef) + , getTxMetadata :: + TransactionHash + -> Aff (Either GetTxMetadataError GeneralTransactionMetadata) + , getUtxoByOref :: TransactionInput -> AffE (Maybe TransactionOutput) + , getOutputAddressesByTxHash :: TransactionHash -> AffE (Array Address) + , doesTxExist :: TransactionHash -> AffE Boolean + , utxosAt :: Address -> AffE UtxoMap + , getChainTip :: AffE Chain.Tip + , getCurrentEpoch :: Aff CurrentEpoch + -- TODO Capture errors from all backends + , submitTx :: Transaction -> AffE TransactionHash + , evaluateTx :: Transaction -> AdditionalUtxoSet -> Aff TxEvaluationR + , getEraSummaries :: AffE EraSummaries + , getPoolIds :: AffE (Array PoolPubKeyHash) + , getPubKeyHashDelegationsAndRewards :: + NetworkId -> StakePubKeyHash -> AffE (Maybe DelegationsAndRewards) + , getValidatorHashDelegationsAndRewards :: + NetworkId -> StakeValidatorHash -> AffE (Maybe DelegationsAndRewards) + } diff --git a/src/Internal/Contract/Sign.purs b/src/Internal/Contract/Sign.purs index 7fa2b3d6c..f6164335b 100644 --- a/src/Internal/Contract/Sign.purs +++ b/src/Internal/Contract/Sign.purs @@ -5,98 +5,42 @@ module Ctl.Internal.Contract.Sign import Prelude import Control.Monad.Reader (asks) -import Ctl.Internal.Cardano.Types.Transaction (_body, _inputs, _witnessSet) -import Ctl.Internal.Cardano.Types.Transaction as Transaction -import Ctl.Internal.Contract.Monad (Contract) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) -import Ctl.Internal.Contract.Wallet - ( getWalletAddresses - , getWalletUtxos - , withWallet +import Ctl.Internal.BalanceTx.Sync (isCip30Wallet, syncWalletWithTxInputs) +import Ctl.Internal.Cardano.Types.Transaction + ( Transaction + , _body + , _inputs + , _witnessSet ) -import Ctl.Internal.Helpers (liftedM) -import Ctl.Internal.Types.Transaction (TransactionInput) +import Ctl.Internal.Contract.Monad (Contract) +import Ctl.Internal.Contract.Wallet (withWallet) import Ctl.Internal.Wallet - ( Wallet(KeyWallet, Lode, Eternl, Flint, Gero, Nami, NuFi) - , callCip30Wallet + ( Wallet(GenericCip30, KeyWallet) ) -import Data.Array (elem, fromFoldable) -import Data.Either (hush) +import Data.Array (fromFoldable) import Data.Lens ((<>~)) import Data.Lens.Getter ((^.)) -import Data.Map as Map -import Data.Maybe (Maybe(Just), fromMaybe) -import Data.Newtype (unwrap, wrap) -import Data.Traversable (for_, traverse) -import Data.Tuple.Nested ((/\)) -import Effect.Aff (delay, error) +import Data.Newtype (unwrap) +import Data.Traversable (for_) import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) -import Effect.Exception (throw, try) +import Effect.Exception (try) signTransaction - :: Transaction.Transaction -> Contract (Maybe Transaction.Transaction) + :: Transaction -> Contract Transaction signTransaction tx = do hooks <- asks _.hooks for_ hooks.beforeSign (void <<< liftEffect <<< try) + whenM isCip30Wallet do + whenM + ( asks $ _.synchronizationParams + >>> _.syncWalletWithTxInputs + >>> _.beforeCip30Sign + ) + do + syncWalletWithTxInputs $ fromFoldable $ tx ^. _body <<< _inputs withWallet case _ of - Nami nami -> liftAff $ callCip30Wallet nami \nw -> flip nw.signTx tx - Gero gero -> liftAff $ callCip30Wallet gero \nw -> flip nw.signTx tx - Flint flint -> liftAff $ callCip30Wallet flint \nw -> flip nw.signTx tx - Eternl eternl -> do - let - txInputs :: Array TransactionInput - txInputs = fromFoldable $ tx ^. _body <<< _inputs - walletWaitForInputs txInputs - liftAff $ callCip30Wallet eternl \nw -> flip nw.signTx tx - Lode lode -> liftAff $ callCip30Wallet lode \nw -> flip nw.signTx tx - NuFi nufi -> liftAff $ callCip30Wallet nufi \w -> flip w.signTx tx + GenericCip30 cip30 -> liftAff $ cip30.signTx tx KeyWallet kw -> liftAff do witnessSet <- (unwrap kw).signTx tx - pure $ Just (tx # _witnessSet <>~ witnessSet) - --- | Waits till all provided inputs of a given transaction appear in the UTxO --- | set provided by the wallet. --- | This is a hacky solution to the problem of Eternl not seeing UTxOs that --- | hasn't been fully confirmed at the moment of a `sign()` call. --- | Since it can't detect UTxO origin, it can't decide which of the private --- | keys to use for signing. As a result, we get `MissingVKeyWitnesses`. -walletWaitForInputs :: Array TransactionInput -> Contract Unit -walletWaitForInputs txInputs = do - queryHandle <- getQueryHandle - ownAddrs <- getWalletAddresses - ownInputUtxos :: Map.Map TransactionInput _ <- txInputs # - traverse - ( \txInput -> do - utxo <- liftedM (error "Could not get utxo") $ liftAff $ join <<< hush - <$> queryHandle.getUtxoByOref txInput - pure (txInput /\ utxo) - ) >>> map - ( Map.fromFoldable >>> Map.filter - ( flip elem ownAddrs - <<< _.address - <<< unwrap - ) - ) - let - go attempts = do - walletUtxos <- getWalletUtxos <#> fromMaybe Map.empty - unless (ownInputUtxos `Map.isSubmap` walletUtxos) do - when (attempts == 0) do - liftEffect $ throw $ - "walletWaitForInputs: timeout while waiting for wallet" - <> " UTxO set and CTL query layer UTxO set to synchronize. UTxOs" - <> " from Ogmios: " - <> show ownInputUtxos - <> ", UTxOs from wallet: " - <> show walletUtxos - <> ", UTxOs that didn't appear in the wallet: " - <> - show (Map.difference ownInputUtxos walletUtxos) - liftAff $ delay $ wrap $ 1000.0 - go (attempts - 1) - -- As clarified in Eternl discord, they synchronize with the server every 2 - -- minutes, so 150 seconds would probably be enough to also account for - -- possible network latency. - go 150 - + pure $ tx # _witnessSet <>~ witnessSet diff --git a/src/Internal/Contract/WaitUntilSlot.purs b/src/Internal/Contract/WaitUntilSlot.purs index c4266223d..149dd7006 100644 --- a/src/Internal/Contract/WaitUntilSlot.purs +++ b/src/Internal/Contract/WaitUntilSlot.purs @@ -8,18 +8,18 @@ module Ctl.Internal.Contract.WaitUntilSlot import Prelude import Contract.Log (logTrace') -import Control.Monad.Error.Class (liftEither) -import Control.Monad.Reader.Class (asks) +import Control.Monad.Error.Class (liftEither, liftMaybe) +import Control.Monad.Reader (asks) import Ctl.Internal.Contract (getChainTip) -import Ctl.Internal.Contract.Monad (Contract) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (Contract, getQueryHandle) import Ctl.Internal.Helpers (liftM) import Ctl.Internal.Serialization.Address (Slot(Slot)) import Ctl.Internal.Types.BigNum as BigNum import Ctl.Internal.Types.Chain as Chain -import Ctl.Internal.Types.EraSummaries (EraSummaries) +import Ctl.Internal.Types.EraSummaries (EraSummaries(EraSummaries)) import Ctl.Internal.Types.Interval ( POSIXTime(POSIXTime) + , SlotToPosixTimeError(CannotFindSlotInEraSummaries) , findSlotEraSummary , getSlotLength , slotToPosixTime @@ -27,11 +27,13 @@ import Ctl.Internal.Types.Interval import Ctl.Internal.Types.Natural (Natural) import Ctl.Internal.Types.Natural as Natural import Ctl.Internal.Types.SystemStart (SystemStart) +import Data.Array (length, mapMaybe) import Data.Bifunctor (lmap) -import Data.BigInt as BigInt import Data.DateTime.Instant (unInstant) -import Data.Either (either, hush) +import Data.Either (Either(Right, Left), either) +import Data.Foldable (maximum) import Data.Int as Int +import Data.Maybe (Maybe(Just, Nothing)) import Data.Newtype (unwrap, wrap) import Data.Time.Duration (Milliseconds(Milliseconds), Seconds) import Effect.Aff (Milliseconds, delay) @@ -39,14 +41,16 @@ import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) import Effect.Exception (error, throw) import Effect.Now (now) +import JS.BigInt as BigInt -- | The returned slot will be no less than the slot provided as argument. waitUntilSlot :: Slot -> Contract Chain.Tip -waitUntilSlot futureSlot = do +waitUntilSlot targetSlot = do queryHandle <- getQueryHandle + { delay: retryDelay } <- asks $ _.timeParams >>> _.waitUntilSlot getChainTip >>= case _ of tip@(Chain.Tip (Chain.ChainTip { slot })) - | slot >= futureSlot -> pure tip + | slot >= targetSlot -> pure tip | otherwise -> do { systemStart } <- asks _.ledgerConstants eraSummaries <- liftAff $ @@ -55,41 +59,54 @@ waitUntilSlot futureSlot = do slotLengthMs <- map getSlotLength $ liftEither $ lmap (const $ error "Unable to get current Era summary") $ findSlotEraSummary eraSummaries slot - -- `timePadding` in slots - -- If there are less than `slotPadding` slots remaining, start querying for chainTip - -- repeatedly, because it's possible that at any given moment Ogmios suddenly - -- synchronizes with node that is also synchronized with global time. getLag eraSummaries systemStart slot >>= logLag slotLengthMs - futureTime <- - liftEffect - (slotToPosixTime eraSummaries systemStart futureSlot) - >>= hush >>> liftM (error "Unable to convert Slot to POSIXTime") - delayTime <- estimateDelayUntil futureTime - liftAff $ delay delayTime - let - -- Repeatedly check current slot until it's greater than or equal to futureAbsSlot - fetchRepeatedly :: Contract Chain.Tip - fetchRepeatedly = - getChainTip >>= case _ of - currentTip@(Chain.Tip (Chain.ChainTip { slot: currentSlot_ })) - | currentSlot_ >= futureSlot -> pure currentTip - | otherwise -> do - liftAff $ delay $ Milliseconds slotLengthMs - getLag eraSummaries systemStart currentSlot_ - >>= logLag slotLengthMs + case slotToPosixTime eraSummaries systemStart targetSlot of + Left err@(CannotFindSlotInEraSummaries _) -> do + case latestEndSlotInEraSummaries eraSummaries of + Nothing -> liftEffect $ throw $ + "Unable to convert Slot to POSIXTime: " <> show err + Just latest -> do + logTrace' $ + "waitUntilSlot: Target slot is too far in the future, waiting for this slot first: " + <> show latest + -- latest - 1 + prevLatest <- + liftMaybe + ( error + "waitUntilSlot: Impossible happened: negative slot" + ) $ + wrap <$> BigNum.fromBigInt + (BigNum.toBigInt (unwrap latest) - one) + void $ waitUntilSlot prevLatest + waitUntilSlot targetSlot + Left err -> do + liftEffect $ throw $ "Unable to convert Slot to POSIXTime: " <> + show err + Right futureTime -> do + delayTime <- estimateDelayUntil futureTime + liftAff $ delay delayTime + let + -- Repeatedly check current slot until it's greater than or equal to futureAbsSlo t + fetchRepeatedly :: Contract Chain.Tip + fetchRepeatedly = + getChainTip >>= case _ of + currentTip@ + (Chain.Tip (Chain.ChainTip { slot: currentSlot_ })) + | currentSlot_ >= targetSlot -> pure currentTip + | otherwise -> do + liftAff $ delay $ Milliseconds slotLengthMs + getLag eraSummaries systemStart currentSlot_ + >>= logLag slotLengthMs + fetchRepeatedly + Chain.TipAtGenesis -> do + liftAff $ delay retryDelay fetchRepeatedly - Chain.TipAtGenesis -> do - liftAff $ delay retryDelay - fetchRepeatedly - fetchRepeatedly + fetchRepeatedly Chain.TipAtGenesis -> do -- We just retry until the tip moves from genesis liftAff $ delay retryDelay - waitUntilSlot futureSlot + waitUntilSlot targetSlot where - retryDelay :: Milliseconds - retryDelay = wrap 1000.0 - logLag :: Number -> Milliseconds -> Contract Unit logLag slotLengthMs (Milliseconds lag) = do logTrace' $ @@ -97,7 +114,7 @@ waitUntilSlot futureSlot = do <> show (lag / slotLengthMs) <> " slots." --- | Calculate difference between estimated POSIX time of given slot +-- | Calculate difference between estimated POSIX time of a given slot -- | and current time. getLag :: EraSummaries @@ -105,8 +122,8 @@ getLag -> Slot -> Contract Milliseconds getLag eraSummaries sysStart nowSlot = do - nowPosixTime <- liftEffect (slotToPosixTime eraSummaries sysStart nowSlot) >>= - hush >>> liftM (error "Unable to convert Slot to POSIXTime") + nowPosixTime <- liftEither $ slotToPosixTime eraSummaries sysStart nowSlot + # lmap (error <<< append "Unable to convert Slot to POSIXTime: " <<< show) nowMs <- unwrap <<< unInstant <$> liftEffect now logTrace' $ "getLag: current slot: " <> BigNum.toString (unwrap nowSlot) @@ -118,8 +135,8 @@ getLag eraSummaries sysStart nowSlot = do BigInt.fromNumber nowMs pure $ wrap $ BigInt.toNumber $ nowMsBigInt - unwrap nowPosixTime --- | Estimate how long we want to wait if we want to wait until `timePadding` --- | milliseconds before a given `POSIXTime`. +-- | Estimate how long we want to wait if we want to wait for a given +-- | `POSIXTime` starting from now. estimateDelayUntil :: POSIXTime -> Contract Milliseconds estimateDelayUntil futureTimePosix = do futureTimeSec <- posixTimeToSeconds futureTimePosix @@ -176,16 +193,26 @@ currentTime = currentSlot >>= slotToEndPOSIXTime -- see https://github.com/input-output-hk/plutus-apps/blob/fb8a39645e532841b6e38d42ecb957f1945833a5/plutus-ledger/src/Ledger/TimeSlot.hs slotToEndPOSIXTime :: Slot -> Contract POSIXTime slotToEndPOSIXTime slot = do - futureSlot <- liftM (error "Unable to advance slot") + targetSlot <- liftM (error "Unable to advance slot") $ wrap <$> BigNum.add (unwrap slot) (BigNum.fromInt 1) { systemStart } <- asks _.ledgerConstants queryHandle <- getQueryHandle eraSummaries <- liftAff $ queryHandle.getEraSummaries >>= either (liftEffect <<< throw <<< show) pure - futureTime <- liftEffect $ - slotToPosixTime eraSummaries systemStart futureSlot - >>= hush >>> liftM (error "Unable to convert Slot to POSIXTime") + futureTime <- liftEither $ + slotToPosixTime eraSummaries systemStart targetSlot + # lmap (error <<< append "Unable to convert Slot to POSIXTime: " <<< show) -- We assume that a slot is 1000 milliseconds here. -- TODO Don't pure ((wrap <<< BigInt.fromInt $ -1) + futureTime) + +-- | Finds the latest end slot in `EraSummaries` (if any). +latestEndSlotInEraSummaries + :: EraSummaries + -> Maybe Slot +latestEndSlotInEraSummaries (EraSummaries sums) + | length sums == 0 = Nothing + | otherwise = sums + # mapMaybe (unwrap >>> _.end >>> map (unwrap >>> _.slot)) + # maximum diff --git a/src/Internal/Contract/Wallet.purs b/src/Internal/Contract/Wallet.purs index 31541a8e7..472aad2f8 100644 --- a/src/Internal/Contract/Wallet.purs +++ b/src/Internal/Contract/Wallet.purs @@ -7,7 +7,7 @@ module Ctl.Internal.Contract.Wallet , getWallet , ownPubKeyHashes , ownPaymentPubKeyHashes - , ownStakePubKeysHashes + , ownStakePubKeyHashes , withWallet , getWalletCollateral , getWalletBalance @@ -17,15 +17,15 @@ module Ctl.Internal.Contract.Wallet import Prelude import Control.Monad.Reader.Trans (asks) +import Control.Parallel (parTraverse) import Ctl.Internal.Cardano.Types.Transaction (UtxoMap) import Ctl.Internal.Cardano.Types.TransactionUnspentOutput ( TransactionUnspentOutput ) -import Ctl.Internal.Cardano.Types.Value (Value) +import Ctl.Internal.Cardano.Types.Value (Value, valueToCoin) import Ctl.Internal.Cardano.Types.Value (geq, lovelaceValueOf) as Value import Ctl.Internal.Contract (getProtocolParameters) -import Ctl.Internal.Contract.Monad (Contract, filterLockedUtxos) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (Contract, filterLockedUtxos, getQueryHandle) import Ctl.Internal.Helpers (liftM, liftedM) import Ctl.Internal.Serialization.Address ( Address @@ -34,86 +34,85 @@ import Ctl.Internal.Serialization.Address , baseAddressFromAddress , stakeCredentialToKeyHash ) +import Ctl.Internal.Service.Error (pprintClientError) import Ctl.Internal.Types.PubKeyHash ( PaymentPubKeyHash , PubKeyHash , StakePubKeyHash ) import Ctl.Internal.Types.RawBytes (RawBytes) -import Ctl.Internal.Wallet - ( Wallet - , actionBasedOnWallet - ) +import Ctl.Internal.Wallet (Wallet, actionBasedOnWallet) import Ctl.Internal.Wallet.Cip30 (DataSignature) -import Data.Array (catMaybes, cons, foldMap, head) +import Data.Array (cons, foldMap, foldr) import Data.Array as Array -import Data.BigInt as BigInt -import Data.Either (hush) +import Data.Either (Either(Left, Right), hush) import Data.Foldable (fold, foldl) +import Data.Function (on) import Data.Map as Map -import Data.Maybe (Maybe(Nothing), fromMaybe, maybe) +import Data.Maybe (Maybe(Nothing, Just), fromMaybe, maybe) import Data.Newtype (unwrap, wrap) -import Data.Traversable (for, for_, traverse) +import Data.Traversable (for_, traverse) import Data.Tuple.Nested ((/\)) import Data.UInt as UInt import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) import Effect.Exception (error, throw) +import JS.BigInt as BigInt getUnusedAddresses :: Contract (Array Address) -getUnusedAddresses = fold <$> do +getUnusedAddresses = withWallet $ actionBasedOnWallet _.getUnusedAddresses mempty -getChangeAddress :: Contract (Maybe Address) +getChangeAddress :: Contract Address getChangeAddress = withWallet do actionBasedOnWallet _.getChangeAddress \kw -> do networkId <- asks _.networkId - pure $ pure $ (unwrap kw).address networkId + pure $ (unwrap kw).address networkId getRewardAddresses :: Contract (Array Address) -getRewardAddresses = fold <$> withWallet do - actionBasedOnWallet _.getRewardAddresses - \kw -> do - networkId <- asks _.networkId - pure $ pure $ pure $ (unwrap kw).address networkId +getRewardAddresses = + withWallet $ actionBasedOnWallet _.getRewardAddresses + \kw -> asks _.networkId <#> Array.singleton <<< (unwrap kw).address getWalletAddresses :: Contract (Array Address) -getWalletAddresses = fold <$> withWallet do - actionBasedOnWallet _.getWalletAddresses +getWalletAddresses = withWallet do + actionBasedOnWallet _.getUsedAddresses ( \kw -> do networkId <- asks _.networkId - pure $ pure $ Array.singleton $ (unwrap kw).address networkId + pure $ Array.singleton $ (unwrap kw).address networkId ) -signData :: Address -> RawBytes -> Contract (Maybe DataSignature) +signData :: Address -> RawBytes -> Contract DataSignature signData address payload = withWallet $ actionBasedOnWallet - (\w conn -> w.signData conn address payload) + (\w -> w.signData address payload) \kw -> do networkId <- asks _.networkId - liftAff $ pure <$> (unwrap kw).signData networkId payload + liftAff $ (unwrap kw).signData networkId payload getWallet :: Contract (Maybe Wallet) getWallet = asks _.wallet ownPubKeyHashes :: Contract (Array PubKeyHash) -ownPubKeyHashes = catMaybes <$> do +ownPubKeyHashes = do getWalletAddresses >>= traverse \address -> do paymentCred <- liftM - ( error $ - "Unable to get payment credential from Address" - ) $ + (error $ "Unable to get payment credential from Address") $ addressPaymentCred address - pure $ stakeCredentialToKeyHash paymentCred <#> wrap + -- scripts are impossible here, so `stakeCredentialToKeyHash` will never + -- return `Nothing` (`catMaybes` is safe) + liftM (error "Impossible happened: CIP-30 method returned script address") + $ stakeCredentialToKeyHash paymentCred <#> wrap +-- | Gets all wallet `PaymentPubKeyHash`es via `getWalletAddresses`. ownPaymentPubKeyHashes :: Contract (Array PaymentPubKeyHash) ownPaymentPubKeyHashes = map wrap <$> ownPubKeyHashes -ownStakePubKeysHashes :: Contract (Array (Maybe StakePubKeyHash)) -ownStakePubKeysHashes = do +ownStakePubKeyHashes :: Contract (Array (Maybe StakePubKeyHash)) +ownStakePubKeyHashes = do addresses <- getWalletAddresses pure $ addressToMStakePubKeyHash <$> addresses where @@ -158,50 +157,82 @@ getWalletCollateral = do -} targetCollateral = Value.lovelaceValueOf $ BigInt.fromInt 5_000_000 utxoValue u = (unwrap (unwrap u).output).amount - sufficientUtxos = mbCollateralUTxOs <#> \colUtxos -> - foldl - ( \us u -> - if foldMap utxoValue us `Value.geq` targetCollateral then us - else cons u us + + -- used for sorting by ADA value in descending order + compareNegatedAdaValues + :: TransactionUnspentOutput -> TransactionUnspentOutput -> Ordering + compareNegatedAdaValues = + compare `on` + ( unwrap >>> _.output >>> unwrap >>> _.amount >>> valueToCoin >>> unwrap + >>> negate ) - [] - colUtxos - for_ sufficientUtxos \collateralUTxOs -> do + consumeUntilEnough + :: Array TransactionUnspentOutput + -> TransactionUnspentOutput + -> Array TransactionUnspentOutput + consumeUntilEnough utxos utxo = + if foldMap utxoValue utxos `Value.geq` targetCollateral then utxos + else cons utxo utxos + mbSufficientUtxos = mbCollateralUTxOs <#> + foldl consumeUntilEnough [] <<< Array.sortBy compareNegatedAdaValues + for_ mbSufficientUtxos \sufficientUtxos -> do let tooManyCollateralUTxOs = - UInt.fromInt (Array.length collateralUTxOs) > + UInt.fromInt (Array.length sufficientUtxos) > maxCollateralInputs when tooManyCollateralUTxOs do - liftEffect $ throw tooManyCollateralUTxOsError - pure sufficientUtxos + liftEffect $ throw $ tooManyCollateralUTxOsError + <> " Minimal set of UTxOs to cover the collateral are: " + <> show sufficientUtxos + pure mbSufficientUtxos where tooManyCollateralUTxOsError = "Wallet returned too many UTxOs as collateral. This is likely a bug in \ \the wallet." getWalletBalance - :: Contract (Maybe Value) + :: Contract Value getWalletBalance = do queryHandle <- getQueryHandle - getWallet >>= map join <<< traverse do - actionBasedOnWallet _.getBalance \_ -> do + wallet <- getWallet >>= liftM (error "getWalletBalance: no wallet is active") + let + getKeyWalletBalance = \_ -> do -- Implement via `utxosAt` addresses <- getWalletAddresses - fold <$> for addresses \address -> do - liftAff $ queryHandle.utxosAt address <#> hush >>> map - -- Combine `Value`s - (fold <<< map _.amount <<< map unwrap <<< Map.values) + fold <$> flip parTraverse addresses \address -> do + eiResponse <- liftAff $ queryHandle.utxosAt address + case eiResponse of + Left err -> liftEffect $ throw $ + "getWalletBalance via KeyWallet: utxosAt call error: " <> + pprintClientError err + Right utxoMap -> + pure $ fold $ map _.amount $ map unwrap $ Map.values utxoMap + actionBasedOnWallet _.getBalance getKeyWalletBalance wallet getWalletUtxos :: Contract (Maybe UtxoMap) getWalletUtxos = do queryHandle <- getQueryHandle - getWallet >>= map join <<< traverse do - actionBasedOnWallet - (\w conn -> w.getUtxos conn <#> map toUtxoMap) - \_ -> do - mbAddress <- getWalletAddresses <#> head - map join $ for mbAddress $ map hush <<< liftAff <<< queryHandle.utxosAt + wallet <- getWallet >>= liftM (error "getWalletUtxos: no wallet is active") + let + getKeyWalletUtxos = \_ -> do + addresses :: Array Address <- getWalletAddresses + utxoMaps <- flip parTraverse addresses \address -> do + eiResponse <- liftAff $ queryHandle.utxosAt address + case eiResponse of + Left err -> + liftEffect $ throw $ + "getWalletUtxos via KeyWallet: utxosAt call error: " <> + pprintClientError err + Right utxoMap -> + pure utxoMap + -- CIP-30 only returns `null` if the requested amount can't be returned + -- but since we only call `getUtxos` *without* a requested amount, we use + -- `Just` + pure $ Just $ foldr Map.union Map.empty utxoMaps + + actionBasedOnWallet (\w -> w.getUtxos <#> map toUtxoMap) getKeyWalletUtxos + wallet where toUtxoMap :: Array TransactionUnspentOutput -> UtxoMap toUtxoMap = Map.fromFoldable <<< map diff --git a/src/Internal/Deserialization/BigInt.js b/src/Internal/Deserialization/BigInt.js index cd7997304..0fd6fef55 100644 --- a/src/Internal/Deserialization/BigInt.js +++ b/src/Internal/Deserialization/BigInt.js @@ -1 +1,3 @@ -exports._BigInt_to_str = x => x.to_str(); +export function _BigInt_to_str(x) { + return x.to_str(); +} diff --git a/src/Internal/Deserialization/BigInt.purs b/src/Internal/Deserialization/BigInt.purs index 68b61e013..370a99d9c 100644 --- a/src/Internal/Deserialization/BigInt.purs +++ b/src/Internal/Deserialization/BigInt.purs @@ -5,8 +5,8 @@ module Ctl.Internal.Deserialization.BigInt import Prelude import Ctl.Internal.Serialization.Types (BigInt) -import Data.BigInt as BigInt import Data.Maybe (Maybe) +import JS.BigInt as BigInt convertBigInt :: BigInt -> Maybe BigInt.BigInt convertBigInt = BigInt.fromString <<< _BigInt_to_str diff --git a/src/Internal/Deserialization/FromBytes.js b/src/Internal/Deserialization/FromBytes.js index 802458ed3..f7b57ae04 100644 --- a/src/Internal/Deserialization/FromBytes.js +++ b/src/Internal/Deserialization/FromBytes.js @@ -2,16 +2,17 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports._fromBytes = helper => name => bytes => { - try { - return helper.valid(lib[name].from_bytes(bytes)); - } catch (e) { - return helper.error(name + ".from_bytes() raised " + e); - } -}; +export function _fromBytes(helper) { + return name => bytes => { + try { + return helper.valid(lib[name].from_bytes(bytes)); + } catch (e) { + return helper.error(name + ".from_bytes() raised " + e); + } + }; +} diff --git a/src/Internal/Deserialization/FromBytes.purs b/src/Internal/Deserialization/FromBytes.purs index 64619dbfb..5406e8d56 100644 --- a/src/Internal/Deserialization/FromBytes.purs +++ b/src/Internal/Deserialization/FromBytes.purs @@ -38,6 +38,8 @@ import Ctl.Internal.Serialization.Types , TransactionUnspentOutput , TransactionWitnessSet , Value + , Vkeywitness + , Vkeywitnesses ) import Ctl.Internal.Types.ByteArray (ByteArray) import Ctl.Internal.Types.CborBytes (CborBytes) @@ -133,6 +135,12 @@ instance FromBytes Value where instance FromBytes VRFKeyHash where fromBytes' = fromBytesImpl "VRFKeyHash" +instance FromBytes Vkeywitness where + fromBytes' = fromBytesImpl "Vkeywitness" + +instance FromBytes Vkeywitnesses where + fromBytes' = fromBytesImpl "Vkeywitnesses" + -- for backward compatibility until `Maybe` is abandoned. Then to be renamed. fromBytes :: forall (a :: Type). FromBytes a => CborBytes -> Maybe a fromBytes = unwrap >>> fromBytes' >>> hush diff --git a/src/Internal/Deserialization/Keys.js b/src/Internal/Deserialization/Keys.js index 51a83714d..4beb728a4 100644 --- a/src/Internal/Deserialization/Keys.js +++ b/src/Internal/Deserialization/Keys.js @@ -2,46 +2,55 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.freshPrivateKey = () => { +export function freshPrivateKey() { return lib.PrivateKey.generate_ed25519(); -}; +} -exports._publicKeyFromBech32 = maybe => bech32 => { - try { - return maybe.just(lib.PublicKey.from_bech32(bech32)); - } catch (_) { - return maybe.nothing; - } -}; +export function _publicKeyFromBech32(maybe) { + return bech32 => { + try { + return maybe.just(lib.PublicKey.from_bech32(bech32)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports._ed25519SignatureFromBech32 = maybe => bech32 => { - try { - return maybe.just(lib.Ed25519Signature.from_bech32(bech32)); - } catch (_) { - return maybe.nothing; - } -}; +export function _ed25519SignatureFromBech32(maybe) { + return bech32 => { + try { + return maybe.just(lib.Ed25519Signature.from_bech32(bech32)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports._privateKeyFromBytes = maybe => bytes => { - try { - return maybe.just(lib.PrivateKey.from_normal_bytes(bytes)); - } catch (_) { - return maybe.nothing; - } -}; +export function _privateKeyFromBytes(maybe) { + return bytes => { + try { + return maybe.just(lib.PrivateKey.from_normal_bytes(bytes)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports.privateKeyToBech32 = privateKey => privateKey.to_bech32(); +export function privateKeyToBech32(privateKey) { + return privateKey.to_bech32(); +} -exports._privateKeyFromBech32 = maybe => bech32 => { - try { - return maybe.just(lib.PrivateKey.from_bech32(bech32)); - } catch (_) { - return maybe.nothing; - } -}; +export function _privateKeyFromBech32(maybe) { + return bech32 => { + try { + return maybe.just(lib.PrivateKey.from_bech32(bech32)); + } catch (_) { + return maybe.nothing; + } + }; +} diff --git a/src/Internal/Deserialization/Language.js b/src/Internal/Deserialization/Language.js index b2d596da3..e39c2a5aa 100644 --- a/src/Internal/Deserialization/Language.js +++ b/src/Internal/Deserialization/Language.js @@ -2,18 +2,19 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports._convertLanguage = langCtors => cslLang => { - if (cslLang.kind() == lib.LanguageKind.PlutusV1) { - return langCtors.plutusV1; - } else if (cslLang.kind() == lib.LanguageKind.PlutusV2) { - return langCtors.plutusV2; - } else { - throw "_convertLanguage: Unsupported language kind: " + cslLang.kind(); - } -}; +export function _convertLanguage(langCtors) { + return cslLang => { + if (cslLang.kind() == lib.LanguageKind.PlutusV1) { + return langCtors.plutusV1; + } else if (cslLang.kind() == lib.LanguageKind.PlutusV2) { + return langCtors.plutusV2; + } else { + throw "_convertLanguage: Unsupported language kind: " + cslLang.kind(); + } + }; +} diff --git a/src/Internal/Deserialization/NativeScript.js b/src/Internal/Deserialization/NativeScript.js index 567e64871..4ef2dc16b 100644 --- a/src/Internal/Deserialization/NativeScript.js +++ b/src/Internal/Deserialization/NativeScript.js @@ -2,40 +2,48 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); +} + +export function _convertNativeScript(handler) { + return ns => { + switch (ns.kind()) { + case lib.NativeScriptKind.ScriptPubkey: + return handler.scriptPubkey(ns.as_script_pubkey()); + case lib.NativeScriptKind.ScriptAll: + return handler.scriptAll(ns.as_script_all()); + case lib.NativeScriptKind.ScriptAny: + return handler.scriptAny(ns.as_script_any()); + case lib.NativeScriptKind.ScriptNOfK: + return handler.scriptNOfK(ns.as_script_n_of_k()); + case lib.NativeScriptKind.TimelockStart: + return handler.timelockStart(ns.as_timelock_start()); + case lib.NativeScriptKind.TimelockExpiry: + return handler.timelockExpiry(ns.as_timelock_expiry()); + default: + throw "Impossible native script kind: " + ns.kind(); + } + }; } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); - -exports._convertNativeScript = handler => ns => { - switch (ns.kind()) { - case lib.NativeScriptKind.ScriptPubkey: - return handler.scriptPubkey(ns.as_script_pubkey()); - case lib.NativeScriptKind.ScriptAll: - return handler.scriptAll(ns.as_script_all()); - case lib.NativeScriptKind.ScriptAny: - return handler.scriptAny(ns.as_script_any()); - case lib.NativeScriptKind.ScriptNOfK: - return handler.scriptNOfK(ns.as_script_n_of_k()); - case lib.NativeScriptKind.TimelockStart: - return handler.timelockStart(ns.as_timelock_start()); - case lib.NativeScriptKind.TimelockExpiry: - return handler.timelockExpiry(ns.as_timelock_expiry()); - default: - throw "Impossible native script kind: " + ns.kind(); - } -}; const call = property => object => object[property](); -exports.scriptPubkey_addr_keyhash = call("addr_keyhash"); -exports.scriptAllScripts = helper => - helper.unpackFromProperty("native_scripts"); -exports.scriptAnyScripts = helper => - helper.unpackFromProperty("native_scripts"); -exports.scriptNOfKScripts = helper => - helper.unpackFromProperty("native_scripts"); -exports.scriptNOfK_n = call("n"); -exports.timelockStart_slot = call("slot_bignum"); -exports.timelockExpiry_slot = call("slot_bignum"); +export const scriptPubkey_addr_keyhash = call("addr_keyhash"); + +export function scriptAllScripts(helper) { + return helper.unpackFromProperty("native_scripts"); +} + +export function scriptAnyScripts(helper) { + return helper.unpackFromProperty("native_scripts"); +} + +export function scriptNOfKScripts(helper) { + return helper.unpackFromProperty("native_scripts"); +} + +export const scriptNOfK_n = call("n"); +export const timelockStart_slot = call("slot_bignum"); +export const timelockExpiry_slot = call("slot_bignum"); diff --git a/src/Internal/Deserialization/PlutusData.js b/src/Internal/Deserialization/PlutusData.js index 5542bdd10..3d0c28805 100644 --- a/src/Internal/Deserialization/PlutusData.js +++ b/src/Internal/Deserialization/PlutusData.js @@ -2,40 +2,51 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports._convertPlutusData = handle => pd => { - switch (pd.kind()) { - case lib.PlutusDataKind.ConstrPlutusData: - return handle.constr(pd.as_constr_plutus_data()); - case lib.PlutusDataKind.Map: - return handle.map(pd.as_map()); - case lib.PlutusDataKind.List: - return handle.list(pd.as_list()); - case lib.PlutusDataKind.Integer: - return handle.integer(pd.as_integer()); - case lib.PlutusDataKind.Bytes: - return handle.bytes(pd.as_bytes()); - default: - throw "Impossible PlutusData kind: " + pd.kind(); - } -}; +export function _convertPlutusData(handle) { + return pd => { + switch (pd.kind()) { + case lib.PlutusDataKind.ConstrPlutusData: + return handle.constr(pd.as_constr_plutus_data()); + case lib.PlutusDataKind.Map: + return handle.map(pd.as_map()); + case lib.PlutusDataKind.List: + return handle.list(pd.as_list()); + case lib.PlutusDataKind.Integer: + return handle.integer(pd.as_integer()); + case lib.PlutusDataKind.Bytes: + return handle.bytes(pd.as_bytes()); + default: + throw "Impossible PlutusData kind: " + pd.kind(); + } + }; +} + +export function _unpackPlutusList(containerHelper) { + return containerHelper.unpack; +} -exports._unpackPlutusList = containerHelper => containerHelper.unpack; -exports._ConstrPlutusData_alternative = x => x.alternative(); -exports._ConstrPlutusData_data = x => x.data(); +export function _ConstrPlutusData_alternative(x) { + return x.alternative(); +} -exports._unpackPlutusMap = containerHelper => tuple => plutusMap => { - const keys = containerHelper.unpack(plutusMap.keys()); - const res = []; - for (let key of keys) { - // Assuming that `PlutusMap.get()` never fails on elements from result of - // its `.keys()` call. - res.push(tuple(key)(plutusMap.get(key))); - } - return res; -}; +export function _ConstrPlutusData_data(x) { + return x.data(); +} + +export function _unpackPlutusMap(containerHelper) { + return tuple => plutusMap => { + const keys = containerHelper.unpack(plutusMap.keys()); + const res = []; + for (let key of keys) { + // Assuming that `PlutusMap.get()` never fails on elements from result of + // its `.keys()` call. + res.push(tuple(key)(plutusMap.get(key))); + } + return res; + }; +} diff --git a/src/Internal/Deserialization/Transaction.js b/src/Internal/Deserialization/Transaction.js index e0f990c2e..57faa3572 100644 --- a/src/Internal/Deserialization/Transaction.js +++ b/src/Internal/Deserialization/Transaction.js @@ -2,11 +2,10 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); const call = property => object => object[property](); const callMaybe = property => maybe => object => { @@ -14,13 +13,17 @@ const callMaybe = property => maybe => object => { return res != null ? maybe.just(res) : maybe.nothing; }; -exports._txIsValid = tx => tx.is_valid(); -exports._txWitnessSet = tx => tx.witness_set(); -exports._txBody = tx => tx.body(); -exports._txAuxiliaryData = maybe => tx => { - const ad = tx.auxiliary_data(); - return ad == null ? maybe.nothing : maybe.just(ad); -}; +export function _txIsValid(tx) { + return tx.is_valid(); +} + +export function _txWitnessSet(tx) { + return tx.witness_set(); +} + +export function _txBody(tx) { + return tx.body(); +} const maybeGetter_ = fmap => propstr => maybe => obj => { if (typeof propstr != "string") { @@ -34,277 +37,342 @@ const maybeGetter = maybeGetter_(a => a); const maybeGetterMulti = propstr => containerHelper => maybeGetter_(o => containerHelper.unpack(o))(propstr); -exports._txAuxiliaryData = maybeGetter("auxiliary_data"); -exports._adGeneralMetadata = maybeGetter("metadata"); -exports._adNativeScripts = maybeGetter("native_scripts"); -exports._adPlutusScripts = maybeGetter("plutus_scripts"); +export const _txAuxiliaryData = maybeGetter("auxiliary_data"); +export const _adGeneralMetadata = maybeGetter("metadata"); +export const _adNativeScripts = maybeGetter("native_scripts"); +export const _adPlutusScripts = maybeGetter("plutus_scripts"); // inputs(): TransactionInputs; -exports._txBodyInputs = containerhelper => body => - containerhelper.unpack(body.inputs()); +export function _txBodyInputs(containerhelper) { + return body => containerhelper.unpack(body.inputs()); +} + // outputs(): TransactionOutputs; -exports._txBodyOutputs = containerhelper => body => - containerhelper.unpack(body.outputs()); +export function _txBodyOutputs(containerhelper) { + return body => containerhelper.unpack(body.outputs()); +} + // fee(): BigNum; -exports._txBodyFee = body => body.fee(); +export function _txBodyFee(body) { + return body.fee(); +} + // ttl(): number | void; -exports._txBodyTtl = maybeGetter("ttl_bignum"); +export const _txBodyTtl = maybeGetter("ttl_bignum"); + // certs(): Certificates | void; -exports._txBodyCerts = maybeGetterMulti("certs"); +export const _txBodyCerts = maybeGetterMulti("certs"); + // withdrawals(): Withdrawals | void; -exports._txBodyWithdrawals = maybeGetter("withdrawals"); +export const _txBodyWithdrawals = maybeGetter("withdrawals"); + // update(): Update | void; -exports._txBodyUpdate = maybeGetter("update"); +export const _txBodyUpdate = maybeGetter("update"); + // auxiliary_data_hash(): AuxiliaryDataHash | void; -exports._txBodyAuxiliaryDataHash = maybeGetter("auxiliary_data_hash"); +export const _txBodyAuxiliaryDataHash = maybeGetter("auxiliary_data_hash"); + // validity_start_interval(): number | void; -exports._txBodyValidityStartInterval = maybeGetter( +export const _txBodyValidityStartInterval = maybeGetter( "validity_start_interval_bignum" ); + // multiassets(): Mint | void; -exports._txBodyMultiAssets = maybeGetter("multiassets"); -exports._txBodyReferenceInputs = maybe => containerhelper => body => - body.reference_inputs() - ? maybe.just(containerhelper.unpack(body.reference_inputs())) - : maybe.nothing; +export const _txBodyMultiAssets = maybeGetter("multiassets"); + +export function _txBodyReferenceInputs(maybe) { + return containerhelper => body => + body.reference_inputs() + ? maybe.just(containerhelper.unpack(body.reference_inputs())) + : maybe.nothing; +} + // script_data_hash(): ScriptDataHash | void; -exports._txBodyScriptDataHash = maybeGetter("script_data_hash"); +export const _txBodyScriptDataHash = maybeGetter("script_data_hash"); + // collateral(): Array TransactionInput | void; -exports._txBodyCollateral = maybeGetterMulti("collateral"); +export const _txBodyCollateral = maybeGetterMulti("collateral"); + // required_signers(): Ed25519KeyHashes | void; -exports._txBodyRequiredSigners = maybeGetterMulti("required_signers"); +export const _txBodyRequiredSigners = maybeGetterMulti("required_signers"); + // network_id(): number | void; -exports._txBodyNetworkId = testnet => mainnet => - maybeGetter_(o => { - switch (o.kind()) { - case lib.NetworkIdKind.Testnet: - return testnet; - case lib.NetworkIdKind.Mainnet: - return mainnet; - default: - throw "Unknown NetworkIdKind: " + o.kind(); - } - })("network_id"); +export function _txBodyNetworkId(testnet) { + return mainnet => + maybeGetter_(o => { + switch (o.kind()) { + case lib.NetworkIdKind.Testnet: + return testnet; + case lib.NetworkIdKind.Mainnet: + return mainnet; + default: + throw "Unknown NetworkIdKind: " + o.kind(); + } + })("network_id"); +} // collateral_return(): TransactionOutput | void; -exports._txBodyCollateralReturn = maybeGetter("collateral_return"); +export const _txBodyCollateralReturn = maybeGetter("collateral_return"); // total_collateral(): BigNum | void -exports._txBodyTotalCollateral = maybeGetter("total_collateral"); +export const _txBodyTotalCollateral = maybeGetter("total_collateral"); // foreign import _unpackWithdrawals :: ContainerHelper -> CSL.Withdrawals -> Array(Tuple CSL.RewardAddress CSL.BigNum) -exports._unpackWithdrawals = containerhelper => - containerhelper.unpackKeyIndexed; - -exports._unpackUpdate = containerhelper => update => { - const pppus = containerhelper.unpackKeyIndexed( - update.proposed_protocol_parameter_updates() - ); - return { epoch: update.epoch(), paramUpdates: pppus }; -}; +export function _unpackWithdrawals(containerhelper) { + return containerhelper.unpackKeyIndexed; +} -exports._unpackMint = containerhelper => containerhelper.unpackKeyIndexed; - -exports._unpackMintAssets = containerhelper => containerhelper.unpackKeyIndexed; - -exports._convertCert = certConvHelper => cert => { - switch (cert.kind()) { - case lib.CertificateKind.StakeRegistration: - return certConvHelper.stakeRegistration( - cert.as_stake_registration().stake_credential() - ); - case lib.CertificateKind.StakeDeregistration: - return certConvHelper.stakeDeregistration( - cert.as_stake_deregistration().stake_credential() - ); - case lib.CertificateKind.StakeDelegation: - return certConvHelper.stakeDelegation( - cert.as_stake_delegation().stake_credential() - )(cert.as_stake_delegation().pool_keyhash()); - case lib.CertificateKind.PoolRegistration: - return certConvHelper.poolRegistration( - cert.as_pool_registration().pool_params() - ); - case lib.CertificateKind.PoolRetirement: - return certConvHelper.poolRetirement( - cert.as_pool_retirement().pool_keyhash() - )(cert.as_pool_retirement().epoch()); - case lib.CertificateKind.GenesisKeyDelegation: - return certConvHelper.genesisKeyDelegation( - cert.as_genesis_key_delegation().genesishash() - )(cert.as_genesis_key_delegation().genesis_delegate_hash())( - cert.as_genesis_key_delegation().vrf_keyhash() - ); - case lib.CertificateKind.MoveInstantaneousRewardsCert: - const mirCert = cert.as_move_instantaneous_rewards_cert(); - const mir = mirCert.move_instantaneous_reward(); - switch (mir.kind()) { - case lib.MIRKind.ToOtherPot: - return certConvHelper.moveInstantaneousRewardsToOtherPotCert( - mir.pot() - )(mir.as_to_other_pot()); - case lib.MIRKind.ToStakeCredentials: - return certConvHelper.moveInstantaneousRewardsToStakeCreds(mir.pot())( - mir.as_to_stake_creds() - ); - default: - throw ( - "MoveInstantaneousReward convertion failed for kind" + mir.kind() - ); - } - default: - throw ("Cert conversion failed for kind: ", cert.kind()); - } -}; +export function _unpackUpdate(containerhelper) { + return update => { + const pppus = containerhelper.unpackKeyIndexed( + update.proposed_protocol_parameter_updates() + ); + return { epoch: update.epoch(), paramUpdates: pppus }; + }; +} -exports._unpackProtocolParamUpdate = maybe => ppu => { - const optional = x => (x == null ? maybe.nothing : maybe.just(x)); +export function _unpackMint(containerhelper) { + return containerhelper.unpackKeyIndexed; +} - return { - minfeeA: optional(ppu.minfee_a()), - minfeeB: optional(ppu.minfee_b()), - maxBlockBodySize: optional(ppu.max_block_body_size()), - maxTxSize: optional(ppu.max_tx_size()), - maxBlockHeaderSize: optional(ppu.max_block_header_size()), - keyDeposit: optional(ppu.key_deposit()), - poolDeposit: optional(ppu.pool_deposit()), - maxEpoch: optional(ppu.max_epoch()), - nOpt: optional(ppu.n_opt()), - poolPledgeInfluence: optional(ppu.pool_pledge_influence()), - expansionRate: optional(ppu.expansion_rate()), - treasuryGrowthRate: optional(ppu.treasury_growth_rate()), - protocolVersion: optional(ppu.protocol_version()), - minPoolCost: optional(ppu.min_pool_cost()), - adaPerUtxoByte: optional(ppu.ada_per_utxo_byte()), - costModels: optional(ppu.cost_models()), - executionCosts: optional(ppu.execution_costs()), - maxTxExUnits: optional(ppu.max_tx_ex_units()), - maxBlockExUnits: optional(ppu.max_block_ex_units()), - maxValueSize: optional(ppu.max_value_size()), - collateralPercentage: optional(ppu.collateral_percentage()), - maxCollateralInputs: optional(ppu.max_collateral_inputs()), +export function _unpackMintAssets(containerhelper) { + return containerhelper.unpackKeyIndexed; +} + +export function _convertCert(certConvHelper) { + return cert => { + switch (cert.kind()) { + case lib.CertificateKind.StakeRegistration: + return certConvHelper.stakeRegistration( + cert.as_stake_registration().stake_credential() + ); + case lib.CertificateKind.StakeDeregistration: + return certConvHelper.stakeDeregistration( + cert.as_stake_deregistration().stake_credential() + ); + case lib.CertificateKind.StakeDelegation: + return certConvHelper.stakeDelegation( + cert.as_stake_delegation().stake_credential() + )(cert.as_stake_delegation().pool_keyhash()); + case lib.CertificateKind.PoolRegistration: + return certConvHelper.poolRegistration( + cert.as_pool_registration().pool_params() + ); + case lib.CertificateKind.PoolRetirement: + return certConvHelper.poolRetirement( + cert.as_pool_retirement().pool_keyhash() + )(cert.as_pool_retirement().epoch()); + case lib.CertificateKind.GenesisKeyDelegation: + return certConvHelper.genesisKeyDelegation( + cert.as_genesis_key_delegation().genesishash() + )(cert.as_genesis_key_delegation().genesis_delegate_hash())( + cert.as_genesis_key_delegation().vrf_keyhash() + ); + case lib.CertificateKind.MoveInstantaneousRewardsCert: + const mirCert = cert.as_move_instantaneous_rewards_cert(); + const mir = mirCert.move_instantaneous_reward(); + switch (mir.kind()) { + case lib.MIRKind.ToOtherPot: + return certConvHelper.moveInstantaneousRewardsToOtherPotCert( + mir.pot() + )(mir.as_to_other_pot()); + case lib.MIRKind.ToStakeCredentials: + return certConvHelper.moveInstantaneousRewardsToStakeCreds( + mir.pot() + )(mir.as_to_stake_creds()); + default: + throw ( + "MoveInstantaneousReward convertion failed for kind" + mir.kind() + ); + } + default: + throw ("Cert conversion failed for kind: ", cert.kind()); + } }; -}; +} + +export function _unpackProtocolParamUpdate(maybe) { + return ppu => { + const optional = x => (x == null ? maybe.nothing : maybe.just(x)); + + return { + minfeeA: optional(ppu.minfee_a()), + minfeeB: optional(ppu.minfee_b()), + maxBlockBodySize: optional(ppu.max_block_body_size()), + maxTxSize: optional(ppu.max_tx_size()), + maxBlockHeaderSize: optional(ppu.max_block_header_size()), + keyDeposit: optional(ppu.key_deposit()), + poolDeposit: optional(ppu.pool_deposit()), + maxEpoch: optional(ppu.max_epoch()), + nOpt: optional(ppu.n_opt()), + poolPledgeInfluence: optional(ppu.pool_pledge_influence()), + expansionRate: optional(ppu.expansion_rate()), + treasuryGrowthRate: optional(ppu.treasury_growth_rate()), + protocolVersion: optional(ppu.protocol_version()), + minPoolCost: optional(ppu.min_pool_cost()), + adaPerUtxoByte: optional(ppu.ada_per_utxo_byte()), + costModels: optional(ppu.cost_models()), + executionCosts: optional(ppu.execution_costs()), + maxTxExUnits: optional(ppu.max_tx_ex_units()), + maxBlockExUnits: optional(ppu.max_block_ex_units()), + maxValueSize: optional(ppu.max_value_size()), + collateralPercentage: optional(ppu.collateral_percentage()), + maxCollateralInputs: optional(ppu.max_collateral_inputs()) + }; + }; +} -exports._unpackCostModels = containerhelper => containerhelper.unpackKeyIndexed; +export function _unpackCostModels(containerhelper) { + return containerhelper.unpackKeyIndexed; +} -exports._unpackCostModel = cm => { +export function _unpackCostModel(cm) { const res = []; for (let op = 0; op < cm.len(); op++) { res.push(cm.get(op).to_str()); } return res; -}; +} -exports._convertNonce = nonceCtors => cslNonce => { - const hashBytes = cslNonce.get_hash(); - return hashBytes == null - ? nonceCtors.identityNonce - : nonceCtors.hashNonce(hashBytes); -}; +export function _convertNonce(nonceCtors) { + return cslNonce => { + const hashBytes = cslNonce.get_hash(); + return hashBytes == null + ? nonceCtors.identityNonce + : nonceCtors.hashNonce(hashBytes); + }; +} -exports._unpackMetadatums = containerHelper => containerHelper.unpackKeyIndexed; - -exports._unpackMetadataMap = containerHelper => - containerHelper.unpackKeyIndexed; - -exports._unpackMetadataList = containerHelper => containerHelper.unpack; - -exports._convertMetadatum = metadataCtors => cslMetadatum => { - switch (cslMetadatum.kind()) { - case lib.TransactionMetadatumKind.MetadataMap: - return metadataCtors.from_map(cslMetadatum.as_map()); - case lib.TransactionMetadatumKind.MetadataList: - return metadataCtors.from_list(cslMetadatum.as_list()); - case lib.TransactionMetadatumKind.Int: - return metadataCtors.from_int(cslMetadatum.as_int()); - case lib.TransactionMetadatumKind.Bytes: - return metadataCtors.from_bytes(cslMetadatum.as_bytes()); - case lib.TransactionMetadatumKind.Text: - return metadataCtors.from_text(cslMetadatum.as_text()); - default: - throw "Could not convert to known types."; - } -}; +export function _unpackMetadatums(containerHelper) { + return containerHelper.unpackKeyIndexed; +} + +export function _unpackMetadataMap(containerHelper) { + return containerHelper.unpackKeyIndexed; +} + +export function _unpackMetadataList(containerHelper) { + return containerHelper.unpack; +} -exports._unpackExUnits = exunits => { +export function _convertMetadatum(metadataCtors) { + return cslMetadatum => { + switch (cslMetadatum.kind()) { + case lib.TransactionMetadatumKind.MetadataMap: + return metadataCtors.from_map(cslMetadatum.as_map()); + case lib.TransactionMetadatumKind.MetadataList: + return metadataCtors.from_list(cslMetadatum.as_list()); + case lib.TransactionMetadatumKind.Int: + return metadataCtors.from_int(cslMetadatum.as_int()); + case lib.TransactionMetadatumKind.Bytes: + return metadataCtors.from_bytes(cslMetadatum.as_bytes()); + case lib.TransactionMetadatumKind.Text: + return metadataCtors.from_text(cslMetadatum.as_text()); + default: + throw "Could not convert to known types."; + } + }; +} + +export function _unpackExUnits(exunits) { return { mem: exunits.mem(), - steps: exunits.steps(), + steps: exunits.steps() }; -}; +} -exports._unpackUnitInterval = ui => { +export function _unpackUnitInterval(ui) { return { numerator: ui.numerator(), - denominator: ui.denominator(), + denominator: ui.denominator() }; -}; +} -exports._unpackProtocolVersion = cslPV => ({ - major: cslPV.major(), - minor: cslPV.minor(), -}); +export function _unpackProtocolVersion(cslPV) { + return { + major: cslPV.major(), + minor: cslPV.minor() + }; +} -exports._unpackExUnitsPrices = cslEup => { +export function _unpackExUnitsPrices(cslEup) { return { memPrice: cslEup.mem_price(), - stepPrice: cslEup.step_price(), + stepPrice: cslEup.step_price() }; -}; +} -exports.poolParamsOperator = call("operator"); -exports.poolParamsVrfKeyhash = call("vrf_keyhash"); -exports.poolParamsPledge = call("pledge"); -exports.poolParamsCost = call("cost"); -exports.poolParamsMargin = call("margin"); -exports.poolParamsRewardAccount = call("reward_account"); -exports.poolParamsPoolOwners = containerHelper => poolParams => - containerHelper.unpack(poolParams.pool_owners()); -exports.poolParamsRelays = containerHelper => poolParams => - containerHelper.unpack(poolParams.relays()); -exports.poolParamsPoolMetadata = callMaybe("pool_metadata"); - -exports.convertRelay_ = helper => relay => { - switch (relay.kind()) { - case lib.RelayKind.SingleHostAddr: - return helper.asSingleHostAddr(relay.as_single_host_addr()); - case lib.RelayKind.SingleHostName: - return helper.asSingleHostName(relay.as_single_host_name()); - case lib.RelayKind.MultiHostName: - return helper.asMultiHostName(relay.as_multi_host_name()); - default: - throw "convertRelay_: impossible happened: invalid Relay"; - } -}; +export const poolParamsOperator = call("operator"); +export const poolParamsVrfKeyhash = call("vrf_keyhash"); +export const poolParamsPledge = call("pledge"); +export const poolParamsCost = call("cost"); +export const poolParamsMargin = call("margin"); +export const poolParamsRewardAccount = call("reward_account"); -exports.convertIpv6_ = ipv6 => ipv6.ip(); +export function poolParamsPoolOwners(containerHelper) { + return poolParams => containerHelper.unpack(poolParams.pool_owners()); +} -exports.convertIpv4_ = ipv6 => ipv6.ip(); +export function poolParamsRelays(containerHelper) { + return poolParams => containerHelper.unpack(poolParams.relays()); +} -exports.convertSingleHostAddr_ = maybe => cont => singleHostAddr => { - const port = singleHostAddr.port(); - const ipv4 = singleHostAddr.ipv4(); - const ipv6 = singleHostAddr.ipv6(); +export const poolParamsPoolMetadata = callMaybe("pool_metadata"); + +export function convertRelay_(helper) { + return relay => { + switch (relay.kind()) { + case lib.RelayKind.SingleHostAddr: + return helper.asSingleHostAddr(relay.as_single_host_addr()); + case lib.RelayKind.SingleHostName: + return helper.asSingleHostName(relay.as_single_host_name()); + case lib.RelayKind.MultiHostName: + return helper.asMultiHostName(relay.as_multi_host_name()); + default: + throw "convertRelay_: impossible happened: invalid Relay"; + } + }; +} - return cont(port ? maybe.just(port) : maybe.nothing)( - ipv4 ? maybe.just(ipv4) : maybe.nothing - )(ipv6 ? maybe.just(ipv6) : maybe.nothing); -}; +export function convertIpv6_(ipv6) { + return ipv6.ip(); +} -exports.convertSingleHostName_ = maybe => cont => singleHostName => { - const port = singleHostName.port(); - return cont(port ? maybe.just(port) : maybe.nothing)( - singleHostName.dns_name().record() - ); -}; +export function convertIpv4_(ipv6) { + return ipv6.ip(); +} + +export function convertSingleHostAddr_(maybe) { + return cont => singleHostAddr => { + const port = singleHostAddr.port(); + const ipv4 = singleHostAddr.ipv4(); + const ipv6 = singleHostAddr.ipv6(); + + return cont(port ? maybe.just(port) : maybe.nothing)( + ipv4 ? maybe.just(ipv4) : maybe.nothing + )(ipv6 ? maybe.just(ipv6) : maybe.nothing); + }; +} -exports.convertMultiHostName_ = multiHostName => - multiHostName.dns_name().record(); +export function convertSingleHostName_(maybe) { + return cont => singleHostName => { + const port = singleHostName.port(); + return cont(port ? maybe.just(port) : maybe.nothing)( + singleHostName.dns_name().record() + ); + }; +} + +export function convertMultiHostName_(multiHostName) { + return multiHostName.dns_name().record(); +} -exports.unpackMIRToStakeCredentials_ = - containerHelper => mirToStakeCredentials => +export function unpackMIRToStakeCredentials_(containerHelper) { + return mirToStakeCredentials => containerHelper.unpackKeyIndexed(mirToStakeCredentials); +} -exports.convertPoolMetadata_ = cont => poolMetadata => - cont(poolMetadata.url().url())(poolMetadata.pool_metadata_hash()); +export function convertPoolMetadata_(cont) { + return poolMetadata => + cont(poolMetadata.url().url())(poolMetadata.pool_metadata_hash()); +} diff --git a/src/Internal/Deserialization/Transaction.purs b/src/Internal/Deserialization/Transaction.purs index 518e5a908..522b5474f 100644 --- a/src/Internal/Deserialization/Transaction.purs +++ b/src/Internal/Deserialization/Transaction.purs @@ -194,8 +194,6 @@ import Ctl.Internal.Types.TransactionMetadata ) import Ctl.Internal.Types.VRFKeyHash (VRFKeyHash(VRFKeyHash)) import Data.Bifunctor (bimap, lmap) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Bitraversable (bitraverse) import Data.Either (Either) import Data.Map as M @@ -208,6 +206,8 @@ import Data.Tuple.Nested (type (/\)) import Data.UInt (UInt) import Data.UInt as UInt import Data.Variant (Variant) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Type.Row (type (+)) -- | Deserializes CBOR encoded transaction to a CTL's native type. @@ -220,10 +220,9 @@ deserializeTransaction txCbor = fromBytes' (unwrap txCbor) >>= convertTransaction :: forall (r :: Row Type). Csl.Transaction -> Err r T.Transaction convertTransaction tx = addErrTrace "convertTransaction" do - witnessSet <- cslErr "convertWitnessSet" $ convertWitnessSet - (_txWitnessSet tx) body <- convertTxBody $ _txBody tx let + witnessSet = convertWitnessSet (_txWitnessSet tx) auxiliaryData = convertAuxiliaryData <$> _txAuxiliaryData maybeFfiHelper tx pure $ T.Transaction @@ -336,7 +335,7 @@ convertCertificate = _convertCert certConvHelper certConvHelper = { stakeDeregistration: T.StakeDeregistration , stakeRegistration: T.StakeRegistration - , stakeDelegation: \sc -> T.StakeDelegation sc <<< wrap + , stakeDelegation: \sc -> T.StakeDelegation sc <<< wrap <<< wrap , poolRegistration: convertPoolRegistration , poolRetirement: convertPoolRetirement , genesisKeyDelegation: \genesisHash genesisDelegateHash vrfKeyhash -> do @@ -365,7 +364,7 @@ convertPoolRegistration params = do let relays = convertRelay <$> poolParamsRelays containerHelper params T.PoolRegistration - { operator: PoolPubKeyHash $ poolParamsOperator params + { operator: PoolPubKeyHash $ wrap $ poolParamsOperator params , vrfKeyhash: VRFKeyHash $ poolParamsVrfKeyhash params , pledge: poolParamsPledge params , cost: poolParamsCost params @@ -438,7 +437,7 @@ convertPoolRetirement -> UInt -> T.Certificate convertPoolRetirement poolKeyHash epoch = do - T.PoolRetirement { poolKeyHash: wrap poolKeyHash, epoch: wrap epoch } + T.PoolRetirement { poolKeyHash: wrap $ wrap poolKeyHash, epoch: wrap epoch } convertMint :: Csl.Mint -> T.Mint convertMint mint = T.Mint $ mkNonAdaAsset diff --git a/src/Internal/Deserialization/UnspentOutput.js b/src/Internal/Deserialization/UnspentOutput.js index e87e5eb37..61f5ecbee 100644 --- a/src/Internal/Deserialization/UnspentOutput.js +++ b/src/Internal/Deserialization/UnspentOutput.js @@ -2,11 +2,10 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); const call = property => object => object[property](); const callMaybe = property => maybe => object => { @@ -40,28 +39,33 @@ const extractDict = tuple => dict => { return res; }; -exports.getInput = call("input"); -exports.getOutput = call("output"); -exports.getTransactionHash = call("transaction_id"); -exports.getTransactionIndex = call("index"); -exports.getAddress = call("address"); -exports.getPlutusData = callMaybe("plutus_data"); -exports.getScriptRef = callMaybe("script_ref"); -exports.withScriptRef = ccNativeScript => ccPlutusScript => scriptRef => { - if (scriptRef.is_native_script()) { - return ccNativeScript(scriptRef.native_script()); - } else if (scriptRef.is_plutus_script()) { - return ccPlutusScript(scriptRef.plutus_script()); - } else { - throw "Impossible happened: withScriptRef: not a script"; - } -}; +export const getInput = call("input"); +export const getOutput = call("output"); +export const getTransactionHash = call("transaction_id"); +export const getTransactionIndex = call("index"); +export const getAddress = call("address"); +export const getPlutusData = callMaybe("plutus_data"); +export const getScriptRef = callMaybe("script_ref"); + +export function withScriptRef(ccNativeScript) { + return ccPlutusScript => scriptRef => { + if (scriptRef.is_native_script()) { + return ccNativeScript(scriptRef.native_script()); + } else if (scriptRef.is_plutus_script()) { + return ccPlutusScript(scriptRef.plutus_script()); + } else { + throw "Impossible happened: withScriptRef: not a script"; + } + }; +} + +export const getAmount = call("amount"); +export const getCoin = call("coin"); +export const getMultiAsset = callMaybe("multiasset"); +export { extractDict as extractMultiAsset }; +export { extractDict as extractAssets }; +export const getDataHash = callMaybe("data_hash"); -exports.getAmount = call("amount"); -exports.getCoin = call("coin"); -exports.getMultiAsset = callMaybe("multiasset"); -exports.extractMultiAsset = extractDict; -exports.extractAssets = extractDict; -exports.getDataHash = callMaybe("data_hash"); -exports.mkTransactionUnspentOutput = input => output => - lib.TransactionUnspentOutput.new(input, output); +export function mkTransactionUnspentOutput(input) { + return output => lib.TransactionUnspentOutput.new(input, output); +} diff --git a/src/Internal/Deserialization/WitnessSet.js b/src/Internal/Deserialization/WitnessSet.js index 752cc47bc..ea8b41a80 100644 --- a/src/Internal/Deserialization/WitnessSet.js +++ b/src/Internal/Deserialization/WitnessSet.js @@ -18,35 +18,39 @@ const containerExtractor = obj => { return res; }; -exports.getVkeywitnesses = callMaybe("vkeys"); -exports.extractWitnesses = containerExtractor; -exports.getVkey = call("vkey"); -exports.getSignature = call("signature"); -exports.vkeyPublicKey = call("public_key"); -exports.publicKeyToBech32 = call("to_bech32"); -exports.signatureToBech32 = call("to_bech32"); -exports.getNativeScripts = callMaybe("native_scripts"); -exports.extractNativeScripts = containerExtractor; -exports.nativeScriptAs = maybe => prop => res => ns => - ns[prop]() == null ? maybe.nothing : maybe.just(res); -exports.getBootstraps = callMaybe("bootstraps"); -exports.extractBootstraps = containerExtractor; -exports.getBootstrapVkey = call("vkey"); -exports.getBootstrapSignature = call("signature"); -exports.getBootstrapChainCode = call("chain_code"); -exports.getBootstrapAttributes = call("attributes"); -exports.getPlutusScripts = callMaybe("plutus_scripts"); -exports.extractPlutusScripts = containerExtractor; -exports.plutusScriptBytes = call("bytes"); -exports.plutusScriptVersion = call("language_version"); -exports.getWitnessSetPlutusData = callMaybe("plutus_data"); -exports.extractPlutusData = containerExtractor; -exports.getRedeemers = callMaybe("redeemers"); -exports.getRedeemerTag = call("tag"); -exports.getRedeemerIndex = call("index"); -exports.extractRedeemers = containerExtractor; -exports.getRedeemerTagKind = call("kind"); -exports.getRedeemerPlutusData = call("data"); -exports.getExUnits = call("ex_units"); -exports.getExUnitsMem = call("mem"); -exports.getExUnitsSteps = call("steps"); +export const getVkeywitnesses = callMaybe("vkeys"); +export { containerExtractor as extractWitnesses }; +export const getVkey = call("vkey"); +export const getSignature = call("signature"); +export const vkeyPublicKey = call("public_key"); +export const publicKeyToBech32 = call("to_bech32"); +export const signatureToBech32 = call("to_bech32"); +export const getNativeScripts = callMaybe("native_scripts"); +export { containerExtractor as extractNativeScripts }; + +export function nativeScriptAs(maybe) { + return prop => res => ns => + ns[prop]() == null ? maybe.nothing : maybe.just(res); +} + +export const getBootstraps = callMaybe("bootstraps"); +export { containerExtractor as extractBootstraps }; +export const getBootstrapVkey = call("vkey"); +export const getBootstrapSignature = call("signature"); +export const getBootstrapChainCode = call("chain_code"); +export const getBootstrapAttributes = call("attributes"); +export const getPlutusScripts = callMaybe("plutus_scripts"); +export { containerExtractor as extractPlutusScripts }; +export const plutusScriptBytes = call("bytes"); +export const plutusScriptVersion = call("language_version"); +export const getWitnessSetPlutusData = callMaybe("plutus_data"); +export { containerExtractor as extractPlutusData }; +export const getRedeemers = callMaybe("redeemers"); +export const getRedeemerTag = call("tag"); +export const getRedeemerIndex = call("index"); +export { containerExtractor as extractRedeemers }; +export const getRedeemerTagKind = call("kind"); +export const getRedeemerPlutusData = call("data"); +export const getExUnits = call("ex_units"); +export const getExUnitsMem = call("mem"); +export const getExUnitsSteps = call("steps"); diff --git a/src/Internal/Deserialization/WitnessSet.purs b/src/Internal/Deserialization/WitnessSet.purs index d713fdaf3..f4783aa40 100644 --- a/src/Internal/Deserialization/WitnessSet.purs +++ b/src/Internal/Deserialization/WitnessSet.purs @@ -52,26 +52,30 @@ import Ctl.Internal.Types.ByteArray (ByteArray) import Ctl.Internal.Types.PlutusData (PlutusData) as T import Ctl.Internal.Types.RedeemerTag as Tag import Ctl.Internal.Types.Scripts (PlutusScript(PlutusScript)) as S -import Data.Maybe (Maybe(Just, Nothing)) -import Data.Traversable (for, traverse) +import Data.Maybe (Maybe) import Data.Tuple (curry) import Data.Tuple.Nested ((/\)) +import Effect.Exception (throw) +import Effect.Unsafe (unsafePerformEffect) -convertWitnessSet :: TransactionWitnessSet -> Maybe T.TransactionWitnessSet -convertWitnessSet ws = do +convertWitnessSet :: TransactionWitnessSet -> T.TransactionWitnessSet +convertWitnessSet ws = let + vkeys = getVkeywitnesses maybeFfiHelper ws <#> convertVkeyWitnesses nativeScripts = getNativeScripts maybeFfiHelper ws <#> convertNativeScripts + bootstraps = getBootstraps maybeFfiHelper ws <#> convertBootstraps plutusScripts = getPlutusScripts maybeFfiHelper ws <#> convertPlutusScripts plutusData = getWitnessSetPlutusData maybeFfiHelper ws <#> convertPlutusList - redeemers <- for (getRedeemers maybeFfiHelper ws) convertRedeemers - pure $ T.TransactionWitnessSet - { vkeys: getVkeywitnesses maybeFfiHelper ws <#> convertVkeyWitnesses - , nativeScripts - , bootstraps: getBootstraps maybeFfiHelper ws <#> convertBootstraps - , plutusScripts - , plutusData - , redeemers - } + redeemers = getRedeemers maybeFfiHelper ws <#> convertRedeemers + in + T.TransactionWitnessSet + { vkeys + , nativeScripts + , bootstraps + , plutusScripts + , plutusData + , redeemers + } convertVkeyWitnesses :: Vkeywitnesses -> Array T.Vkeywitness convertVkeyWitnesses = extractWitnesses >>> map convertVkeyWitness @@ -113,30 +117,31 @@ convertPlutusScript plutusScript = do convertPlutusList :: PlutusList -> Array T.PlutusData convertPlutusList = extractPlutusData >>> map convertPlutusData -convertRedeemers :: Redeemers -> Maybe (Array T.Redeemer) -convertRedeemers = extractRedeemers >>> traverse convertRedeemer +convertRedeemers :: Redeemers -> Array T.Redeemer +convertRedeemers = extractRedeemers >>> map convertRedeemer -convertRedeemer :: Redeemer -> Maybe T.Redeemer -convertRedeemer redeemer = do - tag <- convertRedeemerTag $ getRedeemerTag redeemer +convertRedeemer :: Redeemer -> T.Redeemer +convertRedeemer redeemer = let + tag = convertRedeemerTag $ getRedeemerTag redeemer index = BigNum.toBigInt $ getRedeemerIndex redeemer exUnits = convertExUnits $ getExUnits redeemer data_ = convertPlutusData $ getRedeemerPlutusData redeemer - pure $ T.Redeemer - { tag - , index - , data: data_ - , exUnits - } - -convertRedeemerTag :: RedeemerTag -> Maybe Tag.RedeemerTag + in + T.Redeemer + { tag + , index + , data: data_ + , exUnits + } + +convertRedeemerTag :: RedeemerTag -> Tag.RedeemerTag convertRedeemerTag tag = case getRedeemerTagKind tag of - 0 -> Just Tag.Spend - 1 -> Just Tag.Mint - 2 -> Just Tag.Cert - 3 -> Just Tag.Reward - _ -> Nothing + 0 -> Tag.Spend + 1 -> Tag.Mint + 2 -> Tag.Cert + 3 -> Tag.Reward + _ -> unsafePerformEffect $ throw "convertRedeemerTag: impossible happened" convertExUnits :: ExUnits -> T.ExUnits convertExUnits eu = diff --git a/src/Internal/Equipartition.purs b/src/Internal/Equipartition.purs index 9e22c8053..f78c0c389 100644 --- a/src/Internal/Equipartition.purs +++ b/src/Internal/Equipartition.purs @@ -8,9 +8,9 @@ import Prelude import Data.Array (replicate) import Data.Array.NonEmpty (NonEmptyArray) import Data.Array.NonEmpty (appendArray, replicate, singleton) as NEArray -import Data.BigInt (BigInt) -import Data.BigInt (fromInt, toInt) as BigInt import Data.Maybe (fromJust) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt, toInt) as BigInt import Partial.Unsafe (unsafePartial) -- | Represents types whose values can be equally divided into several parts. diff --git a/src/Internal/FfiHelpers.js b/src/Internal/FfiHelpers.js index 457e224b5..dadcaab78 100644 --- a/src/Internal/FfiHelpers.js +++ b/src/Internal/FfiHelpers.js @@ -11,34 +11,36 @@ const unpack = obj => { const unpackFromProperty = prop => obj => unpack(obj[prop]()); -exports._containerHelper = r => ({ - unpack, - unpackFromProperty, - // unpacks an associative container where keys are stored in .keys() - // and values for that keys might be missing. - unpackKeyIndexed: obj => { - const res = []; - for (let i = 0; i < obj.len(); i++) { - let k = obj.keys().get(i); - let v = obj.get(k); - if (v == null) continue; - res.push(r.tuple(k)(v)); +export function _containerHelper(r) { + return { + unpack, + unpackFromProperty, + // unpacks an associative container where keys are stored in .keys() + // and values for that keys might be missing. + unpackKeyIndexed: obj => { + const res = []; + for (let i = 0; i < obj.len(); i++) { + let k = obj.keys().get(i); + let v = obj.get(k); + if (v == null) continue; + res.push(r.tuple(k)(v)); + } + return res; + }, + // Abstracts away packing array of something into a monomorphic container. + pack: (container, elements) => { + const res = container.new(); + elements.forEach(elem => res.add(elem)); + return res; + }, + // Abstracts away packing a list of KV-pairs into a map-like structure. + packMap: (container, entries) => { + const res = container.new(); + entries.forEach(entry => { + const [key, value] = r.untuple(entry); + res.insert(key, value); + }); + return res; } - return res; - }, - // Abstracts away packing array of something into a monomorphic container. - pack: (container, elements) => { - const res = container.new(); - elements.forEach(elem => res.add(elem)); - return res; - }, - // Abstracts away packing a list of KV-pairs into a map-like structure. - packMap: (container, entries) => { - const res = container.new(); - entries.forEach(entry => { - const [key, value] = r.untuple(entry); - res.insert(key, value); - }); - return res; - }, -}); + }; +} diff --git a/src/Internal/FromData.purs b/src/Internal/FromData.purs index 6098b6356..fa4d284e2 100644 --- a/src/Internal/FromData.purs +++ b/src/Internal/FromData.purs @@ -41,7 +41,6 @@ import Ctl.Internal.Types.RawBytes (RawBytes) import Data.Array (uncons) import Data.Array as Array import Data.ArrayBuffer.Types (Uint8Array) -import Data.BigInt (BigInt) import Data.Either (Either(Left, Right), hush, note) import Data.Generic.Rep as G import Data.List (List) @@ -56,6 +55,7 @@ import Data.Traversable (traverse) import Data.Tuple (Tuple(Tuple)) import Data.UInt (UInt) import Data.Unfoldable (class Unfoldable) +import JS.BigInt (BigInt) import Noble.Secp256k1.ECDSA ( ECDSASignature , MessageHash diff --git a/src/Internal/Hashing.js b/src/Internal/Hashing.js index 0d9f2065d..0b647d6da 100644 --- a/src/Internal/Hashing.js +++ b/src/Internal/Hashing.js @@ -1,38 +1,40 @@ /* global BROWSER_RUNTIME */ -const Blake2 = require("blakejs"); -const SHA256 = require("jssha/dist/sha256"); -const SHA3 = require("jssha/dist/sha3"); +import Blake2 from "blakejs"; + +import SHA256 from "jssha/sha256"; +import SHA3 from "jssha/sha3"; let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.blake2b224Hash = bytesToHash => { +export function blake2b224Hash(bytesToHash) { return Blake2.blake2b(bytesToHash, null, 28); -}; +} -exports.blake2b224HashHex = bytesToHash => { +export function blake2b224HashHex(bytesToHash) { return Blake2.blake2bHex(bytesToHash, null, 28); -}; +} -exports.blake2b256Hash = bytesToHash => { +export function blake2b256Hash(bytesToHash) { return Blake2.blake2b(bytesToHash, null, 32); -}; +} -exports.blake2b256HashHex = bytesToHash => { +export function blake2b256HashHex(bytesToHash) { return Blake2.blake2bHex(bytesToHash, null, 32); -}; +} -exports.hashPlutusData = plutusData => { +export function hashPlutusData(plutusData) { return lib.hash_plutus_data(plutusData); -}; +} -exports.hashPlutusScript = script => script.hash(); +export function hashPlutusScript(script) { + return script.hash(); +} const SHA256_HASH_VARIANT = "SHA-256"; const SHA3_256_HASH_VARIANT = "SHA3-256"; @@ -40,26 +42,26 @@ const SHA3_256_HASH_VARIANT = "SHA3-256"; const UINT8ARRAY_FORMAT = "UINT8ARRAY"; const HEX_FORMAT = "HEX"; -exports.sha256Hash = bytesToHash => { +export function sha256Hash(bytesToHash) { const shaObj = new SHA256(SHA256_HASH_VARIANT, UINT8ARRAY_FORMAT); shaObj.update(bytesToHash); return shaObj.getHash(UINT8ARRAY_FORMAT); -}; +} -exports.sha256HashHex = bytesToHash => { +export function sha256HashHex(bytesToHash) { const shaObj = new SHA256(SHA256_HASH_VARIANT, UINT8ARRAY_FORMAT); shaObj.update(bytesToHash); return shaObj.getHash(HEX_FORMAT); -}; +} -exports.sha3_256Hash = bytesToHash => { +export function sha3_256Hash(bytesToHash) { const shaObj = new SHA3(SHA3_256_HASH_VARIANT, UINT8ARRAY_FORMAT); shaObj.update(bytesToHash); return shaObj.getHash(UINT8ARRAY_FORMAT); -}; +} -exports.sha3_256HashHex = bytesToHash => { +export function sha3_256HashHex(bytesToHash) { const shaObj = new SHA3(SHA3_256_HASH_VARIANT, UINT8ARRAY_FORMAT); shaObj.update(bytesToHash); return shaObj.getHash(HEX_FORMAT); -}; +} diff --git a/src/Internal/Hashing.purs b/src/Internal/Hashing.purs index c1542e3ea..2d75443a1 100644 --- a/src/Internal/Hashing.purs +++ b/src/Internal/Hashing.purs @@ -4,14 +4,15 @@ module Ctl.Internal.Hashing , blake2b256Hash , blake2b256HashHex , datumHash + , hashPlutusData , md5HashHex , plutusScriptHash + , scriptRefHash , sha256Hash , sha256HashHex , sha3_256Hash , sha3_256HashHex , transactionHash - , scriptRefHash ) where import Prelude diff --git a/src/Internal/Helpers.purs b/src/Internal/Helpers.purs index 63e1f00ad..6b7383655 100644 --- a/src/Internal/Helpers.purs +++ b/src/Internal/Helpers.purs @@ -9,6 +9,7 @@ module Ctl.Internal.Helpers , appendMap , appendRightMap , bigIntToUInt + , bugTrackerLink , concatPaths , contentsProp , encodeMap @@ -31,16 +32,16 @@ module Ctl.Internal.Helpers , showWithParens , tagProp , uIntToBigInt + , pprintTagSet ) where import Prelude import Aeson (class EncodeAeson, Aeson, encodeAeson, toString) import Control.Monad.Error.Class (class MonadError, throwError) +import Ctl.Internal.Helpers.Formatter (showTags) import Data.Array (union) import Data.Bifunctor (bimap) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Bitraversable (ltraverse) import Data.Either (Either(Right), either) import Data.Function (on) @@ -49,6 +50,7 @@ import Data.List.Lazy as LL import Data.Log.Formatter.Pretty (prettyFormatter) import Data.Log.Level (LogLevel) import Data.Log.Message (Message) +import Data.Log.Tag (TagSet) import Data.Map (Map, toUnfoldable) import Data.Map as Map import Data.Maybe (Maybe(Just, Nothing), fromJust, fromMaybe, maybe) @@ -66,9 +68,19 @@ import Effect.Class (class MonadEffect) import Effect.Class.Console (log) import Effect.Exception (throw) import Foreign.Object as Obj +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Partial.Unsafe (unsafePartial) import Prim.TypeError (class Warn, Text) +bugTrackerLink :: String +bugTrackerLink = + "https://github.com/Plutonomicon/cardano-transaction-lib/issues" + +pprintTagSet :: String -> TagSet -> String +pprintTagSet message tags = + message <> " " <> showTags tags + -- | Throws provided error on `Nothing` fromJustEff :: forall (a :: Type). String -> Maybe a -> Effect a fromJustEff e = case _ of diff --git a/src/Internal/Helpers/Formatter.purs b/src/Internal/Helpers/Formatter.purs new file mode 100644 index 000000000..27ad19ca2 --- /dev/null +++ b/src/Internal/Helpers/Formatter.purs @@ -0,0 +1,68 @@ +-- | Copy of Data.Log.Formatter, but with `showTags` exported and with +-- | MonadEffect use removed (it was only used to format JSDate, the +-- | side-effects of this operation is something we can ignore) +module Ctl.Internal.Helpers.Formatter + ( showTags + ) where + +import Prelude + +import Ansi.Codes (Color(Yellow)) +import Ansi.Output (bold, foreground, withGraphics) +import Data.Array (concat, cons, singleton) +import Data.JSDate (JSDate, toISOString) +import Data.Log.Tag + ( Tag(StringTag, NumberTag, IntTag, BooleanTag, JSDateTag, TagSetTag) + , TagSet + ) +import Data.Map (isEmpty, toUnfoldable) +import Data.Maybe (Maybe(Nothing, Just), fromMaybe) +import Data.String (joinWith) +import Data.Tuple (Tuple(Tuple)) +import Effect.Unsafe (unsafePerformEffect) + +showTags :: TagSet -> String +showTags = tagLines >>> case _ of + Nothing -> "" + Just lines -> append "\n" (joinWith "\n" lines) + +tagLines :: TagSet -> Maybe (Array String) +tagLines tags + | isEmpty tags = Nothing + | otherwise = Just $ indentEachLine <$> concat (lineify tags) + +lineify :: TagSet -> Array (Array String) +lineify tags = showField <$> toUnfoldable tags + +showField :: Tuple String Tag -> Array String +showField (Tuple name value) = showTag value $ bold' name <> bold' ": " + +showTag :: Tag -> String -> Array String +showTag (StringTag value) = showBasic value +showTag (IntTag value) = showSpecial $ show value +showTag (NumberTag value) = showSpecial $ show value +showTag (BooleanTag value) = showSpecial $ show value +showTag (TagSetTag value) = showSubTags value +showTag (JSDateTag value) = showJsDate value + +showSubTags :: TagSet -> String -> Array String +showSubTags value label = cons label $ fromMaybe [] (tagLines value) + +showJsDate :: JSDate -> String -> Array String +showJsDate value label = + showSpecial (unsafePerformEffect (toISOString value)) label + +showBasic :: String -> String -> Array String +showBasic value label = singleton $ label <> value + +showSpecial :: String -> String -> Array String +showSpecial = color Yellow >>> showBasic + +indentEachLine :: String -> String +indentEachLine = append " " + +color :: Color -> String -> String +color = foreground >>> withGraphics + +bold' :: String -> String +bold' = withGraphics bold diff --git a/src/Internal/JsWebSocket.js b/src/Internal/JsWebSocket.js index 433e08eca..f48f4465c 100644 --- a/src/Internal/JsWebSocket.js +++ b/src/Internal/JsWebSocket.js @@ -1,10 +1,11 @@ /* global BROWSER_RUNTIME */ -const ReconnectingWebSocket = require("reconnecting-websocket"); +import ReconnectingWebSocket from "reconnecting-websocket"; let OurWebSocket; if (typeof BROWSER_RUNTIME == "undefined" || !BROWSER_RUNTIME) { - OurWebSocket = require("ws"); + const { default: WebSocket } = await import("ws"); + OurWebSocket = WebSocket; } else { OurWebSocket = WebSocket; } @@ -17,78 +18,105 @@ class NoPerMessageDeflateWebSocket extends OurWebSocket { } } -exports._mkWebSocket = logger => url => () => { - try { - let ws; - if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - ws = new ReconnectingWebSocket.default(url); - } else { - ws = new ReconnectingWebSocket(url, [], { - WebSocket: NoPerMessageDeflateWebSocket, - }); +export function _mkWebSocket(logger) { + return url => () => { + try { + let ws; + if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { + ws = new ReconnectingWebSocket(url); + } else { + ws = new ReconnectingWebSocket(url, [], { + WebSocket: NoPerMessageDeflateWebSocket + }); + } + ws.finalizers = []; + logger("Created a new WebSocket")(); + return ws; + } catch (e) { + logger("Failed to create a new WebSocket"); + throw e; } - ws.finalizers = []; - logger("Created a new WebSocket")(); - return ws; - } catch (e) { - logger("Failed to create a new WebSocket"); - throw e; - } -}; + }; +} -exports._onWsConnect = ws => fn => () => { - ws.addEventListener("open", fn); - ws.finalizers.push(() => { - ws.removeEventListener("open", fn); - }); -}; +export function _onWsConnect(ws) { + return fn => () => { + ws.addEventListener("open", fn); + ws.finalizers.push(() => { + ws.removeEventListener("open", fn); + }); + }; +} -exports._onWsError = ws => fn => () => { - const listener = function (event) { - fn(event.toString())(); +export function _onWsError(ws) { + return fn => () => { + const listener = function (event) { + if ( + "message" in event && + typeof event.message === "string" && + event.message.length > 0 + ) { + fn(event.message)(); + } else if ("error" in event && event.error instanceof Error) { + fn(event.error.toString())(); + } else { + fn(event.toString())(); + } + }; + ws.addEventListener("error", listener); + ws.finalizers.push(() => { + ws.removeEventListener("error", listener); + }); + return listener; }; - ws.addEventListener("error", listener); - ws.finalizers.push(() => { - ws.removeEventListener("error", listener); - }); - return listener; -}; +} -exports._removeOnWsError = ws => listener => () => - ws.removeEventListener("error", listener); +export function _removeOnWsError(ws) { + return listener => () => ws.removeEventListener("error", listener); +} -exports._onWsMessage = ws => logger => fn => () => { - const listener = function func(event) { - const str = event.data; - logger(`message: ${str}`)(); - fn(str)(); +export function _onWsMessage(ws) { + return logger => fn => () => { + const listener = function func(event) { + const str = event.data; + logger(`message: ${str}`)(); + fn(str)(); + }; + ws.addEventListener("message", listener); + ws.finalizers.push(() => { + ws.removeEventListener("message", listener); + }); }; - ws.addEventListener("message", listener); - ws.finalizers.push(() => { - ws.removeEventListener("message", listener); - }); -}; +} -exports._wsFinalize = ws => () => { - for (let finalizer of ws.finalizers) { - /* eslint-disable no-empty */ - try { - finalizer(); - } catch (_) {} - /* eslint-enable */ - } - ws.finalizers = []; -}; +export function _wsFinalize(ws) { + return () => { + for (let finalizer of ws.finalizers) { + /* eslint-disable no-empty */ + try { + finalizer(); + } catch (_) {} + /* eslint-enable */ + } + ws.finalizers = []; + }; +} -exports._wsSend = ws => logger => str => () => { - logger(`sending: ${str}`)(); - ws.send(str); -}; +export function _wsSend(ws) { + return logger => str => () => { + logger(`sending: ${str}`)(); + ws.send(str); + }; +} -exports._wsReconnect = ws => () => { - ws.reconnect(); -}; +export function _wsReconnect(ws) { + return () => { + ws.reconnect(); + }; +} -exports._wsClose = ws => () => { - ws.close(); -}; +export function _wsClose(ws) { + return () => { + ws.close(); + }; +} diff --git a/src/Internal/Metadata/Cip25/Common.purs b/src/Internal/Metadata/Cip25/Common.purs index 92d4cc29c..09b1c5eeb 100644 --- a/src/Internal/Metadata/Cip25/Common.purs +++ b/src/Internal/Metadata/Cip25/Common.purs @@ -36,13 +36,13 @@ import Ctl.Internal.Metadata.ToMetadata (class ToMetadata, toMetadata) import Ctl.Internal.Plutus.Types.AssocMap as AssocMap import Ctl.Internal.ToData (class ToData, toData) import Ctl.Internal.Types.TokenName (TokenName, getTokenName, mkTokenName) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Either (note) import Data.Generic.Rep (class Generic) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Show.Generic (genericShow) import Data.Tuple.Nested ((/\)) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt nftMetadataLabel :: BigInt nftMetadataLabel = BigInt.fromInt 721 diff --git a/src/Internal/Metadata/Cip25/V2.purs b/src/Internal/Metadata/Cip25/V2.purs index 81f136491..7cdeefbbd 100644 --- a/src/Internal/Metadata/Cip25/V2.purs +++ b/src/Internal/Metadata/Cip25/V2.purs @@ -64,7 +64,6 @@ import Ctl.Internal.Types.TransactionMetadata import Data.Array (catMaybes, concat, groupBy) import Data.Array.NonEmpty (NonEmptyArray, toArray) import Data.Array.NonEmpty (head) as NonEmpty -import Data.BigInt (fromInt, toString) as BigInt import Data.Either (Either(Left), note) import Data.Function (on) import Data.Generic.Rep (class Generic) @@ -77,6 +76,7 @@ import Data.Traversable (fold, for, sequence, traverse) import Data.Tuple (Tuple) import Data.Tuple.Nested ((/\)) import Foreign.Object (Object, toUnfoldable) as FO +import JS.BigInt (fromInt, toString) as BigInt import Partial.Unsafe (unsafePartial) -- | ``` diff --git a/src/Internal/Metadata/FromMetadata.purs b/src/Internal/Metadata/FromMetadata.purs index 050215939..6f115b1e8 100644 --- a/src/Internal/Metadata/FromMetadata.purs +++ b/src/Internal/Metadata/FromMetadata.purs @@ -8,11 +8,11 @@ import Ctl.Internal.Types.TransactionMetadata ( TransactionMetadatum(MetadataList, Int, Bytes, Text) ) import Data.Array (toUnfoldable, uncons) as Array -import Data.BigInt (BigInt) import Data.Maybe (Maybe(Just, Nothing)) import Data.NonEmpty (NonEmpty, (:|)) import Data.Traversable (traverse) import Data.Unfoldable (class Unfoldable) +import JS.BigInt (BigInt) -------------------------------------------------------------------------------- -- FromMetadata diff --git a/src/Internal/Metadata/ToMetadata.purs b/src/Internal/Metadata/ToMetadata.purs index bb1db286e..b8dd0bf33 100644 --- a/src/Internal/Metadata/ToMetadata.purs +++ b/src/Internal/Metadata/ToMetadata.purs @@ -10,15 +10,12 @@ import Ctl.Internal.Types.Int (Int, fromBigInt) as Int import Ctl.Internal.Types.TransactionMetadata ( TransactionMetadatum(MetadataMap, MetadataList, Int, Bytes, Text) ) -import Data.Array (fromFoldable) as Array -import Data.BigInt (BigInt) -import Data.Foldable (class Foldable) import Data.Map (Map) import Data.Map (fromFoldable, toUnfoldable) as Map import Data.Maybe (fromJust) -import Data.NonEmpty (NonEmpty) import Data.Profunctor.Strong ((***)) import Data.Tuple (Tuple) +import JS.BigInt (BigInt) import Partial.Unsafe (unsafePartial) -------------------------------------------------------------------------------- @@ -49,9 +46,6 @@ instance else instance ToMetadata a => ToMetadata (Array a) where toMetadata = MetadataList <<< map toMetadata -instance (Foldable f, ToMetadata a) => ToMetadata (NonEmpty f a) where - toMetadata = toMetadata <<< Array.fromFoldable - instance ToMetadata Int.Int where toMetadata = Int diff --git a/src/Internal/Partition.purs b/src/Internal/Partition.purs index 134b8ca9f..16c4ad80e 100644 --- a/src/Internal/Partition.purs +++ b/src/Internal/Partition.purs @@ -19,8 +19,6 @@ import Data.Array.NonEmpty , zip , zipWith ) as NEArray -import Data.BigInt (BigInt) -import Data.BigInt (fromInt, toInt) as BigInt import Data.Foldable (any, length, sum) import Data.Function (on) import Data.Maybe (Maybe(Just, Nothing), fromJust) @@ -28,6 +26,8 @@ import Data.Newtype (class Newtype, unwrap) import Data.Ordering (invert) as Ordering import Data.Tuple (fst, snd) import Data.Tuple.Nested (type (/\), (/\)) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt, toInt) as BigInt import Partial.Unsafe (unsafePartial) class Partition (a :: Type) where diff --git a/src/Internal/Plutip/PortCheck.js b/src/Internal/Plutip/PortCheck.js index b9440791b..dedb2434a 100644 --- a/src/Internal/Plutip/PortCheck.js +++ b/src/Internal/Plutip/PortCheck.js @@ -1,24 +1,26 @@ -const net = require("net"); +import net from "net"; -exports._isPortAvailable = port => () => - new Promise((resolve, reject) => { - const server = net - .createServer() - .once("error", function (err) { - if (err.code == "EADDRINUSE") { - resolve(false); - } else { - reject( - "Failed check for port availability (port: " + - port + - ", error: " + - err.code + - ")" - ); - } - }) - .once("listening", () => { - server.once("close", () => resolve(true)).close(); - }) - .listen(port); - }); +export function _isPortAvailable(port) { + return () => + new Promise((resolve, reject) => { + const server = net + .createServer() + .once("error", function (err) { + if (err.code == "EADDRINUSE") { + resolve(false); + } else { + reject( + "Failed check for port availability (port: " + + port + + ", error: " + + err.code + + ")" + ); + } + }) + .once("listening", () => { + server.once("close", () => resolve(true)).close(); + }) + .listen(port); + }); +} diff --git a/src/Internal/Plutip/Server.purs b/src/Internal/Plutip/Server.purs index 810314c64..b31118b3f 100644 --- a/src/Internal/Plutip/Server.purs +++ b/src/Internal/Plutip/Server.purs @@ -12,20 +12,24 @@ module Ctl.Internal.Plutip.Server import Prelude import Aeson (decodeAeson, encodeAeson, parseJsonStringToAeson, stringifyAeson) -import Affjax as Affjax +import Affjax (defaultRequest) as Affjax import Affjax.RequestBody as RequestBody import Affjax.RequestHeader as Header import Affjax.ResponseFormat as Affjax.ResponseFormat import Contract.Address (NetworkId(MainnetId)) +import Contract.Chain (waitNSlots) +import Contract.Config (defaultSynchronizationParams, defaultTimeParams) import Contract.Monad (Contract, ContractEnv, liftContractM, runContractInEnv) -import Control.Monad.Error.Class (liftEither) +import Control.Monad.Error.Class (liftEither, throwError) import Control.Monad.State (State, execState, modify_) import Control.Monad.Trans.Class (lift) import Control.Monad.Writer (censor, execWriterT, tell) +import Ctl.Internal.Affjax (request) as Affjax import Ctl.Internal.Contract.Hooks (emptyHooks) import Ctl.Internal.Contract.Monad ( buildBackend , getLedgerConstants + , mkQueryHandle , stopContractEnv ) import Ctl.Internal.Contract.QueryBackend (mkCtlBackendParams) @@ -54,6 +58,7 @@ import Ctl.Internal.Plutip.Types import Ctl.Internal.Plutip.Utils (tmpdir) import Ctl.Internal.Service.Error ( ClientError(ClientDecodeJsonError, ClientHttpError) + , pprintClientError ) import Ctl.Internal.Test.ContractTest ( ContractTest(ContractTest) @@ -74,14 +79,14 @@ import Ctl.Internal.Types.UsedTxOuts (newUsedTxOuts) import Ctl.Internal.Wallet.Key (PrivatePaymentKey(PrivatePaymentKey)) import Data.Array as Array import Data.Bifunctor (lmap) -import Data.BigInt as BigInt -import Data.Either (Either(Left), either, isLeft) +import Data.Either (Either(Left, Right), either, isLeft) import Data.Foldable (sum) import Data.HTTP.Method as Method import Data.Log.Level (LogLevel) import Data.Log.Message (Message) -import Data.Maybe (Maybe(Nothing, Just), maybe) +import Data.Maybe (Maybe(Nothing, Just), fromMaybe, maybe) import Data.Newtype (over, unwrap, wrap) +import Data.Set as Set import Data.String.CodeUnits (indexOf) as String import Data.String.Pattern (Pattern(Pattern)) import Data.Traversable (foldMap, for, for_, sequence_, traverse_) @@ -99,9 +104,10 @@ import Effect.Aff.Retry , recovering ) import Effect.Class (liftEffect) -import Effect.Exception (error, throw) +import Effect.Exception (error, message, throw) import Effect.Ref (Ref) import Effect.Ref as Ref +import JS.BigInt as BigInt import Mote (bracket) as Mote import Mote.Description (Description(Group, Test)) import Mote.Monad (MoteT(MoteT), mapTest) @@ -139,20 +145,24 @@ withPlutipContractEnv plutipCfg distr cont = do $ liftEither >=> \{ env, wallets, printLogs } -> whenError printLogs (cont env wallets) --- | Run `Contract`s in tests in a single Plutip instance. --- | NOTE: This uses `MoteT`s bracketting, and thus has the same caveats. --- | Namely, brackets are run for each of the following groups and tests. --- | If you wish to only set up Plutip once, ensure all tests are wrapped --- | in a single group. +-- | Run several `Contract`s in tests in a (single) Plutip environment (plutip-server and cluster, kupo, etc.). +-- | NOTE: This uses `MoteT`s bracketing, and thus has the same caveats. +-- | Namely, brackets are run for each of the top-level groups and tests +-- | inside the bracket. +-- | If you wish to only set up Plutip once, ensure all tests that are passed +-- | to `testPlutipContracts` are wrapped in a single group. -- | https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/plutip-testing.md#testing-with-mote testPlutipContracts :: PlutipConfig -> TestPlanM ContractTest Unit -> TestPlanM (Aff Unit) Unit testPlutipContracts plutipCfg tp = do + -- Modify tests to pluck out parts of a single combined distribution ContractTestPlan runContractTestPlan <- lift $ execDistribution tp runContractTestPlan \distr tests -> do cleanupRef <- liftEffect $ Ref.new mempty + -- Sets a single Mote bracket at the top level, it will be run for all + -- immediate tests and groups bracket (startPlutipContractEnv plutipCfg distr cleanupRef) (runCleanup cleanupRef) $ flip mapTest tests \test { env, wallets, printLogs, clearLogs } -> do @@ -191,13 +201,19 @@ whenError whenErrorAction action = do when (isLeft res) whenErrorAction liftEither res --- | Lifts the utxo distributions of each test out of Mote, into a combined +-- | Lifts the UTxO distributions of each test out of Mote, into a combined -- | distribution. Adapts the tests to pick their distribution out of the -- | combined distribution. -- | NOTE: Skipped tests still have their distribution generated. +-- | This is the current method of constructing all the wallets with required distributions +-- | in one go during Plutip startup. execDistribution :: TestPlanM ContractTest Unit -> Aff ContractTestPlan execDistribution (MoteT mote) = execWriterT mote <#> go where + -- Recursively go over the tree of test `Description`s and construct a `ContractTestPlan` callback. + -- When run the `ContractTestPlan` will reconstruct the whole `MoteT` value passed to `execDistribution` + -- via similar writer effects (plus combining distributions) which append test descriptions + -- or wrap them in a group. go :: Array (Description Aff ContractTest) -> ContractTestPlan go = flip execState emptyContractTestPlan <<< traverse_ case _ of Test rm { bracket, label, value: ContractTest runTest } -> @@ -211,6 +227,16 @@ execDistribution (MoteT mote) = execWriterT mote <#> go (censor (pure <<< Group rm <<< { bracket, label, value: _ })) tests + -- This function is used by `go` for iteratively adding Mote tests (internally Writer monad actions) + -- to the `ContractTestPlan` in the State monad _and_ for combining UTxO distributions used by tests. + -- Given a distribution and tests (a MoteT value) this runs a `ContractTestPlan`, i.e. passes its + -- stored distribution and tests to our handler, and then makes a new `ContractTestPlan`, but this time + -- storing a tuple of stored and passed distributions and also storing a pair of Mote tests, modifying + -- the previously stored tests to use the first distribution, and the passed tests the second distribution + -- + -- `go` starts at the top of the test tree and step-by-step constructs a big `ContractTestPlan` which + -- stores distributions of all inner tests tupled together and tests from the original test tree, which + -- know how to get their distribution out of the big tuple. addTests :: forall (distr :: Type) (wallets :: Type) . ContractTestPlanHandler distr wallets (State ContractTestPlan Unit) @@ -220,6 +246,9 @@ execDistribution (MoteT mote) = execWriterT mote <#> go mapTest (_ <<< fst) tests' mapTest (_ <<< snd) tests + -- Start with an empty plan, which passes an empty distribution + -- and an empty array of test `Description`s to the function that + -- will run tests. emptyContractTestPlan :: ContractTestPlan emptyContractTestPlan = ContractTestPlan \h -> h unit (pure unit) @@ -244,10 +273,11 @@ startPlutipContractEnv } startPlutipContractEnv plutipCfg distr cleanupRef = do configCheck plutipCfg - startPlutipServer' - ourKey /\ response <- startPlutipCluster' - startOgmios' response - startKupo' response + tryWithReport startPlutipServer' "Could not start Plutip server" + (ourKey /\ response) <- tryWithReport startPlutipCluster' + "Could not start Plutip cluster" + tryWithReport (startOgmios' response) "Could not start Ogmios" + tryWithReport (startKupo' response) "Could not start Kupo" { env, printLogs, clearLogs } <- mkContractEnv' wallets <- mkWallets' env ourKey response pure @@ -257,6 +287,17 @@ startPlutipContractEnv plutipCfg distr cleanupRef = do , clearLogs } where + tryWithReport + :: forall (a :: Type) + . Aff a + -> String + -> Aff a + tryWithReport what prefix = do + result <- try what + case result of + Left err -> throwError $ error $ prefix <> ": " <> message err + Right result' -> pure result' + -- Similar to `Aff.bracket`, except cleanup is pushed onto a stack to be run -- later. bracket @@ -321,6 +362,7 @@ startPlutipContractEnv plutipCfg distr cleanupRef = do "Impossible happened: could not decode wallets. Please report as bug" $ decodeWallets distr (unwrap <$> response.privateKeys) let walletsArray = keyWallets (Proxy :: Proxy distr) wallets + void $ waitNSlots one transferFundsFromEnterpriseToBase ourKey walletsArray pure wallets @@ -338,7 +380,12 @@ startPlutipContractEnv plutipCfg distr cleanupRef = do let configLogger = Just $ map liftEffect <<< addLogEntry - bracket (mkClusterContractEnv plutipCfg suppressedLogger configLogger) + bracket + ( mkClusterContractEnv + plutipCfg { customLogger = configLogger } + suppressedLogger + configLogger + ) stopContractEnv \env -> pure { env @@ -381,10 +428,10 @@ configCheck cfg = do "- " <> service <> " (port: " <> show (UInt.toInt port) <> ")\n" -- | Start the plutip cluster, initializing the state with the given --- | utxo distribution. Also initializes an extra payment key (aka --- | `ourKey`) with some utxos for use with further plutip +-- | UTxO distribution. Also initializes an extra payment key (aka +-- | `ourKey`) with some UTxOs for use with further plutip -- | setup. `ourKey` has funds proportional to the total amount of the --- | utxos in the passed distribution, so it can be used to handle +-- | UTxOs in the passed distribution, so it can be used to handle -- | transaction fees. startPlutipCluster :: PlutipConfig @@ -393,9 +440,9 @@ startPlutipCluster startPlutipCluster cfg keysToGenerate = do let url = mkServerEndpointUrl cfg "start" - -- TODO epoch size cannot currently be changed due to - -- https://github.com/mlabs-haskell/plutip/issues/149 - epochSize = UInt.fromInt 80 + -- TODO: Non-default values for `slotLength` and `epochSize` break staking + -- rewards, see https://github.com/mlabs-haskell/plutip/issues/149 + epochSize = fromMaybe (UInt.fromInt 80) cfg.clusterConfig.epochSize res <- do response <- liftAff ( Affjax.request @@ -406,8 +453,10 @@ startPlutipCluster cfg keysToGenerate = do $ encodeAeson $ ClusterStartupRequest { keysToGenerate - , slotLength: cfg.clusterConfig.slotLength , epochSize + , slotLength: cfg.clusterConfig.slotLength + , maxTxSize: cfg.clusterConfig.maxTxSize + , raiseExUnitsToMax: cfg.clusterConfig.raiseExUnitsToMax } , responseFormat = Affjax.ResponseFormat.string , headers = [ Header.ContentType (wrap "application/json") ] @@ -419,7 +468,7 @@ startPlutipCluster cfg keysToGenerate = do (Left <<< ClientHttpError) \{ body } -> lmap (ClientDecodeJsonError body) $ (decodeAeson <=< parseJsonStringToAeson) body - either (liftEffect <<< throw <<< show) pure res >>= + either (liftEffect <<< throw <<< pprintClientError) pure res >>= case _ of ClusterStartupFailure reason -> do liftEffect $ throw $ @@ -432,16 +481,16 @@ startPlutipCluster cfg keysToGenerate = do Just { head: PrivateKeyResponse ourKey, tail } -> pure $ PrivatePaymentKey ourKey /\ response { privateKeys = tail } --- | Calculate the initial utxos needed for `ourKey` to cover +-- | Calculate the initial UTxOs needed for `ourKey` to cover -- | transaction costs for the given initial distribution ourInitialUtxos :: InitialUTxODistribution -> InitialUTxOs ourInitialUtxos utxoDistribution = let total = Array.foldr (sum >>> add) zero utxoDistribution in - [ -- Take the total value of the utxos and add some extra on top + [ -- Take the total value of the UTxOs and add some extra on top -- of it to cover the possible transaction fees. Also make sure - -- we don't request a 0 ada utxo + -- we don't request a 0 ada UTxO total + BigInt.fromInt 1_000_000_000 ] @@ -487,6 +536,7 @@ startOgmios cfg params = do , params.nodeSocketPath , "--node-config" , params.nodeConfigPath + , "--include-transaction-cbor" ] startKupo @@ -502,6 +552,7 @@ startKupo cfg params = do workdirExists <- FSSync.exists workdir unless workdirExists (FSSync.mkdir workdir) childProcess <- spawnKupoProcess workdir + -- here we also set the SIGINT handler for the whole process sig <- liftEffect $ cleanupOnSigint workdir testClusterDir pure (childProcess /\ workdir /\ sig) where @@ -582,17 +633,22 @@ mkClusterContractEnv plutipCfg logger customLogger = do ledgerConstants <- getLedgerConstants plutipCfg { customLogger = customLogger } backend + backendKnownTxs <- liftEffect $ Ref.new Set.empty pure { backend + , handle: mkQueryHandle plutipCfg backend , networkId: MainnetId , logLevel: plutipCfg.logLevel - , walletSpec: Nothing , customLogger: customLogger , suppressLogs: plutipCfg.suppressLogs , hooks: emptyHooks , wallet: Nothing , usedTxOuts , ledgerConstants + -- timeParams have no effect when KeyWallet is used + , timeParams: defaultTimeParams + , synchronizationParams: defaultSynchronizationParams + , knownTxs: { backend: backendKnownTxs } } defaultRetryPolicy :: RetryPolicy diff --git a/src/Internal/Plutip/Spawn.js b/src/Internal/Plutip/Spawn.js index 31319b39c..93cba32e6 100644 --- a/src/Internal/Plutip/Spawn.js +++ b/src/Internal/Plutip/Spawn.js @@ -1,20 +1,26 @@ "use strict"; -exports.clearLineHandler = readline => () => { - readline.removeAllListeners("line"); -}; +export function clearLineHandler(readline) { + return () => { + readline.removeAllListeners("line"); + }; +} -const fs = require("fs"); +import fs from "fs"; -exports._rmdirSync = path => () => fs.rmdirSync(path, { recursive: true }); +export function _rmdirSync(path) { + return () => fs.rmSync(path, { recursive: true }); +} -exports.removeOnSignal = - ({ signal, callback }) => - () => { +export function removeOnSignal({ signal, callback }) { + return () => { process.removeListener(signal, callback); }; +} -exports.onSignalImpl = signal => callback => () => { - process.on(signal, callback); - return { signal, callback }; -}; +export function onSignalImpl(signal) { + return callback => () => { + process.on(signal, callback); + return { signal, callback }; + }; +} diff --git a/src/Internal/Plutip/Types.purs b/src/Internal/Plutip/Types.purs index be284cd03..d2f7ba78c 100644 --- a/src/Internal/Plutip/Types.purs +++ b/src/Internal/Plutip/Types.purs @@ -26,7 +26,7 @@ import Aeson , JsonDecodeError(TypeMismatch, UnexpectedValue) , decodeAeson , encodeAeson - , partialFiniteNumber + , finiteNumber , toStringifiedNumbersJson , (.:) ) @@ -41,10 +41,9 @@ import Data.Either (Either(Left), note) import Data.Generic.Rep (class Generic) import Data.Log.Level (LogLevel) import Data.Log.Message (Message) -import Data.Maybe (Maybe) +import Data.Maybe (Maybe, fromJust) import Data.Newtype (class Newtype) import Data.Show.Generic (genericShow) -import Data.String as String import Data.Time.Duration (Seconds(Seconds)) import Data.UInt (UInt) import Effect.Aff (Aff) @@ -64,7 +63,11 @@ type PlutipConfig = , suppressLogs :: Boolean , hooks :: Hooks , clusterConfig :: - { slotLength :: Seconds } + { slotLength :: Seconds + , epochSize :: Maybe UInt + , maxTxSize :: Maybe UInt + , raiseExUnitsToMax :: Boolean + } } type FilePath = String @@ -75,16 +78,25 @@ newtype ClusterStartupRequest = ClusterStartupRequest { keysToGenerate :: InitialUTxODistribution , epochSize :: UInt , slotLength :: Seconds + , maxTxSize :: Maybe UInt + , raiseExUnitsToMax :: Boolean } instance EncodeAeson ClusterStartupRequest where encodeAeson ( ClusterStartupRequest - { keysToGenerate, epochSize, slotLength: Seconds slotLength } + { keysToGenerate + , epochSize + , slotLength: Seconds slotLength + , maxTxSize + , raiseExUnitsToMax + } ) = encodeAeson { keysToGenerate , epochSize - , slotLength: unsafePartial partialFiniteNumber slotLength + , slotLength: unsafePartial $ fromJust $ finiteNumber slotLength + , maxTxSize + , raiseExUnitsToMax } newtype PrivateKeyResponse = PrivateKeyResponse PrivateKey @@ -98,12 +110,8 @@ instance Show PrivateKeyResponse where instance DecodeAeson PrivateKeyResponse where decodeAeson json = do cborStr <- decodeAeson json - let splitted = String.splitAt 4 cborStr - -- 5820 prefix comes from Cbor - if splitted.before == "5820" then do - cborBytes <- note err $ hexToByteArray splitted.after - PrivateKeyResponse <$> note err (privateKeyFromBytes (RawBytes cborBytes)) - else Left err + cborBytes <- note err $ hexToByteArray cborStr + PrivateKeyResponse <$> note err (privateKeyFromBytes (RawBytes cborBytes)) where err :: JsonDecodeError err = TypeMismatch "PrivateKey" diff --git a/src/Internal/Plutip/Utils.js b/src/Internal/Plutip/Utils.js index 279fd085a..ab594520c 100644 --- a/src/Internal/Plutip/Utils.js +++ b/src/Internal/Plutip/Utils.js @@ -1,3 +1,5 @@ -const os = require("os"); +import os from "os"; -exports.tmpdir = () => os.tmpdir(); +export function tmpdir() { + return os.tmpdir(); +} diff --git a/src/Internal/Plutus/Types/AssocMap.purs b/src/Internal/Plutus/Types/AssocMap.purs index 9b5bcb5f6..cb773d639 100644 --- a/src/Internal/Plutus/Types/AssocMap.purs +++ b/src/Internal/Plutus/Types/AssocMap.purs @@ -20,13 +20,20 @@ module Ctl.Internal.Plutus.Types.AssocMap import Prelude -import Aeson (class DecodeAeson, class EncodeAeson) +import Aeson + ( class DecodeAeson + , class EncodeAeson + , Aeson + , decodeAeson + , encodeAeson + ) import Ctl.Internal.FromData (class FromData, fromData) import Ctl.Internal.ToData (class ToData, toData) import Ctl.Internal.Types.PlutusData (PlutusData(Map)) as PD import Data.Array (any, deleteAt, filter, findIndex, mapMaybe, null, singleton) as Array import Data.Array ((:)) -import Data.Bifunctor (bimap) +import Data.Bifunctor (bimap, rmap) +import Data.Bitraversable (rtraverse) import Data.Foldable ( class Foldable , foldMap @@ -67,8 +74,15 @@ derive instance Generic (Map k v) _ derive instance Newtype (Map k v) _ derive newtype instance (Eq k, Eq v) => Eq (Map k v) derive newtype instance (Ord k, Ord v) => Ord (Map k v) -derive newtype instance (EncodeAeson k, EncodeAeson v) => EncodeAeson (Map k v) -derive newtype instance (DecodeAeson k, DecodeAeson v) => DecodeAeson (Map k v) + +instance (EncodeAeson k, EncodeAeson v) => EncodeAeson (Map k v) where + encodeAeson = encodeAeson <<< map (rmap encodeAeson) <<< unwrap + +instance (DecodeAeson k, DecodeAeson v) => DecodeAeson (Map k v) where + decodeAeson x = Map <$> + ( traverse (rtraverse decodeAeson) + =<< (decodeAeson x :: _ (Array (Tuple k Aeson))) + ) instance (Show k, Show v) => Show (Map k v) where show = genericShow diff --git a/src/Internal/Plutus/Types/CurrencySymbol.purs b/src/Internal/Plutus/Types/CurrencySymbol.purs index 53f970acc..3bc9af231 100644 --- a/src/Internal/Plutus/Types/CurrencySymbol.purs +++ b/src/Internal/Plutus/Types/CurrencySymbol.purs @@ -1,5 +1,5 @@ module Ctl.Internal.Plutus.Types.CurrencySymbol - ( CurrencySymbol + ( CurrencySymbol(CurrencySymbol) , adaSymbol , currencyMPSHash , getCurrencySymbol diff --git a/src/Internal/Plutus/Types/Transaction.purs b/src/Internal/Plutus/Types/Transaction.purs index ec6030739..66c4d57ff 100644 --- a/src/Internal/Plutus/Types/Transaction.purs +++ b/src/Internal/Plutus/Types/Transaction.purs @@ -6,30 +6,33 @@ module Ctl.Internal.Plutus.Types.Transaction , _datum , _output , _scriptRef + , pprintTransactionOutput ) where import Prelude -import Aeson - ( class DecodeAeson - , class EncodeAeson - ) +import Aeson (class DecodeAeson, class EncodeAeson) import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef) +import Ctl.Internal.Cardano.Types.Value (pprintValue) import Ctl.Internal.FromData (class FromData, fromData) +import Ctl.Internal.Plutus.Conversion.Value (fromPlutusValue) import Ctl.Internal.Plutus.Types.Address (Address) import Ctl.Internal.Plutus.Types.Value (Value) -import Ctl.Internal.Serialization.Hash (ScriptHash) +import Ctl.Internal.Serialization.Hash (ScriptHash, scriptHashToBytes) import Ctl.Internal.ToData (class ToData, toData) import Ctl.Internal.Types.BigNum as BigNum -import Ctl.Internal.Types.OutputDatum (OutputDatum) +import Ctl.Internal.Types.OutputDatum (OutputDatum, pprintOutputDatum) import Ctl.Internal.Types.PlutusData (PlutusData(Constr)) +import Ctl.Internal.Types.RawBytes (rawBytesToHex) import Ctl.Internal.Types.Transaction (TransactionInput) import Data.Generic.Rep (class Generic) import Data.Lens (Lens') import Data.Lens.Iso.Newtype (_Newtype) import Data.Lens.Record (prop) +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag as TagSet import Data.Map (Map) -import Data.Maybe (Maybe(Nothing)) +import Data.Maybe (Maybe(Nothing), maybe) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Show.Generic (genericShow) import Type.Proxy (Proxy(Proxy)) @@ -75,6 +78,19 @@ instance ToData TransactionOutput where Constr BigNum.zero [ toData address, toData amount, toData datum, toData referenceScript ] +pprintTransactionOutput :: TransactionOutput -> TagSet +pprintTransactionOutput + (TransactionOutput { address, amount, datum, referenceScript }) = + TagSet.fromArray $ + [ "address" `tag` show address + , "amount" `tagSetTag` pprintValue (fromPlutusValue amount) + , pprintOutputDatum datum + ] <> referenceScriptTagSet + where + referenceScriptTagSet = maybe [] + (pure <<< tag "referenceScript" <<< rawBytesToHex <<< scriptHashToBytes) + referenceScript + newtype TransactionOutputWithRefScript = TransactionOutputWithRefScript { output :: TransactionOutput , scriptRef :: Maybe ScriptRef diff --git a/src/Internal/Plutus/Types/Value.purs b/src/Internal/Plutus/Types/Value.purs index 9e9496055..3e3c31a00 100644 --- a/src/Internal/Plutus/Types/Value.purs +++ b/src/Internal/Plutus/Types/Value.purs @@ -57,8 +57,6 @@ import Ctl.Internal.ToData (class ToData) import Ctl.Internal.Types.ByteArray (ByteArray) import Ctl.Internal.Types.TokenName (TokenName, adaToken, mkTokenName) import Data.Array (concatMap, filter, replicate) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Either (Either(Left)) import Data.Foldable (all, fold) import Data.Generic.Rep (class Generic) @@ -69,6 +67,8 @@ import Data.These (These(Both, That, This), these) import Data.Traversable (sequence) import Data.Tuple (fst) import Data.Tuple.Nested (type (/\), (/\)) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary) import Test.QuickCheck.Gen (Gen, chooseInt) diff --git a/src/Internal/ProcessConstraints.purs b/src/Internal/ProcessConstraints.purs new file mode 100644 index 000000000..69ee5cc05 --- /dev/null +++ b/src/Internal/ProcessConstraints.purs @@ -0,0 +1,938 @@ +module Ctl.Internal.ProcessConstraints + ( mkUnbalancedTxImpl + ) where + +import Prelude + +import Contract.Hashing (plutusScriptStakeValidatorHash) +import Control.Monad.Error.Class (catchError, throwError) +import Control.Monad.Except.Trans (ExceptT(ExceptT), except, runExceptT) +import Control.Monad.Reader.Class (asks) +import Control.Monad.State.Trans (get, gets, put, runStateT) +import Control.Monad.Trans.Class (lift) +import Ctl.Internal.Address (addressPaymentValidatorHash) +import Ctl.Internal.BalanceTx.RedeemerIndex + ( RedeemerPurpose(ForReward, ForCert, ForMint, ForSpend) + , UnindexedRedeemer(UnindexedRedeemer) + , unindexedRedeemerToRedeemer + ) +import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef(NativeScriptRef)) +import Ctl.Internal.Cardano.Types.Transaction + ( Certificate + ( StakeDelegation + , PoolRetirement + , PoolRegistration + , StakeDeregistration + , StakeRegistration + ) + , Transaction + , TransactionOutput(TransactionOutput) + , TransactionWitnessSet(TransactionWitnessSet) + , _body + , _certs + , _inputs + , _isValid + , _mint + , _networkId + , _outputs + , _referenceInputs + , _requiredSigners + , _scriptDataHash + , _withdrawals + , _witnessSet + ) +import Ctl.Internal.Cardano.Types.Value + ( Coin(Coin) + , getNonAdaAsset + , isZero + , mkSingletonValue' + , mpsSymbol + ) +import Ctl.Internal.Contract (getProtocolParameters) +import Ctl.Internal.Contract.Monad (Contract, getQueryHandle, wrapQueryM) +import Ctl.Internal.Hashing (datumHash) as Hashing +import Ctl.Internal.Helpers (liftEither, liftM) +import Ctl.Internal.NativeScripts (nativeScriptHash) +import Ctl.Internal.Plutus.Conversion + ( fromPlutusTxOutputWithRefScript + , fromPlutusValue + ) +import Ctl.Internal.Plutus.Types.Credential + ( Credential(ScriptCredential, PubKeyCredential) + ) +import Ctl.Internal.Plutus.Types.Transaction (TransactionOutputWithRefScript) as Plutus +import Ctl.Internal.Plutus.Types.TransactionUnspentOutput + ( TransactionUnspentOutput(TransactionUnspentOutput) + ) +import Ctl.Internal.ProcessConstraints.Error + ( MkUnbalancedTxError + ( CannotSatisfyAny + , CannotWithdrawRewardsNativeScript + , CannotWithdrawRewardsPlutusScript + , CannotWithdrawRewardsPubKey + , DatumWrongHash + , CannotMakeValue + , MintingPolicyHashNotCurrencySymbol + , CannotMintZero + , ExpectedPlutusScriptGotNativeScript + , CannotFindDatum + , CannotQueryDatum + , CannotGetValidatorHashFromAddress + , TxOutRefWrongType + , CannotConvertPOSIXTimeRange + , WrongRefScriptHash + , ValidatorHashNotFound + , MintingPolicyNotFound + , DatumNotFound + , TxOutRefNotFound + , CannotSolveTimeConstraints + , OwnPubKeyAndStakeKeyMissing + ) + ) +import Ctl.Internal.ProcessConstraints.State + ( ConstraintProcessingState + , ConstraintsM + , ValueSpentBalances(ValueSpentBalances) + , _costModels + , _cpsTransaction + , _cpsUsedUtxos + , _datums + , _lookups + , _redeemers + , _refScriptsUtxoMap + , _valueSpentBalancesInputs + , _valueSpentBalancesOutputs + , provideValue + , requireValue + , totalMissingValue + ) +import Ctl.Internal.ProcessConstraints.UnbalancedTx (UnbalancedTx) +import Ctl.Internal.QueryM.Pools + ( getPubKeyHashDelegationsAndRewards + , getValidatorHashDelegationsAndRewards + ) +import Ctl.Internal.Scripts + ( mintingPolicyHash + , nativeScriptStakeValidatorHash + , validatorHash + , validatorHashEnterpriseAddress + ) +import Ctl.Internal.Serialization.Address + ( NetworkId + , StakeCredential + , baseAddress + , baseAddressToAddress + , keyHashCredential + , scriptHashCredential + ) +import Ctl.Internal.Serialization.Hash (ScriptHash) +import Ctl.Internal.Transaction + ( attachDatum + , attachNativeScript + , attachPlutusScript + , setScriptDataHash + ) +import Ctl.Internal.Types.Datum (DataHash, Datum) +import Ctl.Internal.Types.Interval + ( POSIXTimeRange + , always + , intersection + , isEmpty + , posixTimeRangeToTransactionValidity + ) +import Ctl.Internal.Types.OutputDatum + ( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum) + ) +import Ctl.Internal.Types.PubKeyHash + ( payPubKeyHashBaseAddress + , payPubKeyHashEnterpriseAddress + , stakePubKeyHashRewardAddress + ) +import Ctl.Internal.Types.RewardAddress + ( stakePubKeyHashRewardAddress + , stakeValidatorHashRewardAddress + ) as RewardAddress +import Ctl.Internal.Types.ScriptLookups (ScriptLookups) +import Ctl.Internal.Types.Scripts + ( MintingPolicy(NativeMintingPolicy, PlutusMintingPolicy) + , MintingPolicyHash + , Validator + , ValidatorHash + ) +import Ctl.Internal.Types.Transaction (TransactionInput) +import Ctl.Internal.Types.TxConstraints + ( DatumPresence(DatumWitness, DatumInline) + , InputWithScriptRef(SpendInput, RefInput) + , TxConstraint + ( MustNotBeValid + , MustSatisfyAnyOf + , MustWithdrawStakeNativeScript + , MustWithdrawStakePlutusScript + , MustWithdrawStakePubKey + , MustDelegateStakeNativeScript + , MustDelegateStakePlutusScript + , MustDelegateStakePubKey + , MustRetirePool + , MustRegisterPool + , MustDeregisterStakeNativeScript + , MustDeregisterStakePlutusScript + , MustRegisterStakeScript + , MustDeregisterStakePubKey + , MustRegisterStakePubKey + , MustHashDatum + , MustPayToNativeScript + , MustPayToScript + , MustPayToPubKeyAddress + , MustMintValueUsingNativeScript + , MustMintValue + , MustReferenceOutput + , MustSpendNativeScriptOutput + , MustSpendScriptOutput + , MustSpendPubKeyOutput + , MustProduceAtLeast + , MustSpendAtLeast + , MustBeSignedBy + , MustValidateIn + , MustIncludeDatum + ) + , TxConstraints(TxConstraints) + , utxoWithScriptRef + ) +import Data.Array (cons, partition, toUnfoldable, zip) +import Data.Array (mapMaybe, singleton, (:)) as Array +import Data.Bifunctor (lmap) +import Data.Either (Either(Left, Right), either, hush, isRight, note) +import Data.Foldable (foldM) +import Data.Lens (non, (%=), (%~), (.=), (.~), (<>=)) +import Data.Lens.Getter (to, use) +import Data.Lens.Iso.Newtype (_Newtype) +import Data.List (List(Nil, Cons)) +import Data.Map (Map, empty, fromFoldable, lookup, union) +import Data.Map as Map +import Data.Maybe (Maybe(Just, Nothing), fromMaybe, maybe) +import Data.Newtype (class Newtype, over, unwrap, wrap) +import Data.Set (insert) as Set +import Data.Traversable (for, traverse_) +import Data.Tuple.Nested (type (/\), (/\)) +import Effect (Effect) +import Effect.Aff.Class (liftAff) +import Effect.Class (liftEffect) +import Effect.Exception (throw) +import Prelude (join) as Bind + +-- The constraints don't precisely match those of Plutus: +-- `forall v. (FromData (DatumType v), ToData (DatumType v), ToData (RedeemerType v))` +-- as we don't have the same granularity on the classes, but the type `v` fixes +-- types `d` and `r` as seen below. We could alternatively create specific typeclasses: +-- ToData (DatumType v) <-> (DatumType v d, ToData d) <= ToDataDatumType v d +-- if we require granular control, similarly FromDataDatumType v d etc. +-- We could use `MonadError` to clean up the `ExceptT`s below although we can't +-- use the type alias because they need to be fully applied so this is perhaps +-- more readable. +-- | Resolve some `TxConstraints` by modifying the `UnbalancedTx` in the +-- | `ConstraintProcessingState` +processLookupsAndConstraints + :: TxConstraints + -> ConstraintsM (Either MkUnbalancedTxError Unit) +processLookupsAndConstraints + (TxConstraints { constraints }) = runExceptT do + -- Hash all the MintingPolicys and Scripts beforehand. These maps are lost + -- after we `runReaderT`, unlike Plutus that has a `Map` instead of `Array`. + lookups <- use _lookups <#> unwrap + + let + mps = lookups.mps + scripts = lookups.scripts + mpsHashes = map mintingPolicyHash mps + validatorHashes = map validatorHash scripts + mpsMap = fromFoldable $ zip mpsHashes mps + osMap = fromFoldable $ zip validatorHashes scripts + + timeConstraintsSolved <- except $ resumeTimeConstraints constraints + + ExceptT $ foldConstraints (processConstraint mpsMap osMap) + timeConstraintsSolved + ExceptT addFakeScriptDataHash + ExceptT addMissingValueSpent + ExceptT updateUsedUtxos + + where + -- Don't write the output in terms of ExceptT because we can't write a + -- partially applied `ConstraintsM` meaning this is more readable. + foldConstraints + :: forall (constr :: Type) + . (constr -> ConstraintsM (Either MkUnbalancedTxError Unit)) + -> Array constr + -> ConstraintsM (Either MkUnbalancedTxError Unit) + foldConstraints handler = + runExceptT <<< traverse_ (ExceptT <<< handler) + +-- To build a transaction that satisfies the 'MustSpendAtLeast' and +-- `MustProduceAtLeast` constraints, we keep a tally of the required and +-- actual values we encounter on either side of the transaction. Then we +-- compute the missing value on both sides, and add an input with the +-- join of the positive parts of the missing values. + +-- Helper to run the stack and get back to `QueryM`. See comments in +-- `processLookupsAndConstraints` regarding constraints. +runConstraintsM + :: ScriptLookups + -> TxConstraints + -> Contract (Either MkUnbalancedTxError ConstraintProcessingState) +runConstraintsM lookups txConstraints = do + { costModels } <- unwrap <$> getProtocolParameters + let + initCps :: ConstraintProcessingState + initCps = + { transaction: mempty + , usedUtxos: Map.empty + , valueSpentBalancesInputs: + ValueSpentBalances { required: mempty, provided: mempty } + , valueSpentBalancesOutputs: + ValueSpentBalances { required: mempty, provided: mempty } + , datums: mempty + , redeemers: [] + , lookups + , refScriptsUtxoMap: empty + , costModels + } + + unpackTuple + :: Either MkUnbalancedTxError Unit /\ ConstraintProcessingState + -> Either MkUnbalancedTxError ConstraintProcessingState + unpackTuple (Left err /\ _) = Left err + unpackTuple (_ /\ cps) = Right cps + unpackTuple <$> + flip runStateT initCps (processLookupsAndConstraints txConstraints) + +-- | Adds a placeholder for ScriptDataHash. It will be wrong at this stage, +-- | because ExUnits hasn't been estimated yet. It will serve as a +-- | placeholder that will have the same size as the correct value. +addFakeScriptDataHash + :: ConstraintsM (Either MkUnbalancedTxError Unit) +addFakeScriptDataHash = runExceptT do + dats <- use _datums + costModels <- use _costModels + -- Use both script and minting redeemers in the order they were appended. + reds <- use (_redeemers <<< to (map unindexedRedeemerToRedeemer)) + tx <- use _cpsTransaction + tx' <- ExceptT $ liftEffect $ setScriptDataHash costModels reds dats tx <#> + Right + _cpsTransaction .= tx' + +-- | Add the remaining balance of the total value that the tx must spend. +-- | See note [Balance of value spent] +addMissingValueSpent + :: ConstraintsM (Either MkUnbalancedTxError Unit) +addMissingValueSpent = do + missing <- gets totalMissingValue + networkId <- getNetworkId + if isZero missing then pure $ Right unit + else runExceptT do + -- add 'missing' to the transaction's outputs. This ensures that the + -- wallet will add a corresponding input when balancing the + -- transaction. + -- Step 4 of the process described in [Balance of value spent] + lookups <- use _lookups <#> unwrap + let + pkh' = lookups.ownPaymentPubKeyHash + skh' = lookups.ownStakePubKeyHash + -- Potential fix me: This logic may be suspect: + txOutAddress <- case pkh', skh' of + Nothing, Nothing -> throwError OwnPubKeyAndStakeKeyMissing + Just pkh, Just skh -> pure $ payPubKeyHashBaseAddress networkId pkh skh + Just pkh, Nothing -> pure $ payPubKeyHashEnterpriseAddress networkId pkh + Nothing, Just skh -> pure $ stakePubKeyHashRewardAddress networkId skh + let + txOut = TransactionOutput + { address: txOutAddress + , amount: missing + , datum: NoOutputDatum + , scriptRef: Nothing + } + _cpsTransaction <<< _body <<< _outputs %= Array.(:) txOut + +updateUsedUtxos + :: ConstraintsM (Either MkUnbalancedTxError Unit) +updateUsedUtxos = runExceptT do + txOutputs <- use _lookups <#> unwrap >>> _.txOutputs + refScriptsUtxoMap <- use _refScriptsUtxoMap + networkId <- lift getNetworkId + let + cTxOutputs :: Map TransactionInput TransactionOutput + cTxOutputs = + (txOutputs `union` refScriptsUtxoMap) + <#> fromPlutusTxOutputWithRefScript networkId + -- Left bias towards original map, hence `flip`: + _cpsUsedUtxos %= flip union cTxOutputs + +resumeTimeConstraints + :: Array TxConstraint -> Either MkUnbalancedTxError (Array TxConstraint) +resumeTimeConstraints constraints = do + let + { no: nonTimeConstraints, yes: timeConstraints } = partition + isTimeConstraint + constraints + intervals = Array.mapMaybe constraintToInterval timeConstraints + newInterval <- foldM mergeIntervals always intervals + pure $ cons (MustValidateIn newInterval) nonTimeConstraints + where + mergeIntervals + :: POSIXTimeRange + -> POSIXTimeRange + -> Either MkUnbalancedTxError POSIXTimeRange + mergeIntervals interval1 interval2 = + let + newInterval :: POSIXTimeRange + newInterval = intersection interval1 interval2 + in + if isEmpty newInterval then Left $ CannotSolveTimeConstraints interval1 + interval2 + else pure newInterval + + constraintToInterval :: TxConstraint -> Maybe POSIXTimeRange + constraintToInterval = case _ of + MustValidateIn x -> Just x + _ -> Nothing + + isTimeConstraint :: TxConstraint -> Boolean + isTimeConstraint (MustValidateIn _) = true + isTimeConstraint _ = false + +lookupTxOutRef + :: TransactionInput + -> Maybe InputWithScriptRef + -> ConstraintsM (Either MkUnbalancedTxError TransactionOutput) +lookupTxOutRef oref = case _ of + Just inputWithRefScript -> + lookup oref (utxoWithScriptRef inputWithRefScript) + # maybe (lookupTxOutRef oref Nothing) (map Right <<< convertTxOutput) + Nothing -> + runExceptT do + utxos <- use _lookups <#> unwrap >>> _.txOutputs + txOutput <- liftM (TxOutRefNotFound oref) (lookup oref utxos) + lift $ convertTxOutput txOutput + where + convertTxOutput + :: Plutus.TransactionOutputWithRefScript -> ConstraintsM TransactionOutput + convertTxOutput txOutput = + flip fromPlutusTxOutputWithRefScript txOutput <$> getNetworkId + +lookupDatum + :: DataHash + -> ConstraintsM (Either MkUnbalancedTxError Datum) +lookupDatum dh = do + otherDt <- use _lookups <#> unwrap >>> _.datums + pure $ note (DatumNotFound dh) $ lookup dh otherDt + +lookupMintingPolicy + :: MintingPolicyHash + -> Map MintingPolicyHash MintingPolicy + -> Either MkUnbalancedTxError MintingPolicy +lookupMintingPolicy mph mpsMap = + note (MintingPolicyNotFound mph) $ lookup mph mpsMap + +lookupValidator + :: ValidatorHash + -> Map ValidatorHash Validator + -> Either MkUnbalancedTxError Validator +lookupValidator vh osMap = + note (ValidatorHashNotFound vh) $ lookup vh osMap + +processScriptRefUnspentOut + :: forall (scriptHash :: Type) + . Newtype scriptHash ScriptHash + => scriptHash + -> InputWithScriptRef + -> ConstraintsM (Either MkUnbalancedTxError Unit) +processScriptRefUnspentOut scriptHash inputWithRefScript = do + unspentOut <- case inputWithRefScript of + SpendInput unspentOut -> do + _cpsTransaction <<< _body <<< _inputs %= Set.insert + (_.input <<< unwrap $ unspentOut) + pure unspentOut + RefInput unspentOut -> do + let refInput = (unwrap unspentOut).input + _cpsTransaction <<< _body <<< _referenceInputs %= Set.insert refInput + pure unspentOut + + updateRefScriptsUtxoMap unspentOut + checkScriptRef unspentOut + where + updateRefScriptsUtxoMap + :: TransactionUnspentOutput -> ConstraintsM Unit + updateRefScriptsUtxoMap (TransactionUnspentOutput { input, output }) = + _refScriptsUtxoMap %= Map.insert input output + + checkScriptRef + :: TransactionUnspentOutput + -> ConstraintsM (Either MkUnbalancedTxError Unit) + checkScriptRef (TransactionUnspentOutput { output }) = + let + refScriptHash :: Maybe ScriptHash + refScriptHash = _.referenceScript $ unwrap $ (unwrap output).output + + err :: ConstraintsM (Either MkUnbalancedTxError Unit) + err = pure $ throwError $ WrongRefScriptHash refScriptHash + (unwrap output).output + in + if Just (unwrap scriptHash) /= refScriptHash then err + else pure (Right unit) + +checkRefNative + :: InputWithScriptRef + -> ConstraintsM (Either MkUnbalancedTxError Boolean) +checkRefNative scriptRef = + let + out = (unwrap ((unwrap uout).output)).output + in + pure $ note (WrongRefScriptHash Nothing out) $ isNative + (unwrap (unwrap uout).output).scriptRef + where + isNative ref = ref >>= + ( case _ of + NativeScriptRef _ -> pure true + _ -> pure false + ) + + uout :: TransactionUnspentOutput + uout = case scriptRef of + RefInput ref' -> ref' + SpendInput ref' -> ref' + +-- | Modify the `UnbalancedTx` so that it satisfies the constraints, if +-- | possible. Fails if a hash is missing from the lookups, or if an output +-- | of the wrong type is spent. +processConstraint + :: Map MintingPolicyHash MintingPolicy + -> Map ValidatorHash Validator + -> TxConstraint + -> ConstraintsM (Either MkUnbalancedTxError Unit) +processConstraint mpsMap osMap c = do + queryHandle <- lift $ getQueryHandle + case c of + MustIncludeDatum dat -> pure <$> addDatum dat + MustValidateIn posixTimeRange -> do + { systemStart } <- asks _.ledgerConstants + eraSummaries <- liftAff $ + queryHandle.getEraSummaries + >>= either (liftEffect <<< throw <<< show) pure + runExceptT do + ({ timeToLive, validityStartInterval }) <- liftEither $ + posixTimeRangeToTransactionValidity eraSummaries systemStart + posixTimeRange # lmap (CannotConvertPOSIXTimeRange posixTimeRange) + _cpsTransaction <<< _body <<< _Newtype %= + _ + { ttl = timeToLive + , validityStartInterval = validityStartInterval + } + MustBeSignedBy pkh -> runExceptT do + -- FIXME This is incompatible with Plutus' version, which requires + -- the corresponding `paymentPubKey` lookup. In the next major version, + -- we might wish to revise this + -- See https://github.com/Plutonomicon/cardano-transaction-lib/issues/569 + _cpsTransaction <<< _body <<< _requiredSigners <>= Just + [ wrap $ unwrap $ unwrap pkh ] + MustSpendAtLeast plutusValue -> do + let value = fromPlutusValue plutusValue + runExceptT $ _valueSpentBalancesInputs <>= requireValue value + MustProduceAtLeast plutusValue -> do + let value = fromPlutusValue plutusValue + runExceptT $ _valueSpentBalancesOutputs <>= requireValue value + MustSpendPubKeyOutput txo -> runExceptT do + TransactionOutput { amount } <- ExceptT $ lookupTxOutRef txo Nothing + -- POTENTIAL FIX ME: Plutus has Tx.TxIn and Tx.PubKeyTxIn -- TxIn + -- keeps track TransactionInput and TxInType (the input type, whether + -- consuming script, public key or simple script) + _cpsTransaction <<< _body <<< _inputs %= Set.insert txo + _valueSpentBalancesInputs <>= provideValue amount + MustSpendScriptOutput txo red scriptRefUnspentOut -> runExceptT do + txOut <- ExceptT $ lookupTxOutRef txo scriptRefUnspentOut + case txOut of + TransactionOutput { datum: NoOutputDatum } -> + throwError $ TxOutRefWrongType txo + TransactionOutput { address, amount, datum: datum' } -> + do + vHash <- liftM + (CannotGetValidatorHashFromAddress address) + (addressPaymentValidatorHash address) + case scriptRefUnspentOut of + Nothing -> do + plutusScript <- + except $ unwrap <$> lookupValidator vHash osMap + lift $ attachToCps attachPlutusScript plutusScript + Just scriptRefUnspentOut' -> + ExceptT $ processScriptRefUnspentOut vHash scriptRefUnspentOut' + -- Note: Plutus uses `TxIn` to attach a redeemer and datum. + -- Use the datum hash inside the lookup + case datum' of + OutputDatumHash dHash -> do + dat <- ExceptT do + mDatumLookup <- lookupDatum dHash + if isRight mDatumLookup then + pure mDatumLookup + else + liftAff $ queryHandle.getDatumByHash dHash <#> hush + >>> Bind.join + >>> note + (CannotQueryDatum dHash) + lift $ addDatum dat + OutputDatum _ -> pure unit + NoOutputDatum -> throwError CannotFindDatum + _cpsTransaction <<< _body <<< _inputs %= Set.insert txo + let + uiRedeemer = UnindexedRedeemer + { purpose: ForSpend txo + , datum: unwrap red + } + _redeemers <>= [ uiRedeemer ] + _valueSpentBalancesInputs <>= provideValue amount + MustSpendNativeScriptOutput txo ns -> runExceptT do + _cpsTransaction <<< _body <<< _inputs %= Set.insert txo + lift $ attachToCps (map pure <<< attachNativeScript) ns + MustReferenceOutput refInput -> runExceptT do + _cpsTransaction <<< _body <<< _referenceInputs %= Set.insert refInput + MustMintValue mpsHash red tn i scriptRefUnspentOut -> runExceptT do + case scriptRefUnspentOut of + Nothing -> do + mp <- except $ lookupMintingPolicy mpsHash mpsMap + ( case mp of + PlutusMintingPolicy p -> + ( lift $ attachToCps + attachPlutusScript + p + ) + NativeMintingPolicy _ -> throwError $ + ExpectedPlutusScriptGotNativeScript mpsHash + ) + Just scriptRefUnspentOut' -> do + isNative <- ExceptT $ checkRefNative scriptRefUnspentOut' + when isNative $ throwError $ ExpectedPlutusScriptGotNativeScript + mpsHash + (ExceptT $ processScriptRefUnspentOut mpsHash scriptRefUnspentOut') + + cs <- + liftM (MintingPolicyHashNotCurrencySymbol mpsHash) (mpsSymbol mpsHash) + let value = mkSingletonValue' cs tn + -- If i is negative we are burning tokens. The tokens burned must + -- be provided as an input. So we add the value burnt to + -- 'valueSpentBalancesInputs'. If i is positive then new tokens are + -- created which must be added to 'valueSpentBalancesOutputs'. + -- If i is zero we raise error, because of + -- https://github.com/Plutonomicon/cardano-transaction-lib/issues/1156 + mintVal <- + if i < zero then do + v <- liftM (CannotMakeValue cs tn i) (value $ negate i) + _valueSpentBalancesInputs <>= provideValue v + pure $ map getNonAdaAsset $ value i + else if i == zero then do + throwError $ CannotMintZero cs tn + else do + v <- liftM (CannotMakeValue cs tn i) (value i) + _valueSpentBalancesOutputs <>= provideValue v + pure $ map getNonAdaAsset $ value i + _redeemers <>= + [ UnindexedRedeemer { purpose: ForMint mpsHash, datum: unwrap red } ] + -- Remove mint redeemers from array before reindexing. + _cpsTransaction <<< _body <<< _mint <>= map wrap mintVal + + MustMintValueUsingNativeScript ns tn i -> runExceptT do + let mpHash = wrap <<< unwrap <<< nativeScriptHash $ ns + + lift $ attachToCps (map pure <<< attachNativeScript) ns + + cs <- liftM (MintingPolicyHashNotCurrencySymbol mpHash) (mpsSymbol mpHash) + let value = mkSingletonValue' cs tn + -- If i is negative we are burning tokens. The tokens burned must + -- be provided as an input. So we add the value burnt to + -- 'valueSpentBalancesInputs'. If i is positive then new tokens are + -- created which must be added to 'valueSpentBalancesOutputs'. + mintVal <- + if i < zero then do + v <- liftM (CannotMakeValue cs tn i) (value $ negate i) + _valueSpentBalancesInputs <>= provideValue v + pure $ map getNonAdaAsset $ value i + else do + v <- liftM (CannotMakeValue cs tn i) (value i) + _valueSpentBalancesOutputs <>= provideValue v + pure $ map getNonAdaAsset $ value i + + _cpsTransaction <<< _body <<< _mint <>= map wrap mintVal + + MustPayToPubKeyAddress pkh skh mDatum scriptRef plutusValue -> do + networkId <- getNetworkId + let amount = fromPlutusValue plutusValue + runExceptT do + -- If non-inline datum is presented, add it to 'datumWitnesses' and + -- Array of datums. + datum' <- for mDatum \(dat /\ datp) -> do + when (datp == DatumWitness) $ lift $ addDatum dat + pure $ outputDatum dat datp + let + address = case skh of + Just skh' -> payPubKeyHashBaseAddress networkId pkh skh' + Nothing -> payPubKeyHashEnterpriseAddress networkId pkh + txOut = TransactionOutput + { address + , amount + , datum: fromMaybe NoOutputDatum datum' + , scriptRef: scriptRef + } + _cpsTransaction <<< _body <<< _outputs %= Array.(:) txOut + _valueSpentBalancesOutputs <>= provideValue amount + MustPayToScript vlh mbCredential dat datp scriptRef plutusValue -> do + networkId <- getNetworkId + let amount = fromPlutusValue plutusValue + runExceptT do + let + datum' = outputDatum dat datp + txOut = TransactionOutput + { address: case mbCredential of + Nothing -> validatorHashEnterpriseAddress networkId vlh + Just cred -> baseAddressToAddress $ baseAddress + { network: networkId + , paymentCred: scriptHashCredential (unwrap vlh) + , delegationCred: credentialToStakeCredential cred + } + , amount + , datum: datum' + , scriptRef: scriptRef + } + -- Note we don't `addDatum` as this included as part of `mustPayToScript` + -- constraint already. + _cpsTransaction <<< _body <<< _outputs %= Array.(:) txOut + _valueSpentBalancesOutputs <>= provideValue amount + MustPayToNativeScript nsh mbCredential plutusValue -> do + networkId <- getNetworkId + let amount = fromPlutusValue plutusValue + runExceptT do + let + txOut = TransactionOutput + { address: case mbCredential of + Nothing -> validatorHashEnterpriseAddress networkId + (wrap $ unwrap nsh) + Just cred -> baseAddressToAddress $ baseAddress + { network: networkId + , paymentCred: scriptHashCredential (unwrap nsh) + , delegationCred: credentialToStakeCredential cred + } + , amount + , datum: NoOutputDatum + , scriptRef: Nothing + } + _cpsTransaction <<< _body <<< _outputs %= Array.(:) txOut + _valueSpentBalancesOutputs <>= provideValue amount + MustHashDatum dh dt -> do + let dh' = Hashing.datumHash dt + if dh' == dh then pure <$> addDatum dt + else pure $ throwError $ DatumWrongHash dh dt + MustRegisterStakePubKey skh -> runExceptT do + void $ lift $ addCertificate + $ StakeRegistration + $ keyHashCredential + $ unwrap + $ unwrap skh + MustDeregisterStakePubKey pubKey -> runExceptT do + void $ lift $ addCertificate + $ StakeDeregistration + $ keyHashCredential + $ unwrap + $ unwrap pubKey + MustRegisterStakeScript scriptHash -> runExceptT do + void $ lift $ addCertificate + $ StakeRegistration + $ scriptHashCredential + $ unwrap scriptHash + MustDeregisterStakePlutusScript plutusScript redeemerData -> runExceptT do + let + cert = StakeDeregistration + ( scriptHashCredential $ unwrap $ plutusScriptStakeValidatorHash + plutusScript + ) + _redeemers <>= + [ UnindexedRedeemer + { purpose: ForCert cert, datum: unwrap redeemerData } + ] + void $ lift $ addCertificate cert + lift $ attachToCps attachPlutusScript (unwrap plutusScript) + MustDeregisterStakeNativeScript stakeValidator -> do + void $ addCertificate $ StakeDeregistration + $ scriptHashCredential + $ unwrap + $ nativeScriptStakeValidatorHash + stakeValidator + pure <$> attachToCps (map pure <<< attachNativeScript) + (unwrap stakeValidator) + MustRegisterPool poolParams -> runExceptT do + void $ lift $ addCertificate $ PoolRegistration poolParams + MustRetirePool poolKeyHash epoch -> runExceptT do + void $ lift $ addCertificate $ PoolRetirement { poolKeyHash, epoch } + MustDelegateStakePubKey stakePubKeyHash poolKeyHash -> runExceptT do + void $ lift $ addCertificate $ + StakeDelegation (keyHashCredential $ unwrap $ unwrap $ stakePubKeyHash) + poolKeyHash + MustDelegateStakePlutusScript stakeValidator redeemerData poolKeyHash -> + runExceptT do + let + cert = StakeDelegation + ( scriptHashCredential $ unwrap $ plutusScriptStakeValidatorHash + stakeValidator + ) + poolKeyHash + lift $ addCertificate cert + _redeemers <>= + [ UnindexedRedeemer + { purpose: ForCert cert, datum: unwrap redeemerData } + ] + lift $ attachToCps attachPlutusScript (unwrap stakeValidator) + MustDelegateStakeNativeScript stakeValidator poolKeyHash -> do + void $ addCertificate $ StakeDelegation + ( scriptHashCredential $ unwrap $ nativeScriptStakeValidatorHash + stakeValidator + ) + poolKeyHash + pure <$> attachToCps (map pure <<< attachNativeScript) + (unwrap stakeValidator) + MustWithdrawStakePubKey spkh -> runExceptT do + networkId <- lift getNetworkId + mbRewards <- lift $ lift $ wrapQueryM $ getPubKeyHashDelegationsAndRewards + spkh + ({ rewards }) <- ExceptT $ pure $ note (CannotWithdrawRewardsPubKey spkh) + mbRewards + let + rewardAddress = + RewardAddress.stakePubKeyHashRewardAddress networkId spkh + _cpsTransaction <<< _body <<< _withdrawals <<< non Map.empty %= + Map.insert rewardAddress (fromMaybe (Coin zero) rewards) + MustWithdrawStakePlutusScript stakeValidator redeemerData -> runExceptT do + let hash = plutusScriptStakeValidatorHash stakeValidator + networkId <- lift getNetworkId + mbRewards <- lift $ lift $ wrapQueryM $ + getValidatorHashDelegationsAndRewards hash + let + rewardAddress = RewardAddress.stakeValidatorHashRewardAddress networkId + hash + ({ rewards }) <- ExceptT $ pure $ note + (CannotWithdrawRewardsPlutusScript stakeValidator) + mbRewards + _cpsTransaction <<< _body <<< _withdrawals <<< non Map.empty %= + Map.insert rewardAddress (fromMaybe (Coin zero) rewards) + _redeemers <>= + [ UnindexedRedeemer + { purpose: ForReward rewardAddress, datum: unwrap redeemerData } + ] + lift $ attachToCps attachPlutusScript (unwrap stakeValidator) + MustWithdrawStakeNativeScript stakeValidator -> runExceptT do + let hash = nativeScriptStakeValidatorHash stakeValidator + networkId <- lift getNetworkId + mbRewards <- lift $ lift $ wrapQueryM $ + getValidatorHashDelegationsAndRewards hash + let + rewardAddress = RewardAddress.stakeValidatorHashRewardAddress networkId + hash + ({ rewards }) <- ExceptT $ pure $ note + (CannotWithdrawRewardsNativeScript stakeValidator) + mbRewards + _cpsTransaction <<< _body <<< _withdrawals <<< non Map.empty %= + Map.insert rewardAddress (fromMaybe (Coin zero) rewards) + lift $ attachToCps (map pure <<< attachNativeScript) + (unwrap stakeValidator) + MustSatisfyAnyOf xs -> do + cps <- get + let + -- For each sublist, process the constraint from left to right, using the + -- new state in the subsequent call. If we fail, reset to the initial + -- state, `cps` and attempt for the next sublist. If a sublist is + -- processed successfully, we can stop early - I think this is how Plutus + -- behaves (POTENTIAL FIX ME). If all sublists fail, we fail overall as + -- seen in the base case. + tryNext + :: List (List TxConstraint) + -> ConstraintsM (Either MkUnbalancedTxError Unit) + tryNext Nil = pure $ throwError CannotSatisfyAny + tryNext (Cons ys zs) = + -- Note this implicitly resets state to original cps upon failure (see + -- `put`) + foldM + ( \_ constr -> runExceptT do + let continue = put cps *> tryNext zs + ( ExceptT $ processConstraint mpsMap osMap constr + `catchError` \_ -> continue + ) + `catchError` \_ -> ExceptT continue + ) + (Right unit) + ys + tryNext (toUnfoldable $ map toUnfoldable xs) + MustNotBeValid -> runExceptT do + _cpsTransaction <<< _isValid .= false + where + outputDatum + :: Datum + -> DatumPresence + -> OutputDatum + outputDatum dat = case _ of + DatumInline -> OutputDatum dat + DatumWitness -> OutputDatumHash $ Hashing.datumHash dat + +credentialToStakeCredential :: Credential -> StakeCredential +credentialToStakeCredential cred = case cred of + PubKeyCredential pubKeyHash -> keyHashCredential (unwrap pubKeyHash) + ScriptCredential scriptHash -> scriptHashCredential (unwrap scriptHash) + +-- Attach a Datum, Redeemer, or PlutusScript depending on the handler. They +-- share error type anyway. +attachToCps + :: forall (a :: Type) + . (a -> Transaction -> Effect Transaction) + -> a -- Redeemer, Datum, or PlutusScript. + -> ConstraintsM Unit +attachToCps handler object = do + tx <- use _cpsTransaction + newTx <- liftEffect $ handler object tx + (.=) _cpsTransaction newTx + +-- Attaches datum to the transaction and to Array of datums in the state. +addDatum + :: Datum + -> ConstraintsM Unit +addDatum dat = do + attachToCps attachDatum dat + _datums <>= Array.singleton dat + +-- | Returns an index pointing to the location of the newly inserted certificate +-- | in the array of transaction certificates. +addCertificate + :: Certificate + -> ConstraintsM Unit +addCertificate cert = do + _cpsTransaction <<< _body <<< _certs <<< non [] %= Array.(:) cert + +getNetworkId + :: ConstraintsM NetworkId +getNetworkId = use (_cpsTransaction <<< _body <<< _networkId) + >>= maybe (asks _.networkId) pure + +mkUnbalancedTxImpl + :: forall (validator :: Type) (datum :: Type) (redeemer :: Type) + . ScriptLookups + -> TxConstraints + -> Contract (Either MkUnbalancedTxError UnbalancedTx) +mkUnbalancedTxImpl scriptLookups txConstraints = + runConstraintsM scriptLookups txConstraints <#> map + \{ transaction, datums, redeemers, usedUtxos } -> + wrap + { transaction: stripDatumsRedeemers $ stripScriptDataHash transaction + , datums + , redeemers + , usedUtxos + } + where + stripScriptDataHash :: Transaction -> Transaction + stripScriptDataHash = + _body <<< _scriptDataHash .~ Nothing + + stripDatumsRedeemers :: Transaction -> Transaction + stripDatumsRedeemers = _witnessSet %~ + over TransactionWitnessSet + _ { plutusData = Nothing, redeemers = Nothing } diff --git a/src/Internal/ProcessConstraints/Error.purs b/src/Internal/ProcessConstraints/Error.purs new file mode 100644 index 000000000..e7b96e4ee --- /dev/null +++ b/src/Internal/ProcessConstraints/Error.purs @@ -0,0 +1,174 @@ +module Ctl.Internal.ProcessConstraints.Error where + +import Prelude + +import Ctl.Internal.Cardano.Types.NativeScript (pprintNativeScript) +import Ctl.Internal.Cardano.Types.Value (CurrencySymbol, getCurrencySymbol) +import Ctl.Internal.Helpers (bugTrackerLink, pprintTagSet) +import Ctl.Internal.Plutus.Types.Transaction + ( TransactionOutput + , pprintTransactionOutput + ) +import Ctl.Internal.Serialization.Address (Address, addressBech32) +import Ctl.Internal.Serialization.Hash + ( ScriptHash + , ed25519KeyHashToBytes + , scriptHashToBytes + ) +import Ctl.Internal.Types.ByteArray (byteArrayToHex) +import Ctl.Internal.Types.Datum (DataHash(DataHash), Datum) +import Ctl.Internal.Types.Interval + ( POSIXTimeRange + , PosixTimeToSlotError + , explainPosixTimeToSlotError + ) +import Ctl.Internal.Types.PubKeyHash (StakePubKeyHash) +import Ctl.Internal.Types.RawBytes (rawBytesToHex) +import Ctl.Internal.Types.Scripts + ( MintingPolicyHash + , NativeScriptStakeValidator + , PlutusScript(PlutusScript) + , PlutusScriptStakeValidator + , ValidatorHash + ) +import Ctl.Internal.Types.TokenName (TokenName, fromTokenName) +import Ctl.Internal.Types.Transaction (TransactionInput(TransactionInput)) +import Data.Generic.Rep (class Generic) +import Data.Log.Tag (tagSetTag) +import Data.Maybe (Maybe(Just, Nothing)) +import Data.Newtype (unwrap) +import Data.Show.Generic (genericShow) +import Data.Tuple.Nested ((/\)) +import Data.UInt as UInt +import JS.BigInt (BigInt) + +data MkUnbalancedTxError + = CannotFindDatum + | CannotQueryDatum DataHash + | CannotConvertPOSIXTimeRange POSIXTimeRange PosixTimeToSlotError + | CannotSolveTimeConstraints POSIXTimeRange POSIXTimeRange + | CannotGetMintingPolicyScriptIndex -- Should be impossible + | CannotGetValidatorHashFromAddress Address -- Get `ValidatorHash` from internal `Address` + | CannotMakeValue CurrencySymbol TokenName BigInt + | CannotWithdrawRewardsPubKey StakePubKeyHash + | CannotWithdrawRewardsPlutusScript PlutusScriptStakeValidator + | CannotWithdrawRewardsNativeScript NativeScriptStakeValidator + | DatumNotFound DataHash + | DatumWrongHash DataHash Datum + | MintingPolicyHashNotCurrencySymbol MintingPolicyHash + | MintingPolicyNotFound MintingPolicyHash + | OwnPubKeyAndStakeKeyMissing + | TxOutRefNotFound TransactionInput + | TxOutRefWrongType TransactionInput + | ValidatorHashNotFound ValidatorHash + | WrongRefScriptHash (Maybe ScriptHash) TransactionOutput + | CannotSatisfyAny + | ExpectedPlutusScriptGotNativeScript MintingPolicyHash + | CannotMintZero CurrencySymbol TokenName + +derive instance Generic MkUnbalancedTxError _ +derive instance Eq MkUnbalancedTxError + +instance Show MkUnbalancedTxError where + show = genericShow + +-- | Helper to pretty-print `MkUnbalancedTxError`s. +explainMkUnbalancedTxError :: MkUnbalancedTxError -> String +explainMkUnbalancedTxError = case _ of + CannotFindDatum -> "Cannot find datum" + CannotQueryDatum (DataHash dh) -> + "Querying for datum by datum hash (" + <> byteArrayToHex dh + <> ") failed: no datum found" + CannotConvertPOSIXTimeRange tr ttsErr -> + "Cannot convert POSIX time range to slot time range.\nRange: " + <> show tr + <> "\nReason: " + <> explainPosixTimeToSlotError ttsErr + CannotSolveTimeConstraints tr tr' -> + "Unsolvable time constraints: " <> show tr <> " and " <> show tr' <> + " do not overlap." + CannotGetMintingPolicyScriptIndex -> + "Cannot get minting policy script index. This should be impossible.\n" + <> "Please report this as a bug here: " + <> bugTrackerLink + CannotGetValidatorHashFromAddress addr -> + "Cannot get a payment validator hash from address " <> + addressBech32 addr + CannotMakeValue _ tn _ -> + "Attempted to make an amount with the ADA currency symbol, and " + <> "non-empty token name " + <> prettyTokenName tn + <> ". This is not allowed, as the ADA currency symbol can only be " + <> "combined with the empty token name." + CannotWithdrawRewardsPubKey spkh -> + "Cannot withdraw rewards, as pubkey " + <> rawBytesToHex (ed25519KeyHashToBytes $ unwrap $ unwrap spkh) + <> " is not registered" + CannotWithdrawRewardsPlutusScript pssv -> + "Cannot withdraw rewards from Plutus staking script " <> + prettyPlutusScript (unwrap pssv) + CannotWithdrawRewardsNativeScript nssv -> + pprintTagSet "Cannot withdraw rewards from native staking script " + ("NativeScript" `tagSetTag` pprintNativeScript (unwrap nssv)) + DatumNotFound (DataHash hash) -> "Datum with hash " <> byteArrayToHex hash <> + " not found." + DatumWrongHash (DataHash dh) datum -> "Datum " + <> show datum + <> " does not have the hash " + <> byteArrayToHex dh + MintingPolicyHashNotCurrencySymbol mph -> + "Minting policy hash " + <> rawBytesToHex (scriptHashToBytes $ unwrap mph) + <> + " is not a CurrencySymbol. Please check the validity of the byte representation." + MintingPolicyNotFound mp -> "Minting policy with hash " + <> rawBytesToHex (scriptHashToBytes $ unwrap mp) + <> " not found in a set of minting policies" + OwnPubKeyAndStakeKeyMissing -> + "Could not build own address: both payment pubkey and stake pubkey are missing" + TxOutRefNotFound ti -> + "Could not find a reference input:\n" + <> prettyTxIn ti + <> "\nIt maybe have been consumed, or was never created." + TxOutRefWrongType ti -> + "Transaction output is missing an expected datum:\n" + <> prettyTxIn ti + <> "\nContext: we were trying to spend a script output." + ValidatorHashNotFound vh -> "Cannot find validator hash: " <> + rawBytesToHex (scriptHashToBytes $ unwrap vh) + WrongRefScriptHash msh tout -> case msh of + Nothing -> pprintTagSet "Output is missing a reference script hash" + ("TransactionOutput" `tagSetTag` pprintTransactionOutput tout) + Just missingHash -> + pprintTagSet + ( "TransactionOutput is missing reference script hash " + <> rawBytesToHex (scriptHashToBytes missingHash) + ) + ("TransactionOutput" `tagSetTag` pprintTransactionOutput tout) + CannotSatisfyAny -> "One of the following happened:\n" + <> "1. List of constraints is empty.\n" + <> "2. All alternatives of a 'mustSatisfyAnyOf' have failed." + ExpectedPlutusScriptGotNativeScript mph -> + "Expected a Plutus script, but " + <> rawBytesToHex (scriptHashToBytes $ unwrap mph) + <> " is a hash of a native script." + CannotMintZero cs tn -> + "Cannot mint zero of token " + <> prettyTokenName tn + <> " of currency " + <> byteArrayToHex (getCurrencySymbol cs) + where + + prettyTokenName :: TokenName -> String + prettyTokenName = fromTokenName byteArrayToHex show + + prettyPlutusScript :: PlutusScript -> String + prettyPlutusScript (PlutusScript (code /\ lang)) = + show lang <> ": " <> byteArrayToHex code + + prettyTxIn :: TransactionInput -> String + prettyTxIn (TransactionInput ti) = + byteArrayToHex (unwrap ti.transactionId) + <> "#" + <> UInt.toString ti.index diff --git a/src/Internal/ProcessConstraints/State.purs b/src/Internal/ProcessConstraints/State.purs new file mode 100644 index 000000000..a35ae110b --- /dev/null +++ b/src/Internal/ProcessConstraints/State.purs @@ -0,0 +1,153 @@ +module Ctl.Internal.ProcessConstraints.State + ( ConstraintsM + , ConstraintProcessingState + , _cpsTransaction + , _cpsUsedUtxos + , _valueSpentBalancesInputs + , _valueSpentBalancesOutputs + , _datums + , _costModels + , _redeemers + , _lookups + , _refScriptsUtxoMap + , ValueSpentBalances(ValueSpentBalances) + , missingValueSpent + , totalMissingValue + , provideValue + , requireValue + ) where + +import Prelude hiding (join) + +import Control.Monad.State.Trans (StateT) +import Ctl.Internal.BalanceTx.RedeemerIndex (UnindexedRedeemer) +import Ctl.Internal.Cardano.Types.Transaction + ( Costmdls + , Transaction + , TransactionOutput + ) +import Ctl.Internal.Cardano.Types.Value (Value, negation, split) +import Ctl.Internal.Contract.Monad (Contract) +import Ctl.Internal.Plutus.Types.Transaction (TransactionOutputWithRefScript) as Plutus +import Ctl.Internal.Types.Datum (Datum) +import Ctl.Internal.Types.ScriptLookups (ScriptLookups) +import Ctl.Internal.Types.Transaction (TransactionInput) +import Data.Generic.Rep (class Generic) +import Data.Lattice (join) +import Data.Lens.Record (prop) +import Data.Lens.Types (Lens') +import Data.Map (Map) +import Data.Show.Generic (genericShow) +import Data.Tuple.Nested ((/\)) +import Type.Proxy (Proxy(Proxy)) + +-- A `StateT` ontop of `QueryM` ~ ReaderT QueryConfig Aff`. +-- The state is `ConstraintProcessingState`, which keeps track of the unbalanced +-- transaction etc and additionally holds a `ConstraintsConfig` containing the +-- scriptlookups and a `defaultSlotConfig`. +-- We write `ReaderT QueryConfig Aff` below since type synonyms need to be fully +-- applied. +type ConstraintsM (a :: Type) = + StateT ConstraintProcessingState Contract a + +-- This is the state for essentially creating an unbalanced transaction. +type ConstraintProcessingState = + { transaction :: Transaction + -- ^ The unbalanced transaction that we're building + , usedUtxos :: Map TransactionInput TransactionOutput + -- ^ All UTxOs that are used in the Tx + , valueSpentBalancesInputs :: ValueSpentBalances + -- ^ Balance of the values given and required for the transaction's inputs + , valueSpentBalancesOutputs :: ValueSpentBalances + -- ^ Balance of the values produced and required for the transaction's outputs + , datums :: Array Datum + -- ^ Ordered accumulation of datums we can use to `setScriptDataHash` + , redeemers :: Array UnindexedRedeemer + -- ^ Unindexed redeemers that will be attached to the Tx later, on balancing + -- stage. + , lookups :: ScriptLookups + -- ^ ScriptLookups for resolving constraints. Should be treated as an immutable + -- value despite living inside the processing state + -- TODO: remove: https://github.com/Plutonomicon/cardano-transaction-lib/issues/843 + , refScriptsUtxoMap :: + Map TransactionInput Plutus.TransactionOutputWithRefScript + , costModels :: Costmdls + } + +_cpsTransaction + :: Lens' ConstraintProcessingState Transaction +_cpsTransaction = prop (Proxy :: Proxy "transaction") + +_cpsUsedUtxos + :: Lens' ConstraintProcessingState + (Map TransactionInput TransactionOutput) +_cpsUsedUtxos = prop (Proxy :: Proxy "usedUtxos") + +_valueSpentBalancesInputs + :: Lens' ConstraintProcessingState ValueSpentBalances +_valueSpentBalancesInputs = prop (Proxy :: Proxy "valueSpentBalancesInputs") + +_valueSpentBalancesOutputs + :: Lens' ConstraintProcessingState ValueSpentBalances +_valueSpentBalancesOutputs = prop (Proxy :: Proxy "valueSpentBalancesOutputs") + +_datums + :: Lens' ConstraintProcessingState (Array Datum) +_datums = prop (Proxy :: Proxy "datums") + +_costModels + :: Lens' ConstraintProcessingState Costmdls +_costModels = prop (Proxy :: Proxy "costModels") + +_redeemers + :: Lens' ConstraintProcessingState (Array UnindexedRedeemer) +_redeemers = prop (Proxy :: Proxy "redeemers") + +_lookups + :: Lens' ConstraintProcessingState ScriptLookups +_lookups = prop (Proxy :: Proxy "lookups") + +_refScriptsUtxoMap + :: Lens' ConstraintProcessingState + (Map TransactionInput Plutus.TransactionOutputWithRefScript) +_refScriptsUtxoMap = prop (Proxy :: Proxy "refScriptsUtxoMap") + +-- | The balances we track for computing the missing 'Value' (if any) +-- | that needs to be added to the transaction. +-- | See note [Balance of value spent]. +newtype ValueSpentBalances = ValueSpentBalances + { required :: Value + -- Required value spent by the transaction. + , provided :: Value + -- Value provided by an input or output of the transaction. + } + +derive instance Generic ValueSpentBalances _ + +instance Show ValueSpentBalances where + show = genericShow + +instance Semigroup ValueSpentBalances where + append (ValueSpentBalances l) (ValueSpentBalances r) = ValueSpentBalances + { required: l.required `join` r.required -- least upper bound on Value + , provided: l.provided `join` r.provided + } + +missingValueSpent :: ValueSpentBalances -> Value +missingValueSpent (ValueSpentBalances { required, provided }) = + let + difference = required <> negation provided + _ /\ missing = split difference + in + missing + +totalMissingValue :: ConstraintProcessingState -> Value +totalMissingValue { valueSpentBalancesInputs, valueSpentBalancesOutputs } = + missingValueSpent valueSpentBalancesInputs `join` + missingValueSpent valueSpentBalancesOutputs + +provideValue :: Value -> ValueSpentBalances +provideValue provided = ValueSpentBalances { provided, required: mempty } + +requireValue :: Value -> ValueSpentBalances +requireValue required = ValueSpentBalances { required, provided: mempty } diff --git a/src/Internal/ProcessConstraints/UnbalancedTx.purs b/src/Internal/ProcessConstraints/UnbalancedTx.purs new file mode 100644 index 000000000..69c8ea8a4 --- /dev/null +++ b/src/Internal/ProcessConstraints/UnbalancedTx.purs @@ -0,0 +1,31 @@ +module Ctl.Internal.ProcessConstraints.UnbalancedTx + ( UnbalancedTx(UnbalancedTx) + ) where + +import Prelude hiding (join) + +import Ctl.Internal.BalanceTx.RedeemerIndex (UnindexedRedeemer) +import Ctl.Internal.Cardano.Types.Transaction (Transaction, TransactionOutput) +import Ctl.Internal.Types.Datum (Datum) +import Ctl.Internal.Types.Transaction (TransactionInput) +import Data.Generic.Rep (class Generic) +import Data.Map (Map) +import Data.Newtype (class Newtype) +import Data.Show.Generic (genericShow) + +-- | A newtype for the unbalanced transaction after creating one with datums +-- | and redeemers not attached. +newtype UnbalancedTx = UnbalancedTx + { transaction :: Transaction -- the unbalanced tx created + , usedUtxos :: Map TransactionInput TransactionOutput + , datums :: Array Datum -- the array of ordered datums that require attaching + , redeemers :: Array UnindexedRedeemer + } + +derive instance Generic UnbalancedTx _ +derive instance Newtype UnbalancedTx _ +derive newtype instance Eq UnbalancedTx +-- derive newtype instance EncodeAeson UnbalancedTx + +instance Show UnbalancedTx where + show = genericShow diff --git a/src/Internal/QueryM.purs b/src/Internal/QueryM.purs index 768c6af31..79137872d 100644 --- a/src/Internal/QueryM.purs +++ b/src/Internal/QueryM.purs @@ -17,6 +17,8 @@ module Ctl.Internal.QueryM , QueryRuntime , SubmitTxListenerSet , WebSocket(WebSocket) + , acquireMempoolSnapshot + , acquireMempoolSnapshotAff , evaluateTxOgmios , getChainTip , getLogger @@ -27,11 +29,19 @@ module Ctl.Internal.QueryM , postAeson , mkListenerSet , defaultMessageListener + , mempoolSnapshotHasTx + , mempoolSnapshotHasTxAff + , mempoolSnapshotNextTx + , mempoolSnapshotNextTxAff + , mempoolSnapshotSizeAndCapacity + , mempoolSnapshotSizeAndCapacityAff , mkOgmiosRequest , mkOgmiosRequestAff , mkOgmiosWebSocketAff , mkRequest , mkRequestAff + , releaseMempool + , releaseMempoolAff , scriptToAeson , submitTxOgmios , underlyingWebSocket @@ -45,11 +55,10 @@ import Aeson , JsonDecodeError(TypeMismatch) , decodeAeson , encodeAeson - , getFieldOptional , parseJsonStringToAeson , stringifyAeson ) -import Affjax (Error, Response, defaultRequest, request) as Affjax +import Affjax (Error, Response, defaultRequest) as Affjax import Affjax.RequestBody as Affjax.RequestBody import Affjax.RequestHeader as Affjax.RequestHeader import Affjax.ResponseFormat as Affjax.ResponseFormat @@ -68,7 +77,7 @@ import Control.Monad.Reader.Trans (ReaderT(ReaderT), asks) import Control.Monad.Rec.Class (class MonadRec) import Control.Parallel (class Parallel, parallel, sequential) import Control.Plus (class Plus) -import Ctl.Internal.Cardano.Types.Transaction (PoolPubKeyHash) +import Ctl.Internal.Affjax (request) as Affjax import Ctl.Internal.Helpers (logWithLevel) import Ctl.Internal.JsWebSocket ( JsWebSocket @@ -84,18 +93,17 @@ import Ctl.Internal.JsWebSocket ) import Ctl.Internal.Logging (Logger, mkLogger) import Ctl.Internal.QueryM.Dispatcher - ( DispatchError(JsError, JsonError, FaultError, ListenerCancelled) + ( DispatchError(JsonError) , Dispatcher , GenericPendingRequests , PendingRequests , PendingSubmitTxRequests , RequestBody , WebsocketDispatch - , dispatchErrorToError , mkWebsocketDispatch , newDispatcher , newPendingRequests - ) as ExportDispatcher + ) import Ctl.Internal.QueryM.Dispatcher ( DispatchError(JsonError, FaultError, ListenerCancelled) , Dispatcher @@ -108,16 +116,23 @@ import Ctl.Internal.QueryM.Dispatcher , mkWebsocketDispatch , newDispatcher , newPendingRequests + ) as ExportDispatcher +import Ctl.Internal.QueryM.JsonRpc2 + ( OgmiosDecodeError + , decodeOgmios + , ogmiosDecodeErrorToError ) -import Ctl.Internal.QueryM.JsonWsp as JsonWsp +import Ctl.Internal.QueryM.JsonRpc2 as JsonRpc2 import Ctl.Internal.QueryM.Ogmios ( AdditionalUtxoSet , DelegationsAndRewardsR + , HasTxR + , MaybeMempoolTransaction , OgmiosProtocolParameters - , PoolIdsR , PoolParametersR + , ReleasedMempool + , StakePoolsQueryArgument , TxHash - , aesonObject ) import Ctl.Internal.QueryM.Ogmios as Ogmios import Ctl.Internal.QueryM.UniqueId (ListenerId) @@ -291,8 +306,8 @@ getChainTip = ogmiosChainTipToTip <$> mkOgmiosRequest Ogmios.queryChainTipCall ogmiosChainTipToTip :: Ogmios.ChainTipQR -> Chain.Tip ogmiosChainTipToTip = case _ of Ogmios.CtChainOrigin _ -> Chain.TipAtGenesis - Ogmios.CtChainPoint { slot, hash } -> Chain.Tip $ wrap - { slot, blockHeaderHash: wrap $ unwrap hash } + Ogmios.CtChainPoint { slot, id } -> Chain.Tip $ wrap + { slot, blockHeaderHash: wrap $ unwrap id } -------------------------------------------------------------------------------- -- Ogmios Local Tx Submission Protocol @@ -350,9 +365,87 @@ mempoolSnapshotHasTxAff -> Ogmios.MempoolSnapshotAcquired -> TxHash -> Aff Boolean -mempoolSnapshotHasTxAff ogmiosWs logger ms = - mkOgmiosRequestAff ogmiosWs logger (Ogmios.mempoolSnapshotHasTxCall ms) +mempoolSnapshotHasTxAff ogmiosWs logger ms txh = + unwrap <$> mkOgmiosRequestAff ogmiosWs logger + (Ogmios.mempoolSnapshotHasTxCall ms) + _.mempoolHasTx + txh + +mempoolSnapshotSizeAndCapacityAff + :: OgmiosWebSocket + -> Logger + -> Ogmios.MempoolSnapshotAcquired + -> Aff Ogmios.MempoolSizeAndCapacity +mempoolSnapshotSizeAndCapacityAff ogmiosWs logger ms = + mkOgmiosRequestAff ogmiosWs logger + (Ogmios.mempoolSnapshotSizeAndCapacityCall ms) + _.mempoolSizeAndCapacity -- todo: typo + unit + +releaseMempoolAff + :: OgmiosWebSocket + -> Logger + -> Ogmios.MempoolSnapshotAcquired + -> Aff ReleasedMempool +releaseMempoolAff ogmiosWs logger ms = + mkOgmiosRequestAff ogmiosWs logger (Ogmios.releaseMempoolCall ms) + _.releaseMempool + unit + +mempoolSnapshotNextTxAff + :: OgmiosWebSocket + -> Logger + -> Ogmios.MempoolSnapshotAcquired + -> Aff (Maybe Ogmios.MempoolTransaction) +mempoolSnapshotNextTxAff ogmiosWs logger ms = unwrap <$> + mkOgmiosRequestAff ogmiosWs logger (Ogmios.mempoolSnapshotNextTxCall ms) + _.mempoolNextTx + unit + +acquireMempoolSnapshot + :: QueryM Ogmios.MempoolSnapshotAcquired +acquireMempoolSnapshot = + mkOgmiosRequest + Ogmios.acquireMempoolSnapshotCall + _.acquireMempool + unit + +mempoolSnapshotHasTx + :: Ogmios.MempoolSnapshotAcquired + -> TxHash + -> QueryM Boolean +mempoolSnapshotHasTx ms txh = + unwrap <$> mkOgmiosRequest + (Ogmios.mempoolSnapshotHasTxCall ms) _.mempoolHasTx + txh + +mempoolSnapshotSizeAndCapacity + :: Ogmios.MempoolSnapshotAcquired + -> QueryM Ogmios.MempoolSizeAndCapacity +mempoolSnapshotSizeAndCapacity ms = + mkOgmiosRequest + (Ogmios.mempoolSnapshotSizeAndCapacityCall ms) + _.mempoolSizeAndCapacity + unit + +releaseMempool + :: Ogmios.MempoolSnapshotAcquired + -> QueryM Unit +releaseMempool ms = + unit <$ mkOgmiosRequest + (Ogmios.releaseMempoolCall ms) + _.releaseMempool + unit + +mempoolSnapshotNextTx + :: Ogmios.MempoolSnapshotAcquired + -> QueryM (Maybe Ogmios.MempoolTransaction) +mempoolSnapshotNextTx ms = + unwrap <$> mkOgmiosRequest + (Ogmios.mempoolSnapshotNextTxCall ms) + _.mempoolNextTx + unit -------------------------------------------------------------------------------- -- Affjax @@ -469,7 +562,6 @@ mkServiceWebSocket lens url continue = do lens.logger Debug $ lens.serviceName <> " WebSocket error (" <> err <> "). Reconnecting..." - -- continue $ Right (ws /\ dispatcher /\ pending) continue $ Right (lens.typedWebSocket ws) pure $ Canceler $ \err -> liftEffect do _wsFinalize ws @@ -547,8 +639,7 @@ resendPendingSubmitRequests where submitSuccessPartialResp :: Aeson submitSuccessPartialResp = - encodeAeson - { "result": { "SubmitSuccess": { "txId": txHash } } } + encodeAeson $ Ogmios.submitSuccessPartialResp txHash -------------------------------------------------------------------------------- -- `MkServiceWebSocketLens` for ogmios @@ -588,13 +679,17 @@ mkOgmiosWebSocketLens logger isTxConfirmed = do mkListenerSet dispatcher pendingRequests , acquireMempool: mkListenerSet dispatcher pendingRequests + , releaseMempool: + mkListenerSet dispatcher pendingRequests , mempoolHasTx: mkListenerSet dispatcher pendingRequests + , mempoolNextTx: + mkListenerSet dispatcher pendingRequests + , mempoolSizeAndCapacity: + mkListenerSet dispatcher pendingRequests , submit: mkSubmitTxListenerSet dispatcher pendingSubmitTxRequests - , poolIds: - mkListenerSet dispatcher pendingRequests - , poolParameters: + , stakePools: mkListenerSet dispatcher pendingRequests , delegationsAndRewards: mkListenerSet dispatcher pendingRequests @@ -631,9 +726,11 @@ type OgmiosListeners = , currentEpoch :: ListenerSet Unit Ogmios.CurrentEpoch , systemStart :: ListenerSet Unit Ogmios.OgmiosSystemStart , acquireMempool :: ListenerSet Unit Ogmios.MempoolSnapshotAcquired - , mempoolHasTx :: ListenerSet TxHash Boolean - , poolIds :: ListenerSet Unit PoolIdsR - , poolParameters :: ListenerSet (Array PoolPubKeyHash) PoolParametersR + , releaseMempool :: ListenerSet Unit ReleasedMempool + , mempoolHasTx :: ListenerSet TxHash HasTxR + , mempoolNextTx :: ListenerSet Unit MaybeMempoolTransaction + , mempoolSizeAndCapacity :: ListenerSet Unit Ogmios.MempoolSizeAndCapacity + , stakePools :: ListenerSet StakePoolsQueryArgument PoolParametersR , delegationsAndRewards :: ListenerSet (Array String) DelegationsAndRewardsR } @@ -641,7 +738,7 @@ type OgmiosListeners = type ListenerSet (request :: Type) (response :: Type) = { addMessageListener :: ListenerId - -> (Either DispatchError response -> Effect Unit) + -> (Either OgmiosDecodeError response -> Effect Unit) -> Effect Unit , removeMessageListener :: ListenerId -> Effect Unit -- ^ Removes ID from dispatch map and pending requests queue. @@ -654,20 +751,17 @@ type SubmitTxListenerSet = ListenerSet (TxHash /\ CborBytes) Ogmios.SubmitTxR mkAddMessageListener :: forall (response :: Type) - . DecodeAeson response + . JsonRpc2.DecodeOgmios response => Dispatcher -> ( ListenerId - -> (Either DispatchError response -> Effect Unit) + -> (Either JsonRpc2.OgmiosDecodeError response -> Effect Unit) -> Effect Unit ) mkAddMessageListener dispatcher = \reflection handler -> flip Ref.modify_ dispatcher $ - Map.insert reflection \aeson -> handler $ - case (aesonObject (flip getFieldOptional "result") aeson) of - Left err -> Left (JsonError err) - Right (Just result) -> Right result - Right Nothing -> Left (FaultError aeson) + Map.insert reflection + (\aeson -> handler $ decodeOgmios aeson) mkRemoveMessageListener :: forall (requestData :: Type) @@ -683,7 +777,7 @@ mkRemoveMessageListener dispatcher pendingRequests = -- methods, this can be picked up by a query or cancellation function mkListenerSet :: forall (request :: Type) (response :: Type) - . DecodeAeson response + . JsonRpc2.DecodeOgmios response => Dispatcher -> PendingRequests -> ListenerSet request response @@ -713,21 +807,21 @@ mkSubmitTxListenerSet dispatcher pendingRequests = -- | Builds an Ogmios request action using `QueryM` mkOgmiosRequest :: forall (request :: Type) (response :: Type) - . JsonWsp.JsonWspCall request response + . JsonRpc2.JsonRpc2Call request response -> (OgmiosListeners -> ListenerSet request response) -> request -> QueryM response -mkOgmiosRequest jsonWspCall getLs inp = do +mkOgmiosRequest jsonRpc2Call getLs inp = do listeners' <- asks $ listeners <<< _.ogmiosWs <<< _.runtime websocket <- asks $ underlyingWebSocket <<< _.ogmiosWs <<< _.runtime - mkRequest listeners' websocket jsonWspCall getLs inp + mkRequest listeners' websocket jsonRpc2Call getLs inp -- | Builds an Ogmios request action using `Aff` mkOgmiosRequestAff :: forall (request :: Type) (response :: Type) . OgmiosWebSocket -> Logger - -> JsonWsp.JsonWspCall request response + -> JsonRpc2.JsonRpc2Call request response -> (OgmiosListeners -> ListenerSet request response) -> request -> Aff response @@ -739,13 +833,13 @@ mkRequest :: forall (request :: Type) (response :: Type) (listeners :: Type) . listeners -> JsWebSocket - -> JsonWsp.JsonWspCall request response + -> JsonRpc2.JsonRpc2Call request response -> (listeners -> ListenerSet request response) -> request -> QueryM response -mkRequest listeners' ws jsonWspCall getLs inp = do +mkRequest listeners' ws jsonRpc2Call getLs inp = do logger <- getLogger - liftAff $ mkRequestAff listeners' ws logger jsonWspCall getLs inp + liftAff $ mkRequestAff listeners' ws logger jsonRpc2Call getLs inp getLogger :: QueryM Logger getLogger = do @@ -758,13 +852,13 @@ mkRequestAff . listeners -> JsWebSocket -> Logger - -> JsonWsp.JsonWspCall request response + -> JsonRpc2.JsonRpc2Call request response -> (listeners -> ListenerSet request response) -> request -> Aff response -mkRequestAff listeners' webSocket logger jsonWspCall getLs input = do +mkRequestAff listeners' webSocket logger jsonRpc2Call getLs input = do { body, id } <- - liftEffect $ JsonWsp.buildRequest jsonWspCall input + liftEffect $ JsonRpc2.buildRequest jsonRpc2Call input let respLs :: ListenerSet request response respLs = getLs listeners' @@ -775,11 +869,9 @@ mkRequestAff listeners' webSocket logger jsonWspCall getLs input = do affFunc :: (Either Error response -> Effect Unit) -> Effect Canceler affFunc cont = do _ <- respLs.addMessageListener id - ( \result -> do + ( \res -> do respLs.removeMessageListener id - case result of - Left (ListenerCancelled _) -> pure unit - _ -> cont (lmap dispatchErrorToError result) + cont $ lmap ogmiosDecodeErrorToError res ) respLs.addRequest id (sBody /\ input) _wsSend webSocket (logger Debug) sBody diff --git a/src/Internal/QueryM/Dispatcher.purs b/src/Internal/QueryM/Dispatcher.purs index a81e7a755..7be1da08c 100644 --- a/src/Internal/QueryM/Dispatcher.purs +++ b/src/Internal/QueryM/Dispatcher.purs @@ -1,5 +1,5 @@ module Ctl.Internal.QueryM.Dispatcher - ( DispatchError(JsError, JsonError, FaultError, ListenerCancelled) + ( DispatchError(JsonError, FaultError, ListenerCancelled) , Dispatcher , GenericPendingRequests , PendingRequests @@ -15,7 +15,7 @@ module Ctl.Internal.QueryM.Dispatcher import Prelude import Aeson (Aeson, JsonDecodeError, stringifyAeson) -import Ctl.Internal.QueryM.JsonWsp (parseJsonWspResponseId) +import Ctl.Internal.QueryM.JsonRpc2 (parseJsonRpc2ResponseId) import Ctl.Internal.QueryM.Ogmios (TxHash) import Ctl.Internal.QueryM.UniqueId (ListenerId) import Data.Either (Either(Left, Right)) @@ -24,13 +24,12 @@ import Data.Map (empty, lookup) as Map import Data.Maybe (Maybe(Just, Nothing)) import Data.Tuple.Nested (type (/\)) import Effect (Effect) -import Effect.Exception (Error, error, message) +import Effect.Exception (Error, error) import Effect.Ref (Ref) import Effect.Ref (new, read) as Ref data DispatchError - = JsError Error - | JsonError JsonDecodeError + = JsonError JsonDecodeError -- Server response has been parsed succesfully, but it contains error -- message | FaultError Aeson @@ -38,14 +37,12 @@ data DispatchError | ListenerCancelled ListenerId instance Show DispatchError where - show (JsError err) = "(JsError (message " <> show (message err) <> "))" show (JsonError jsonErr) = "(JsonError " <> show jsonErr <> ")" show (FaultError aeson) = "(FaultError " <> show aeson <> ")" show (ListenerCancelled listenerId) = "(ListenerCancelled " <> show listenerId <> ")" dispatchErrorToError :: DispatchError -> Error -dispatchErrorToError (JsError err) = err dispatchErrorToError (JsonError err) = error $ show err dispatchErrorToError (FaultError err) = error $ "Server responded with `fault`: " <> stringifyAeson err @@ -64,7 +61,7 @@ newDispatcher = Ref.new Map.empty mkWebsocketDispatch :: Dispatcher -> WebsocketDispatch mkWebsocketDispatch dispatcher aeson = do - case parseJsonWspResponseId aeson of + case parseJsonRpc2ResponseId aeson of Left parseError -> pure $ Left $ JsonError parseError Right reflection -> do diff --git a/src/Internal/QueryM/JsonRpc2.purs b/src/Internal/QueryM/JsonRpc2.purs new file mode 100644 index 000000000..de5454d8d --- /dev/null +++ b/src/Internal/QueryM/JsonRpc2.purs @@ -0,0 +1,232 @@ +-- | Provides basics types and operations for working with JSON RPC protocol +-- | used by Ogmios +module Ctl.Internal.QueryM.JsonRpc2 + ( JsonRpc2Call + , JsonRpc2Request + , buildRequest + , mkCallType + , JsonRpc2Response + , decodeResult + , ogmiosDecodeErrorToError + , OgmiosDecodeError(ResultDecodingError, InvalidResponse, ErrorResponse) + , OgmiosError(OgmiosError) + , class DecodeOgmios + , decodeOgmios + , decodeErrorOrResult + , parseJsonRpc2ResponseId + , decodeAesonJsonRpc2Response + , pprintOgmiosDecodeError + , pprintOgmiosError + ) where + +import Prelude + +import Aeson + ( class DecodeAeson + , class EncodeAeson + , Aeson + , JsonDecodeError(TypeMismatch) + , caseAesonObject + , decodeAeson + , encodeAeson + , getField + , getFieldOptional + , printJsonDecodeError + , stringifyAeson + ) +import Ctl.Internal.QueryM.UniqueId (ListenerId, uniqueId) +import Data.Bifunctor (lmap) +import Data.Either (Either(Left, Right)) +import Data.Generic.Rep (class Generic) +import Data.Maybe (Maybe(Just), maybe) +import Data.Newtype (class Newtype) +import Data.Show.Generic (genericShow) +import Data.These (These(That, Both), theseLeft, theseRight) +import Data.Traversable (sequence) +import Data.Tuple.Nested ((/\)) +import Effect (Effect) +import Effect.Aff (Error, error) +import Foreign.Object (Object) +import Record as Record + +-- | Structure of all json rpc2.0 websocket requests +-- described in: https://ogmios.dev/getting-started/basics/ +type JsonRpc2Request (a :: Type) = + { jsonrpc :: String + , method :: String + , params :: a + , id :: ListenerId + } + +-- | Convenience helper function for creating `JsonRpc2Request a` objects +mkJsonRpc2Request + :: forall (a :: Type) + . { jsonrpc :: String } + -> { method :: String + , params :: a + } + -> Effect (JsonRpc2Request a) +mkJsonRpc2Request service method = do + id <- uniqueId $ method.method <> "-" + pure + $ Record.merge { id } + $ Record.merge service method + +-- | Structure of all json rpc websocket responses +-- described in: https://ogmios.dev/getting-started/basics/ +type JsonRpc2Response = + { jsonrpc :: String + -- methodname is not always present if `error` is not empty + , method :: Maybe String + , result :: Maybe Aeson + , error :: Maybe Aeson + , id :: ListenerId + } + +decodeAesonJsonRpc2Response + :: Aeson -> Either JsonDecodeError JsonRpc2Response +decodeAesonJsonRpc2Response = aesonObject $ \o -> do + jsonrpc <- getField o "jsonrpc" + method <- getFieldOptional o "method" + result <- getFieldOptional o "result" + error <- getFieldOptional o "error" + id <- getField o "id" + pure + { jsonrpc + , method + , result + , error + , id + } + +-- | A wrapper for tying arguments and response types to request building. +newtype JsonRpc2Call :: Type -> Type -> Type +newtype JsonRpc2Call (i :: Type) (o :: Type) = JsonRpc2Call + (i -> Effect { body :: Aeson, id :: String }) + +-- | Creates a "jsonrpc call" which ties together request input and response output types +-- | along with a way to create a request object. +mkCallType + :: forall (a :: Type) (i :: Type) (o :: Type) + . EncodeAeson (JsonRpc2Request a) + => { jsonrpc :: String } + -> { method :: String, params :: i -> a } + -> JsonRpc2Call i o +mkCallType service { method, params } = JsonRpc2Call \i -> do + req <- mkJsonRpc2Request service { method, params: params i } + pure { body: encodeAeson req, id: req.id } + +-- | Create a JsonRpc2 request body and id +buildRequest + :: forall (i :: Type) (o :: Type) + . JsonRpc2Call i o + -> i + -> Effect { body :: Aeson, id :: String } +buildRequest (JsonRpc2Call c) = c + +newtype OgmiosError = OgmiosError + { code :: Int, message :: String, data :: Maybe Aeson } + +derive instance Generic OgmiosError _ +derive instance Newtype OgmiosError _ + +instance Show OgmiosError where + show = genericShow + +pprintOgmiosError :: OgmiosError -> String +pprintOgmiosError (OgmiosError err) = stringifyAeson $ encodeAeson err + +instance DecodeAeson OgmiosError where + decodeAeson = aesonObject \o -> do + code <- getField o "code" + message <- getField o "message" + dat <- getFieldOptional o "data" + pure $ OgmiosError { code, message, data: dat } + +data OgmiosDecodeError + -- Server responded with error. + = ErrorResponse (Maybe OgmiosError) + -- Server responded with result, parsing of which failed + | ResultDecodingError JsonDecodeError + -- Received JsonRpc2Response was not of the right format. + | InvalidResponse JsonDecodeError + +derive instance Generic OgmiosDecodeError _ + +instance Show OgmiosDecodeError where + show = genericShow + +pprintOgmiosDecodeError :: OgmiosDecodeError -> String +pprintOgmiosDecodeError (ErrorResponse err) = "Ogmios responded with error: " <> + maybe "" pprintOgmiosError err +pprintOgmiosDecodeError (ResultDecodingError err) = + "Failed to parse the result: " <> printJsonDecodeError err +pprintOgmiosDecodeError (InvalidResponse err) = + "Ogmios response was not of the right format: " <> printJsonDecodeError err + +ogmiosDecodeErrorToError :: OgmiosDecodeError -> Error +ogmiosDecodeErrorToError err = error $ pprintOgmiosDecodeError err + +-- | Variation of DecodeAeson for ogmios response, defines how to parse full ogmios reponse. +-- We usually parse just the content of the "result" field, +-- but sometimes also "error" field, hence a class other than DecodeAeson. +class DecodeOgmios o where + decodeOgmios :: Aeson -> Either OgmiosDecodeError o + +-- | Given how to parse result or error fields, +-- defines a parser of the full json2rpc response. +makeDecodeOgmios + :: forall o + . These + { parseError :: Aeson -> Either JsonDecodeError o } + { parseResult :: Aeson -> Either JsonDecodeError o } + -> Aeson + -> Either OgmiosDecodeError o +makeDecodeOgmios decoders aeson = do + json <- lmap InvalidResponse $ decodeAesonJsonRpc2Response aeson + let merr = _.parseError <$> theseLeft decoders <*> json.error + let mres = _.parseResult <$> theseRight decoders <*> json.result + case (mres /\ merr) of + -- Expected result, got it + Just (Right x) /\ _ -> pure x + -- Expected result, got it in a wrong format + Just (Left err) /\ _ -> Left $ ResultDecodingError err + -- Got an expected error + _ /\ Just (Right x) -> pure x + -- Got an unexpected error + _ -> do + err :: Maybe OgmiosError <- sequence $ + lmap InvalidResponse <<< decodeAeson <$> json.error + Left $ ErrorResponse err + +-- | Decode "result" field of ogmios response. +decodeResult + :: forall o + . (Aeson -> Either JsonDecodeError o) + -> Aeson + -> Either OgmiosDecodeError o +decodeResult decodeAeson = makeDecodeOgmios $ That { parseResult: decodeAeson } + +-- | Decode "result" field or if absent the error field of ogmios response. +decodeErrorOrResult + :: forall o + . { parseError :: (Aeson -> Either JsonDecodeError o) } + -> { parseResult :: (Aeson -> Either JsonDecodeError o) } + -> Aeson + -> Either OgmiosDecodeError o +decodeErrorOrResult err res = makeDecodeOgmios $ Both err res + +-- | Parse just ID from the response +parseJsonRpc2ResponseId + :: Aeson + -> Either JsonDecodeError ListenerId +parseJsonRpc2ResponseId = + aesonObject $ flip getField "id" + +-- | Helper for assuming we get an object +aesonObject + :: forall (a :: Type) + . (Object Aeson -> Either JsonDecodeError a) + -> Aeson + -> Either JsonDecodeError a +aesonObject = caseAesonObject (Left (TypeMismatch "expected object")) diff --git a/src/Internal/QueryM/JsonWsp.purs b/src/Internal/QueryM/JsonWsp.purs deleted file mode 100644 index 5426eb3bb..000000000 --- a/src/Internal/QueryM/JsonWsp.purs +++ /dev/null @@ -1,139 +0,0 @@ --- | Provides basics types and operations for working with JSON RPC protocol --- | used by Ogmios -module Ctl.Internal.QueryM.JsonWsp - ( JsonWspRequest - , JsonWspResponse - , JsonWspCall - , mkCallType - , buildRequest - , parseJsonWspResponse - , parseJsonWspResponseId - ) where - -import Prelude - -import Aeson - ( class DecodeAeson - , class EncodeAeson - , Aeson - , JsonDecodeError(TypeMismatch) - , caseAesonObject - , encodeAeson - , getField - , getFieldOptional - ) -import Ctl.Internal.QueryM.UniqueId (ListenerId, uniqueId) -import Data.Either (Either(Left)) -import Data.Maybe (Maybe) -import Effect (Effect) -import Foreign.Object (Object) -import Record as Record - --- | Structure of all json wsp websocket requests --- described in: https://ogmios.dev/getting-started/basics/ -type JsonWspRequest (a :: Type) = - { type :: String - , version :: String - , servicename :: String - , methodname :: String - , args :: a - , mirror :: ListenerId - } - --- | Convenience helper function for creating `JsonWspRequest a` objects -mkJsonWspRequest - :: forall (a :: Type) - . { type :: String - , version :: String - , servicename :: String - } - -> { methodname :: String - , args :: a - } - -> Effect (JsonWspRequest a) -mkJsonWspRequest service method = do - id <- uniqueId $ method.methodname <> "-" - pure - $ Record.merge { mirror: id } - $ - Record.merge service method - --- | Structure of all json wsp websocket responses --- described in: https://ogmios.dev/getting-started/basics/ -type JsonWspResponse (a :: Type) = - { type :: String - , version :: String - , servicename :: String - -- methodname is not always present if `fault` is not empty - , methodname :: Maybe String - , result :: Maybe a - , fault :: Maybe Aeson - , reflection :: ListenerId - } - --- | A wrapper for tying arguments and response types to request building. -newtype JsonWspCall :: Type -> Type -> Type -newtype JsonWspCall (i :: Type) (o :: Type) = JsonWspCall - (i -> Effect { body :: Aeson, id :: String }) - --- | Creates a "jsonwsp call" which ties together request input and response output types --- | along with a way to create a request object. -mkCallType - :: forall (a :: Type) (i :: Type) (o :: Type) - . EncodeAeson (JsonWspRequest a) - => { type :: String - , version :: String - , servicename :: String - } - -> { methodname :: String, args :: i -> a } - -> JsonWspCall i o -mkCallType service { methodname, args } = JsonWspCall $ \i -> do - req <- mkJsonWspRequest service { methodname, args: args i } - pure { body: encodeAeson req, id: req.mirror } - --- | Create a JsonWsp request body and id -buildRequest - :: forall (i :: Type) (o :: Type) - . JsonWspCall i o - -> i - -> Effect { body :: Aeson, id :: String } -buildRequest (JsonWspCall c) = c - --- | Polymorphic response parser -parseJsonWspResponse - :: forall (a :: Type) - . DecodeAeson a - => Aeson - -> Either JsonDecodeError (JsonWspResponse a) -parseJsonWspResponse = aesonObject $ \o -> do - typeField <- getField o "type" - version <- getField o "version" - servicename <- getField o "servicename" - methodname <- getFieldOptional o "methodname" - result <- getFieldOptional o "result" - fault <- getFieldOptional o "fault" - reflection <- getField o "reflection" - pure - { "type": typeField - , version - , servicename - , methodname - , result - , fault - , reflection - } - --- | Parse just ID from the response -parseJsonWspResponseId - :: Aeson - -> Either JsonDecodeError ListenerId -parseJsonWspResponseId = - aesonObject $ flip getField "reflection" - --- | Helper for assuming we get an object -aesonObject - :: forall (a :: Type) - . (Object Aeson -> Either JsonDecodeError a) - -> Aeson - -> Either JsonDecodeError a -aesonObject = caseAesonObject (Left (TypeMismatch "expected object")) diff --git a/src/Internal/QueryM/Kupo.purs b/src/Internal/QueryM/Kupo.purs index 8f8a1d967..85395945b 100644 --- a/src/Internal/QueryM/Kupo.purs +++ b/src/Internal/QueryM/Kupo.purs @@ -3,6 +3,7 @@ module Ctl.Internal.QueryM.Kupo , getScriptByHash , getTxMetadata , getUtxoByOref + , getOutputAddressesByTxHash , isTxConfirmed , isTxConfirmedAff , utxosAt @@ -20,14 +21,17 @@ import Aeson , getFieldOptional' , isNull ) -import Affjax (Error, Response, defaultRequest, request) as Affjax +import Affjax (Error, Response, defaultRequest) as Affjax import Affjax.ResponseFormat (string) as Affjax.ResponseFormat +import Affjax.StatusCode (StatusCode(StatusCode)) +import Contract.Log (logTrace') import Control.Alt ((<|>)) import Control.Bind (bindFlipped) import Control.Monad.Error.Class (throwError) import Control.Monad.Except.Trans (ExceptT(ExceptT), except, runExceptT) import Control.Monad.Reader.Class (asks) import Control.Parallel (parTraverse) +import Ctl.Internal.Affjax (request) as Affjax import Ctl.Internal.Cardano.Types.ScriptRef ( ScriptRef(NativeScriptRef, PlutusScriptRef) ) @@ -82,26 +86,29 @@ import Ctl.Internal.Types.Transaction ) import Ctl.Internal.Types.TransactionMetadata (GeneralTransactionMetadata) import Data.Array (uncons) +import Data.Array as Array import Data.Bifunctor (lmap) -import Data.BigInt (BigInt) import Data.Either (Either(Left, Right), note) import Data.Foldable (fold) import Data.Generic.Rep (class Generic) import Data.HTTP.Method (Method(GET)) +import Data.Lens (_Right, to, (^?)) import Data.Map (Map) -import Data.Map (fromFoldable, isEmpty, lookup) as Map +import Data.Map (fromFoldable, isEmpty, lookup, values) as Map import Data.Maybe (Maybe(Just, Nothing), fromMaybe) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Show.Generic (genericShow) import Data.String (Pattern(Pattern), drop, indexOf, splitAt) as String +import Data.Time.Duration (Milliseconds(Milliseconds)) import Data.Traversable (traverse) import Data.Tuple (Tuple(Tuple)) import Data.Tuple.Nested (type (/\), (/\)) import Data.UInt (toString) as UInt -import Effect.Aff (Aff) +import Effect.Aff (Aff, delay) import Effect.Aff.Class (liftAff) import Foreign.Object (Object) import Foreign.Object (toUnfoldable) as Object +import JS.BigInt (BigInt) -------------------------------------------------------------------------------- -- Requests @@ -131,6 +138,22 @@ getUtxoByOref oref = runExceptT do txHashHex :: String txHashHex = byteArrayToHex (unwrap txHash) +-- | Specialized function to get addresses only, without resolving script +-- | references. Used internally. +getOutputAddressesByTxHash + :: TransactionHash -> QueryM (Either ClientError (Array Address)) +getOutputAddressesByTxHash txHash = runExceptT do + (kupoUtxoMap :: KupoUtxoMap) <- ExceptT $ handleAffjaxResponse <$> + kupoGetRequest endpoint + pure $ Array.fromFoldable (Map.values $ unwrap kupoUtxoMap) <#> + unwrap >>> _.address + where + endpoint :: String + endpoint = "/matches/*@" <> txHashHex <> "?unspent" + where + txHashHex :: String + txHashHex = byteArrayToHex (unwrap txHash) + getDatumByHash :: DataHash -> QueryM (Either ClientError (Maybe Datum)) getDatumByHash (DataHash dataHashBytes) = do let endpoint = "/datums/" <> byteArrayToHex dataHashBytes @@ -147,9 +170,15 @@ getScriptByHash scriptHash = do -- FIXME: This can only confirm transactions with at least one output. -- https://github.com/Plutonomicon/cardano-transaction-lib/issues/1293 isTxConfirmed :: TransactionHash -> QueryM (Either ClientError (Maybe Slot)) -isTxConfirmed th = do +isTxConfirmed txHash = do config <- asks (_.kupoConfig <<< _.config) - liftAff $ isTxConfirmedAff config th + do + -- we don't add `?unspent`, because we only care about existence of UTxOs, + -- possibly they can be consumed + let endpoint = "/matches/*@" <> byteArrayToHex (unwrap txHash) + -- Do this clumsy special case logging. It's better than sending it silently + logTrace' $ "sending kupo request: " <> endpoint + liftAff $ isTxConfirmedAff config txHash -- Exported due to Ogmios requiring confirmations at a websocket level isTxConfirmedAff @@ -454,15 +483,30 @@ kupoGetRequest :: String -> QueryM (Either Affjax.Error (Affjax.Response String)) kupoGetRequest endpoint = do config <- asks (_.kupoConfig <<< _.config) + logTrace' $ "sending kupo request: " <> endpoint liftAff $ kupoGetRequestAff config endpoint kupoGetRequestAff :: ServerConfig -> String -> Aff (Either Affjax.Error (Affjax.Response String)) -kupoGetRequestAff config endpoint = do - Affjax.request $ Affjax.defaultRequest +kupoGetRequestAff = kupoGetRequestRetryAff (Milliseconds 1000.0) + +-- | Retry on `503 Service Unavailable` error with exponentially-increasing +-- | interval (to not DOS the service even more). +kupoGetRequestRetryAff + :: Milliseconds + -> ServerConfig + -> String + -> Aff (Either Affjax.Error (Affjax.Response String)) +kupoGetRequestRetryAff delayMs config endpoint = do + result <- Affjax.request $ Affjax.defaultRequest { method = Left GET , url = mkHttpUrl config <> endpoint , responseFormat = Affjax.ResponseFormat.string } + if result ^? _Right <<< to _.status == Just (StatusCode 503) then + delay delayMs *> + kupoGetRequestRetryAff (Milliseconds (unwrap delayMs * 2.0)) config + endpoint + else pure result diff --git a/src/Internal/QueryM/Ogmios.purs b/src/Internal/QueryM/Ogmios.purs index 408b5ad26..b9a0b0a70 100644 --- a/src/Internal/QueryM/Ogmios.purs +++ b/src/Internal/QueryM/Ogmios.purs @@ -7,16 +7,19 @@ module Ctl.Internal.QueryM.Ogmios , CurrentEpoch(CurrentEpoch) , DelegationsAndRewardsR(DelegationsAndRewardsR) , ExecutionUnits + , MempoolSizeAndCapacity(MempoolSizeAndCapacity) , MempoolSnapshotAcquired + , MempoolTransaction(MempoolTransaction) , OgmiosAddress , OgmiosBlockHeaderHash(OgmiosBlockHeaderHash) , OgmiosTxOut , OgmiosTxOutRef + , OgmiosProtocolParameters(OgmiosProtocolParameters) , PParamRational(PParamRational) , PoolParameters , PoolParametersR(PoolParametersR) - , OgmiosProtocolParameters(OgmiosProtocolParameters) , RedeemerPointer + , ReleasedMempool(ReleasedMempool) , ScriptFailure ( ExtraRedeemers , MissingRequiredDatums @@ -24,8 +27,9 @@ module Ctl.Internal.QueryM.Ogmios , ValidatorFailed , UnknownInputReferencedByRedeemer , NonScriptInputReferencedByRedeemer - , IllFormedExecutionBudget , NoCostModelForLanguage + , InternalLedgerTypeConversionError + , IllFormedExecutionBudget ) , AdditionalUtxoSet(AdditionalUtxoSet) , OgmiosUtxoMap @@ -36,31 +40,38 @@ module Ctl.Internal.QueryM.Ogmios , OgmiosTxIn , OgmiosTxId , SubmitTxR(SubmitTxSuccess, SubmitFail) - , TxEvaluationFailure(UnparsedError, ScriptFailures) + , StakePoolsQueryArgument(StakePoolsQueryArgument) + , TxEvaluationFailure(UnparsedError, AdditionalUtxoOverlap, ScriptFailures) , TxEvaluationResult(TxEvaluationResult) , TxEvaluationR(TxEvaluationR) - , PoolIdsR , TxHash - , UtxoQR(UtxoQR) - , UtxoQueryResult + , HasTxR(HasTxR) + , MaybeMempoolTransaction(MaybeMempoolTransaction) , acquireMempoolSnapshotCall , aesonArray , aesonObject , evaluateTxCall - , queryPoolIdsCall + , queryStakePoolsCall , mempoolSnapshotHasTxCall + , mempoolSnapshotNextTxCall + , mempoolSnapshotSizeAndCapacityCall , mkOgmiosCallType + , mkOgmiosCallTypeNoArgs , queryChainTipCall , queryCurrentEpochCall , queryEraSummariesCall , queryProtocolParametersCall , querySystemStartCall - , queryPoolParameters , queryDelegationsAndRewards + , releaseMempoolCall , submitTxCall + , submitSuccessPartialResp , slotLengthFactor , parseIpv6String , rationalToSubcoin + , showRedeemerPointer + , decodeRedeemerPointer + , redeemerPtrTypeMismatch ) where import Prelude @@ -69,26 +80,23 @@ import Aeson ( class DecodeAeson , class EncodeAeson , Aeson - , JsonDecodeError(AtKey, TypeMismatch, MissingValue) + , JsonDecodeError(AtKey, TypeMismatch, UnexpectedValue, MissingValue) , caseAesonArray + , caseAesonNull , caseAesonObject , caseAesonString , decodeAeson , encodeAeson , fromArray + , fromString , getField - , getFieldOptional - , getFieldOptional' , isNull - , isString , stringifyAeson - , toString , (.:) , (.:?) ) import Control.Alt ((<|>)) import Control.Alternative (guard) -import Control.Monad.Reader.Trans (ReaderT(ReaderT), runReaderT) import Ctl.Internal.Cardano.Types.NativeScript ( NativeScript ( ScriptPubkey @@ -103,7 +111,8 @@ import Ctl.Internal.Cardano.Types.ScriptRef ( ScriptRef(NativeScriptRef, PlutusScriptRef) ) import Ctl.Internal.Cardano.Types.Transaction - ( Costmdls(Costmdls) + ( CostModel(CostModel) + , Costmdls(Costmdls) , ExUnitPrices , ExUnits , Ipv4(Ipv4) @@ -118,23 +127,26 @@ import Ctl.Internal.Cardano.Types.Transaction ) import Ctl.Internal.Cardano.Types.Value ( Coin(Coin) - , CurrencySymbol - , NonAdaAsset , Value - , flattenNonAdaValue , getCurrencySymbol , getLovelace , getNonAdaAsset - , mkCurrencySymbol - , mkNonAdaAsset - , mkValue + , unwrapNonAdaAsset , valueToCoin ) import Ctl.Internal.Deserialization.FromBytes (fromBytes) import Ctl.Internal.Helpers (encodeMap, showWithParens) -import Ctl.Internal.QueryM.JsonWsp (JsonWspCall, JsonWspRequest, mkCallType) +import Ctl.Internal.QueryM.JsonRpc2 + ( class DecodeOgmios + , JsonRpc2Call + , JsonRpc2Request + , OgmiosError + , decodeErrorOrResult + , decodeResult + , mkCallType + ) import Ctl.Internal.Serialization.Address (Slot(Slot)) -import Ctl.Internal.Serialization.Hash (Ed25519KeyHash, ed25519KeyHashFromBytes) +import Ctl.Internal.Serialization.Hash (Ed25519KeyHash, ScriptHash) import Ctl.Internal.Types.BigNum (BigNum) import Ctl.Internal.Types.BigNum (fromBigInt, fromString) as BigNum import Ctl.Internal.Types.ByteArray @@ -150,15 +162,12 @@ import Ctl.Internal.Types.EraSummaries , EraSummary(EraSummary) , EraSummaryParameters(EraSummaryParameters) ) +import Ctl.Internal.Types.Int as Csl import Ctl.Internal.Types.Natural (Natural) import Ctl.Internal.Types.Natural (fromString) as Natural import Ctl.Internal.Types.ProtocolParameters - ( CoinsPerUtxoUnit(CoinsPerUtxoWord, CoinsPerUtxoByte) - , CostModelV1 - , CostModelV2 + ( CoinsPerUtxoUnit(CoinsPerUtxoByte) , ProtocolParameters(ProtocolParameters) - , convertPlutusV1CostModel - , convertPlutusV2CostModel ) import Ctl.Internal.Types.Rational (Rational, (%)) import Ctl.Internal.Types.Rational as Rational @@ -174,42 +183,36 @@ import Ctl.Internal.Types.SystemStart , sysStartFromOgmiosTimestamp , sysStartToOgmiosTimestamp ) -import Ctl.Internal.Types.TokenName (TokenName, getTokenName, mkTokenName) +import Ctl.Internal.Types.TokenName (getTokenName) import Ctl.Internal.Types.VRFKeyHash (VRFKeyHash(VRFKeyHash)) -import Data.Array (catMaybes, index) -import Data.Array (head, length, replicate) as Array +import Data.Argonaut.Encode.Encoders as Argonaut +import Data.Array (catMaybes) +import Data.Array (fromFoldable, length, replicate) as Array import Data.Bifunctor (lmap) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Either (Either(Left, Right), either, note) import Data.Foldable (fold, foldl) import Data.Generic.Rep (class Generic) import Data.Int (fromString) as Int +import Data.List (List) +import Data.List as List import Data.Map (Map) import Data.Map as Map -import Data.Maybe (Maybe(Just, Nothing), fromJust, fromMaybe, maybe) +import Data.Maybe (Maybe(Nothing, Just), fromMaybe, maybe) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Show.Generic (genericShow) -import Data.String - ( Pattern(Pattern) - , Replacement(Replacement) - , indexOf - , split - , splitAt - , uncons - ) +import Data.String (Pattern(Pattern), Replacement(Replacement), split) import Data.String (replaceAll) as String import Data.String.Common (split) as String import Data.String.Utils as StringUtils -import Data.Traversable (for, sequence, traverse) -import Data.Tuple (Tuple(Tuple), snd, uncurry) +import Data.Traversable (for, traverse) +import Data.Tuple (Tuple(Tuple)) import Data.Tuple.Nested (type (/\), (/\)) import Data.UInt (UInt) import Data.UInt as UInt import Foreign.Object (Object) -import Foreign.Object (singleton, toUnfoldable) as ForeignObject import Foreign.Object as Object -import Partial.Unsafe (unsafePartial) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Untagged.TypeCheck (class HasRuntimeType) import Untagged.Union (type (|+|), toEither1) @@ -219,56 +222,38 @@ import Untagged.Union (type (|+|), toEither1) -------------------------------------------------------------------------------- -- | Queries Ogmios for the system start Datetime -querySystemStartCall :: JsonWspCall Unit OgmiosSystemStart -querySystemStartCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query: "systemStart" } - } +querySystemStartCall :: JsonRpc2Call Unit OgmiosSystemStart +querySystemStartCall = mkOgmiosCallTypeNoArgs "queryNetwork/startTime" -- | Queries Ogmios for the current epoch -queryCurrentEpochCall :: JsonWspCall Unit CurrentEpoch -queryCurrentEpochCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query: "currentEpoch" } - } +queryCurrentEpochCall :: JsonRpc2Call Unit CurrentEpoch +queryCurrentEpochCall = mkOgmiosCallTypeNoArgs "queryLedgerState/epoch" -- | Queries Ogmios for an array of era summaries, used for Slot arithmetic. -queryEraSummariesCall :: JsonWspCall Unit OgmiosEraSummaries -queryEraSummariesCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query: "eraSummaries" } - } +queryEraSummariesCall :: JsonRpc2Call Unit OgmiosEraSummaries +queryEraSummariesCall = mkOgmiosCallTypeNoArgs "queryLedgerState/eraSummaries" -- | Queries Ogmios for the current protocol parameters -queryProtocolParametersCall :: JsonWspCall Unit OgmiosProtocolParameters -queryProtocolParametersCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query: "currentProtocolParameters" } - } +queryProtocolParametersCall :: JsonRpc2Call Unit OgmiosProtocolParameters +queryProtocolParametersCall = mkOgmiosCallTypeNoArgs + "queryLedgerState/protocolParameters" -- | Queries Ogmios for the chain’s current tip. -queryChainTipCall :: JsonWspCall Unit ChainTipQR -queryChainTipCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query: "chainTip" } - } - -queryPoolIdsCall :: JsonWspCall Unit PoolIdsR -queryPoolIdsCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query: "poolIds" } - } - -queryPoolParameters :: JsonWspCall (Array PoolPubKeyHash) PoolParametersR -queryPoolParameters = mkOgmiosCallType - { methodname: "Query" - , args: \params -> { query: { poolParameters: params } } +queryChainTipCall :: JsonRpc2Call Unit ChainTipQR +queryChainTipCall = mkOgmiosCallTypeNoArgs "queryNetwork/tip" + +-- | Queries Ogmios for pool parameters of all pools or of the provided pools. +queryStakePoolsCall :: JsonRpc2Call StakePoolsQueryArgument PoolParametersR +queryStakePoolsCall = mkOgmiosCallType + { method: "queryLedgerState/stakePools" + , params: identity } -queryDelegationsAndRewards :: JsonWspCall (Array String) DelegationsAndRewardsR +queryDelegationsAndRewards + :: JsonRpc2Call (Array String) DelegationsAndRewardsR -- todo: whats string? git blame line below to restore queryDelegationsAndRewards = mkOgmiosCallType - { methodname: "Query" - , args: \skhs -> + { method: "queryLedgerState/rewardAccountSummaries" + , params: \skhs -> { query: { delegationsAndRewards: skhs } @@ -284,20 +269,22 @@ type OgmiosAddress = String -- | Sends a serialized signed transaction with its full witness through the -- | Cardano network via Ogmios. -submitTxCall :: JsonWspCall (TxHash /\ CborBytes) SubmitTxR +submitTxCall :: JsonRpc2Call (TxHash /\ CborBytes) SubmitTxR submitTxCall = mkOgmiosCallType - { methodname: "SubmitTx" - , args: { submit: _ } <<< cborBytesToHex <<< snd + { method: "submitTransaction" + , params: \(_ /\ cbor) -> + { transaction: { cbor: cborBytesToHex cbor } + } } -- | Evaluates the execution units of scripts present in a given transaction, -- | without actually submitting the transaction. -evaluateTxCall :: JsonWspCall (CborBytes /\ AdditionalUtxoSet) TxEvaluationR +evaluateTxCall :: JsonRpc2Call (CborBytes /\ AdditionalUtxoSet) TxEvaluationR evaluateTxCall = mkOgmiosCallType - { methodname: "EvaluateTx" - , args: \(cbor /\ utxoqr) -> - { evaluate: cborBytesToHex cbor - , additionalUtxoSet: utxoqr + { method: "evaluateTransaction" + , params: \(cbor /\ utxoqr) -> + { transaction: { cbor: cborBytesToHex cbor } + , additionalUtxo: utxoqr } } @@ -306,21 +293,63 @@ evaluateTxCall = mkOgmiosCallType -- https://ogmios.dev/mini-protocols/local-tx-monitor/ -------------------------------------------------------------------------------- -acquireMempoolSnapshotCall :: JsonWspCall Unit MempoolSnapshotAcquired +acquireMempoolSnapshotCall :: JsonRpc2Call Unit MempoolSnapshotAcquired acquireMempoolSnapshotCall = - mkOgmiosCallTypeNoArgs "AwaitAcquire" + mkOgmiosCallTypeNoArgs "acquireMempool" mempoolSnapshotHasTxCall - :: MempoolSnapshotAcquired -> JsonWspCall TxHash Boolean + :: MempoolSnapshotAcquired -> JsonRpc2Call TxHash HasTxR mempoolSnapshotHasTxCall _ = mkOgmiosCallType - { methodname: "HasTx" - , args: { id: _ } + { method: "hasTransaction" + , params: { id: _ } + } + +mempoolSnapshotNextTxCall + :: MempoolSnapshotAcquired -> JsonRpc2Call Unit MaybeMempoolTransaction +mempoolSnapshotNextTxCall _ = mkOgmiosCallType + { method: "nextTransaction" + , params: const { fields: "all" } } +mempoolSnapshotSizeAndCapacityCall + :: MempoolSnapshotAcquired -> JsonRpc2Call Unit MempoolSizeAndCapacity +mempoolSnapshotSizeAndCapacityCall _ = + mkOgmiosCallTypeNoArgs "sizeOfMempool" + +releaseMempoolCall + :: MempoolSnapshotAcquired -> JsonRpc2Call Unit ReleasedMempool +releaseMempoolCall _ = + mkOgmiosCallTypeNoArgs "releaseMempool" + +-------------------------------------------------------------------------------- +-- Helpers +-------------------------------------------------------------------------------- + +mkOgmiosCallTypeNoArgs + :: forall (o :: Type). DecodeOgmios o => String -> JsonRpc2Call Unit o +mkOgmiosCallTypeNoArgs method = + mkOgmiosCallType { method, params: const {} } + +mkOgmiosCallType + :: forall (a :: Type) (i :: Type) (o :: Type) + . EncodeAeson (JsonRpc2Request a) + => DecodeOgmios o + => { method :: String, params :: i -> a } + -> JsonRpc2Call i o +mkOgmiosCallType = + mkCallType { jsonrpc: "2.0" } + -------------------------------------------------------------------------------- -- Local Tx Monitor Query Response & Parsing -------------------------------------------------------------------------------- +newtype HasTxR = HasTxR Boolean + +derive instance Newtype HasTxR _ + +instance DecodeOgmios HasTxR where + decodeOgmios = decodeResult (map HasTxR <<< decodeAeson) + newtype MempoolSnapshotAcquired = AwaitAcquired Slot instance Show MempoolSnapshotAcquired where @@ -328,36 +357,95 @@ instance Show MempoolSnapshotAcquired where instance DecodeAeson MempoolSnapshotAcquired where decodeAeson = - map AwaitAcquired <<< aesonObject - (flip getField "AwaitAcquired" >=> flip getField "slot") + -- todo: ignoring "acquired": "mempool" + map AwaitAcquired <<< aesonObject (flip getField "slot") + +instance DecodeOgmios MempoolSnapshotAcquired where + decodeOgmios = decodeResult decodeAeson + +-- | The acquired snapshot’s size (in bytes), number of transactions, and capacity +-- | (in bytes). +newtype MempoolSizeAndCapacity = MempoolSizeAndCapacity + { capacity :: Int + , currentSize :: Int + , numberOfTxs :: Int + } --------------------------------------------------------------------------------- --- Helpers --------------------------------------------------------------------------------- +derive instance Generic MempoolSizeAndCapacity _ +derive instance Newtype MempoolSizeAndCapacity _ -mkOgmiosCallTypeNoArgs - :: forall (o :: Type). String -> JsonWspCall Unit o -mkOgmiosCallTypeNoArgs methodname = - mkOgmiosCallType { methodname, args: const {} } +instance Show MempoolSizeAndCapacity where + show = genericShow -mkOgmiosCallType - :: forall (a :: Type) (i :: Type) (o :: Type) - . EncodeAeson (JsonWspRequest a) - => { methodname :: String, args :: i -> a } - -> JsonWspCall i o -mkOgmiosCallType = - ( mkCallType - { "type": "jsonwsp/request" - , version: "1.0" - , servicename: "ogmios" - } - ) +instance DecodeAeson MempoolSizeAndCapacity where + decodeAeson = aesonObject \o -> do + capacity <- getField o "maxCapacity" >>= flip getField "bytes" + currentSize <- getField o "currentSize" >>= flip getField "bytes" + numberOfTxs <- getField o "transactions" >>= flip getField "count" + pure $ wrap { capacity, currentSize, numberOfTxs } + +instance DecodeOgmios MempoolSizeAndCapacity where + decodeOgmios = decodeResult decodeAeson + +newtype MempoolTransaction = MempoolTransaction + { id :: OgmiosTxId + , raw :: String -- hex encoded transaction cbor + } + +derive instance Generic MempoolTransaction _ +derive instance Newtype MempoolTransaction _ + +newtype MaybeMempoolTransaction = MaybeMempoolTransaction + (Maybe MempoolTransaction) + +instance DecodeAeson MaybeMempoolTransaction where + decodeAeson aeson = do + { transaction: tx } :: { transaction :: Aeson } <- decodeAeson aeson + res <- + ( do + tx' :: { id :: String, cbor :: String } <- decodeAeson tx + pure $ Just $ MempoolTransaction { id: tx'.id, raw: tx'.cbor } + ) <|> + ( do + aesonNull tx + pure Nothing + ) + pure $ MaybeMempoolTransaction $ res + +derive instance Newtype MaybeMempoolTransaction _ + +instance DecodeOgmios MaybeMempoolTransaction where + decodeOgmios = decodeResult decodeAeson + +data ReleasedMempool = ReleasedMempool + +derive instance Generic ReleasedMempool _ + +instance Show ReleasedMempool where + show = genericShow + +instance DecodeAeson ReleasedMempool where + decodeAeson = aesonObject \o -> do + released <- o .: "released" + flip aesonString released $ \s -> + if s == "mempool" then + pure $ ReleasedMempool + else + Left (UnexpectedValue $ Argonaut.encodeString s) + +instance DecodeOgmios ReleasedMempool where + decodeOgmios = decodeResult decodeAeson ---------------- TX SUBMISSION QUERY RESPONSE & PARSING +submitSuccessPartialResp + :: TxHash -> { result :: { transaction :: { id :: TxHash } } } +submitSuccessPartialResp txHash = + { "result": { "transaction": { "id": txHash } } } + data SubmitTxR = SubmitTxSuccess TxHash - | SubmitFail (Array Aeson) + | SubmitFail OgmiosError derive instance Generic SubmitTxR _ @@ -366,13 +454,29 @@ instance Show SubmitTxR where type TxHash = ByteArray -instance DecodeAeson SubmitTxR where - decodeAeson = aesonObject $ - \o -> - ( getField o "SubmitSuccess" >>= flip getField "txId" >>= hexToByteArray - >>> maybe (Left (TypeMismatch "Expected hexstring")) - (pure <<< SubmitTxSuccess) - ) <|> (SubmitFail <$> getField o "SubmitFail") +instance DecodeOgmios SubmitTxR where + decodeOgmios = decodeErrorOrResult + { parseError: decodeError } + { parseResult: map SubmitTxSuccess <<< decodeTxHash } + + where + + decodeError aeson = map SubmitFail do + -- With Ogmios 5.6 we failed with error on deserialization error, so we do now as well + err :: OgmiosError <- decodeAeson aeson + let code = (unwrap err).code + -- as of 7.11.23 it's in {3005} u [3100, 3159] range + if (3000 <= code && code <= 3999) then + pure err + else + Left $ TypeMismatch + "Expected error code in a range [3000, 3999]" + + decodeTxHash :: Aeson -> Either JsonDecodeError TxHash + decodeTxHash = aesonObject $ \o -> + ( getField o "transaction" >>= flip getField "id" >>= hexToByteArray + >>> maybe (Left $ TypeMismatch "Expected hexstring") pure + ) ---------------- SYSTEM START QUERY RESPONSE & PARSING newtype OgmiosSystemStart = OgmiosSystemStart SystemStart @@ -392,6 +496,9 @@ instance DecodeAeson OgmiosSystemStart where instance EncodeAeson OgmiosSystemStart where encodeAeson = encodeAeson <<< sysStartToOgmiosTimestamp <<< unwrap +instance DecodeOgmios OgmiosSystemStart where + decodeOgmios = decodeResult decodeAeson + ---------------- CURRENT EPOCH QUERY RESPONSE & PARSING newtype CurrentEpoch = CurrentEpoch BigInt @@ -405,6 +512,9 @@ derive newtype instance Ord CurrentEpoch instance Show CurrentEpoch where show (CurrentEpoch ce) = showWithParens "CurrentEpoch" ce +instance DecodeOgmios CurrentEpoch where + decodeOgmios = decodeResult decodeAeson + ---------------- ERA SUMMARY QUERY RESPONSE & PARSING newtype OgmiosEraSummaries = OgmiosEraSummaries EraSummaries @@ -417,6 +527,8 @@ instance Show OgmiosEraSummaries where show = genericShow instance DecodeAeson OgmiosEraSummaries where + -- There is some differences between ogmios 6.0 spec and actual results + -- in "start" "end" fields and "slotLength". decodeAeson = aesonArray (map (wrap <<< wrap) <<< traverse decodeEraSummary) where decodeEraSummary :: Aeson -> Either JsonDecodeError EraSummary @@ -435,7 +547,10 @@ instance DecodeAeson OgmiosEraSummaries where :: Object Aeson -> Either JsonDecodeError EraSummaryParameters decodeEraSummaryParameters o = do epochLength <- getField o "epochLength" - slotLength <- wrap <$> ((*) slotLengthFactor <$> getField o "slotLength") + slotLength <- wrap <$> + ( (*) slotLengthFactor <$> + (flip getField "seconds" =<< getField o "slotLength") + ) safeZone <- fromMaybe zero <$> getField o "safeZone" pure $ wrap { epochLength, slotLength, safeZone } @@ -455,7 +570,7 @@ instance EncodeAeson OgmiosEraSummaries where encodeEraSummaryParameters (EraSummaryParameters params) = encodeAeson { "epochLength": params.epochLength - , "slotLength": params.slotLength + , "slotLength": { "seconds": params.slotLength } , "safeZone": params.safeZone } @@ -464,6 +579,9 @@ instance EncodeAeson OgmiosEraSummaries where slotLengthFactor :: Number slotLengthFactor = 1000.0 +instance DecodeOgmios OgmiosEraSummaries where + decodeOgmios = decodeResult decodeAeson + ---------------- DELEGATIONS & REWARDS QUERY RESPONSE & PARSING newtype DelegationsAndRewardsR = DelegationsAndRewardsR @@ -485,6 +603,26 @@ instance DecodeAeson DelegationsAndRewardsR where pure $ k /\ { rewards, delegate } pure $ DelegationsAndRewardsR $ Map.fromFoldable kvs +instance DecodeOgmios DelegationsAndRewardsR where + decodeOgmios = decodeResult decodeAeson + +---------------- POOL PARAMETERS REQUEST & PARSING + +-- Nothing queries all pools, otherwise query selected pools. +newtype StakePoolsQueryArgument = StakePoolsQueryArgument + (Maybe (Array PoolPubKeyHash)) + +derive instance Newtype StakePoolsQueryArgument _ + +instance EncodeAeson StakePoolsQueryArgument where + encodeAeson a = do + maybe + (encodeAeson {}) + ( \poolPkhs -> encodeAeson + { stakePools: map (\pool -> { id: pool }) poolPkhs } + ) + (unwrap a) + ---------------- POOL PARAMETERS QUERY RESPONSE & PARSING type PoolParameters = @@ -500,7 +638,7 @@ type PoolParameters = , poolMetadata :: Maybe PoolMetadata } -newtype PoolParametersR = PoolParametersR (Map String PoolParameters) +newtype PoolParametersR = PoolParametersR (Map PoolPubKeyHash PoolParameters) derive instance Newtype PoolParametersR _ derive instance Generic PoolParametersR _ @@ -512,31 +650,43 @@ instance DecodeAeson PoolParametersR where decodeAeson aeson = do obj :: Object (Object Aeson) <- decodeAeson aeson kvs <- for (Object.toUnfoldable obj :: Array _) \(Tuple k objParams) -> do - vrfKeyhashHex <- objParams .: "vrf" - vrfKeyhashBytes <- note (TypeMismatch "VRFKeyHash") $ hexToByteArray - vrfKeyhashHex - vrfKeyhash <- note (TypeMismatch "VRFKeyHash") $ VRFKeyHash <$> fromBytes - (wrap vrfKeyhashBytes) - pledge <- objParams .: "pledge" - cost <- objParams .: "cost" - margin <- decodeUnitInterval =<< objParams .: "margin" - rewardAccount <- objParams .: "rewardAccount" - poolOwners <- objParams .: "owners" - relayArr <- objParams .: "relays" - relays <- for relayArr decodeRelay - poolMetadata <- objParams .:? "metadata" >>= traverse decodePoolMetadata - pure $ k /\ - { vrfKeyhash - , pledge - , cost - , margin - , rewardAccount - , poolOwners - , relays - , poolMetadata - } + poolPkh <- decodeAeson $ fromString k + poolParams <- decodePoolParameters objParams + pure $ poolPkh /\ poolParams pure $ PoolParametersR $ Map.fromFoldable kvs +instance DecodeOgmios PoolParametersR where + decodeOgmios = decodeResult decodeAeson + +decodePoolParameters :: Object Aeson -> Either JsonDecodeError PoolParameters +decodePoolParameters objParams = do + vrfKeyhash <- decodeVRFKeyHash =<< objParams .: "vrfVerificationKeyHash" + pledge <- objParams .: "pledge" >>= aesonObject (\obj -> obj .: "lovelace") + cost <- objParams .: "cost" >>= aesonObject (\obj -> obj .: "lovelace") + margin <- decodeUnitInterval =<< objParams .: "margin" + rewardAccount <- objParams .: "rewardAccount" + poolOwners <- objParams .: "owners" + relayArr <- objParams .: "relays" + relays <- for relayArr decodeRelay + poolMetadata <- objParams .:? "metadata" >>= traverse decodePoolMetadata + pure + { vrfKeyhash + , pledge + , cost + , margin + , rewardAccount + , poolOwners + , relays + , poolMetadata + } + +decodeVRFKeyHash :: Aeson -> Either JsonDecodeError VRFKeyHash +decodeVRFKeyHash = aesonString $ \vrfKeyhashHex -> do + vrfKeyhashBytes <- note (TypeMismatch "VRFKeyHash") $ hexToByteArray + vrfKeyhashHex + note (TypeMismatch "VRFKeyHash") $ VRFKeyHash <$> fromBytes + (wrap vrfKeyhashBytes) + decodeUnitInterval :: Aeson -> Either JsonDecodeError UnitInterval decodeUnitInterval aeson = do str <- decodeAeson aeson @@ -618,6 +768,9 @@ decodePoolMetadata aeson = do type RedeemerPointer = { redeemerTag :: RedeemerTag, redeemerIndex :: Natural } +showRedeemerPointer :: RedeemerPointer -> String +showRedeemerPointer ptr = show ptr.redeemerTag <> ":" <> show ptr.redeemerIndex + type ExecutionUnits = { memory :: Natural, steps :: Natural } newtype TxEvaluationR = TxEvaluationR @@ -629,9 +782,10 @@ derive instance Generic TxEvaluationR _ instance Show TxEvaluationR where show = genericShow -instance DecodeAeson TxEvaluationR where - decodeAeson aeson = (wrap <<< Right <$> decodeAeson aeson) <|> - (wrap <<< Left <$> decodeAeson aeson) +instance DecodeOgmios TxEvaluationR where + decodeOgmios = decodeErrorOrResult + { parseError: map (wrap <<< Left) <<< decodeAeson } + { parseResult: map (wrap <<< Right) <<< decodeAeson } newtype TxEvaluationResult = TxEvaluationResult (Map RedeemerPointer ExecutionUnits) @@ -643,21 +797,20 @@ instance Show TxEvaluationResult where show = genericShow instance DecodeAeson TxEvaluationResult where - decodeAeson = aesonObject $ \obj -> do - rdmrPtrExUnitsList :: Array (String /\ Aeson) <- - ForeignObject.toUnfoldable <$> getField obj "EvaluationResult" + decodeAeson = aesonArray $ \array -> do TxEvaluationResult <<< Map.fromFoldable <$> - traverse decodeRdmrPtrExUnitsItem rdmrPtrExUnitsList + traverse decodeRdmrPtrExUnitsItem array + where decodeRdmrPtrExUnitsItem - :: String /\ Aeson - -> Either JsonDecodeError (RedeemerPointer /\ ExecutionUnits) - decodeRdmrPtrExUnitsItem (redeemerPtrRaw /\ exUnitsAeson) = do - redeemerPtr <- decodeRedeemerPointer redeemerPtrRaw - flip aesonObject exUnitsAeson $ \exUnitsObj -> do - memory <- getField exUnitsObj "memory" - steps <- getField exUnitsObj "steps" - pure $ redeemerPtr /\ { memory, steps } + :: Aeson -> Either JsonDecodeError (RedeemerPointer /\ ExecutionUnits) + decodeRdmrPtrExUnitsItem elem = do + res + :: { validator :: String + , budget :: { memory :: Natural, cpu :: Natural } + } <- decodeAeson elem + redeemerPtr <- decodeRedeemerPointer res.validator + pure $ redeemerPtr /\ { memory: res.budget.memory, steps: res.budget.cpu } redeemerPtrTypeMismatch :: JsonDecodeError redeemerPtrTypeMismatch = TypeMismatch @@ -678,19 +831,26 @@ type OgmiosScript = String type OgmiosTxId = String type OgmiosTxIn = { txId :: OgmiosTxId, index :: Int } +-- | Reason a script failed. +-- +-- The type definition is a least common denominator between Ogmios v6 format used by ogmios backend +-- and ogmios v5.6 format used by blockfrost backend data ScriptFailure = ExtraRedeemers (Array RedeemerPointer) | MissingRequiredDatums - { provided :: Maybe (Array OgmiosDatum), missing :: Array OgmiosDatum } + { missing :: (Array OgmiosDatum) + , provided :: Maybe (Array OgmiosDatum) + } | MissingRequiredScripts - { resolved :: Map RedeemerPointer OgmiosScript - , missing :: Array OgmiosScript + { missing :: Array RedeemerPointer + , resolved :: Maybe (Map RedeemerPointer ScriptHash) } | ValidatorFailed { error :: String, traces :: Array String } - | UnknownInputReferencedByRedeemer OgmiosTxIn + | UnknownInputReferencedByRedeemer (Array OgmiosTxIn) | NonScriptInputReferencedByRedeemer OgmiosTxIn + | NoCostModelForLanguage (Array String) + | InternalLedgerTypeConversionError String | IllFormedExecutionBudget (Maybe ExecutionUnits) - | NoCostModelForLanguage String derive instance Generic ScriptFailure _ @@ -699,11 +859,11 @@ instance Show ScriptFailure where -- The following cases are fine to fall through into unparsed error: -- IncompatibleEra --- AdditionalUtxoOverlap -- NotEnoughSynced -- CannotCreateEvaluationContext data TxEvaluationFailure = UnparsedError String + | AdditionalUtxoOverlap (Array OgmiosTxOutRef) | ScriptFailures (Map RedeemerPointer (Array ScriptFailure)) derive instance Generic TxEvaluationFailure _ @@ -711,93 +871,93 @@ derive instance Generic TxEvaluationFailure _ instance Show TxEvaluationFailure where show = genericShow -type ObjectParser = ReaderT (Object Aeson) (Either JsonDecodeError) - -liftField - :: forall (a :: Type) (b :: Type) - . DecodeAeson a - => String - -> (a -> Either JsonDecodeError b) - -> ObjectParser b -liftField f act = ReaderT (flip getField f >=> act) - instance DecodeAeson ScriptFailure where - decodeAeson = aesonObject $ runReaderT cases - where - cases :: ObjectParser ScriptFailure - cases = decodeExtraRedeemers - <|> decodeMissingRequiredDatums - <|> decodeMissingRequiredScripts - <|> decodeValidatorFailed - <|> decodeUnknownInputReferencedByRedeemer - <|> decodeNonScriptInputReferencedByRedeemer - <|> decodeIllFormedExecutionBudget - <|> decodeNoCostModelForLanguage - <|> defaultCase - - defaultCase :: ObjectParser ScriptFailure - defaultCase = ReaderT $ const $ Left $ TypeMismatch "Expected ScriptFailure" - - decodeExtraRedeemers :: ObjectParser ScriptFailure - decodeExtraRedeemers = ExtraRedeemers <$> liftField "extraRedeemers" - (traverse decodeRedeemerPointer) - - decodeMissingRequiredDatums :: ObjectParser ScriptFailure - decodeMissingRequiredDatums = liftField "missingRequiredDatums" \o -> do - pure $ MissingRequiredDatums o - - decodeMissingRequiredScripts :: ObjectParser ScriptFailure - decodeMissingRequiredScripts = liftField "missingRequiredScripts" \o -> do - resolvedKV <- ForeignObject.toUnfoldable <$> getField o "resolved" - resolved <- Map.fromFoldable <$> for (resolvedKV :: Array _) - \(k /\ v) -> (_ /\ v) <$> decodeRedeemerPointer k - missing <- getField o "missing" - pure $ MissingRequiredScripts { resolved, missing } - - decodeValidatorFailed :: ObjectParser ScriptFailure - decodeValidatorFailed = liftField "validatorFailed" \o -> do - pure $ ValidatorFailed o - - decodeUnknownInputReferencedByRedeemer :: ObjectParser ScriptFailure - decodeUnknownInputReferencedByRedeemer = liftField - "unknownInputReferencedByRedeemer" - \o -> do - pure $ UnknownInputReferencedByRedeemer o - - decodeNonScriptInputReferencedByRedeemer :: ObjectParser ScriptFailure - decodeNonScriptInputReferencedByRedeemer = liftField - "nonScriptInputReferencedByRedeemer" - \o -> do - pure $ NonScriptInputReferencedByRedeemer o - - decodeIllFormedExecutionBudget :: ObjectParser ScriptFailure - decodeIllFormedExecutionBudget = liftField "illFormedExecutionBudget" \o -> - do - pure $ IllFormedExecutionBudget o - - decodeNoCostModelForLanguage :: ObjectParser ScriptFailure - decodeNoCostModelForLanguage = liftField "noCostModelForLanguage" \o -> do - pure $ NoCostModelForLanguage o + decodeAeson aeson = do + err :: OgmiosError <- decodeAeson aeson + let error = unwrap err + errorData <- maybe (Left (AtKey "data" MissingValue)) pure error.data + case error.code of + 3011 -> do + res :: { missingScripts :: Array String } <- decodeAeson errorData + missing <- traverse decodeRedeemerPointer res.missingScripts + pure $ MissingRequiredScripts { missing: missing, resolved: Nothing } + 3012 -> do + res :: { validationError :: String, traces :: Array String } <- + decodeAeson errorData + pure $ ValidatorFailed + { error: res.validationError, traces: res.traces } + 3013 -> do + res + :: { unsuitableOutputReference :: + { transaction :: { id :: String }, index :: Int } + } <- decodeAeson errorData + pure $ NonScriptInputReferencedByRedeemer + { index: res.unsuitableOutputReference.index + , txId: res.unsuitableOutputReference.transaction.id + } + 3110 -> do + res :: { extraneousRedeemers :: Array String } <- decodeAeson errorData + ExtraRedeemers <$> traverse decodeRedeemerPointer + res.extraneousRedeemers + 3111 -> do + res :: { missingDatums :: Array String } <- decodeAeson errorData + pure $ MissingRequiredDatums + { missing: res.missingDatums, provided: Nothing } + 3117 -> do + res + :: { unknownOutputReferences :: + Array { transaction :: { id :: String }, index :: Int } + } <- decodeAeson errorData + pure $ UnknownInputReferencedByRedeemer $ + map (\x -> { index: x.index, txId: x.transaction.id }) + res.unknownOutputReferences + 3115 -> do + res :: { missingCostModels :: Array String } <- decodeAeson errorData + pure $ NoCostModelForLanguage res.missingCostModels + -- this would actually fail at decoding error.data but it's good + 3999 -> pure $ InternalLedgerTypeConversionError error.message + _ -> Left $ TypeMismatch $ "Unknown ogmios error code: " <> show + error.code instance DecodeAeson TxEvaluationFailure where - decodeAeson = aesonObject $ runReaderT cases + decodeAeson aeson = do + error :: OgmiosError <- decodeAeson aeson + let code = (unwrap error).code + errorData <- maybe (Left (AtKey "data" MissingValue)) pure + (unwrap error).data + case code of + -- ScriptExecutionFailure + 3010 -> flip aesonArray errorData $ + ( \array -> + ( ScriptFailures <<< map Array.fromFoldable <<< collectIntoMap <$> + traverse parseElem array + ) + ) + -- Overlapping AdditionalUtxo + 3002 -> do + res + :: { overlappingOutputReferences :: + Array { transaction :: { id :: String }, index :: UInt } + } <- decodeAeson errorData + pure $ AdditionalUtxoOverlap $ map + (\elem -> { txId: elem.transaction.id, index: elem.index }) + res.overlappingOutputReferences + -- All other errors + _ -> pure $ UnparsedError $ stringifyAeson aeson + where - cases :: ObjectParser TxEvaluationFailure - cases = decodeScriptFailures <|> defaultCase - - defaultCase :: ObjectParser TxEvaluationFailure - defaultCase = ReaderT \o -> - pure (UnparsedError (stringifyAeson (encodeAeson o))) - - decodeScriptFailures :: ObjectParser TxEvaluationFailure - decodeScriptFailures = ReaderT \o -> do - scriptFailuresKV <- ForeignObject.toUnfoldable - <$> (getField o "EvaluationFailure" >>= flip getField "ScriptFailures") - scriptFailures <- Map.fromFoldable <$> for (scriptFailuresKV :: Array _) - \(k /\ v) -> do - v' <- decodeAeson v - (_ /\ v') <$> decodeRedeemerPointer k - pure $ ScriptFailures scriptFailures + parseElem elem = do + res :: { validator :: String, error :: ScriptFailure } <- decodeAeson elem + (_ /\ res.error) <$> decodeRedeemerPointer res.validator + + collectIntoMap :: forall k v. Ord k => Array (k /\ v) -> Map k (List v) + collectIntoMap = foldl + ( \m (k /\ v) -> Map.alter + (maybe (Just $ List.singleton v) (Just <<< List.Cons v)) + k + m + ) + Map.empty ---------------- PROTOCOL PARAMETERS QUERY RESPONSE & PARSING @@ -834,41 +994,48 @@ rationalToSubcoin (PParamRational rat) = do -- | A type that corresponds to Ogmios response. type ProtocolParametersRaw = { "minFeeCoefficient" :: UInt - , "minFeeConstant" :: UInt - , "maxBlockBodySize" :: UInt - , "maxBlockHeaderSize" :: UInt - , "maxTxSize" :: UInt - , "stakeKeyDeposit" :: BigInt - , "poolDeposit" :: BigInt - , "poolRetirementEpochBound" :: BigInt - , "desiredNumberOfPools" :: UInt - , "poolInfluence" :: PParamRational + , "minFeeConstant" :: + { "lovelace" :: UInt } + , "minUtxoDepositCoefficient" :: BigInt + , "maxBlockBodySize" :: + { "bytes" :: UInt } + , "maxBlockHeaderSize" :: + { "bytes" :: UInt } + , "maxTransactionSize" :: + { "bytes" :: UInt } + , "maxValueSize" :: + { "bytes" :: UInt } + , "stakeCredentialDeposit" :: + { "lovelace" :: BigInt } + , "stakePoolDeposit" :: + { "lovelace" :: BigInt } + , "stakePoolRetirementEpochBound" :: BigInt + , "desiredNumberOfStakePools" :: UInt + , "stakePoolPledgeInfluence" :: PParamRational , "monetaryExpansion" :: PParamRational , "treasuryExpansion" :: PParamRational - , "protocolVersion" :: + , "version" :: { "major" :: UInt , "minor" :: UInt } - , "minPoolCost" :: BigInt - , "coinsPerUtxoByte" :: Maybe BigInt - , "coinsPerUtxoWord" :: Maybe BigInt - , "costModels" :: - { "plutus:v1" :: { | CostModelV1 } - , "plutus:v2" :: Maybe { | CostModelV2 } + , "minStakePoolCost" :: + { "lovelace" :: BigInt } + , "plutusCostModels" :: + { "plutus:v1" :: Array Csl.Int + , "plutus:v2" :: Maybe (Array Csl.Int) } - , "prices" :: + , "scriptExecutionPrices" :: { "memory" :: PParamRational - , "steps" :: PParamRational + , "cpu" :: PParamRational } , "maxExecutionUnitsPerTransaction" :: { "memory" :: BigInt - , "steps" :: BigInt + , "cpu" :: BigInt } , "maxExecutionUnitsPerBlock" :: { "memory" :: BigInt - , "steps" :: BigInt + , "cpu" :: BigInt } - , "maxValueSize" :: UInt , "collateralPercentage" :: UInt , "maxCollateralInputs" :: UInt } @@ -886,56 +1053,55 @@ instance DecodeAeson OgmiosProtocolParameters where decodeAeson aeson = do ps :: ProtocolParametersRaw <- decodeAeson aeson prices <- decodePrices ps - coinsPerUtxoUnit <- - maybe - (Left $ AtKey "coinsPerUtxoByte or coinsPerUtxoWord" $ MissingValue) - pure - $ (CoinsPerUtxoByte <<< Coin <$> ps.coinsPerUtxoByte) <|> - (CoinsPerUtxoWord <<< Coin <$> ps.coinsPerUtxoWord) pure $ OgmiosProtocolParameters $ ProtocolParameters - { protocolVersion: ps.protocolVersion.major /\ ps.protocolVersion.minor + { protocolVersion: ps.version.major /\ ps.version.minor -- The following two parameters were removed from Babbage , decentralization: zero , extraPraosEntropy: Nothing - , maxBlockHeaderSize: ps.maxBlockHeaderSize - , maxBlockBodySize: ps.maxBlockBodySize - , maxTxSize: ps.maxTxSize - , txFeeFixed: ps.minFeeConstant + , maxBlockHeaderSize: ps.maxBlockHeaderSize.bytes + , maxBlockBodySize: ps.maxBlockBodySize.bytes + , maxTxSize: ps.maxTransactionSize.bytes + , txFeeFixed: ps.minFeeConstant.lovelace , txFeePerByte: ps.minFeeCoefficient - , stakeAddressDeposit: Coin ps.stakeKeyDeposit - , stakePoolDeposit: Coin ps.poolDeposit - , minPoolCost: Coin ps.minPoolCost - , poolRetireMaxEpoch: Epoch ps.poolRetirementEpochBound - , stakePoolTargetNum: ps.desiredNumberOfPools - , poolPledgeInfluence: unwrap ps.poolInfluence + , stakeAddressDeposit: Coin ps.stakeCredentialDeposit.lovelace + , stakePoolDeposit: Coin ps.stakePoolDeposit.lovelace + , minPoolCost: Coin ps.minStakePoolCost.lovelace + , poolRetireMaxEpoch: Epoch ps.stakePoolRetirementEpochBound + , stakePoolTargetNum: ps.desiredNumberOfStakePools + , poolPledgeInfluence: unwrap ps.stakePoolPledgeInfluence , monetaryExpansion: unwrap ps.monetaryExpansion , treasuryCut: unwrap ps.treasuryExpansion -- Rational - , coinsPerUtxoUnit: coinsPerUtxoUnit + , coinsPerUtxoUnit: CoinsPerUtxoByte (Coin ps.minUtxoDepositCoefficient) , costModels: Costmdls $ Map.fromFoldable $ catMaybes [ pure - (PlutusV1 /\ convertPlutusV1CostModel ps.costModels."plutus:v1") - , (PlutusV2 /\ _) <<< convertPlutusV2CostModel <$> - ps.costModels."plutus:v2" + ( PlutusV1 /\ CostModel + ps.plutusCostModels."plutus:v1" + ) + , (PlutusV2 /\ _) <<< CostModel <$> + ps.plutusCostModels."plutus:v2" ] , prices: prices , maxTxExUnits: decodeExUnits ps.maxExecutionUnitsPerTransaction , maxBlockExUnits: decodeExUnits ps.maxExecutionUnitsPerBlock - , maxValueSize: ps.maxValueSize + , maxValueSize: ps.maxValueSize.bytes , collateralPercent: ps.collateralPercentage , maxCollateralInputs: ps.maxCollateralInputs } where decodeExUnits - :: { memory :: BigInt, steps :: BigInt } -> ExUnits - decodeExUnits { memory, steps } = { mem: memory, steps } + :: { memory :: BigInt, cpu :: BigInt } -> ExUnits + decodeExUnits { memory, cpu } = { mem: memory, steps: cpu } decodePrices :: ProtocolParametersRaw -> Either JsonDecodeError ExUnitPrices decodePrices ps = note (TypeMismatch "ExUnitPrices") do - memPrice <- rationalToSubcoin ps.prices.memory - stepPrice <- rationalToSubcoin ps.prices.steps + memPrice <- rationalToSubcoin ps.scriptExecutionPrices.memory + stepPrice <- rationalToSubcoin ps.scriptExecutionPrices.cpu pure { memPrice, stepPrice } -- ExUnits +instance DecodeOgmios OgmiosProtocolParameters where + decodeOgmios = decodeResult decodeAeson + ---------------- CHAIN TIP QUERY RESPONSE & PARSING data ChainTipQR @@ -952,6 +1118,9 @@ instance DecodeAeson ChainTipQR where r :: (ChainOrigin |+| ChainPoint) <- decodeAeson j pure $ either CtChainOrigin CtChainPoint $ toEither1 r +instance DecodeOgmios ChainTipQR where + decodeOgmios = decodeResult decodeAeson + -- | A Blake2b 32-byte digest of an era-independent block header, serialized as -- CBOR in base16 newtype OgmiosBlockHeaderHash = OgmiosBlockHeaderHash String @@ -980,13 +1149,9 @@ instance Show ChainOrigin where type ChainPoint = { slot :: Slot -- See https://github.com/Plutonomicon/cardano-transaction-lib/issues/632 -- for details on why we lose a negligible amount of precision. - , hash :: OgmiosBlockHeaderHash + , id :: OgmiosBlockHeaderHash } ----------------- POOL ID RESPONSE - -type PoolIdsR = Array PoolPubKeyHash - ---------------- ADDITIONAL UTXO MAP REQUEST newtype AdditionalUtxoSet = AdditionalUtxoSet OgmiosUtxoMap @@ -995,6 +1160,20 @@ derive instance Newtype AdditionalUtxoSet _ derive newtype instance Show AdditionalUtxoSet +-- Ogmios tx input +type OgmiosTxOutRef = + { txId :: String + , index :: UInt.UInt + } + +type OgmiosTxOut = + { address :: OgmiosAddress + , value :: Value + , datumHash :: Maybe String + , datum :: Maybe String + , script :: Maybe ScriptRef + } + type OgmiosUtxoMap = Map OgmiosTxOutRef OgmiosTxOut instance EncodeAeson AdditionalUtxoSet where @@ -1007,99 +1186,64 @@ instance EncodeAeson AdditionalUtxoSet where encode :: (OgmiosTxOutRef /\ OgmiosTxOut) -> Aeson encode (inp /\ out) = encodeAeson $ - { "txId": inp.txId + { "transaction": { "id": inp.txId } , "index": inp.index + , "address": out.address + , "datumHash": out.datumHash + , "datum": out.datum + , "script": encodeScriptRef <$> out.script + , "value": encodeValue out.value } - /\ - { "address": out.address - , "datumHash": out.datumHash - , "datum": out.datum - , "script": encodeScriptRef <$> out.script - , "value": - { "coins": out.value # valueToCoin # getLovelace - , "assets": out.value # getNonAdaAsset # encodeNonAdaAsset - } - } encodeNativeScript :: NativeScript -> Aeson - encodeNativeScript (ScriptPubkey s) = encodeAeson s + encodeNativeScript (ScriptPubkey s) = + encodeAeson { "clause": "signature", "from": encodeAeson s } encodeNativeScript (ScriptAll ss) = - encodeAeson { "all": encodeNativeScript <$> ss } + encodeAeson { "clause": "all", "from": encodeNativeScript <$> ss } encodeNativeScript (ScriptAny ss) = - encodeAeson { "any": encodeNativeScript <$> ss } + encodeAeson { "clause": "any", "from": encodeNativeScript <$> ss } encodeNativeScript (ScriptNOfK n ss) = - encodeAeson $ - ForeignObject.singleton - (BigInt.toString $ BigInt.fromInt n) - (encodeNativeScript <$> ss) - encodeNativeScript (TimelockStart (Slot n)) = encodeAeson { "startsAt": n } - encodeNativeScript (TimelockExpiry (Slot n)) = encodeAeson - { "expiresAt": n } + encodeAeson + { "clause": "some" + , "atLeast": BigInt.fromInt n + , "from": encodeNativeScript <$> ss + } + encodeNativeScript (TimelockStart (Slot n)) = + encodeAeson { "clause": "after", "slot": n } + encodeNativeScript (TimelockExpiry (Slot n)) = + encodeAeson { "clause": "before", "slot": n } encodeScriptRef :: ScriptRef -> Aeson encodeScriptRef (NativeScriptRef s) = - encodeAeson { "native": encodeNativeScript s } + encodeAeson $ + { "language": "native" + -- NOTE: We omit the cbor argument. + , "json": (encodeNativeScript s) + } encodeScriptRef (PlutusScriptRef (PlutusScript (s /\ PlutusV1))) = - encodeAeson { "plutus:v1": s } + encodeAeson { "language": "plutus:v1", "cbor": byteArrayToHex s } encodeScriptRef (PlutusScriptRef (PlutusScript (s /\ PlutusV2))) = - encodeAeson { "plutus:v2": s } + encodeAeson { "language": "plutus:v2", "cbor": byteArrayToHex s } - encodeNonAdaAsset :: NonAdaAsset -> Aeson - encodeNonAdaAsset assets = encodeMap $ - foldl - (\m' (cs /\ tn /\ n) -> Map.insert (createKey cs tn) n m') - Map.empty - (flattenNonAdaValue assets) + encodeValue :: Value -> Aeson + encodeValue value = encodeMap $ map encodeMap $ Map.union adaPart nonAdaPart where - createKey cs tn = - if tn' == mempty then csHex else csHex <> "." <> tnHex - where - tn' = getTokenName tn - cs' = getCurrencySymbol cs - csHex = byteArrayToHex cs' - tnHex = byteArrayToHex tn' - ----------------- UTXO QUERY RESPONSE & PARSING - --- the outer result type for Utxo queries, newtyped so that it can have --- appropriate instances to work with `parseJsonWspResponse` --- | Ogmios response for Utxo Query -newtype UtxoQR = UtxoQR UtxoQueryResult - -derive instance Newtype UtxoQR _ -derive newtype instance Show UtxoQR - -instance DecodeAeson UtxoQR where - decodeAeson = map UtxoQR <<< parseUtxoQueryResult - --- the inner type for Utxo Queries -type UtxoQueryResult = Map.Map OgmiosTxOutRef OgmiosTxOut - --- Ogmios tx input -type OgmiosTxOutRef = - { txId :: String - , index :: UInt.UInt - } - -parseUtxoQueryResult :: Aeson -> Either JsonDecodeError UtxoQueryResult -parseUtxoQueryResult = aesonArray $ foldl insertFunc (Right Map.empty) - where - insertFunc - :: Either JsonDecodeError UtxoQueryResult - -> Aeson - -> Either JsonDecodeError UtxoQueryResult - insertFunc acc = aesonArray inner - where - inner :: Array Aeson -> Either JsonDecodeError UtxoQueryResult - inner innerArray = do - txOutRefJson <- - note (TypeMismatch "missing 0th element, expected an OgmiosTxOutRef") $ - index innerArray 0 - txOutJson <- note (TypeMismatch "missing 1st element, expected a TxOut") $ - index innerArray 1 - txOutRef <- parseTxOutRef txOutRefJson - txOut <- parseTxOut txOutJson - Map.insert txOutRef txOut <$> acc + adaPart = Map.fromFoldable + [ ( "ada" /\ + ( Map.fromFoldable + [ ("lovelace" /\ (value # valueToCoin # getLovelace)) ] + ) + ) + ] + nonAdaPart = mapKeys (byteArrayToHex <<< getCurrencySymbol) + $ map (mapKeys (byteArrayToHex <<< getTokenName)) + $ unwrapNonAdaAsset + $ getNonAdaAsset value + + mapKeys :: forall k1 k2 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a + mapKeys f = (Map.toUnfoldable :: Map k1 a -> Array (k1 /\ a)) >>> foldl + (\m' (k /\ v) -> Map.insert (f k) v m') + Map.empty -- helper for assuming we get an object aesonObject @@ -1117,151 +1261,17 @@ aesonArray -> Either JsonDecodeError a aesonArray = caseAesonArray (Left (TypeMismatch "Expected Array")) --- parser for txOutRef -parseTxOutRef :: Aeson -> Either JsonDecodeError OgmiosTxOutRef -parseTxOutRef = aesonObject $ \o -> do - txId <- getField o "txId" - index <- getField o "index" - pure { txId, index } - -type OgmiosTxOut = - { address :: OgmiosAddress - , value :: Value - , datumHash :: Maybe String - , datum :: Maybe String - , script :: Maybe ScriptRef - } +-- Helper that decodes a string +aesonString + :: forall (a :: Type) + . (String -> Either JsonDecodeError a) + -> Aeson + -> Either JsonDecodeError a +aesonString = caseAesonString (Left (TypeMismatch "Expected String")) --- Ogmios currently supplies the Raw OgmiosAddress in addr1 format, rather than the --- cardano-serialization-lib 'OgmiosAddress' type, perhaps this information can be --- extracted. -parseTxOut :: Aeson -> Either JsonDecodeError OgmiosTxOut -parseTxOut = aesonObject $ \o -> do - address <- getField o "address" - value <- parseValue o - datumHash <- getFieldOptional' o "datumHash" - datum <- getFieldOptional' o "datum" - script <- parseScript o - pure { address, value, datumHash, datum, script } - -parseScript :: Object Aeson -> Either JsonDecodeError (Maybe ScriptRef) -parseScript outer = - getFieldOptional' outer "script" >>= case _ of - Nothing -> pure Nothing - Just script -> do - case (Array.head $ ForeignObject.toUnfoldable script) of - Just ("plutus:v1" /\ plutusScript) -> - Just <$> parsePlutusScriptWithLang PlutusV1 plutusScript - - Just ("plutus:v2" /\ plutusScript) -> - Just <$> parsePlutusScriptWithLang PlutusV2 plutusScript - - Just ("native" /\ nativeScript) -> - Just <<< NativeScriptRef <$> parseNativeScript nativeScript - - _ -> - Left $ TypeMismatch $ - "Expected native or Plutus script, got: " <> show script - where - parsePlutusScriptWithLang - :: Language -> Aeson -> Either JsonDecodeError ScriptRef - parsePlutusScriptWithLang lang aeson = do - let - scriptTypeMismatch :: JsonDecodeError - scriptTypeMismatch = TypeMismatch - $ "Expected hex-encoded Plutus script, got: " <> show aeson - - aeson # caseAesonString (Left scriptTypeMismatch) - \hexEncodedScript -> do - scriptBytes <- note scriptTypeMismatch (hexToByteArray hexEncodedScript) - pure $ PlutusScriptRef $ PlutusScript (scriptBytes /\ lang) - - parseNativeScript :: Aeson -> Either JsonDecodeError NativeScript - parseNativeScript aeson - | isString aeson = do - let - pubKeyHashTypeMismatch :: JsonDecodeError - pubKeyHashTypeMismatch = TypeMismatch - $ "Expected hex-encoded pub key hash, got: " <> show aeson - - pubKeyHashHex :: String - pubKeyHashHex = unsafePartial fromJust $ toString aeson - - ScriptPubkey <$> note pubKeyHashTypeMismatch - (ed25519KeyHashFromBytes =<< hexToByteArray pubKeyHashHex) - - | otherwise = aeson # aesonObject \obj -> do - let - scriptTypeMismatch :: JsonDecodeError - scriptTypeMismatch = TypeMismatch - $ "Expected native script, got: " <> show aeson - - case (Array.head $ ForeignObject.toUnfoldable obj) of - Just ("any" /\ scripts) -> - scripts # aesonArray (map ScriptAny <<< traverse parseNativeScript) - - Just ("all" /\ scripts) -> - scripts # aesonArray (map ScriptAll <<< traverse parseNativeScript) - - Just ("expiresAt" /\ slot) -> - TimelockExpiry <$> decodeAeson slot - - Just ("startsAt" /\ slot) -> - TimelockStart <$> decodeAeson slot - - Just (atLeast /\ scripts) -> do - n <- note scriptTypeMismatch (Int.fromString atLeast) - scripts # aesonArray - (map (ScriptNOfK n) <<< traverse parseNativeScript) - - _ -> Left scriptTypeMismatch - --- parses the `Value` type -parseValue :: Object Aeson -> Either JsonDecodeError Value -parseValue outer = do - o <- getField outer "value" - coins <- getField o "coins" - <|> Left (TypeMismatch "Expected 'coins' to be an Int or a BigInt") - Assets assetsMap <- fromMaybe (Assets Map.empty) - <$> getFieldOptional o "assets" - pure $ mkValue (wrap coins) (mkNonAdaAsset assetsMap) - -newtype Assets = Assets (Map CurrencySymbol (Map TokenName BigInt)) - -instance DecodeAeson Assets where - decodeAeson j = do - wspAssets :: Array (String /\ BigInt) <- - ForeignObject.toUnfoldable <$> decodeAeson j - Assets <<< Map.fromFoldableWith (Map.unionWith (+)) <$> sequence - (uncurry decodeAsset <$> wspAssets) - where - decodeAsset - :: String - -> BigInt - -> Either JsonDecodeError (CurrencySymbol /\ Map TokenName BigInt) - decodeAsset assetStr quantity = do - let - -- Ogmios encodes CurrencySymbol and TokenName to hex strings separated - -- with '.' TokenName part is optional - currSymStr /\ tnStr = case indexOf (Pattern ".") assetStr of - Nothing -> assetStr /\ "" - Just ix -> - let - { before, after } = splitAt ix assetStr - tn = fromMaybe "" $ after # uncons <#> _.tail - in - before /\ tn - - currSymb <- note (assetStrError assetStr "CurrencySymbol" currSymStr) - $ mkCurrencySymbol =<< hexToByteArray currSymStr - tokenName <- note (assetStrError assetStr "TokenName" tnStr) - $ mkTokenName =<< hexToByteArray tnStr - pure $ currSymb /\ Map.singleton tokenName quantity - - assetStrError str t v = TypeMismatch $ - "In " - <> str - <> ": Expected hex-encoded " - <> t - <> ", got: " - <> v +-- Helper that decodes a null +aesonNull + :: forall (a :: Type) + . Aeson + -> Either JsonDecodeError Unit +aesonNull = caseAesonNull (Left (TypeMismatch "Expected Null")) pure diff --git a/src/Internal/QueryM/Pools.purs b/src/Internal/QueryM/Pools.purs index 1f785cc0f..8f17cb1f3 100644 --- a/src/Internal/QueryM/Pools.purs +++ b/src/Internal/QueryM/Pools.purs @@ -1,6 +1,7 @@ module Ctl.Internal.QueryM.Pools ( getPoolIds , getPoolParameters + , getPoolsParameters , getPubKeyHashDelegationsAndRewards , getValidatorHashDelegationsAndRewards , module X @@ -16,12 +17,11 @@ import Ctl.Internal.Helpers (liftM) import Ctl.Internal.QueryM (QueryM, mkOgmiosRequest) import Ctl.Internal.QueryM.Ogmios ( DelegationsAndRewardsR(DelegationsAndRewardsR) - , PoolParametersR(PoolParametersR) + , PoolParameters ) import Ctl.Internal.QueryM.Ogmios as Ogmios import Ctl.Internal.Serialization.Hash - ( ed25519KeyHashToBech32 - , ed25519KeyHashToBech32Unsafe + ( ed25519KeyHashToBech32Unsafe , ed25519KeyHashToBytes , scriptHashToBech32Unsafe , scriptHashToBytes @@ -31,37 +31,49 @@ import Ctl.Internal.Types.DelegationsAndRewards (DelegationsAndRewards) import Ctl.Internal.Types.DelegationsAndRewards (DelegationsAndRewards) as X import Ctl.Internal.Types.PubKeyHash (StakePubKeyHash) import Ctl.Internal.Types.Scripts (StakeValidatorHash) +import Data.Map (Map) import Data.Map as Map -import Data.Maybe (Maybe) +import Data.Maybe (Maybe(Nothing, Just)) import Data.Newtype (unwrap, wrap) +import Data.Tuple (fst) import Effect.Exception (error) import Record.Builder (build, merge) +-- | Get pool parameters of all pools or of the provided pools. +getStakePools + :: (Maybe (Array PoolPubKeyHash)) + -> QueryM (Map PoolPubKeyHash PoolParameters) +getStakePools selected = unwrap <$> + mkOgmiosRequest Ogmios.queryStakePoolsCall + _.stakePools + (wrap selected) + getPoolIds :: QueryM (Array PoolPubKeyHash) -getPoolIds = mkOgmiosRequest Ogmios.queryPoolIdsCall - _.poolIds - unit +getPoolIds = (Map.toUnfoldableUnordered >>> map fst) <$> + getStakePools Nothing --- TODO: batched variant getPoolParameters :: PoolPubKeyHash -> QueryM PoolRegistrationParams getPoolParameters poolPubKeyHash = do - PoolParametersR params <- mkOgmiosRequest Ogmios.queryPoolParameters - _.poolParameters - [ poolPubKeyHash ] - poolIdStr <- - liftM (error "Unable to encode pool pubkey hash to bech32") - $ ed25519KeyHashToBech32 "pool" - $ unwrap poolPubKeyHash + params <- getPoolsParameters [ poolPubKeyHash ] res <- liftM (error "Unable to find pool ID in the response") $ Map.lookup - poolIdStr + poolPubKeyHash params - pure $ build - ( merge - { operator: poolPubKeyHash - , poolOwners: res.poolOwners <#> wrap >>> wrap - } + pure res + +getPoolsParameters + :: Array PoolPubKeyHash -> QueryM (Map PoolPubKeyHash PoolRegistrationParams) +getPoolsParameters poolPubKeyHashes = do + response <- getStakePools (Just poolPubKeyHashes) + pure $ Map.mapMaybeWithKey + ( \poolPkh params -> Just $ build + ( merge + { operator: poolPkh + , poolOwners: params.poolOwners <#> wrap >>> wrap + } + ) + params ) - res + response getValidatorHashDelegationsAndRewards :: StakeValidatorHash -> QueryM (Maybe DelegationsAndRewards) diff --git a/src/Internal/QueryM/UniqueId.js b/src/Internal/QueryM/UniqueId.js index c4c2faf40..a96dee7ac 100644 --- a/src/Internal/QueryM/UniqueId.js +++ b/src/Internal/QueryM/UniqueId.js @@ -1,3 +1,5 @@ -const uniqid = require("uniqid"); +import uniqid from "uniqid"; -exports.uniqueId = str => () => uniqid(str); +export function uniqueId(str) { + return () => uniqid(str); +} diff --git a/src/Internal/ReindexRedeemers.purs b/src/Internal/ReindexRedeemers.purs deleted file mode 100644 index b69532277..000000000 --- a/src/Internal/ReindexRedeemers.purs +++ /dev/null @@ -1,64 +0,0 @@ --- | This module implements functionality to reindex redeemers to be used after --- | balancing when all inputs have been inserted to the array. -module Ctl.Internal.ReindexRedeemers - ( ReindexErrors(CannotGetTxOutRefIndexForRedeemer) - , reindexSpentScriptRedeemers - , reindexSpentScriptRedeemers' - ) where - -import Prelude - -import Ctl.Internal.Cardano.Types.Transaction (Redeemer(Redeemer)) as T -import Ctl.Internal.Types.RedeemerTag (RedeemerTag(Spend)) -import Ctl.Internal.Types.Transaction (TransactionInput) -import Data.Array (elemIndex) -import Data.BigInt (fromInt) -import Data.Either (Either(Right), note) -import Data.Generic.Rep (class Generic) -import Data.Maybe (Maybe(Just)) -import Data.Show.Generic (genericShow) -import Data.Traversable (traverse) -import Data.Tuple (fst) -import Data.Tuple.Nested (type (/\), (/\)) - --- | The only error should be impossible but we keep this here in case the user --- | decides to call this function at some point where inputs have been --- | accidentally deleted and/or not after balancing -data ReindexErrors = CannotGetTxOutRefIndexForRedeemer T.Redeemer - -derive instance Generic ReindexErrors _ - -instance Show ReindexErrors where - show = genericShow - -type RedeemersTxIn = T.Redeemer /\ Maybe TransactionInput - --- | Reindex the `Spend` redeemers. Since we insert to an ordered array, we must --- | reindex the redeemers with such inputs. This must be crucially called after --- | balancing when all inputs are in place so they cannot be reordered. -reindexSpentScriptRedeemers - :: Array TransactionInput - -> Array RedeemersTxIn - -> Either ReindexErrors (Array T.Redeemer) -reindexSpentScriptRedeemers inputs redeemersTxIns = do - redeemersTxInsReindexed <- - reindexSpentScriptRedeemers' inputs redeemersTxIns - pure $ map fst redeemersTxInsReindexed - -reindexSpentScriptRedeemers' - :: Array TransactionInput - -> Array RedeemersTxIn - -> Either ReindexErrors (Array RedeemersTxIn) -reindexSpentScriptRedeemers' inputs redeemersTxIns = - traverse (reindex inputs) redeemersTxIns - where - reindex - :: Array TransactionInput - -> RedeemersTxIn - -> Either ReindexErrors RedeemersTxIn - reindex ipts = case _ of - red@(T.Redeemer red'@{ tag: Spend }) /\ Just txOutRef -> do - index <- note (CannotGetTxOutRefIndexForRedeemer red) - (fromInt <$> elemIndex txOutRef ipts) - Right $ T.Redeemer red' { index = index } /\ Just txOutRef - mintRed /\ txOutRef -> Right $ mintRed /\ txOutRef diff --git a/src/Internal/Scripts.purs b/src/Internal/Scripts.purs index cb3bd2b7d..187fcb588 100644 --- a/src/Internal/Scripts.purs +++ b/src/Internal/Scripts.purs @@ -4,8 +4,6 @@ module Ctl.Internal.Scripts , nativeScriptStakeValidatorHash , plutusScriptStakeValidatorHash , scriptCurrencySymbol - , typedValidatorBaseAddress - , typedValidatorEnterpriseAddress , validatorHash , validatorHashBaseAddress , validatorHashEnterpriseAddress @@ -15,7 +13,9 @@ import Prelude import Ctl.Internal.Hashing (plutusScriptHash) import Ctl.Internal.NativeScripts (NativeScriptHash, nativeScriptHash) -import Ctl.Internal.Plutus.Types.CurrencySymbol (CurrencySymbol, mpsSymbol) +import Ctl.Internal.Plutus.Types.CurrencySymbol + ( CurrencySymbol(CurrencySymbol) + ) import Ctl.Internal.Serialization.Address ( Address , NetworkId @@ -25,6 +25,7 @@ import Ctl.Internal.Serialization.Address , scriptAddress , scriptHashCredential ) +import Ctl.Internal.Serialization.Hash (scriptHashToBytes) import Ctl.Internal.Types.Scripts ( MintingPolicy(NativeMintingPolicy, PlutusMintingPolicy) , MintingPolicyHash @@ -34,28 +35,11 @@ import Ctl.Internal.Types.Scripts , Validator , ValidatorHash ) -import Ctl.Internal.Types.TypedValidator (TypedValidator(TypedValidator)) -import Data.Maybe (Maybe) import Data.Newtype (unwrap, wrap) -- | Helpers for `PlutusScript` and `ScriptHash` newtype wrappers, separate from -- | the data type definitions to prevent cylic dependencies. --- | Converts a Plutus-style `TypedValidator` to an `BaseAddress` -typedValidatorBaseAddress - :: forall (a :: Type). NetworkId -> TypedValidator a -> Address -typedValidatorBaseAddress networkId (TypedValidator typedVal) = - baseAddressToAddress $ scriptAddress networkId $ unwrap typedVal.validatorHash - --- | Converts a Plutus-style `TypedValidator` to an `Address` as an --- | `EnterpriseAddress`. This is likely what you will use since Plutus --- | currently uses `scriptHashAddress` on non-staking addresses which is --- | invoked in `validatorAddress` -typedValidatorEnterpriseAddress - :: forall (a :: Type). NetworkId -> TypedValidator a -> Address -typedValidatorEnterpriseAddress network (TypedValidator typedVal) = - validatorHashEnterpriseAddress network typedVal.validatorHash - -- | Converts a Plutus-style `MintingPolicy` to an `MintingPolicyHash` mintingPolicyHash :: MintingPolicy -> MintingPolicyHash mintingPolicyHash = case _ of @@ -99,5 +83,10 @@ nativeScriptStakeValidatorHash nativeScriptStakeValidatorHash = unwrap >>> nativeScriptHash >>> unwrap >>> wrap -- | Converts a `MintingPolicy` to a `CurrencySymbol`. -scriptCurrencySymbol :: MintingPolicy -> Maybe CurrencySymbol -scriptCurrencySymbol = mpsSymbol <<< mintingPolicyHash +scriptCurrencySymbol :: MintingPolicy -> CurrencySymbol +scriptCurrencySymbol = CurrencySymbol + <<< unwrap + <<< scriptHashToBytes + <<< unwrap + <<< + mintingPolicyHash diff --git a/src/Internal/Serialization.js b/src/Internal/Serialization.js index d66f01e93..ee93d49db 100644 --- a/src/Internal/Serialization.js +++ b/src/Internal/Serialization.js @@ -2,345 +2,443 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); const setter = prop => obj => value => () => obj["set_" + prop](value); -exports.hashTransaction = body => () => lib.hash_transaction(body); - -exports.newValue = coin => () => lib.Value.new(coin); - -exports.newValueFromAssets = multiasset => () => - lib.Value.new_from_assets(multiasset); - -exports.valueSetCoin = setter("coin"); +export function hashTransaction(body) { + return () => lib.hash_transaction(body); +} -exports.newTransactionInput = transaction_id => index => () => - lib.TransactionInput.new(transaction_id, index); +export function newValue(coin) { + return () => lib.Value.new(coin); +} -exports.newTransactionInputs = () => lib.TransactionInputs.new(); +export function newValueFromAssets(multiasset) { + return () => lib.Value.new_from_assets(multiasset); +} -exports.addTransactionInput = inputs => input => () => inputs.add(input); +export const valueSetCoin = setter("coin"); -exports.newTransactionOutput = address => amount => () => - lib.TransactionOutput.new(address, amount); +export function newTransactionInput(transaction_id) { + return index => () => lib.TransactionInput.new(transaction_id, index); +} -exports.newTransactionOutputs = () => lib.TransactionOutputs.new(); +export function newTransactionInputs() { + return lib.TransactionInputs.new(); +} -exports.addTransactionOutput = outputs => output => () => outputs.add(output); +export function addTransactionInput(inputs) { + return input => () => inputs.add(input); +} -exports.newTransactionBody = inputs => outputs => fee => () => - lib.TransactionBody.new_tx_body(inputs, outputs, fee); +export function newTransactionOutput(address) { + return amount => () => lib.TransactionOutput.new(address, amount); +} -exports.setTxIsValid = tx => isValid => () => tx.set_is_valid(isValid); +export function newTransactionOutputs() { + return lib.TransactionOutputs.new(); +} -exports.newTransaction = body => witness_set => auxiliary_data => () => - lib.Transaction.new(body, witness_set, auxiliary_data); +export function addTransactionOutput(outputs) { + return output => () => outputs.add(output); +} -exports.newTransaction_ = body => witness_set => () => - lib.Transaction.new(body, witness_set); +export function newTransactionBody(inputs) { + return outputs => fee => () => + lib.TransactionBody.new_tx_body(inputs, outputs, fee); +} -exports.newTransactionUnspentOutput = input => output => () => - lib.TransactionUnspentOutput.new(input, output); +export function setTxIsValid(tx) { + return isValid => () => tx.set_is_valid(isValid); +} -exports.newMultiAsset = () => lib.MultiAsset.new(); +export function newTransaction(body) { + return witness_set => auxiliary_data => () => + lib.Transaction.new(body, witness_set, auxiliary_data); +} -exports.insertMultiAsset = multiasset => key => value => () => - multiasset.insert(key, value); +export function newTransaction_(body) { + return witness_set => () => lib.Transaction.new(body, witness_set); +} -exports.newAssets = () => lib.Assets.new(); +export function newTransactionUnspentOutput(input) { + return output => () => lib.TransactionUnspentOutput.new(input, output); +} -exports.insertAssets = assets => key => value => () => - assets.insert(key, value); +export function newMultiAsset() { + return lib.MultiAsset.new(); +} -exports.newAssetName = name => () => lib.AssetName.new(name); +export function insertMultiAsset(multiasset) { + return key => value => () => multiasset.insert(key, value); +} -exports.transactionOutputSetDataHash = setter("data_hash"); +export function newAssets() { + return lib.Assets.new(); +} -exports.transactionOutputSetPlutusData = setter("plutus_data"); +export function insertAssets(assets) { + return key => value => () => assets.insert(key, value); +} -exports.transactionOutputSetScriptRef = setter("script_ref"); +export function newAssetName(name) { + return () => lib.AssetName.new(name); +} -exports.scriptRefNewNativeScript = nativeScript => - lib.ScriptRef.new_native_script(nativeScript); +export const transactionOutputSetDataHash = setter("data_hash"); +export const transactionOutputSetPlutusData = setter("plutus_data"); +export const transactionOutputSetScriptRef = setter("script_ref"); -exports.scriptRefNewPlutusScript = plutusScript => - lib.ScriptRef.new_plutus_script(plutusScript); +export function scriptRefNewNativeScript(nativeScript) { + return lib.ScriptRef.new_native_script(nativeScript); +} -exports.newVkeywitnesses = () => lib.Vkeywitnesses.new(); +export function scriptRefNewPlutusScript(plutusScript) { + return lib.ScriptRef.new_plutus_script(plutusScript); +} -exports.makeVkeywitness = hash => key => () => lib.make_vkey_witness(hash, key); +export function newVkeywitnesses() { + return lib.Vkeywitnesses.new(); +} -exports.newVkeywitness = vkey => signature => () => - lib.Vkeywitness.new(vkey, signature); +export function makeVkeywitness(hash) { + return key => () => lib.make_vkey_witness(hash, key); +} -exports.addVkeywitness = witnesses => witness => () => witnesses.add(witness); +export function newVkeywitness(vkey) { + return signature => () => lib.Vkeywitness.new(vkey, signature); +} -exports.newVkeyFromPublicKey = public_key => () => lib.Vkey.new(public_key); +export function addVkeywitness(witnesses) { + return witness => () => witnesses.add(witness); +} -exports.publicKeyHash = pk => pk.hash(); +export function newVkeyFromPublicKey(public_key) { + return () => lib.Vkey.new(public_key); +} -exports.transactionWitnessSetSetVkeys = setter("vkeys"); +export function publicKeyHash(pk) { + return pk.hash(); +} -exports.newCostmdls = () => lib.Costmdls.new(); +export const transactionWitnessSetSetVkeys = setter("vkeys"); -exports.defaultCostmdls = () => - lib.TxBuilderConstants.plutus_vasil_cost_models(); +export function newCostmdls() { + return lib.Costmdls.new(); +} -exports.costmdlsSetCostModel = cms => lang => cm => () => cms.insert(lang, cm); +export function defaultCostmdls() { + return lib.TxBuilderConstants.plutus_vasil_cost_models(); +} -exports.newCostModel = () => lib.CostModel.new(); +export function costmdlsSetCostModel(cms) { + return lang => cm => () => cms.insert(lang, cm); +} -exports.costModelSetCost = cm => op => cost => () => cm.set(op, cost); +export function newCostModel() { + return lib.CostModel.new(); +} -exports.newPlutusV1 = () => lib.Language.new_plutus_v1(); +export function costModelSetCost(cm) { + return op => cost => () => cm.set(op, cost); +} -exports.newPlutusV2 = () => lib.Language.new_plutus_v2(); +export function newPlutusV1() { + return lib.Language.new_plutus_v1(); +} -exports._hashScriptData = rs => cms => ds => () => { - const list = lib.PlutusList.new(); - ds.forEach(d => list.add(d)); - return lib.hash_script_data(rs, cms, list); -}; +export function newPlutusV2() { + return lib.Language.new_plutus_v2(); +} -exports._hashScriptDataNoDatums = rs => cms => () => - lib.hash_script_data(rs, cms); +export function _hashScriptData(rs) { + return cms => ds => () => { + const list = lib.PlutusList.new(); + ds.forEach(d => list.add(d)); + return lib.hash_script_data(rs, cms, list); + }; +} -exports.newRedeemers = () => lib.Redeemers.new(); +export function _hashScriptDataNoDatums(rs) { + return cms => () => lib.hash_script_data(rs, cms); +} -exports.addRedeemer = rs => r => () => rs.add(r); +export function newRedeemers() { + return lib.Redeemers.new(); +} -exports.setTxBodyReferenceInputs = txBody => referenceInputs => () => - txBody.set_reference_inputs(referenceInputs); +export function addRedeemer(rs) { + return r => () => rs.add(r); +} -exports.setTxBodyScriptDataHash = setter("script_data_hash"); +export function setTxBodyReferenceInputs(txBody) { + return referenceInputs => () => txBody.set_reference_inputs(referenceInputs); +} -exports.setTxBodyMint = setter("mint"); +export const setTxBodyScriptDataHash = setter("script_data_hash"); +export const setTxBodyMint = setter("mint"); -exports.newMint = () => lib.Mint.new(); +export function newMint() { + return lib.Mint.new(); +} -exports._bigIntToInt = maybe => bigInt => { - try { - const str = bigInt.to_str(); - if (str[0] == "-") { - return maybe.just( - lib.Int.new_negative(lib.BigNum.from_str(str.slice(1))) - ); - } else { - return maybe.just(lib.Int.new(lib.BigNum.from_str(str))); +export function _bigIntToInt(maybe) { + return bigInt => { + try { + const str = bigInt.to_str(); + if (str[0] == "-") { + return maybe.just( + lib.Int.new_negative(lib.BigNum.from_str(str.slice(1))) + ); + } else { + return maybe.just(lib.Int.new(lib.BigNum.from_str(str))); + } + } catch (_) { + return maybe.nothing; } - } catch (_) { - return maybe.nothing; - } -}; - -exports.newMintAssets = lib.MintAssets.new; + }; +} -exports.insertMintAssets = mint => scriptHash => mintAssets => () => - mint.insert(scriptHash, mintAssets); +export const newMintAssets = lib.MintAssets.new; -exports.insertMintAsset = mintAssets => assetName => int => () => - mintAssets.insert(assetName, int); +export function insertMintAssets(mint) { + return scriptHash => mintAssets => () => mint.insert(scriptHash, mintAssets); +} -exports.networkIdTestnet = () => lib.NetworkId.testnet(); +export function insertMintAsset(mintAssets) { + return assetName => int => () => mintAssets.insert(assetName, int); +} -exports.networkIdMainnet = () => lib.NetworkId.mainnet(); +export function networkIdTestnet() { + return lib.NetworkId.testnet(); +} -exports.setTxBodyCollateralReturn = txBody => collateralReturn => () => - txBody.set_collateral_return(collateralReturn); +export function networkIdMainnet() { + return lib.NetworkId.mainnet(); +} -exports.setTxBodyTotalCollateral = txBody => totalCollateral => () => - txBody.set_total_collateral(totalCollateral); +export function setTxBodyCollateralReturn(txBody) { + return collateralReturn => () => + txBody.set_collateral_return(collateralReturn); +} -exports.setTxBodyTtl = setter("ttl"); +export function setTxBodyTotalCollateral(txBody) { + return totalCollateral => () => txBody.set_total_collateral(totalCollateral); +} -exports.setTxBodyCerts = setter("certs"); +export const setTxBodyTtl = setter("ttl"); +export const setTxBodyCerts = setter("certs"); -exports.newCertificates = () => lib.Certificates.new(); +export function newCertificates() { + return lib.Certificates.new(); +} -exports.newStakeRegistrationCertificate = stakeCredential => () => - lib.Certificate.new_stake_registration( - lib.StakeRegistration.new(stakeCredential) - ); +export function newStakeRegistrationCertificate(stakeCredential) { + return () => + lib.Certificate.new_stake_registration( + lib.StakeRegistration.new(stakeCredential) + ); +} -exports.newStakeDeregistrationCertificate = stakeCredential => () => - lib.Certificate.new_stake_deregistration( - lib.StakeDeregistration.new(stakeCredential) - ); +export function newStakeDeregistrationCertificate(stakeCredential) { + return () => + lib.Certificate.new_stake_deregistration( + lib.StakeDeregistration.new(stakeCredential) + ); +} -exports.newStakeDelegationCertificate = - stakeCredential => ed25519KeyHash => () => +export function newStakeDelegationCertificate(stakeCredential) { + return ed25519KeyHash => () => lib.Certificate.new_stake_delegation( lib.StakeDelegation.new(stakeCredential, ed25519KeyHash) ); +} -exports.newPoolRegistrationCertificate = - operator => - vrfKeyhash => - pledge => - cost => - margin => - reward_account => - poolOwners => - relays => - poolMetadata => - () => - lib.Certificate.new_pool_registration( - lib.PoolRegistration.new( - lib.PoolParams.new( - operator, - vrfKeyhash, - pledge, - cost, - margin, - reward_account, - poolOwners, - relays, - poolMetadata +export function newPoolRegistrationCertificate(operator) { + return vrfKeyhash => + pledge => + cost => + margin => + reward_account => + poolOwners => + relays => + poolMetadata => + () => + lib.Certificate.new_pool_registration( + lib.PoolRegistration.new( + lib.PoolParams.new( + operator, + vrfKeyhash, + pledge, + cost, + margin, + reward_account, + poolOwners, + relays, + poolMetadata + ) ) - ) - ); + ); +} -exports.newUnitInterval = numerator => denominator => () => - lib.UnitInterval.new(numerator, denominator); +export function newUnitInterval(numerator) { + return denominator => () => lib.UnitInterval.new(numerator, denominator); +} -exports.newPoolRetirementCertificate = poolKeyHash => epoch => () => - lib.Certificate.new_pool_retirement( - lib.PoolRetirement.new(poolKeyHash, epoch) - ); +export function newPoolRetirementCertificate(poolKeyHash) { + return epoch => () => + lib.Certificate.new_pool_retirement( + lib.PoolRetirement.new(poolKeyHash, epoch) + ); +} -exports.newGenesisKeyDelegationCertificate = - genesisHash => genesisDelegateHash => vrfKeyhash => () => +export function newGenesisKeyDelegationCertificate(genesisHash) { + return genesisDelegateHash => vrfKeyhash => () => lib.Certificate.new_genesis_key_delegation( lib.GenesisKeyDelegation.new(genesisHash, genesisDelegateHash, vrfKeyhash) ); +} -exports.addCert = certificates => certificate => () => - certificates.add(certificate); - -exports.setTxBodyCollateral = setter("collateral"); +export function addCert(certificates) { + return certificate => () => certificates.add(certificate); +} -exports.setTxBodyNetworkId = setter("network_id"); +export const setTxBodyCollateral = setter("collateral"); +export const setTxBodyNetworkId = setter("network_id"); -exports.transactionBodySetRequiredSigners = - containerHelper => body => keyHashes => () => +export function transactionBodySetRequiredSigners(containerHelper) { + return body => keyHashes => () => body.set_required_signers( containerHelper.pack(lib.Ed25519KeyHashes, keyHashes) ); +} -exports.transactionBodySetValidityStartInterval = setter( +export const transactionBodySetValidityStartInterval = setter( "validity_start_interval_bignum" ); -exports.transactionBodySetAuxiliaryDataHash = txBody => hash => () => - txBody.set_auxiliary_data_hash(hash); - -exports.convertPoolOwners = containerHelper => keyHashes => () => - containerHelper.pack(lib.Ed25519KeyHashes, keyHashes); - -exports.packRelays = containerHelper => relays => - containerHelper.pack(lib.Relays, relays); - -exports.newIpv4 = data => () => lib.Ipv4.new(data); - -exports.newIpv6 = data => () => lib.Ipv6.new(data); - -exports.newSingleHostAddr = port => ipv4 => ipv6 => () => - lib.Relay.new_single_host_addr(lib.SingleHostAddr.new(port, ipv4, ipv6)); - -exports.newSingleHostName = port => dnsName => () => - lib.Relay.new_single_host_name( - lib.SingleHostName.new(port, lib.DNSRecordAorAAAA.new(dnsName)) - ); - -exports.newMultiHostName = dnsName => () => - lib.Relay.new_multi_host_name( - lib.MultiHostName.new(lib.DNSRecordSRV.new(dnsName)) - ); - -exports.newPoolMetadata = url => hash => () => - lib.PoolMetadata.new(lib.URL.new(url), hash); - -exports.newMoveInstantaneousRewardToOtherPot = pot => amount => () => - lib.MoveInstantaneousReward.new_to_other_pot(pot, amount); - -exports.newMoveInstantaneousRewardToStakeCreds = pot => amounts => () => - lib.MoveInstantaneousReward.new_to_stake_creds(pot, amounts); - -exports.newMIRToStakeCredentials = containerHelper => entries => () => - containerHelper.packMap(lib.MIRToStakeCredentials, entries); - -exports.newMoveInstantaneousRewardsCertificate = mir => () => - lib.Certificate.new_move_instantaneous_rewards_cert( - lib.MoveInstantaneousRewardsCert.new(mir) - ); - -exports.newWithdrawals = containerHelper => entries => () => - containerHelper.packMap(lib.Withdrawals, entries); - -exports.setTxBodyWithdrawals = setter("withdrawals"); - -exports.setTxBodyUpdate = setter("update"); - -exports.newUpdate = ppUpdates => epoch => () => - lib.Update.new(ppUpdates, epoch); - -exports.ppuSetMinfeeA = setter("minfee_a"); - -exports.ppuSetMinfeeB = setter("minfee_b"); - -exports.ppuSetMaxBlockBodySize = setter("max_block_body_size"); - -exports.ppuSetMaxTxSize = setter("max_tx_size"); +export function transactionBodySetAuxiliaryDataHash(txBody) { + return hash => () => txBody.set_auxiliary_data_hash(hash); +} -exports.ppuSetMaxBlockHeaderSize = setter("max_block_header_size"); +export function convertPoolOwners(containerHelper) { + return keyHashes => () => + containerHelper.pack(lib.Ed25519KeyHashes, keyHashes); +} -exports.ppuSetKeyDeposit = setter("key_deposit"); +export function packRelays(containerHelper) { + return relays => containerHelper.pack(lib.Relays, relays); +} -exports.ppuSetPoolDeposit = setter("pool_deposit"); +export function newIpv4(data) { + return () => lib.Ipv4.new(data); +} -exports.ppuSetMaxEpoch = setter("max_epoch"); +export function newIpv6(data) { + return () => lib.Ipv6.new(data); +} -exports.ppuSetNOpt = setter("n_opt"); +export function newSingleHostAddr(port) { + return ipv4 => ipv6 => () => + lib.Relay.new_single_host_addr(lib.SingleHostAddr.new(port, ipv4, ipv6)); +} -exports.ppuSetPoolPledgeInfluence = setter("pool_pledge_influence"); +export function newSingleHostName(port) { + return dnsName => () => + lib.Relay.new_single_host_name( + lib.SingleHostName.new(port, lib.DNSRecordAorAAAA.new(dnsName)) + ); +} -exports.ppuSetExpansionRate = setter("expansion_rate"); +export function newMultiHostName(dnsName) { + return () => + lib.Relay.new_multi_host_name( + lib.MultiHostName.new(lib.DNSRecordSRV.new(dnsName)) + ); +} -exports.ppuSetTreasuryGrowthRate = setter("treasury_growth_rate"); +export function newPoolMetadata(url) { + return hash => () => lib.PoolMetadata.new(lib.URL.new(url), hash); +} -exports.newProtocolVersion = major => minor => () => - lib.ProtocolVersion.new(major, minor); +export function newMoveInstantaneousRewardToOtherPot(pot) { + return amount => () => + lib.MoveInstantaneousReward.new_to_other_pot(pot, amount); +} -exports.ppuSetProtocolVersion = ppu => version => () => - ppu.set_protocol_version(version); +export function newMoveInstantaneousRewardToStakeCreds(pot) { + return amounts => () => + lib.MoveInstantaneousReward.new_to_stake_creds(pot, amounts); +} -exports.ppuSetMinPoolCost = setter("min_pool_cost"); +export function newMIRToStakeCredentials(containerHelper) { + return entries => () => + containerHelper.packMap(lib.MIRToStakeCredentials, entries); +} -exports.ppuSetAdaPerUtxoByte = setter("ada_per_utxo_byte"); +export function newMoveInstantaneousRewardsCertificate(mir) { + return () => + lib.Certificate.new_move_instantaneous_rewards_cert( + lib.MoveInstantaneousRewardsCert.new(mir) + ); +} -exports.ppuSetCostModels = setter("cost_models"); +export function newWithdrawals(containerHelper) { + return entries => () => containerHelper.packMap(lib.Withdrawals, entries); +} -exports.newExUnitPrices = mem_price => step_price => () => - lib.ExUnitPrices.new(mem_price, step_price); +export const setTxBodyWithdrawals = setter("withdrawals"); +export const setTxBodyUpdate = setter("update"); -exports.ppuSetExecutionCosts = setter("execution_costs"); +export function newUpdate(ppUpdates) { + return epoch => () => lib.Update.new(ppUpdates, epoch); +} -exports.ppuSetMaxTxExUnits = setter("max_tx_ex_units"); +export const ppuSetMinfeeA = setter("minfee_a"); +export const ppuSetMinfeeB = setter("minfee_b"); +export const ppuSetMaxBlockBodySize = setter("max_block_body_size"); +export const ppuSetMaxTxSize = setter("max_tx_size"); +export const ppuSetMaxBlockHeaderSize = setter("max_block_header_size"); +export const ppuSetKeyDeposit = setter("key_deposit"); +export const ppuSetPoolDeposit = setter("pool_deposit"); +export const ppuSetMaxEpoch = setter("max_epoch"); +export const ppuSetNOpt = setter("n_opt"); +export const ppuSetPoolPledgeInfluence = setter("pool_pledge_influence"); +export const ppuSetExpansionRate = setter("expansion_rate"); +export const ppuSetTreasuryGrowthRate = setter("treasury_growth_rate"); + +export function newProtocolVersion(major) { + return minor => () => lib.ProtocolVersion.new(major, minor); +} -exports.ppuSetMaxBlockExUnits = setter("max_block_ex_units"); +export function ppuSetProtocolVersion(ppu) { + return version => () => ppu.set_protocol_version(version); +} -exports.ppuSetMaxValueSize = setter("max_value_size"); +export const ppuSetMinPoolCost = setter("min_pool_cost"); +export const ppuSetAdaPerUtxoByte = setter("ada_per_utxo_byte"); +export const ppuSetCostModels = setter("cost_models"); -exports.ppuSetCollateralPercentage = setter("collateral_percentage"); +export function newExUnitPrices(mem_price) { + return step_price => () => lib.ExUnitPrices.new(mem_price, step_price); +} -exports.ppuSetMaxCollateralInputs = setter("max_collateral_inputs"); +export const ppuSetExecutionCosts = setter("execution_costs"); +export const ppuSetMaxTxExUnits = setter("max_tx_ex_units"); +export const ppuSetMaxBlockExUnits = setter("max_block_ex_units"); +export const ppuSetMaxValueSize = setter("max_value_size"); +export const ppuSetCollateralPercentage = setter("collateral_percentage"); +export const ppuSetMaxCollateralInputs = setter("max_collateral_inputs"); -exports.newProtocolParamUpdate = () => lib.ProtocolParamUpdate.new(); +export function newProtocolParamUpdate() { + return lib.ProtocolParamUpdate.new(); +} -exports.newProposedProtocolParameterUpdates = containerHelper => kvs => () => - containerHelper.packMap(lib.ProposedProtocolParameterUpdates, kvs); +export function newProposedProtocolParameterUpdates(containerHelper) { + return kvs => () => + containerHelper.packMap(lib.ProposedProtocolParameterUpdates, kvs); +} diff --git a/src/Internal/Serialization.purs b/src/Internal/Serialization.purs index cfec0c527..9fce4b348 100644 --- a/src/Internal/Serialization.purs +++ b/src/Internal/Serialization.purs @@ -671,7 +671,7 @@ convertCert = case _ of T.StakeDeregistration stakeCredential -> newStakeDeregistrationCertificate stakeCredential T.StakeDelegation stakeCredential keyHash -> - newStakeDelegationCertificate stakeCredential (unwrap keyHash) + newStakeDelegationCertificate stakeCredential (unwrap $ unwrap keyHash) T.PoolRegistration { operator , vrfKeyhash @@ -688,7 +688,8 @@ convertCert = case _ of (unwrap <<< unwrap <$> poolOwners) relays' <- convertRelays relays poolMetadata' <- for poolMetadata convertPoolMetadata - newPoolRegistrationCertificate (unwrap operator) (T.unVRFKeyHash vrfKeyhash) + newPoolRegistrationCertificate (unwrap $ unwrap operator) + (T.unVRFKeyHash vrfKeyhash) pledge cost margin' @@ -697,7 +698,7 @@ convertCert = case _ of relays' (maybeToUor poolMetadata') T.PoolRetirement { poolKeyHash, epoch } -> - newPoolRetirementCertificate (unwrap poolKeyHash) + newPoolRetirementCertificate (unwrap $ unwrap poolKeyHash) (UInt.toInt $ unwrap epoch) T.GenesisKeyDelegation { genesisHash: T.GenesisHash genesisHash @@ -760,9 +761,9 @@ convertNetworkId = case _ of convertMint :: T.Mint -> Effect Mint convertMint (T.Mint nonAdaAssets) = do - let m = Value.unwrapNonAdaAsset nonAdaAssets mint <- newMint - forWithIndex_ m \scriptHashBytes' values -> do + let assetsMap = Value.unwrapNonAdaAsset nonAdaAssets + forWithIndex_ assetsMap \scriptHashBytes' values -> do let mScripthash = scriptHashFromBytes $ Value.getCurrencySymbol scriptHashBytes' diff --git a/src/Internal/Serialization/Address.js b/src/Internal/Serialization/Address.js index b9f664e97..083ece7f8 100644 --- a/src/Internal/Serialization/Address.js +++ b/src/Internal/Serialization/Address.js @@ -2,11 +2,10 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); const callClassStaticMaybe = (classname, functionname) => maybe => input => { let ret = null; @@ -31,121 +30,148 @@ const callNetworkId = callMethodParameterless("network_id"); const callPaymentCred = callMethodParameterless("payment_cred"); const callStakeCred = callMethodParameterless("stake_cred"); -exports.withStakeCredential = cbObj => stakeCred => { - return stakeCred.kind() == lib.StakeCredKind.Key - ? cbObj.onKeyHash(stakeCred.to_keyhash()) - : cbObj.onScriptHash(stakeCred.to_scripthash()); -}; +export function withStakeCredential(cbObj) { + return stakeCred => { + return stakeCred.kind() == lib.StakeCredKind.Key + ? cbObj.onKeyHash(stakeCred.to_keyhash()) + : cbObj.onScriptHash(stakeCred.to_scripthash()); + }; +} -exports.keyHashCredential = lib.StakeCredential.from_keyhash; -exports.scriptHashCredential = lib.StakeCredential.from_scripthash; +export const keyHashCredential = lib.StakeCredential.from_keyhash; +export const scriptHashCredential = lib.StakeCredential.from_scripthash; +export { callToBytes as addressBytes }; +export { callToBytes as byronAddressBytes }; +export { callToBytes as stakeCredentialToBytes }; +export { callToBech32 as addressBech32 }; + +export function _addressNetworkId(toAdt) { + return addr => { + return toAdt(callNetworkId(addr)); + }; +} -exports.addressBytes = callToBytes; -exports.byronAddressBytes = callToBytes; -exports.stakeCredentialToBytes = callToBytes; +export function _byronAddressNetworkId(toAdt) { + return addr => { + return toAdt(callNetworkId(addr)); + }; +} -exports.addressBech32 = callToBech32; -exports._addressNetworkId = toAdt => addr => { - return toAdt(callNetworkId(addr)); -}; -exports._byronAddressNetworkId = toAdt => addr => { - return toAdt(callNetworkId(addr)); -}; +export const _addressFromBytes = callClassStaticMaybe("Address", "from_bytes"); -exports._addressFromBytes = callClassStaticMaybe("Address", "from_bytes"); -exports._stakeCredentialFromBytes = callClassStaticMaybe( +export const _stakeCredentialFromBytes = callClassStaticMaybe( "StakeCredential", "from_bytes" ); -exports._byronAddressFromBytes = callClassStaticMaybe( + +export const _byronAddressFromBytes = callClassStaticMaybe( "ByronAddress", "from_bytes" ); -exports._addressFromBech32 = callClassStaticMaybe("Address", "from_bech32"); +export const _addressFromBech32 = callClassStaticMaybe( + "Address", + "from_bech32" +); -exports._byronAddressFromBase58 = callClassStaticMaybe( +export const _byronAddressFromBase58 = callClassStaticMaybe( "ByronAddress", "from_base58" ); -exports._baseAddressFromAddress = callClassStaticMaybe( +export const _baseAddressFromAddress = callClassStaticMaybe( "BaseAddress", "from_address" ); -exports._byronAddressFromAddress = callClassStaticMaybe( + +export const _byronAddressFromAddress = callClassStaticMaybe( "ByronAddress", "from_address" ); -exports._enterpriseAddressFromAddress = callClassStaticMaybe( + +export const _enterpriseAddressFromAddress = callClassStaticMaybe( "EnterpriseAddress", "from_address" ); -exports._pointerAddressFromAddress = callClassStaticMaybe( + +export const _pointerAddressFromAddress = callClassStaticMaybe( "PointerAddress", "from_address" ); -exports._rewardAddressFromAddress = callClassStaticMaybe( + +export const _rewardAddressFromAddress = callClassStaticMaybe( "RewardAddress", "from_address" ); -exports.baseAddressToAddress = callToAddress; -exports.byronAddressToAddress = callToAddress; -exports.enterpriseAddressToAddress = callToAddress; -exports.pointerAddressToAddress = callToAddress; -exports.rewardAddressToAddress = callToAddress; - -exports.baseAddressPaymentCred = callPaymentCred; -exports.rewardAddressPaymentCred = callPaymentCred; -exports.enterpriseAddressPaymentCred = callPaymentCred; -exports.pointerAddressPaymentCred = callPaymentCred; - -exports.baseAddressDelegationCred = callStakeCred; - -exports.byronAddressAttributes = callMethodParameterless("attributes"); -exports.byronAddressIsValid = lib.ByronAddress.is_valid; -exports.byronAddressToBase58 = callMethodParameterless("to_base58"); -exports.byronProtocolMagic = callMethodParameterless("byron_protocol_magic"); +export { callToAddress as baseAddressToAddress }; +export { callToAddress as byronAddressToAddress }; +export { callToAddress as enterpriseAddressToAddress }; +export { callToAddress as pointerAddressToAddress }; +export { callToAddress as rewardAddressToAddress }; +export { callPaymentCred as baseAddressPaymentCred }; +export { callPaymentCred as rewardAddressPaymentCred }; +export { callPaymentCred as enterpriseAddressPaymentCred }; +export { callPaymentCred as pointerAddressPaymentCred }; +export { callStakeCred as baseAddressDelegationCred }; +export const byronAddressAttributes = callMethodParameterless("attributes"); +export const byronAddressIsValid = lib.ByronAddress.is_valid; +export const byronAddressToBase58 = callMethodParameterless("to_base58"); +export const byronProtocolMagic = callMethodParameterless( + "byron_protocol_magic" +); -exports.icarusFromKey = bip32pubkey => byronProtocolMagic => { - return lib.ByronAddress.icarus_from_key(bip32pubkey, byronProtocolMagic); -}; +export function icarusFromKey(bip32pubkey) { + return byronProtocolMagic => { + return lib.ByronAddress.icarus_from_key(bip32pubkey, byronProtocolMagic); + }; +} -exports.pointerAddressStakePointer = pa => { +export function pointerAddressStakePointer(pa) { const pointerForeign = pa.stake_pointer(); return { slot: pointerForeign.slot_bignum(), txIx: pointerForeign.tx_index_bignum(), - certIx: pointerForeign.cert_index_bignum(), + certIx: pointerForeign.cert_index_bignum() }; -}; +} -exports._enterpriseAddress = netIdToInt => inpRec => { - return lib.EnterpriseAddress.new( - netIdToInt(inpRec.network), - inpRec.paymentCred - ); -}; +export function _enterpriseAddress(netIdToInt) { + return inpRec => { + return lib.EnterpriseAddress.new( + netIdToInt(inpRec.network), + inpRec.paymentCred + ); + }; +} -exports._rewardAddress = netIdToInt => inpRec => { - return lib.RewardAddress.new(netIdToInt(inpRec.network), inpRec.paymentCred); -}; +export function _rewardAddress(netIdToInt) { + return inpRec => { + return lib.RewardAddress.new( + netIdToInt(inpRec.network), + inpRec.paymentCred + ); + }; +} -exports._baseAddress = netIdToInt => inpRec => { - return lib.BaseAddress.new( - netIdToInt(inpRec.network), - inpRec.paymentCred, - inpRec.delegationCred - ); -}; +export function _baseAddress(netIdToInt) { + return inpRec => { + return lib.BaseAddress.new( + netIdToInt(inpRec.network), + inpRec.paymentCred, + inpRec.delegationCred + ); + }; +} -exports._pointerAddress = netIdToInt => inpRec => { - const p = inpRec.stakePointer; - const pointerForeign = lib.Pointer.new_pointer(p.slot, p.txIx, p.certIx); - return lib.PointerAddress.new( - netIdToInt(inpRec.network), - inpRec.paymentCred, - pointerForeign - ); -}; +export function _pointerAddress(netIdToInt) { + return inpRec => { + const p = inpRec.stakePointer; + const pointerForeign = lib.Pointer.new_pointer(p.slot, p.txIx, p.certIx); + return lib.PointerAddress.new( + netIdToInt(inpRec.network), + inpRec.paymentCred, + pointerForeign + ); + }; +} diff --git a/src/Internal/Serialization/AuxiliaryData.js b/src/Internal/Serialization/AuxiliaryData.js index 130262830..33fd344de 100644 --- a/src/Internal/Serialization/AuxiliaryData.js +++ b/src/Internal/Serialization/AuxiliaryData.js @@ -2,41 +2,52 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); const setter = prop => obj => value => () => obj["set_" + prop](value); -exports.newAuxiliaryData = () => lib.AuxiliaryData.new(); - -exports._hashAuxiliaryData = auxiliaryData => - lib.hash_auxiliary_data(auxiliaryData); - -exports.setAuxiliaryDataNativeScripts = setter("native_scripts"); +export function newAuxiliaryData() { + return lib.AuxiliaryData.new(); +} -exports.setAuxiliaryDataPlutusScripts = setter("plutus_scripts"); +export function _hashAuxiliaryData(auxiliaryData) { + return lib.hash_auxiliary_data(auxiliaryData); +} -exports.setAuxiliaryDataGeneralTransactionMetadata = setter("metadata"); +export const setAuxiliaryDataNativeScripts = setter("native_scripts"); +export const setAuxiliaryDataPlutusScripts = setter("plutus_scripts"); +export const setAuxiliaryDataGeneralTransactionMetadata = setter("metadata"); -exports.newGeneralTransactionMetadata = containerHelper => entries => () => - containerHelper.packMap(lib.GeneralTransactionMetadata, entries); +export function newGeneralTransactionMetadata(containerHelper) { + return entries => () => + containerHelper.packMap(lib.GeneralTransactionMetadata, entries); +} -exports.newMetadataMap = containerHelper => entries => () => - lib.TransactionMetadatum.new_map( - containerHelper.packMap(lib.MetadataMap, entries) - ); +export function newMetadataMap(containerHelper) { + return entries => () => + lib.TransactionMetadatum.new_map( + containerHelper.packMap(lib.MetadataMap, entries) + ); +} -exports.newMetadataList = containerHelper => entries => () => - lib.TransactionMetadatum.new_list( - containerHelper.pack(lib.MetadataList, entries) - ); +export function newMetadataList(containerHelper) { + return entries => () => + lib.TransactionMetadatum.new_list( + containerHelper.pack(lib.MetadataList, entries) + ); +} -exports.newMetadataInt = int => () => lib.TransactionMetadatum.new_int(int); +export function newMetadataInt(int) { + return () => lib.TransactionMetadatum.new_int(int); +} -exports.newMetadataBytes = bytes => () => - lib.TransactionMetadatum.new_bytes(bytes); +export function newMetadataBytes(bytes) { + return () => lib.TransactionMetadatum.new_bytes(bytes); +} -exports.newMetadataText = text => () => lib.TransactionMetadatum.new_text(text); +export function newMetadataText(text) { + return () => lib.TransactionMetadatum.new_text(text); +} diff --git a/src/Internal/Serialization/BigInt.js b/src/Internal/Serialization/BigInt.js index 6997bf4af..dc61768cc 100644 --- a/src/Internal/Serialization/BigInt.js +++ b/src/Internal/Serialization/BigInt.js @@ -2,16 +2,17 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports._BigInt_from_str = helper => str => { - try { - return helper.just(lib.BigInt.from_str(str)); - } catch (_) { - return helper.nothing; - } -}; +export function _BigInt_from_str(helper) { + return str => { + try { + return helper.just(lib.BigInt.from_str(str)); + } catch (_) { + return helper.nothing; + } + }; +} diff --git a/src/Internal/Serialization/BigInt.purs b/src/Internal/Serialization/BigInt.purs index 00dcfc3e0..8a0418ce9 100644 --- a/src/Internal/Serialization/BigInt.purs +++ b/src/Internal/Serialization/BigInt.purs @@ -6,8 +6,8 @@ import Prelude import Ctl.Internal.FfiHelpers (MaybeFfiHelper, maybeFfiHelper) import Ctl.Internal.Serialization.Types (BigInt) -import Data.BigInt as BigInt import Data.Maybe (Maybe) +import JS.BigInt as BigInt convertBigInt :: BigInt.BigInt -> Maybe BigInt convertBigInt = _BigInt_from_str maybeFfiHelper <<< BigInt.toString diff --git a/src/Internal/Serialization/Hash.js b/src/Internal/Serialization/Hash.js index 88a7af703..1ac1b8c79 100644 --- a/src/Internal/Serialization/Hash.js +++ b/src/Internal/Serialization/Hash.js @@ -2,23 +2,26 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.hashToBytes = hash => { +export function hashToBytes(hash) { return hash.to_bytes(); -}; +} -exports.hashFromBytes = name => maybe => bytes => { - return hashFromImpl(lib[name].from_bytes)(maybe)(bytes); -}; +export function hashFromBytes(name) { + return maybe => bytes => { + return hashFromImpl(lib[name].from_bytes)(maybe)(bytes); + }; +} -exports.hashToBech32Unsafe = prefix => hash => { - return hash.to_bech32(prefix); -}; +export function hashToBech32Unsafe(prefix) { + return hash => { + return hash.to_bech32(prefix); + }; +} const hashFromImpl = hashClassFrom => maybe => input => { let ret = null; @@ -33,25 +36,33 @@ const hashFromImpl = hashClassFrom => maybe => input => { return maybe.just(ret); }; -exports.hashToBech32Impl = maybe => prefix => hash => { - let ret = null; - try { - ret = hash.to_bech32(prefix); - } catch (e) { - // Do nothing - } - if (ret == null) { - return maybe.nothing; - } - return maybe.just(ret); -}; +export function hashToBech32Impl(maybe) { + return prefix => hash => { + let ret = null; + try { + ret = hash.to_bech32(prefix); + } catch (e) { + // Do nothing + } + if (ret == null) { + return maybe.nothing; + } + return maybe.just(ret); + }; +} -exports._ed25519KeyHashFromBech32Impl = maybe => bech32str => { - return hashFromImpl(lib.Ed25519KeyHash.from_bech32)(maybe)(bech32str); -}; +export function _ed25519KeyHashFromBech32Impl(maybe) { + return bech32str => { + return hashFromImpl(lib.Ed25519KeyHash.from_bech32)(maybe)(bech32str); + }; +} -exports._scriptHashFromBech32Impl = maybe => bech32str => { - return hashFromImpl(lib.ScriptHash.from_bech32)(maybe)(bech32str); -}; +export function _scriptHashFromBech32Impl(maybe) { + return bech32str => { + return hashFromImpl(lib.ScriptHash.from_bech32)(maybe)(bech32str); + }; +} -exports.nativeScriptHash = script => script.hash(); +export function nativeScriptHash(script) { + return script.hash(); +} diff --git a/src/Internal/Serialization/Keys.js b/src/Internal/Serialization/Keys.js index f15d7dedf..3c80c09b4 100644 --- a/src/Internal/Serialization/Keys.js +++ b/src/Internal/Serialization/Keys.js @@ -2,13 +2,15 @@ const bytesFromKey = key => key.as_bytes(); -exports.bytesFromPublicKey = bytesFromKey; -exports.bytesFromPrivateKey = bytesFromKey; +export { bytesFromKey as bytesFromPublicKey }; +export { bytesFromKey as bytesFromPrivateKey }; -exports.publicKeyFromPrivateKey = private_key => private_key.to_public(); +export function publicKeyFromPrivateKey(private_key) { + return private_key.to_public(); +} const bech32FromX = key => key.to_bech32(); -exports.bech32FromPublicKey = bech32FromX; -exports.bech32FromPrivateKey = bech32FromX; -exports.bech32FromEd25519Signature = bech32FromX; +export { bech32FromX as bech32FromPublicKey }; +export { bech32FromX as bech32FromPrivateKey }; +export { bech32FromX as bech32FromEd25519Signature }; diff --git a/src/Internal/Serialization/MinFee.js b/src/Internal/Serialization/MinFee.js index c24676a3a..52e0732ad 100644 --- a/src/Internal/Serialization/MinFee.js +++ b/src/Internal/Serialization/MinFee.js @@ -2,20 +2,22 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports._minFee = maybe => tx => txFeeFixed => txFeePerByte => { - try { - const linearFee = lib.LinearFee.new(txFeePerByte, txFeeFixed); - return maybe.just(lib.min_fee(tx, linearFee)); - } catch (_) { - return maybe.nothing; - } -}; +export function _minFee(maybe) { + return tx => txFeeFixed => txFeePerByte => { + try { + const linearFee = lib.LinearFee.new(txFeePerByte, txFeeFixed); + return maybe.just(lib.min_fee(tx, linearFee)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports._minScriptFee = exUnitPrices => tx => - lib.min_script_fee(tx, exUnitPrices); +export function _minScriptFee(exUnitPrices) { + return tx => lib.min_script_fee(tx, exUnitPrices); +} diff --git a/src/Internal/Serialization/NativeScript.js b/src/Internal/Serialization/NativeScript.js index ea4f798a5..810331fa7 100644 --- a/src/Internal/Serialization/NativeScript.js +++ b/src/Internal/Serialization/NativeScript.js @@ -2,25 +2,44 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); const mkScript = prop => arg => lib.NativeScript[prop](arg); -exports.mkScriptPubkey = keyHash => lib.ScriptPubkey.new(keyHash); -exports.nativeScript_new_script_pubkey = mkScript("new_script_pubkey"); -exports.nativeScript_new_script_all = mkScript("new_script_all"); -exports.nativeScript_new_script_any = mkScript("new_script_any"); -exports.nativeScript_new_script_n_of_k = mkScript("new_script_n_of_k"); -exports.nativeScript_new_timelock_start = mkScript("new_timelock_start"); -exports.nativeScript_new_timelock_expiry = mkScript("new_timelock_expiry"); -exports._packNativeScripts = helper => nss => - helper.pack(lib.NativeScripts, nss); -exports.mkScriptAll = nss => lib.ScriptAll.new(nss); -exports.mkScriptAny = nss => lib.ScriptAny.new(nss); -exports.mkScriptNOfK = n => nss => lib.ScriptNOfK.new(n, nss); -exports.mkTimelockExpiry = n => lib.TimelockExpiry.new_timelockexpiry(n); -exports.mkTimelockStart = n => lib.TimelockStart.new_timelockstart(n); +export function mkScriptPubkey(keyHash) { + return lib.ScriptPubkey.new(keyHash); +} + +export const nativeScript_new_script_pubkey = mkScript("new_script_pubkey"); +export const nativeScript_new_script_all = mkScript("new_script_all"); +export const nativeScript_new_script_any = mkScript("new_script_any"); +export const nativeScript_new_script_n_of_k = mkScript("new_script_n_of_k"); +export const nativeScript_new_timelock_start = mkScript("new_timelock_start"); +export const nativeScript_new_timelock_expiry = mkScript("new_timelock_expiry"); + +export function _packNativeScripts(helper) { + return nss => helper.pack(lib.NativeScripts, nss); +} + +export function mkScriptAll(nss) { + return lib.ScriptAll.new(nss); +} + +export function mkScriptAny(nss) { + return lib.ScriptAny.new(nss); +} + +export function mkScriptNOfK(n) { + return nss => lib.ScriptNOfK.new(n, nss); +} + +export function mkTimelockExpiry(n) { + return lib.TimelockExpiry.new_timelockexpiry(n); +} + +export function mkTimelockStart(n) { + return lib.TimelockStart.new_timelockstart(n); +} diff --git a/src/Internal/Serialization/PlutusData.js b/src/Internal/Serialization/PlutusData.js index 580cdcfdd..9c642c773 100644 --- a/src/Internal/Serialization/PlutusData.js +++ b/src/Internal/Serialization/PlutusData.js @@ -2,35 +2,55 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); -} -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); - -exports._mkPlutusData_bytes = bytes => lib.PlutusData.new_bytes(bytes); -exports._mkPlutusData_list = list => lib.PlutusData.new_list(list); -exports._mkPlutusData_map = list => lib.PlutusData.new_map(list); -exports._mkPlutusData_integer = int => lib.PlutusData.new_integer(int); -exports._mkPlutusData_constr = constr => - lib.PlutusData.new_constr_plutus_data(constr); - -exports._packPlutusList = containerHelper => elems => - containerHelper.pack(lib.PlutusList, elems); -exports._mkConstrPlutusData = n => list => lib.ConstrPlutusData.new(n, list); - -exports._bigIntFromString = maybe => str => { - try { - return maybe.just(lib.BigInt.from_str(str)); - } catch (_) { - return maybe.nothing; - } -}; - -exports._packMap = first => second => kvs => { - const res = lib.PlutusMap.new(); - for (let kv of kvs) { - res.insert(first(kv), second(kv)); - } - return res; -}; + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); +} + +export function _mkPlutusData_bytes(bytes) { + return lib.PlutusData.new_bytes(bytes); +} + +export function _mkPlutusData_list(list) { + return lib.PlutusData.new_list(list); +} + +export function _mkPlutusData_map(list) { + return lib.PlutusData.new_map(list); +} + +export function _mkPlutusData_integer(int) { + return lib.PlutusData.new_integer(int); +} + +export function _mkPlutusData_constr(constr) { + return lib.PlutusData.new_constr_plutus_data(constr); +} + +export function _packPlutusList(containerHelper) { + return elems => containerHelper.pack(lib.PlutusList, elems); +} + +export function _mkConstrPlutusData(n) { + return list => lib.ConstrPlutusData.new(n, list); +} + +export function _bigIntFromString(maybe) { + return str => { + try { + return maybe.just(lib.BigInt.from_str(str)); + } catch (_) { + return maybe.nothing; + } + }; +} + +export function _packMap(first) { + return second => kvs => { + const res = lib.PlutusMap.new(); + for (let kv of kvs) { + res.insert(first(kv), second(kv)); + } + return res; + }; +} diff --git a/src/Internal/Serialization/PlutusData.purs b/src/Internal/Serialization/PlutusData.purs index b607fc206..e15a4bd44 100644 --- a/src/Internal/Serialization/PlutusData.purs +++ b/src/Internal/Serialization/PlutusData.purs @@ -21,10 +21,10 @@ import Ctl.Internal.Serialization.Types import Ctl.Internal.Types.BigNum (BigNum) import Ctl.Internal.Types.ByteArray (ByteArray) import Ctl.Internal.Types.PlutusData as T -import Data.BigInt as BigInt import Data.Maybe (Maybe, fromJust) import Data.Tuple (Tuple, fst, snd) import Data.Tuple.Nested (type (/\), (/\)) +import JS.BigInt as BigInt import Partial.Unsafe (unsafePartial) convertPlutusData :: T.PlutusData -> PlutusData diff --git a/src/Internal/Serialization/PlutusScript.js b/src/Internal/Serialization/PlutusScript.js index af3c7ec8c..ab48270fe 100644 --- a/src/Internal/Serialization/PlutusScript.js +++ b/src/Internal/Serialization/PlutusScript.js @@ -2,14 +2,19 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.newPlutusV1Script = bytes => lib.PlutusScript.new(bytes); +export function newPlutusV1Script(bytes) { + return lib.PlutusScript.new(bytes); +} -exports.newPlutusV2Script = bytes => lib.PlutusScript.new_v2(bytes); +export function newPlutusV2Script(bytes) { + return lib.PlutusScript.new_v2(bytes); +} -exports.plutusScriptBytes = script => script.bytes(); +export function plutusScriptBytes(script) { + return script.bytes(); +} diff --git a/src/Internal/Serialization/ToBytes.js b/src/Internal/Serialization/ToBytes.js index 6107d0d2a..7ec989fca 100644 --- a/src/Internal/Serialization/ToBytes.js +++ b/src/Internal/Serialization/ToBytes.js @@ -1 +1,3 @@ -exports._toBytes = sth => sth.to_bytes(); +export function _toBytes(sth) { + return sth.to_bytes(); +} diff --git a/src/Internal/Serialization/ToBytes.purs b/src/Internal/Serialization/ToBytes.purs index 56f6a6f10..e9b14b87e 100644 --- a/src/Internal/Serialization/ToBytes.purs +++ b/src/Internal/Serialization/ToBytes.purs @@ -29,7 +29,10 @@ import Ctl.Internal.Serialization.Types , TransactionUnspentOutput , TransactionWitnessSet , Value + , Vkeywitness + , Vkeywitnesses ) +import Ctl.Internal.Types.BigNum (BigNum) import Ctl.Internal.Types.ByteArray (ByteArray) import Ctl.Internal.Types.CborBytes (CborBytes(CborBytes)) import Untagged.Castable (class Castable) @@ -59,6 +62,9 @@ type SerializableData = Address |+| TransactionWitnessSet |+| Value |+| VRFKeyHash + |+| Vkeywitness + |+| Vkeywitnesses + |+| BigNum -- Add more as needed diff --git a/src/Internal/Serialization/Types.purs b/src/Internal/Serialization/Types.purs index 9cafb8706..3e906b0ad 100644 --- a/src/Internal/Serialization/Types.purs +++ b/src/Internal/Serialization/Types.purs @@ -4,6 +4,7 @@ module Ctl.Internal.Serialization.Types , AuxiliaryData , AuxiliaryDataHash , BigInt + , Bip32PrivateKey , Bip32PublicKey , BootstrapWitness , BootstrapWitnesses @@ -89,6 +90,7 @@ foreign import data Assets :: Type foreign import data AuxiliaryData :: Type foreign import data AuxiliaryDataHash :: Type foreign import data BigInt :: Type +foreign import data Bip32PrivateKey :: Type foreign import data Bip32PublicKey :: Type foreign import data BootstrapWitness :: Type foreign import data BootstrapWitnesses :: Type diff --git a/src/Internal/Serialization/WitnessSet.js b/src/Internal/Serialization/WitnessSet.js index 8596ffc6a..96b8fd2cd 100644 --- a/src/Internal/Serialization/WitnessSet.js +++ b/src/Internal/Serialization/WitnessSet.js @@ -2,61 +2,94 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.newTransactionWitnessSet = () => lib.TransactionWitnessSet.new(); +export function newTransactionWitnessSet() { + return lib.TransactionWitnessSet.new(); +} -exports.newPublicKey = bech32 => () => lib.PublicKey.from_bech32(bech32); +export function newPublicKey(bech32) { + return () => lib.PublicKey.from_bech32(bech32); +} -exports.newVkeyFromPublicKey = public_key => () => lib.Vkey.new(public_key); +export function newVkeyFromPublicKey(public_key) { + return () => lib.Vkey.new(public_key); +} -exports.newVkeywitnesses = () => lib.Vkeywitnesses.new(); +export function newVkeywitnesses() { + return lib.Vkeywitnesses.new(); +} -exports.newVkeywitness = vkey => signature => () => - lib.Vkeywitness.new(vkey, signature); +export function newVkeywitness(vkey) { + return signature => () => lib.Vkeywitness.new(vkey, signature); +} -exports.addVkeywitness = witnesses => witness => () => witnesses.add(witness); +export function addVkeywitness(witnesses) { + return witness => () => witnesses.add(witness); +} -exports.newPlutusScripts = () => lib.PlutusScripts.new(); +export function newPlutusScripts() { + return lib.PlutusScripts.new(); +} -exports.addPlutusScript = scripts => script => () => scripts.add(script); +export function addPlutusScript(scripts) { + return script => () => scripts.add(script); +} -exports.transactionWitnessSetSetVkeys = ws => vkeys => () => - ws.set_vkeys(vkeys); +export function transactionWitnessSetSetVkeys(ws) { + return vkeys => () => ws.set_vkeys(vkeys); +} -exports.txWitnessSetSetPlutusScripts = ws => scripts => () => - ws.set_plutus_scripts(scripts); +export function txWitnessSetSetPlutusScripts(ws) { + return scripts => () => ws.set_plutus_scripts(scripts); +} -exports.transactionWitnessSetSetNativeScripts = ws => scripts => () => - ws.set_native_scripts(scripts); +export function transactionWitnessSetSetNativeScripts(ws) { + return scripts => () => ws.set_native_scripts(scripts); +} -exports._wsSetBootstraps = helper => ws => bootstraps => () => - ws.set_bootstraps(helper.pack(lib.BootstrapWitnesses, bootstraps)); +export function _wsSetBootstraps(helper) { + return ws => bootstraps => () => + ws.set_bootstraps(helper.pack(lib.BootstrapWitnesses, bootstraps)); +} -exports.newBootstrapWitness = - vkey => signature => chain_code => attributes => () => { +export function newBootstrapWitness(vkey) { + return signature => chain_code => attributes => () => { lib.BootstrapWitness.new(vkey, signature, chain_code, attributes); }; +} -exports._wsSetPlutusData = helper => ws => plutus_data => () => - ws.set_plutus_data(helper.pack(lib.PlutusList, plutus_data)); +export function _wsSetPlutusData(helper) { + return ws => plutus_data => () => + ws.set_plutus_data(helper.pack(lib.PlutusList, plutus_data)); +} -exports.newRedeemer = tag => index => data => ex_units => () => - lib.Redeemer.new(tag, index, data, ex_units); +export function newRedeemer(tag) { + return index => data => ex_units => () => + lib.Redeemer.new(tag, index, data, ex_units); +} -exports._newRedeemerTag = tag => () => lib.RedeemerTag["new_" + tag](); +export function _newRedeemerTag(tag) { + return () => lib.RedeemerTag["new_" + tag](); +} -exports.newExUnits = mem => steps => lib.ExUnits.new(mem, steps); +export function newExUnits(mem) { + return steps => lib.ExUnits.new(mem, steps); +} -exports._wsSetRedeemers = helper => ws => redeemers => () => - ws.set_redeemers(helper.pack(lib.Redeemers, redeemers)); +export function _wsSetRedeemers(helper) { + return ws => redeemers => () => + ws.set_redeemers(helper.pack(lib.Redeemers, redeemers)); +} -exports._mkRedeemers = helper => redeemers => - helper.pack(lib.Redeemers, redeemers); +export function _mkRedeemers(helper) { + return redeemers => helper.pack(lib.Redeemers, redeemers); +} -exports._wsSetPlutusScripts = helper => ws => scripts => () => - ws.set_plutus_scripts(helper.pack(lib.PlutusScripts, scripts)); +export function _wsSetPlutusScripts(helper) { + return ws => scripts => () => + ws.set_plutus_scripts(helper.pack(lib.PlutusScripts, scripts)); +} diff --git a/src/Internal/ServerConfig.purs b/src/Internal/ServerConfig.purs index 0be0c767c..76d4a883b 100644 --- a/src/Internal/ServerConfig.purs +++ b/src/Internal/ServerConfig.purs @@ -4,6 +4,7 @@ module Ctl.Internal.ServerConfig , blockfrostPublicMainnetServerConfig , blockfrostPublicPreprodServerConfig , blockfrostPublicPreviewServerConfig + , blockfrostSelfHostedServerConfig , defaultKupoServerConfig , defaultOgmiosWsConfig , mkHttpUrl @@ -68,6 +69,14 @@ blockfrostPublicMainnetServerConfig = , path: Just "/api/v0" } +blockfrostSelfHostedServerConfig :: ServerConfig +blockfrostSelfHostedServerConfig = + { port: UInt.fromInt 3000 + , host: "127.0.0.1" + , secure: false + , path: Just "" + } + mkHttpUrl :: ServerConfig -> Url mkHttpUrl = mkServerUrl "http" diff --git a/src/Internal/Service/Blockfrost.purs b/src/Internal/Service/Blockfrost.purs index e67014b95..59abc11e2 100644 --- a/src/Internal/Service/Blockfrost.purs +++ b/src/Internal/Service/Blockfrost.purs @@ -36,25 +36,26 @@ module Ctl.Internal.Service.Blockfrost , BlockfrostSystemStart(BlockfrostSystemStart) , OnBlockfrostRawGetResponseHook , OnBlockfrostRawPostResponseHook + , doesTxExist , evaluateTx , getChainTip , getCurrentEpoch , getDatumByHash , getEraSummaries + , getOutputAddressesByTxHash + , getPoolIds , getProtocolParameters + , getPubKeyHashDelegationsAndRewards , getScriptByHash , getScriptInfo , getSystemStart , getTxMetadata , getUtxoByOref - , doesTxExist + , getValidatorHashDelegationsAndRewards , runBlockfrostServiceM , runBlockfrostServiceTestM , submitTx , utxosAt - , getPoolIds - , getPubKeyHashDelegationsAndRewards - , getValidatorHashDelegationsAndRewards ) where import Prelude @@ -62,21 +63,20 @@ import Prelude import Aeson ( class DecodeAeson , Aeson - , Finite , JsonDecodeError(TypeMismatch, MissingValue, AtKey) , decodeAeson , decodeJsonString + , encodeAeson , getField , getFieldOptional , getFieldOptional' , isNull , parseJsonStringToAeson , stringifyAeson - , unpackFinite , (.:) , (.:!) ) -import Affjax (Error, Response, URL, defaultRequest, printError, request) as Affjax +import Affjax (Error, Response, URL, defaultRequest, printError) as Affjax import Affjax.RequestBody (RequestBody, arrayView, string) as Affjax import Affjax.RequestHeader (RequestHeader(ContentType, RequestHeader)) as Affjax import Affjax.ResponseFormat (string) as Affjax.ResponseFormat @@ -92,9 +92,11 @@ import Control.Monad.Except.Trans (ExceptT(ExceptT), runExceptT) import Control.Monad.Logger.Class (log) import Control.Monad.Logger.Trans (LoggerT(LoggerT), runLoggerT) import Control.Monad.Maybe.Trans (MaybeT(MaybeT), runMaybeT) +import Control.Monad.Reader (ReaderT(ReaderT)) import Control.Monad.Reader.Class (ask, asks) import Control.Monad.Reader.Trans (ReaderT, runReaderT) import Control.Parallel (parTraverse) +import Ctl.Internal.Affjax (request) as Affjax import Ctl.Internal.Cardano.Types.NativeScript ( NativeScript ( ScriptAll @@ -135,7 +137,20 @@ import Ctl.Internal.Deserialization.PlutusData (deserializeData) import Ctl.Internal.Deserialization.Transaction ( convertGeneralTransactionMetadata ) -import Ctl.Internal.QueryM.Ogmios (TxEvaluationR) +import Ctl.Internal.QueryM.Ogmios + ( AdditionalUtxoSet + , ExecutionUnits + , OgmiosDatum + , OgmiosScript + , OgmiosTxIn + , RedeemerPointer + , ScriptFailure + , TxEvaluationFailure(ScriptFailures, UnparsedError) + , TxEvaluationR + , TxEvaluationResult(TxEvaluationResult) + , decodeRedeemerPointer + ) +import Ctl.Internal.QueryM.Ogmios as Ogmios import Ctl.Internal.QueryM.Pools (DelegationsAndRewards) import Ctl.Internal.Serialization as Serialization import Ctl.Internal.Serialization.Address @@ -208,21 +223,21 @@ import Ctl.Internal.Types.TransactionMetadata ) import Data.Array (find, length) as Array import Data.Bifunctor (lmap) -import Data.BigInt (BigInt) -import Data.BigInt (fromString, toNumber) as BigInt import Data.BigNumber (BigNumber, toFraction) import Data.BigNumber as BigNumber import Data.DateTime.Instant (instant, toDateTime) -import Data.Either (Either(Left, Right), either, note) +import Data.Either (Either(Left, Right), either, hush, note) import Data.Foldable (fold) import Data.Generic.Rep (class Generic) import Data.HTTP.Method (Method(GET, POST)) import Data.JSDate (JSDate, now) import Data.Log.Level (LogLevel(Trace)) import Data.Log.Message (Message) +import Data.Map (Map) import Data.Map (empty, fromFoldable, isEmpty, unions) as Map import Data.Maybe (Maybe(Just, Nothing), fromMaybe, maybe) import Data.MediaType (MediaType(MediaType)) +import Data.MediaType.Common (applicationJSON) as MediaType import Data.Newtype (class Newtype, unwrap, wrap) import Data.Number (infinity) import Data.Show.Generic (genericShow) @@ -237,6 +252,9 @@ import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) import Effect.Exception (error) import Foreign.Object (Object) +import Foreign.Object as ForeignObject +import JS.BigInt (BigInt) +import JS.BigInt (fromString, toNumber) as BigInt -------------------------------------------------------------------------------- -- BlockfrostServiceM @@ -313,7 +331,7 @@ data BlockfrostEndpoint | DatumCbor DataHash -- /network/eras | EraSummaries - -- /utils/txs/evaluate + -- /utils/txs/evaluate/utxos | EvaluateTransaction -- /blocks/latest | LatestBlock @@ -361,7 +379,7 @@ realizeEndpoint endpoint = EraSummaries -> "/network/eras" EvaluateTransaction -> - "/utils/txs/evaluate" + "/utils/txs/evaluate/utxos" LatestBlock -> "/blocks/latest" LatestEpoch -> @@ -555,6 +573,17 @@ getUtxoByOref oref@(TransactionInput { transactionId: txHash }) = runExceptT do traverse (ExceptT <<< resolveBlockfrostTxOutput) (snd <$> Array.find (eq oref <<< fst) (unwrap blockfrostUtxoMap)) +-- | Specialized function to get addresses only, without resolving script +-- | references. Used internally. +getOutputAddressesByTxHash + :: TransactionHash + -> BlockfrostServiceM (Either ClientError (Array Address)) +getOutputAddressesByTxHash txHash = runExceptT do + (blockfrostUtxoMap :: BlockfrostUtxosOfTransaction) <- ExceptT $ + blockfrostGetRequest (UtxosOfTransaction txHash) + <#> handle404AsMempty <<< handleBlockfrostResponse + pure $ _.address <<< unwrap <<< snd <$> unwrap blockfrostUtxoMap + -------------------------------------------------------------------------------- -- Get datum by hash -------------------------------------------------------------------------------- @@ -625,10 +654,10 @@ submitTx tx = do blockfrostPostRequest SubmitTransaction (MediaType "application/cbor") (Just $ Affjax.arrayView $ unwrap $ unwrap cbor) -evaluateTx :: Transaction -> BlockfrostServiceM TxEvaluationR -evaluateTx tx = do - cslTx <- liftEffect $ Serialization.convertTransaction tx - resp <- handleBlockfrostResponse <$> request (Serialization.toBytes cslTx) +evaluateTx + :: Transaction -> AdditionalUtxoSet -> BlockfrostServiceM TxEvaluationR +evaluateTx tx additionalUtxos = do + resp <- handleBlockfrostResponse <$> request case unwrapBlockfrostEvaluateTx <$> resp of Left err -> throwError $ error $ show err Right (Left err) -> @@ -637,13 +666,16 @@ evaluateTx tx = do err Right (Right eval) -> pure eval where - -- Hex encoded, not binary like submission - request - :: CborBytes - -> BlockfrostServiceM (Either Affjax.Error (Affjax.Response String)) - request cbor = - blockfrostPostRequest EvaluateTransaction (MediaType "application/cbor") - (Just $ Affjax.string $ cborBytesToHex cbor) + request :: BlockfrostServiceM (Either Affjax.Error (Affjax.Response String)) + request = do + cslTx <- liftEffect $ Serialization.convertTransaction tx + blockfrostPostRequest EvaluateTransaction MediaType.applicationJSON + ( Just $ Affjax.string $ stringifyAeson $ + encodeAeson + { cbor: cborBytesToHex $ Serialization.toBytes cslTx + , additionalUtxoSet: additionalUtxos + } + ) -------------------------------------------------------------------------------- -- Check transaction confirmation status @@ -859,8 +891,9 @@ instance DecodeAeson BlockfrostEvaluateTx where where success :: Either JsonDecodeError (Either Aeson TxEvaluationR) success = do - { result } :: { result :: TxEvaluationR } <- decodeAeson aeson - pure $ Right result + { result: BlockfrostTxEvaluationR res } + :: { result :: BlockfrostTxEvaluationR } <- decodeAeson aeson + pure $ Right res failure :: Either JsonDecodeError (Either Aeson TxEvaluationR) failure = pure $ Left aeson @@ -868,6 +901,166 @@ instance DecodeAeson BlockfrostEvaluateTx where unwrapBlockfrostEvaluateTx :: BlockfrostEvaluateTx -> Either Aeson TxEvaluationR unwrapBlockfrostEvaluateTx (BlockfrostEvaluateTx ei) = ei +-- +-- TxEvaluationR parsing +-- + +-- | Wrapper for Aeson parsing. +-- +-- Blockfrost returns on evaluateTx endpoint an ogmios response from the older Ogmios v5.6! +-- Ogmios backed parses against Ogmios v6, here we parse using the previous code for Ogmios. +-- +-- Note: TxEvaluationFailure as part of BlockfrostTxEvaluation doesn't parse with it's DecodeAeson instance. +newtype BlockfrostTxEvaluationR = BlockfrostTxEvaluationR TxEvaluationR + +instance DecodeAeson BlockfrostTxEvaluationR where + decodeAeson aeson = BlockfrostTxEvaluationR <$> + ( (wrap <<< Right <$> decodeBlockfrostTxEvaluationResult aeson) <|> + (wrap <<< Left <$> decodeBlockfrostTxEvaluationFailure aeson) + ) + +decodeBlockfrostTxEvaluationResult + :: Aeson -> Either JsonDecodeError TxEvaluationResult +decodeBlockfrostTxEvaluationResult = aesonObject $ \obj -> do + rdmrPtrExUnitsList :: Array (String /\ Aeson) <- + ForeignObject.toUnfoldable <$> getField obj "EvaluationResult" + TxEvaluationResult <<< Map.fromFoldable <$> + traverse decodeRdmrPtrExUnitsItem rdmrPtrExUnitsList + where + decodeRdmrPtrExUnitsItem + :: String /\ Aeson + -> Either JsonDecodeError (RedeemerPointer /\ ExecutionUnits) + decodeRdmrPtrExUnitsItem (redeemerPtrRaw /\ exUnitsAeson) = do + redeemerPtr <- decodeRedeemerPointer redeemerPtrRaw + flip aesonObject exUnitsAeson $ \exUnitsObj -> do + memory <- getField exUnitsObj "memory" + steps <- getField exUnitsObj "steps" + pure $ redeemerPtr /\ { memory, steps } + +data OldScriptFailure + = ExtraRedeemers (Array RedeemerPointer) + | MissingRequiredDatums + { provided :: Maybe (Array OgmiosDatum), missing :: Array OgmiosDatum } + | MissingRequiredScripts + { resolved :: Map RedeemerPointer OgmiosScript + , missing :: Array OgmiosScript + } + | ValidatorFailed { error :: String, traces :: Array String } + | UnknownInputReferencedByRedeemer OgmiosTxIn + | NonScriptInputReferencedByRedeemer OgmiosTxIn + | IllFormedExecutionBudget (Maybe ExecutionUnits) + | NoCostModelForLanguage String + +type ObjectParser = ReaderT (Object Aeson) (Either JsonDecodeError) + +liftField + :: forall (a :: Type) (b :: Type) + . DecodeAeson a + => String + -> (a -> Either JsonDecodeError b) + -> ObjectParser b +liftField f act = ReaderT (flip getField f >=> act) + +instance DecodeAeson OldScriptFailure where + decodeAeson = aesonObject $ runReaderT cases + where + cases :: ObjectParser OldScriptFailure + cases = decodeExtraRedeemers + <|> decodeMissingRequiredDatums + <|> decodeMissingRequiredScripts + <|> decodeValidatorFailed + <|> decodeUnknownInputReferencedByRedeemer + <|> decodeNonScriptInputReferencedByRedeemer + <|> decodeIllFormedExecutionBudget + <|> decodeNoCostModelForLanguage + <|> defaultCase + + defaultCase :: ObjectParser OldScriptFailure + defaultCase = ReaderT $ const $ Left $ TypeMismatch "Expected ScriptFailure" + + decodeExtraRedeemers :: ObjectParser OldScriptFailure + decodeExtraRedeemers = ExtraRedeemers <$> liftField "extraRedeemers" + (traverse decodeRedeemerPointer) + + decodeMissingRequiredDatums :: ObjectParser OldScriptFailure + decodeMissingRequiredDatums = liftField "missingRequiredDatums" \o -> do + pure $ MissingRequiredDatums o + + decodeMissingRequiredScripts :: ObjectParser OldScriptFailure + decodeMissingRequiredScripts = liftField "missingRequiredScripts" \o -> do + resolvedKV <- ForeignObject.toUnfoldable <$> getField o "resolved" + resolved <- Map.fromFoldable <$> for (resolvedKV :: Array _) + \(k /\ v) -> (_ /\ v) <$> decodeRedeemerPointer k + missing <- getField o "missing" + pure $ MissingRequiredScripts { resolved, missing } + + decodeValidatorFailed :: ObjectParser OldScriptFailure + decodeValidatorFailed = liftField "validatorFailed" \o -> do + pure $ ValidatorFailed o + + decodeUnknownInputReferencedByRedeemer :: ObjectParser OldScriptFailure + decodeUnknownInputReferencedByRedeemer = liftField + "unknownInputReferencedByRedeemer" + \o -> do + pure $ UnknownInputReferencedByRedeemer o + + decodeNonScriptInputReferencedByRedeemer :: ObjectParser OldScriptFailure + decodeNonScriptInputReferencedByRedeemer = liftField + "nonScriptInputReferencedByRedeemer" + \o -> do + pure $ NonScriptInputReferencedByRedeemer o + + decodeIllFormedExecutionBudget :: ObjectParser OldScriptFailure + decodeIllFormedExecutionBudget = liftField "illFormedExecutionBudget" \o -> + do + pure $ IllFormedExecutionBudget o + + decodeNoCostModelForLanguage :: ObjectParser OldScriptFailure + decodeNoCostModelForLanguage = liftField "noCostModelForLanguage" \o -> do + pure $ NoCostModelForLanguage o + +decodeBlockfrostTxEvaluationFailure + :: Aeson -> Either JsonDecodeError TxEvaluationFailure +decodeBlockfrostTxEvaluationFailure = aesonObject $ runReaderT cases + where + cases :: ObjectParser TxEvaluationFailure + cases = decodeScriptFailures <|> defaultCase + + defaultCase :: ObjectParser TxEvaluationFailure + defaultCase = ReaderT \o -> + pure (UnparsedError (stringifyAeson (encodeAeson o))) + + -- translate Ogmios v5.6 ScriptFailures to Ogmios v6 + translateOldToNew :: OldScriptFailure -> Either JsonDecodeError ScriptFailure + translateOldToNew x = case x of + ExtraRedeemers ptrs -> pure $ Ogmios.ExtraRedeemers ptrs + MissingRequiredDatums { provided, missing } -> pure $ + Ogmios.MissingRequiredDatums { missing, provided: provided } + MissingRequiredScripts { resolved: resolved0, missing: missing0 } -> do + missing <- traverse decodeRedeemerPointer missing0 + resolved :: Map RedeemerPointer ScriptHash <- traverse decodeAeson + (map (encodeAeson :: String -> _) resolved0) + pure $ Ogmios.MissingRequiredScripts { missing, resolved: Just resolved } + ValidatorFailed { error, traces } -> pure $ Ogmios.ValidatorFailed + { error, traces } + UnknownInputReferencedByRedeemer txin -> pure $ + Ogmios.UnknownInputReferencedByRedeemer [ txin ] + NonScriptInputReferencedByRedeemer txin -> pure $ + Ogmios.NonScriptInputReferencedByRedeemer txin + IllFormedExecutionBudget mexu -> pure $ + Ogmios.IllFormedExecutionBudget mexu + NoCostModelForLanguage lang -> pure $ Ogmios.NoCostModelForLanguage [ lang ] + + decodeScriptFailures :: ObjectParser TxEvaluationFailure + decodeScriptFailures = ReaderT \o -> do + scriptFailuresKV <- ForeignObject.toUnfoldable + <$> (getField o "EvaluationFailure" >>= flip getField "ScriptFailures") + scriptFailures <- Map.fromFoldable <$> for (scriptFailuresKV :: Array _) + \(k /\ v) -> do + v' <- traverse translateOldToNew =<< decodeAeson v + (_ /\ v') <$> decodeRedeemerPointer k + pure $ ScriptFailures scriptFailures + -------------------------------------------------------------------------------- -- BlockfrostUtxosAtAddress / BlockfrostUtxosOfTransaction -------------------------------------------------------------------------------- @@ -1219,7 +1412,7 @@ blockfrostStakeCredentialToBech32 = case _ of -- BlockfrostProtocolParameters -------------------------------------------------------------------------------- --- | `Stringed a` decodes an `a` who was encoded as a `String` +-- | `Stringed a` decodes an `a` that was encoded as a `String` newtype Stringed a = Stringed a derive instance Newtype (Stringed a) _ @@ -1227,6 +1420,17 @@ derive instance Newtype (Stringed a) _ instance DecodeAeson a => DecodeAeson (Stringed a) where decodeAeson = decodeAeson >=> decodeJsonString >=> Stringed >>> pure +newtype FiniteBigNumber = FiniteBigNumber BigNumber + +derive instance Newtype FiniteBigNumber _ + +instance DecodeAeson FiniteBigNumber where + decodeAeson aeson = do + number <- decodeAeson aeson + map FiniteBigNumber $ note (TypeMismatch "BigNumber") $ hush + $ BigNumber.parseBigNumber + $ show (number :: Number) + type BlockfrostProtocolParametersRaw = { "min_fee_a" :: UInt , "min_fee_b" :: UInt @@ -1237,9 +1441,9 @@ type BlockfrostProtocolParametersRaw = , "pool_deposit" :: Stringed BigInt , "e_max" :: BigInt , "n_opt" :: UInt - , "a0" :: Finite BigNumber - , "rho" :: Finite BigNumber - , "tau" :: Finite BigNumber + , "a0" :: FiniteBigNumber + , "rho" :: FiniteBigNumber + , "tau" :: FiniteBigNumber , "protocol_major_ver" :: UInt , "protocol_minor_ver" :: UInt , "min_pool_cost" :: Stringed BigInt @@ -1247,8 +1451,8 @@ type BlockfrostProtocolParametersRaw = { "PlutusV1" :: { | CostModelV1 } , "PlutusV2" :: { | CostModelV2 } } - , "price_mem" :: Finite BigNumber - , "price_step" :: Finite BigNumber + , "price_mem" :: FiniteBigNumber + , "price_step" :: FiniteBigNumber , "max_tx_ex_mem" :: Stringed BigInt , "max_tx_ex_steps" :: Stringed BigInt , "max_block_ex_mem" :: Stringed BigInt @@ -1260,15 +1464,15 @@ type BlockfrostProtocolParametersRaw = , "coins_per_utxo_word" :: Maybe (Stringed BigInt) } -toFraction' :: Finite BigNumber -> String /\ String +toFraction' :: BigNumber -> String /\ String toFraction' bn = (BigNumber.toString numerator /\ BigNumber.toString denominator) where - (numerator /\ denominator) = toFraction (unpackFinite bn) + (numerator /\ denominator) = toFraction bn (BigNumber.fromNumber infinity) -bigNumberToRational :: Finite BigNumber -> Either JsonDecodeError Rational -bigNumberToRational bn = note (TypeMismatch "Rational") do +bigNumberToRational :: FiniteBigNumber -> Either JsonDecodeError Rational +bigNumberToRational (FiniteBigNumber bn) = note (TypeMismatch "Rational") do numerator <- BigInt.fromString numerator' denominator <- BigInt.fromString denominator' reduce numerator denominator @@ -1276,9 +1480,9 @@ bigNumberToRational bn = note (TypeMismatch "Rational") do (numerator' /\ denominator') = toFraction' bn bigNumberToPrice - :: Finite BigNumber + :: FiniteBigNumber -> Either JsonDecodeError { numerator :: BigNum, denominator :: BigNum } -bigNumberToPrice bn = note (TypeMismatch "Rational") do +bigNumberToPrice (FiniteBigNumber bn) = note (TypeMismatch "Rational") do numerator <- BigNum.fromString numerator' denominator <- BigNum.fromString denominator' pure { numerator, denominator } diff --git a/src/Internal/Service/Error.purs b/src/Internal/Service/Error.purs index bf6a6be7a..ccfe6b41e 100644 --- a/src/Internal/Service/Error.purs +++ b/src/Internal/Service/Error.purs @@ -11,6 +11,8 @@ module Ctl.Internal.Service.Error ( ServiceBlockfrostError , ServiceOtherError ) + , pprintClientError + , pprintServiceError ) where import Prelude @@ -19,8 +21,9 @@ import Aeson (class DecodeAeson, JsonDecodeError, getField) import Affjax (Error, printError) as Affjax import Affjax.StatusCode (StatusCode) as Affjax import Ctl.Internal.Service.Helpers (aesonObject) +import Data.Argonaut.Decode.Error (printJsonDecodeError) import Data.Generic.Rep (class Generic) -import Data.Newtype (class Newtype) +import Data.Newtype (class Newtype, unwrap) import Data.Show.Generic (genericShow) -------------------------------------------------------------------------------- @@ -58,7 +61,7 @@ instance Show ClientError where <> ")" show (ClientHttpResponseError statusCode err) = "(ClientHttpResponseError " - <> show statusCode + <> show (unwrap statusCode) <> " " <> show err <> ")" @@ -75,6 +78,19 @@ instance Show ClientError where <> err <> ")" +pprintClientError :: ClientError -> String +pprintClientError = case _ of + ClientHttpError error -> "HTTP error: " <> Affjax.printError error + ClientHttpResponseError code serviceError -> + "Server responded with HTTP error code " <> show (unwrap code) <> " - " <> + pprintServiceError serviceError + ClientDecodeJsonError error jsonError -> "Failed to decode the response: " + <> error + <> " - " + <> printJsonDecodeError jsonError + ClientEncodingError error -> "Failed to encode the request: " <> error + ClientOtherError error -> "Error: " <> error + -------------------------------------------------------------------------------- -- ServiceError -------------------------------------------------------------------------------- @@ -108,3 +124,9 @@ instance DecodeAeson BlockfrostError where error <- getField obj "error" message <- getField obj "message" pure $ BlockfrostError { statusCode, error, message } + +pprintServiceError :: ServiceError -> String +pprintServiceError = case _ of + ServiceBlockfrostError (BlockfrostError { statusCode, error, message }) -> + "Blockfrost error (" <> show statusCode <> "): " <> error <> ": " <> message + ServiceOtherError error -> "Service error: " <> error diff --git a/src/Internal/Test/ContractTest.purs b/src/Internal/Test/ContractTest.purs index 683a2f7bd..9e8c92813 100644 --- a/src/Internal/Test/ContractTest.purs +++ b/src/Internal/Test/ContractTest.purs @@ -15,6 +15,13 @@ import Ctl.Internal.Test.UtxoDistribution (class UtxoDistribution) -- | Represents a `Contract` test suite that depend on *some* wallet -- | `UtxoDistribution`. +-- Internally this function takes a two-argument callback from +-- some distribution and a single test to some value and returns that value. +-- Another way of looking at it: pattern-match `ContractTest runTest`, +-- then you can pass a function to `runTest`: +-- `runTest \distr test -> ...` which gets you a result. +-- In practice `runTest` is a closure that stores distribution and a test and +-- passes them to the (\distr test -> ...) function. newtype ContractTest = ContractTest ( forall (r :: Type) . ( forall (distr :: Type) (wallets :: Type) @@ -42,6 +49,9 @@ type ContractTestHandler distr wallets r = UtxoDistribution distr wallets => distr -> (wallets -> Contract Unit) -> r -- | Represents `Contract`s in `TestPlanM` that depend on *some* wallet `UtxoDistribution` +-- Internally this is similar to `ContractTest`, except that +-- now a `runGroupPlan` (a function wrapped in the `ContractTestPlan`) closure +-- stores distribution and effects to construct a test tree. newtype ContractTestPlan = ContractTestPlan ( forall (r :: Type) . ( forall (distr :: Type) (wallets :: Type) @@ -50,7 +60,9 @@ newtype ContractTestPlan = ContractTestPlan -> r ) --- | Same as `ContractTestHandler`, but wrapped in a `TestPaln`. +-- | Same as `ContractTestHandler`, but wrapped in a `TestPlanM`. +-- | It is used for the reconstruction of the `MoteT` value. +-- | See the `Ctl.Internal.Plutip.execDistribution` function for more info. type ContractTestPlanHandler :: Type -> Type -> Type -> Type type ContractTestPlanHandler distr wallets r = UtxoDistribution distr wallets diff --git a/src/Internal/Test/E2E/Feedback.js b/src/Internal/Test/E2E/Feedback.js index a78681ce1..00ce74f53 100644 --- a/src/Internal/Test/E2E/Feedback.js +++ b/src/Internal/Test/E2E/Feedback.js @@ -1 +1,3 @@ -exports._publishTestFeedback = value => () => (window.ctlTestFeedback = value); +export function _publishTestFeedback(value) { + return () => (window.ctlTestFeedback = value); +} diff --git a/src/Internal/Test/E2E/Feedback/Browser.js b/src/Internal/Test/E2E/Feedback/Browser.js index 6137ec57a..6968cee19 100644 --- a/src/Internal/Test/E2E/Feedback/Browser.js +++ b/src/Internal/Test/E2E/Feedback/Browser.js @@ -1,11 +1,15 @@ -exports._pushBrowserEvent = message => () => { - if (typeof window.ctlE2ECommunications != "object") { - window.ctlE2ECommunications = []; - } - window.ctlE2ECommunications.push(message); -}; +export function _pushBrowserEvent(message) { + return () => { + if (typeof window.ctlE2ECommunications != "object") { + window.ctlE2ECommunications = []; + } + window.ctlE2ECommunications.push(message); + }; +} -exports._getClusterSetup = maybe => () => - window.ctlE2EClusterSetup - ? maybe.just(window.ctlE2EClusterSetup) - : maybe.nothing; +export function _getClusterSetup(maybe) { + return () => + window.ctlE2EClusterSetup + ? maybe.just(window.ctlE2EClusterSetup) + : maybe.nothing; +} diff --git a/src/Internal/Test/E2E/Options.purs b/src/Internal/Test/E2E/Options.purs index 267ddbe0d..371558944 100644 --- a/src/Internal/Test/E2E/Options.purs +++ b/src/Internal/Test/E2E/Options.purs @@ -8,7 +8,6 @@ module Ctl.Internal.Test.E2E.Options , CommonOptions_ , ClusterPortsOptions_ , ClusterPortsOptions - , JQuery_ , SettingsOptions , E2ECommand ( RunE2ETests @@ -87,7 +86,7 @@ import Type.Row (type (+)) -- | CLI options for E2E tests. type TestOptions = Record - ( NoHeadless_ + Tests_ + TestTimeout_ + ClusterPortsOptions_ + JQuery_ + ( NoHeadless_ + Tests_ + TestTimeout_ + ClusterPortsOptions_ + CommonOptions_ + () ) @@ -101,8 +100,6 @@ type ClusterPortsOptions_ (r :: Row Type) = type ClusterPortsOptions = Record (ClusterPortsOptions_ ()) -type JQuery_ (r :: Row Type) = (skipJQuery :: Boolean | r) - type NoHeadless_ (r :: Row Type) = (noHeadless :: Boolean | r) type Tests_ (r :: Row Type) = (tests :: Array E2ETest | r) @@ -299,10 +296,6 @@ testOptionsParser = ado [ long "no-headless" , help "Show visible browser window" ] - skipJQuery <- switch $ fold - [ long "skip-jquery-download" - , help "Skip downloading JQuery (useful for offline mode)" - ] testTimeout <- option (Just <$> int) $ fold [ long "test-timeout" , help "Timeout for each test" @@ -313,7 +306,7 @@ testOptionsParser = ado (clusterPorts :: ClusterPortsOptions) <- clusterPortsOptionsParser in build (merge clusterPorts <<< merge res) - { noHeadless, tests, testTimeout, skipJQuery } + { noHeadless, tests, testTimeout } testParser :: ReadM E2ETest testParser = eitherReader \str -> diff --git a/src/Internal/Test/E2E/Route.js b/src/Internal/Test/E2E/Route.js index 1ea426a03..b848aa400 100644 --- a/src/Internal/Test/E2E/Route.js +++ b/src/Internal/Test/E2E/Route.js @@ -1,44 +1,136 @@ -exports._queryString = () => window.location.search; +export function _queryString() { + return window.location.search; +} + +export function _setupBlockfrostApi() { + // Set up Blockfrost API key prompt and UI around it. + // This code is only needed for CTL itself. + const oldBlockfrostKey = localStorage.getItem("BLOCKFROST_API_KEY"); + + const addSpacer = () => { + const spacer = document.createElement("span"); + spacer.textContent = " "; + document.body.appendChild(spacer); + }; + + const addHtml = html => { + const div = document.createElement("div"); + div.innerHTML = html; + document.body.appendChild(div); + }; + + addHtml(`

Blockfrost setup

`); + + if (oldBlockfrostKey !== null) { + const keyIsSetEl = document.createElement("span"); + keyIsSetEl.innerHTML = + '✅ Blockfrost key is set.'; + document.body.appendChild(keyIsSetEl); + + addSpacer(); + + const setBFKeyButton = document.createElement("button"); + setBFKeyButton.textContent = "Unset"; + setBFKeyButton.onclick = () => { + localStorage.removeItem("BLOCKFROST_API_KEY"); + window.location = "/"; + }; + document.body.appendChild(setBFKeyButton); + } else { + const keyIsNotSetEl = document.createElement("span"); + keyIsNotSetEl.innerHTML = + '❌ Blockfrost key is not set.'; + document.body.appendChild(keyIsNotSetEl); + + addSpacer(); + + const setBFKeyButton = document.createElement("button"); + setBFKeyButton.textContent = "Set Blockfrost API key"; + setBFKeyButton.onclick = () => { + const key = prompt("Enter your Blockfrost API key"); + if (key !== null) { + localStorage.setItem("BLOCKFROST_API_KEY", key); + window.location = "/"; + } + }; + document.body.appendChild(setBFKeyButton); + } + + addHtml(`
If you are viewing this page via an E2E-test-suite-controlled browser, to set the Blockfrost API key permanently, close the browser and run: +
+        npm run e2e-pack-settings
+      
+ The key will be saved to your settings archive. Sharing the archive file after that implies that the key can be leaked.
`); +} const createLink = (example, wallet) => '' + wallet + ""; -exports._writeExampleHTML = example => wallets => () => { - const ul = document.getElementById("examples"); - const li = document.createElement("li"); - li.innerHTML = `${example}: ${wallets - .map(w => createLink(example, w)) - .join(" ")}`; - ul.appendChild(li); -}; - -exports._addLinks = configs => tests => () => { - const table = document.createElement("table"); - table.border = "1"; - const header = document.createElement("tr"); - - header.appendChild(document.createElement("th")); - for (let config of configs) { - const td = document.createElement("th"); - td.textContent = config; - header.appendChild(td); - } - table.appendChild(header); - - for (let test of tests) { - const tr = document.createElement("tr"); - const titleTd = document.createElement("td"); - titleTd.textContent = test; - tr.appendChild(titleTd); - for (let config of configs) { - const td = document.createElement("td"); - const link = document.createElement("a"); - link.href = "?" + config + ":" + test; - link.textContent = config; - td.appendChild(link); - tr.appendChild(td); - } - table.appendChild(tr); - } - document.body.appendChild(table); -}; +export function _writeExampleHTML(example) { + return wallets => () => { + const ul = document.getElementById("examples"); + const li = document.createElement("li"); + li.innerHTML = `${example}: ${wallets + .map(w => createLink(example, w)) + .join(" ")}`; + ul.appendChild(li); + }; +} + +export function _addLinks(configs) { + return tests => () => { + const configSelectEl = document.createElement("select"); + const testNameSelectEl = document.createElement("select"); + const linkEl = document.createElement("a"); + linkEl.textContent = "➡ RUN EXAMPLE"; + + const h1El = document.createElement("h3"); + h1El.textContent = "Example runner"; + + const selectEnvironmentEl = document.createElement("span"); + selectEnvironmentEl.textContent = "Environment: "; + + const selectExampleEl = document.createElement("span"); + selectExampleEl.textContent = "Example: "; + + document.body.appendChild(h1El); + document.body.appendChild(selectEnvironmentEl); + + const updateUrl = () => { + linkEl.href = "?" + configSelectEl.value + ":" + testNameSelectEl.value; + }; + + configs.forEach((config, ix) => { + const optionEl = document.createElement("option"); + optionEl.textContent = config; + optionEl.value = config; + configSelectEl.appendChild(optionEl); + if (document.location.search.startsWith("?" + config + ":")) { + configSelectEl.selectedIndex = ix; + } + }); + document.body.appendChild(configSelectEl); + document.body.appendChild(document.createElement("br")); + + document.body.appendChild(selectExampleEl); + + tests.forEach((test, ix) => { + const optionEl = document.createElement("option"); + optionEl.textContent = test; + optionEl.value = test; + testNameSelectEl.appendChild(optionEl); + if (document.location.search.endsWith(":" + test)) { + testNameSelectEl.selectedIndex = ix; + } + }); + document.body.appendChild(testNameSelectEl); + + updateUrl(); + document.body.appendChild(document.createElement("br")); + + document.body.appendChild(linkEl); + + configSelectEl.onchange = updateUrl; + testNameSelectEl.onchange = updateUrl; + }; +} diff --git a/src/Internal/Test/E2E/Route.purs b/src/Internal/Test/E2E/Route.purs index 7b44844ee..6bb113bf6 100644 --- a/src/Internal/Test/E2E/Route.purs +++ b/src/Internal/Test/E2E/Route.purs @@ -1,4 +1,4 @@ -module Ctl.Internal.E2E.Route +module Ctl.Internal.Test.E2E.Route ( E2ETestName , E2EConfigName , route @@ -111,6 +111,7 @@ addLinks configMaps testMaps = do configs = Array.fromFoldable $ Map.keys configMaps tests = Array.fromFoldable $ Map.keys testMaps _addLinks configs tests + _setupBlockfrostApi -- | Serves given examples conditionally, depending on the URL query part. -- | @@ -223,3 +224,5 @@ foreign import _writeExampleHTML :: String -> Array String -> Effect Unit foreign import _addLinks :: Array E2EConfigName -> Array E2ETestName -> Effect Unit + +foreign import _setupBlockfrostApi :: Effect Unit diff --git a/src/Internal/Test/E2E/Runner.js b/src/Internal/Test/E2E/Runner.js index 58ca7ffd5..0e57d9e2d 100644 --- a/src/Internal/Test/E2E/Runner.js +++ b/src/Internal/Test/E2E/Runner.js @@ -1,9 +1,11 @@ -exports._retrieveJQuery = page => () => - page.evaluate(() => - window - .fetch( - "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" - ) - .then(res => res.text()) - .catch(_ => "") - ); +export function _retrieveJQuery(page) { + return () => + page.evaluate(() => + window + .fetch( + "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" + ) + .then(res => res.text()) + .catch(_ => "") + ); +} diff --git a/src/Internal/Test/E2E/Runner.purs b/src/Internal/Test/E2E/Runner.purs index 559250095..26a659b9c 100644 --- a/src/Internal/Test/E2E/Runner.purs +++ b/src/Internal/Test/E2E/Runner.purs @@ -7,12 +7,13 @@ module Ctl.Internal.Test.E2E.Runner import Prelude -import Affjax (defaultRequest, request) as Affjax +import Affjax (defaultRequest) as Affjax import Affjax (printError) import Affjax.ResponseFormat as Affjax.ResponseFormat import Control.Alt ((<|>)) import Control.Monad.Error.Class (liftMaybe) import Control.Promise (Promise, toAffE) +import Ctl.Internal.Affjax (request) as Affjax import Ctl.Internal.Contract.Hooks (emptyHooks) import Ctl.Internal.Contract.QueryBackend (QueryBackend(CtlBackend)) import Ctl.Internal.Deserialization.Keys (privateKeyFromBytes) @@ -50,7 +51,7 @@ import Ctl.Internal.Test.E2E.Types , SettingsArchive , SettingsRuntime , TmpDir - , WalletExt(FlintExt, NamiExt, GeroExt, LodeExt, EternlExt) + , WalletExt(FlintExt, NamiExt, GeroExt, LodeExt, EternlExt, LaceExt) , getE2EWalletExtension , mkE2ETest , mkExtensionId @@ -63,6 +64,8 @@ import Ctl.Internal.Test.E2E.Wallets , flintSign , geroConfirmAccess , geroSign + , laceConfirmAccess + , laceSign , lodeConfirmAccess , lodeSign , namiConfirmAccess @@ -78,7 +81,6 @@ import Ctl.Internal.Wallet.Key ) import Data.Array (catMaybes, mapMaybe, nub) import Data.Array as Array -import Data.BigInt as BigInt import Data.Either (Either(Left, Right), isLeft) import Data.Foldable (fold) import Data.HTTP.Method (Method(GET)) @@ -111,6 +113,7 @@ import Effect.Class (liftEffect) import Effect.Console (log) import Effect.Exception (Error, error, throw) import Effect.Ref as Ref +import JS.BigInt as BigInt import Mote (group, test) import Node.Buffer (fromArrayBuffer) import Node.ChildProcess @@ -125,8 +128,9 @@ import Node.ChildProcess ) import Node.ChildProcess as ChildProcess import Node.Encoding as Encoding -import Node.FS.Aff (exists, stat, writeFile) +import Node.FS.Aff (stat, writeFile) import Node.FS.Stats (isDirectory) +import Node.FS.Sync (exists) import Node.Path (FilePath, concat, dirname, relative) import Node.Process (lookupEnv) import Node.Stream (onDataString) @@ -145,14 +149,12 @@ runE2ECommand = case _ of noHeadless <- liftEffect $ readNoHeadless testOptions.noHeadless testTimeout <- liftEffect $ readTestTimeout testOptions.testTimeout portOptions <- liftEffect $ readPorts testOptions - skipJQuery <- liftEffect $ readSkipJQuery testOptions.skipJQuery extraBrowserArgs <- liftEffect $ readExtraArgs testOptions.extraBrowserArgs let testOptions' = build (merge portOptions) $ testOptions { noHeadless = noHeadless , testTimeout = testTimeout , tests = tests - , skipJQuery = skipJQuery , extraBrowserArgs = extraBrowserArgs } runE2ETests testOptions' runtime @@ -172,7 +174,7 @@ runE2ECommand = case _ of ensureDir :: FilePath -> Aff Unit ensureDir dir = do - dirExists <- exists dir + dirExists <- liftEffect $ exists dir unless dirExists $ do liftEffect $ log $ "Creating directory " <> dir void $ spawnAndCollectOutput "mkdir" [ "-p", dir ] @@ -211,7 +213,11 @@ buildPlutipConfig options = , customLogger: Just \_ _ -> pure unit , hooks: emptyHooks , clusterConfig: - { slotLength: Seconds 0.05 } + { slotLength: Seconds 0.05 + , epochSize: Nothing + , maxTxSize: Nothing + , raiseExUnitsToMax: false + } } -- | Plutip does not generate private stake keys for us, so we make one and @@ -229,11 +235,13 @@ testPlan testPlan opts@{ tests } rt@{ wallets } = group "E2E tests" do for_ tests \testEntry@{ specString } -> test specString $ case testEntry of + -- KeyWallet tests { url, wallet: NoWallet } -> do withBrowser opts.noHeadless opts.extraBrowserArgs rt Nothing \browser -> do - withE2ETest opts.skipJQuery (wrap url) browser \{ page } -> do + withE2ETest true (wrap url) browser \{ page } -> do subscribeToTestStatusUpdates page + -- Plutip in E2E tests { url, wallet: PlutipCluster } -> do let distr = withStakeKey privateStakeKey @@ -259,9 +267,10 @@ testPlan opts@{ tests } rt@{ wallets } = _ -> liftEffect $ throw "Unsupported backend" withBrowser opts.noHeadless opts.extraBrowserArgs rt Nothing \browser -> do - withE2ETest opts.skipJQuery (wrap url) browser \{ page } -> do + withE2ETest true (wrap url) browser \{ page } -> do setClusterSetup page clusterSetup subscribeToTestStatusUpdates page + -- E2E tests with a light wallet { url, wallet: WalletExtension wallet } -> do { password, extensionId } <- liftEffect $ liftMaybe @@ -269,7 +278,7 @@ testPlan opts@{ tests } rt@{ wallets } = $ Map.lookup wallet wallets withBrowser opts.noHeadless opts.extraBrowserArgs rt (Just extensionId) \browser -> do - withE2ETest opts.skipJQuery (wrap url) browser \re@{ page } -> do + withE2ETest false (wrap url) browser \re@{ page } -> do let confirmAccess = case wallet of @@ -278,6 +287,7 @@ testPlan opts@{ tests } rt@{ wallets } = GeroExt -> geroConfirmAccess LodeExt -> lodeConfirmAccess NamiExt -> namiConfirmAccess + LaceExt -> laceConfirmAccess sign = case wallet of EternlExt -> eternlSign @@ -285,6 +295,7 @@ testPlan opts@{ tests } rt@{ wallets } = GeroExt -> geroSign LodeExt -> lodeSign NamiExt -> namiSign + LaceExt -> laceSign someWallet = { wallet , name: walletName wallet @@ -303,8 +314,11 @@ testPlan opts@{ tests } rt@{ wallets } = ConfirmAccess -> rethrow someWallet.confirmAccess Sign -> rethrow someWallet.sign Success -> pure unit - Failure _ -> pure unit -- error raised directly inside `subscribeToBrowserEvents` + -- error will be raised directly inside + -- `subscribeToBrowserEvents` + Failure _ -> pure unit where + -- A specialized version that does not deal with wallet automation subscribeToTestStatusUpdates :: Toppokki.Page -> Aff Unit subscribeToTestStatusUpdates page = subscribeToBrowserEvents page @@ -345,7 +359,6 @@ readTestRuntime testOptions = do <<< delete (Proxy :: Proxy "testTimeout") <<< delete (Proxy :: Proxy "plutipPort") <<< delete (Proxy :: Proxy "ogmiosPort") - <<< delete (Proxy :: Proxy "skipJQuery") <<< delete (Proxy :: Proxy "kupoPort") ) readBrowserRuntime Nothing $ removeUnneeded testOptions @@ -386,6 +399,7 @@ readExtensions wallets = do gero <- readExtensionParams "GERO" wallets lode <- readExtensionParams "LODE" wallets eternl <- readExtensionParams "ETERNL" wallets + lace <- readExtensionParams "LACE" wallets pure $ Map.fromFoldable $ catMaybes [ Tuple NamiExt <$> nami @@ -393,6 +407,7 @@ readExtensions wallets = do , Tuple GeroExt <$> gero , Tuple LodeExt <$> lode , Tuple EternlExt <$> eternl + , Tuple LaceExt <$> lace ] -- | Read E2E test suite parameters from environment variables and CLI @@ -556,16 +571,6 @@ retrieveJQuery = toAffE <<< _retrieveJQuery foreign import _retrieveJQuery :: Toppokki.Page -> Effect (Promise String) -readSkipJQuery :: Boolean -> Effect Boolean -readSkipJQuery true = pure true -readSkipJQuery false = do - mbStr <- lookupEnv "E2E_SKIP_JQUERY_DOWNLOAD" - case mbStr of - Nothing -> pure false - Just str -> do - liftMaybe (error $ "Failed to read E2E_SKIP_JQUERY_DOWNLOAD: " <> str) $ - readBoolean str - readExtraArgs :: Array BrowserArg -> Effect (Array BrowserArg) readExtraArgs old = do mbStr <- lookupEnv "E2E_EXTRA_BROWSER_ARGS" @@ -632,7 +637,7 @@ findSettingsArchive testOptions = do ) pure $ testOptions.settingsArchive - doesExist <- exists settingsArchive + doesExist <- liftEffect $ exists settingsArchive unless doesExist $ do -- Download settings archive from URL if file does not exist @@ -662,7 +667,7 @@ findChromeProfile testOptions = do ) pure $ testOptions.chromeUserDataDir - doesExist <- exists chromeDataDir + doesExist <- liftEffect $ exists chromeDataDir unless doesExist $ ensureChromeUserDataDir chromeDataDir isDir <- isDirectory <$> stat chromeDataDir @@ -722,7 +727,7 @@ readExtensionParams extName wallets = do case crxFile, password, extensionId of Nothing, Nothing, Nothing -> pure Nothing Just crx, Just pwd, Just extId -> do - doesExist <- exists crx + doesExist <- liftEffect $ exists crx unless doesExist $ do -- Download from specified URL if crx file does not exist crxFileUrl <- @@ -756,7 +761,7 @@ packSettings :: SettingsArchive -> ChromeUserDataDir -> Aff Unit packSettings settingsArchive userDataDir = do -- Passing a non-existent directory to tar will error, -- but we can't rely on the existence of these directories. - paths <- filterExistingPaths userDataDir + paths <- liftEffect $ filterExistingPaths userDataDir [ "./Default/IndexedDB/" , "./Default/Local Storage/" , "./Default/Extension State" @@ -783,7 +788,7 @@ packSettings settingsArchive userDataDir = do defaultErrorReader -- | Filter out non-existing paths, relative to the given directory -filterExistingPaths :: FilePath -> Array FilePath -> Aff (Array FilePath) +filterExistingPaths :: FilePath -> Array FilePath -> Effect (Array FilePath) filterExistingPaths base paths = do catMaybes <$> for paths \path -> do exists (concat [ base, path ]) >>= case _ of @@ -931,3 +936,4 @@ walletName = case _ of GeroExt -> "gero" LodeExt -> "lode" NamiExt -> "nami" + LaceExt -> "lace" diff --git a/src/Internal/Test/E2E/Types.purs b/src/Internal/Test/E2E/Types.purs index a75087a66..bbb3594ac 100644 --- a/src/Internal/Test/E2E/Types.purs +++ b/src/Internal/Test/E2E/Types.purs @@ -12,7 +12,7 @@ module Ctl.Internal.Test.E2E.Types , unExtensionId , WalletPassword , ExtensionParams - , WalletExt(FlintExt, NamiExt, GeroExt, LodeExt, EternlExt) + , WalletExt(FlintExt, NamiExt, GeroExt, LodeExt, EternlExt, LaceExt) , Extensions , E2ETestRuntime , SettingsRuntime @@ -93,7 +93,7 @@ type ExtensionParams = } -- | Enumeration of all known extensions. -data WalletExt = FlintExt | NamiExt | GeroExt | LodeExt | EternlExt +data WalletExt = FlintExt | NamiExt | GeroExt | LodeExt | EternlExt | LaceExt derive instance Eq WalletExt derive instance Ord WalletExt @@ -148,6 +148,7 @@ mkE2ETest str = <|> (tryWalletPrefix "gero" <#> mkTestEntry (WalletExtension GeroExt)) <|> (tryWalletPrefix "lode" <#> mkTestEntry (WalletExtension LodeExt)) <|> (tryWalletPrefix "nami" <#> mkTestEntry (WalletExtension NamiExt)) + <|> (tryWalletPrefix "lace" <#> mkTestEntry (WalletExtension LaceExt)) <|> (tryWalletPrefix "plutip" <#> mkTestEntry PlutipCluster) <|> (pure $ mkTestEntry NoWallet str) where diff --git a/src/Internal/Test/E2E/Wallets.js b/src/Internal/Test/E2E/Wallets.js index db78ffc21..a01ba8313 100644 --- a/src/Internal/Test/E2E/Wallets.js +++ b/src/Internal/Test/E2E/Wallets.js @@ -1,4 +1,8 @@ -exports._typeInto = selector => text => page => () => - page.focus(selector).then(() => page.keyboard.type(text)); +export function _typeInto(selector) { + return text => page => () => + page.focus(selector).then(() => page.keyboard.type(text)); +} -exports.pageUrl = page => () => page.url(); +export function pageUrl(page) { + return () => page.url(); +} diff --git a/src/Internal/Test/E2E/Wallets.purs b/src/Internal/Test/E2E/Wallets.purs index bdc265443..1d036819e 100644 --- a/src/Internal/Test/E2E/Wallets.purs +++ b/src/Internal/Test/E2E/Wallets.purs @@ -10,6 +10,8 @@ module Ctl.Internal.Test.E2E.Wallets , lodeSign , namiConfirmAccess , namiSign + , laceConfirmAccess + , laceSign ) where import Prelude @@ -221,6 +223,51 @@ geroSign extId password re = where pattern = Pattern $ unExtensionId extId <> "/index.html?#/swap?tx=" +laceConfirmAccess :: ExtensionId -> RunningE2ETest -> Aff Unit +laceConfirmAccess extId re = do + void $ liftEffect $ throw "Lace support is not implemented" + wasInPage <- isJust <$> inWalletPageOptional extId pattern re + confirmAccessTimeout + \page -> do + void $ Toppokki.pageWaitForSelector (wrap $ "button") + {} + page + delaySec 1.0 + void $ doJQ (buttonWithText "Authorize") click page + delaySec 0.1 + void $ doJQ (buttonWithText "Always") click page + when wasInPage do + waitForWalletPageClose pattern 10.0 re.browser + -- Trigger wallet page opening. + -- Lace has a glitch that prevents CIP-30 API promises from resolving until + -- the wallet is interacted with at least once after browser startup. + -- https://discord.com/channels/826816523368005654/1050085066056925195/1091336339250749511 + -- Toppokki.newPage re.browser >>= + -- Toppokki.goto (wrap $ "chrome-extension://" <> unExtensionId extId <> "/app.html#/assets") + where + pattern :: Pattern + pattern = wrap $ unExtensionId extId <> "/dappConnector.html" + +-- Not implemented yet +laceSign :: ExtensionId -> WalletPassword -> RunningE2ETest -> Aff Unit +laceSign extId password re = do + void $ liftEffect $ throw "Lace support is not implemented" + inWalletPage pattern re signTimeout \page -> do + void $ Toppokki.pageWaitForSelector (wrap $ "button") + {} + page + delaySec 0.1 + clickButton "Confirm" page + delaySec 0.1 + typeInto (inputType "password") password page + delaySec 0.1 + clickButton "Confirm" page + delaySec 1.0 + clickButton "Close" page + -- TODO: continue from here + where + pattern = Pattern $ unExtensionId extId <> "/dappConnector.html#/dapp/sign-tx" + -- Not implemented yet flintConfirmAccess :: ExtensionId -> RunningE2ETest -> Aff Unit flintConfirmAccess _ _ = @@ -233,7 +280,10 @@ flintSign _ _ _ = do getJQuery :: RunningE2ETest -> Aff String getJQuery re = - liftM (error "JQuery not available (E2E_SKIP_JQUERY_DOWNLOAD=true)") re.jQuery + liftM (error errMessage) re.jQuery + where + errMessage = + "JQuery not available (wrong E2E runtime type? Please report as bug)" lodeConfirmAccess :: ExtensionId -> RunningE2ETest -> Aff Unit lodeConfirmAccess extId re = do diff --git a/src/Internal/Test/KeyDir.purs b/src/Internal/Test/KeyDir.purs index 8b3e1bd67..3716fabc3 100644 --- a/src/Internal/Test/KeyDir.purs +++ b/src/Internal/Test/KeyDir.purs @@ -6,8 +6,6 @@ import Prelude import Contract.Address ( addressToBech32 - , getWalletAddresses - , ownPaymentPubKeysHashes ) import Contract.Config (ContractParams) import Contract.Hashing (publicKeyHash) @@ -28,9 +26,15 @@ import Contract.Transaction , submit , submitTxFromConstraints ) -import Contract.Utxos (getWalletBalance, utxosAt) +import Contract.Utxos (utxosAt) import Contract.Value (valueToCoin') -import Contract.Wallet (privateKeysToKeyWallet, withKeyWallet) +import Contract.Wallet + ( getWalletAddresses + , getWalletBalance + , ownPaymentPubKeyHashes + , privateKeysToKeyWallet + , withKeyWallet + ) import Contract.Wallet.Key ( keyWalletPrivatePaymentKey , keyWalletPrivateStakeKey @@ -45,10 +49,12 @@ import Contract.Wallet.KeyFile import Control.Monad.Error.Class (liftMaybe) import Control.Monad.Except (throwError) import Control.Monad.Reader (asks, local) +import Control.Parallel (parTraverse, parTraverse_) import Ctl.Internal.Deserialization.Keys (freshPrivateKey) import Ctl.Internal.Helpers (logWithLevel) import Ctl.Internal.Plutus.Types.Transaction (_amount, _output) import Ctl.Internal.Plutus.Types.Value (Value, lovelaceValueOf) +import Ctl.Internal.ProcessConstraints (mkUnbalancedTxImpl) import Ctl.Internal.Serialization.Address (addressBech32) import Ctl.Internal.Test.ContractTest (ContractTest(ContractTest)) import Ctl.Internal.Test.TestPlanM (TestPlanM) @@ -58,7 +64,7 @@ import Ctl.Internal.Test.UtxoDistribution , encodeDistribution , keyWallets ) -import Ctl.Internal.Types.ScriptLookups (mkUnbalancedTx, unspentOutputs) +import Ctl.Internal.Types.ScriptLookups (unspentOutputs) import Ctl.Internal.Types.TxConstraints ( TxConstraint(MustPayToPubKeyAddress) , TxConstraints @@ -67,11 +73,9 @@ import Ctl.Internal.Types.TxConstraints , mustSpendPubKeyOutput , singleton ) -import Ctl.Internal.Wallet (KeyWallet) +import Ctl.Internal.Wallet.Key (KeyWallet) import Data.Array (catMaybes) import Data.Array as Array -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Either (Either(Right, Left), hush) import Data.Foldable (fold, sum) import Data.Lens ((^.)) @@ -98,9 +102,12 @@ import Effect.Class (liftEffect) import Effect.Class.Console (info) import Effect.Exception (error, throw) import Effect.Ref as Ref +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Mote.Monad (mapTest) import Node.Encoding (Encoding(UTF8)) -import Node.FS.Aff (exists, mkdir, readTextFile, readdir, writeTextFile) +import Node.FS.Aff (mkdir, readTextFile, readdir, writeTextFile) +import Node.FS.Sync (exists) import Node.Path (FilePath) import Node.Path (concat) as Path import Type.Prelude (Proxy(Proxy)) @@ -163,8 +170,8 @@ runContractTestsWithKeyDir params backup = do "The test engine cannot satisfy the requested ADA distribution " <> "because there are not enough funds left. \n\n" <> "Total required value is: " - <> BigInt.toString distrTotalAmount - <> " Lovelace (estimated)\n" + <> showLovelace distrTotalAmount + <> " (estimated)\n" <> "Total available value is: " <> BigInt.toString (valueToCoin' balance) <> "\nThe test suite is using this address: " @@ -224,7 +231,7 @@ runContractTestsWithKeyDir params backup = do -- | recovery attempts that happen before each test run. markAsInactive :: FilePath -> Array KeyWallet -> Contract Unit markAsInactive backup wallets = do - for_ wallets \wallet -> do + flip parTraverse_ wallets \wallet -> do networkId <- asks _.networkId let address = addressBech32 $ (unwrap wallet).address networkId @@ -240,7 +247,7 @@ markAsInactive backup wallets = do restoreWallets :: FilePath -> Aff (Array KeyWallet) restoreWallets backup = do walletDirs <- readdir backup <#> Array.filter (String.startsWith "addr") - catMaybes <$> for walletDirs \walletDir -> do + catMaybes <$> flip parTraverse walletDirs \walletDir -> do let paymentKeyFilePath = Path.concat [ backup, walletDir, "payment_signing_key" ] @@ -248,7 +255,7 @@ restoreWallets backup = do [ backup, walletDir, "stake_signing_key" ] inactiveFlagFile = Path.concat [ backup, walletDir, "inactive" ] -- Skip this wallet if it was marked as inactive - exists inactiveFlagFile >>= case _ of + liftEffect (exists inactiveFlagFile) >>= case _ of true -> pure Nothing false -> do paymentKeyEnvelope <- readTextFile UTF8 paymentKeyFilePath @@ -273,19 +280,20 @@ restoreWallets backup = do -- | Save wallets to files in the backup directory for private keys backupWallets :: FilePath -> ContractEnv -> Array KeyWallet -> Aff Unit -backupWallets backup env walletsArray = liftAff $ for_ walletsArray \wallet -> - do - let - address = addressBech32 $ (unwrap wallet).address env.networkId - payment = keyWalletPrivatePaymentKey wallet - mbStake = keyWalletPrivateStakeKey wallet - folder = Path.concat [ backup, address ] +backupWallets backup env walletsArray = + liftAff $ flip parTraverse_ walletsArray \wallet -> + do + let + address = addressBech32 $ (unwrap wallet).address env.networkId + payment = keyWalletPrivatePaymentKey wallet + mbStake = keyWalletPrivateStakeKey wallet + folder = Path.concat [ backup, address ] - mkdir folder - privatePaymentKeyToFile (Path.concat [ folder, "payment_signing_key" ]) - payment - for mbStake $ privateStakeKeyToFile - (Path.concat [ folder, "stake_signing_key" ]) + mkdir folder + privatePaymentKeyToFile (Path.concat [ folder, "payment_signing_key" ]) + payment + for mbStake $ privateStakeKeyToFile + (Path.concat [ folder, "stake_signing_key" ]) -- | Create a transaction that builds a specific UTxO distribution on the wallets. fundWallets @@ -297,14 +305,14 @@ fundWallets env walletsArray distrArray = runContractInEnv env $ noLogs do \(wallet /\ walletDistr) -> flip foldMap walletDistr \value -> mustPayToKeyWallet wallet $ lovelaceValueOf value - txHash <- submitTxFromConstraints (mempty :: _ Void) constraints + txHash <- submitTxFromConstraints mempty constraints awaitTxConfirmed txHash let fundTotal = Array.foldl (+) zero $ join distrArray -- Use log so we can see, regardless of suppression info $ joinWith " " [ "Sent" - , BigInt.toString fundTotal - , "lovelace to test wallets" + , showLovelace fundTotal + , "to test wallets" ] pure fundTotal @@ -352,14 +360,15 @@ returnFunds returnFunds backup env allWalletsArray mbFundTotal hasRun = runContractInEnv env $ noLogs do - nonEmptyWallets <- catMaybes <$> for allWalletsArray \wallet -> do - withKeyWallet wallet do - utxoMap <- liftedM "Failed to get utxos" $ - (getWalletAddresses <#> Array.head) >>= traverse utxosAt - if Map.isEmpty utxoMap then do - markAsInactive backup [ wallet ] - pure Nothing - else pure $ Just (utxoMap /\ wallet) + nonEmptyWallets <- catMaybes <$> + flip parTraverse allWalletsArray \wallet -> do + withKeyWallet wallet do + utxoMap <- liftedM "Failed to get utxos" $ + (getWalletAddresses <#> Array.head) >>= traverse utxosAt + if Map.isEmpty utxoMap then do + markAsInactive backup [ wallet ] + pure Nothing + else pure $ Just (utxoMap /\ wallet) when (Array.length nonEmptyWallets /= 0) do -- Print the messages only if we are running during initial fund recovery @@ -371,15 +380,15 @@ returnFunds backup env allWalletsArray mbFundTotal hasRun = let utxos = nonEmptyWallets # map fst # Map.unions pkhs <- fold <$> for nonEmptyWallets - (snd >>> flip withKeyWallet ownPaymentPubKeysHashes) + (snd >>> flip withKeyWallet ownPaymentPubKeyHashes) let constraints = flip foldMap (Map.keys utxos) mustSpendPubKeyOutput <> foldMap mustBeSignedBy pkhs lookups = unspentOutputs utxos - unbalancedTx <- liftedE $ mkUnbalancedTx (lookups :: _ Void) constraints - balancedTx <- liftedE $ balanceTx unbalancedTx + unbalancedTx <- liftedE $ mkUnbalancedTxImpl lookups constraints + balancedTx <- balanceTx unbalancedTx balancedSignedTx <- Array.foldM (\tx wallet -> withKeyWallet wallet $ signTransaction tx) (wrap $ unwrap balancedTx) @@ -396,13 +405,12 @@ returnFunds backup env allWalletsArray mbFundTotal hasRun = info $ joinWith " " $ [ "Refunded" - , BigInt.toString refundTotal - , "Lovelace" + , showLovelace refundTotal ] <> maybe [] ( \fundTotal -> [ "of" - , BigInt.toString fundTotal - , "Lovelace from test wallets" + , showLovelace fundTotal + , "from test wallets" ] ) mbFundTotal @@ -412,16 +420,25 @@ returnFunds backup env allWalletsArray mbFundTotal hasRun = <> "need any funds to succeed. Consider using `noWallet` to " <> "skip funds distribution step" +showLovelace :: BigInt -> String +showLovelace n = + if isAdaExact then BigInt.toString (n `div` million) <> " ADA" + else BigInt.toString n <> " Lovelace" + where + million = BigInt.fromInt 1_000_000 + isAdaExact = + (n `div` million) * million == n + -- | A helper function that abstracts away conversion between `KeyWallet` and -- | its address and just gives us a `TxConstraints` value. mustPayToKeyWallet :: forall (i :: Type) (o :: Type) . KeyWallet -> Value - -> TxConstraints i o + -> TxConstraints mustPayToKeyWallet wallet value = let - convert = wrap <<< publicKeyHash <<< publicKeyFromPrivateKey + convert = publicKeyHash <<< publicKeyFromPrivateKey payment = over wrap convert $ keyWalletPrivatePaymentKey wallet mbStake = over wrap convert <$> keyWalletPrivateStakeKey wallet in diff --git a/src/Internal/Test/UtxoDistribution.purs b/src/Internal/Test/UtxoDistribution.purs index 630691349..d4e3476b4 100644 --- a/src/Internal/Test/UtxoDistribution.purs +++ b/src/Internal/Test/UtxoDistribution.purs @@ -18,12 +18,9 @@ import Contract.Address ( PaymentPubKeyHash , StakePubKeyHash , getNetworkId - , getWalletAddresses - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes , payPubKeyHashEnterpriseAddress ) -import Contract.Monad (Contract, liftContractM, liftedE, liftedM) +import Contract.Monad (Contract, liftContractM, liftedM) import Contract.Prelude (foldM, foldMap, null) import Contract.ScriptLookups as Lookups import Contract.Transaction @@ -34,8 +31,15 @@ import Contract.Transaction , submit ) import Contract.TxConstraints as Constraints +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Utxos (utxosAt) -import Contract.Wallet (mkKeyWalletFromPrivateKeys, withKeyWallet) +import Contract.Wallet + ( getWalletAddresses + , mkKeyWalletFromPrivateKeys + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + , withKeyWallet + ) import Control.Alternative (guard) import Control.Monad.Reader (asks) import Control.Monad.State.Trans (StateT(StateT), runStateT) @@ -49,17 +53,17 @@ import Ctl.Internal.Wallet.Key ) import Data.Array (head) import Data.Array as Array -import Data.BigInt (BigInt) import Data.FoldableWithIndex (foldMapWithIndex) import Data.List (List, (:)) import Data.Map as Map import Data.Maybe (Maybe(Nothing, Just)) -import Data.Newtype (unwrap) +import Data.Newtype (unwrap, wrap) import Data.Traversable (traverse) import Data.Tuple (Tuple) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Class (liftEffect) import Effect.Ref as Ref +import JS.BigInt (BigInt) import Type.Prelude (Proxy(Proxy)) -- | UTxO amount in Lovelaces @@ -200,19 +204,19 @@ transferFundsFromEnterpriseToBase ourKey wallets = do head <$> withKeyWallet ourWallet getWalletAddresses ourUtxos <- utxosAt ourAddr ourPkh <- liftedM "Could not get our payment pkh" $ - head <$> withKeyWallet ourWallet ownPaymentPubKeysHashes + head <$> withKeyWallet ourWallet ownPaymentPubKeyHashes let - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.unspentOutputs ourUtxos <> foldMap (_.utxos >>> Lookups.unspentOutputs) walletsInfo - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustBeSignedBy ourPkh <> foldMap constraintsForWallet walletsInfo - unbalancedTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + unbalancedTx <- mkUnbalancedTx lookups constraints signedTx <- withKeyWallet ourWallet $ - signTransaction =<< liftedE (balanceTx unbalancedTx) + signTransaction =<< balanceTx unbalancedTx signedTx' <- foldM (\tx { wallet } -> withKeyWallet wallet $ signTransaction tx) signedTx @@ -225,13 +229,14 @@ transferFundsFromEnterpriseToBase ourKey wallets = do cache <- asks (unwrap <<< _.usedTxOuts) liftEffect $ Ref.write Map.empty cache where - constraintsForWallet :: WalletInfo -> Constraints.TxConstraints Void Void + constraintsForWallet :: WalletInfo -> Constraints.TxConstraints constraintsForWallet { utxos, payPkh, stakePkh } = -- It's necessary to include `mustBeSignedBy`, we get a -- `feeTooSmall` error otherwise. See -- https://github.com/Plutonomicon/cardano-transaction-lib/issues/853 - Constraints.mustBeSignedBy payPkh <> - foldMapWithIndex + Constraints.mustBeSignedBy payPkh + <> Constraints.mustBeSignedBy (wrap $ unwrap stakePkh) + <> foldMapWithIndex ( \input (TransactionOutputWithRefScript { output }) -> Constraints.mustPayToPubKeyAddress payPkh stakePkh (unwrap output).amount @@ -244,11 +249,11 @@ transferFundsFromEnterpriseToBase ourKey wallets = do -> KeyWallet -> Contract (List WalletInfo) addStakeKeyWalletInfo walletsInfo wallet = withKeyWallet wallet $ - join <<< head <$> ownStakePubKeysHashes >>= case _ of + join <<< head <$> ownStakePubKeyHashes >>= case _ of Nothing -> pure walletsInfo Just stakePkh -> do payPkh <- liftedM "Could not get payment pubkeyhash" $ - head <$> ownPaymentPubKeysHashes + head <$> ownPaymentPubKeyHashes networkId <- getNetworkId addr <- liftContractM "Could not get wallet address" $ payPubKeyHashEnterpriseAddress networkId payPkh diff --git a/src/Internal/ToData.purs b/src/Internal/ToData.purs index 722f1d6fe..b1799f0d1 100644 --- a/src/Internal/ToData.purs +++ b/src/Internal/ToData.purs @@ -35,8 +35,6 @@ import Ctl.Internal.Types.RawBytes (RawBytes) import Data.Array (cons, sortWith) import Data.Array as Array import Data.ArrayBuffer.Types (Uint8Array) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Either (Either(Left, Right)) import Data.Foldable (class Foldable) import Data.Generic.Rep as G @@ -49,6 +47,8 @@ import Data.Symbol (class IsSymbol) import Data.TextEncoder (encodeUtf8) import Data.Tuple (Tuple(Tuple), fst, snd) import Data.UInt (UInt) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Noble.Secp256k1.ECDSA ( ECDSAPublicKey , ECDSASignature diff --git a/src/Internal/Transaction.purs b/src/Internal/Transaction.purs index ca24229cf..49baa289c 100644 --- a/src/Internal/Transaction.purs +++ b/src/Internal/Transaction.purs @@ -1,6 +1,5 @@ module Ctl.Internal.Transaction - ( ModifyTxError(ConvertWitnessesError, ConvertDatumError) - , attachDatum + ( attachDatum , attachRedeemer , attachPlutusScript , attachNativeScript @@ -9,7 +8,6 @@ module Ctl.Internal.Transaction import Prelude -import Control.Monad.Except.Trans (ExceptT, runExceptT) import Ctl.Internal.Cardano.Types.NativeScript (NativeScript) import Ctl.Internal.Cardano.Types.Transaction ( Costmdls @@ -20,7 +18,6 @@ import Ctl.Internal.Cardano.Types.Transaction , TxBody(TxBody) ) import Ctl.Internal.Deserialization.WitnessSet as Deserialization.WitnessSet -import Ctl.Internal.Helpers (liftEither) import Ctl.Internal.Serialization (hashScriptData, toBytes) import Ctl.Internal.Serialization.PlutusData as Serialization.PlutusData import Ctl.Internal.Serialization.PlutusScript as Serialization.PlutusScript @@ -29,26 +26,13 @@ import Ctl.Internal.Serialization.WitnessSet as Serialization.WitnessSet import Ctl.Internal.Types.Datum (Datum) import Ctl.Internal.Types.Scripts (PlutusScript) import Data.Array as Array -import Data.Either (Either(Right), note) import Data.Foldable (null) -import Data.Generic.Rep (class Generic) import Data.Maybe (Maybe(Just)) import Data.Newtype (over, unwrap) -import Data.Show.Generic (genericShow) import Data.Traversable (traverse) import Effect (Effect) import Effect.Class (liftEffect) -data ModifyTxError - = ConvertWitnessesError - | ConvertDatumError - -derive instance Generic ModifyTxError _ -derive instance Eq ModifyTxError - -instance Show ModifyTxError where - show = genericShow - -- | Set the `Transaction` body's script data hash. NOTE: Must include *all* of -- | the datums and redeemers for the given transaction setScriptDataHash @@ -79,16 +63,16 @@ setScriptDataHash costModels rs ds tx@(Transaction { body, witnessSet }) -- | Attach a `Datum` to a transaction by modifying its existing witness set. -- | Fails if either the datum or updated witness set cannot be converted during -- | (de-)serialization -attachDatum :: Datum -> Transaction -> Effect (Either ModifyTxError Transaction) -attachDatum d = runExceptT <<< attachDatums (Array.singleton d) +attachDatum :: Datum -> Transaction -> Effect Transaction +attachDatum d = attachDatums (Array.singleton d) attachDatums - :: Array Datum -> Transaction -> ExceptT ModifyTxError Effect Transaction -attachDatums [] tx = liftEither $ Right tx + :: Array Datum -> Transaction -> Effect Transaction +attachDatums [] tx = pure tx attachDatums datums tx@(Transaction { witnessSet: ws }) = do let ds = map (Serialization.PlutusData.convertPlutusData <<< unwrap) datums updateTxWithWitnesses tx - =<< convertWitnessesWith ws (Serialization.WitnessSet.setPlutusData ds) + <$> convertWitnessesWith ws (Serialization.WitnessSet.setPlutusData ds) -- | Attach a `Redeemer` to a transaction by modifying its existing witness set. -- | Note that this is the `Types.Transaction` representation of a redeemer and @@ -97,15 +81,15 @@ attachDatums datums tx@(Transaction { witnessSet: ws }) = do -- | Fails if either the redeemer or updated witness set cannot be converted -- | during (de-)serialization attachRedeemer - :: Redeemer -> Transaction -> Effect (Either ModifyTxError Transaction) -attachRedeemer r = runExceptT <<< attachRedeemers (Array.singleton r) + :: Redeemer -> Transaction -> Effect Transaction +attachRedeemer r = attachRedeemers (Array.singleton r) attachRedeemers - :: Array Redeemer -> Transaction -> ExceptT ModifyTxError Effect Transaction + :: Array Redeemer -> Transaction -> Effect Transaction attachRedeemers rs tx@(Transaction { witnessSet: ws }) = do rs' <- liftEffect $ traverse Serialization.WitnessSet.convertRedeemer rs updateTxWithWitnesses tx - =<< convertWitnessesWith ws (Serialization.WitnessSet.setRedeemers rs') + <$> convertWitnessesWith ws (Serialization.WitnessSet.setRedeemers rs') -- | Attach a `PlutusScript` to a transaction by modifying its existing witness -- | set @@ -113,38 +97,36 @@ attachRedeemers rs tx@(Transaction { witnessSet: ws }) = do -- | Fails if either the script or updated witness set cannot be converted -- | during (de-)serialization attachPlutusScript - :: PlutusScript -> Transaction -> Effect (Either ModifyTxError Transaction) -attachPlutusScript ps = runExceptT <<< attachPlutusScripts (Array.singleton ps) + :: PlutusScript -> Transaction -> Effect Transaction +attachPlutusScript ps = attachPlutusScripts (Array.singleton ps) attachPlutusScripts :: Array PlutusScript -> Transaction - -> ExceptT ModifyTxError Effect Transaction + -> Effect Transaction attachPlutusScripts ps tx@(Transaction { witnessSet: ws }) = do let ps' = ps # map Serialization.PlutusScript.convertPlutusScript updateTxWithWitnesses tx - =<< convertWitnessesWith ws (Serialization.WitnessSet.setPlutusScripts ps') + <$> convertWitnessesWith ws (Serialization.WitnessSet.setPlutusScripts ps') attachNativeScript - :: NativeScript -> Transaction -> Effect (Either ModifyTxError Transaction) + :: NativeScript -> Transaction -> Transaction attachNativeScript ns tx = do - runExceptT $ updateTxWithWitnesses tx $ + updateTxWithWitnesses tx $ mempty # over TransactionWitnessSet _ { nativeScripts = Just [ ns ] } convertWitnessesWith :: TransactionWitnessSet -> (Serialization.TransactionWitnessSet -> Effect Unit) - -> ExceptT ModifyTxError Effect TransactionWitnessSet + -> Effect TransactionWitnessSet convertWitnessesWith ws act = do ws' <- liftEffect $ Serialization.WitnessSet.convertWitnessSet ws liftEffect $ act ws' - liftEither $ note ConvertWitnessesError - $ Deserialization.WitnessSet.convertWitnessSet ws' + pure $ Deserialization.WitnessSet.convertWitnessSet ws' updateTxWithWitnesses - :: forall (e :: Type) - . Transaction + :: Transaction -> TransactionWitnessSet - -> ExceptT e Effect Transaction + -> Transaction updateTxWithWitnesses tx@(Transaction t) ws = - liftEither $ Right $ over Transaction _ { witnessSet = t.witnessSet <> ws } tx + over Transaction _ { witnessSet = t.witnessSet <> ws } tx diff --git a/src/Internal/TxOutput.purs b/src/Internal/TxOutput.purs index 57fd70be3..8bbbb1020 100644 --- a/src/Internal/TxOutput.purs +++ b/src/Internal/TxOutput.purs @@ -58,7 +58,7 @@ transactionInputToTxOutRef , index } --- https://ogmios.dev/ogmios.wsp.json see "datum", potential FIX ME: it says +-- https://ogmios.dev/ogmios.json see "datum", potential FIX ME: it says -- base64 but the example provided looks like a hexadecimal so use -- hexToByteArray for now. https://github.com/Plutonomicon/cardano-transaction-lib/issues/78 -- | Converts an Ogmios transaction output to (internal) `TransactionOutput` diff --git a/src/Internal/Types/BigNum.js b/src/Internal/Types/BigNum.js index 70ba1439b..5514c3054 100644 --- a/src/Internal/Types/BigNum.js +++ b/src/Internal/Types/BigNum.js @@ -2,40 +2,49 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); + // lib = (await import("../../../../cardano-serialization-lib-gc/nodejs/index.js")); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.bnCompare = lhs => rhs => lhs.compare(rhs); - -exports.zero = lib.BigNum.zero(); - -exports.one = lib.BigNum.one(); +export function bnCompare(lhs) { + return rhs => lhs.compare(rhs); +} -exports.bnAdd = maybe => lhs => rhs => { - try { - return maybe.just(lhs.checked_add(rhs)); - } catch (_) { - return maybe.nothing; - } -}; +export const zero = lib.BigNum.zero(); +export const one = lib.BigNum.one(); + +export function bnAdd(maybe) { + return lhs => rhs => { + try { + return maybe.just(lhs.checked_add(rhs)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports.bnMul = maybe => lhs => rhs => { - try { - return maybe.just(lhs.checked_mul(rhs)); - } catch (_) { - return maybe.nothing; - } -}; +export function bnMul(maybe) { + return lhs => rhs => { + try { + return maybe.just(lhs.checked_mul(rhs)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports._fromString = maybe => str => { - try { - return maybe.just(lib.BigNum.from_str(str)); - } catch (_) { - return maybe.nothing; - } -}; +export function _fromString(maybe) { + return str => { + try { + return maybe.just(lib.BigNum.from_str(str)); + } catch (_) { + return maybe.nothing; + } + }; +} -exports.toString = bn => bn.to_str(); +export function toString(bn) { + return bn.to_str(); +} diff --git a/src/Internal/Types/BigNum.purs b/src/Internal/Types/BigNum.purs index d2e28d38b..e5a75d039 100644 --- a/src/Internal/Types/BigNum.purs +++ b/src/Internal/Types/BigNum.purs @@ -24,13 +24,13 @@ import Aeson (JsonDecodeError(TypeMismatch)) as Aeson import Ctl.Internal.Deserialization.Error (FromCslRepError, fromCslRepError) import Ctl.Internal.Error (E, noteE) import Ctl.Internal.FfiHelpers (MaybeFfiHelper, maybeFfiHelper) -import Data.BigInt (BigInt) -import Data.BigInt (fromString, toString) as BigInt import Data.Either (note) import Data.Int (fromString) as Int import Data.Maybe (Maybe, fromJust) import Data.UInt (UInt) import Data.UInt (fromInt, fromString, toString) as UInt +import JS.BigInt (BigInt) +import JS.BigInt (fromString, toString) as BigInt import Partial.Unsafe (unsafePartial) import Type.Row (type (+)) diff --git a/src/Internal/Types/ByteArray.js b/src/Internal/Types/ByteArray.js index 8f204f55a..09bf1f2b1 100644 --- a/src/Internal/Types/ByteArray.js +++ b/src/Internal/Types/ByteArray.js @@ -1,36 +1,42 @@ // From instance for Array in prelude -exports.ord_ = f => xs => ys => { - let i = 0; - const xlen = xs.length; - const ylen = ys.length; - while (i < xlen && i < ylen) { - let o = f(xs[i])(ys[i]); - if (o !== 0) { - return o; +export function ord_(f) { + return xs => ys => { + let i = 0; + const xlen = xs.length; + const ylen = ys.length; + while (i < xlen && i < ylen) { + let o = f(xs[i])(ys[i]); + if (o !== 0) { + return o; + } + i++; } - i++; - } - if (xlen === ylen) { - return 0; - } else if (xlen > ylen) { - return -1; - } else { - return 1; - } -}; + if (xlen === ylen) { + return 0; + } else if (xlen > ylen) { + return -1; + } else { + return 1; + } + }; +} -exports.concat_ = xs => ys => { - const res = new Uint8Array(xs.length + ys.length); - for (let i = 0; i < xs.length; i++) { - res[i] = xs[i]; - } - for (let i = 0; i < ys.length; i++) { - res[i + xs.length] = ys[i]; - } - return res; -}; +export function concat_(xs) { + return ys => { + const res = new Uint8Array(xs.length + ys.length); + for (let i = 0; i < xs.length; i++) { + res[i] = xs[i]; + } + for (let i = 0; i < ys.length; i++) { + res[i + xs.length] = ys[i]; + } + return res; + }; +} -exports.byteArrayToHex = arr => Buffer.from(arr).toString("hex"); +export function byteArrayToHex(arr) { + return Buffer.from(arr).toString("hex"); +} /* adapted from https://github.com/WebReflection/uint8-to-utf16/blob/master/esm/index.js * (someone who knows javascript should like import that or something) @@ -38,7 +44,7 @@ exports.byteArrayToHex = arr => Buffer.from(arr).toString("hex"); const { ceil } = Math; const { fromCharCode } = String; -exports.byteArrayToUTF16le = uint8array => { +export function byteArrayToUTF16le(uint8array) { let extra = 0; const output = []; const { length } = uint8array; @@ -51,44 +57,57 @@ exports.byteArrayToUTF16le = uint8array => { ); output.push(fromCharCode(extra)); return output.join(""); -}; +} -exports.hexToByteArray_ = nothing => just => hex => { - let bytes = []; - for (let c = 0; c < hex.length; c += 2) { - const chunk = hex.substr(c, 2); - if (/[0-9a-f]{2}/i.test(chunk)) { - bytes.push(parseInt(chunk, 16)); - } else { - return nothing; +export function hexToByteArray_(nothing) { + return just => hex => { + let bytes = []; + for (let c = 0; c < hex.length; c += 2) { + const chunk = hex.substr(c, 2); + if (/[0-9a-f]{2}/i.test(chunk)) { + bytes.push(parseInt(chunk, 16)); + } else { + return nothing; + } } - } - return just(new Uint8Array(bytes)); -}; + return just(new Uint8Array(bytes)); + }; +} -exports.hexToByteArrayUnsafe = hex => { +export function hexToByteArrayUnsafe(hex) { let bytes = []; for (let c = 0; c < hex.length; c += 2) { bytes.push(parseInt(hex.substr(c, 2), 16)); } return new Uint8Array(bytes); -}; +} -exports.byteArrayFromIntArrayUnsafe = ints => new Uint8Array(ints); +export function byteArrayFromIntArrayUnsafe(ints) { + return new Uint8Array(ints); +} -exports.byteArrayFromInt16ArrayUnsafe = ints => - new Uint8Array(ints.buffer, ints.byteOffset, ints.byteLength); +export function byteArrayFromInt16ArrayUnsafe(ints) { + return new Uint8Array(ints.buffer, ints.byteOffset, ints.byteLength); +} -exports.byteArrayFromIntArray_ = nothing => just => ints => { - if (ints.every(i => i < 256 && i >= 0)) { - return just(new Uint8Array(ints)); - } else { - return nothing; - } -}; +export function byteArrayFromIntArray_(nothing) { + return just => ints => { + if (ints.every(i => i < 256 && i >= 0)) { + return just(new Uint8Array(ints)); + } else { + return nothing; + } + }; +} -exports.byteArrayToIntArray = bytes => Array.from(bytes); +export function byteArrayToIntArray(bytes) { + return Array.from(bytes); +} -exports.byteLength = bytes => bytes.byteLength; +export function byteLength(bytes) { + return bytes.byteLength; +} -exports.subarray = start => end => bytes => bytes.subarray(start, end); +export function subarray(start) { + return end => bytes => bytes.subarray(start, end); +} diff --git a/src/Internal/Types/Epoch.purs b/src/Internal/Types/Epoch.purs index 4b01d1a12..fed438326 100644 --- a/src/Internal/Types/Epoch.purs +++ b/src/Internal/Types/Epoch.purs @@ -4,9 +4,9 @@ import Prelude import Aeson (class DecodeAeson, class EncodeAeson) import Ctl.Internal.Helpers (showWithParens) -import Data.BigInt (BigInt) import Data.Generic.Rep (class Generic) import Data.Newtype (class Newtype) +import JS.BigInt (BigInt) -- | An epoch number or length with greater precision for Ogmios than -- | `Cardano.Types.Epoch`. [ 0 .. 18446744073709552000 ] diff --git a/src/Internal/Types/EraSummaries.purs b/src/Internal/Types/EraSummaries.purs index 04aa5f686..ae6cf387c 100644 --- a/src/Internal/Types/EraSummaries.purs +++ b/src/Internal/Types/EraSummaries.purs @@ -15,18 +15,18 @@ import Aeson ( class DecodeAeson , class EncodeAeson , encodeAeson + , finiteNumber , getField - , partialFiniteNumber ) import Ctl.Internal.Helpers (showWithParens) import Ctl.Internal.Serialization.Address (Slot) import Ctl.Internal.Service.Helpers (aesonObject) import Ctl.Internal.Types.Epoch (Epoch) -import Data.BigInt (BigInt) import Data.Generic.Rep (class Generic) -import Data.Maybe (Maybe) +import Data.Maybe (Maybe, fromJust) import Data.Newtype (class Newtype, wrap) import Data.Show.Generic (genericShow) +import JS.BigInt (BigInt) import Partial.Unsafe (unsafePartial) -------------------------------------------------------------------------------- @@ -143,7 +143,7 @@ derive newtype instance DecodeAeson RelativeTime instance EncodeAeson RelativeTime where encodeAeson (RelativeTime rt) = -- We assume the numbers are finite. - encodeAeson $ unsafePartial partialFiniteNumber rt + encodeAeson $ unsafePartial $ fromJust $ finiteNumber rt instance Show RelativeTime where show (RelativeTime rt) = showWithParens "RelativeTime" rt @@ -170,7 +170,7 @@ derive newtype instance DecodeAeson SlotLength instance EncodeAeson SlotLength where encodeAeson (SlotLength sl) = -- We assume the numbers are finite. - encodeAeson $ unsafePartial partialFiniteNumber sl + encodeAeson $ unsafePartial $ fromJust $ finiteNumber sl instance Show SlotLength where show (SlotLength slotLength) = showWithParens "SlotLength" slotLength @@ -189,4 +189,3 @@ derive newtype instance EncodeAeson SafeZone instance Show SafeZone where show (SafeZone sz) = showWithParens "SafeZone" sz - diff --git a/src/Internal/Types/Int.js b/src/Internal/Types/Int.js index 301a3d772..8110b53cb 100644 --- a/src/Internal/Types/Int.js +++ b/src/Internal/Types/Int.js @@ -2,12 +2,14 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -exports.newPositive = lib.Int.new; -exports.newNegative = lib.Int.new_negative; -exports._intToStr = n => n.to_str(); +export const newPositive = lib.Int.new; +export const newNegative = lib.Int.new_negative; + +export function _intToStr(n) { + return n.to_str(); +} diff --git a/src/Internal/Types/Int.purs b/src/Internal/Types/Int.purs index d3e875ebe..5d9fceb7c 100644 --- a/src/Internal/Types/Int.purs +++ b/src/Internal/Types/Int.purs @@ -22,10 +22,10 @@ import Aeson import Control.Alternative ((<|>)) import Ctl.Internal.Types.BigNum (BigNum) import Ctl.Internal.Types.BigNum (fromBigInt, fromInt) as BigNum -import Data.BigInt as BigInt import Data.Either (note) import Data.Function (on) import Data.Maybe (Maybe, fromJust) +import JS.BigInt as BigInt import Partial.Unsafe (unsafePartial) import Prim as Prim diff --git a/src/Internal/Types/Interval.purs b/src/Internal/Types/Interval.purs index 2b72ffc87..740320eae 100644 --- a/src/Internal/Types/Interval.purs +++ b/src/Internal/Types/Interval.purs @@ -13,8 +13,6 @@ module Ctl.Internal.Types.Interval , PosixTimeBeforeSystemStart , StartTimeGreaterThanTime , EndSlotLessThanSlotOrModNonZero - , CannotGetBigIntFromNumber' - , CannotGetBigNumFromBigInt' ) , RelSlot(RelSlot) , RelTime(RelTime) @@ -50,6 +48,7 @@ module Ctl.Internal.Types.Interval , posixTimeRangeToSlotRange , posixTimeRangeToTransactionValidity , posixTimeToSlot + , explainPosixTimeToSlotError , singleton , slotRangeToPosixTimeRange , slotToPosixTime @@ -73,13 +72,13 @@ import Aeson , aesonNull , decodeAeson , encodeAeson + , finiteNumber , getField , isNull - , partialFiniteNumber , (.:) ) import Control.Monad.Error.Class (throwError) -import Control.Monad.Except.Trans (ExceptT(ExceptT), runExceptT) +import Control.Monad.Except (runExcept) import Ctl.Internal.FromData (class FromData, fromData, genericFromData) import Ctl.Internal.Helpers ( contentsProp @@ -117,9 +116,9 @@ import Ctl.Internal.Types.PlutusData (PlutusData(Constr)) import Ctl.Internal.Types.SystemStart (SystemStart, sysStartUnixTime) import Data.Argonaut.Encode.Encoders (encodeString) import Data.Array (find, head, index, length) +import Data.Array.NonEmpty (singleton) as NEArray +import Data.Array.NonEmpty ((:)) import Data.Bifunctor (bimap, lmap) -import Data.BigInt (BigInt) -import Data.BigInt (fromInt, fromNumber, fromString, toNumber) as BigInt import Data.Either (Either(Left, Right), note) import Data.Generic.Rep (class Generic) import Data.Lattice @@ -128,16 +127,15 @@ import Data.Lattice , class JoinSemilattice , class MeetSemilattice ) -import Data.List (List(Nil), (:)) import Data.Maybe (Maybe(Just, Nothing), fromJust, maybe) import Data.Newtype (class Newtype, unwrap, wrap) -import Data.NonEmpty ((:|)) +import Data.Number (trunc, (%)) as Math import Data.Show.Generic (genericShow) import Data.Tuple (uncurry) import Data.Tuple.Nested (type (/\), (/\)) -import Effect (Effect) import Foreign.Object (Object) -import Math (trunc, (%)) as Math +import JS.BigInt (BigInt) +import JS.BigInt (fromInt, fromNumber, fromString, toNumber) as BigInt import Partial.Unsafe (unsafePartial) import Prim.TypeError (class Warn, Text) import Test.QuickCheck (class Arbitrary, arbitrary) @@ -169,10 +167,17 @@ instance ) instance ToData a => ToData (Extended a) where - toData = genericToData + toData = case _ of + Finite a -> genericToData $ Finite $ toData a + NegInf -> genericToData (NegInf :: Extended Void) + PosInf -> genericToData (PosInf :: Extended Void) instance FromData a => FromData (Extended a) where - fromData = genericFromData + fromData pd = + (genericFromData pd :: _ (Extended PlutusData)) >>= case _ of + Finite a -> Finite <$> fromData a + NegInf -> pure NegInf + PosInf -> pure PosInf derive instance Generic (Extended a) _ derive instance Eq a => Eq (Extended a) @@ -349,14 +354,13 @@ instance (DecodeAeson a, Ord a, Ring a) => DecodeAeson (Interval a) where pure $ haskIntervalToInterval haskInterval instance (Arbitrary a, Ord a, Semiring a) => Arbitrary (Interval a) where - arbitrary = frequency $ wrap $ + arbitrary = frequency $ (0.25 /\ genFiniteInterval arbitrary) - :| (0.25 /\ genUpperRay arbitrary) - : (0.25 /\ genLowerRay arbitrary) - : (0.1 /\ genSingletonInterval) - : (0.075 /\ pure always) - : (0.075 /\ pure never) - : Nil + : (0.25 /\ genUpperRay arbitrary) + : (0.25 /\ genLowerRay arbitrary) + : (0.1 /\ genSingletonInterval) + : (0.075 /\ pure always) + : NEArray.singleton (0.075 /\ pure never) -- | those accept a generator since we want to use them -- | for Positive Integers in tests @@ -647,7 +651,7 @@ instance EncodeAeson SlotToPosixTimeError where slotToPosixTimeErrorStr "endTimeLessThanTime" -- We assume the numbers are finite - [ unsafePartial partialFiniteNumber absTime ] + [ unsafePartial $ fromJust $ finiteNumber absTime ] encodeAeson CannotGetBigIntFromNumber = do encodeAeson $ mkErrorRecord slotToPosixTimeErrorStr @@ -703,8 +707,8 @@ slotToPosixTime :: EraSummaries -> SystemStart -> Slot - -> Effect (Either SlotToPosixTimeError POSIXTime) -slotToPosixTime eraSummaries sysStart slot = runExceptT do + -> Either SlotToPosixTimeError POSIXTime +slotToPosixTime eraSummaries sysStart slot = runExcept do -- Find current era: currentEra <- liftEither $ findSlotEraSummary eraSummaries slot -- Convert absolute slot (relative to System start) to relative slot of era @@ -853,8 +857,6 @@ data PosixTimeToSlotError | PosixTimeBeforeSystemStart POSIXTime | StartTimeGreaterThanTime AbsTime | EndSlotLessThanSlotOrModNonZero Slot ModTime - | CannotGetBigIntFromNumber' - | CannotGetBigNumFromBigInt' derive instance Generic PosixTimeToSlotError _ derive instance Eq PosixTimeToSlotError @@ -862,6 +864,19 @@ derive instance Eq PosixTimeToSlotError instance Show PosixTimeToSlotError where show = genericShow +explainPosixTimeToSlotError :: PosixTimeToSlotError -> String +explainPosixTimeToSlotError = case _ of + CannotFindTimeInEraSummaries atime -> + "Time " <> show atime <> " is not in era summaries." + PosixTimeBeforeSystemStart t -> + "Time " <> show t <> " is before the system start." + StartTimeGreaterThanTime atime -> + "Time " <> show atime <> " is before the era start time." + EndSlotLessThanSlotOrModNonZero slot mtime -> + "Time is after the era end time. Calculated slot: " <> show slot + <> ", calculated residual time after end: " + <> show mtime + posixTimeToSlotErrorStr :: String posixTimeToSlotErrorStr = "posixTimeToSlotError" @@ -886,16 +901,6 @@ instance EncodeAeson PosixTimeToSlotError where posixTimeToSlotErrorStr "endSlotLessThanSlotOrModNonZero" [ encodeAeson slot, encodeAeson modTime ] - encodeAeson CannotGetBigIntFromNumber' = - encodeAeson $ mkErrorRecord - posixTimeToSlotErrorStr - "cannotGetBigIntFromNumber'" - aesonNull - encodeAeson CannotGetBigNumFromBigInt' = - encodeAeson $ mkErrorRecord - posixTimeToSlotErrorStr - "cannotGetBigNumFromBigInt'" - aesonNull instance DecodeAeson PosixTimeToSlotError where decodeAeson = aesonObject $ \o -> do @@ -924,14 +929,6 @@ instance DecodeAeson PosixTimeToSlotError where (TypeMismatch "Could not extract second element") (index args 1) pure $ EndSlotLessThanSlotOrModNonZero as mt - "cannotGetBigIntFromNumber'" -> do - args <- getField o "args" - unless (isNull args) (throwError $ TypeMismatch "Non-empty args") - pure CannotGetBigIntFromNumber' - "cannotGetBigNumFromBigInt'" -> do - args <- getField o "args" - unless (isNull args) (throwError $ TypeMismatch "Non-empty args") - pure CannotGetBigNumFromBigInt' _ -> throwError $ TypeMismatch "Unknown error message" -- | Converts a `POSIXTime` to `Slot` given an `EraSummaries` and @@ -940,10 +937,14 @@ posixTimeToSlot :: EraSummaries -> SystemStart -> POSIXTime - -> Effect (Either PosixTimeToSlotError Slot) -posixTimeToSlot eraSummaries sysStart pt'@(POSIXTime pt) = runExceptT do - -- Get POSIX time for system start: - sysStartPosix <- liftM CannotGetBigIntFromNumber' $ sysStartUnixTime sysStart + -> Either PosixTimeToSlotError Slot +posixTimeToSlot eraSummaries sysStart pt'@(POSIXTime pt) = runExcept do + -- Get POSIX time for system start. + -- This is safe, as the only reason for sysStartUnixTime being partial is due + -- to a conversion from a Number, which may be an infinity or NaN in the + -- general case. However, we know that system time cannot be either of these + -- things. + let sysStartPosix = unsafePartial $ fromJust $ sysStartUnixTime sysStart -- Ensure the time we are converting is after the system start, otherwise -- we have negative slots. unless (sysStartPosix <= pt) @@ -956,8 +957,7 @@ posixTimeToSlot eraSummaries sysStart pt'@(POSIXTime pt) = runExceptT do -- Get relative time from absolute time w.r.t. current era relTime <- liftEither $ relTimeFromAbsTime currentEra absTime -- Convert to relative slot - relSlotMod <- liftM CannotGetBigIntFromNumber' $ relSlotFromRelTime currentEra - relTime + let relSlotMod = relSlotFromRelTime currentEra relTime -- Get absolute slot relative to system start liftEither $ slotFromRelSlot currentEra relSlotMod @@ -989,25 +989,34 @@ relTimeFromAbsTime (EraSummary { start }) at@(AbsTime absTime) = do (throwError $ StartTimeGreaterThanTime at) let relTime = BigInt.toNumber absTime - startTime -- relative to era start, not UNIX Epoch. - wrap <$> - ( note CannotGetBigIntFromNumber' - <<< BigInt.fromNumber - <<< Math.trunc - ) relTime + -- This conversion cannot fail: since 'relTime' is an offset from the start of + -- an era, we can't overflow the 64-bit limit. + let + relTimeBi = unsafePartial $ fromJust $ BigInt.fromNumber $ Math.trunc + relTime + pure $ wrap relTimeBi --- | Converts relative time to relative slot (using Euclidean division) and +-- | Converts relative time to a relative slot (using Euclidean division) and -- | modulus for any leftover. relSlotFromRelTime - :: EraSummary -> RelTime -> Maybe (RelSlot /\ ModTime) + :: EraSummary + -> RelTime + -> (RelSlot /\ ModTime) relSlotFromRelTime eraSummary (RelTime relTime) = let slotLength = getSlotLength eraSummary - relSlot = wrap <$> - (BigInt.fromNumber <<< Math.trunc) (BigInt.toNumber relTime / slotLength) - modTime = wrap <$> - BigInt.fromNumber (BigInt.toNumber relTime Math.% slotLength) + relTimeBn = BigInt.toNumber relTime + relSlot = relTimeBn / slotLength + modTime = relTimeBn Math.% slotLength + -- Both of these are safe: the conversion from Number to BigInt must be + -- partial to account for NaN and infinities, but we can't have either of + -- those here. in - (/\) <$> relSlot <*> modTime + (wrap $ toBigIntUnsafe $ Math.trunc $ relSlot) /\ + (wrap $ toBigIntUnsafe modTime) + where + toBigIntUnsafe :: Number -> BigInt + toBigIntUnsafe x = unsafePartial $ fromJust $ BigInt.fromNumber x slotFromRelSlot :: EraSummary -> RelSlot /\ ModTime -> Either PosixTimeToSlotError Slot @@ -1027,7 +1036,9 @@ slotFromRelSlot endSlot = maybe (slot + one) (BigNum.toBigInt <<< unwrap <<< _.slot <<< unwrap) end - bnSlot <- liftM CannotGetBigNumFromBigInt' $ BigNum.fromBigInt slot + -- Slot numbers should convert without error: they're meant to be 64-bit + -- integers anyway. + let bnSlot = unsafePartial $ fromJust $ BigNum.fromBigInt slot -- Check we are less than the end slot, or if equal, there is no excess: unless (slot < endSlot || slot == endSlot && modTime == zero) (throwError $ EndSlotLessThanSlotOrModNonZero (wrap bnSlot) mt) @@ -1057,12 +1068,11 @@ posixTimeRangeToSlotRange :: EraSummaries -> SystemStart -> POSIXTimeRange - -> Effect (Either PosixTimeToSlotError SlotRange) + -> Either PosixTimeToSlotError SlotRange posixTimeRangeToSlotRange eraSummaries sysStart - range = sequenceInterval <$> - sequenceInterval (posixTimeToSlot eraSummaries sysStart <$> range) + range = sequenceInterval (posixTimeToSlot eraSummaries sysStart <$> range) -- | Converts a `SlotRange` to `POSIXTimeRange` given an `EraSummaries` and -- | `SystemStart` queried from Ogmios. @@ -1070,12 +1080,11 @@ slotRangeToPosixTimeRange :: EraSummaries -> SystemStart -> SlotRange - -> Effect (Either SlotToPosixTimeError POSIXTimeRange) + -> Either SlotToPosixTimeError POSIXTimeRange slotRangeToPosixTimeRange eraSummaries sysStart - range = sequenceInterval <$> - sequenceInterval (slotToPosixTime eraSummaries sysStart <$> range) + range = sequenceInterval (slotToPosixTime eraSummaries sysStart <$> range) type TransactionValiditySlot = { validityStartInterval :: Maybe Slot, timeToLive :: Maybe Slot } @@ -1110,9 +1119,9 @@ posixTimeRangeToTransactionValidity :: EraSummaries -> SystemStart -> POSIXTimeRange - -> Effect (Either PosixTimeToSlotError TransactionValiditySlot) + -> Either PosixTimeToSlotError TransactionValiditySlot posixTimeRangeToTransactionValidity es ss = - map (map slotRangeToTransactionValidity) <<< posixTimeRangeToSlotRange es ss + map slotRangeToTransactionValidity <<< posixTimeRangeToSlotRange es ss data ToOnChainPosixTimeRangeError = PosixTimeToSlotError' PosixTimeToSlotError @@ -1262,18 +1271,18 @@ toOnchainPosixTimeRange :: EraSummaries -> SystemStart -> POSIXTimeRange - -> Effect (Either ToOnChainPosixTimeRangeError OnchainPOSIXTimeRange) -toOnchainPosixTimeRange es ss ptr = runExceptT do + -> Either ToOnChainPosixTimeRangeError OnchainPOSIXTimeRange +toOnchainPosixTimeRange es ss ptr = runExcept do { validityStartInterval, timeToLive } <- - ExceptT $ posixTimeRangeToTransactionValidity es ss ptr - <#> lmap PosixTimeToSlotError' + liftEither $ posixTimeRangeToTransactionValidity es ss ptr + # lmap PosixTimeToSlotError' case validityStartInterval, timeToLive of Nothing, Nothing -> liftEither $ Right $ wrap always - Just s, Nothing -> ExceptT $ slotToPosixTime es ss s - <#> bimap SlotToPosixTimeError' (from >>> wrap) - Nothing, Just s -> ExceptT $ slotToPosixTime es ss s - <#> bimap SlotToPosixTimeError' (to >>> wrap) + Just s, Nothing -> liftEither $ slotToPosixTime es ss s + # bimap SlotToPosixTimeError' (from >>> wrap) + Nothing, Just s -> liftEither $ slotToPosixTime es ss s + # bimap SlotToPosixTimeError' (to >>> wrap) Just s1, Just s2 -> do - t1 <- ExceptT $ slotToPosixTime es ss s1 <#> lmap SlotToPosixTimeError' - t2 <- ExceptT $ slotToPosixTime es ss s2 <#> lmap SlotToPosixTimeError' + t1 <- liftEither $ slotToPosixTime es ss s1 # lmap SlotToPosixTimeError' + t2 <- liftEither $ slotToPosixTime es ss s2 # lmap SlotToPosixTimeError' liftEither $ Right $ wrap $ mkFiniteInterval t1 t2 diff --git a/src/Internal/Types/NatRatio.purs b/src/Internal/Types/NatRatio.purs index 4b41a7ca2..a55a300d3 100644 --- a/src/Internal/Types/NatRatio.purs +++ b/src/Internal/Types/NatRatio.purs @@ -23,8 +23,8 @@ import Ctl.Internal.Types.Rational , numerator , (%) ) as Rational -import Data.BigInt (BigInt) import Data.Maybe (Maybe(Nothing)) +import JS.BigInt (BigInt) -- | `NatRatio` is a newtype over `Rational` with smart constructors to create a -- | `NatRatio` safely. Therefore, the data constructor is not exported. diff --git a/src/Internal/Types/Natural.purs b/src/Internal/Types/Natural.purs index 8228b8113..ac94710c0 100644 --- a/src/Internal/Types/Natural.purs +++ b/src/Internal/Types/Natural.purs @@ -20,11 +20,11 @@ import Ctl.Internal.Metadata.FromMetadata (class FromMetadata) import Ctl.Internal.Metadata.ToMetadata (class ToMetadata) import Ctl.Internal.ToData (class ToData, toData) import Ctl.Internal.Types.PlutusData (PlutusData(Integer)) -import Data.BigInt (BigInt) -import Data.BigInt (fromInt, fromString) as BigInt import Data.Either (Either(Left), note) import Data.Function (on) import Data.Maybe (Maybe(Nothing, Just), fromMaybe) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt, fromString) as BigInt newtype Natural = Natural BigInt diff --git a/src/Internal/Types/OutputDatum.purs b/src/Internal/Types/OutputDatum.purs index d86385e19..cb4ff8f33 100644 --- a/src/Internal/Types/OutputDatum.purs +++ b/src/Internal/Types/OutputDatum.purs @@ -2,6 +2,7 @@ module Ctl.Internal.Types.OutputDatum ( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum) , outputDatumDataHash , outputDatumDatum + , pprintOutputDatum ) where import Prelude @@ -26,11 +27,16 @@ import Ctl.Internal.Plutus.Types.DataSchema ) import Ctl.Internal.ToData (class ToData, genericToData) import Ctl.Internal.TypeLevel.Nat (S, Z) +import Ctl.Internal.Types.ByteArray (byteArrayToHex) import Ctl.Internal.Types.Datum (Datum) +import Ctl.Internal.Types.PlutusData (pprintPlutusData) import Ctl.Internal.Types.Transaction (DataHash) import Data.Either (Either(Left)) import Data.Generic.Rep (class Generic) +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag as TagSet import Data.Maybe (Maybe(Just, Nothing)) +import Data.Newtype (unwrap) import Data.Show.Generic (genericShow) data OutputDatum = NoOutputDatum | OutputDatumHash DataHash | OutputDatum Datum @@ -82,6 +88,14 @@ instance DecodeAeson OutputDatum where Left $ UnexpectedValue $ toStringifiedNumbersJson $ fromString tagValue +pprintOutputDatum :: OutputDatum -> TagSet +pprintOutputDatum = TagSet.fromArray <<< case _ of + NoOutputDatum -> [ "datum" `tag` "none" ] + OutputDatumHash hash -> + [ "datumHash" `tag` byteArrayToHex (unwrap hash) ] + OutputDatum d -> + [ "datum" `tagSetTag` pprintPlutusData (unwrap d) ] + outputDatumDataHash :: OutputDatum -> Maybe DataHash outputDatumDataHash (OutputDatumHash hash) = Just hash outputDatumDataHash _ = Nothing diff --git a/src/Internal/Types/PaymentPubKey.purs b/src/Internal/Types/PaymentPubKey.purs new file mode 100644 index 000000000..c1c53669b --- /dev/null +++ b/src/Internal/Types/PaymentPubKey.purs @@ -0,0 +1,36 @@ +module Ctl.Internal.Types.PaymentPubKey + ( PaymentPubKey(PaymentPubKey) + , paymentPubKeyToRequiredSigner + , paymentPubKeyToVkey + ) where + +import Prelude + +import Ctl.Internal.Cardano.Types.Transaction + ( PublicKey + , RequiredSigner(RequiredSigner) + , Vkey(Vkey) + , convertPubKey + ) +import Ctl.Internal.Serialization (publicKeyHash) +import Data.Generic.Rep (class Generic) +import Data.Newtype (class Newtype) +import Data.Show.Generic (genericShow) + +-- Plutus has a type called `PubKey` which we replace with `PublicKey` +newtype PaymentPubKey = PaymentPubKey PublicKey + +derive instance Generic PaymentPubKey _ +derive instance Newtype PaymentPubKey _ +derive newtype instance Eq PaymentPubKey +derive newtype instance Ord PaymentPubKey + +instance Show PaymentPubKey where + show = genericShow + +paymentPubKeyToVkey :: PaymentPubKey -> Vkey +paymentPubKeyToVkey (PaymentPubKey pk) = Vkey pk + +paymentPubKeyToRequiredSigner :: PaymentPubKey -> RequiredSigner +paymentPubKeyToRequiredSigner (PaymentPubKey pk) = + RequiredSigner <<< publicKeyHash $ convertPubKey pk diff --git a/src/Internal/Types/PlutusData.purs b/src/Internal/Types/PlutusData.purs index f366f470b..d9a67c594 100644 --- a/src/Internal/Types/PlutusData.purs +++ b/src/Internal/Types/PlutusData.purs @@ -6,6 +6,7 @@ module Ctl.Internal.Types.PlutusData , Integer , Bytes ) + , pprintPlutusData ) where import Prelude @@ -21,15 +22,19 @@ import Aeson ) import Control.Alt ((<|>)) import Ctl.Internal.Types.BigNum (BigNum) -import Ctl.Internal.Types.ByteArray (ByteArray, hexToByteArray) -import Data.BigInt (BigInt) +import Ctl.Internal.Types.BigNum as BigNum +import Ctl.Internal.Types.ByteArray (ByteArray, byteArrayToHex, hexToByteArray) import Data.Either (Either(Left)) import Data.Generic.Rep (class Generic) +import Data.Log.Tag (TagSet, tag, tagSetTag) +import Data.Log.Tag as TagSet import Data.Maybe (Maybe(Just, Nothing)) import Data.Show.Generic (genericShow) import Data.Traversable (for) import Data.Tuple (Tuple) import Data.Tuple.Nested ((/\)) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt -- Doesn't distinguish "BuiltinData" and "Data" like Plutus: data PlutusData @@ -104,3 +109,25 @@ instance EncodeAeson PlutusData where encodeAeson (List elems) = encodeAeson elems encodeAeson (Integer bi) = encodeAeson bi encodeAeson (Bytes ba) = encodeAeson ba + +pprintPlutusData :: PlutusData -> TagSet +pprintPlutusData (Constr n children) = TagSet.fromArray + [ ("Constr " <> BigInt.toString (BigNum.toBigInt n)) `tagSetTag` + TagSet.fromArray (pprintPlutusData <$> children) + ] +pprintPlutusData (Map entries) = TagSet.fromArray + [ tagSetTag "Map" $ TagSet.fromArray $ + entries <#> \(key /\ value) -> + TagSet.fromArray + [ "key" `tagSetTag` pprintPlutusData key + , "value" `tagSetTag` pprintPlutusData value + ] + ] +pprintPlutusData (List children) = TagSet.fromArray + [ tagSetTag "List" $ TagSet.fromArray $ + children <#> pprintPlutusData + ] +pprintPlutusData (Integer n) = TagSet.fromArray + [ "Integer" `tag` BigInt.toString n ] +pprintPlutusData (Bytes bytes) = TagSet.fromArray + [ "Bytes" `tag` byteArrayToHex bytes ] diff --git a/src/Internal/Types/Rational.purs b/src/Internal/Types/Rational.purs index 1024b38f7..4b7d940c2 100644 --- a/src/Internal/Types/Rational.purs +++ b/src/Internal/Types/Rational.purs @@ -26,12 +26,12 @@ import Ctl.Internal.Types.BigNum as BigNum import Ctl.Internal.Types.Natural (Natural) import Ctl.Internal.Types.Natural (fromBigInt', toBigInt) as Nat import Ctl.Internal.Types.PlutusData (PlutusData(Constr, Integer)) -import Data.BigInt (BigInt) -import Data.BigInt (fromInt) as BigInt import Data.Either (Either(Left)) import Data.Maybe (Maybe(Just, Nothing), maybe) import Data.Ratio (Ratio) import Data.Ratio (denominator, numerator, (%)) as Ratio +import JS.BigInt (BigInt) +import JS.BigInt (fromInt) as BigInt -- | `Rational` is a newtype over `Ratio` with a smart constructor `reduce` -- | that allows to create a `Rational` safely. The constructor is not exposed. diff --git a/src/Internal/Types/Redeemer.purs b/src/Internal/Types/Redeemer.purs index 55b75c275..786f8836c 100644 --- a/src/Internal/Types/Redeemer.purs +++ b/src/Internal/Types/Redeemer.purs @@ -8,6 +8,7 @@ module Ctl.Internal.Types.Redeemer import Prelude import Ctl.Internal.FromData (class FromData) +import Ctl.Internal.Hashing (hashPlutusData) import Ctl.Internal.Serialization (toBytes) import Ctl.Internal.Serialization.PlutusData (convertPlutusData) import Ctl.Internal.ToData (class ToData, toData) @@ -49,4 +50,5 @@ instance Show RedeemerHash where -- | This is a duplicate of `datumHash`. redeemerHash :: Redeemer -> RedeemerHash redeemerHash = - wrap <<< unwrap <<< toBytes <<< convertPlutusData <<< unwrap + wrap <<< unwrap <<< toBytes <<< hashPlutusData <<< convertPlutusData <<< + unwrap diff --git a/src/Internal/Types/ScriptLookups.purs b/src/Internal/Types/ScriptLookups.purs index 3eacf38b9..677ddbce3 100644 --- a/src/Internal/Types/ScriptLookups.purs +++ b/src/Internal/Types/ScriptLookups.purs @@ -1,43 +1,7 @@ module Ctl.Internal.Types.ScriptLookups - ( MkUnbalancedTxError - ( CannotConvertPOSIXTimeRange - , CannotSolveTimeConstraints - , CannotConvertPaymentPubKeyHash - , CannotFindDatum - , CannotGetMintingPolicyScriptIndex - , CannotGetValidatorHashFromAddress - , CannotHashDatum - , CannotHashMintingPolicy - , CannotHashValidator - , CannotMakeValue - , CannotQueryDatum - , CannotSatisfyAny - , CannotWithdrawRewardsPlutusScript - , CannotWithdrawRewardsNativeScript - , CannotWithdrawRewardsPubKey - , DatumNotFound - , DatumWrongHash - , MintingPolicyHashNotCurrencySymbol - , MintingPolicyNotFound - , ModifyTx - , OwnPubKeyAndStakeKeyMissing - , TxOutRefNotFound - , TxOutRefWrongType - , TypeCheckFailed - , TypedTxOutHasNoDatumHash - , TypedValidatorMissing - , ValidatorHashNotFound - , WrongRefScriptHash - , ExpectedPlutusScriptGotNativeScript - , CannotMintZero - ) - , ScriptLookups(ScriptLookups) - , UnattachedUnbalancedTx(UnattachedUnbalancedTx) - , generalise + ( ScriptLookups(ScriptLookups) , mintingPolicy , mintingPolicyM - , mkUnbalancedTx - , mkUnbalancedTx' , datum , validator , validatorM @@ -45,235 +9,26 @@ module Ctl.Internal.Types.ScriptLookups , ownPaymentPubKeyHashM , ownStakePubKeyHash , ownStakePubKeyHashM - , typedValidatorLookups - , typedValidatorLookupsM , unspentOutputs , unspentOutputsM ) where import Prelude hiding (join) -import Aeson (class EncodeAeson) -import Contract.Hashing (plutusScriptStakeValidatorHash) -import Control.Monad.Error.Class (catchError, throwError) -import Control.Monad.Except.Trans (ExceptT(ExceptT), except, runExceptT) -import Control.Monad.Reader.Class (asks) -import Control.Monad.State.Trans (StateT, get, gets, put, runStateT) -import Control.Monad.Trans.Class (lift) -import Ctl.Internal.Address (addressPaymentValidatorHash) -import Ctl.Internal.Cardano.Types.ScriptRef (ScriptRef(NativeScriptRef)) -import Ctl.Internal.Cardano.Types.Transaction - ( Certificate - ( StakeRegistration - , StakeDeregistration - , PoolRegistration - , PoolRetirement - , StakeDelegation - ) - , Costmdls - , Transaction - , TransactionOutput(TransactionOutput) - , TransactionWitnessSet(TransactionWitnessSet) - , TxBody - , _body - , _certs - , _inputs - , _isValid - , _mint - , _networkId - , _outputs - , _referenceInputs - , _requiredSigners - , _scriptDataHash - , _withdrawals - , _witnessSet - ) -import Ctl.Internal.Cardano.Types.Transaction (Redeemer(Redeemer)) as T -import Ctl.Internal.Cardano.Types.Value - ( Coin(Coin) - , CurrencySymbol - , Value - , getNonAdaAsset - , isZero - , mkSingletonValue' - , mpsSymbol - , negation - , split - ) -import Ctl.Internal.Contract (getProtocolParameters) -import Ctl.Internal.Contract.Monad (Contract, wrapQueryM) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) import Ctl.Internal.Hashing (datumHash) as Hashing -import Ctl.Internal.Helpers (liftM, (<\>)) -import Ctl.Internal.IsData (class IsData) -import Ctl.Internal.NativeScripts (nativeScriptHash) -import Ctl.Internal.Plutus.Conversion - ( fromPlutusTxOutputWithRefScript - , fromPlutusValue - ) -import Ctl.Internal.Plutus.Types.Credential - ( Credential(ScriptCredential, PubKeyCredential) - ) +import Ctl.Internal.Helpers ((<\>)) import Ctl.Internal.Plutus.Types.Transaction (TransactionOutputWithRefScript) as Plutus -import Ctl.Internal.Plutus.Types.TransactionUnspentOutput - ( TransactionUnspentOutput(TransactionUnspentOutput) - ) -import Ctl.Internal.QueryM.Pools - ( getPubKeyHashDelegationsAndRewards - , getValidatorHashDelegationsAndRewards - ) -import Ctl.Internal.Scripts - ( mintingPolicyHash - , nativeScriptStakeValidatorHash - , validatorHash - , validatorHashEnterpriseAddress - ) -import Ctl.Internal.Serialization.Address - ( Address - , NetworkId - , StakeCredential - , baseAddress - , baseAddressToAddress - , keyHashCredential - , scriptHashCredential - ) -import Ctl.Internal.Serialization.Hash (ScriptHash) -import Ctl.Internal.ToData (class ToData) -import Ctl.Internal.Transaction - ( ModifyTxError - , attachDatum - , attachNativeScript - , attachPlutusScript - , attachRedeemer - , setScriptDataHash - ) -import Ctl.Internal.Types.Any (Any) import Ctl.Internal.Types.Datum (DataHash, Datum) -import Ctl.Internal.Types.Interval - ( POSIXTimeRange - , PosixTimeToSlotError - , always - , intersection - , isEmpty - , posixTimeRangeToTransactionValidity - ) -import Ctl.Internal.Types.OutputDatum - ( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum) - ) -import Ctl.Internal.Types.PubKeyHash - ( PaymentPubKeyHash - , StakePubKeyHash - , payPubKeyHashBaseAddress - , payPubKeyHashEnterpriseAddress - , stakePubKeyHashRewardAddress - ) -import Ctl.Internal.Types.RedeemerTag (RedeemerTag(Cert, Reward, Mint, Spend)) -import Ctl.Internal.Types.RewardAddress - ( stakePubKeyHashRewardAddress - , stakeValidatorHashRewardAddress - ) as RewardAddress -import Ctl.Internal.Types.Scripts - ( MintingPolicy(NativeMintingPolicy, PlutusMintingPolicy) - , MintingPolicyHash - , NativeScriptStakeValidator - , PlutusScriptStakeValidator - , Validator - , ValidatorHash - ) -import Ctl.Internal.Types.TokenName (TokenName) +import Ctl.Internal.Types.PaymentPubKey (PaymentPubKey) +import Ctl.Internal.Types.PubKeyHash (PaymentPubKeyHash, StakePubKeyHash) +import Ctl.Internal.Types.Scripts (MintingPolicy, Validator) import Ctl.Internal.Types.Transaction (TransactionInput) -import Ctl.Internal.Types.TxConstraints - ( DatumPresence(DatumWitness, DatumInline) - , InputConstraint(InputConstraint) - , InputWithScriptRef(RefInput, SpendInput) - , OutputConstraint(OutputConstraint) - , TxConstraint - ( MustBeSignedBy - , MustDelegateStakePubKey - , MustDelegateStakePlutusScript - , MustDelegateStakeNativeScript - , MustDeregisterStakePubKey - , MustDeregisterStakePlutusScript - , MustDeregisterStakeNativeScript - , MustHashDatum - , MustIncludeDatum - , MustMintValue - , MustNotBeValid - , MustPayToNativeScript - , MustPayToPubKeyAddress - , MustPayToScript - , MustProduceAtLeast - , MustReferenceOutput - , MustRegisterPool - , MustRegisterStakePubKey - , MustRegisterStakeScript - , MustRetirePool - , MustSatisfyAnyOf - , MustSpendAtLeast - , MustSpendNativeScriptOutput - , MustSpendPubKeyOutput - , MustSpendScriptOutput - , MustValidateIn - , MustWithdrawStakePubKey - , MustWithdrawStakePlutusScript - , MustWithdrawStakeNativeScript - , MustMintValueUsingNativeScript - ) - , TxConstraints(TxConstraints) - , utxoWithScriptRef - ) -import Ctl.Internal.Types.TypedTxOut - ( TypeCheckError - , mkTypedTxOut - , typeTxOutRef - , typedTxOutDatumHash - , typedTxOutRefValue - , typedTxOutTxOut - ) -import Ctl.Internal.Types.TypedValidator - ( class DatumType - , class ValidatorTypes - , TypedValidator(TypedValidator) - ) -import Ctl.Internal.Types.TypedValidator (generalise) as TV -import Ctl.Internal.Types.UnbalancedTransaction - ( PaymentPubKey - , UnbalancedTx - , _transaction - , _utxoIndex - , emptyUnbalancedTx - ) -import Data.Array (cons, filter, mapWithIndex, partition, toUnfoldable, zip) -import Data.Array (length, singleton, union, (:)) as Array -import Data.Bifunctor (lmap) -import Data.BigInt (BigInt, fromInt) -import Data.Either (Either(Left, Right), either, hush, isRight, note) -import Data.Foldable (foldM) +import Data.Array (singleton, union) as Array import Data.Generic.Rep (class Generic) -import Data.Lattice (join) -import Data.Lens (non, view, (%=), (%~), (.=), (.~), (<>=)) -import Data.Lens.Getter (to, use) -import Data.Lens.Iso.Newtype (_Newtype) -import Data.Lens.Record (prop) -import Data.Lens.Types (Lens') -import Data.List (List(Nil, Cons)) -import Data.Map (Map, empty, fromFoldable, lookup, singleton, union) -import Data.Map as Map -import Data.Maybe (Maybe(Just, Nothing), fromMaybe, maybe) -import Data.Newtype (class Newtype, over, unwrap, wrap) -import Data.Set (insert) as Set +import Data.Map (Map, empty, singleton, union) +import Data.Maybe (Maybe(Just, Nothing)) +import Data.Newtype (class Newtype, over) import Data.Show.Generic (genericShow) -import Data.Symbol (SProxy(SProxy)) -import Data.Traversable (for, traverse_) -import Data.Tuple (fst, snd) -import Data.Tuple.Nested (type (/\), (/\)) -import Effect (Effect) -import Effect.Aff.Class (liftAff) -import Effect.Class (liftEffect) -import Effect.Exception (throw) -import MedeaPrelude (mapMaybe) -import Prelude (join) as Bind -import Type.Proxy (Proxy(Proxy)) -- Taken mainly from https://playground.plutus.iohkdev.io/doc/haddock/plutus-ledger-constraints/html/Ledger-Constraints-OffChain.html -- Plutus rev: cc72a56eafb02333c96f662581b57504f8f8992f via Plutus-apps (localhost): abe4785a4fc4a10ba0c4e6417f0ab9f1b4169b26 @@ -290,7 +45,7 @@ import Type.Proxy (Proxy(Proxy)) -- `processLookupsAndConstraints`. -- The lookups uses the Plutus type `TransactionOutput` and does internal -- conversions to the Serialization/Cardano to append to the `TxBody` as needed. -newtype ScriptLookups (a :: Type) = ScriptLookups +newtype ScriptLookups = ScriptLookups { mps :: Array MintingPolicy -- Minting policies that the script interacts with , txOutputs :: @@ -302,31 +57,22 @@ newtype ScriptLookups (a :: Type) = ScriptLookups -- See https://github.com/Plutonomicon/cardano-transaction-lib/issues/569 , paymentPubKeyHashes :: Map PaymentPubKeyHash PaymentPubKey -- Public keys that we might need - , typedValidator :: - Maybe (TypedValidator a) -- The script instance with the typed validator hash & actual compiled program , ownPaymentPubKeyHash :: Maybe PaymentPubKeyHash -- The contract's payment public key hash, used for depositing tokens etc. , ownStakePubKeyHash :: Maybe StakePubKeyHash -- The contract's stake public key hash (optional) } -derive instance Generic (ScriptLookups a) _ -derive instance Newtype (ScriptLookups a) _ -derive newtype instance Eq (ScriptLookups a) +derive instance Generic ScriptLookups _ +derive instance Newtype ScriptLookups _ +derive newtype instance Eq ScriptLookups -instance Show (ScriptLookups a) where +instance Show ScriptLookups where show = genericShow -generalise :: forall (a :: Type). ScriptLookups a -> ScriptLookups Any -generalise (ScriptLookups sl) = - let - tv = TV.generalise <$> sl.typedValidator - in - wrap sl { typedValidator = tv } - -- Using `Data.Map.union`, we can replicate left-biased <> from Data.Map used -- in Plutus (*not* Plutus' internal Map that uses something like unionWith (<>)) -instance Semigroup (ScriptLookups a) where +instance Semigroup ScriptLookups where append (ScriptLookups l) (ScriptLookups r) = ScriptLookups { mps: l.mps `Array.union` r.mps @@ -335,19 +81,17 @@ instance Semigroup (ScriptLookups a) where , datums: l.datums `union` r.datums , paymentPubKeyHashes: l.paymentPubKeyHashes `union` r.paymentPubKeyHashes -- 'First' to match the semigroup instance of Map (left-biased) - , typedValidator: l.typedValidator <\> r.typedValidator , ownPaymentPubKeyHash: l.ownPaymentPubKeyHash <\> r.ownPaymentPubKeyHash , ownStakePubKeyHash: l.ownStakePubKeyHash <\> r.ownStakePubKeyHash } -instance Monoid (ScriptLookups a) where +instance Monoid ScriptLookups where mempty = ScriptLookups { mps: mempty , txOutputs: empty , scripts: mempty , datums: empty , paymentPubKeyHashes: empty - , typedValidator: Nothing , ownPaymentPubKeyHash: Nothing , ownStakePubKeyHash: Nothing } @@ -355,39 +99,13 @@ instance Monoid (ScriptLookups a) where -------------------------------------------------------------------------------- -- Create ScriptLookups helpers -------------------------------------------------------------------------------- --- | The lookup functions come in pairs with the exception of `datum`. --- | If the function cannot fail, there is another version contained in a `Maybe` --- | context (that also does not fail). --- | This is to aid users who wish to utilise the underlying `ScriptLookups` --- | `Monoid` for `foldMap` etc. --- | --- | Otherwise, there are lookups that may fail with `Maybe` (because of --- | hashing) and an unsafe counterpart via `fromJust`. - --- | A script lookups value with a script instance. For convenience this also --- | includes the minting policy script that forwards all checks to the --- | instance's validator. -typedValidatorLookups :: forall (a :: Type). TypedValidator a -> ScriptLookups a -typedValidatorLookups tv@(TypedValidator inst) = - over ScriptLookups - _ - { mps = Array.singleton inst.forwardingMPS - , typedValidator = Just tv - } - mempty - --- | Same as `typedValidatorLookups` but in `Maybe` context for convenience. --- | This should not fail. -typedValidatorLookupsM - :: forall (a :: Type). TypedValidator a -> Maybe (ScriptLookups a) -typedValidatorLookupsM = pure <<< typedValidatorLookups -- | A script lookups value that uses the map of unspent outputs to resolve -- | input constraints. unspentOutputs :: forall (a :: Type) . Map TransactionInput Plutus.TransactionOutputWithRefScript - -> ScriptLookups a + -> ScriptLookups unspentOutputs mp = over ScriptLookups _ { txOutputs = mp } mempty -- | Same as `unspentOutputs` but in `Maybe` context for convenience. @@ -395,1111 +113,51 @@ unspentOutputs mp = over ScriptLookups _ { txOutputs = mp } mempty unspentOutputsM :: forall (a :: Type) . Map TransactionInput Plutus.TransactionOutputWithRefScript - -> Maybe (ScriptLookups a) + -> Maybe ScriptLookups unspentOutputsM = pure <<< unspentOutputs -- | A script lookups value with a minting policy script. -mintingPolicy :: forall (a :: Type). MintingPolicy -> ScriptLookups a +mintingPolicy :: MintingPolicy -> ScriptLookups mintingPolicy pl = over ScriptLookups _ { mps = Array.singleton pl } mempty -- | Same as `mintingPolicy` but in `Maybe` context for convenience. This -- | should not fail. -mintingPolicyM :: forall (a :: Type). MintingPolicy -> Maybe (ScriptLookups a) +mintingPolicyM :: forall (a :: Type). MintingPolicy -> Maybe ScriptLookups mintingPolicyM = pure <<< mintingPolicy -- | A script lookups value with a validator script. -validator :: forall (a :: Type). Validator -> ScriptLookups a +validator :: forall (a :: Type). Validator -> ScriptLookups validator vl = over ScriptLookups _ { scripts = Array.singleton vl } mempty -- | Same as `validator` but in `Maybe` context for convenience. This -- | should not fail. -validatorM :: forall (a :: Type). Validator -> Maybe (ScriptLookups a) +validatorM :: forall (a :: Type). Validator -> Maybe ScriptLookups validatorM = pure <<< validator -- | A script lookups value with a datum. -datum :: forall (a :: Type). Datum -> ScriptLookups a +datum :: Datum -> ScriptLookups datum dt = over ScriptLookups _ { datums = singleton (Hashing.datumHash dt) dt } mempty -- | Add your own `PaymentPubKeyHash` to the lookup. -ownPaymentPubKeyHash :: forall (a :: Type). PaymentPubKeyHash -> ScriptLookups a +ownPaymentPubKeyHash :: PaymentPubKeyHash -> ScriptLookups ownPaymentPubKeyHash pkh = over ScriptLookups _ { ownPaymentPubKeyHash = Just pkh } mempty -- | Same as `ownPaymentPubKeyHash` but in `Maybe` context for convenience. This -- | should not fail. ownPaymentPubKeyHashM - :: forall (a :: Type). PaymentPubKeyHash -> Maybe (ScriptLookups a) + :: PaymentPubKeyHash -> Maybe ScriptLookups ownPaymentPubKeyHashM = pure <<< ownPaymentPubKeyHash -- | Add your own `StakePubKeyHash` to the lookup. -ownStakePubKeyHash :: forall (a :: Type). StakePubKeyHash -> ScriptLookups a +ownStakePubKeyHash :: StakePubKeyHash -> ScriptLookups ownStakePubKeyHash skh = over ScriptLookups _ { ownStakePubKeyHash = Just skh } mempty -- | Same as `ownStakePubKeyHash` but in `Maybe` context for convenience. This -- | should not fail. ownStakePubKeyHashM - :: forall (a :: Type). StakePubKeyHash -> Maybe (ScriptLookups a) + :: StakePubKeyHash -> Maybe ScriptLookups ownStakePubKeyHashM = pure <<< ownStakePubKeyHash - --- -Note [Balance of value spent] - --- To build a transaction that satisfies the 'MustSpendAtLeast' and --- `MustProduceAtLeast` constraints, we keep a tally of the required and --- actual values we encounter on either side of the transaction. Then we --- compute the missing value on both sides, and add an input with the --- join of the positive parts of the missing values. - --- | The balances we track for computing the missing 'Value' (if any) --- | that needs to be added to the transaction. --- | See note [Balance of value spent]. -newtype ValueSpentBalances = ValueSpentBalances - { required :: Value - -- Required value spent by the transaction. - , provided :: Value - -- Value provided by an input or output of the transaction. - } - -derive instance Generic ValueSpentBalances _ - -instance Show ValueSpentBalances where - show = genericShow - -instance Semigroup ValueSpentBalances where - append (ValueSpentBalances l) (ValueSpentBalances r) = ValueSpentBalances - { required: l.required `join` r.required -- least upper bound on Value - , provided: l.provided `join` r.provided - } - --- This is the state for essentially creating an unbalanced transaction. -type ConstraintProcessingState (a :: Type) = - { unbalancedTx :: UnbalancedTx - -- The unbalanced transaction that we're building - , valueSpentBalancesInputs :: ValueSpentBalances - -- Balance of the values given and required for the transaction's inputs - , valueSpentBalancesOutputs :: ValueSpentBalances - -- Balance of the values produced and required for the transaction's outputs - , datums :: Array Datum - -- Ordered accumulation of datums so we can use to `setScriptDataHash` - , redeemersTxIns :: Array (T.Redeemer /\ Maybe TransactionInput) - -- Ordered accumulation of redeemers so we can use to `setScriptDataHash` and - -- add execution units via Ogmios - , mintRedeemers :: Map MintingPolicyHash T.Redeemer - -- Mint redeemers with the corresponding minting policy hashes. - -- We need to reindex mint redeemers every time we add a new one, since - -- indexing relies on policy id ordering. - , lookups :: ScriptLookups a - -- ScriptLookups for resolving constraints. Should be treated as an immutable - -- value despite living inside the processing state - , refScriptsUtxoMap :: - Map TransactionInput Plutus.TransactionOutputWithRefScript - , costModels :: Costmdls - } - --- We could make these signatures polymorphic but they're not exported so don't --- bother. -_unbalancedTx - :: forall (a :: Type). Lens' (ConstraintProcessingState a) UnbalancedTx -_unbalancedTx = prop (SProxy :: SProxy "unbalancedTx") - -_valueSpentBalancesInputs - :: forall (a :: Type). Lens' (ConstraintProcessingState a) ValueSpentBalances -_valueSpentBalancesInputs = prop (SProxy :: SProxy "valueSpentBalancesInputs") - -_valueSpentBalancesOutputs - :: forall (a :: Type). Lens' (ConstraintProcessingState a) ValueSpentBalances -_valueSpentBalancesOutputs = prop (SProxy :: SProxy "valueSpentBalancesOutputs") - -_datums - :: forall (a :: Type). Lens' (ConstraintProcessingState a) (Array Datum) -_datums = prop (SProxy :: SProxy "datums") - -_costModels - :: forall (a :: Type). Lens' (ConstraintProcessingState a) Costmdls -_costModels = prop (SProxy :: SProxy "costModels") - -_redeemersTxIns - :: forall (a :: Type) - . Lens' (ConstraintProcessingState a) - (Array (T.Redeemer /\ Maybe TransactionInput)) -_redeemersTxIns = prop (SProxy :: SProxy "redeemersTxIns") - -_mintRedeemers - :: forall (a :: Type) - . Lens' (ConstraintProcessingState a) (Map MintingPolicyHash T.Redeemer) -_mintRedeemers = prop (SProxy :: SProxy "mintRedeemers") - -_lookups - :: forall (a :: Type). Lens' (ConstraintProcessingState a) (ScriptLookups a) -_lookups = prop (SProxy :: SProxy "lookups") - -_refScriptsUtxoMap - :: forall (a :: Type) - . Lens' (ConstraintProcessingState a) - (Map TransactionInput Plutus.TransactionOutputWithRefScript) -_refScriptsUtxoMap = prop (SProxy :: SProxy "refScriptsUtxoMap") - -missingValueSpent :: ValueSpentBalances -> Value -missingValueSpent (ValueSpentBalances { required, provided }) = - let - difference = required <> negation provided - _ /\ missing = split difference - in - missing - -totalMissingValue :: forall (a :: Type). ConstraintProcessingState a -> Value -totalMissingValue { valueSpentBalancesInputs, valueSpentBalancesOutputs } = - missingValueSpent valueSpentBalancesInputs `join` - missingValueSpent valueSpentBalancesOutputs - -provideValue :: Value -> ValueSpentBalances -provideValue provided = ValueSpentBalances { provided, required: mempty } - -requireValue :: Value -> ValueSpentBalances -requireValue required = ValueSpentBalances { required, provided: mempty } - --- A `StateT` ontop of `QueryM` ~ ReaderT QueryConfig Aff`. --- The state is `ConstraintProcessingState`, which keeps track of the unbalanced --- transaction etc and additionally holds a `ConstraintsConfig` containing the --- scriptlookups and a `defaultSlotConfig`. --- We write `ReaderT QueryConfig Aff` below since type synonyms need to be fully --- applied. -type ConstraintsM (a :: Type) (b :: Type) = - StateT (ConstraintProcessingState a) Contract b - --- The constraints don't precisely match those of Plutus: --- `forall v. (FromData (DatumType v), ToData (DatumType v), ToData (RedeemerType v))` --- as we don't have the same granularity on the classes, but the type `v` fixes --- types `d` and `r` as seen below. We could alternatively create specific typeclasses: --- ToData (DatumType v) <-> (DatumType v d, ToData d) <= ToDataDatumType v d --- if we require granular control, similarly FromDataDatumType v d etc. --- We could use `MonadError` to clean up the `ExceptT`s below although we can't --- use the type alias because they need to be fully applied so this is perhaps --- more readable. --- | Resolve some `TxConstraints` by modifying the `UnbalancedTx` in the --- | `ConstraintProcessingState` -processLookupsAndConstraints - :: forall (validator :: Type) (datum :: Type) (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => TxConstraints redeemer datum - -> ConstraintsM validator (Either MkUnbalancedTxError Unit) -processLookupsAndConstraints - (TxConstraints { constraints, ownInputs, ownOutputs }) = runExceptT do - -- Hash all the MintingPolicys and Scripts beforehand. These maps are lost - -- after we `runReaderT`, unlike Plutus that has a `Map` instead of `Array`. - lookups <- use _lookups <#> unwrap - - let - mps = lookups.mps - scripts = lookups.scripts - mpsHashes = map mintingPolicyHash mps - validatorHashes = map validatorHash scripts - mpsMap = fromFoldable $ zip mpsHashes mps - osMap = fromFoldable $ zip validatorHashes scripts - - timeConstraintsSolved <- except $ resumeTimeConstraints constraints - - ExceptT $ foldConstraints (processConstraint mpsMap osMap) - timeConstraintsSolved - - -- Attach mint redeemers to witness set. - mintRedeemers :: Array _ <- use _mintRedeemers <#> Map.toUnfoldable - lift $ traverse_ (attachToCps attachRedeemer <<< snd) mintRedeemers - - ExceptT $ foldConstraints (addOwnInput (Proxy :: Proxy datum)) ownInputs - ExceptT $ foldConstraints addOwnOutput ownOutputs - ExceptT addScriptDataHash - ExceptT addMissingValueSpent - ExceptT updateUtxoIndex - - where - -- Don't write the output in terms of ExceptT because we can't write a - -- partially applied `ConstraintsM` meaning this is more readable. - foldConstraints - :: forall (constr :: Type) (c :: Type) - . (constr -> ConstraintsM c (Either MkUnbalancedTxError Unit)) - -> Array constr - -> ConstraintsM c (Either MkUnbalancedTxError Unit) - foldConstraints handler = - runExceptT <<< traverse_ (ExceptT <<< handler) - --- Helper to run the stack and get back to `QueryM`. See comments in --- `processLookupsAndConstraints` regarding constraints. -runConstraintsM - :: forall (validator :: Type) (datum :: Type) (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups validator - -> TxConstraints redeemer datum - -> Contract (Either MkUnbalancedTxError (ConstraintProcessingState validator)) -runConstraintsM lookups txConstraints = do - { costModels } <- unwrap <$> getProtocolParameters - let - initCps :: ConstraintProcessingState validator - initCps = - { unbalancedTx: emptyUnbalancedTx - , valueSpentBalancesInputs: - ValueSpentBalances { required: mempty, provided: mempty } - , valueSpentBalancesOutputs: - ValueSpentBalances { required: mempty, provided: mempty } - , datums: mempty - , redeemersTxIns: mempty - , mintRedeemers: empty - , lookups - , refScriptsUtxoMap: empty - , costModels - } - - unpackTuple - :: Either MkUnbalancedTxError Unit /\ - (ConstraintProcessingState validator) - -> Either MkUnbalancedTxError (ConstraintProcessingState validator) - unpackTuple (Left err /\ _) = Left err - unpackTuple (_ /\ cps) = Right cps - unpackTuple <$> - flip runStateT initCps (processLookupsAndConstraints txConstraints) - --- See comments in `processLookupsAndConstraints` regarding constraints. --- | Create an `UnbalancedTx` given `ScriptLookups` and `TxConstraints`. -mkUnbalancedTx' - :: forall (validator :: Type) (datum :: Type) (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups validator - -> TxConstraints redeemer datum - -> Contract (Either MkUnbalancedTxError UnbalancedTx) -mkUnbalancedTx' scriptLookups txConstraints = - runConstraintsM scriptLookups txConstraints <#> map _.unbalancedTx - --- | A newtype for the unbalanced transaction after creating one with datums --- | and redeemers not attached -newtype UnattachedUnbalancedTx = UnattachedUnbalancedTx - { unbalancedTx :: UnbalancedTx -- the unbalanced tx created - , datums :: Array Datum -- the array of ordered datums that require attaching - , redeemersTxIns :: - Array (T.Redeemer /\ Maybe TransactionInput) -- the array of - -- ordered redeemers that require attaching alongside a potential transaction - -- input. The input is required to determine the index of `Spend` redeemers - -- after balancing (when inputs are finalised). The potential input is - -- `Just` for spending script utxos, i.e. `MustSpendScriptOutput` and - -- `Nothing` otherwise. - } - -derive instance Generic UnattachedUnbalancedTx _ -derive instance Newtype UnattachedUnbalancedTx _ -derive newtype instance Eq UnattachedUnbalancedTx -derive newtype instance EncodeAeson UnattachedUnbalancedTx - -instance Show UnattachedUnbalancedTx where - show = genericShow - --- | An implementation that strips `witnessSet` and data hash from --- | returned `UnbalancedTx` in order to calculate them later on server. --- | It returns part of the `ConstraintProcessingState` for later consumption by --- | the server. The `Spend` redeemers will require reindexing and all hardcoded --- | to `zero` from this function. -mkUnbalancedTx - :: forall (validator :: Type) (datum :: Type) (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => ScriptLookups validator - -> TxConstraints redeemer datum - -> Contract (Either MkUnbalancedTxError UnattachedUnbalancedTx) -mkUnbalancedTx scriptLookups txConstraints = - runConstraintsM scriptLookups txConstraints <#> map - \{ unbalancedTx, datums, redeemersTxIns } -> - let - stripScriptDataHash :: UnbalancedTx -> UnbalancedTx - stripScriptDataHash uTx = - uTx # _transaction <<< _body <<< _scriptDataHash .~ Nothing - - stripDatumsRedeemers :: UnbalancedTx -> UnbalancedTx - stripDatumsRedeemers uTx = uTx # _transaction <<< _witnessSet %~ - over TransactionWitnessSet - _ { plutusData = Nothing, redeemers = Nothing } - tx = stripDatumsRedeemers $ stripScriptDataHash unbalancedTx - in - wrap { unbalancedTx: tx, datums, redeemersTxIns } - -addScriptDataHash - :: forall (a :: Type) - . ConstraintsM a (Either MkUnbalancedTxError Unit) -addScriptDataHash = runExceptT do - dats <- use _datums - costModels <- use _costModels - -- Use both script and minting redeemers in the order they were appended. - reds <- use (_redeemersTxIns <<< to (map fst)) - tx <- use (_unbalancedTx <<< _transaction) - tx' <- ExceptT $ liftEffect $ setScriptDataHash costModels reds dats tx <#> - Right - _cpsToTransaction .= tx' - --- | Add the remaining balance of the total value that the tx must spend. --- | See note [Balance of value spent] -addMissingValueSpent - :: forall (a :: Type) - . ConstraintsM a (Either MkUnbalancedTxError Unit) -addMissingValueSpent = do - missing <- gets totalMissingValue - networkId <- getNetworkId - if isZero missing then pure $ Right unit - else runExceptT do - -- add 'missing' to the transaction's outputs. This ensures that the - -- wallet will add a corresponding input when balancing the - -- transaction. - -- Step 4 of the process described in [Balance of value spent] - lookups <- use _lookups <#> unwrap - let - pkh' = lookups.ownPaymentPubKeyHash - skh' = lookups.ownStakePubKeyHash - -- Potential fix me: This logic may be suspect: - txOut <- case pkh', skh' of - Nothing, Nothing -> throwError OwnPubKeyAndStakeKeyMissing - Just pkh, Just skh -> pure $ TransactionOutput - { address: payPubKeyHashBaseAddress networkId pkh skh - , amount: missing - , datum: NoOutputDatum - , scriptRef: Nothing - } - Just pkh, Nothing -> pure $ TransactionOutput - { address: payPubKeyHashEnterpriseAddress networkId pkh - , amount: missing - , datum: NoOutputDatum - , scriptRef: Nothing - } - Nothing, Just skh -> pure $ TransactionOutput - { address: stakePubKeyHashRewardAddress networkId skh - , amount: missing - , datum: NoOutputDatum - , scriptRef: Nothing - } - _cpsToTxBody <<< _outputs %= Array.(:) txOut - -updateUtxoIndex - :: forall (a :: Type) - . ConstraintsM a (Either MkUnbalancedTxError Unit) -updateUtxoIndex = runExceptT do - txOutputs <- use _lookups <#> unwrap >>> _.txOutputs - refScriptsUtxoMap <- use _refScriptsUtxoMap - networkId <- lift getNetworkId - let - cTxOutputs :: Map TransactionInput TransactionOutput - cTxOutputs = - (txOutputs `union` refScriptsUtxoMap) - <#> fromPlutusTxOutputWithRefScript networkId - -- Left bias towards original map, hence `flip`: - _unbalancedTx <<< _utxoIndex %= flip union cTxOutputs - --- Note, we don't use the redeemer here, unlike Plutus because of our lack of --- `TxIn` datatype. --- | Add a typed input, checking the type of the output it spends. Return the value --- | of the spent output. -addOwnInput - :: forall (validator :: Type) (datum :: Type) (redeemer :: Type) - . ValidatorTypes validator datum redeemer - => IsData datum - => IsData redeemer - => Proxy datum - -> InputConstraint redeemer - -> ConstraintsM validator (Either MkUnbalancedTxError Unit) -addOwnInput _pd (InputConstraint { txOutRef }) = do - networkId <- getNetworkId - runExceptT do - ScriptLookups { txOutputs, typedValidator } <- use _lookups - -- Convert to Cardano type - let cTxOutputs = map (fromPlutusTxOutputWithRefScript networkId) txOutputs - inst <- liftM TypedValidatorMissing typedValidator - -- This line is to type check the `TransactionInput`. Plutus actually creates a `TxIn` - -- but we don't have such a datatype for our `TxBody`. Therefore, if we pass - -- this line, we just insert `TransactionInput` into the body. - typedTxOutRef <- ExceptT $ lift $ - typeTxOutRef networkId (flip lookup cTxOutputs) inst txOutRef - <#> lmap TypeCheckFailed - let value = typedTxOutRefValue typedTxOutRef - -- Must be inserted in order. Hopefully this matches the order under CSL - _cpsToTxBody <<< _inputs %= Set.insert txOutRef - _valueSpentBalancesInputs <>= provideValue value - --- | Add a typed output and return its value. -addOwnOutput - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => ToData datum - => OutputConstraint datum - -> ConstraintsM validator (Either MkUnbalancedTxError Unit) -addOwnOutput (OutputConstraint { datum: d, value }) = do - queryHandle <- lift $ getQueryHandle - networkId <- getNetworkId - runExceptT do - ScriptLookups { typedValidator } <- use _lookups - inst <- liftM TypedValidatorMissing typedValidator - let - value' = fromPlutusValue value - typedTxOut = mkTypedTxOut networkId inst d value' - txOut = typedTxOutTxOut typedTxOut - -- We are erroring if we don't have a datumhash given the polymorphic datum - -- in the `OutputConstraint`: - dHash <- liftM TypedTxOutHasNoDatumHash (typedTxOutDatumHash typedTxOut) - dat <- ExceptT $ liftAff $ queryHandle.getDatumByHash dHash <#> hush - >>> Bind.join - >>> note (CannotQueryDatum dHash) - _cpsToTxBody <<< _outputs %= Array.(:) txOut - ExceptT $ addDatum dat - _valueSpentBalancesOutputs <>= provideValue value' - -resumeTimeConstraints - :: Array TxConstraint -> Either MkUnbalancedTxError (Array TxConstraint) -resumeTimeConstraints constraints = do - let - { no: nonTimeConstraints, yes: timeConstraints } = partition - isTimeConstraint - constraints - intervals = mapMaybe constraintToInterval timeConstraints - newInterval <- foldM mergeIntervals always intervals - pure $ cons (MustValidateIn newInterval) nonTimeConstraints - where - mergeIntervals - :: POSIXTimeRange - -> POSIXTimeRange - -> Either MkUnbalancedTxError POSIXTimeRange - mergeIntervals interval1 interval2 = - let - newInterval :: POSIXTimeRange - newInterval = intersection interval1 interval2 - in - if isEmpty newInterval then Left $ CannotSolveTimeConstraints interval1 - interval2 - else pure newInterval - - constraintToInterval :: TxConstraint -> Maybe POSIXTimeRange - constraintToInterval = case _ of - MustValidateIn x -> Just x - _ -> Nothing - - isTimeConstraint :: TxConstraint -> Boolean - isTimeConstraint (MustValidateIn _) = true - isTimeConstraint _ = false - -data MkUnbalancedTxError - = CannotConvertPaymentPubKeyHash PaymentPubKeyHash - | CannotFindDatum - | CannotQueryDatum DataHash - | CannotConvertPOSIXTimeRange POSIXTimeRange PosixTimeToSlotError - | CannotSolveTimeConstraints POSIXTimeRange POSIXTimeRange - | CannotGetMintingPolicyScriptIndex -- Should be impossible - | CannotGetValidatorHashFromAddress Address -- Get `ValidatorHash` from internal `Address` - | CannotHashDatum Datum - | CannotHashMintingPolicy MintingPolicy - | CannotHashValidator Validator - | CannotMakeValue CurrencySymbol TokenName BigInt - | CannotWithdrawRewardsPubKey StakePubKeyHash - | CannotWithdrawRewardsPlutusScript PlutusScriptStakeValidator - | CannotWithdrawRewardsNativeScript NativeScriptStakeValidator - | DatumNotFound DataHash - | DatumWrongHash DataHash Datum - | MintingPolicyHashNotCurrencySymbol MintingPolicyHash - | MintingPolicyNotFound MintingPolicyHash - | ModifyTx ModifyTxError - | OwnPubKeyAndStakeKeyMissing - | TxOutRefNotFound TransactionInput - | TxOutRefWrongType TransactionInput - | TypeCheckFailed TypeCheckError - | TypedTxOutHasNoDatumHash - | TypedValidatorMissing - | ValidatorHashNotFound ValidatorHash - | WrongRefScriptHash (Maybe ScriptHash) - | CannotSatisfyAny - | ExpectedPlutusScriptGotNativeScript MintingPolicyHash - | CannotMintZero CurrencySymbol TokenName - -derive instance Generic MkUnbalancedTxError _ -derive instance Eq MkUnbalancedTxError - -instance Show MkUnbalancedTxError where - show = genericShow - -lookupTxOutRef - :: forall (a :: Type) - . TransactionInput - -> Maybe InputWithScriptRef - -> ConstraintsM a (Either MkUnbalancedTxError TransactionOutput) -lookupTxOutRef oref = case _ of - Just inputWithRefScript -> - lookup oref (utxoWithScriptRef inputWithRefScript) - # maybe (lookupTxOutRef oref Nothing) (map Right <<< convertTxOutput) - Nothing -> - runExceptT do - utxos <- use _lookups <#> unwrap >>> _.txOutputs - txOutput <- liftM (TxOutRefNotFound oref) (lookup oref utxos) - lift $ convertTxOutput txOutput - where - convertTxOutput - :: Plutus.TransactionOutputWithRefScript -> ConstraintsM a TransactionOutput - convertTxOutput txOutput = - flip fromPlutusTxOutputWithRefScript txOutput <$> getNetworkId - -lookupDatum - :: forall (a :: Type) - . DataHash - -> ConstraintsM a (Either MkUnbalancedTxError Datum) -lookupDatum dh = do - otherDt <- use _lookups <#> unwrap >>> _.datums - pure $ note (DatumNotFound dh) $ lookup dh otherDt - -lookupMintingPolicy - :: MintingPolicyHash - -> Map MintingPolicyHash MintingPolicy - -> Either MkUnbalancedTxError MintingPolicy -lookupMintingPolicy mph mpsMap = - note (MintingPolicyNotFound mph) $ lookup mph mpsMap - -lookupValidator - :: ValidatorHash - -> Map ValidatorHash Validator - -> Either MkUnbalancedTxError Validator -lookupValidator vh osMap = - note (ValidatorHashNotFound vh) $ lookup vh osMap - -reindexMintRedeemers - :: forall (a :: Type) - . MintingPolicyHash - -> T.Redeemer - -> ConstraintsM a (Array T.Redeemer) -reindexMintRedeemers mpsHash redeemer = do - _mintRedeemers %= Map.insert mpsHash redeemer - mintRedeemers :: Array _ <- use _mintRedeemers <#> Map.toUnfoldable - pure $ - mintRedeemers # mapWithIndex \ix (_ /\ T.Redeemer red) -> - T.Redeemer red { index = fromInt ix } - -processScriptRefUnspentOut - :: forall (scriptHash :: Type) (a :: Type) - . Newtype scriptHash ScriptHash - => scriptHash - -> InputWithScriptRef - -> ConstraintsM a (Either MkUnbalancedTxError Unit) -processScriptRefUnspentOut scriptHash inputWithRefScript = do - unspentOut <- case inputWithRefScript of - SpendInput unspentOut -> do - _cpsToTxBody <<< _inputs %= Set.insert (_.input <<< unwrap $ unspentOut) - pure unspentOut - RefInput unspentOut -> do - let refInput = (unwrap unspentOut).input - _cpsToTxBody <<< _referenceInputs %= Set.insert refInput - pure unspentOut - - updateRefScriptsUtxoMap unspentOut - checkScriptRef unspentOut - where - updateRefScriptsUtxoMap - :: TransactionUnspentOutput -> ConstraintsM a Unit - updateRefScriptsUtxoMap (TransactionUnspentOutput { input, output }) = - _refScriptsUtxoMap %= Map.insert input output - - checkScriptRef - :: TransactionUnspentOutput - -> ConstraintsM a (Either MkUnbalancedTxError Unit) - checkScriptRef (TransactionUnspentOutput { output }) = - let - refScriptHash :: Maybe ScriptHash - refScriptHash = _.referenceScript $ unwrap $ (unwrap output).output - - err :: ConstraintsM a (Either MkUnbalancedTxError Unit) - err = pure $ throwError $ WrongRefScriptHash refScriptHash - in - if Just (unwrap scriptHash) /= refScriptHash then err - else pure (Right unit) - -checkRefNative - :: forall (a :: Type) - . InputWithScriptRef - -> ConstraintsM a (Either MkUnbalancedTxError Boolean) -checkRefNative scriptRef = pure $ note (WrongRefScriptHash Nothing) $ isNative - (unwrap (unwrap uout).output).scriptRef - where - isNative ref = ref >>= - ( case _ of - NativeScriptRef _ -> pure true - _ -> pure false - ) - - uout :: TransactionUnspentOutput - uout = case scriptRef of - RefInput ref' -> ref' - SpendInput ref' -> ref' - --- | Modify the `UnbalancedTx` so that it satisfies the constraints, if --- | possible. Fails if a hash is missing from the lookups, or if an output --- | of the wrong type is spent. -processConstraint - :: forall (a :: Type) - . Map MintingPolicyHash MintingPolicy - -> Map ValidatorHash Validator - -> TxConstraint - -> ConstraintsM a (Either MkUnbalancedTxError Unit) -processConstraint mpsMap osMap c = do - queryHandle <- lift $ getQueryHandle - case c of - MustIncludeDatum dat -> addDatum dat - MustValidateIn posixTimeRange -> do - { systemStart } <- asks _.ledgerConstants - eraSummaries <- liftAff $ - queryHandle.getEraSummaries - >>= either (liftEffect <<< throw <<< show) pure - runExceptT do - ({ timeToLive, validityStartInterval }) <- ExceptT $ liftEffect $ - posixTimeRangeToTransactionValidity eraSummaries - systemStart - posixTimeRange - <#> lmap (CannotConvertPOSIXTimeRange posixTimeRange) - _cpsToTxBody <<< _Newtype %= - _ - { ttl = timeToLive - , validityStartInterval = validityStartInterval - } - MustBeSignedBy pkh -> runExceptT do - -- FIXME This is incompatible with Plutus' version, which requires - -- the corresponding `paymentPubKey` lookup. In the next major version, - -- we might wish to revise this - -- See https://github.com/Plutonomicon/cardano-transaction-lib/issues/569 - _cpsToTxBody <<< _requiredSigners <>= Just [ wrap $ unwrap $ unwrap pkh ] - MustSpendAtLeast plutusValue -> do - let value = fromPlutusValue plutusValue - runExceptT $ _valueSpentBalancesInputs <>= requireValue value - MustProduceAtLeast plutusValue -> do - let value = fromPlutusValue plutusValue - runExceptT $ _valueSpentBalancesOutputs <>= requireValue value - MustSpendPubKeyOutput txo -> runExceptT do - TransactionOutput { amount } <- ExceptT $ lookupTxOutRef txo Nothing - -- POTENTIAL FIX ME: Plutus has Tx.TxIn and Tx.PubKeyTxIn -- TxIn - -- keeps track TransactionInput and TxInType (the input type, whether - -- consuming script, public key or simple script) - _cpsToTxBody <<< _inputs %= Set.insert txo - _valueSpentBalancesInputs <>= provideValue amount - MustSpendScriptOutput txo red scriptRefUnspentOut -> runExceptT do - txOut <- ExceptT $ lookupTxOutRef txo scriptRefUnspentOut - case txOut of - TransactionOutput { datum: NoOutputDatum } -> - throwError $ TxOutRefWrongType txo - TransactionOutput { address, amount, datum: datum' } -> - do - vHash <- liftM - (CannotGetValidatorHashFromAddress address) - (addressPaymentValidatorHash address) - case scriptRefUnspentOut of - Nothing -> do - plutusScript <- - except $ unwrap <$> lookupValidator vHash osMap - ExceptT $ attachToCps attachPlutusScript plutusScript - Just scriptRefUnspentOut' -> - ExceptT $ processScriptRefUnspentOut vHash scriptRefUnspentOut' - -- Note: Plutus uses `TxIn` to attach a redeemer and datum. - -- Use the datum hash inside the lookup - case datum' of - OutputDatumHash dHash -> do - dat <- ExceptT do - mDatumLookup <- lookupDatum dHash - if isRight mDatumLookup then - pure mDatumLookup - else - liftAff $ queryHandle.getDatumByHash dHash <#> hush - >>> Bind.join - >>> note - (CannotQueryDatum dHash) - ExceptT $ addDatum dat - OutputDatum _ -> pure unit - NoOutputDatum -> throwError CannotFindDatum - _cpsToTxBody <<< _inputs %= Set.insert txo - let - -- Create a redeemer with hardcoded execution units then call Ogmios - -- to add the units in at the very end. - -- Hardcode script spend index then reindex at the end *after - -- balancing* with `reindexSpentScriptRedeemers` - redeemer = T.Redeemer - { tag: Spend - , index: zero -- hardcoded and tweaked after balancing. - , "data": unwrap red - , exUnits: zero - } - _valueSpentBalancesInputs <>= provideValue amount - -- Append redeemer for spending to array. - _redeemersTxIns <>= Array.singleton (redeemer /\ Just txo) - -- Attach redeemer to witness set. - ExceptT $ attachToCps attachRedeemer redeemer - MustSpendNativeScriptOutput txo ns -> runExceptT do - _cpsToTxBody <<< _inputs %= Set.insert txo - ExceptT $ attachToCps attachNativeScript ns - MustReferenceOutput refInput -> runExceptT do - _cpsToTxBody <<< _referenceInputs %= Set.insert refInput - MustMintValue mpsHash red tn i scriptRefUnspentOut -> runExceptT do - case scriptRefUnspentOut of - Nothing -> do - mp <- except $ lookupMintingPolicy mpsHash mpsMap - ( case mp of - PlutusMintingPolicy p -> - ( ExceptT $ attachToCps - attachPlutusScript - p - ) - NativeMintingPolicy _ -> throwError $ - ExpectedPlutusScriptGotNativeScript mpsHash - ) - Just scriptRefUnspentOut' -> do - isNative <- ExceptT $ checkRefNative scriptRefUnspentOut' - when isNative $ throwError $ ExpectedPlutusScriptGotNativeScript - mpsHash - (ExceptT $ processScriptRefUnspentOut mpsHash scriptRefUnspentOut') - - cs <- - liftM (MintingPolicyHashNotCurrencySymbol mpsHash) (mpsSymbol mpsHash) - let value = mkSingletonValue' cs tn - -- If i is negative we are burning tokens. The tokens burned must - -- be provided as an input. So we add the value burnt to - -- 'valueSpentBalancesInputs'. If i is positive then new tokens are - -- created which must be added to 'valueSpentBalancesOutputs'. - -- If i is zero we raise error, because of - -- https://github.com/Plutonomicon/cardano-transaction-lib/issues/1156 - mintVal <- - if i < zero then do - v <- liftM (CannotMakeValue cs tn i) (value $ negate i) - _valueSpentBalancesInputs <>= provideValue v - pure $ map getNonAdaAsset $ value i - else if i == zero then do - throwError $ CannotMintZero cs tn - else do - v <- liftM (CannotMakeValue cs tn i) (value i) - _valueSpentBalancesOutputs <>= provideValue v - pure $ map getNonAdaAsset $ value i - - let - -- Create a redeemer with zero execution units then call Ogmios to - -- add the units in at the very end. - -- Hardcode minting policy index, then reindex with - -- `reindexMintRedeemers`. - redeemer = T.Redeemer - { tag: Mint - , index: zero - , "data": unwrap red - , exUnits: zero - } - -- Remove mint redeemers from array before reindexing. - _redeemersTxIns %= filter \(T.Redeemer { tag } /\ _) -> tag /= Mint - -- Reindex mint redeemers. - mintRedeemers <- lift $ reindexMintRedeemers mpsHash redeemer - -- Append reindexed mint redeemers to array. - _redeemersTxIns <>= map (_ /\ Nothing) mintRedeemers - - _cpsToTxBody <<< _mint <>= map wrap mintVal - - MustMintValueUsingNativeScript ns tn i -> runExceptT do - let mpHash = wrap <<< unwrap <<< nativeScriptHash $ ns - - ExceptT $ attachToCps attachNativeScript ns - - cs <- liftM (MintingPolicyHashNotCurrencySymbol mpHash) (mpsSymbol mpHash) - let value = mkSingletonValue' cs tn - -- If i is negative we are burning tokens. The tokens burned must - -- be provided as an input. So we add the value burnt to - -- 'valueSpentBalancesInputs'. If i is positive then new tokens are - -- created which must be added to 'valueSpentBalancesOutputs'. - mintVal <- - if i < zero then do - v <- liftM (CannotMakeValue cs tn i) (value $ negate i) - _valueSpentBalancesInputs <>= provideValue v - pure $ map getNonAdaAsset $ value i - else do - v <- liftM (CannotMakeValue cs tn i) (value i) - _valueSpentBalancesOutputs <>= provideValue v - pure $ map getNonAdaAsset $ value i - - _cpsToTxBody <<< _mint <>= map wrap mintVal - - MustPayToPubKeyAddress pkh skh mDatum scriptRef plutusValue -> do - networkId <- getNetworkId - let amount = fromPlutusValue plutusValue - runExceptT do - -- If non-inline datum is presented, add it to 'datumWitnesses' and - -- Array of datums. - datum' <- for mDatum \(dat /\ datp) -> do - when (datp == DatumWitness) $ ExceptT $ addDatum dat - pure $ outputDatum dat datp - let - address = case skh of - Just skh' -> payPubKeyHashBaseAddress networkId pkh skh' - Nothing -> payPubKeyHashEnterpriseAddress networkId pkh - txOut = TransactionOutput - { address - , amount - , datum: fromMaybe NoOutputDatum datum' - , scriptRef: scriptRef - } - _cpsToTxBody <<< _outputs %= Array.(:) txOut - _valueSpentBalancesOutputs <>= provideValue amount - MustPayToScript vlh mbCredential dat datp scriptRef plutusValue -> do - networkId <- getNetworkId - let amount = fromPlutusValue plutusValue - runExceptT do - let - datum' = outputDatum dat datp - txOut = TransactionOutput - { address: case mbCredential of - Nothing -> validatorHashEnterpriseAddress networkId vlh - Just cred -> baseAddressToAddress $ baseAddress - { network: networkId - , paymentCred: scriptHashCredential (unwrap vlh) - , delegationCred: credentialToStakeCredential cred - } - , amount - , datum: datum' - , scriptRef: scriptRef - } - -- Note we don't `addDatum` as this included as part of `mustPayToScript` - -- constraint already. - _cpsToTxBody <<< _outputs %= Array.(:) txOut - _valueSpentBalancesOutputs <>= provideValue amount - MustPayToNativeScript nsh mbCredential plutusValue -> do - networkId <- getNetworkId - let amount = fromPlutusValue plutusValue - runExceptT do - let - txOut = TransactionOutput - { address: case mbCredential of - Nothing -> validatorHashEnterpriseAddress networkId - (wrap $ unwrap nsh) - Just cred -> baseAddressToAddress $ baseAddress - { network: networkId - , paymentCred: scriptHashCredential (unwrap nsh) - , delegationCred: credentialToStakeCredential cred - } - , amount - , datum: NoOutputDatum - , scriptRef: Nothing - } - _cpsToTxBody <<< _outputs %= Array.(:) txOut - _valueSpentBalancesOutputs <>= provideValue amount - MustHashDatum dh dt -> do - let dh' = Hashing.datumHash dt - if dh' == dh then addDatum dt - else pure $ throwError $ DatumWrongHash dh dt - MustRegisterStakePubKey skh -> runExceptT do - void $ lift $ addCertificate - $ StakeRegistration - $ keyHashCredential - $ unwrap - $ unwrap skh - MustDeregisterStakePubKey pubKey -> runExceptT do - void $ lift $ addCertificate - $ StakeDeregistration - $ keyHashCredential - $ unwrap - $ unwrap pubKey - MustRegisterStakeScript scriptHash -> runExceptT do - void $ lift $ addCertificate - $ StakeRegistration - $ scriptHashCredential - $ unwrap scriptHash - MustDeregisterStakePlutusScript plutusScript redeemerData -> runExceptT do - let - cert = StakeDeregistration - ( scriptHashCredential $ unwrap $ plutusScriptStakeValidatorHash - plutusScript - ) - index <- lift $ addCertificate cert - let - redeemer = T.Redeemer - { tag: Cert - , index: fromInt index - , "data": unwrap redeemerData - , exUnits: zero - } - ExceptT $ attachToCps attachPlutusScript (unwrap plutusScript) - ExceptT $ attachToCps attachRedeemer redeemer - _redeemersTxIns <>= Array.singleton (redeemer /\ Nothing) -- TODO: is needed? - MustDeregisterStakeNativeScript stakeValidator -> do - void $ addCertificate $ StakeDeregistration - $ scriptHashCredential - $ unwrap - $ nativeScriptStakeValidatorHash - stakeValidator - attachToCps attachNativeScript (unwrap stakeValidator) - MustRegisterPool poolParams -> runExceptT do - void $ lift $ addCertificate $ PoolRegistration poolParams - MustRetirePool poolKeyHash epoch -> runExceptT do - void $ lift $ addCertificate $ PoolRetirement { poolKeyHash, epoch } - MustDelegateStakePubKey stakePubKeyHash poolKeyHash -> runExceptT do - void $ lift $ addCertificate $ - StakeDelegation (keyHashCredential $ unwrap $ unwrap $ stakePubKeyHash) - poolKeyHash - MustDelegateStakePlutusScript stakeValidator redeemerData poolKeyHash -> - runExceptT do - let - cert = StakeDelegation - ( scriptHashCredential $ unwrap $ plutusScriptStakeValidatorHash - stakeValidator - ) - poolKeyHash - ix <- lift $ addCertificate cert - let - redeemer = T.Redeemer - { tag: Cert - , index: fromInt ix - , "data": unwrap redeemerData - , exUnits: zero - } - ExceptT $ attachToCps attachPlutusScript (unwrap stakeValidator) - ExceptT $ attachToCps attachRedeemer redeemer - _redeemersTxIns <>= Array.singleton (redeemer /\ Nothing) -- TODO: is needed? - MustDelegateStakeNativeScript stakeValidator poolKeyHash -> do - void $ addCertificate $ StakeDelegation - ( scriptHashCredential $ unwrap $ nativeScriptStakeValidatorHash - stakeValidator - ) - poolKeyHash - attachToCps attachNativeScript (unwrap stakeValidator) - MustWithdrawStakePubKey spkh -> runExceptT do - networkId <- lift getNetworkId - mbRewards <- lift $ lift $ wrapQueryM $ getPubKeyHashDelegationsAndRewards - spkh - ({ rewards }) <- ExceptT $ pure $ note (CannotWithdrawRewardsPubKey spkh) - mbRewards - let - rewardAddress = - RewardAddress.stakePubKeyHashRewardAddress networkId spkh - _cpsToTxBody <<< _withdrawals <<< non Map.empty %= - Map.union (Map.singleton rewardAddress (fromMaybe (Coin zero) rewards)) - MustWithdrawStakePlutusScript stakeValidator redeemerData -> runExceptT do - let hash = plutusScriptStakeValidatorHash stakeValidator - networkId <- lift getNetworkId - mbRewards <- lift $ lift $ wrapQueryM $ - getValidatorHashDelegationsAndRewards hash - let - rewardAddress = RewardAddress.stakeValidatorHashRewardAddress networkId - hash - ({ rewards }) <- ExceptT $ pure $ note - (CannotWithdrawRewardsPlutusScript stakeValidator) - mbRewards - _cpsToTxBody <<< _withdrawals <<< non Map.empty %= - Map.union (Map.singleton rewardAddress (fromMaybe (Coin zero) rewards)) - let - redeemer = T.Redeemer - { tag: Reward - , index: zero -- hardcoded and tweaked after balancing. - , "data": unwrap redeemerData - , exUnits: zero - } - ExceptT $ attachToCps attachPlutusScript (unwrap stakeValidator) - ExceptT $ attachToCps attachRedeemer redeemer - _redeemersTxIns <>= Array.singleton (redeemer /\ Nothing) - MustWithdrawStakeNativeScript stakeValidator -> runExceptT do - let hash = nativeScriptStakeValidatorHash stakeValidator - networkId <- lift getNetworkId - mbRewards <- lift $ lift $ wrapQueryM $ - getValidatorHashDelegationsAndRewards hash - let - rewardAddress = RewardAddress.stakeValidatorHashRewardAddress networkId - hash - ({ rewards }) <- ExceptT $ pure $ note - (CannotWithdrawRewardsNativeScript stakeValidator) - mbRewards - _cpsToTxBody <<< _withdrawals <<< non Map.empty %= - Map.union (Map.singleton rewardAddress (fromMaybe (Coin zero) rewards)) - ExceptT $ attachToCps attachNativeScript (unwrap stakeValidator) - MustSatisfyAnyOf xs -> do - cps <- get - let - -- For each sublist, process the constraint from left to right, using the - -- new state in the subsequent call. If we fail, reset to the initial - -- state, `cps` and attempt for the next sublist. If a sublist is - -- processed successfully, we can stop early - I think this is how Plutus - -- behaves (POTENTIAL FIX ME). If all sublists fail, we fail overall as - -- seen in the base case. - tryNext - :: List (List TxConstraint) - -> ConstraintsM a (Either MkUnbalancedTxError Unit) - tryNext Nil = pure $ throwError CannotSatisfyAny - tryNext (Cons ys zs) = - -- Note this implicitly resets state to original cps upon failure (see - -- `put`) - foldM - ( \_ constr -> runExceptT do - let continue = put cps *> tryNext zs - ( ExceptT $ processConstraint mpsMap osMap constr - `catchError` \_ -> continue - ) - `catchError` \_ -> ExceptT continue - ) - (Right unit) - ys - tryNext (toUnfoldable $ map toUnfoldable xs) - MustNotBeValid -> runExceptT do - _cpsToTransaction <<< _isValid .= false - where - outputDatum - :: Datum - -> DatumPresence - -> OutputDatum - outputDatum dat = case _ of - DatumInline -> OutputDatum dat - DatumWitness -> OutputDatumHash $ Hashing.datumHash dat - -credentialToStakeCredential :: Credential -> StakeCredential -credentialToStakeCredential cred = case cred of - PubKeyCredential pubKeyHash -> keyHashCredential (unwrap pubKeyHash) - ScriptCredential scriptHash -> scriptHashCredential (unwrap scriptHash) - --- Attach a Datum, Redeemer, or PlutusScript depending on the handler. They --- share error type anyway. -attachToCps - :: forall (a :: Type) (b :: Type) - . (a -> Transaction -> Effect (Either ModifyTxError Transaction)) - -> a -- Redeemer, Datum, or PlutusScript. - -> ConstraintsM b (Either MkUnbalancedTxError Unit) -attachToCps handler object = do - tx <- use (_unbalancedTx <<< _transaction) - newTx <- liftEffect $ handler object tx <#> lmap ModifyTx - either - (pure <<< throwError) - (map Right <<< (.=) (_unbalancedTx <<< _transaction)) - newTx - --- Attaches datum to the transaction and to Array of datums in the state. -addDatum - :: forall (a :: Type) - . Datum - -> ConstraintsM a (Either MkUnbalancedTxError Unit) -addDatum dat = runExceptT do - ExceptT $ attachToCps attachDatum dat - _datums <>= Array.singleton dat - --- | Returns an index pointing to the location of the newly inserted certificate --- | in the array of transaction certificates. -addCertificate - :: forall (a :: Type) - . Certificate - -> ConstraintsM a Int -addCertificate cert = do - ix <- gets (view (_cpsToTxBody <<< _certs <<< non [] <<< to Array.length)) - _cpsToTxBody <<< _certs <<< non [] %= Array.(:) cert - pure ix - --- Helper to focus from `ConstraintProcessingState` down to `Transaction`. -_cpsToTransaction - :: forall (a :: Type). Lens' (ConstraintProcessingState a) Transaction -_cpsToTransaction = _unbalancedTx <<< _transaction - --- Helper to focus from `ConstraintProcessingState` down to `TxBody`. -_cpsToTxBody :: forall (a :: Type). Lens' (ConstraintProcessingState a) TxBody -_cpsToTxBody = _cpsToTransaction <<< _body - -getNetworkId - :: forall (a :: Type) - . ConstraintsM a NetworkId -getNetworkId = use (_cpsToTxBody <<< _networkId) - >>= maybe (asks _.networkId) pure diff --git a/src/Internal/Types/SystemStart.purs b/src/Internal/Types/SystemStart.purs index c1b8895c5..80e37b524 100644 --- a/src/Internal/Types/SystemStart.purs +++ b/src/Internal/Types/SystemStart.purs @@ -9,8 +9,6 @@ module Ctl.Internal.Types.SystemStart import Prelude import Control.Alt ((<|>)) -import Data.BigInt (BigInt) -import Data.BigInt (fromNumber) as BigInt import Data.DateTime (DateTime) import Data.DateTime.Instant (fromDateTime, unInstant) import Data.Either (Either, hush) @@ -20,6 +18,8 @@ import Data.Maybe (Maybe, fromJust) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Show.Generic (genericShow) import Data.String (length, take) as String +import JS.BigInt (BigInt) +import JS.BigInt (fromNumber) as BigInt import Partial.Unsafe (unsafePartial) newtype SystemStart = SystemStart DateTime diff --git a/src/Internal/Types/TokenName.js b/src/Internal/Types/TokenName.js index 24e44f82c..f432d3927 100644 --- a/src/Internal/Types/TokenName.js +++ b/src/Internal/Types/TokenName.js @@ -3,21 +3,24 @@ // `TextDecoder` is not available in `node`, use polyfill in that case let OurTextDecoder; if (typeof BROWSER_RUNTIME == "undefined" || !BROWSER_RUNTIME) { - OurTextDecoder = require("util").TextDecoder; + const util = await import("util"); + OurTextDecoder = util.TextDecoder; } else { OurTextDecoder = TextDecoder; } -exports._decodeUtf8 = buffer => left => right => { - let decoder = new OurTextDecoder("utf-8", { fatal: true }); // Without fatal=true it never fails +export function _decodeUtf8(buffer) { + return left => right => { + let decoder = new OurTextDecoder("utf-8", { fatal: true }); // Without fatal=true it never fails - try { - return right(decoder.decode(buffer)); - } catch (err) { - return left(err.toString()); - } -}; + try { + return right(decoder.decode(buffer)); + } catch (err) { + return left(err.toString()); + } + }; +} // FIXME: https://github.com/Plutonomicon/cardano-transaction-lib/issues/548 const call = property => object => object[property](); -exports.assetNameName = call("name"); +export const assetNameName = call("name"); diff --git a/src/Internal/Types/TokenName.purs b/src/Internal/Types/TokenName.purs index a68dfe869..86593a9d3 100644 --- a/src/Internal/Types/TokenName.purs +++ b/src/Internal/Types/TokenName.purs @@ -6,6 +6,7 @@ module Ctl.Internal.Types.TokenName , mkTokenNames , tokenNameFromAssetName , assetNameName + , fromTokenName ) where import Prelude @@ -27,7 +28,6 @@ import Ctl.Internal.ToData (class ToData) import Ctl.Internal.Types.ByteArray (ByteArray, byteArrayToHex, byteLength) import Ctl.Internal.Types.RawBytes (RawBytes(RawBytes)) import Data.ArrayBuffer.Types (Uint8Array) -import Data.BigInt (BigInt) import Data.Bitraversable (ltraverse) import Data.Either (Either(Right, Left), either, note) import Data.Map (Map) @@ -38,6 +38,7 @@ import Data.String.CodePoints (drop, take) import Data.TextEncoder (encodeUtf8) import Data.Traversable (class Traversable, traverse) import Data.Tuple.Nested (type (/\)) +import JS.BigInt (BigInt) import Partial.Unsafe (unsafePartial) import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary) import Test.QuickCheck.Gen (resize) diff --git a/src/Internal/Types/TransactionMetadata.purs b/src/Internal/Types/TransactionMetadata.purs index 55e76dfc7..c92752e99 100644 --- a/src/Internal/Types/TransactionMetadata.purs +++ b/src/Internal/Types/TransactionMetadata.purs @@ -21,12 +21,12 @@ import Ctl.Internal.Helpers ) import Ctl.Internal.Types.ByteArray (ByteArray) import Ctl.Internal.Types.Int (Int) as Int -import Data.BigInt (BigInt) import Data.Generic.Rep (class Generic) import Data.Map (Map) import Data.Map (empty) as Map import Data.Newtype (class Newtype) import Data.Show.Generic (genericShow) +import JS.BigInt (BigInt) newtype GeneralTransactionMetadata = GeneralTransactionMetadata diff --git a/src/Internal/Types/TxConstraints.purs b/src/Internal/Types/TxConstraints.purs index 416319cae..a7f9ab229 100644 --- a/src/Internal/Types/TxConstraints.purs +++ b/src/Internal/Types/TxConstraints.purs @@ -36,7 +36,6 @@ module Ctl.Internal.Types.TxConstraints , MustWithdrawStakePubKey ) , TxConstraints(TxConstraints) - , addTxIn , isSatisfiable , mustBeSignedBy , mustDelegateStakeNativeScript @@ -122,6 +121,7 @@ import Ctl.Internal.Types.Interval , intersection , isEmpty ) +import Ctl.Internal.Types.PlutusData (PlutusData) import Ctl.Internal.Types.PubKeyHash (PaymentPubKeyHash, StakePubKeyHash) import Ctl.Internal.Types.Redeemer (Redeemer, unitRedeemer) import Ctl.Internal.Types.Scripts @@ -133,10 +133,7 @@ import Ctl.Internal.Types.Scripts ) import Ctl.Internal.Types.TokenName (TokenName) import Ctl.Internal.Types.Transaction (DataHash, TransactionInput) -import Data.Array ((:)) import Data.Array as Array -import Data.Bifunctor (class Bifunctor) -import Data.BigInt (BigInt) import Data.Foldable (class Foldable, foldMap, foldl, foldr) import Data.Generic.Rep (class Generic) import Data.Lattice (join) @@ -147,6 +144,7 @@ import Data.Monoid (guard) import Data.Newtype (class Newtype, over, unwrap) import Data.Show.Generic (genericShow) import Data.Tuple.Nested (type (/\), (/\)) +import JS.BigInt (BigInt) import Prim.TypeError (class Warn, Text) -------------------------------------------------------------------------------- @@ -244,190 +242,157 @@ derive instance Generic DatumPresence _ instance Show DatumPresence where show x = genericShow x -newtype InputConstraint (i :: Type) = InputConstraint - { redeemer :: i +newtype InputConstraint = InputConstraint + { redeemer :: PlutusData , txOutRef :: TransactionInput } -derive instance Generic (InputConstraint i) _ -derive instance Newtype (InputConstraint i) _ -derive instance Functor InputConstraint -derive newtype instance Eq i => Eq (InputConstraint i) +derive instance Generic InputConstraint _ +derive instance Newtype InputConstraint _ +derive newtype instance Eq InputConstraint -instance Show i => Show (InputConstraint i) where +instance Show InputConstraint where show = genericShow -newtype OutputConstraint (o :: Type) = OutputConstraint - { datum :: o +newtype OutputConstraint = OutputConstraint + { datum :: PlutusData , value :: Value } -derive instance Generic (OutputConstraint o) _ -derive instance Newtype (OutputConstraint o) _ -derive instance Functor OutputConstraint -derive newtype instance Eq o => Eq (OutputConstraint o) +derive instance Generic OutputConstraint _ +derive instance Newtype OutputConstraint _ +derive newtype instance Eq OutputConstraint -instance Show o => Show (OutputConstraint o) where +instance Show OutputConstraint where show = genericShow -- | Restrictions placed on the allocation of funds to outputs of transactions. -newtype TxConstraints (i :: Type) (o :: Type) = TxConstraints +newtype TxConstraints = TxConstraints { constraints :: Array TxConstraint - , ownInputs :: Array (InputConstraint i) - , ownOutputs :: Array (OutputConstraint o) } -derive instance Generic (TxConstraints i o) _ -derive instance Newtype (TxConstraints i o) _ -derive newtype instance (Eq i, Eq o) => Eq (TxConstraints i o) +derive instance Generic TxConstraints _ +derive instance Newtype TxConstraints _ +derive newtype instance Eq TxConstraints -- Array concatenation allowing duplicates like Plutus -derive newtype instance Semigroup (TxConstraints i o) -derive newtype instance Monoid (TxConstraints i o) +derive newtype instance Semigroup TxConstraints +derive newtype instance Monoid TxConstraints -instance (Show i, Show o) => Show (TxConstraints i o) where +instance Show TxConstraints where show = genericShow -instance Bifunctor TxConstraints where - bimap f g (TxConstraints txc@{ ownInputs, ownOutputs }) = - TxConstraints txc - { ownInputs = map (map f) ownInputs - , ownOutputs = map (map g) ownOutputs - } - -------------------------------------------------------------------------------- -- Helpers -------------------------------------------------------------------------------- --- | Adds a `TransactionInput` as an input constraint with an arbitrary --- | redeemer. -addTxIn - :: forall (i :: Type) (o :: Type) - . TransactionInput - -> i - -> TxConstraints i o - -> TxConstraints i o -addTxIn outRef red (TxConstraints txc@{ ownInputs }) = - let - ic = InputConstraint { redeemer: red, txOutRef: outRef } - in - TxConstraints txc { ownInputs = ic : ownInputs } - singleton - :: forall (i :: Type) (o :: Type). TxConstraint -> TxConstraints i o + :: TxConstraint -> TxConstraints singleton a = over TxConstraints _ { constraints = Array.singleton a } mempty -- | `mustValidateIn r` requires the transaction's time range to be contained -- | in `r`. mustValidateIn - :: forall (i :: Type) (o :: Type). POSIXTimeRange -> TxConstraints i o + :: POSIXTimeRange -> TxConstraints mustValidateIn = singleton <<< MustValidateIn -- | Require the transaction to be signed by the public key. mustBeSignedBy - :: forall (i :: Type) (o :: Type). PaymentPubKeyHash -> TxConstraints i o + :: PaymentPubKeyHash -> TxConstraints mustBeSignedBy = singleton <<< MustBeSignedBy -- | Require the transaction to include a datum. -mustIncludeDatum :: forall (i :: Type) (o :: Type). Datum -> TxConstraints i o +mustIncludeDatum :: Datum -> TxConstraints mustIncludeDatum = singleton <<< MustIncludeDatum -- | Require the transaction to reference (not spend!) the given unspent -- | transaction output. mustReferenceOutput - :: forall (i :: Type) (o :: Type). TransactionInput -> TxConstraints i o + :: TransactionInput -> TxConstraints mustReferenceOutput = singleton <<< MustReferenceOutput -- | Lock the value with a public key address. (Base Address) mustPayToPubKeyAddress - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> StakePubKeyHash -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyAddress pkh skh = singleton <<< MustPayToPubKeyAddress pkh (Just skh) Nothing Nothing -- | Lock the value and datum with a public key address. mustPayToPubKeyAddressWithDatum - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> StakePubKeyHash -> Datum -> DatumPresence -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyAddressWithDatum pkh skh datum dtp = singleton <<< MustPayToPubKeyAddress pkh (Just skh) (Just $ datum /\ dtp) Nothing -- | Lock the value and reference script with a public key address. mustPayToPubKeyAddressWithScriptRef - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> StakePubKeyHash -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyAddressWithScriptRef pkh skh scriptRef = singleton <<< MustPayToPubKeyAddress pkh (Just skh) Nothing (Just scriptRef) -- | Lock the value, datum and reference script with a public key address. mustPayToPubKeyAddressWithDatumAndScriptRef - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> StakePubKeyHash -> Datum -> DatumPresence -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyAddressWithDatumAndScriptRef pkh skh datum dtp scriptRef = singleton <<< MustPayToPubKeyAddress pkh (Just skh) (Just $ datum /\ dtp) (Just scriptRef) -- | Lock the value with a public key. (Enterprise Address) mustPayToPubKey - :: forall (i :: Type) (o :: Type) - . Warn + :: Warn ( Text "Some wallets may not recognize addresses without a staking key component. Consider using mustPayToPubKeyAddress" ) => PaymentPubKeyHash -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKey pkh = singleton <<< MustPayToPubKeyAddress pkh Nothing Nothing Nothing -- | Lock the value and datum with a payment public key hash. mustPayToPubKeyWithDatum - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> Datum -> DatumPresence -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyWithDatum pkh datum dtp = singleton <<< MustPayToPubKeyAddress pkh Nothing (Just $ datum /\ dtp) Nothing -- | Lock the value and reference script with a payment public key hash. mustPayToPubKeyWithScriptRef - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyWithScriptRef pkh scriptRef = singleton <<< MustPayToPubKeyAddress pkh Nothing Nothing (Just scriptRef) -- | Lock the value, datum and reference script with a payment public key hash. mustPayToPubKeyWithDatumAndScriptRef - :: forall (i :: Type) (o :: Type) - . PaymentPubKeyHash + :: PaymentPubKeyHash -> Datum -> DatumPresence -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToPubKeyWithDatumAndScriptRef pkh datum dtp scriptRef = singleton <<< MustPayToPubKeyAddress pkh Nothing (Just $ datum /\ dtp) (Just scriptRef) @@ -438,24 +403,22 @@ mustPayToPubKeyWithDatumAndScriptRef pkh datum dtp scriptRef = -- | `mustPayToScript`, and all scripts must be explicitly provided to build -- | the transaction. mustPayToScript - :: forall (i :: Type) (o :: Type) - . ValidatorHash + :: ValidatorHash -> Datum -> DatumPresence -> Value - -> TxConstraints i o + -> TxConstraints mustPayToScript vh dt dtp vl = singleton (MustPayToScript vh Nothing dt dtp Nothing vl) <> guard (dtp == DatumWitness) (singleton $ MustIncludeDatum dt) mustPayToScriptAddress - :: forall (i :: Type) (o :: Type) - . ValidatorHash + :: ValidatorHash -> Credential -> Datum -> DatumPresence -> Value - -> TxConstraints i o + -> TxConstraints mustPayToScriptAddress vh credential dt dtp vl = singleton (MustPayToScript vh (Just credential) dt dtp Nothing vl) <> guard (dtp == DatumWitness) (singleton $ MustIncludeDatum dt) @@ -464,13 +427,12 @@ mustPayToScriptAddress vh credential dt dtp vl = -- | Note that the provided reference script does *not* necessarily need to -- | control the spending of the output, i.e. both scripts can be different. mustPayToScriptWithScriptRef - :: forall (i :: Type) (o :: Type) - . ValidatorHash + :: ValidatorHash -> Datum -> DatumPresence -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToScriptWithScriptRef vh dt dtp scriptRef vl = singleton (MustPayToScript vh Nothing dt dtp (Just scriptRef) vl) <> guard (dtp == DatumWitness) (singleton $ MustIncludeDatum dt) @@ -486,7 +448,7 @@ mustPayToScriptAddressWithScriptRef -> DatumPresence -> ScriptRef -> Value - -> TxConstraints i o + -> TxConstraints mustPayToScriptAddressWithScriptRef vh credential dt dtp scriptRef vl = singleton (MustPayToScript vh (Just credential) dt dtp (Just scriptRef) vl) <> guard (dtp == DatumWitness) (singleton $ MustIncludeDatum dt) @@ -495,7 +457,7 @@ mustPayToNativeScript :: forall (i :: Type) (o :: Type) . NativeScriptHash -> Value - -> TxConstraints i o + -> TxConstraints mustPayToNativeScript nsHash vl = singleton (MustPayToNativeScript nsHash Nothing vl) @@ -504,13 +466,13 @@ mustPayToNativeScriptAddress . NativeScriptHash -> Credential -> Value - -> TxConstraints i o + -> TxConstraints mustPayToNativeScriptAddress nsHash credential vl = singleton (MustPayToNativeScript nsHash (Just credential) vl) -- | Mint the given `Value` -- | The amount to mint must not be zero. -mustMintValue :: forall (i :: Type) (o :: Type). Value -> TxConstraints i o +mustMintValue :: Value -> TxConstraints mustMintValue = mustMintValueWithRedeemer unitRedeemer -- | Mint the given `Value` by accessing non-Ada assets. @@ -519,12 +481,12 @@ mustMintValueWithRedeemer :: forall (i :: Type) (o :: Type) . Redeemer -> Value - -> TxConstraints i o + -> TxConstraints mustMintValueWithRedeemer redeemer = Array.fold <<< map tokenConstraint <<< flattenNonAdaAssets where tokenConstraint - :: CurrencySymbol /\ TokenName /\ BigInt -> TxConstraints i o + :: CurrencySymbol /\ TokenName /\ BigInt -> TxConstraints tokenConstraint (cs /\ tn /\ amount) = let mintingPolicyHash = currencyMPSHash cs @@ -538,7 +500,7 @@ mustMintCurrency . MintingPolicyHash -> TokenName -> BigInt - -> TxConstraints i o + -> TxConstraints mustMintCurrency mph = mustMintCurrencyWithRedeemer mph unitRedeemer @@ -547,7 +509,7 @@ mustMintCurrencyUsingNativeScript . NativeScript -> TokenName -> BigInt - -> TxConstraints i o + -> TxConstraints mustMintCurrencyUsingNativeScript ns tk i = singleton (MustMintValueUsingNativeScript ns tk i) @@ -559,7 +521,7 @@ mustMintCurrencyUsingScriptRef -> TokenName -> BigInt -> InputWithScriptRef - -> TxConstraints i o + -> TxConstraints mustMintCurrencyUsingScriptRef mph = mustMintCurrencyWithRedeemerUsingScriptRef mph unitRedeemer @@ -571,7 +533,7 @@ mustMintCurrencyWithRedeemer -> Redeemer -> TokenName -> BigInt - -> TxConstraints i o + -> TxConstraints mustMintCurrencyWithRedeemer mph red tn amount = singleton (MustMintValue mph red tn amount Nothing) @@ -584,21 +546,21 @@ mustMintCurrencyWithRedeemerUsingScriptRef -> TokenName -> BigInt -> InputWithScriptRef - -> TxConstraints i o + -> TxConstraints mustMintCurrencyWithRedeemerUsingScriptRef mph red tn amount = singleton <<< MustMintValue mph red tn amount <<< Just -- | Requirement to spend inputs with at least the given value -mustSpendAtLeast :: forall (i :: Type) (o :: Type). Value -> TxConstraints i o +mustSpendAtLeast :: Value -> TxConstraints mustSpendAtLeast = singleton <<< MustSpendAtLeast -- | Requirement to produce outputs with at least the given value -mustProduceAtLeast :: forall (i :: Type) (o :: Type). Value -> TxConstraints i o +mustProduceAtLeast :: Value -> TxConstraints mustProduceAtLeast = singleton <<< MustProduceAtLeast -- | Spend the given unspent transaction public key output. mustSpendPubKeyOutput - :: forall (i :: Type) (o :: Type). TransactionInput -> TxConstraints i o + :: TransactionInput -> TxConstraints mustSpendPubKeyOutput = singleton <<< MustSpendPubKeyOutput -- | Spend the given unspent transaction script output. @@ -606,7 +568,7 @@ mustSpendScriptOutput :: forall (i :: Type) (o :: Type) . TransactionInput -> Redeemer - -> TxConstraints i o + -> TxConstraints mustSpendScriptOutput txOutRef red = singleton (MustSpendScriptOutput txOutRef red Nothing) @@ -617,7 +579,7 @@ mustSpendScriptOutputUsingScriptRef . TransactionInput -> Redeemer -> InputWithScriptRef - -> TxConstraints i o + -> TxConstraints mustSpendScriptOutputUsingScriptRef txOutRef red = singleton <<< MustSpendScriptOutput txOutRef red <<< Just @@ -625,56 +587,56 @@ mustSpendNativeScriptOutput :: forall (i :: Type) (o :: Type) . TransactionInput -> NativeScript - -> TxConstraints i o + -> TxConstraints mustSpendNativeScriptOutput txOutRef = singleton <<< MustSpendNativeScriptOutput txOutRef mustHashDatum - :: forall (i :: Type) (o :: Type). DataHash -> Datum -> TxConstraints i o + :: DataHash -> Datum -> TxConstraints mustHashDatum dhsh = singleton <<< MustHashDatum dhsh mustRegisterStakePubKey - :: forall (i :: Type) (o :: Type). StakePubKeyHash -> TxConstraints i o + :: StakePubKeyHash -> TxConstraints mustRegisterStakePubKey = singleton <<< MustRegisterStakePubKey mustDeregisterStakePubKey - :: forall (i :: Type) (o :: Type). StakePubKeyHash -> TxConstraints i o + :: StakePubKeyHash -> TxConstraints mustDeregisterStakePubKey = singleton <<< MustDeregisterStakePubKey mustRegisterStakeScript - :: forall (i :: Type) (o :: Type). StakeValidatorHash -> TxConstraints i o + :: StakeValidatorHash -> TxConstraints mustRegisterStakeScript = singleton <<< MustRegisterStakeScript mustDeregisterStakePlutusScript :: forall (i :: Type) (o :: Type) . PlutusScriptStakeValidator -> Redeemer - -> TxConstraints i o + -> TxConstraints mustDeregisterStakePlutusScript sv = singleton <<< MustDeregisterStakePlutusScript sv mustDeregisterStakeNativeScript :: forall (i :: Type) (o :: Type) . NativeScriptStakeValidator - -> TxConstraints i o + -> TxConstraints mustDeregisterStakeNativeScript = singleton <<< MustDeregisterStakeNativeScript mustRegisterPool - :: forall (i :: Type) (o :: Type). PoolRegistrationParams -> TxConstraints i o + :: PoolRegistrationParams -> TxConstraints mustRegisterPool = singleton <<< MustRegisterPool mustRetirePool :: forall (i :: Type) (o :: Type) . PoolPubKeyHash -> Epoch - -> TxConstraints i o + -> TxConstraints mustRetirePool poolPubKeyHash = singleton <<< MustRetirePool poolPubKeyHash mustDelegateStakePubKey :: forall (i :: Type) (o :: Type) . StakePubKeyHash -> PoolPubKeyHash - -> TxConstraints i o + -> TxConstraints mustDelegateStakePubKey spkh ppkh = singleton $ MustDelegateStakePubKey spkh ppkh @@ -683,7 +645,7 @@ mustDelegateStakePlutusScript . PlutusScriptStakeValidator -> Redeemer -> PoolPubKeyHash - -> TxConstraints i o + -> TxConstraints mustDelegateStakePlutusScript sv redeemer ppkh = singleton $ MustDelegateStakePlutusScript sv redeemer ppkh @@ -691,26 +653,26 @@ mustDelegateStakeNativeScript :: forall (i :: Type) (o :: Type) . NativeScriptStakeValidator -> PoolPubKeyHash - -> TxConstraints i o + -> TxConstraints mustDelegateStakeNativeScript sv ppkh = singleton $ MustDelegateStakeNativeScript sv ppkh mustWithdrawStakePubKey - :: forall (i :: Type) (o :: Type). StakePubKeyHash -> TxConstraints i o + :: StakePubKeyHash -> TxConstraints mustWithdrawStakePubKey spkh = singleton $ MustWithdrawStakePubKey spkh mustWithdrawStakePlutusScript :: forall (i :: Type) (o :: Type) . PlutusScriptStakeValidator -> Redeemer - -> TxConstraints i o + -> TxConstraints mustWithdrawStakePlutusScript validator redeemer = singleton $ MustWithdrawStakePlutusScript validator redeemer mustWithdrawStakeNativeScript :: forall (i :: Type) (o :: Type) . NativeScriptStakeValidator - -> TxConstraints i o + -> TxConstraints mustWithdrawStakeNativeScript = singleton <<< MustWithdrawStakeNativeScript @@ -721,8 +683,8 @@ mustWithdrawStakeNativeScript = mustSatisfyAnyOf :: forall (f :: Type -> Type) (i :: Type) (o :: Type) . Foldable f - => f (TxConstraints i o) - -> TxConstraints i o + => f (TxConstraints) + -> TxConstraints mustSatisfyAnyOf = Array.fromFoldable >>> map (_.constraints <<< unwrap) @@ -732,11 +694,11 @@ mustSatisfyAnyOf = -- | Marks the transaction as invalid, requiring at least one script execution -- | to fail. Despite failure, the transaction can still be submitted into the -- | chain and collateral will be lost. -mustNotBeValid :: forall (i :: Type) (o :: Type). TxConstraints i o +mustNotBeValid :: TxConstraints mustNotBeValid = singleton $ MustNotBeValid -- | Are the constraints satisfiable given the time intervals? -isSatisfiable :: forall (i :: Type) (o :: Type). TxConstraints i o -> Boolean +isSatisfiable :: TxConstraints -> Boolean isSatisfiable (TxConstraints { constraints }) = let intervals = @@ -751,8 +713,7 @@ isSatisfiable (TxConstraints { constraints }) = not (isEmpty itvl) pubKeyPayments - :: forall (i :: Type) (o :: Type) - . TxConstraints i o + :: TxConstraints -> Array (PaymentPubKeyHash /\ Value) pubKeyPayments (TxConstraints { constraints }) = toUnfoldable @@ -764,7 +725,7 @@ pubKeyPayments (TxConstraints { constraints }) = -- | The minimum `Value` that satisfies all `MustSpendAtLeast` constraints mustSpendAtLeastTotal - :: forall (i :: Type) (o :: Type). TxConstraints i o -> Value + :: TxConstraints -> Value mustSpendAtLeastTotal = foldr (join <<< f) mempty <<< _.constraints <<< unwrap where @@ -774,7 +735,7 @@ mustSpendAtLeastTotal = -- | The minimum `Value` that satisfies all `MustProduceAtLeast` constraints mustProduceAtLeastTotal - :: forall (i :: Type) (o :: Type). TxConstraints i o -> Value + :: TxConstraints -> Value mustProduceAtLeastTotal = foldr (join <<< f) mempty <<< _.constraints <<< unwrap where @@ -783,8 +744,7 @@ mustProduceAtLeastTotal = f _ = mempty requiredSignatories - :: forall (i :: Type) (o :: Type) - . TxConstraints i o + :: TxConstraints -> Array PaymentPubKeyHash requiredSignatories = foldMap f <<< _.constraints <<< unwrap where @@ -793,8 +753,7 @@ requiredSignatories = foldMap f <<< _.constraints <<< unwrap f _ = [] requiredMonetaryPolicies - :: forall (i :: Type) (o :: Type) - . TxConstraints i o + :: TxConstraints -> Array MintingPolicyHash requiredMonetaryPolicies = foldMap f <<< _.constraints <<< unwrap where @@ -803,7 +762,7 @@ requiredMonetaryPolicies = foldMap f <<< _.constraints <<< unwrap f _ = [] requiredDatums - :: forall (i :: Type) (o :: Type). TxConstraints i o -> Array Datum + :: TxConstraints -> Array Datum requiredDatums = foldMap f <<< _.constraints <<< unwrap where f :: TxConstraint -> Array Datum diff --git a/src/Internal/Types/TypedTxOut.purs b/src/Internal/Types/TypedTxOut.purs deleted file mode 100644 index a35410ef8..000000000 --- a/src/Internal/Types/TypedTxOut.purs +++ /dev/null @@ -1,294 +0,0 @@ -module Ctl.Internal.Types.TypedTxOut - ( TypeCheckError - ( WrongValidatorAddress - , ExpectedScriptGotPubkey - , WrongRedeemerType - , WrongDatumType - , CannotQueryDatum - , CannotMakeTypedTxOut - , UnknownRef - ) - , TypedTxOut - , TypedTxOutRef - , mkTypedTxOut - , typeTxOut - , typeTxOutRef - , typedTxOutAddress - , typedTxOutDatumHash - , typedTxOutRefAddress - , typedTxOutRefDatumHash - , typedTxOutRefInput - , typedTxOutRefValue - , typedTxOutTxOut - , typedTxOutValue - ) where - --- DO NOT export data constructors for `TypedTxOut` and `TypedTxOutRef`. - --- | This module defines typed versions the transaction input and output types --- | to ensure that the validator script type agrees with the attached inputs --- | and outputs. --- | https://playground.plutus.iohkdev.io/doc/haddock/plutus-ledger/html/src/Ledger.Typed.Tx.html - -import Prelude - -import Control.Monad.Error.Class (throwError) -import Control.Monad.Except.Trans (ExceptT(ExceptT), runExceptT) -import Ctl.Internal.Cardano.Types.Transaction - ( TransactionOutput(TransactionOutput) - ) -import Ctl.Internal.Cardano.Types.Value (Value) -import Ctl.Internal.Contract.Monad (Contract) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) -import Ctl.Internal.FromData (class FromData, fromData) -import Ctl.Internal.Hashing (datumHash) as Hashing -import Ctl.Internal.Helpers (liftM) -import Ctl.Internal.IsData (class IsData) -import Ctl.Internal.Scripts (typedValidatorEnterpriseAddress) -import Ctl.Internal.Serialization.Address (Address, NetworkId) -import Ctl.Internal.ToData (class ToData, toData) -import Ctl.Internal.Types.Datum (DataHash, Datum(Datum)) -import Ctl.Internal.Types.OutputDatum - ( OutputDatum(OutputDatumHash) - , outputDatumDataHash - ) -import Ctl.Internal.Types.PlutusData (PlutusData) -import Ctl.Internal.Types.Transaction (TransactionInput) -import Ctl.Internal.Types.TypedValidator (class DatumType, TypedValidator) -import Data.Either (Either, hush, note) -import Data.Generic.Rep (class Generic) -import Data.Maybe (Maybe(Nothing)) -import Data.Newtype (unwrap, wrap) -import Data.Show.Generic (genericShow) -import Effect.Aff.Class (liftAff) - --- | A `TransactionInput` tagged by a phantom type: and the --- | connection type of the output. --- | Plutus uses wraps this type with a `TxIn` data type instead with optionally --- | carries the address type. We don't include such a type in our setup. --- | Note that `TypedTxOut` is implicitly constrained by its smart --- | constructor. -newtype TypedTxOutRef (validator :: Type) (datum :: Type) = TypedTxOutRef - { txOutRef :: TransactionInput, typedTxOut :: TypedTxOut validator datum } - --- `DatumType validator datum` not needed but this replicates Plutus and provides extra --- type safety. -derive newtype instance - ( DatumType validator datum - , Eq datum - ) => - Eq (TypedTxOutRef validator datum) - --- | Extract the `Address` of a `TypedTxOutRef` -typedTxOutRefAddress - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOutRef validator datum - -> Address -typedTxOutRefAddress (TypedTxOutRef { typedTxOut }) = - typedTxOutAddress typedTxOut - --- | Extract the `DataHash` of a `TypedTxOutRef` -typedTxOutRefDatumHash - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOutRef validator datum - -> Maybe DataHash -typedTxOutRefDatumHash (TypedTxOutRef { typedTxOut }) = - typedTxOutDatumHash typedTxOut - --- | Extract the `Value` of a `TypedTxOutRef` -typedTxOutRefValue - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOutRef validator datum - -> Value -typedTxOutRefValue (TypedTxOutRef { typedTxOut }) = typedTxOutValue typedTxOut - --- | Extract the `TransactionInput` of a `TypedTxOutRef` -typedTxOutRefInput - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOutRef validator datum - -> TransactionInput -typedTxOutRefInput (TypedTxOutRef { txOutRef }) = txOutRef - --- A `TransactionOutput` tagged by a phantom type: and the connection type of --- the output. DO NOT import as extra constraints are required so only import --- the smart constructor `mkTypedTxOut` -newtype TypedTxOut (validator :: Type) (datum :: Type) = TypedTxOut - { txOut :: TransactionOutput, data :: datum } - --- `DatumType a b` not needed but this replicates Plutus and provides extra --- type safety. -derive newtype instance - ( DatumType validator datum - , Eq datum - ) => - Eq (TypedTxOut validator datum) - --- | Extract the `Address` of a `TypedTxOut` -typedTxOutAddress - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOut validator datum - -> Address -typedTxOutAddress (TypedTxOut { txOut }) = (unwrap txOut).address - --- | Extract the `DataHash` of a `TypedTxOut` -typedTxOutDatumHash - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOut validator datum - -> Maybe DataHash -typedTxOutDatumHash (TypedTxOut { txOut }) = outputDatumDataHash - (unwrap txOut).datum - --- | Extract the `Value` of a `TypedTxOut` -typedTxOutValue - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOut validator datum - -> Value -typedTxOutValue (TypedTxOut { txOut }) = (unwrap txOut).amount - --- | Extract the `TxOut` ~ `TransactionOutput` of a `TypedTxOut` -typedTxOutTxOut - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => TypedTxOut validator datum - -> TransactionOutput -typedTxOutTxOut (TypedTxOut { txOut }) = txOut - --- Purescript's lack of dependent types requires this smart constructor as we --- cannot constrain the `TypedTxOut` datatype. --- | Smart constructor to create a `TypedTxOut` from a network ID, --- | a correctly-typed data, script, an address, and a value. A smart --- | constructor is required because extra constraints are needed. --- | `TransactionOutput` is tagged by a phantom type. -mkTypedTxOut - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => ToData datum - => NetworkId - -> TypedValidator validator - -> datum - -> Value - -> TypedTxOut validator datum -mkTypedTxOut networkId typedVal dt amount = - let - dHash = Hashing.datumHash $ Datum $ toData dt - -- FIX ME: This is hardcoded to enterprise address, it seems like Plutus' - -- "validatorAddress" also currently doesn't account for staking. - address = typedValidatorEnterpriseAddress networkId typedVal - in - mkTypedTxOut' dt $ - wrap - { address - , amount - , datum: OutputDatumHash dHash - , scriptRef: Nothing - } - where - mkTypedTxOut' - :: datum -- Data - -> TransactionOutput - -> TypedTxOut validator datum - mkTypedTxOut' dat txOut = TypedTxOut { txOut, data: dat } - --- | An error we can get while trying to type an existing transaction part. -data TypeCheckError - = WrongValidatorAddress Address Address - | ExpectedScriptGotPubkey - | WrongRedeemerType PlutusData - | WrongDatumType PlutusData - | CannotQueryDatum DataHash - | CannotMakeTypedTxOut - | UnknownRef - -derive instance Generic TypeCheckError _ -derive instance Eq TypeCheckError -derive instance Ord TypeCheckError - -instance Show TypeCheckError where - show = genericShow - --- | Checks that the given validator hash is consistent with the actual validator. -checkValidatorAddress - :: forall (validator :: Type) (m :: Type -> Type) - . Monad m - => NetworkId - -> TypedValidator validator - -> Address - -> m (Either TypeCheckError Unit) -checkValidatorAddress networkId typedVal actualAddr = runExceptT do - let expectedAddr = typedValidatorEnterpriseAddress networkId typedVal - unless (expectedAddr == actualAddr) - $ throwError - $ WrongValidatorAddress expectedAddr actualAddr - --- -- | Checks that the given redeemer script has the right type. --- checkRedeemer --- :: forall (a :: Type) (b :: Type) (m :: Type -> Type) --- . Monad m --- => RedeemerType a b --- => FromData b --- => TypedValidator a --- -> Redeemer --- -> m (Either TypeCheckError b) --- checkRedeemer _ (Redeemer pd) = --- runExceptT $ liftM (WrongRedeemerType pd) (fromData pd :: Maybe b) - --- | Checks that the given datum has the right type. -checkDatum - :: forall (validator :: Type) (datum :: Type) (m :: Type -> Type) - . Monad m - => DatumType validator datum - => FromData datum - => TypedValidator validator - -> Datum - -> m (Either TypeCheckError datum) -checkDatum _ (Datum pd) = - runExceptT $ liftM (WrongDatumType pd) (fromData pd :: Maybe datum) - --- | Create a `TypedTxOut` from an existing `TransactionInput` by --- | checking the types of its parts. -typeTxOut - :: forall (validator :: Type) (datum :: Type) - . DatumType validator datum - => IsData datum - => NetworkId - -> TypedValidator validator - -> TransactionOutput - -> Contract (Either TypeCheckError (TypedTxOut validator datum)) -typeTxOut - networkId - typedVal - (TransactionOutput { address, amount, datum }) = do - queryHandle <- getQueryHandle - runExceptT do - -- Assume `Nothing` is a public key. - dHash <- liftM ExpectedScriptGotPubkey $ outputDatumDataHash datum - void $ checkValidatorAddress networkId typedVal address - pd <- ExceptT $ liftAff $ queryHandle.getDatumByHash dHash <#> hush >>> join - >>> note (CannotQueryDatum dHash) - dtOut <- ExceptT $ checkDatum typedVal pd - pure $ mkTypedTxOut networkId typedVal dtOut amount - --- | Create a `TypedTxOutRef` from an existing `TransactionInput` --- | by checking the types of its parts. To do this we need to cross-reference --- | against the validator script and be able to look up the `TransactionInput` to --- | which this reference points. -typeTxOutRef - :: forall (validator :: Type) (datum :: Type) (m :: Type -> Type) - . DatumType validator datum - => IsData datum - => NetworkId - -> (TransactionInput -> Maybe TransactionOutput) - -> TypedValidator validator - -> TransactionInput - -> Contract (Either TypeCheckError (TypedTxOutRef validator datum)) -typeTxOutRef networkId lookupRef typedVal txOutRef = runExceptT do - out <- liftM UnknownRef (lookupRef txOutRef) - typedTxOut <- ExceptT $ typeTxOut networkId typedVal out - pure $ TypedTxOutRef { txOutRef, typedTxOut } diff --git a/src/Internal/Types/TypedValidator.purs b/src/Internal/Types/TypedValidator.purs deleted file mode 100644 index 4dd6e5311..000000000 --- a/src/Internal/Types/TypedValidator.purs +++ /dev/null @@ -1,185 +0,0 @@ -module Ctl.Internal.Types.TypedValidator - ( TypedValidator(TypedValidator) - , ValidatorType - , WrappedValidatorType - , class DatumType - , class RedeemerType - , class ValidatorTypes - , forwardingMintingPolicy - , generalise - , typedValidatorHash - , typedValidatorScript - ) where - -import Prelude - -import Aeson - ( class DecodeAeson - , JsonDecodeError(TypeMismatch) - , caseAesonObject - , (.:) - ) -import Ctl.Internal.Cardano.Types.Transaction (Transaction) -import Ctl.Internal.Types.Any (Any) -import Ctl.Internal.Types.PlutusData (PlutusData) -import Ctl.Internal.Types.Scripts - ( MintingPolicy - , MintingPolicyHash - , Validator - , ValidatorHash - ) -import Data.Either (Either(Left)) -import Data.Generic.Rep (class Generic) -import Data.Newtype (class Newtype, unwrap) -import Data.Show.Generic (genericShow) -import Effect (Effect) - --- We don't need c, d because a determines the same type b for `DatumType` and --- `RedeemerType`. Plutus uses associated typed families, but we don't have --- such capabilities and therefore use functional dependencies instead. --- An alternative formulation could be: --- `ValidatorTypes (a :: Type) (b :: Type) | a -> b` --- then --- class ValidatorType a b <= DatumType (a :: Type) (b :: Type) | a -> b --- class ValidatorType a b <= RedeemerType (a :: Type) (b :: Type) | a -> b --- separately. We'll use the below implementation for now and determine whether --- it suffices. --- | A typeclass that associates a type standing for a connection type with two --- | types, the type of the redeemer and the data script for that connection type. -class ValidatorTypes :: Type -> Type -> Type -> Constraint -class - ( DatumType validator datum - , RedeemerType validator redeemer - ) <= - ValidatorTypes validator datum redeemer - -instance - ( DatumType validator datum - , RedeemerType validator redeemer - ) => - ValidatorTypes validator datum redeemer - --- | The type of the data of this connection type. -class DatumType :: Type -> Type -> Constraint -class DatumType validator datum | validator -> datum - -instance DatumType Void Void - -instance DatumType Any PlutusData - -instance DatumType PlutusData Unit - --- | The type of the redeemers of this connection type. -class RedeemerType :: Type -> Type -> Constraint -class RedeemerType validator redeemer | validator -> redeemer - -instance RedeemerType Void Void - -instance RedeemerType Any PlutusData - -instance RedeemerType PlutusData Unit - --- Replace `ScriptContext` by `Transaction` which contains all the scripts --- anyway: --- | The type of validators for the given connection type. -type ValidatorType (validator :: Type) (datum :: Type) (redeemer :: Type) = - DatumType validator datum - => RedeemerType validator redeemer - => datum - -> redeemer - -> Transaction - -> Boolean - -type WrappedValidatorType = - PlutusData -> PlutusData -> PlutusData -> Effect Unit - --- Would require `ToData/FromData` for `Transaction`: --- wrapValidator --- :: forall (d :: Type) (r :: Type) --- . FromData d --- => FromData r --- => (d -> r -> Transaction -> Boolean) --- -> WrappedValidatorType --- wrapValidator f d r p = --- map (const unit) $ fromJustEff "Failed wrapValidator" $ --- f <$> fromData d <*> fromData r <*> fromData p - --- Plutus rev: cc72a56eafb02333c96f662581b57504f8f8992f via Plutus-apps (localhost): abe4785a4fc4a10ba0c4e6417f0ab9f1b4169b26 --- | A typed validator script with its `ValidatorScript` and `Address`. -newtype TypedValidator (a :: Type) = TypedValidator - { validator :: Validator - , validatorHash :: ValidatorHash - , forwardingMPS :: MintingPolicy - , forwardingMPSHash :: MintingPolicyHash -- Can maybe remove as unused in lookups. - -- The hash of the minting policy that checks whether the validator - -- is run in this transaction - } - -derive instance Generic (TypedValidator a) _ -derive instance Newtype (TypedValidator a) _ -derive newtype instance Eq (TypedValidator a) - -instance Show (TypedValidator a) where - show = genericShow - -instance DecodeAeson (TypedValidator a) where - decodeAeson = caseAesonObject - (Left $ TypeMismatch "Expected Object") - ( \o -> do - validator <- o .: "validator" - validatorHash <- o .: "validatorHash" - forwardingMPS <- o .: "forwardingMPS" - forwardingMPSHash <- o .: "forwardingMPSHash" - pure $ TypedValidator - { validator, validatorHash, forwardingMPS, forwardingMPSHash } - ) - --- Not sure how necessary this is: --- | Generalise the typed validator to one that works with the `PlutusData` type. -generalise :: forall (a :: Type). TypedValidator a -> TypedValidator Any -generalise - ( TypedValidator - { validator, validatorHash: vh, forwardingMPS, forwardingMPSHash } - ) = - -- we can do this safely because the on-chain validators are untyped, so they always - -- take 'PlutusData' arguments. The validator script stays the same, so the conversion - -- from 'PlutusData' to 'a' still takes place, even if it's not reflected in the type - -- signature anymore. - TypedValidator - { validator, validatorHash: vh, forwardingMPS, forwardingMPSHash } - --- | The hash of the validator. -typedValidatorHash :: forall (a :: Type). TypedValidator a -> ValidatorHash -typedValidatorHash = _.validatorHash <<< unwrap - --- | The validator script itself. -typedValidatorScript :: forall (a :: Type). TypedValidator a -> Validator -typedValidatorScript = _.validator <<< unwrap - --- | The minting policy that forwards all checks to the instance's validator. -forwardingMintingPolicy - :: forall (a :: Type). TypedValidator a -> MintingPolicy -forwardingMintingPolicy = _.forwardingMPS <<< unwrap - --- We have a few functions, I'm not sure if we even need these for off chain --- code: --- -- Broken, see below (we need some notion of `applyCode`) https://github.com/Plutonomicon/cardano-transaction-lib/issues/24 --- -- | Make a `TypedValidator` (with no type constraints) from an untyped --- -- |`Validator` script. --- unsafeMkTypedValidator :: Scripts.Validator -> Maybe (TypedValidator Any) --- unsafeMkTypedValidator validator = do --- validatorHash <- validatorHash validator --- let forwardingMPS = mkForwardingMintingPolicy validatorHash --- forwardingMPSHash <- mintingPolicyHash fowardingMPS --- TypedValidator --- { validator --- , validatorHash --- , forwardingMPS --- , forwardingMPSHash --- } - --- -- mkTypedValidator, mkForwardingMintingPolicy and --- -- mkTypedValidatorParam requires some notion --- -- of compiled code and `applyCode` also --- mkForwardingMintingPolicy :: ValidatorHash -> MintingPolicy --- mkForwardingMintingPolicy = undefined diff --git a/src/Internal/Types/UnbalancedTransaction.purs b/src/Internal/Types/UnbalancedTransaction.purs deleted file mode 100644 index a5bd81a2a..000000000 --- a/src/Internal/Types/UnbalancedTransaction.purs +++ /dev/null @@ -1,103 +0,0 @@ -module Ctl.Internal.Types.UnbalancedTransaction - ( PaymentPubKey(PaymentPubKey) - , ScriptDatum(ScriptDatum, ScriptDatumHash) - , UnbalancedTx(UnbalancedTx) - , _transaction - , _utxoIndex - , emptyUnbalancedTx - , payPubKeyRequiredSigner - , payPubKeyVkey - ) where - -import Prelude - -import Aeson (class EncodeAeson, encodeAeson) -import Ctl.Internal.Cardano.Types.Transaction - ( PublicKey - , RequiredSigner(RequiredSigner) - , Transaction - , TransactionOutput - , Vkey(Vkey) - , convertPubKey - ) -import Ctl.Internal.Helpers (encodeMap, encodeTagged') -import Ctl.Internal.Serialization (publicKeyHash) -import Ctl.Internal.Types.Datum (DataHash, Datum) -import Ctl.Internal.Types.Transaction (TransactionInput) -import Data.Generic.Rep (class Generic) -import Data.Lens (lens') -import Data.Lens.Types (Lens') -import Data.Map (Map, empty) -import Data.Newtype (class Newtype) -import Data.Show.Generic (genericShow) -import Data.Tuple (Tuple(Tuple)) - --- Plutus has a type called `PubKey` which we replace with `PublicKey` -newtype PaymentPubKey = PaymentPubKey PublicKey - -derive instance Generic PaymentPubKey _ -derive instance Newtype PaymentPubKey _ -derive newtype instance Eq PaymentPubKey -derive newtype instance Ord PaymentPubKey - -instance Show PaymentPubKey where - show = genericShow - -data ScriptDatum - = ScriptDatum Datum - | ScriptDatumHash DataHash - -derive instance Eq ScriptDatum -derive instance Generic ScriptDatum _ - -instance EncodeAeson ScriptDatum where - encodeAeson = case _ of - ScriptDatum r -> encodeTagged' "ScriptDatum" r - ScriptDatumHash r -> encodeTagged' "ScriptDatumHash" r - -instance Show ScriptDatum where - show = genericShow - -payPubKeyVkey :: PaymentPubKey -> Vkey -payPubKeyVkey (PaymentPubKey pk) = Vkey pk - -payPubKeyRequiredSigner :: PaymentPubKey -> RequiredSigner -payPubKeyRequiredSigner (PaymentPubKey pk) = - RequiredSigner <<< publicKeyHash $ convertPubKey pk - --- | An unbalanced transaction. It needs to be balanced and signed before it --- | can be submitted to the ledger. --- | Resembles `UnbalancedTx` from `plutus-apps`. -newtype UnbalancedTx = UnbalancedTx - { transaction :: Transaction - , utxoIndex :: Map TransactionInput TransactionOutput - } - -derive instance Newtype UnbalancedTx _ -derive instance Generic UnbalancedTx _ -derive newtype instance Eq UnbalancedTx - -instance Show UnbalancedTx where - show = genericShow - -instance EncodeAeson UnbalancedTx where - encodeAeson (UnbalancedTx r) = encodeAeson $ r - { utxoIndex = encodeMap r.utxoIndex - } - -_transaction :: Lens' UnbalancedTx Transaction -_transaction = lens' - \(UnbalancedTx rec@{ transaction }) -> - Tuple - transaction - \tx -> UnbalancedTx rec { transaction = tx } - -_utxoIndex :: Lens' UnbalancedTx (Map TransactionInput TransactionOutput) -_utxoIndex = lens' - \(UnbalancedTx rec@{ utxoIndex }) -> - Tuple - utxoIndex - \utxoIx -> UnbalancedTx rec { utxoIndex = utxoIx } - -emptyUnbalancedTx :: UnbalancedTx -emptyUnbalancedTx = UnbalancedTx { transaction: mempty, utxoIndex: empty } diff --git a/src/Internal/Types/UsedTxOuts.purs b/src/Internal/Types/UsedTxOuts.purs index 8c17cad06..abb8da6aa 100644 --- a/src/Internal/Types/UsedTxOuts.purs +++ b/src/Internal/Types/UsedTxOuts.purs @@ -59,7 +59,7 @@ instance Semigroup TxOutRefUnlockKeys where instance Monoid TxOutRefUnlockKeys where mempty = wrap Map.empty --- | Stores TxOutRefs in a compact map. +-- | Tracks UTxOs that have already been spent to avoid double-spending attempts. newtype UsedTxOuts = UsedTxOuts (Ref TxOutRefCache) derive instance Newtype UsedTxOuts _ diff --git a/src/Internal/Wallet.js b/src/Internal/Wallet.js index 851fceb14..99197ef23 100644 --- a/src/Internal/Wallet.js +++ b/src/Internal/Wallet.js @@ -1,86 +1,25 @@ -/* global BROWSER_RUNTIME */ - -const getIsWalletAvailableTagName = wallet => { - const strs = { - nami: "NamiWallet", - gerowallet: "GeroWallet", - flint: "FlintWallet", - LodeWallet: "LodeWallet", - eternl: "EternlWallet", - }; - - return strs[wallet] || "is?WalletAvailable"; -}; +function getWindow() { + return typeof window != "undefined" ? window : global.window; +} const nodeEnvError = new Error( "`window` is not an object. Are you trying to run a Contract with" + - " connected light wallet in NodeJS environment?" + " a connected light wallet in NodeJS environment?" ); const checkNotNode = () => { - if (typeof window != "object") { + if (typeof getWindow() != "object") { throw nodeEnvError; } }; -const enableWallet = wallet => () => { - if (isWalletAvailable(wallet)()) { - return window.cardano[wallet].enable().catch(e => { - throw new Error( - "enableWallet failed: " + - (typeof e.info == "string" ? e.info : e.toString()) - ); - }); - } else { - throw new Error( - "Wallet is not available. Use `isWalletAvailable " + - getIsWalletAvailableTagName(wallet) + - "` before connecting." - ); - } -}; - -exports._enableWallet = enableWallet; - const isWalletAvailable = walletName => () => { checkNotNode(); return ( - typeof window.cardano != "undefined" && - typeof window.cardano[walletName] != "undefined" && - typeof window.cardano[walletName].enable == "function" + typeof getWindow().cardano != "undefined" && + typeof getWindow().cardano[walletName] != "undefined" && + typeof getWindow().cardano[walletName].enable == "function" ); }; -exports._isWalletAvailable = isWalletAvailable; - -exports._isEnabled = walletName => () => { - if (isWalletAvailable(walletName)()) { - return window.cardano[walletName].isEnabled(); - } else { - throw new Error("Wallet `" + walletName + "` is not available"); - } -}; - -exports._apiVersion = walletName => () => { - if (isWalletAvailable(walletName)()) { - return window.cardano[walletName].apiVersion; - } else { - throw new Error("Wallet `" + walletName + "` is not available"); - } -}; - -exports._name = walletName => () => { - if (isWalletAvailable(walletName)()) { - return window.cardano[walletName].name; - } else { - throw new Error("Wallet `" + walletName + "` is not available"); - } -}; - -exports._icon = walletName => () => { - if (isWalletAvailable(walletName)()) { - return window.cardano[walletName].icon; - } else { - throw new Error("Wallet `" + walletName + "` is not available"); - } -}; +export { isWalletAvailable as _isWalletAvailable }; diff --git a/src/Internal/Wallet.purs b/src/Internal/Wallet.purs index 52d00b0ae..30b7721ae 100644 --- a/src/Internal/Wallet.purs +++ b/src/Internal/Wallet.purs @@ -1,7 +1,5 @@ module Ctl.Internal.Wallet - ( module KeyWallet - , module Cip30Wallet - , Wallet(Gero, Nami, Flint, Lode, Eternl, NuFi, KeyWallet) + ( Wallet(KeyWallet, GenericCip30) , WalletExtension ( NamiWallet , LodeWallet @@ -9,76 +7,40 @@ module Ctl.Internal.Wallet , FlintWallet , EternlWallet , NuFiWallet + , LaceWallet + , GenericCip30Wallet ) - , isEternlAvailable - , isGeroAvailable - , isNamiAvailable - , isFlintAvailable - , isLodeAvailable - , isWalletAvailable - , mkEternlWalletAff - , mkNamiWalletAff - , mkGeroWalletAff - , mkFlintWalletAff - , mkLodeWalletAff , mkKeyWallet , mkWalletAff - , cip30Wallet - , dummySign - , isEnabled - , walletToWalletExtension - , apiVersion - , name - , icon , actionBasedOnWallet - , callCip30Wallet + , isWalletAvailable ) where import Prelude +import Cardano.Wallet.Cip30 as Cip30 import Control.Monad.Error.Class (catchError, throwError) -import Control.Promise (Promise, toAffE) -import Ctl.Internal.Cardano.Types.Transaction - ( Transaction(Transaction) - , TransactionWitnessSet(TransactionWitnessSet) - , Vkey(Vkey) - , Vkeywitness(Vkeywitness) - , mkEd25519Signature - , mkPublicKey - ) -import Ctl.Internal.Helpers ((<<>>)) import Ctl.Internal.Types.Natural (fromInt', minus) -import Ctl.Internal.Wallet.Cip30 (Cip30Connection, Cip30Wallet) as Cip30Wallet -import Ctl.Internal.Wallet.Cip30 - ( Cip30Connection - , Cip30Wallet - , mkCip30WalletAff - ) +import Ctl.Internal.Wallet.Cip30 (Cip30Wallet, mkCip30WalletAff) import Ctl.Internal.Wallet.Key ( KeyWallet , PrivatePaymentKey , PrivateStakeKey , privateKeysToKeyWallet ) -import Ctl.Internal.Wallet.Key (KeyWallet, privateKeysToKeyWallet) as KeyWallet import Data.Int (toNumber) -import Data.Maybe (Maybe(Just, Nothing), fromJust) -import Data.Newtype (over, wrap) -import Data.Tuple.Nested ((/\)) +import Data.Maybe (Maybe) +import Data.Newtype (wrap) import Effect (Effect) import Effect.Aff (Aff, delay, error) import Effect.Aff.Class (class MonadAff, liftAff) import Effect.Class (liftEffect) -import Partial.Unsafe (unsafePartial) -import Prim.TypeError (class Warn, Text) +-- NOTE: this data type is defined like this on purpose, don't change it +-- to `(Cip30Wallet /\ WalletExtension)`. The motivation is to make it simpler +-- to special-case each wallet in the future, if needed. data Wallet - = Nami Cip30Wallet - | Gero Cip30Wallet - | Flint Cip30Wallet - | Eternl Cip30Wallet - | Lode Cip30Wallet - | NuFi Cip30Wallet + = GenericCip30 Cip30Wallet | KeyWallet KeyWallet data WalletExtension @@ -87,125 +49,37 @@ data WalletExtension | FlintWallet | EternlWallet | LodeWallet + | LaceWallet | NuFiWallet + | GenericCip30Wallet String mkKeyWallet :: PrivatePaymentKey -> Maybe PrivateStakeKey -> Wallet mkKeyWallet payKey mbStakeKey = KeyWallet $ privateKeysToKeyWallet payKey mbStakeKey -foreign import _enableWallet :: String -> Effect (Promise Cip30Connection) foreign import _isWalletAvailable :: String -> Effect Boolean -foreign import _isEnabled :: String -> Effect (Promise Boolean) -foreign import _apiVersion :: String -> Effect String -foreign import _name :: String -> Effect String -foreign import _icon :: String -> Effect String mkWalletAff :: WalletExtension -> Aff Wallet +mkWalletAff LodeWallet = _mkLodeWalletAff +mkWalletAff (GenericCip30Wallet "LodeWallet") = _mkLodeWalletAff mkWalletAff walletExtension = - case walletExtension of - NamiWallet -> Nami <$> mkCip30WalletAff "Nami" (_enableWallet walletName) - GeroWallet -> Gero <$> mkCip30WalletAff "Gero" (_enableWallet walletName) - EternlWallet -> Eternl <$> mkCip30WalletAff "Eternl" - (_enableWallet walletName) - FlintWallet -> Flint <$> mkCip30WalletAff "Flint" - (_enableWallet walletName) - LodeWallet -> _mkLodeWalletAff - NuFiWallet -> NuFi <$> mkCip30WalletAff "NuFi" (_enableWallet walletName) - where - walletName = walletExtensionToName walletExtension - -isNamiAvailable - :: Warn - ( Text - "`isNamiAvailable` is deprecated, please use `isWalletAvailable NamiWallet`" - ) - => Effect Boolean -isNamiAvailable = isWalletAvailable NamiWallet - -mkNamiWalletAff - :: Warn - ( Text - "`mkNamiWalletAff` is deprecated, please use `mkWalletAff NamiWallet`" - ) - => Aff Wallet -mkNamiWalletAff = mkWalletAff NamiWallet - -isGeroAvailable - :: Warn - ( Text - "`isGeroAvailable` is deprecated, please use `isWalletAvailable GeroWallet`" - ) - => Effect Boolean -isGeroAvailable = isWalletAvailable GeroWallet - -mkGeroWalletAff - :: Warn - ( Text - "`mkGeroWalletAff` is deprecated, please use `mkWalletAff GeroWallet`" - ) - => Aff Wallet -mkGeroWalletAff = mkWalletAff GeroWallet - -isFlintAvailable - :: Warn - ( Text - "`isFlintAvailable` is deprecated, please use `isWalletAvailable FlintWallet`" - ) - => Effect Boolean -isFlintAvailable = isWalletAvailable FlintWallet - -mkFlintWalletAff - :: Warn - ( Text - "`mkFlintWalletAff` is deprecated, please use `mkWalletAff FlintWallet`" - ) - => Aff Wallet -mkFlintWalletAff = mkWalletAff FlintWallet - -isLodeAvailable - :: Warn - ( Text - "`isLodeAvailable` is deprecated, please use `isWalletAvailable LodeWallet`" - ) - => Effect Boolean -isLodeAvailable = isWalletAvailable LodeWallet - -mkLodeWalletAff - :: Warn - ( Text - "`mkLodeWalletAff` is deprecated, please use `mkWalletAff LodeWallet`" - ) - => Aff Wallet -mkLodeWalletAff = mkWalletAff LodeWallet - -isEternlAvailable - :: Warn - ( Text - "`isEternlAvailable` is deprecated, please use `isWalletAvailable EternlWallet`" - ) - => Effect Boolean -isEternlAvailable = isWalletAvailable EternlWallet - -mkEternlWalletAff - :: Warn - ( Text - "`mkEternlWalletAff` is deprecated, please use `mkWalletAff EternlWallet`" - ) - => Aff Wallet -mkEternlWalletAff = mkWalletAff EternlWallet + GenericCip30 <$> + ( mkCip30WalletAff =<< Cip30.enable (walletExtensionToName walletExtension) + [] + ) -- Lode does not inject on page load, so this function retries up to set --- number of times, for Lode to be available. +-- number of times, for Lode to become available. _mkLodeWalletAff :: Aff Wallet _mkLodeWalletAff = do retryNWithIntervalUntil (fromInt' 10) (toNumber 100) $ liftEffect (isWalletAvailable LodeWallet) - catchError - (Lode <$> mkCip30WalletAff "Lode" (_enableWallet "LodeWallet")) - ( \e -> throwError <<< error $ (show e) <> - " Note: LodeWallet is injected asynchronously and may be unreliable." - ) + (GenericCip30 <$> (mkCip30WalletAff =<< Cip30.enable "LodeWallet" [])) + `catchError` + ( \e -> throwError <<< error $ show e <> + " Note: LodeWallet is injected asynchronously and may be unreliable." + ) where retryNWithIntervalUntil n ms mBool = if n == zero then pure unit @@ -216,16 +90,6 @@ _mkLodeWalletAff = do isWalletAvailable :: WalletExtension -> Effect Boolean isWalletAvailable = _isWalletAvailable <<< walletExtensionToName -cip30Wallet :: Wallet -> Maybe Cip30Wallet -cip30Wallet = case _ of - Nami c30 -> Just c30 - Gero c30 -> Just c30 - Flint c30 -> Just c30 - Eternl c30 -> Just c30 - Lode c30 -> Just c30 - NuFi c30 -> Just c30 - KeyWallet _ -> Nothing - walletExtensionToName :: WalletExtension -> String walletExtensionToName = case _ of NamiWallet -> "nami" @@ -234,77 +98,17 @@ walletExtensionToName = case _ of EternlWallet -> "eternl" LodeWallet -> "LodeWallet" NuFiWallet -> "nufi" - -walletToWalletExtension :: Wallet -> Maybe WalletExtension -walletToWalletExtension = case _ of - Nami _ -> Just NamiWallet - Gero _ -> Just GeroWallet - Flint _ -> Just FlintWallet - Eternl _ -> Just EternlWallet - Lode _ -> Just LodeWallet - NuFi _ -> Just NuFiWallet - KeyWallet _ -> Nothing - -isEnabled :: WalletExtension -> Aff Boolean -isEnabled = - toAffE <<< _isEnabled <<< walletExtensionToName - -apiVersion :: WalletExtension -> Aff String -apiVersion = liftEffect <<< _apiVersion <<< walletExtensionToName - -name :: WalletExtension -> Aff String -name = liftEffect <<< _name <<< walletExtensionToName - -icon :: WalletExtension -> Aff String -icon = liftEffect <<< _icon <<< walletExtensionToName - --- Attach a dummy vkey witness to a transaction. Helpful for when we need to --- know the number of witnesses (e.g. fee calculation) but the wallet hasn't --- signed (or cannot sign) yet -dummySign :: Transaction -> Transaction -dummySign tx@(Transaction { witnessSet: tws@(TransactionWitnessSet ws) }) = - over Transaction _ - { witnessSet = over TransactionWitnessSet - _ - { vkeys = ws.vkeys <<>> Just [ vk ] - } - tws - } - $ tx - where - vk :: Vkeywitness - vk = Vkeywitness - ( Vkey - -- This should not fail assuming the hardcoded bech32 key is valid. - ( unsafePartial $ fromJust $ mkPublicKey - "ed25519_pk1eamrnx3pph58yr5l4z2wghjpu2dt2f0rp0zq9qquqa39p52ct0xsudjp4e" - ) - /\ - ( unsafePartial $ fromJust $ mkEd25519Signature - "ed25519_sig1ynufn5umzl746ekpjtzt2rf58ep0wg6mxpgyezh8vx0e8jpgm3kuu3tgm453wlz4rq5yjtth0fnj0ltxctaue0dgc2hwmysr9jvhjzswt86uk" - ) - ) + LaceWallet -> "lace" + GenericCip30Wallet name' -> name' actionBasedOnWallet :: forall (m :: Type -> Type) (a :: Type) . MonadAff m - => (Cip30Wallet -> Cip30Connection -> Aff a) + => (Cip30Wallet -> Aff a) -> (KeyWallet -> m a) -> Wallet -> m a actionBasedOnWallet walletAction keyWalletAction = case _ of - Eternl wallet -> liftAff $ callCip30Wallet wallet walletAction - Nami wallet -> liftAff $ callCip30Wallet wallet walletAction - Gero wallet -> liftAff $ callCip30Wallet wallet walletAction - Flint wallet -> liftAff $ callCip30Wallet wallet walletAction - Lode wallet -> liftAff $ callCip30Wallet wallet walletAction - NuFi wallet -> liftAff $ callCip30Wallet wallet walletAction + GenericCip30 wallet -> liftAff $ walletAction wallet KeyWallet kw -> keyWalletAction kw - -callCip30Wallet - :: forall (a :: Type) - . Cip30Wallet - -> (Cip30Wallet -> (Cip30Connection -> Aff a)) - -> Aff a -callCip30Wallet wallet act = act wallet wallet.connection diff --git a/src/Internal/Wallet/Bip32.js b/src/Internal/Wallet/Bip32.js new file mode 100644 index 000000000..9518c9697 --- /dev/null +++ b/src/Internal/Wallet/Bip32.js @@ -0,0 +1,38 @@ +/* global BROWSER_RUNTIME */ + +let lib; +if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); +} else { + lib = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); +} + +import bip39 from "bip39"; + +const HARDENED = 0x80000000; + +export function _bip32PrivateKeyFromMnemonic(left) { + return right => phrase => { + try { + return right( + lib.Bip32PrivateKey.from_bip39_entropy( + Uint8Array.from( + Buffer.from(bip39.mnemonicToEntropy(phrase.toLowerCase()), "hex") + ), + new Uint8Array() // passphrase (not currently implemented) + ) + ); + } catch (e) { + return left(e.toString()); + } + }; +} + +export function bip32ToPrivateKey(privateKey) { + return privateKey.to_raw_key(); +} + +export function derivePrivateKey(path) { + return hardened => privateKey => + privateKey.derive(path | (hardened ? HARDENED : 0)); +} diff --git a/src/Internal/Wallet/Bip32.purs b/src/Internal/Wallet/Bip32.purs new file mode 100644 index 000000000..642664892 --- /dev/null +++ b/src/Internal/Wallet/Bip32.purs @@ -0,0 +1,75 @@ +module Ctl.Internal.Wallet.Bip32 + ( Cip1852Account + , bip32ToPrivateKey + , bip32PrivateKeyFromMnemonic + , cip1852AccountFromBip32PrivateKey + , cip1852AccountFromMnemonic + , derivePaymentKey + , deriveChangeKey + , deriveStakeKey + ) where + +import Contract.Prelude + +import Ctl.Internal.Serialization.Types (Bip32PrivateKey, PrivateKey) +import Data.UInt (UInt) +import Data.UInt as UInt + +newtype Cip1852Account = Cip1852Account Bip32PrivateKey + +foreign import _bip32PrivateKeyFromMnemonic + :: (String -> Either String Bip32PrivateKey) + -> (Bip32PrivateKey -> Either String Bip32PrivateKey) + -> String + -> Either String Bip32PrivateKey + +foreign import derivePrivateKey + :: UInt + -- ^ path index + -> Boolean + -- ^ hardened + -> Bip32PrivateKey + -> Bip32PrivateKey + +-- | Convert a BIP32 private key to a raw private key +foreign import bip32ToPrivateKey :: Bip32PrivateKey -> PrivateKey + +-- | Derive a BIP32 private key given a mnemonic phrase +bip32PrivateKeyFromMnemonic :: String -> Either String Bip32PrivateKey +bip32PrivateKeyFromMnemonic = _bip32PrivateKeyFromMnemonic Left Right + +-- | Derive a CIP1852 account from a BIP32 private key given an account index +cip1852AccountFromBip32PrivateKey :: UInt -> Bip32PrivateKey -> Cip1852Account +cip1852AccountFromBip32PrivateKey account key = + Cip1852Account + $ key + # derivePrivateKey (UInt.fromInt 1852) true + # derivePrivateKey (UInt.fromInt 1815) true + # derivePrivateKey account true + +-- | Derive a CIP1852 account given a mnemonic phrase and account index +cip1852AccountFromMnemonic :: String -> UInt -> Either String Cip1852Account +cip1852AccountFromMnemonic phrase account = + cip1852AccountFromBip32PrivateKey account + <$> bip32PrivateKeyFromMnemonic phrase + +-- | Derive a payment key for the given account +derivePaymentKey :: Cip1852Account -> UInt -> Bip32PrivateKey +derivePaymentKey (Cip1852Account key) index = + key + # derivePrivateKey zero false + # derivePrivateKey index false + +-- | Derive a change key for the given account +deriveChangeKey :: Cip1852Account -> UInt -> Bip32PrivateKey +deriveChangeKey (Cip1852Account key) index = + key + # derivePrivateKey one false + # derivePrivateKey index false + +-- | Derive the stake key for the given account +deriveStakeKey :: Cip1852Account -> Bip32PrivateKey +deriveStakeKey (Cip1852Account key) = + key + # derivePrivateKey (UInt.fromInt 2) false + # derivePrivateKey (UInt.fromInt 0) false diff --git a/src/Internal/Wallet/Cip30.js b/src/Internal/Wallet/Cip30.js deleted file mode 100644 index 7414ae307..000000000 --- a/src/Internal/Wallet/Cip30.js +++ /dev/null @@ -1,33 +0,0 @@ -/* global BROWSER_RUNTIME */ - -exports._getNetworkId = conn => () => conn.getNetworkId(); - -exports._getUtxos = maybe => conn => () => - conn.getUtxos().then(res => (res === null ? maybe.nothing : maybe.just(res))); - -exports._getCollateral = maybe => conn => () => - conn.experimental - .getCollateral() - .then(utxos => - utxos !== null && utxos.length ? maybe.just(utxos) : maybe.nothing - ); - -exports._getBalance = conn => () => conn.getBalance(); - -exports._getAddresses = conn => conn.getUsedAddresses; - -exports._getUnusedAddresses = conn => () => conn.getUnusedAddresses(); - -exports._getChangeAddress = conn => () => conn.getChangeAddress(); - -exports._getRewardAddresses = conn => () => conn.getRewardAddresses(); - -exports._signTx = txHex => conn => () => - conn.signTx(txHex, true).catch(e => { - throw JSON.stringify(e); - }); - -exports._signData = address => payload => conn => () => - conn.signData(address, payload).catch(e => { - throw JSON.stringify(e); - }); diff --git a/src/Internal/Wallet/Cip30.purs b/src/Internal/Wallet/Cip30.purs index a36bff1ee..977bc565d 100644 --- a/src/Internal/Wallet/Cip30.purs +++ b/src/Internal/Wallet/Cip30.purs @@ -1,16 +1,16 @@ module Ctl.Internal.Wallet.Cip30 - ( Cip30Connection - , Cip30Wallet + ( Cip30Wallet , DataSignature , mkCip30WalletAff ) where import Prelude +import Cardano.Wallet.Cip30 (Api) +import Cardano.Wallet.Cip30.TypeSafe (APIError) +import Cardano.Wallet.Cip30.TypeSafe as Cip30 import Control.Alt ((<|>)) import Control.Monad.Error.Class (catchError, liftMaybe, throwError) -import Control.Promise (Promise, toAffE) -import Control.Promise as Promise import Ctl.Internal.Cardano.Types.Transaction ( Transaction(Transaction) , TransactionWitnessSet @@ -18,12 +18,12 @@ import Ctl.Internal.Cardano.Types.Transaction import Ctl.Internal.Cardano.Types.TransactionUnspentOutput ( TransactionUnspentOutput ) -import Ctl.Internal.Cardano.Types.Value (Value) +import Ctl.Internal.Cardano.Types.Value (Coin(Coin), Value) import Ctl.Internal.Deserialization.FromBytes (fromBytes, fromBytesEffect) import Ctl.Internal.Deserialization.UnspentOutput (convertValue) import Ctl.Internal.Deserialization.UnspentOutput as Deserialization.UnspentOuput import Ctl.Internal.Deserialization.WitnessSet as Deserialization.WitnessSet -import Ctl.Internal.FfiHelpers (MaybeFfiHelper, maybeFfiHelper) +import Ctl.Internal.Helpers (liftM) import Ctl.Internal.Serialization (convertTransaction, toBytes) as Serialization import Ctl.Internal.Serialization.Address ( Address @@ -36,6 +36,8 @@ import Ctl.Internal.Serialization.Address , rewardAddressBytes , rewardAddressFromAddress ) +import Ctl.Internal.Serialization.ToBytes (toBytes) +import Ctl.Internal.Types.BigNum as BigNum import Ctl.Internal.Types.ByteArray (byteArrayToHex) import Ctl.Internal.Types.CborBytes ( CborBytes @@ -44,140 +46,177 @@ import Ctl.Internal.Types.CborBytes , rawBytesAsCborBytes ) import Ctl.Internal.Types.RawBytes (RawBytes, hexToRawBytes, rawBytesToHex) -import Data.Maybe (Maybe(Just, Nothing), isNothing, maybe) +import Data.Maybe (Maybe(Nothing), maybe) import Data.Newtype (unwrap) import Data.Traversable (for, traverse) +import Data.Variant (Variant, match) import Effect (Effect) import Effect.Aff (Aff) import Effect.Class (liftEffect) import Effect.Exception (error, throw) +import JS.BigInt (fromInt) as BigInt type DataSignature = { key :: CborBytes , signature :: CborBytes } --- Please update Cip30Mock when you add or remove methods in this handle. +-- Please update Cip30Mock when you add or remove methods here. +-- | A simplified internal view of CIP-30 API that wraps `Api` from +-- | `purescript-cip30`. +-- | +-- | - We hardcode the collateral amount to 5 ADA +-- | - We always request all UTxOs in `getUtxos` +-- | - We don't support querying of supported CIP-30 extensions +-- | - We don't support getting wallet icon, name and apiVersion +-- | - We don't support `isEnabled` call +-- | +-- | Use `purescript-cip30` for these: `connection` field contains the API handle. type Cip30Wallet = - { -- A reference to a connection with the wallet, i.e. `window.cardano.nami` - connection :: Cip30Connection + { -- A reference to a connection with the wallet, i.e. the result of calling + -- `window.cardano[walletName].enable()`, + connection :: Api -- Returns the network id of the currently connected account. 0 is for any -- of the test networks, and 1 is mainnet. - , getNetworkId :: Cip30Connection -> Aff Int + , getNetworkId :: Aff Int -- Returns a list of all UTXOs controlled by the wallet. - , getUtxos :: Cip30Connection -> Aff (Maybe (Array TransactionUnspentOutput)) + , getUtxos :: Aff (Maybe (Array TransactionUnspentOutput)) -- Get the collateral UTxO associated with the Nami wallet , getCollateral :: - Cip30Connection -> Aff (Maybe (Array TransactionUnspentOutput)) + Aff (Maybe (Array TransactionUnspentOutput)) -- Get combination of all available UTxOs - , getBalance :: Cip30Connection -> Aff (Maybe Value) + , getBalance :: Aff Value -- Get the address associated with the wallet (Nami does not support -- multiple addresses) - , getWalletAddresses :: Cip30Connection -> Aff (Maybe (Array Address)) + , getUsedAddresses :: Aff (Array Address) -- Sign a transaction with the given wallet -- Returns a list of unused addresses controlled by the wallet. - , getUnusedAddresses :: Cip30Connection -> Aff (Maybe (Array Address)) + , getUnusedAddresses :: Aff (Array Address) -- Returns an address owned by the wallet that should be used as a change -- address to return leftover assets during transaction creation back to -- the connected wallet. - , getChangeAddress :: Cip30Connection -> Aff (Maybe Address) + , getChangeAddress :: Aff Address -- Returns the reward addresses owned by the wallet. This can return multiple -- addresses e.g. CIP-0018 - , getRewardAddresses :: Cip30Connection -> Aff (Maybe (Array Address)) - , signTx :: Cip30Connection -> Transaction -> Aff (Maybe Transaction) - , signData :: - Cip30Connection -> Address -> RawBytes -> Aff (Maybe DataSignature) + , getRewardAddresses :: Aff (Array Address) + , signTx :: Transaction -> Aff Transaction + , signData :: Address -> RawBytes -> Aff DataSignature } mkCip30WalletAff - :: String - -- ^ Name of the wallet for error messages - -> Effect (Promise Cip30Connection) + :: Api -- ^ A function to get wallet connection -> Aff Cip30Wallet -mkCip30WalletAff walletName enableWallet = do - wallet <- toAffE enableWallet - -- Ensure the Nami wallet has collateral set up - whenM (isNothing <$> getCollateral wallet) do - liftEffect $ throw $ walletName <> " wallet missing collateral" +mkCip30WalletAff connection = do pure - { connection: wallet - , getNetworkId - , getUtxos - , getCollateral - , getBalance - , getWalletAddresses - , getUnusedAddresses - , getChangeAddress - , getRewardAddresses - , signTx - , signData + { connection + , getNetworkId: Cip30.getNetworkId connection >>= handleApiError + , getUtxos: getUtxos connection + , getCollateral: getCollateral connection + , getBalance: getBalance connection + , getUsedAddresses: getUsedAddresses connection + , getUnusedAddresses: getUnusedAddresses connection + , getChangeAddress: getChangeAddress connection + , getRewardAddresses: getRewardAddresses connection + , signTx: signTx connection + , signData: signData connection } ------------------------------------------------------------------------------- -- Helper functions ------------------------------------------------------------------------------- -txToHex :: Transaction -> Aff String +txToHex :: Transaction -> Effect String txToHex = - liftEffect - <<< map (byteArrayToHex <<< unwrap <<< Serialization.toBytes) + map (byteArrayToHex <<< unwrap <<< Serialization.toBytes) <<< Serialization.convertTransaction -getNetworkId :: Cip30Connection -> Aff Int -getNetworkId = toAffE <<< _getNetworkId - -getUnusedAddresses :: Cip30Connection -> Aff (Maybe (Array Address)) -getUnusedAddresses conn = toAffE (_getUnusedAddresses conn) <#> - traverse hexStringToAddress - -getChangeAddress :: Cip30Connection -> Aff (Maybe Address) -getChangeAddress conn = (toAffE $ _getChangeAddress conn) <#> hexStringToAddress +handleApiError + :: forall a. Variant (apiError :: APIError, success :: a) -> Aff a +handleApiError = match + { success: pure :: a -> Aff a, apiError: show >>> throw >>> liftEffect } + +getUnusedAddresses :: Api -> Aff (Array Address) +getUnusedAddresses conn = do + Cip30.getUnusedAddresses conn >>= handleApiError >>= + traverse + ( liftM (error "CIP-30 getUnusedAddresses returned non-address") <<< + hexStringToAddress + ) -getRewardAddresses :: Cip30Connection -> Aff (Maybe (Array Address)) -getRewardAddresses conn = toAffE (_getRewardAddresses conn) <#> - traverse hexStringToAddress +getChangeAddress :: Api -> Aff Address +getChangeAddress conn = Cip30.getChangeAddress conn >>= handleApiError >>= + liftM (error "CIP-30 getChangeAddress returned non-address") <<< + hexStringToAddress + +getRewardAddresses :: Api -> Aff (Array Address) +getRewardAddresses conn = + Cip30.getRewardAddresses conn >>= handleApiError >>= + traverse + ( liftM (error "CIP-30 getRewardAddresses returned non-address") <<< + hexStringToAddress + ) -getWalletAddresses :: Cip30Connection -> Aff (Maybe (Array Address)) -getWalletAddresses conn = Promise.toAffE (_getAddresses conn) <#> - traverse hexStringToAddress +getUsedAddresses :: Api -> Aff (Array Address) +getUsedAddresses conn = do + result <- Cip30.getUsedAddresses conn Nothing + result `flip match` + { success: traverse + ( liftM (error "CIP-30 getUsedAddresses returned non-address") <<< + hexStringToAddress + ) + , paginateError: show >>> throw >>> liftEffect + , apiError: show >>> throw >>> liftEffect + } hexStringToAddress :: String -> Maybe Address hexStringToAddress = fromBytes <<< rawBytesAsCborBytes <=< hexToRawBytes +defaultCollateralAmount :: Coin +defaultCollateralAmount = Coin $ BigInt.fromInt 5_000_000 + -- | Get collateral using CIP-30 `getCollateral` method. -- | Throws on `Promise` rejection by wallet, returns `Nothing` if no collateral -- | is available. -getCollateral :: Cip30Connection -> Aff (Maybe (Array TransactionUnspentOutput)) +getCollateral :: Api -> Aff (Maybe (Array TransactionUnspentOutput)) getCollateral conn = do - mbUtxoStrs <- toAffE $ getCip30Collateral conn - let - (mbUtxoBytes :: Maybe (Array RawBytes)) = - join $ map (traverse hexToRawBytes) mbUtxoStrs - -- de-serialize UTxOs - liftEffect $ for mbUtxoBytes \collateralUtxos -> do - for collateralUtxos \bytes -> do - maybe (throw "Unable to convert UTxO") pure =<< + mbUtxoStrs <- getCip30Collateral conn defaultCollateralAmount + liftEffect $ for mbUtxoStrs \utxoStrs -> do + for utxoStrs \utxoStr -> do + liftM (error $ "CIP-30 getCollateral returned bad UTxO: " <> utxoStr) $ Deserialization.UnspentOuput.convertUnspentOutput - <$> fromBytesEffect (rawBytesAsCborBytes bytes) + =<< fromBytes + =<< hexToCborBytes utxoStr -getUtxos :: Cip30Connection -> Aff (Maybe (Array TransactionUnspentOutput)) +getUtxos :: Api -> Aff (Maybe (Array TransactionUnspentOutput)) getUtxos conn = do - mArrayStr <- toAffE $ _getUtxos maybeFfiHelper conn - liftEffect $ for mArrayStr $ traverse \str -> do - liftMaybe (error "Unable to convert UTxO") $ - hexToCborBytes str >>= fromBytes >>= - Deserialization.UnspentOuput.convertUnspentOutput + result <- Cip30.getUtxos conn Nothing Nothing + result `flip match` + { success: \mbUtxoArray -> do + liftEffect $ for mbUtxoArray $ \utxoArray -> for utxoArray \str -> do + liftMaybe (error $ "CIP-30 getUtxos returned bad UTxO: " <> str) $ + hexToCborBytes str >>= fromBytes >>= + Deserialization.UnspentOuput.convertUnspentOutput + , paginateError: show >>> throw >>> liftEffect + , apiError: show >>> throw >>> liftEffect + } -signTx :: Cip30Connection -> Transaction -> Aff (Maybe Transaction) +signTx :: Api -> Transaction -> Aff Transaction signTx conn tx = do - txHex <- txToHex tx - fromHexString (_signTx txHex) conn >>= case _ of - Nothing -> pure Nothing - Just bytes -> map (combineWitnessSet tx) <$> liftEffect - ( Deserialization.WitnessSet.convertWitnessSet - <$> fromBytesEffect (rawBytesAsCborBytes bytes) - ) + txHex <- liftEffect $ txToHex tx + result <- Cip30.signTx conn txHex true + liftEffect $ result `flip match` + { success: + \hexString -> do + bytes <- liftM (mkInvalidHexError hexString) $ hexToRawBytes + hexString + combineWitnessSet tx <$> + ( Deserialization.WitnessSet.convertWitnessSet + <$> fromBytesEffect (rawBytesAsCborBytes bytes) + ) + , apiError: show >>> throw + , txSignError: show >>> throw + } where -- We have to combine the newly returned witness set with the existing one -- Otherwise, any datums, etc... won't be retained @@ -185,22 +224,30 @@ signTx conn tx = do combineWitnessSet (Transaction tx'@{ witnessSet: oldWits }) newWits = Transaction $ tx' { witnessSet = oldWits <> newWits } + mkInvalidHexError hexString = error $ "Unable to decode WitnessSet bytes: " <> + hexString + -- | Supports : `BaseAddress`, `EnterpriseAddress`, -- | `PointerAddress` and `RewardAddress` -signData :: Cip30Connection -> Address -> RawBytes -> Aff (Maybe DataSignature) +signData :: Api -> Address -> RawBytes -> Aff DataSignature signData conn address dat = do byteAddress <- liftMaybe (error "Can't convert Address to base, enterprise, pointer or reward") (fromBase <|> fromEnterprise <|> fromPointer <|> fromReward) - signedData <- toAffE $ _signData (cborBytesToHex byteAddress) + result <- Cip30.signData conn (cborBytesToHex byteAddress) (rawBytesToHex dat) - conn - pure $ do - key <- hexToCborBytes signedData.key - signature <- hexToCborBytes signedData.signature - pure { key: key, signature: signature } + liftEffect $ result `flip match` + { dataSignError: show >>> throw + , apiError: show >>> throw + , success: \signedData -> do + key <- liftM byteError $ hexToCborBytes signedData.key + signature <- liftM byteError $ hexToCborBytes signedData.signature + pure { key: key, signature: signature } + } where + byteError = error "signData: hexToCborBytes failure" + fromBase :: Maybe CborBytes fromBase = baseAddressBytes <$> baseAddressFromAddress address @@ -214,72 +261,23 @@ signData conn address dat = do fromReward :: Maybe CborBytes fromReward = rewardAddressBytes <$> rewardAddressFromAddress address -getBalance :: Cip30Connection -> Aff (Maybe Value) -getBalance wallet = do - fromHexString _getBalance wallet <#> \mbBytes -> do - bytes <- mbBytes - fromBytes (rawBytesAsCborBytes bytes) >>= convertValue - -fromHexString - :: (Cip30Connection -> Effect (Promise String)) - -> Cip30Connection - -> Aff (Maybe RawBytes) -fromHexString act = map hexToRawBytes <<< Promise.toAffE <<< act - -------------------------------------------------------------------------------- --- FFI stuff -------------------------------------------------------------------------------- -foreign import data Cip30Connection :: Type - -foreign import _getNetworkId - :: Cip30Connection - -> Effect (Promise Int) - -foreign import _getUtxos - :: MaybeFfiHelper - -> Cip30Connection - -> Effect (Promise (Maybe (Array String))) - -foreign import _getCollateral - :: MaybeFfiHelper - -> Cip30Connection - -> Effect (Promise (Maybe (Array String))) - -getCip30Collateral :: Cip30Connection -> Effect (Promise (Maybe (Array String))) -getCip30Collateral conn = - _getCollateral maybeFfiHelper conn `catchError` - \_ -> throwError $ error "Wallet doesn't implement `getCollateral`." - -foreign import _getBalance :: Cip30Connection -> Effect (Promise String) - -foreign import _getAddresses - :: Cip30Connection - -> Effect - ( Promise - ( Array - String - ) - ) - -foreign import _getUnusedAddresses - :: Cip30Connection - -> Effect (Promise (Array String)) - -foreign import _getChangeAddress - :: Cip30Connection - -> Effect (Promise String) - -foreign import _getRewardAddresses - :: Cip30Connection - -> Effect (Promise (Array String)) - -foreign import _signTx - :: String -- Hex-encoded cbor of tx - -> Cip30Connection - -> Effect (Promise String) - -foreign import _signData - :: String -- Address - -> String -- Hex-encoded data - -> Cip30Connection - -> Effect (Promise { key :: String, signature :: String }) +getBalance :: Api -> Aff Value +getBalance conn = do + Cip30.getBalance conn >>= handleApiError >>= + liftM (error "CIP-30 getUsedAddresses returned non-address") <<< + (hexToCborBytes >=> fromBytes >=> convertValue) + +getCip30Collateral + :: Api -> Coin -> Aff (Maybe (Array String)) +getCip30Collateral conn requiredValue = do + bigNumValue <- liftEffect $ maybe (throw convertError) pure + $ BigNum.fromBigInt + $ unwrap requiredValue + let requiredValueStr = byteArrayToHex $ unwrap $ toBytes bigNumValue + (Cip30.getCollateral conn requiredValueStr >>= handleApiError) `catchError` + \err -> throwError $ error $ + "Failed to call `getCollateral`: " <> show err + where + convertError = + "Unable to convert CIP-30 getCollateral required value: " <> + show requiredValue diff --git a/src/Internal/Wallet/Cip30/SignData.js b/src/Internal/Wallet/Cip30/SignData.js index 79e1dab9f..b105a9ee3 100644 --- a/src/Internal/Wallet/Cip30/SignData.js +++ b/src/Internal/Wallet/Cip30/SignData.js @@ -2,9 +2,9 @@ let lib; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-message-signing-browser"); + lib = await import("@emurgo/cardano-message-signing-browser"); } else { - lib = require("@emurgo/cardano-message-signing-nodejs"); + lib = await import("@emurgo/cardano-message-signing-nodejs"); } // ----------------------------------------------------------------------------- @@ -12,100 +12,120 @@ if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { // ----------------------------------------------------------------------------- // newCoseSign1Builder :: ByteArray -> Headers -> Effect COSESign1Builder -exports.newCoseSign1Builder = payload => headers => () => { - return lib.COSESign1Builder.new(headers, payload, false); -}; +export function newCoseSign1Builder(payload) { + return headers => () => { + return lib.COSESign1Builder.new(headers, payload, false); + }; +} // makeDataToSign :: COSESign1Builder -> ByteArray -exports.makeDataToSign = builder => { +export function makeDataToSign(builder) { return builder.make_data_to_sign().to_bytes(); -}; +} // sign :: PrivateKey -> ByteArray -> ByteArray -exports.sign = privateKey => message => { - return privateKey.sign(message).to_bytes(); -}; +export function sign(privateKey) { + return message => { + return privateKey.sign(message).to_bytes(); + }; +} // buildSignature :: COSESign1Builder -> ByteArray -> ByteArray -exports.buildSignature = builder => signedSigStruct => { - return builder.build(signedSigStruct).to_bytes(); -}; +export function buildSignature(builder) { + return signedSigStruct => { + return builder.build(signedSigStruct).to_bytes(); + }; +} // ----------------------------------------------------------------------------- // Headers // ----------------------------------------------------------------------------- // newHeaders :: HeaderMap -> ProtectedHeaderMap -> Headers -exports.newHeaders = unprotectedHeaders => protectedHeaders => { - return lib.Headers.new(protectedHeaders, unprotectedHeaders); -}; +export function newHeaders(unprotectedHeaders) { + return protectedHeaders => { + return lib.Headers.new(protectedHeaders, unprotectedHeaders); + }; +} // ----------------------------------------------------------------------------- // ProtectedHeaderMap // ----------------------------------------------------------------------------- // newProtectedHeaderMap :: HeaderMap -> ProtectedHeaderMap -exports.newProtectedHeaderMap = headerMap => { +export function newProtectedHeaderMap(headerMap) { return lib.ProtectedHeaderMap.new(headerMap); -}; +} // ----------------------------------------------------------------------------- // HeaderMap // ----------------------------------------------------------------------------- // newHeaderMap :: Effect HeaderMap -exports.newHeaderMap = () => { +export function newHeaderMap() { return lib.HeaderMap.new(); -}; +} // setAlgHeaderToEdDsa :: HeaderMap -> Effect Unit -exports.setAlgHeaderToEdDsa = headerMap => () => { - const label = lib.Label.from_algorithm_id(lib.AlgorithmId.EdDSA); - headerMap.set_algorithm_id(label); -}; +export function setAlgHeaderToEdDsa(headerMap) { + return () => { + const label = lib.Label.from_algorithm_id(lib.AlgorithmId.EdDSA); + headerMap.set_algorithm_id(label); + }; +} // setAddressHeader :: ByteArray -> HeaderMap -> Effect Unit -exports.setAddressHeader = addressBytes => headerMap => () => { - const label = lib.Label.new_text("address"); - const value = lib.CBORValue.new_bytes(addressBytes); - headerMap.set_header(label, value); -}; +export function setAddressHeader(addressBytes) { + return headerMap => () => { + const label = lib.Label.new_text("address"); + const value = lib.CBORValue.new_bytes(addressBytes); + headerMap.set_header(label, value); + }; +} // ----------------------------------------------------------------------------- // COSEKey // ----------------------------------------------------------------------------- // newCoseKeyWithOkpType :: Effect COSEKey -exports.newCoseKeyWithOkpType = () => { +export function newCoseKeyWithOkpType() { return lib.COSEKey.new(lib.Label.from_key_type(lib.KeyType.OKP)); -}; +} // setCoseKeyAlgHeaderToEdDsa :: COSEKey -> Effect Unit -exports.setCoseKeyAlgHeaderToEdDsa = key => () => { - key.set_algorithm_id(lib.Label.from_algorithm_id(lib.AlgorithmId.EdDSA)); -}; +export function setCoseKeyAlgHeaderToEdDsa(key) { + return () => { + key.set_algorithm_id(lib.Label.from_algorithm_id(lib.AlgorithmId.EdDSA)); + }; +} // setCoseKeyCrvHeaderToEd25519 :: COSEKey -> Effect Unit -exports.setCoseKeyCrvHeaderToEd25519 = key => () => { - key.set_header( - lib.Label.new_int( - lib.Int.new_negative(lib.BigNum.from_str("1")) // crv (-1) - ), - lib.CBORValue.new_int( - lib.Int.new_i32(6) // Ed25519 (6) - ) - ); -}; +export function setCoseKeyCrvHeaderToEd25519(key) { + return () => { + key.set_header( + lib.Label.new_int( + lib.Int.new_negative(lib.BigNum.from_str("1")) // crv (-1) + ), + lib.CBORValue.new_int( + lib.Int.new_i32(6) // Ed25519 (6) + ) + ); + }; +} // setCoseKeyXHeader :: RawBytes -> COSEKey -> Effect Unit -exports.setCoseKeyXHeader = publicKeyBytes => key => () => { - key.set_header( - lib.Label.new_int( - lib.Int.new_negative(lib.BigNum.from_str("2")) // x (-2) - ), - lib.CBORValue.new_bytes(publicKeyBytes) // public key bytes - ); -}; +export function setCoseKeyXHeader(publicKeyBytes) { + return key => () => { + key.set_header( + lib.Label.new_int( + lib.Int.new_negative(lib.BigNum.from_str("2")) // x (-2) + ), + lib.CBORValue.new_bytes(publicKeyBytes) // public key bytes + ); + }; +} // bytesFromCoseKey :: COSEKey -> CborBytes -exports.bytesFromCoseKey = key => key.to_bytes(); +export function bytesFromCoseKey(key) { + return key.to_bytes(); +} diff --git a/src/Internal/Wallet/Cip30Mock.js b/src/Internal/Wallet/Cip30Mock.js index 4b62dab59..610baa03b 100644 --- a/src/Internal/Wallet/Cip30Mock.js +++ b/src/Internal/Wallet/Cip30Mock.js @@ -1,51 +1,45 @@ /* eslint-disable no-global-assign */ -exports.injectCip30Mock = walletName => mock => () => { - const hadWindow = typeof window != "undefined"; +export function injectCip30Mock(walletName) { + return mock => () => { + let window_ = typeof window != "undefined" ? window : (global.window = {}); - if ( - typeof window == "object" && - typeof window.cardano == "object" && - typeof window.cardano[walletName] != "undefined" - ) { - throw ( - "injectCip30Mock: refusing to overwrite existing wallet (" + - walletName + - ")" - ); - } - - if (typeof window == "undefined") { - window = { cardano: {} }; - } else if (typeof window.cardano == "undefined") { - window.cardano = {}; - } - - window.cardano[walletName] = { - enable: () => { - return new Promise((resolve, _reject) => - resolve({ - getNetworkId: mock.getNetworkId, - getUtxos: mock.getUtxos, - experimental: { - getCollateral: mock.getCollateral, - }, - getBalance: mock.getBalance, - getUsedAddresses: mock.getUsedAddresses, - getUnusedAddresses: mock.getUnusedAddresses, - getChangeAddress: mock.getChangeAddress, - getRewardAddresses: mock.getRewardAddresses, - signTx: mock.signTx, - signData: mock.signData, - }) + if ( + typeof window_ == "object" && + typeof window_.cardano == "object" && + typeof window_.cardano[walletName] != "undefined" + ) { + throw ( + "injectCip30Mock: refusing to overwrite existing wallet (" + + walletName + + ")" ); - }, - }; - - return () => { - delete window.cardano[walletName]; - if (!hadWindow) { - window = undefined; } + + window_.cardano = {}; + window_.cardano[walletName] = { + enable: () => { + return new Promise((resolve, _reject) => + resolve({ + getNetworkId: mock.getNetworkId, + getUtxos: mock.getUtxos, + experimental: { + getCollateral: mock.getCollateral + }, + getBalance: mock.getBalance, + getUsedAddresses: mock.getUsedAddresses, + getUnusedAddresses: mock.getUnusedAddresses, + getChangeAddress: mock.getChangeAddress, + getRewardAddresses: mock.getRewardAddresses, + signTx: mock.signTx, + signData: mock.signData + }) + ); + } + }; + + return () => { + delete window_.cardano[walletName]; + }; }; -}; +} diff --git a/src/Internal/Wallet/Cip30Mock.purs b/src/Internal/Wallet/Cip30Mock.purs index 7bd180da8..10b0324de 100644 --- a/src/Internal/Wallet/Cip30Mock.purs +++ b/src/Internal/Wallet/Cip30Mock.purs @@ -1,6 +1,13 @@ module Ctl.Internal.Wallet.Cip30Mock ( withCip30Mock - , WalletMock(MockFlint, MockGero, MockNami, MockLode, MockNuFi) + , WalletMock + ( MockFlint + , MockGero + , MockNami + , MockLode + , MockNuFi + , MockGenericCip30 + ) ) where import Prelude @@ -13,24 +20,41 @@ import Control.Promise (Promise, fromAff) import Ctl.Internal.Cardano.Types.TransactionUnspentOutput ( TransactionUnspentOutput(TransactionUnspentOutput) ) -import Ctl.Internal.Contract.QueryHandle (getQueryHandle) +import Ctl.Internal.Contract.Monad (getQueryHandle) import Ctl.Internal.Deserialization.Transaction (deserializeTransaction) import Ctl.Internal.Helpers (liftEither) import Ctl.Internal.Serialization ( convertTransactionUnspentOutput , convertValue + , publicKeyHash , toBytes ) import Ctl.Internal.Serialization.Address ( Address - , NetworkId(TestnetId, MainnetId) + , NetworkId(MainnetId, TestnetId) ) +import Ctl.Internal.Serialization.Keys (publicKeyFromPrivateKey) import Ctl.Internal.Serialization.WitnessSet (convertWitnessSet) import Ctl.Internal.Types.ByteArray (byteArrayToHex, hexToByteArray) import Ctl.Internal.Types.CborBytes (cborBytesFromByteArray, cborBytesToHex) +import Ctl.Internal.Types.PubKeyHash + ( PubKeyHash(PubKeyHash) + , StakePubKeyHash(StakePubKeyHash) + ) +import Ctl.Internal.Types.RewardAddress + ( rewardAddressToBytes + , stakePubKeyHashRewardAddress + ) import Ctl.Internal.Wallet ( Wallet - , WalletExtension(LodeWallet, NamiWallet, GeroWallet, FlintWallet, NuFiWallet) + , WalletExtension + ( LodeWallet + , NamiWallet + , GeroWallet + , FlintWallet + , NuFiWallet + , GenericCip30Wallet + ) , mkWalletAff ) import Ctl.Internal.Wallet.Key @@ -44,7 +68,7 @@ import Data.Either (hush) import Data.Foldable (fold, foldMap) import Data.Function.Uncurried (Fn2, mkFn2) import Data.Map as Map -import Data.Maybe (Maybe(Just)) +import Data.Maybe (Maybe(Just), maybe) import Data.Newtype (unwrap, wrap) import Data.Traversable (traverse) import Data.Tuple.Nested ((/\)) @@ -56,7 +80,13 @@ import Effect.Class (liftEffect) import Effect.Exception (error) import Effect.Unsafe (unsafePerformEffect) -data WalletMock = MockFlint | MockGero | MockNami | MockLode | MockNuFi +data WalletMock + = MockFlint + | MockGero + | MockNami + | MockLode + | MockNuFi + | MockGenericCip30 String -- | Construct a CIP-30 wallet mock that exposes `KeyWallet` functionality -- | behind a CIP-30 interface and uses Ogmios to submit Txs. @@ -93,6 +123,7 @@ withCip30Mock (KeyWallet keyWallet) mock contract = do MockNami -> mkWalletAff NamiWallet MockLode -> mkWalletAff LodeWallet MockNuFi -> mkWalletAff NuFiWallet + MockGenericCip30 name -> mkWalletAff (GenericCip30Wallet name) mockString :: String mockString = case mock of @@ -101,16 +132,21 @@ withCip30Mock (KeyWallet keyWallet) mock contract = do MockNami -> "nami" MockLode -> "LodeWallet" MockNuFi -> "nufi" + MockGenericCip30 name -> name type Cip30Mock = { getNetworkId :: Effect (Promise Int) + -- we ignore both the amount parameter and pagination: , getUtxos :: Effect (Promise (Array String)) + -- we ignore the amount parameter: , getCollateral :: Effect (Promise (Array String)) , getBalance :: Effect (Promise String) + -- we ignore pagination parameter: , getUsedAddresses :: Effect (Promise (Array String)) , getUnusedAddresses :: Effect (Promise (Array String)) , getChangeAddress :: Effect (Promise String) , getRewardAddresses :: Effect (Promise (Array String)) + -- we ignore the 'isPartial' parameter , signTx :: String -> Promise String , signData :: Fn2 String String (Promise { key :: String, signature :: String }) @@ -145,6 +181,16 @@ mkCip30Mock pKey mSKey = do byteArrayToHex $ unwrap $ toBytes ((unwrap keyWallet).address env.networkId :: Address) + mbRewardAddressHex = mSKey <#> \stakeKey -> + let + stakePubKey = publicKeyFromPrivateKey (unwrap stakeKey) + stakePubKeyHash = publicKeyHash stakePubKey + rewardAddress = stakePubKeyHashRewardAddress env.networkId + $ StakePubKeyHash + $ PubKeyHash stakePubKeyHash + in + byteArrayToHex $ unwrap $ rewardAddressToBytes rewardAddress + pure $ { getNetworkId: fromAff $ pure $ case env.networkId of @@ -154,11 +200,10 @@ mkCip30Mock pKey mSKey = do utxos <- ownUtxos collateralUtxos <- getCollateralUtxos utxos let - -- filter UTxOs that will be used as collateral + collateralOutputs = collateralUtxos <#> unwrap >>> _.input + -- filter out UTxOs that will be used as collateral nonCollateralUtxos = - Map.filter - (flip Array.elem (collateralUtxos <#> unwrap >>> _.output)) - utxos + Map.filterKeys (not <<< flip Array.elem collateralOutputs) utxos -- Convert to CSL representation and serialize cslUtxos <- traverse (liftEffect <<< convertTransactionUnspentOutput) $ Map.toUnfoldable nonCollateralUtxos <#> \(input /\ output) -> @@ -184,7 +229,7 @@ mkCip30Mock pKey mSKey = do , getChangeAddress: fromAff do pure addressHex , getRewardAddresses: fromAff do - pure [ addressHex ] + pure (maybe [] pure mbRewardAddressHex) , signTx: \str -> unsafePerformEffect $ fromAff do txBytes <- liftMaybe (error "Unable to convert CBOR") $ hexToByteArray str diff --git a/src/Internal/Wallet/KeyFile.purs b/src/Internal/Wallet/KeyFile.purs index 4da77b7dd..b51afcec8 100644 --- a/src/Internal/Wallet/KeyFile.purs +++ b/src/Internal/Wallet/KeyFile.purs @@ -86,14 +86,17 @@ privateStakeKeyFromFile filePath = do liftM (error "Unable to decode private stake key") $ PrivateStakeKey <$> privateKeyFromBytes (wrap bytes) +-- | Write private payment key to file in cardano-cli envelope format privatePaymentKeyToFile :: FilePath -> PrivatePaymentKey -> Aff Unit privatePaymentKeyToFile filePath key = liftEffect <<< (writeTextFile Encoding.UTF8 filePath) $ formatPaymentKey key +-- | Write private stake key to file in cardano-cli envelope format privateStakeKeyToFile :: FilePath -> PrivateStakeKey -> Aff Unit privateStakeKeyToFile filePath key = liftEffect <<< (writeTextFile Encoding.UTF8 filePath) $ formatStakeKey key +-- | Convert private payment key to cardano-cli envelope format. formatPaymentKey :: PrivatePaymentKey -> String formatPaymentKey (PrivatePaymentKey key) = encodeAeson >>> show $ @@ -102,6 +105,7 @@ formatPaymentKey (PrivatePaymentKey key) = encodeAeson >>> show , cborHex: keyToCbor key } +-- | Convert private stake key to cardano-cli envelope format. formatStakeKey :: PrivateStakeKey -> String formatStakeKey (PrivateStakeKey key) = encodeAeson >>> show $ diff --git a/src/Internal/Wallet/Spec.purs b/src/Internal/Wallet/Spec.purs index 403980bd4..8cb539eac 100644 --- a/src/Internal/Wallet/Spec.purs +++ b/src/Internal/Wallet/Spec.purs @@ -1,22 +1,30 @@ module Ctl.Internal.Wallet.Spec ( WalletSpec ( UseKeys + , UseMnemonic , ConnectToNami , ConnectToGero , ConnectToFlint , ConnectToEternl , ConnectToLode , ConnectToNuFi + , ConnectToLace + , ConnectToGenericCip30 ) + , Cip1852DerivationPath + , StakeKeyPresence(WithStakeKey, WithoutStakeKey) + , MnemonicSource(MnemonicString, MnemonicFile) , PrivateStakeKeySource(PrivateStakeKeyFile, PrivateStakeKeyValue) , PrivatePaymentKeySource(PrivatePaymentKeyFile, PrivatePaymentKeyValue) , mkWalletBySpec + , mkKeyWalletFromMnemonic ) where import Prelude +import Control.Monad.Error.Class (liftEither) import Ctl.Internal.Wallet - ( Wallet + ( Wallet(KeyWallet) , WalletExtension ( NamiWallet , GeroWallet @@ -24,37 +32,99 @@ import Ctl.Internal.Wallet , EternlWallet , LodeWallet , NuFiWallet + , LaceWallet + , GenericCip30Wallet ) , mkKeyWallet , mkWalletAff ) -import Ctl.Internal.Wallet.Key (PrivatePaymentKey, PrivateStakeKey) +import Ctl.Internal.Wallet.Bip32 + ( bip32ToPrivateKey + , cip1852AccountFromMnemonic + , derivePaymentKey + , deriveStakeKey + ) +import Ctl.Internal.Wallet.Key + ( KeyWallet + , PrivatePaymentKey(PrivatePaymentKey) + , PrivateStakeKey(PrivateStakeKey) + , privateKeysToKeyWallet + ) import Ctl.Internal.Wallet.KeyFile ( privatePaymentKeyFromFile , privateStakeKeyFromFile ) -import Data.Maybe (Maybe) +import Data.Bifunctor (lmap) +import Data.Either (Either) +import Data.Generic.Rep (class Generic) +import Data.Maybe (Maybe(Just, Nothing)) +import Data.Show.Generic (genericShow) import Data.Traversable (for) +import Data.UInt (UInt) import Effect.Aff (Aff) +import Effect.Exception (error) +import Node.Encoding as Encoding +import Node.FS.Aff (readTextFile) import Node.Path (FilePath) data PrivatePaymentKeySource = PrivatePaymentKeyFile FilePath | PrivatePaymentKeyValue PrivatePaymentKey +derive instance Generic PrivatePaymentKeySource _ + +instance Show PrivatePaymentKeySource where + show = genericShow + data PrivateStakeKeySource = PrivateStakeKeyFile FilePath | PrivateStakeKeyValue PrivateStakeKey +derive instance Generic PrivateStakeKeySource _ + +instance Show PrivateStakeKeySource where + show = genericShow + +data MnemonicSource + = MnemonicString String + | MnemonicFile FilePath + +derive instance Generic MnemonicSource _ + +instance Show MnemonicSource where + show = genericShow + +data StakeKeyPresence = WithStakeKey | WithoutStakeKey + +derive instance Generic StakeKeyPresence _ + +instance Show StakeKeyPresence where + show = genericShow + -- | A data type to describe instructions on how to initialize a wallet. data WalletSpec = UseKeys PrivatePaymentKeySource (Maybe PrivateStakeKeySource) + | UseMnemonic MnemonicSource Cip1852DerivationPath StakeKeyPresence | ConnectToNami | ConnectToGero | ConnectToFlint | ConnectToEternl | ConnectToLode | ConnectToNuFi + | ConnectToLace + | ConnectToGenericCip30 String + +derive instance Generic WalletSpec _ + +instance Show WalletSpec where + show = genericShow + +-- | Contains non-constant parameters for a CIP-1852 derivation path. +-- | See https://cips.cardano.org/cips/cip1852/ and `doc/key-management.md`. +type Cip1852DerivationPath = + { accountIndex :: UInt + , addressIndex :: UInt + } mkWalletBySpec :: WalletSpec -> Aff Wallet mkWalletBySpec = case _ of @@ -67,9 +137,37 @@ mkWalletBySpec = case _ of PrivateStakeKeyFile filePath -> privateStakeKeyFromFile filePath PrivateStakeKeyValue key -> pure key pure $ mkKeyWallet privatePaymentKey mbPrivateStakeKey + UseMnemonic (MnemonicString mnemonic) derivationPath stakeKeyPresence -> do + map KeyWallet $ liftEither $ lmap error $ + mkKeyWalletFromMnemonic mnemonic derivationPath stakeKeyPresence + UseMnemonic (MnemonicFile path) derivationPath stakeKeyPresence -> do + mnemonic <- readTextFile Encoding.UTF8 path + map KeyWallet $ liftEither $ lmap error $ + mkKeyWalletFromMnemonic mnemonic derivationPath stakeKeyPresence ConnectToNami -> mkWalletAff NamiWallet ConnectToGero -> mkWalletAff GeroWallet ConnectToFlint -> mkWalletAff FlintWallet ConnectToEternl -> mkWalletAff EternlWallet ConnectToLode -> mkWalletAff LodeWallet ConnectToNuFi -> mkWalletAff NuFiWallet + ConnectToLace -> mkWalletAff LaceWallet + ConnectToGenericCip30 name -> mkWalletAff (GenericCip30Wallet name) + +-- | Create a wallet given a mnemonic phrase, account index, address index and +-- | stake key presence flag. +-- | See `doc/key-management.md` for more info. +mkKeyWalletFromMnemonic + :: String + -> Cip1852DerivationPath + -> StakeKeyPresence + -> Either String KeyWallet +mkKeyWalletFromMnemonic phrase { accountIndex, addressIndex } stakeKeyPresence = + do + account <- cip1852AccountFromMnemonic phrase accountIndex + let + paymentKey = derivePaymentKey account addressIndex # bip32ToPrivateKey + mbStakeKeySpec = case stakeKeyPresence of + WithStakeKey -> Just $ PrivateStakeKey $ deriveStakeKey account # + bip32ToPrivateKey + WithoutStakeKey -> Nothing + pure $ privateKeysToKeyWallet (PrivatePaymentKey paymentKey) mbStakeKeySpec diff --git a/templates/ctl-scaffold/.gitignore b/templates/ctl-scaffold/.gitignore index 40f998ca1..628f00fcd 100644 --- a/templates/ctl-scaffold/.gitignore +++ b/templates/ctl-scaffold/.gitignore @@ -16,6 +16,9 @@ result-* /node_modules/ test-data/chrome-user-data test-data/preview +test-data/preprod +test-data/mainnet +test-data/keys .projectile /dist/ output.js diff --git a/templates/ctl-scaffold/Makefile b/templates/ctl-scaffold/Makefile index dc044b47e..3867c1319 100644 --- a/templates/ctl-scaffold/Makefile +++ b/templates/ctl-scaffold/Makefile @@ -1,24 +1,80 @@ SHELL := bash .ONESHELL: +.PHONY: esbuild-bundle esbuild-serve webpack-bundle webpack-serve check-format format query-testnet-tip clean check-explicit-exports spago-build create-bundle-entrypoint create-html-entrypoint delete-bundle-entrypoint .SHELLFLAGS := -eu -o pipefail -c -ps-sources := $$(fd -epurs) -ps-entrypoint := Scaffold.Main -e2e-entrypoint := Scaffold.Test.E2E.Serve -ps-bundle = spago bundle-module -m ${ps-entrypoint} --to output.js +ps-sources := $(shell fd --no-ignore-parent -epurs) +nix-sources := $(shell fd --no-ignore-parent -enix --exclude='spago*') +js-sources := $(shell fd --no-ignore-parent -ejs -ecjs) -run-dev: - @${ps-bundle} && BROWSER_RUNTIME=1 webpack-dev-server --progress +### Bundler setup -e2e-serve: - spago bundle-module -m ${e2e-entrypoint} --to output.js - BROWSER_RUNTIME=1 webpack-dev-server --progress +# The main Purescript module +ps-entrypoint := Scaffold.Test.E2E.Serve +# The entry point function in the main PureScript module +ps-entrypoint-function := main +# Whether to bundle for the browser +browser-runtime := 1 # Use "1" for true and "" for false + +preview-node-ipc = $(shell docker volume inspect store_node-preview-ipc | jq -r '.[0].Mountpoint') +preprod-node-ipc = $(shell docker volume inspect store_node-preprod-ipc | jq -r '.[0].Mountpoint') +serve-port := 4008 + +spago-build: + @spago build + +create-bundle-entrypoint: + @mkdir -p dist/ + @echo 'import("../output/${ps-entrypoint}/index.js").then(m => m.${ps-entrypoint-function}());' > ./dist/entrypoint.js + +create-html-entrypoint: + @mkdir -p dist/ + @cat << EOF > dist/index.html + + + + + EOF + +delete-bundle-entrypoint: + @rm -f ./dist/entrypoint.js + +esbuild-bundle: spago-build create-bundle-entrypoint + BROWSER_RUNTIME=${browser-runtime} node esbuild/bundle.js ./dist/entrypoint.js dist/index.js + @make delete-bundle-entrypoint + +esbuild-serve: spago-build create-bundle-entrypoint create-html-entrypoint + + BROWSER_RUNTIME=1 node esbuild/serve.js ./dist/entrypoint.js dist/index.js dist/ ${serve-port} + +webpack-bundle: spago-build create-bundle-entrypoint + BROWSER_RUNTIME=${browser-runtime} webpack --mode=production \ + -o dist/ --env entry=./dist/entrypoint.js + @make delete-bundle-entrypoint + +webpack-serve: spago-build create-bundle-entrypoint create-html-entrypoint + BROWSER_RUNTIME=1 webpack-dev-server --progress \ + --port ${serve-port} \ + -o dist/ --env entry=./dist/entrypoint.js run-build: @${ps-bundle} && BROWSER_RUNTIME=1 webpack --mode=production check-format: @purs-tidy check ${ps-sources} + @prettier --loglevel warn -c ${js-sources} + @eslint --quiet ${js-sources} --parser-options 'sourceType: module' format: @purs-tidy format-in-place ${ps-sources} + prettier -w ${js-sources} + +clean: + @ rm -r .psc-ide-port || true + @ rm -rf .psci_modules || true + @ rm -rf .spago || true + @ rm -rf generated-docs || true + @ rm -rf .spago2nix || true + @ rm -rf node_modules || true + @ rm -rf output || true + @ rm -rf dist || true diff --git a/templates/ctl-scaffold/README.md b/templates/ctl-scaffold/README.md index 2f065a486..98de618f5 100644 --- a/templates/ctl-scaffold/README.md +++ b/templates/ctl-scaffold/README.md @@ -39,6 +39,6 @@ Here are a few tips on how to get started with testing your code. [Headless browser test suite](https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/e2e-testing.md) allows to run user contracts with real wallet browser extensions automatically. -- Start the CTL runtime: `nix run -L .#ctl-scaffold-runtime` -- run `npm run e2e-serve` from Nix shell -- run `npm run e2e-test` from Nix shell +- Start the CTL runtime services: `npm run start-runtime` +- run `npm run e2e-serve` from Nix shell to start a web server +- run `npm run e2e-test` from Nix shell to run the test suite diff --git a/templates/ctl-scaffold/esbuild/bundle.js b/templates/ctl-scaffold/esbuild/bundle.js new file mode 100644 index 000000000..91fc9c774 --- /dev/null +++ b/templates/ctl-scaffold/esbuild/bundle.js @@ -0,0 +1,13 @@ +import * as esbuild from "esbuild"; +import { buildOptions } from "./config.js"; + +if (process.argv.length < 4) { + throw `usage: node bundle.js ENTRY_POINT OUTPUT_FILENAME`; +} + +esbuild.build( + buildOptions({ + entryPoint: process.argv[2], + outfile: process.argv[3], + }), +); diff --git a/templates/ctl-scaffold/esbuild/config.js b/templates/ctl-scaffold/esbuild/config.js new file mode 100755 index 000000000..996ca4335 --- /dev/null +++ b/templates/ctl-scaffold/esbuild/config.js @@ -0,0 +1,41 @@ +import { wasmLoader } from "esbuild-plugin-wasm"; +import { polyfillNode } from "esbuild-plugin-polyfill-node"; + +const isBrowser = !!process.env.BROWSER_RUNTIME; + +export const buildOptions = ({ entryPoint, outfile }) => { + const config = { + entryPoints: [entryPoint], + outfile: outfile, + define: { + BROWSER_RUNTIME: isBrowser ? "true" : '""', + }, + plugins: [ + wasmLoader({ + mode: "deferred", + }), + ], + bundle: true, + platform: isBrowser ? "browser" : "node", + format: "esm", + treeShaking: true, + logLevel: "error", + }; + + // https://esbuild.github.io/api/#packages + if (!isBrowser) { + config.packages = "external"; + } else { + config.plugins.push( + polyfillNode({ + polyfills: { + crypto: true, + fs: true, + os: true, + }, + }), + ); + } + + return config; +}; diff --git a/templates/ctl-scaffold/esbuild/serve.js b/templates/ctl-scaffold/esbuild/serve.js new file mode 100644 index 000000000..a6843b499 --- /dev/null +++ b/templates/ctl-scaffold/esbuild/serve.js @@ -0,0 +1,72 @@ +import * as esbuild from "esbuild"; +import { buildOptions } from "./config.js"; +import http from "node:http"; +import * as url from "url"; + +if (process.argv.length < 6) { + throw `usage: node serve.js ENTRY_POINT OUTPUT_FILE SERVE_DIR PORT`; +} + +const ctx = await esbuild.context( + buildOptions({ + entryPoint: process.argv[2], + outfile: process.argv[3], + }), +); + +const config = { + // Use the next port for esbuild server, + // we need a port for our proxy (see below). + port: parseInt(process.argv[5]) + 1, + servedir: process.argv[4], +}; + +let { host, port } = await ctx.serve(config); + +// Proxy Kupo to esbuild server. This is needed due to CORS + +const kupoEndpoint = process.env.KUPO_HOST || "http://localhost:1442"; +const kupoHost = url.parse(kupoEndpoint).hostname; +const kupoPort = url.parse(kupoEndpoint).port || 80; + +http + .createServer((req, res) => { + const options = { + hostname: host, + port: port, + path: req.url, + method: req.method, + headers: req.headers, + }; + + // Forward each incoming request to esbuild + const proxyReq = http.request(options, proxyRes => { + // If esbuild returns "not found" and the path starts from /kupo/ + if (proxyRes.statusCode === 404 && req.url.startsWith("/kupo/")) { + // Connect to Kupo running on port 1442 + const kupoOptions = { + hostname: kupoHost, + port: kupoPort, + path: req.url.slice("/kupo".length), + method: req.method, + headers: req.headers, + }; + // Request the corresponding path + http + .request(kupoOptions, kupoRes => { + // Pipe the response from Kupo back to the client + res.writeHead(kupoRes.statusCode, kupoRes.headers); + kupoRes.pipe(res, { end: true }); + }) + .end(); + } else { + // Otherwise, forward the response from esbuild to the client + res.writeHead(proxyRes.statusCode, proxyRes.headers); + proxyRes.pipe(res, { end: true }); + } + }); + + // Forward the body of the request to esbuild + req.pipe(proxyReq, { end: true }); + }) + .listen(parseInt(process.argv[5])); diff --git a/templates/ctl-scaffold/flake.lock b/templates/ctl-scaffold/flake.lock index ef566500c..1c4daa222 100644 --- a/templates/ctl-scaffold/flake.lock +++ b/templates/ctl-scaffold/flake.lock @@ -3,11 +3,11 @@ "CHaP": { "flake": false, "locked": { - "lastModified": 1669917887, - "narHash": "sha256-9bsEaFh2lb26dZNUL+P4/LIzkTZH5NC7n9SprKzB/2A=", + "lastModified": 1702290471, + "narHash": "sha256-uivAP05RENSzQDbDjAU3Fbq+AiDDpcNaHAzvOZM1fik=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "85510200dd0dc758d72bc1ada11ff5855e5d46b7", + "rev": "1ff7483a6d2670c8627de92779a2b92a989293cd", "type": "github" }, "original": { @@ -20,11 +20,11 @@ "CHaP_2": { "flake": false, "locked": { - "lastModified": 1666726035, - "narHash": "sha256-EBodp9DJb8Z+aVbuezVwLJ9Q9XIJUXFd/n2skay3FeU=", + "lastModified": 1686070892, + "narHash": "sha256-0yAYqvCg2/aby4AmW0QQK9RKnU1siQczfbUC6hOU02w=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "b074321c4c8cbf2c3789436ab11eaa43e1c441a7", + "rev": "596cf203a0a1ba252a083a79d384325000faeb49", "type": "github" }, "original": { @@ -37,28 +37,28 @@ "CHaP_3": { "flake": false, "locked": { - "lastModified": 1666726035, - "narHash": "sha256-EBodp9DJb8Z+aVbuezVwLJ9Q9XIJUXFd/n2skay3FeU=", + "lastModified": 1695160702, + "narHash": "sha256-+Mfc6eGA1ZwQ/ZjKzMoMWkHzd+sgR1JbxY0i849HjEU=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "b074321c4c8cbf2c3789436ab11eaa43e1c441a7", + "rev": "9932690af3713ef034c928850252eb1b88450ee6", "type": "github" }, "original": { "owner": "input-output-hk", + "ref": "repo", "repo": "cardano-haskell-packages", - "rev": "b074321c4c8cbf2c3789436ab11eaa43e1c441a7", "type": "github" } }, "CHaP_4": { "flake": false, "locked": { - "lastModified": 1669289866, - "narHash": "sha256-dnRYWjYZQuNJLXsn5PdcMBPaReDYVARqc8a2grokVZ0=", + "lastModified": 1694601145, + "narHash": "sha256-p7ZxorrOvoow6N+JKvfrCiRYFtUSPiEMgt8MR+rcTT4=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "c3cebaddd8b60c0b5bcef6d895adb30a79f495a8", + "rev": "e8298604717dbaa311c1e42e021b571670f4b039", "type": "github" }, "original": { @@ -84,7 +84,7 @@ "type": "github" } }, - "HTTP_10": { + "HTTP_2": { "flake": false, "locked": { "lastModified": 1451647621, @@ -100,7 +100,7 @@ "type": "github" } }, - "HTTP_11": { + "HTTP_3": { "flake": false, "locked": { "lastModified": 1451647621, @@ -116,7 +116,7 @@ "type": "github" } }, - "HTTP_12": { + "HTTP_4": { "flake": false, "locked": { "lastModified": 1451647621, @@ -132,7 +132,7 @@ "type": "github" } }, - "HTTP_2": { + "HTTP_5": { "flake": false, "locked": { "lastModified": 1451647621, @@ -148,7 +148,7 @@ "type": "github" } }, - "HTTP_3": { + "HTTP_6": { "flake": false, "locked": { "lastModified": 1451647621, @@ -164,7 +164,7 @@ "type": "github" } }, - "HTTP_4": { + "HTTP_7": { "flake": false, "locked": { "lastModified": 1451647621, @@ -180,385 +180,684 @@ "type": "github" } }, - "HTTP_5": { - "flake": false, + "agenix": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641576265, + "narHash": "sha256-G4W39k5hdu2kS13pi/RhyTOySAo7rmrs7yMUZRH0OZI=", + "owner": "ryantm", + "repo": "agenix", + "rev": "08b9c96878b2f9974fc8bde048273265ad632357", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "HTTP_6": { - "flake": false, + "agenix-cli": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_10" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641404293, + "narHash": "sha256-0+QVY1sDhGF4hAN6m2FdKZgm9V1cuGGjY4aitRBnvKg=", + "owner": "cole-h", + "repo": "agenix-cli", + "rev": "77fccec4ed922a0f5f55ed964022b0db7d99f07d", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "cole-h", + "repo": "agenix-cli", "type": "github" } }, - "HTTP_7": { - "flake": false, + "agenix-cli_2": { + "inputs": { + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_12" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641404293, + "narHash": "sha256-0+QVY1sDhGF4hAN6m2FdKZgm9V1cuGGjY4aitRBnvKg=", + "owner": "cole-h", + "repo": "agenix-cli", + "rev": "77fccec4ed922a0f5f55ed964022b0db7d99f07d", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "cole-h", + "repo": "agenix-cli", "type": "github" } }, - "HTTP_8": { - "flake": false, + "agenix-cli_3": { + "inputs": { + "flake-utils": "flake-utils_18", + "nixpkgs": "nixpkgs_41" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641404293, + "narHash": "sha256-0+QVY1sDhGF4hAN6m2FdKZgm9V1cuGGjY4aitRBnvKg=", + "owner": "cole-h", + "repo": "agenix-cli", + "rev": "77fccec4ed922a0f5f55ed964022b0db7d99f07d", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "cole-h", + "repo": "agenix-cli", "type": "github" } }, - "HTTP_9": { - "flake": false, + "agenix_2": { + "inputs": { + "nixpkgs": "nixpkgs_11" + }, "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1641576265, + "narHash": "sha256-G4W39k5hdu2kS13pi/RhyTOySAo7rmrs7yMUZRH0OZI=", + "owner": "ryantm", + "repo": "agenix", + "rev": "08b9c96878b2f9974fc8bde048273265ad632357", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank": { + "agenix_3": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1640802000, + "narHash": "sha256-ZiI94Zv/IgW64fqKrtVaQqfUCkn9STvAjgfFmvtqcQ8=", + "owner": "ryantm", + "repo": "agenix", + "rev": "c5558c88b2941bf94886dfdede6926b1ba5f5629", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_2": { + "agenix_4": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1643841757, + "narHash": "sha256-9tKhu4JzoZvustC9IEWK6wKcDhPLuK/ICbLgm8QnLnk=", + "owner": "ryantm", + "repo": "agenix", + "rev": "a17d1f30550260f8b45764ddbd0391f4b1ed714a", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_3": { + "agenix_5": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1640802000, + "narHash": "sha256-ZiI94Zv/IgW64fqKrtVaQqfUCkn9STvAjgfFmvtqcQ8=", + "owner": "ryantm", + "repo": "agenix", + "rev": "c5558c88b2941bf94886dfdede6926b1ba5f5629", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_4": { + "agenix_6": { + "inputs": { + "nixpkgs": "nixpkgs_40" + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1641576265, + "narHash": "sha256-G4W39k5hdu2kS13pi/RhyTOySAo7rmrs7yMUZRH0OZI=", + "owner": "ryantm", + "repo": "agenix", + "rev": "08b9c96878b2f9974fc8bde048273265ad632357", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "blank_5": { + "agenix_7": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1625557891, - "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", - "owner": "divnix", - "repo": "blank", - "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "lastModified": 1640802000, + "narHash": "sha256-ZiI94Zv/IgW64fqKrtVaQqfUCkn9STvAjgfFmvtqcQ8=", + "owner": "ryantm", + "repo": "agenix", + "rev": "c5558c88b2941bf94886dfdede6926b1ba5f5629", "type": "github" }, "original": { - "owner": "divnix", - "repo": "blank", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "bot-plutus-interface": { + "agenix_8": { "inputs": { - "CHaP": "CHaP_4", - "flake-compat": "flake-compat_11", - "haskell-nix": "haskell-nix_4", - "iohk-nix": "iohk-nix_4", "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "nixpkgs-unstable" + "db-sync", + "cardano-world", + "capsules", + "ragenix", + "nixpkgs" ] }, "locked": { - "lastModified": 1670496765, - "narHash": "sha256-5feLJXmLFwTnGEoYmRFcGiViYU1egIlzuKbwlilTa7g=", - "owner": "mlabs-haskell", - "repo": "bot-plutus-interface", - "rev": "e80680777a761109eea6d47c8370aa55d318734d", + "lastModified": 1643841757, + "narHash": "sha256-9tKhu4JzoZvustC9IEWK6wKcDhPLuK/ICbLgm8QnLnk=", + "owner": "ryantm", + "repo": "agenix", + "rev": "a17d1f30550260f8b45764ddbd0391f4b1ed714a", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "bot-plutus-interface", - "rev": "e80680777a761109eea6d47c8370aa55d318734d", + "owner": "ryantm", + "repo": "agenix", "type": "github" } }, - "cabal-32": { - "flake": false, + "alejandra": { + "inputs": { + "flakeCompat": "flakeCompat", + "nixpkgs": "nixpkgs_35" + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1646360966, + "narHash": "sha256-fJ/WHSU45bMJRDqz9yA3B2lwXtW5DKooU+Pzn13GyZI=", + "owner": "kamadorueda", + "repo": "alejandra", + "rev": "511c3f6a88b6964e1496fb6f441f4ae5e58bd3ea", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "kamadorueda", + "repo": "alejandra", "type": "github" } }, - "cabal-32_10": { + "bats-assert": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1636059754, + "narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=", + "owner": "bats-core", + "repo": "bats-assert", + "rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-assert", "type": "github" } }, - "cabal-32_11": { + "bats-assert_2": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1636059754, + "narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=", + "owner": "bats-core", + "repo": "bats-assert", + "rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-assert", "type": "github" } }, - "cabal-32_12": { + "bats-assert_3": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1636059754, + "narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=", + "owner": "bats-core", + "repo": "bats-assert", + "rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-assert", "type": "github" } }, - "cabal-32_2": { + "bats-support": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1548869839, + "narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=", + "owner": "bats-core", + "repo": "bats-support", + "rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-support", "type": "github" } }, - "cabal-32_3": { + "bats-support_2": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1548869839, + "narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=", + "owner": "bats-core", + "repo": "bats-support", + "rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-support", "type": "github" } }, - "cabal-32_4": { + "bats-support_3": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1548869839, + "narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=", + "owner": "bats-core", + "repo": "bats-support", + "rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "bats-core", + "repo": "bats-support", "type": "github" } }, - "cabal-32_5": { - "flake": false, + "bitte": { + "inputs": { + "agenix": "agenix", + "agenix-cli": "agenix-cli", + "blank": "blank_2", + "capsules": "capsules", + "data-merge": "data-merge", + "deploy": "deploy_2", + "fenix": "fenix_4", + "hydra": "hydra_3", + "n2c": "n2c_2", + "nix": "nix_5", + "nixpkgs": "nixpkgs_29", + "nixpkgs-docker": "nixpkgs-docker", + "nixpkgs-unstable": "nixpkgs-unstable_3", + "nomad-driver-nix": "nomad-driver-nix_2", + "nomad-follower": "nomad-follower_2", + "ops-lib": "ops-lib_3", + "ragenix": "ragenix_3", + "std": "std_2", + "terranix": "terranix_2", + "utils": "utils_12" + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1661790449, + "narHash": "sha256-lh1MlCOJE/LJMChGLREATWPnN9oKkjFFjnTvc9pX4Uo=", + "owner": "input-output-hk", + "repo": "bitte", + "rev": "f452ea2c392a4a301c1feb20955c7d0a4ad38130", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "bitte", "type": "github" } }, - "cabal-32_6": { - "flake": false, + "bitte-cells": { + "inputs": { + "cardano-db-sync": [ + "ctl", + "db-sync", + "cardano-world", + "cardano-db-sync" + ], + "cardano-iohk-nix": [ + "ctl", + "db-sync", + "cardano-world", + "iohk-nix" + ], + "cardano-node": [ + "ctl", + "db-sync", + "cardano-world", + "cardano-node" + ], + "cardano-wallet": [ + "ctl", + "db-sync", + "cardano-world", + "cardano-wallet" + ], + "cicero": "cicero", + "data-merge": [ + "ctl", + "db-sync", + "cardano-world", + "data-merge" + ], + "n2c": [ + "ctl", + "db-sync", + "cardano-world", + "n2c" + ], + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "nixpkgs" + ], + "std": [ + "ctl", + "db-sync", + "cardano-world", + "std" + ] + }, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "lastModified": 1660761733, + "narHash": "sha256-Xqf6yRnjJXJ8jbwL9rlci8Z91tVDVwk3lorD6SnZuIg=", + "owner": "input-output-hk", + "repo": "bitte-cells", + "rev": "433bbca40bf461a86d55f202d26f87c9f5206377", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "bitte-cells", "type": "github" } }, - "cabal-32_7": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "bitte_2": { + "inputs": { + "agenix": "agenix_2", + "agenix-cli": "agenix-cli_2", + "blank": "blank_3", + "deploy": "deploy", + "fenix": "fenix_2", + "hydra": "hydra_2", + "nix": "nix_2", + "nixpkgs": "nixpkgs_15", + "nixpkgs-unstable": "nixpkgs-unstable_2", + "nomad": "nomad", + "nomad-driver-nix": "nomad-driver-nix", + "nomad-follower": "nomad-follower", + "ops-lib": "ops-lib_2", + "ragenix": "ragenix", + "terranix": "terranix", + "utils": "utils_7", + "vulnix": "vulnix" + }, + "locked": { + "lastModified": 1649886949, + "narHash": "sha256-tvOo6cTtJGGCCzntAK8L7s6EmQ+PIAdN0wUvnpVFPCs=", + "owner": "input-output-hk", + "repo": "bitte", + "rev": "5df2f7e2cac09f0755dc8615ea0bd3cbc8884cd5", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "bitte", + "type": "github" + } + }, + "bitte_3": { + "inputs": { + "agenix": "agenix_6", + "agenix-cli": "agenix-cli_3", + "blank": "blank_4", + "deploy": "deploy_3", + "fenix": "fenix_6", + "hydra": "hydra_4", + "nix": "nix_9", + "nixpkgs": "nixpkgs_44", + "nixpkgs-unstable": "nixpkgs-unstable_4", + "nomad": "nomad_2", + "nomad-driver-nix": "nomad-driver-nix_3", + "nomad-follower": "nomad-follower_3", + "ops-lib": "ops-lib_4", + "ragenix": "ragenix_4", + "terranix": "terranix_3", + "utils": "utils_21", + "vulnix": "vulnix_2" + }, + "locked": { + "lastModified": 1649886949, + "narHash": "sha256-tvOo6cTtJGGCCzntAK8L7s6EmQ+PIAdN0wUvnpVFPCs=", + "owner": "input-output-hk", + "repo": "bitte", + "rev": "5df2f7e2cac09f0755dc8615ea0bd3cbc8884cd5", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "bitte", + "type": "github" + } + }, + "blank": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_2": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_3": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_4": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_5": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blockfrost": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1693412637, + "narHash": "sha256-uA2U7ZCdWv2Rxmi10uaMNNw8tiMbgcu2nnO6NTNp3VE=", + "owner": "blockfrost", + "repo": "blockfrost-backend-ryo", + "rev": "8d455ab1f710b7bd27d2aa87c82f0c5129101647", + "type": "github" + }, + "original": { + "owner": "blockfrost", + "ref": "v1.7.0", + "repo": "blockfrost-backend-ryo", "type": "github" } }, - "cabal-32_8": { + "blst": { "flake": false, "locked": { - "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", - "owner": "haskell", - "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "lastModified": 1656163412, + "narHash": "sha256-xero1aTe2v4IhWIJaEDUsVDOfE77dOV5zKeHWntHogY=", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", + "type": "github" + } + }, + "blst_2": { + "flake": false, + "locked": { + "lastModified": 1656163412, + "narHash": "sha256-xero1aTe2v4IhWIJaEDUsVDOfE77dOV5zKeHWntHogY=", + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", + "type": "github" + }, + "original": { + "owner": "supranational", + "repo": "blst", + "rev": "03b5124029979755c752eec45f3c29674b558446", + "type": "github" + } + }, + "byron-chain": { + "flake": false, + "locked": { + "lastModified": 1557232434, + "narHash": "sha256-2rclcOjIVq0lFCdYAa8S9imzZZHqySn2LZ/O48hUofw=", + "owner": "input-output-hk", + "repo": "cardano-mainnet-mirror", + "rev": "a31ac7534ec855b715b9a6bb6a06861ee94935d9", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "cardano-mainnet-mirror", "type": "github" } }, - "cabal-32_9": { + "cabal-32": { "flake": false, "locked": { "lastModified": 1603716527, - "narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=", + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { @@ -568,116 +867,116 @@ "type": "github" } }, - "cabal-34": { + "cabal-32_2": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_10": { + "cabal-32_3": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_11": { + "cabal-32_4": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_12": { + "cabal-32_5": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_2": { + "cabal-32_6": { "flake": false, "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_3": { + "cabal-32_7": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.4", + "ref": "3.2", "repo": "cabal", "type": "github" } }, - "cabal-34_4": { + "cabal-34": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1645834128, + "narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "5ff598c67f53f7c4f48e31d722ba37172230c462", "type": "github" }, "original": { @@ -687,14 +986,14 @@ "type": "github" } }, - "cabal-34_5": { + "cabal-34_2": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { @@ -704,7 +1003,7 @@ "type": "github" } }, - "cabal-34_6": { + "cabal-34_3": { "flake": false, "locked": { "lastModified": 1640353650, @@ -721,7 +1020,7 @@ "type": "github" } }, - "cabal-34_7": { + "cabal-34_4": { "flake": false, "locked": { "lastModified": 1640353650, @@ -738,14 +1037,14 @@ "type": "github" } }, - "cabal-34_8": { + "cabal-34_5": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { @@ -755,14 +1054,14 @@ "type": "github" } }, - "cabal-34_9": { + "cabal-34_6": { "flake": false, "locked": { - "lastModified": 1622475795, - "narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=", + "lastModified": 1645834128, + "narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=", "owner": "haskell", "repo": "cabal", - "rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049", + "rev": "5ff598c67f53f7c4f48e31d722ba37172230c462", "type": "github" }, "original": { @@ -772,31 +1071,31 @@ "type": "github" } }, - "cabal-36": { + "cabal-34_7": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", "owner": "haskell", "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", "type": "github" }, "original": { "owner": "haskell", - "ref": "3.6", + "ref": "3.4", "repo": "cabal", "type": "github" } }, - "cabal-36_10": { + "cabal-36": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "lastModified": 1669081697, + "narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=", "owner": "haskell", "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144", "type": "github" }, "original": { @@ -826,11 +1125,11 @@ "cabal-36_3": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1641652457, + "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "f27667f8ec360c475027dcaee0138c937477b070", "type": "github" }, "original": { @@ -843,11 +1142,11 @@ "cabal-36_4": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1641652457, + "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "f27667f8ec360c475027dcaee0138c937477b070", "type": "github" }, "original": { @@ -877,11 +1176,11 @@ "cabal-36_6": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "lastModified": 1669081697, + "narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=", "owner": "haskell", "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144", "type": "github" }, "original": { @@ -894,11 +1193,11 @@ "cabal-36_7": { "flake": false, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", + "lastModified": 1641652457, + "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", "owner": "haskell", "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "rev": "f27667f8ec360c475027dcaee0138c937477b070", "type": "github" }, "original": { @@ -908,80 +1207,106 @@ "type": "github" } }, - "cabal-36_8": { - "flake": false, + "capsules": { + "inputs": { + "bitte": "bitte_2", + "iogo": "iogo", + "nixpkgs": "nixpkgs_23", + "ragenix": "ragenix_2" + }, "locked": { - "lastModified": 1640163203, - "narHash": "sha256-TwDWP2CffT0j40W6zr0J1Qbu+oh3nsF1lUx9446qxZM=", - "owner": "haskell", - "repo": "cabal", - "rev": "ecf418050c1821f25e2e218f1be94c31e0465df1", + "lastModified": 1658156716, + "narHash": "sha256-c1lH7PIN0rTKdGgosD5fCsHoAklAtGR/E1DFT2exIkM=", + "owner": "input-output-hk", + "repo": "devshell-capsules", + "rev": "88348a415130cee29ce187140e6f57d94d843d54", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "devshell-capsules", "type": "github" } }, - "cabal-36_9": { - "flake": false, + "capsules_2": { + "inputs": { + "bitte": "bitte_3", + "iogo": "iogo_2", + "nixpkgs": "nixpkgs_52", + "ragenix": "ragenix_5" + }, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "lastModified": 1659466315, + "narHash": "sha256-VqR1PaC7lb4uT/s38lDNYvwhF2yQuD13KwGBoMCxF4g=", + "owner": "input-output-hk", + "repo": "devshell-capsules", + "rev": "125b8665c6139e3a127d243534a4f0ce36e3a335", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", + "owner": "input-output-hk", + "repo": "devshell-capsules", "type": "github" } }, - "cardano-configurations": { - "flake": false, + "cardano-automation": { + "inputs": { + "flake-utils": "flake-utils", + "haskellNix": [ + "ctl", + "cardano-node", + "haskellNix" + ], + "nixpkgs": [ + "ctl", + "cardano-node", + "nixpkgs" + ], + "tullia": [ + "ctl", + "cardano-node", + "tullia" + ] + }, "locked": { - "lastModified": 1671845278, - "narHash": "sha256-oOycxAu9kARfyUvkdjeq80Em7b+vP9XsBii8836f9yQ=", + "lastModified": 1679408951, + "narHash": "sha256-xM78upkrXjRu/739V/IxFrA9m+6rvgOiolt4ReKLAog=", "owner": "input-output-hk", - "repo": "cardano-configurations", - "rev": "36a75a920de312519c3a9086061daccb997f9cd0", + "repo": "cardano-automation", + "rev": "628f135d243d4a9e388c187e4c6179246038ee72", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-configurations", + "repo": "cardano-automation", "type": "github" } }, - "cardano-configurations_2": { + "cardano-configurations": { "flake": false, "locked": { - "lastModified": 1670462928, - "narHash": "sha256-nPeMzKeMAVTtWOBaYzC6xU/J0UCA79u3JBOk9mFKdF0=", + "lastModified": 1699561895, + "narHash": "sha256-bLNN6lJUe5dR1EOdtDspReE2fu2EV7hQMHFGDinxf5Y=", "owner": "input-output-hk", "repo": "cardano-configurations", - "rev": "5d3dfead99eca0996c5b838a5fbccc94eb670df5", + "rev": "d952529afdfdf6d53ce190b1bf8af990a7ae9590", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "cardano-configurations", + "rev": "d952529afdfdf6d53ce190b1bf8af990a7ae9590", "type": "github" } }, - "cardano-configurations_3": { + "cardano-configurations_2": { "flake": false, "locked": { - "lastModified": 1667387423, - "narHash": "sha256-oOycxAu9kARfyUvkdjeq80Em7b+vP9XsBii8836f9yQ=", + "lastModified": 1694019972, + "narHash": "sha256-TQEvb6W2VlOWxqIFa4r8UFBVbu82Bb2hRaDtN5Zbiuk=", "owner": "input-output-hk", "repo": "cardano-configurations", - "rev": "c0d11b5ff0c0200da00a50c17c38d9fd752ba532", + "rev": "65ef979cf69f420efca0a7aaf0412a610bc48097", "type": "github" }, "original": { @@ -990,104 +1315,42 @@ "type": "github" } }, - "cardano-mainnet-mirror": { - "inputs": { - "nixpkgs": "nixpkgs_3" - }, - "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", - "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", - "type": "github" - } - }, - "cardano-mainnet-mirror_2": { - "inputs": { - "nixpkgs": "nixpkgs_5" - }, - "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", - "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", - "type": "github" - } - }, - "cardano-mainnet-mirror_3": { - "inputs": { - "nixpkgs": "nixpkgs_6" - }, - "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", - "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", - "type": "github" - } - }, - "cardano-mainnet-mirror_4": { - "inputs": { - "nixpkgs": "nixpkgs_11" - }, + "cardano-explorer-app": { + "flake": false, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1655291958, + "narHash": "sha256-OByt95cIJrA8pXsvCztsWmFcDaQaSYGohSOHoaZWKJs=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-explorer-app", + "rev": "a65938afe159adb1d1e2808305a7316738f5e634", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "ref": "fix-nix-system", + "repo": "cardano-explorer-app", "type": "github" } }, - "cardano-mainnet-mirror_5": { - "inputs": { - "nixpkgs": "nixpkgs_13" - }, + "cardano-graphql": { + "flake": false, "locked": { - "lastModified": 1642701714, - "narHash": "sha256-SR3luE+ePX6U193EKE/KSEuVzWAW0YsyPYDC4hOvALs=", + "lastModified": 1657201429, + "narHash": "sha256-kx8Pe5HllnJceQHsBDB4hHcEQNSiq8D+OFFkRuuUFQE=", "owner": "input-output-hk", - "repo": "cardano-mainnet-mirror", - "rev": "819488be9eabbba6aaa7c931559bc584d8071e3d", + "repo": "cardano-graphql", + "rev": "ffb40028f51e23983c2ae27693bbdcd152208d9d", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "nix", - "repo": "cardano-mainnet-mirror", + "repo": "cardano-graphql", "type": "github" } }, - "cardano-mainnet-mirror_6": { + "cardano-mainnet-mirror": { "inputs": { - "nixpkgs": "nixpkgs_14" + "nixpkgs": "nixpkgs_2" }, "locked": { "lastModified": 1642701714, @@ -1107,159 +1370,54 @@ "cardano-node": { "inputs": { "CHaP": "CHaP_2", + "cardano-automation": "cardano-automation", "cardano-mainnet-mirror": "cardano-mainnet-mirror", - "cardano-node-workbench": [ - "ctl", - "ogmios", - "blank" - ], "customConfig": "customConfig", - "flake-compat": "flake-compat_2", + "em": "em", + "empty-flake": "empty-flake", + "flake-compat": "flake-compat", "hackageNix": "hackageNix", "haskellNix": "haskellNix", "hostNixpkgs": [ "ctl", - "ogmios", "cardano-node", "nixpkgs" ], "iohkNix": "iohkNix", - "nixTools": "nixTools", + "nix2container": "nix2container", "nixpkgs": [ "ctl", - "ogmios", "cardano-node", "haskellNix", "nixpkgs-unstable" ], - "node-measured": [ - "ctl", - "ogmios", - "blank" - ], - "node-process": "node-process", - "node-snapshot": "node-snapshot", - "plutus-apps": "plutus-apps", - "utils": "utils_4" - }, - "locked": { - "lastModified": 1667644902, - "narHash": "sha256-WRRzfpDc+YVmTNbN9LNYY4dS8o21p/6NoKxtcZmoAcg=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "ebc7be471b30e5931b35f9bbc236d21c375b91bb", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "1.35.4", - "repo": "cardano-node", - "type": "github" - } - }, - "cardano-node-snapshot": { - "inputs": { - "customConfig": "customConfig_3", - "haskellNix": "haskellNix_3", - "iohkNix": "iohkNix_3", - "membench": "membench_2", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "haskellNix", - "nixpkgs-2105" - ], - "utils": "utils" - }, - "locked": { - "lastModified": 1644954571, - "narHash": "sha256-c6MM1mQoS/AnTIrwaRmITK4L4i9lLNtkjOUHiseBtUs=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", - "type": "github" - } - }, - "cardano-node-snapshot_2": { - "inputs": { - "customConfig": "customConfig_7", - "haskellNix": "haskellNix_7", - "iohkNix": "iohkNix_7", - "membench": "membench_4", - "nixpkgs": [ + "ops-lib": "ops-lib", + "std": [ "ctl", - "ogmios-nixos", "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "haskellNix", - "nixpkgs-2105" + "tullia", + "std" ], - "utils": "utils_6" + "tullia": "tullia", + "utils": "utils_2" }, "locked": { - "lastModified": 1644954571, - "narHash": "sha256-c6MM1mQoS/AnTIrwaRmITK4L4i9lLNtkjOUHiseBtUs=", + "lastModified": 1687190129, + "narHash": "sha256-JCa9+QhZ2RVSIKkhz2WCZqTKCgdUSuezWS2YsQ5vhM4=", "owner": "input-output-hk", "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", + "rev": "6f79e5c3ea109a70cd01910368e011635767305a", "type": "github" }, "original": { "owner": "input-output-hk", + "ref": "8.1.1", "repo": "cardano-node", - "rev": "30d62b86e7b98da28ef8ad9412e4e00a1ba1231d", "type": "github" } }, "cardano-node_2": { - "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_4", - "cardano-node-workbench": [ - "ctl", - "ogmios-nixos", - "blank" - ], - "customConfig": "customConfig_5", - "flake-compat": "flake-compat_7", - "hackageNix": "hackageNix_2", - "haskellNix": "haskellNix_5", - "hostNixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "nixpkgs" - ], - "iohkNix": "iohkNix_5", - "nixTools": "nixTools_2", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "haskellNix", - "nixpkgs-unstable" - ], - "node-measured": [ - "ctl", - "ogmios-nixos", - "blank" - ], - "node-process": "node-process_2", - "node-snapshot": "node-snapshot_2", - "plutus-apps": "plutus-apps_2", - "utils": "utils_9" - }, + "flake": false, "locked": { "lastModified": 1659625017, "narHash": "sha256-4IrheFeoWfvkZQndEk4fGUkOiOjcVhcyXZ6IqmvkDgg=", @@ -1291,7 +1449,7 @@ "type": "github" } }, - "cardano-shell_10": { + "cardano-shell_2": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1307,7 +1465,7 @@ "type": "github" } }, - "cardano-shell_11": { + "cardano-shell_3": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1323,7 +1481,7 @@ "type": "github" } }, - "cardano-shell_12": { + "cardano-shell_4": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1339,7 +1497,7 @@ "type": "github" } }, - "cardano-shell_2": { + "cardano-shell_5": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1355,7 +1513,7 @@ "type": "github" } }, - "cardano-shell_3": { + "cardano-shell_6": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1371,7 +1529,7 @@ "type": "github" } }, - "cardano-shell_4": { + "cardano-shell_7": { "flake": false, "locked": { "lastModified": 1608537748, @@ -1387,120 +1545,158 @@ "type": "github" } }, - "cardano-shell_5": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" + "cardano-wallet": { + "inputs": { + "customConfig": "customConfig_2", + "ema": "ema", + "emanote": "emanote", + "flake-compat": "flake-compat_8", + "flake-utils": "flake-utils_25", + "haskellNix": "haskellNix_2", + "hostNixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "cardano-wallet", + "nixpkgs" + ], + "iohkNix": "iohkNix_2", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "cardano-wallet", + "haskellNix", + "nixpkgs-unstable" + ] }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_6": { - "flake": false, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1656674685, + "narHash": "sha256-Uq02O758v7U61a9Ol6VzSDyx3S/CVHn0l/OUM1UYJkY=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "cardano-wallet", + "rev": "c0ece6ad1868682b074708ffb810bdc2ea96934f", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", + "ref": "v2022-07-01", + "repo": "cardano-wallet", "type": "github" } }, - "cardano-shell_7": { - "flake": false, + "cardano-world": { + "inputs": { + "bitte": "bitte", + "bitte-cells": "bitte-cells", + "byron-chain": "byron-chain", + "capsules": "capsules_2", + "cardano-db-sync": [ + "ctl", + "db-sync" + ], + "cardano-explorer-app": "cardano-explorer-app", + "cardano-graphql": "cardano-graphql", + "cardano-node": "cardano-node_2", + "cardano-wallet": "cardano-wallet", + "data-merge": "data-merge_3", + "flake-compat": "flake-compat_9", + "hackage": "hackage_3", + "haskell-nix": "haskell-nix_2", + "iohk-nix": "iohk-nix", + "n2c": "n2c_3", + "nix-inclusive": "nix-inclusive", + "nixpkgs": "nixpkgs_63", + "nixpkgs-haskell": [ + "ctl", + "db-sync", + "cardano-world", + "haskell-nix", + "nixpkgs-unstable" + ], + "ogmios": "ogmios", + "std": "std_3", + "tullia": "tullia_2" + }, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1662508244, + "narHash": "sha256-s8kroVd8VAZ/Lfv2gNt+RzIuSnWpQxAAL0y90tn1i0o=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "cardano-world", + "rev": "0b6dcb5b61a0f7a2c048cb757463cbc0dfa0fe24", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", + "repo": "cardano-world", "type": "github" } }, - "cardano-shell_8": { - "flake": false, + "cicero": { + "inputs": { + "alejandra": "alejandra", + "data-merge": "data-merge_2", + "devshell": "devshell_8", + "driver": "driver", + "follower": "follower", + "haskell-nix": "haskell-nix", + "inclusive": "inclusive_8", + "nix": "nix_8", + "nix-cache-proxy": "nix-cache-proxy", + "nixpkgs": "nixpkgs_39", + "poetry2nix": "poetry2nix", + "utils": "utils_16" + }, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1647522107, + "narHash": "sha256-Kti1zv+GXnbujkJ0ODB2ukq4Eb2RVOpudZ1xVDhhbes=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "cicero", + "rev": "0fd8642fe437f6129fe6914f032d3fdc7591d4fe", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_9": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", + "repo": "cicero", "type": "github" } }, "ctl": { "inputs": { + "CHaP": "CHaP", + "blockfrost": "blockfrost", "cardano-configurations": "cardano-configurations", - "cardano-node": [ - "ctl", - "ogmios-nixos", - "cardano-node" - ], + "cardano-node": "cardano-node", + "db-sync": "db-sync", "easy-purescript-nix": "easy-purescript-nix", - "flake-compat": "flake-compat", - "iohk-nix-environments": "iohk-nix-environments", + "flake-compat": "flake-compat_11", + "hackage-nix": "hackage-nix", + "haskell-nix": "haskell-nix_3", + "hercules-ci-effects": "hercules-ci-effects", + "iohk-nix": "iohk-nix_2", "kupo": "kupo", "kupo-nixos": "kupo-nixos", "nixpkgs": [ "ctl", - "ogmios", - "nixpkgs" + "haskell-nix", + "nixpkgs-unstable" ], - "ogmios": "ogmios", + "ogmios": "ogmios_2", "ogmios-nixos": "ogmios-nixos", "plutip": "plutip" }, "locked": { - "lastModified": 1676722762, - "narHash": "sha256-E6fvOkRzE9h9SIqBMoMtN+yFKNOgh330zHvJCf0Pm7M=", + "lastModified": 1702645636, + "narHash": "sha256-GiSImwp0QoKheOhX7aftGpYayPdRdu3W1TcXY1GMUuk=", "owner": "Plutonomicon", "repo": "cardano-transaction-lib", - "rev": "ee5233d556bce8aee7fd1c2934641b72eecae196", + "rev": "a742692d605aabd75043aee9eef0ecdfec63eacc", "type": "github" }, "original": { "owner": "Plutonomicon", "repo": "cardano-transaction-lib", - "rev": "ee5233d556bce8aee7fd1c2934641b72eecae196", + "rev": "a742692d605aabd75043aee9eef0ecdfec63eacc", "type": "github" } }, @@ -1536,91 +1732,189 @@ }, "customConfig_3": { "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", - "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "lastModified": 1, + "narHash": "sha256-Zd5w1I1Dwt783Q4WuBuCpedcwG1DrIgQGqabyF87prM=", + "path": "./custom-config", + "type": "path" + }, + "original": { + "path": "./custom-config", + "type": "path" + } + }, + "data-merge": { + "inputs": { + "nixlib": "nixlib", + "yants": "yants_2" + }, + "locked": { + "lastModified": 1648237091, + "narHash": "sha256-OtgcOt/CB0/9S0rh1eAog+AvAg9kF6GyAknyWOXiAZI=", + "owner": "divnix", + "repo": "data-merge", + "rev": "b21bcf7bd949ac92af3930ecb1d3df8786384722", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "empty-flake", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "customConfig_4": { + "data-merge_2": { + "inputs": { + "nixlib": "nixlib_2" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", - "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "lastModified": 1635967744, + "narHash": "sha256-01065dNad3BIepNzrpYuYInxq/ynqtGMSsIiNqjND7E=", + "owner": "divnix", + "repo": "data-merge", + "rev": "68bd71f980f75cf73bc5071982eddfe6bc089768", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "empty-flake", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "customConfig_5": { + "data-merge_3": { + "inputs": { + "nixlib": "nixlib_3", + "yants": "yants_4" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1655854240, + "narHash": "sha256-j74ixD7Y0bF3h0fBJFKPR9botlrMu0fgG/YsiUKybko=", + "owner": "divnix", + "repo": "data-merge", + "rev": "0bbe0a68d4ee090b8bbad0c5e1e85060d2bdfe98", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "db-sync": { + "inputs": { + "cardano-world": "cardano-world", + "customConfig": "customConfig_3", + "flake-compat": "flake-compat_10", + "haskellNix": "haskellNix_3", + "iohkNix": "iohkNix_3", + "nixpkgs": [ + "ctl", + "db-sync", + "haskellNix", + "nixpkgs-unstable" + ], + "utils": "utils_23" + }, + "locked": { + "lastModified": 1670313550, + "narHash": "sha256-Gkn/hyK0xiDJZY1O5JEwuosMzar+IskC9xxeBts+0H4=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "cardano-db-sync", + "rev": "1040fa9ec85fd75ce9f02dae2006170136793d02", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "ref": "13.1.0.0", + "repo": "cardano-db-sync", "type": "github" } }, - "customConfig_6": { + "deploy": { + "inputs": { + "fenix": "fenix", + "flake-compat": "flake-compat_4", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "deploy", + "fenix", + "nixpkgs" + ], + "utils": "utils_3" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1638318651, + "narHash": "sha256-YsYBMa8Chtb6ccGZOVStReiZ33ZNmi7kNPLf/Ua2kY8=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "deploy-rs", + "rev": "1d3a4f4681a98479219c628165bb6b3a12eae843", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "repo": "deploy-rs", "type": "github" } }, - "customConfig_7": { + "deploy_2": { + "inputs": { + "fenix": "fenix_3", + "flake-compat": "flake-compat_5", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "deploy", + "fenix", + "nixpkgs" + ], + "utils": "utils_9" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1638318651, + "narHash": "sha256-YsYBMa8Chtb6ccGZOVStReiZ33ZNmi7kNPLf/Ua2kY8=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "deploy-rs", + "rev": "1d3a4f4681a98479219c628165bb6b3a12eae843", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "repo": "deploy-rs", "type": "github" } }, - "customConfig_8": { + "deploy_3": { + "inputs": { + "fenix": "fenix_5", + "flake-compat": "flake-compat_6", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "capsules", + "bitte", + "deploy", + "fenix", + "nixpkgs" + ], + "utils": "utils_17" + }, "locked": { - "lastModified": 1630400035, - "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "lastModified": 1638318651, + "narHash": "sha256-YsYBMa8Chtb6ccGZOVStReiZ33ZNmi7kNPLf/Ua2kY8=", "owner": "input-output-hk", - "repo": "empty-flake", - "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", + "repo": "deploy-rs", + "rev": "1d3a4f4681a98479219c628165bb6b3a12eae843", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "empty-flake", + "repo": "deploy-rs", "type": "github" } }, @@ -1628,16 +1922,14 @@ "inputs": { "flake-utils": [ "ctl", - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "flake-utils" ], "nixpkgs": [ "ctl", - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" @@ -1657,31 +1949,13 @@ "type": "github" } }, - "devshell_2": { - "inputs": { - "flake-utils": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "flake-utils" - ], - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] - }, + "devshell_10": { "locked": { - "lastModified": 1663445644, - "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", "owner": "numtide", "repo": "devshell", - "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", "type": "github" }, "original": { @@ -1690,33 +1964,28 @@ "type": "github" } }, - "devshell_3": { - "inputs": { - "flake-utils": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "flake-utils" - ], - "nixpkgs": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] + "devshell_11": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_12": { "locked": { - "lastModified": 1663445644, - "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", "owner": "numtide", "repo": "devshell", - "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", "type": "github" }, "original": { @@ -1725,4117 +1994,5483 @@ "type": "github" } }, - "dmerge": { - "inputs": { - "nixlib": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ], - "yants": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "std", - "yants" - ] + "devshell_13": { + "locked": { + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", + "type": "github" }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_14": { "locked": { - "lastModified": 1659548052, - "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", - "owner": "divnix", - "repo": "data-merge", - "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "lastModified": 1637098489, + "narHash": "sha256-IWBYLSNSENI/fTrXdYDhuCavxcgN9+RERrPM81f6DXY=", + "owner": "numtide", + "repo": "devshell", + "rev": "e8c2d4967b5c498b12551d1bb49352dcf9efa3e4", "type": "github" }, "original": { - "owner": "divnix", - "repo": "data-merge", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "dmerge_2": { + "devshell_15": { "inputs": { - "nixlib": [ + "flake-utils": [ "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", - "nixpkgs" + "flake-utils" ], - "yants": [ + "nixpkgs": [ "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", "std", - "yants" + "nixpkgs" ] }, "locked": { - "lastModified": 1659548052, - "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", - "owner": "divnix", - "repo": "data-merge", - "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "lastModified": 1658746384, + "narHash": "sha256-CCJcoMOcXyZFrV1ag4XMTpAPjLWb4Anbv+ktXFI1ry0=", + "owner": "numtide", + "repo": "devshell", + "rev": "0ffc7937bb5e8141af03d462b468bd071eb18e1b", "type": "github" }, "original": { - "owner": "divnix", - "repo": "data-merge", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "dmerge_3": { + "devshell_16": { "inputs": { - "nixlib": [ + "flake-utils": "flake-utils_31", + "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", + "db-sync", + "cardano-world", "tullia", "std", "nixpkgs" - ], - "yants": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "yants" ] }, "locked": { - "lastModified": 1659548052, - "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", - "owner": "divnix", - "repo": "data-merge", - "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "lastModified": 1650900878, + "narHash": "sha256-qhNncMBSa9STnhiLfELEQpYC1L4GrYHNIzyCZ/pilsI=", + "owner": "numtide", + "repo": "devshell", + "rev": "d97df53b5ddaa1cfbea7cddbd207eb2634304733", "type": "github" }, "original": { - "owner": "divnix", - "repo": "data-merge", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "easy-purescript-nix": { - "flake": false, + "devshell_2": { "locked": { - "lastModified": 1666686938, - "narHash": "sha256-/UOLRdnEhIOcxcm5ouOipOiSgHRzJde0ccAx4xB1dnU=", - "owner": "justinwoo", - "repo": "easy-purescript-nix", - "rev": "da7acb2662961fd355f0a01a25bd32bf33577fa8", + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", "type": "github" }, "original": { - "owner": "justinwoo", - "repo": "easy-purescript-nix", - "rev": "da7acb2662961fd355f0a01a25bd32bf33577fa8", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat": { - "flake": false, + "devshell_3": { "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_10": { - "flake": false, + "devshell_4": { "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "lastModified": 1637098489, + "narHash": "sha256-IWBYLSNSENI/fTrXdYDhuCavxcgN9+RERrPM81f6DXY=", + "owner": "numtide", + "repo": "devshell", + "rev": "e8c2d4967b5c498b12551d1bb49352dcf9efa3e4", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_11": { - "flake": false, + "devshell_5": { "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_12": { - "flake": false, + "devshell_6": { "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", - "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "lastModified": 1636119665, + "narHash": "sha256-e11Z9PyH9hdgTm4Vyl8S5iTwrv0um6+srzb1Ba+YUHA=", + "owner": "numtide", + "repo": "devshell", + "rev": "ab14b1a3cb253f58e02f5f849d621292fbf81fad", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_13": { - "flake": false, + "devshell_7": { + "inputs": { + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "std", + "flake-utils" + ], + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "std", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "lastModified": 1658746384, + "narHash": "sha256-CCJcoMOcXyZFrV1ag4XMTpAPjLWb4Anbv+ktXFI1ry0=", + "owner": "numtide", + "repo": "devshell", + "rev": "0ffc7937bb5e8141af03d462b468bd071eb18e1b", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_14": { - "flake": false, + "devshell_8": { + "inputs": { + "flake-utils": "flake-utils_15", + "nixpkgs": "nixpkgs_36" + }, "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "lastModified": 1644227066, + "narHash": "sha256-FHcFZtpZEWnUh62xlyY3jfXAXHzJNEDLDzLsJxn+ve0=", + "owner": "numtide", + "repo": "devshell", + "rev": "7033f64dd9ef8d9d8644c5030c73913351d2b660", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_15": { - "flake": false, + "devshell_9": { "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "lastModified": 1632436039, + "narHash": "sha256-OtITeVWcKXn1SpVEnImpTGH91FycCskGBPqmlxiykv4=", + "owner": "numtide", + "repo": "devshell", + "rev": "7a7a7aa0adebe5488e5abaec688fd9ae0f8ea9c6", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "flake-compat_2": { - "flake": false, + "dmerge": { + "inputs": { + "nixlib": [ + "ctl", + "cardano-node", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "ctl", + "cardano-node", + "tullia", + "std", + "yants" + ] + }, "locked": { - "lastModified": 1647532380, - "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", - "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "7da118186435255a30b5ffeabba9629c344c0bec", + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "fixes", - "repo": "flake-compat", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "flake-compat_3": { - "flake": false, + "dmerge_2": { + "inputs": { + "nixlib": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "std", + "nixpkgs" + ], + "yants": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "std", + "yants" + ] + }, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", - "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "flake-compat", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "flake-compat_4": { - "flake": false, + "dmerge_3": { + "inputs": { + "nixlib": [ + "ctl", + "db-sync", + "cardano-world", + "std", + "nixpkgs" + ], + "yants": [ + "ctl", + "db-sync", + "cardano-world", + "std", + "yants" + ] + }, "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "divnix", + "repo": "data-merge", "type": "github" } }, - "flake-compat_5": { - "flake": false, + "driver": { + "inputs": { + "devshell": "devshell_9", + "inclusive": "inclusive_6", + "nix": "nix_7", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ], + "utils": "utils_13" + }, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "lastModified": 1644418487, + "narHash": "sha256-nzFmmBYjNjWVy25bHLLmZECfwJm3nxcAr/mYVYxWggA=", "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "repo": "nomad-driver-nix", + "rev": "7f7adb6814b4bf926597e4b810b803140176122c", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "flake-compat", + "repo": "nomad-driver-nix", "type": "github" } }, - "flake-compat_6": { + "easy-purescript-nix": { "flake": false, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "lastModified": 1696584097, + "narHash": "sha256-a9Hhqf/Fi0FkjRTcQr3pYDhrO9A9tdOkaeVgD23Cdrk=", + "owner": "justinwoo", + "repo": "easy-purescript-nix", + "rev": "d5fe5f4b210a0e4bac42ae0c159596a49c5eb016", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "justinwoo", + "repo": "easy-purescript-nix", "type": "github" } }, - "flake-compat_7": { + "em": { "flake": false, "locked": { - "lastModified": 1647532380, - "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", - "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "7da118186435255a30b5ffeabba9629c344c0bec", + "lastModified": 1684791668, + "narHash": "sha256-JyPm0RiWCfy/8rs7wd/IRSWIz+bTkD78uxIMnKktU2g=", + "owner": "deepfire", + "repo": "em", + "rev": "302cdf6d654fb18baff0213bdfa41a653774585a", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "fixes", - "repo": "flake-compat", + "owner": "deepfire", + "repo": "em", "type": "github" } }, - "flake-compat_8": { - "flake": false, + "ema": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_22", + "nixpkgs": "nixpkgs_54", + "pre-commit-hooks": "pre-commit-hooks" + }, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "lastModified": 1646661767, + "narHash": "sha256-5zxUr3nO4r04K5WGrW/+nW84qbOW8wNJLt902yQmyF4=", + "owner": "srid", + "repo": "ema", + "rev": "bcabc170b7de9cdd83b4bbcf59130b54933602ea", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "srid", + "repo": "ema", "type": "github" } }, - "flake-compat_9": { + "ema_2": { "flake": false, "locked": { - "lastModified": 1635892615, - "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", - "owner": "input-output-hk", - "repo": "flake-compat", - "rev": "eca47d3377946315596da653862d341ee5341318", + "lastModified": 1655231448, + "narHash": "sha256-LmAnOFKiqOWW9cQNZCbqFF0N1Mx073908voXz+4Fzic=", + "owner": "srid", + "repo": "ema", + "rev": "da5b29f03c1edfb7f947666a5a818fb97cc3c229", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "flake-compat", + "owner": "srid", + "ref": "multisite", + "repo": "ema", "type": "github" } }, - "flake-utils": { + "emanote": { + "inputs": { + "ema": "ema_2", + "flake-parts": "flake-parts", + "haskell-flake": "haskell-flake", + "nixpkgs": "nixpkgs_57", + "tailwind-haskell": "tailwind-haskell" + }, "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "lastModified": 1655823900, + "narHash": "sha256-YEDJxa2gPf2+GGyrkFz4EliCml1FyDualZtbbZEmljA=", + "owner": "srid", + "repo": "emanote", + "rev": "147528d9df81b881214652ce0cefec0b3d52965e", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "srid", + "repo": "emanote", "type": "github" } }, - "flake-utils_10": { + "empty-flake": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "lastModified": 1630400035, + "narHash": "sha256-MWaVOCzuFwp09wZIW9iHq5wWen5C69I940N1swZLEQ0=", + "owner": "input-output-hk", + "repo": "empty-flake", + "rev": "2040a05b67bf9a669ce17eca56beb14b4206a99a", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "input-output-hk", + "repo": "empty-flake", "type": "github" } }, - "flake-utils_11": { + "fenix": { + "inputs": { + "nixpkgs": "nixpkgs_13", + "rust-analyzer-src": "rust-analyzer-src" + }, "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "lastModified": 1645165506, + "narHash": "sha256-PClhTeC1EhkHUQQmP9XyiR7y1d6hlEc7QY8nN1GuAzQ=", + "owner": "nix-community", + "repo": "fenix", + "rev": "380b82e3d3381b32f11dfe024cb7d135e36d0168", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, - "flake-utils_12": { + "fenix_2": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "nixpkgs-unstable" + ], + "rust-analyzer-src": "rust-analyzer-src_2" + }, "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "lastModified": 1649226351, + "narHash": "sha256-5fQwF5kYpPC7w0SOfdbE9Z7o5/i/dyo1BxMLVCA2h3E=", + "owner": "nix-community", + "repo": "fenix", + "rev": "c7e184561fe843abb861cd7d22c23066987078e2", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, - "flake-utils_13": { + "fenix_3": { + "inputs": { + "nixpkgs": "nixpkgs_26", + "rust-analyzer-src": "rust-analyzer-src_3" + }, "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "lastModified": 1645165506, + "narHash": "sha256-PClhTeC1EhkHUQQmP9XyiR7y1d6hlEc7QY8nN1GuAzQ=", + "owner": "nix-community", + "repo": "fenix", + "rev": "380b82e3d3381b32f11dfe024cb7d135e36d0168", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, - "flake-utils_14": { + "fenix_4": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "nixpkgs-unstable" + ], + "rust-analyzer-src": "rust-analyzer-src_4" + }, "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "lastModified": 1660631227, + "narHash": "sha256-LSXmaDhbPw+3ww63Rx5ewBNWwCQIrzQvzphCFm5BRbU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "41731c1a7ba1441c7544e8a0387aaf58e48f26b8", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, - "flake-utils_15": { + "fenix_5": { + "inputs": { + "nixpkgs": "nixpkgs_42", + "rust-analyzer-src": "rust-analyzer-src_5" + }, "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "lastModified": 1645165506, + "narHash": "sha256-PClhTeC1EhkHUQQmP9XyiR7y1d6hlEc7QY8nN1GuAzQ=", + "owner": "nix-community", + "repo": "fenix", + "rev": "380b82e3d3381b32f11dfe024cb7d135e36d0168", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, - "flake-utils_16": { + "fenix_6": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "capsules", + "bitte", + "nixpkgs-unstable" + ], + "rust-analyzer-src": "rust-analyzer-src_6" + }, "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "lastModified": 1649226351, + "narHash": "sha256-5fQwF5kYpPC7w0SOfdbE9Z7o5/i/dyo1BxMLVCA2h3E=", + "owner": "nix-community", + "repo": "fenix", + "rev": "c7e184561fe843abb861cd7d22c23066987078e2", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "nix-community", + "repo": "fenix", "type": "github" } }, - "flake-utils_17": { + "flake-compat": { + "flake": false, "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "lastModified": 1647532380, + "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "7da118186435255a30b5ffeabba9629c344c0bec", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "input-output-hk", + "ref": "fixes", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_18": { + "flake-compat_10": { + "flake": false, "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "lastModified": 1647532380, + "narHash": "sha256-wswAxyO8AJTH7d5oU8VK82yBCpqwA+p6kLgpb1f1PAY=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "7da118186435255a30b5ffeabba9629c344c0bec", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "input-output-hk", + "ref": "fixes", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_19": { + "flake-compat_11": { + "flake": false, "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_2": { + "flake-compat_12": { + "flake": false, "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "lastModified": 1672831974, + "narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "45f2638735f8cdc40fe302742b79f248d23eb368", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "input-output-hk", + "ref": "hkm/gitlab-fix", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_20": { + "flake-compat_13": { + "flake": false, "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_21": { + "flake-compat_14": { + "flake": false, "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_3": { + "flake-compat_15": { + "flake": false, "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_4": { + "flake-compat_2": { + "flake": false, "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "lastModified": 1672831974, + "narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "45f2638735f8cdc40fe302742b79f248d23eb368", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "input-output-hk", + "ref": "hkm/gitlab-fix", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_5": { + "flake-compat_3": { + "flake": false, "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_6": { + "flake-compat_4": { + "flake": false, "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_7": { + "flake-compat_5": { + "flake": false, "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", - "type": "github" + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", + "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_8": { + "flake-compat_6": { + "flake": false, "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "flake-utils_9": { + "flake-compat_7": { + "flake": false, "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "lastModified": 1641205782, + "narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "ghc-8.6.5-iohk": { + "flake-compat_8": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "repo": "flake-compat", "type": "github" } }, - "ghc-8.6.5-iohk_10": { + "flake-compat_9": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "ghc-8.6.5-iohk_11": { - "flake": false, + "flake-parts": { + "inputs": { + "nixpkgs": "nixpkgs_56" + }, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1655570068, + "narHash": "sha256-KUSd2a6KgYTHd2l3Goee/P+DrAC6n1Tau+7V68czSZU=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "6dbc77b9c0477f8a9a6a9081077bb38c6a3dbb3a", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "hercules-ci", + "repo": "flake-parts", "type": "github" } }, - "ghc-8.6.5-iohk_12": { - "flake": false, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "ctl", + "hercules-ci-effects", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1696343447, + "narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" + "id": "flake-parts", + "type": "indirect" } }, - "ghc-8.6.5-iohk_2": { - "flake": false, + "flake-utils": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_3": { - "flake": false, + "flake-utils_10": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_4": { - "flake": false, + "flake-utils_11": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_5": { - "flake": false, + "flake-utils_12": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_6": { - "flake": false, + "flake-utils_13": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1656928814, + "narHash": "sha256-RIFfgBuKz6Hp89yRr7+NR5tzIAbn52h8vT6vXkYjZoM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e2a3b3dfd9af950a856d66b0a7d01e3c18aa249", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_7": { - "flake": false, + "flake-utils_14": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1634851050, + "narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c91f3de5adaf1de973b797ef7485e441a65b8935", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_8": { - "flake": false, + "flake-utils_15": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "ghc-8.6.5-iohk_9": { - "flake": false, + "flake-utils_16": { "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "gomod2nix": { - "inputs": { - "nixpkgs": "nixpkgs_8", - "utils": "utils_5" - }, + "flake-utils_17": { "locked": { - "lastModified": 1655245309, - "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", - "owner": "tweag", - "repo": "gomod2nix", - "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", "type": "github" }, "original": { - "owner": "tweag", - "repo": "gomod2nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "gomod2nix_2": { - "inputs": { - "nixpkgs": "nixpkgs_16", - "utils": "utils_10" - }, + "flake-utils_18": { "locked": { - "lastModified": 1655245309, - "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", - "owner": "tweag", - "repo": "gomod2nix", - "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "tweag", - "repo": "gomod2nix", - "type": "github" + "owner": "numtide", + "repo": "flake-utils", + "type": "github" } }, - "gomod2nix_3": { - "inputs": { - "nixpkgs": "nixpkgs_20", - "utils": "utils_11" - }, + "flake-utils_19": { "locked": { - "lastModified": 1655245309, - "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", - "owner": "tweag", - "repo": "gomod2nix", - "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "tweag", - "repo": "gomod2nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage": { - "flake": false, + "flake-utils_2": { "locked": { - "lastModified": 1654219082, - "narHash": "sha256-sm59eg5wSrfIAjNXfBaaOBQ8daghF3g1NiGazYfj+no=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "fc90e7c5dea0483bacb01fc00bd2ab8f8e72500d", + "lastModified": 1679360468, + "narHash": "sha256-LGnza3cfXF10Biw3ZTg0u9o9t7s680Ww200t5KkHTh8=", + "owner": "hamishmack", + "repo": "flake-utils", + "rev": "e1ea268ff47ad475443dbabcd54744b4e5b9d4f5", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "hamishmack", + "ref": "hkm/nested-hydraJobs", + "repo": "flake-utils", "type": "github" } }, - "hackageNix": { - "flake": false, + "flake-utils_20": { "locked": { - "lastModified": 1665882657, - "narHash": "sha256-3eiHY9Lt2vTeMsrT6yssbd+nfx/i5avfxosigx7bCxU=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "8e5b6856f99ed790c387fa76bdad9dcc94b3a54c", + "lastModified": 1634851050, + "narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c91f3de5adaf1de973b797ef7485e441a65b8935", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackageNix_2": { - "flake": false, + "flake-utils_21": { "locked": { - "lastModified": 1656898050, - "narHash": "sha256-jemAb/Wm/uT+QhV12GlyeA5euSWxYzr2HOYoK4MZps0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4f1dd530219ca1165f523ffb2c62213ebede4046", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_10": { - "flake": false, + "flake-utils_22": { "locked": { - "lastModified": 1669338728, - "narHash": "sha256-a+/QK3TeSgzLnL1z/EkqROo3cwB6VXV3BmvkvvGPSzM=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "d044e9fd6eb02330eda094e3b7a61d4d23f8544a", + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_2": { - "flake": false, + "flake-utils_23": { "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", + "lastModified": 1619345332, + "narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_3": { - "flake": false, + "flake-utils_24": { "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", + "lastModified": 1652776076, + "narHash": "sha256-gzTw/v1vj4dOVbpBSJX4J0DwUR6LIyXo7/SuuTJp1kM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "04c1b180862888302ddfb2e3ad9eaa63afc60cf8", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "ref": "v1.0.0", + "repo": "flake-utils", "type": "github" } }, - "hackage_4": { - "flake": false, + "flake-utils_25": { "locked": { - "lastModified": 1639098768, - "narHash": "sha256-DZ4sG8FeDxWvBLixrj0jELXjtebZ0SCCPmQW43HNzIE=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "c7b123af6b0b9b364cab03363504d42dca16a4b5", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_5": { - "flake": false, + "flake-utils_26": { "locked": { - "lastModified": 1669857312, - "narHash": "sha256-m0jYF2gOKTaCcedV+dZkCjVbfv0CWkRziCeEk/NF/34=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "8299f5acc68f0e91563e7688f24cbc70391600bf", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_6": { - "flake": false, + "flake-utils_27": { "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_7": { - "flake": false, + "flake-utils_28": { "locked": { - "lastModified": 1643073363, - "narHash": "sha256-66oSXQKEDIOSQ2uKAS9facCX/Zuh/jFgyFDtxEqN9sk=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "4ef9bd3a32316ce236164c7ebff00ebeb33236e2", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_8": { - "flake": false, + "flake-utils_29": { "locked": { - "lastModified": 1639098768, - "narHash": "sha256-DZ4sG8FeDxWvBLixrj0jELXjtebZ0SCCPmQW43HNzIE=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "c7b123af6b0b9b364cab03363504d42dca16a4b5", + "lastModified": 1656928814, + "narHash": "sha256-RIFfgBuKz6Hp89yRr7+NR5tzIAbn52h8vT6vXkYjZoM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e2a3b3dfd9af950a856d66b0a7d01e3c18aa249", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "hackage_9": { - "flake": false, + "flake-utils_3": { "locked": { - "lastModified": 1667783503, - "narHash": "sha256-25ZZPMQi9YQbXz3tZYPECVUI0FAQkJcDUIA/v8+mo9E=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "1f77f69e6dd92b5130cbe681b74e8fc0d29d63ff", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskell-nix": { - "inputs": { - "HTTP": "HTTP", - "cabal-32": "cabal-32", - "cabal-34": "cabal-34", - "cabal-36": "cabal-36", - "cardano-shell": "cardano-shell", - "flake-utils": "flake-utils", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk", - "hackage": "hackage", - "hpc-coveralls": "hpc-coveralls", - "hydra": "hydra", - "nix-tools": "nix-tools", - "nixpkgs": [ - "ctl", - "kupo-nixos", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003", - "nixpkgs-2105": "nixpkgs-2105", - "nixpkgs-2111": "nixpkgs-2111", - "nixpkgs-unstable": "nixpkgs-unstable", - "old-ghc-nix": "old-ghc-nix", - "stackage": "stackage" - }, + "flake-utils_30": { "locked": { - "lastModified": 1654219238, - "narHash": "sha256-PMS7uSQjYCjsjUfVidTdKcuNtKNu5VPmeNvxruT72go=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskell-nix_2": { - "inputs": { - "HTTP": "HTTP_6", - "cabal-32": "cabal-32_6", - "cabal-34": "cabal-34_6", - "cabal-36": "cabal-36_5", - "cardano-shell": "cardano-shell_6", - "flake-compat": "flake-compat_5", - "flake-utils": "flake-utils_6", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_6", - "hackage": "hackage_5", - "hpc-coveralls": "hpc-coveralls_6", - "hydra": "hydra_3", - "iserv-proxy": "iserv-proxy", - "nixpkgs": [ - "ctl", - "ogmios", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_6", - "nixpkgs-2105": "nixpkgs-2105_6", - "nixpkgs-2111": "nixpkgs-2111_6", - "nixpkgs-2205": "nixpkgs-2205_2", - "nixpkgs-2211": "nixpkgs-2211", - "nixpkgs-unstable": "nixpkgs-unstable_6", - "old-ghc-nix": "old-ghc-nix_6", - "stackage": "stackage_6", - "tullia": "tullia" - }, + "flake-utils_31": { "locked": { - "lastModified": 1670464865, - "narHash": "sha256-OP4w1Cc2xXKya5GbViX2PwX4Gre/GyE2gT9NIVzcIyw=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "6c992eacf65c19e29ae5296b11def11813179643", + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskell-nix_3": { - "inputs": { - "HTTP": "HTTP_11", - "cabal-32": "cabal-32_11", - "cabal-34": "cabal-34_11", - "cabal-36": "cabal-36_9", - "cardano-shell": "cardano-shell_11", - "flake-compat": "flake-compat_9", - "flake-utils": "flake-utils_14", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_11", - "hackage": "hackage_9", - "hpc-coveralls": "hpc-coveralls_11", - "hydra": "hydra_5", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_11", - "nixpkgs-2105": "nixpkgs-2105_11", - "nixpkgs-2111": "nixpkgs-2111_11", - "nixpkgs-2205": "nixpkgs-2205_3", - "nixpkgs-unstable": "nixpkgs-unstable_11", - "old-ghc-nix": "old-ghc-nix_11", - "stackage": "stackage_11", - "tullia": "tullia_2" - }, + "flake-utils_32": { "locked": { - "lastModified": 1667783630, - "narHash": "sha256-IzbvNxsOVxHJGY70qAzaEOPmz4Fw93+4qLFd2on/ZAc=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f1f330065199dc4eca017bc21de0c67bc46df393", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" + "owner": "numtide", + "repo": "flake-utils", + "type": "github" } }, - "haskell-nix_4": { - "inputs": { - "HTTP": "HTTP_12", - "cabal-32": "cabal-32_12", - "cabal-34": "cabal-34_12", - "cabal-36": "cabal-36_10", - "cardano-shell": "cardano-shell_12", - "flake-compat": "flake-compat_12", - "flake-utils": "flake-utils_18", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_12", - "hackage": "hackage_10", - "hpc-coveralls": "hpc-coveralls_12", - "hydra": "hydra_6", - "nixpkgs": [ - "ctl", - "plutip", - "bot-plutus-interface", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_12", - "nixpkgs-2105": "nixpkgs-2105_12", - "nixpkgs-2111": "nixpkgs-2111_12", - "nixpkgs-2205": "nixpkgs-2205_4", - "nixpkgs-unstable": "nixpkgs-unstable_12", - "old-ghc-nix": "old-ghc-nix_12", - "stackage": "stackage_12", - "tullia": "tullia_3" - }, + "flake-utils_33": { "locked": { - "lastModified": 1669338917, - "narHash": "sha256-jwZ/I4VXGvpDkC/59c3rQPNBpQdTirJwXEu5KejJIHo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "7f8ccbda20e5ab12780162f045656061334b531a", + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix": { - "inputs": { - "HTTP": "HTTP_2", - "cabal-32": "cabal-32_2", - "cabal-34": "cabal-34_2", - "cabal-36": "cabal-36_2", - "cardano-shell": "cardano-shell_2", - "flake-compat": "flake-compat_3", - "flake-utils": "flake-utils_2", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_2", - "hackage": [ - "ctl", - "ogmios", - "cardano-node", - "hackageNix" - ], - "hpc-coveralls": "hpc-coveralls_2", - "hydra": "hydra_2", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_2", - "nixpkgs-2105": "nixpkgs-2105_2", - "nixpkgs-2111": "nixpkgs-2111_2", - "nixpkgs-2205": "nixpkgs-2205", - "nixpkgs-unstable": "nixpkgs-unstable_2", - "old-ghc-nix": "old-ghc-nix_2", - "stackage": "stackage_2" - }, + "flake-utils_4": { "locked": { - "lastModified": 1665882789, - "narHash": "sha256-vD9voCqq4F100RDO3KlfdKZE81NyD++NJjvf3KNNbHA=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "9af167fb4343539ca99465057262f289b44f55da", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix_2": { - "inputs": { - "HTTP": "HTTP_3", - "cabal-32": "cabal-32_3", - "cabal-34": "cabal-34_3", - "cabal-36": "cabal-36_3", - "cardano-shell": "cardano-shell_3", - "flake-utils": "flake-utils_3", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_3", - "hackage": "hackage_2", - "hpc-coveralls": "hpc-coveralls_3", - "nix-tools": "nix-tools_2", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_3", - "nixpkgs-2105": "nixpkgs-2105_3", - "nixpkgs-2111": "nixpkgs-2111_3", - "nixpkgs-unstable": "nixpkgs-unstable_3", - "old-ghc-nix": "old-ghc-nix_3", - "stackage": "stackage_3" - }, + "flake-utils_5": { "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix_3": { - "inputs": { - "HTTP": "HTTP_4", - "cabal-32": "cabal-32_4", - "cabal-34": "cabal-34_4", - "cabal-36": "cabal-36_4", - "cardano-shell": "cardano-shell_4", - "flake-utils": "flake-utils_4", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_4", - "hackage": "hackage_3", - "hpc-coveralls": "hpc-coveralls_4", - "nix-tools": "nix-tools_3", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_4", - "nixpkgs-2105": "nixpkgs-2105_4", - "nixpkgs-2111": "nixpkgs-2111_4", - "nixpkgs-unstable": "nixpkgs-unstable_4", - "old-ghc-nix": "old-ghc-nix_4", - "stackage": "stackage_4" - }, + "flake-utils_6": { "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix_4": { - "inputs": { - "HTTP": "HTTP_5", - "cabal-32": "cabal-32_5", - "cabal-34": "cabal-34_5", - "cardano-shell": "cardano-shell_5", - "flake-utils": "flake-utils_5", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_5", - "hackage": "hackage_4", - "hpc-coveralls": "hpc-coveralls_5", - "nix-tools": "nix-tools_4", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "plutus-example", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_5", - "nixpkgs-2105": "nixpkgs-2105_5", - "nixpkgs-2111": "nixpkgs-2111_5", - "nixpkgs-unstable": "nixpkgs-unstable_5", - "old-ghc-nix": "old-ghc-nix_5", - "stackage": "stackage_5" - }, + "flake-utils_7": { "locked": { - "lastModified": 1639098904, - "narHash": "sha256-7VrCNEaKGLm4pTOS11dt1dRL2033oqrNCfal0uONsqA=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "b18c6ce0867fee77f12ecf41dc6c67f7a59d9826", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix_5": { - "inputs": { - "HTTP": "HTTP_7", - "cabal-32": "cabal-32_7", - "cabal-34": "cabal-34_7", - "cabal-36": "cabal-36_6", - "cardano-shell": "cardano-shell_7", - "flake-utils": "flake-utils_10", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_7", - "hackage": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "hackageNix" - ], - "hpc-coveralls": "hpc-coveralls_7", - "hydra": "hydra_4", - "nix-tools": "nix-tools_5", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_7", - "nixpkgs-2105": "nixpkgs-2105_7", - "nixpkgs-2111": "nixpkgs-2111_7", - "nixpkgs-unstable": "nixpkgs-unstable_7", - "old-ghc-nix": "old-ghc-nix_7", - "stackage": "stackage_7" - }, + "flake-utils_8": { "locked": { - "lastModified": 1656898207, - "narHash": "sha256-hshNfCnrmhIvM4T+O0/JRZymsHmq9YiIJ4bpzNVTD98=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "21230476adfef5fa77fb19fbda396f22006a02bc", + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix_6": { - "inputs": { - "HTTP": "HTTP_8", - "cabal-32": "cabal-32_8", - "cabal-34": "cabal-34_8", - "cabal-36": "cabal-36_7", - "cardano-shell": "cardano-shell_8", - "flake-utils": "flake-utils_11", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_8", - "hackage": "hackage_6", - "hpc-coveralls": "hpc-coveralls_8", - "nix-tools": "nix-tools_6", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_8", - "nixpkgs-2105": "nixpkgs-2105_8", - "nixpkgs-2111": "nixpkgs-2111_8", - "nixpkgs-unstable": "nixpkgs-unstable_8", - "old-ghc-nix": "old-ghc-nix_8", - "stackage": "stackage_8" - }, + "flake-utils_9": { "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "lastModified": 1634851050, + "narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c91f3de5adaf1de973b797ef7485e441a65b8935", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "haskellNix_7": { - "inputs": { - "HTTP": "HTTP_9", - "cabal-32": "cabal-32_9", - "cabal-34": "cabal-34_9", - "cabal-36": "cabal-36_8", - "cardano-shell": "cardano-shell_9", - "flake-utils": "flake-utils_12", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_9", - "hackage": "hackage_7", - "hpc-coveralls": "hpc-coveralls_9", - "nix-tools": "nix-tools_7", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ], - "nixpkgs-2003": "nixpkgs-2003_9", - "nixpkgs-2105": "nixpkgs-2105_9", - "nixpkgs-2111": "nixpkgs-2111_9", - "nixpkgs-unstable": "nixpkgs-unstable_9", - "old-ghc-nix": "old-ghc-nix_9", - "stackage": "stackage_9" - }, + "flakeCompat": { + "flake": false, "locked": { - "lastModified": 1643073543, - "narHash": "sha256-g2l/KDWzMRTFRugNVcx3CPZeyA5BNcH9/zDiqFpprB4=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "14f740c7c8f535581c30b1697018e389680e24cb", + "lastModified": 1641205782, + "narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "edolstra", + "repo": "flake-compat", "type": "github" } }, - "haskellNix_8": { + "follower": { "inputs": { - "HTTP": "HTTP_10", - "cabal-32": "cabal-32_10", - "cabal-34": "cabal-34_10", - "cardano-shell": "cardano-shell_10", - "flake-utils": "flake-utils_13", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_10", - "hackage": "hackage_8", - "hpc-coveralls": "hpc-coveralls_10", - "nix-tools": "nix-tools_8", + "devshell": "devshell_10", + "inclusive": "inclusive_7", "nixpkgs": [ "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "plutus-example", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", "nixpkgs" ], - "nixpkgs-2003": "nixpkgs-2003_10", - "nixpkgs-2105": "nixpkgs-2105_10", - "nixpkgs-2111": "nixpkgs-2111_10", - "nixpkgs-unstable": "nixpkgs-unstable_10", - "old-ghc-nix": "old-ghc-nix_10", - "stackage": "stackage_10" + "utils": "utils_14" }, "locked": { - "lastModified": 1639098904, - "narHash": "sha256-7VrCNEaKGLm4pTOS11dt1dRL2033oqrNCfal0uONsqA=", + "lastModified": 1642008295, + "narHash": "sha256-yx3lLN/hlvEeKItHJ5jH0KSm84IruTWMo78IItVPji4=", "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "b18c6ce0867fee77f12ecf41dc6c67f7a59d9826", + "repo": "nomad-follower", + "rev": "b1b0b00e940026f72d16bdf13e36ad20f1826e8a", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "haskell.nix", + "repo": "nomad-follower", "type": "github" } }, - "hpc-coveralls": { + "ghc-8.6.5-iohk": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_10": { + "ghc-8.6.5-iohk_2": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_11": { + "ghc-8.6.5-iohk_3": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_12": { + "ghc-8.6.5-iohk_4": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_2": { + "ghc-8.6.5-iohk_5": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_3": { + "ghc-8.6.5-iohk_6": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_4": { + "ghc-8.6.5-iohk_7": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", "type": "github" } }, - "hpc-coveralls_5": { + "ghc98X": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1696643148, + "narHash": "sha256-E02DfgISH7EvvNAu0BHiPvl1E5FGMDi0pWdNZtIBC9I=", + "ref": "ghc-9.8", + "rev": "443e870d977b1ab6fc05f47a9a17bc49296adbd6", + "revCount": 61642, + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" + }, + "original": { + "ref": "ghc-9.8", + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" + } + }, + "ghc99": { + "flake": false, + "locked": { + "lastModified": 1701580282, + "narHash": "sha256-drA01r3JrXnkKyzI+owMZGxX0JameMzjK0W5jJE/+V4=", + "ref": "refs/heads/master", + "rev": "f5eb0f2982e9cf27515e892c4bdf634bcfb28459", + "revCount": 62197, + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" + }, + "original": { + "submodules": true, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/ghc" + } + }, + "gomod2nix": { + "inputs": { + "nixpkgs": "nixpkgs_5", + "utils": "utils" + }, + "locked": { + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "tweag", + "repo": "gomod2nix", "type": "github" } }, - "hpc-coveralls_6": { + "hackage": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1646097829, + "narHash": "sha256-PcHDDV8NuUxZhPV/p++IkZC+SDZ1Db7m7K+9HN4/0S4=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "283f096976b48e54183905e7bdde7f213c6ee5cd", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "repo": "hackage.nix", "type": "github" } }, - "hpc-coveralls_7": { + "hackage-nix": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1702426969, + "narHash": "sha256-rbhpiqSBFwLxTO4Qx2sJm7BzBQo9MidVWlL9W21HHy4=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "524b4a4d0e06119cd226aa9f5d57986547bd29b4", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "repo": "hackage.nix", "type": "github" } }, - "hpc-coveralls_8": { + "hackageNix": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1685492843, + "narHash": "sha256-X8dNs5Gfc2ucfaWAgZ1VmkpBB4Cb44EQZu0b7tkvz2Y=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "e7407bab324eb2445bda58c5ffac393e80dda1e4", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "repo": "hackage.nix", "type": "github" } }, - "hpc-coveralls_9": { + "hackage_2": { "flake": false, "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "lastModified": 1655342080, + "narHash": "sha256-mF/clPxSJJkKAq6Y+0oYXrU3rGOuQXFN9btSde3uvvE=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "567e2e865d42d8e5cfe796bf03b6b38e42bc00ab", "type": "github" }, "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", + "owner": "input-output-hk", + "repo": "hackage.nix", "type": "github" } }, - "hydra": { - "inputs": { - "nix": "nix", - "nixpkgs": [ - "ctl", - "kupo-nixos", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, + "hackage_3": { + "flake": false, "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "lastModified": 1659489414, + "narHash": "sha256-AghgUkUv0hIBh+PvODngYL+ejwhCn2O2OUkVaAZYkCU=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "056c6ce7014adaf887b8e4cad15ef6fd926ea568", "type": "github" }, "original": { - "id": "hydra", - "type": "indirect" + "owner": "input-output-hk", + "repo": "hackage.nix", + "type": "github" } }, - "hydra_2": { - "inputs": { - "nix": "nix_2", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "haskellNix", - "hydra", - "nix", - "nixpkgs" - ] - }, + "hackage_4": { + "flake": false, "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "lastModified": 1650935983, + "narHash": "sha256-wZTCKzA4f7nk5sIdP2BhGz5qkt6ex5VTC/53U2Y4i9Y=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "b65addc81b03406b3ee8b139549980591ed15be5", "type": "github" }, "original": { - "id": "hydra", - "type": "indirect" + "owner": "input-output-hk", + "repo": "hackage.nix", + "type": "github" } }, - "hydra_3": { - "inputs": { - "nix": "nix_3", - "nixpkgs": [ - "ctl", - "ogmios", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, + "hackage_5": { + "flake": false, "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "lastModified": 1654219082, + "narHash": "sha256-sm59eg5wSrfIAjNXfBaaOBQ8daghF3g1NiGazYfj+no=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "fc90e7c5dea0483bacb01fc00bd2ab8f8e72500d", "type": "github" }, "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_4": { - "inputs": { - "nix": "nix_4", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "haskellNix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "owner": "input-output-hk", + "repo": "hackage.nix", "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" } }, - "hydra_5": { - "inputs": { - "nix": "nix_5", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, + "haskell-flake": { "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "lastModified": 1654001497, + "narHash": "sha256-GfrpyoQrVT9Z/j9its8BQs3I5O5X5Lc2IkK922bz7zg=", + "owner": "srid", + "repo": "haskell-flake", + "rev": "4c0b0ff295f0b97238a600d2381c37ee46b67f9c", "type": "github" }, "original": { - "id": "hydra", - "type": "indirect" + "owner": "srid", + "repo": "haskell-flake", + "type": "github" } }, - "hydra_6": { + "haskell-nix": { "inputs": { - "nix": "nix_6", + "HTTP": "HTTP_2", + "cabal-32": "cabal-32_2", + "cabal-34": "cabal-34_2", + "cabal-36": "cabal-36_2", + "cardano-shell": "cardano-shell_2", + "flake-utils": "flake-utils_16", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_2", + "hackage": "hackage", + "hpc-coveralls": "hpc-coveralls_2", + "nix-tools": "nix-tools", "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", "haskell-nix", - "hydra", - "nix", + "nixpkgs-unstable" + ], + "nixpkgs-2003": "nixpkgs-2003_2", + "nixpkgs-2105": "nixpkgs-2105_2", + "nixpkgs-2111": "nixpkgs-2111_2", + "nixpkgs-unstable": [ + "ctl", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", "nixpkgs" - ] + ], + "old-ghc-nix": "old-ghc-nix_2", + "stackage": "stackage_2" }, "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "lastModified": 1646097976, + "narHash": "sha256-EiyrBqayw67dw8pr1XCVU9tIZ+/jzXCQycW1S9a+KFA=", + "owner": "input-output-hk", + "repo": "haskell.nix", + "rev": "f0308ed1df3ce9f10f9da1a7c0c8591921d0b4e5", "type": "github" }, "original": { - "id": "hydra", - "type": "indirect" + "owner": "input-output-hk", + "repo": "haskell.nix", + "type": "github" } }, - "iohk-nix": { + "haskell-nix_2": { "inputs": { + "HTTP": "HTTP_4", + "cabal-32": "cabal-32_4", + "cabal-34": "cabal-34_4", + "cabal-36": "cabal-36_4", + "cardano-shell": "cardano-shell_4", + "flake-utils": "flake-utils_27", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_4", + "hackage": [ + "ctl", + "db-sync", + "cardano-world", + "hackage" + ], + "hpc-coveralls": "hpc-coveralls_4", + "hydra": "hydra_6", + "nix-tools": "nix-tools_3", "nixpkgs": [ "ctl", - "kupo-nixos", + "db-sync", + "cardano-world", "haskell-nix", - "nixpkgs" - ] + "nixpkgs-unstable" + ], + "nixpkgs-2003": "nixpkgs-2003_4", + "nixpkgs-2105": "nixpkgs-2105_4", + "nixpkgs-2111": "nixpkgs-2111_4", + "nixpkgs-2205": "nixpkgs-2205_2", + "nixpkgs-unstable": "nixpkgs-unstable_6", + "old-ghc-nix": "old-ghc-nix_4", + "stackage": "stackage_4" }, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", + "lastModified": 1659439444, + "narHash": "sha256-qUK7OVpM8/piOImpPgzSUvOFHQq19sQpvOSns2nW8es=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "repo": "haskell.nix", + "rev": "ee6a6559e16a603677d7cbef7c4fe18ca801b48e", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "repo": "haskell.nix", "type": "github" } }, - "iohk-nix-environments": { + "haskell-nix_3": { "inputs": { - "nixpkgs": "nixpkgs" + "HTTP": "HTTP_6", + "cabal-32": "cabal-32_6", + "cabal-34": "cabal-34_6", + "cabal-36": "cabal-36_6", + "cardano-shell": "cardano-shell_6", + "flake-compat": "flake-compat_12", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_6", + "ghc98X": "ghc98X", + "ghc99": "ghc99", + "hackage": [ + "ctl", + "hackage-nix" + ], + "hls-1.10": "hls-1.10_2", + "hls-2.0": "hls-2.0", + "hls-2.2": "hls-2.2", + "hls-2.3": "hls-2.3", + "hls-2.4": "hls-2.4", + "hpc-coveralls": "hpc-coveralls_6", + "hydra": "hydra_8", + "iserv-proxy": "iserv-proxy_2", + "nixpkgs": [ + "ctl", + "nixpkgs" + ], + "nixpkgs-2003": "nixpkgs-2003_6", + "nixpkgs-2105": "nixpkgs-2105_6", + "nixpkgs-2111": "nixpkgs-2111_6", + "nixpkgs-2205": "nixpkgs-2205_3", + "nixpkgs-2211": "nixpkgs-2211_2", + "nixpkgs-2305": "nixpkgs-2305", + "nixpkgs-2311": "nixpkgs-2311", + "nixpkgs-unstable": "nixpkgs-unstable_8", + "old-ghc-nix": "old-ghc-nix_6", + "stackage": "stackage_6" }, "locked": { - "lastModified": 1674063615, - "narHash": "sha256-xz/+7zO/O+2XrnxoFOjyEc72Sdy2ieQLpDq78XG15oI=", + "lastModified": 1702428573, + "narHash": "sha256-KpY2FsKQs6vUABgQFjUCqaTPVN5dStNjt0Dxjw7CA9g=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "ccd5bf7d8168a0452d9ec504ea1b559ada7752df", + "repo": "haskell.nix", + "rev": "78c22a52a0d80d7e29c12f74df871ebb58a0795d", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "haskell.nix", "type": "github" } }, - "iohk-nix_2": { + "haskell-nix_4": { "inputs": { + "HTTP": "HTTP_7", + "cabal-32": "cabal-32_7", + "cabal-34": "cabal-34_7", + "cabal-36": "cabal-36_7", + "cardano-shell": "cardano-shell_7", + "flake-utils": "flake-utils_33", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_7", + "hackage": "hackage_5", + "hpc-coveralls": "hpc-coveralls_7", + "hydra": "hydra_9", + "nix-tools": "nix-tools_5", "nixpkgs": [ "ctl", - "ogmios", - "nixpkgs" - ] + "kupo-nixos", + "haskell-nix", + "nixpkgs-unstable" + ], + "nixpkgs-2003": "nixpkgs-2003_7", + "nixpkgs-2105": "nixpkgs-2105_7", + "nixpkgs-2111": "nixpkgs-2111_7", + "nixpkgs-unstable": "nixpkgs-unstable_9", + "old-ghc-nix": "old-ghc-nix_7", + "stackage": "stackage_7" }, "locked": { - "lastModified": 1670489000, - "narHash": "sha256-JewWjqVJSt+7eZQT9bGdhlSsS9dmsSKsMzK9g11tcLU=", + "lastModified": 1654219238, + "narHash": "sha256-PMS7uSQjYCjsjUfVidTdKcuNtKNu5VPmeNvxruT72go=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "61510bb482eaca8cb7d61f40f5d375d95ea1fbf7", + "repo": "haskell.nix", + "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "haskell.nix", + "rev": "974a61451bb1d41b32090eb51efd7ada026d16d9", "type": "github" } }, - "iohk-nix_3": { + "haskellNix": { "inputs": { + "HTTP": "HTTP", + "cabal-32": "cabal-32", + "cabal-34": "cabal-34", + "cabal-36": "cabal-36", + "cardano-shell": "cardano-shell", + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_2", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk", + "hackage": [ + "ctl", + "cardano-node", + "hackageNix" + ], + "hls-1.10": "hls-1.10", + "hpc-coveralls": "hpc-coveralls", + "hydra": "hydra", + "iserv-proxy": "iserv-proxy", "nixpkgs": [ "ctl", - "ogmios-nixos", + "cardano-node", "nixpkgs" - ] + ], + "nixpkgs-2003": "nixpkgs-2003", + "nixpkgs-2105": "nixpkgs-2105", + "nixpkgs-2111": "nixpkgs-2111", + "nixpkgs-2205": "nixpkgs-2205", + "nixpkgs-2211": "nixpkgs-2211", + "nixpkgs-unstable": "nixpkgs-unstable", + "old-ghc-nix": "old-ghc-nix", + "stackage": "stackage" }, "locked": { - "lastModified": 1649070135, - "narHash": "sha256-UFKqcOSdPWk3TYUCPHF22p1zf7aXQpCmmgf7UMg7fWA=", + "lastModified": 1685495397, + "narHash": "sha256-BwbWroS1Qm8BiHatG5+iHMHN5U6kqOccewBROUYuMKw=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cecab9c71d1064f05f1615eead56ac0b9196bc20", + "repo": "haskell.nix", + "rev": "d07c42cdb1cf88d0cab27d3090b00cb3899643c9", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cecab9c71d1064f05f1615eead56ac0b9196bc20", + "repo": "haskell.nix", "type": "github" } }, - "iohk-nix_4": { + "haskellNix_2": { "inputs": { + "HTTP": "HTTP_3", + "cabal-32": "cabal-32_3", + "cabal-34": "cabal-34_3", + "cabal-36": "cabal-36_3", + "cardano-shell": "cardano-shell_3", + "flake-utils": "flake-utils_26", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_3", + "hackage": "hackage_2", + "hpc-coveralls": "hpc-coveralls_3", + "hydra": "hydra_5", + "nix-tools": "nix-tools_2", "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", + "db-sync", + "cardano-world", + "cardano-wallet", "nixpkgs" - ] + ], + "nixpkgs-2003": "nixpkgs-2003_3", + "nixpkgs-2105": "nixpkgs-2105_3", + "nixpkgs-2111": "nixpkgs-2111_3", + "nixpkgs-unstable": "nixpkgs-unstable_5", + "old-ghc-nix": "old-ghc-nix_3", + "stackage": "stackage_3" }, "locked": { - "lastModified": 1667394105, - "narHash": "sha256-YhS7zGd6jK/QM/+wWyj0zUBZmE3HOXAL/kpJptGYIWg=", + "lastModified": 1655369909, + "narHash": "sha256-Z3d17WvaXY2kWdfsOE6yPKViQ1RBfGi4d7XZgXA/j2I=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", + "repo": "haskell.nix", + "rev": "5a310b0b3904d9b90239390eb2dfb59e4dcb0d96", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "haskell.nix", "type": "github" } }, - "iohkNix": { + "haskellNix_3": { "inputs": { - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "nixpkgs" - ] + "HTTP": "HTTP_5", + "cabal-32": "cabal-32_5", + "cabal-34": "cabal-34_5", + "cabal-36": "cabal-36_5", + "cardano-shell": "cardano-shell_5", + "flake-utils": "flake-utils_32", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_5", + "hackage": "hackage_4", + "hpc-coveralls": "hpc-coveralls_5", + "hydra": "hydra_7", + "nix-tools": "nix-tools_4", + "nixpkgs": [ + "ctl", + "db-sync", + "haskellNix", + "nixpkgs-unstable" + ], + "nixpkgs-2003": "nixpkgs-2003_5", + "nixpkgs-2105": "nixpkgs-2105_5", + "nixpkgs-2111": "nixpkgs-2111_5", + "nixpkgs-unstable": "nixpkgs-unstable_7", + "old-ghc-nix": "old-ghc-nix_5", + "stackage": "stackage_5" }, "locked": { - "lastModified": 1667394105, - "narHash": "sha256-YhS7zGd6jK/QM/+wWyj0zUBZmE3HOXAL/kpJptGYIWg=", + "lastModified": 1650936156, + "narHash": "sha256-B58b4OCSc6ohRjGEdbQ78r+TK/OZYsBXION90kfQDC4=", "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", + "repo": "haskell.nix", + "rev": "9a502b8c8aac4d7b8033bc9affb87fd03d4740fc", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "iohk-nix", + "repo": "haskell.nix", "type": "github" } }, - "iohkNix_2": { + "hercules-ci-effects": { "inputs": { - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "nixpkgs" - ] + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_70" }, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "lastModified": 1699381651, + "narHash": "sha256-mZlQ54xJs3j5+SJrLhzePPMXzS+Czbx7gNyOnOAQrHA=", + "owner": "hercules-ci", + "repo": "hercules-ci-effects", + "rev": "0bd99f5ab7ec7a74c11238bd02bb29e709c14328", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "hercules-ci", + "repo": "hercules-ci-effects", "type": "github" } }, - "iohkNix_3": { - "inputs": { - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ] - }, + "hls-1.10": { + "flake": false, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "lastModified": 1680000865, + "narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "haskell", + "ref": "1.10.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "iohkNix_4": { - "inputs": { - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "plutus-example", - "nixpkgs" - ] - }, + "hls-1.10_2": { + "flake": false, "locked": { - "lastModified": 1633964277, - "narHash": "sha256-7G/BK514WiMRr90EswNBthe8SmH9tjPaTBba/RW/VA8=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "1e51437aac8a0e49663cb21e781f34163c81ebfb", + "lastModified": 1680000865, + "narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "haskell", + "ref": "1.10.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "iohkNix_5": { - "inputs": { - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "nixpkgs" - ] - }, + "hls-2.0": { + "flake": false, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "lastModified": 1687698105, + "narHash": "sha256-OHXlgRzs/kuJH8q7Sxh507H+0Rb8b7VOiPAjcY9sM1k=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "783905f211ac63edf982dd1889c671653327e441", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "haskell", + "ref": "2.0.0.1", + "repo": "haskell-language-server", "type": "github" } }, - "iohkNix_6": { - "inputs": { - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "nixpkgs" - ] - }, + "hls-2.2": { + "flake": false, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "lastModified": 1693064058, + "narHash": "sha256-8DGIyz5GjuCFmohY6Fa79hHA/p1iIqubfJUTGQElbNk=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "b30f4b6cf5822f3112c35d14a0cba51f3fe23b85", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "haskell", + "ref": "2.2.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "iohkNix_7": { - "inputs": { - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", - "nixpkgs" - ] - }, + "hls-2.3": { + "flake": false, "locked": { - "lastModified": 1631778944, - "narHash": "sha256-N5eCcUYtZ5kUOl/JJGjx6ZzhA3uIn1itDRTiRV+3jLw=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "db2c75a09c696271194bb3ef25ec8e9839b594b7", + "lastModified": 1695910642, + "narHash": "sha256-tR58doOs3DncFehHwCLczJgntyG/zlsSd7DgDgMPOkI=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "458ccdb55c9ea22cd5d13ec3051aaefb295321be", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "haskell", + "ref": "2.3.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "iohkNix_8": { - "inputs": { - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "plutus-example", - "nixpkgs" - ] - }, + "hls-2.4": { + "flake": false, "locked": { - "lastModified": 1633964277, - "narHash": "sha256-7G/BK514WiMRr90EswNBthe8SmH9tjPaTBba/RW/VA8=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "1e51437aac8a0e49663cb21e781f34163c81ebfb", + "lastModified": 1696939266, + "narHash": "sha256-VOMf5+kyOeOmfXTHlv4LNFJuDGa7G3pDnOxtzYR40IU=", + "owner": "haskell", + "repo": "haskell-language-server", + "rev": "362fdd1293efb4b82410b676ab1273479f6d17ee", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "haskell", + "ref": "2.4.0.0", + "repo": "haskell-language-server", "type": "github" } }, - "iserv-proxy": { + "hpc-coveralls": { "flake": false, "locked": { - "lastModified": 1639165170, - "narHash": "sha256-QsWL/sBDL5GM8IXd/dE/ORiL4RvteEN+aok23tXgAoc=", - "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", - "revCount": 7, - "type": "git", - "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "type": "github" }, "original": { - "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", - "type": "git", - "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "type": "github" } }, - "kupo": { + "hpc-coveralls_2": { "flake": false, "locked": { - "lastModified": 1668678914, - "narHash": "sha256-XsbAFyUPmevGuoShEFlOVHt/7fFIpyCQuhulIrNzv80=", - "owner": "CardanoSolutions", - "repo": "kupo", - "rev": "c9bc18d99f9e8af1840a265907db82b180d5a4d8", + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", "type": "github" }, "original": { - "owner": "CardanoSolutions", - "ref": "v2.2.0", - "repo": "kupo", + "owner": "sevanspowell", + "repo": "hpc-coveralls", "type": "github" } }, - "kupo-nixos": { - "inputs": { - "haskell-nix": "haskell-nix", - "iohk-nix": "iohk-nix", - "kupo": [ - "ctl", - "kupo" - ], - "nixpkgs": [ - "ctl", - "kupo-nixos", - "haskell-nix", - "nixpkgs" - ] - }, + "hpc-coveralls_3": { + "flake": false, "locked": { - "lastModified": 1672905539, - "narHash": "sha256-B4vryG94L7WWn/tuIQdtg9eZHAH+FaFzv35Mancd2l8=", - "owner": "mlabs-haskell", - "repo": "kupo-nixos", - "rev": "6f89cbcc359893a2aea14dd380f9a45e04c6aa67", + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "kupo-nixos", - "rev": "6f89cbcc359893a2aea14dd380f9a45e04c6aa67", + "owner": "sevanspowell", + "repo": "hpc-coveralls", "type": "github" } }, - "lowdown-src": { + "hpc-coveralls_4": { "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "sevanspowell", + "repo": "hpc-coveralls", "type": "github" } }, - "lowdown-src_2": { + "hpc-coveralls_5": { "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "sevanspowell", + "repo": "hpc-coveralls", "type": "github" } }, - "lowdown-src_3": { + "hpc-coveralls_6": { "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "sevanspowell", + "repo": "hpc-coveralls", "type": "github" } }, - "lowdown-src_4": { + "hpc-coveralls_7": { "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "sevanspowell", + "repo": "hpc-coveralls", "type": "github" } }, - "lowdown-src_5": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" + "hydra": { + "inputs": { + "nix": "nix", + "nixpkgs": [ + "ctl", + "cardano-node", + "haskellNix", + "hydra", + "nix", + "nixpkgs" + ] }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, - "lowdown-src_6": { - "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1671755331, + "narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=", + "owner": "NixOS", + "repo": "hydra", + "rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" + "id": "hydra", + "type": "indirect" } }, - "mdbook-kroki-preprocessor": { - "flake": false, - "locked": { - "lastModified": 1661755005, - "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", - "type": "github" + "hydra_2": { + "inputs": { + "nix": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "nix" + ], + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "nixpkgs" + ] }, - "original": { - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "type": "github" - } - }, - "mdbook-kroki-preprocessor_2": { - "flake": false, "locked": { - "lastModified": 1661755005, - "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "lastModified": 1631062883, + "narHash": "sha256-JZ6/gjHyX50fHCYpXy/FrX9C0e9k8X9In5Jb/SQYlT8=", + "owner": "kreisys", + "repo": "hydra", + "rev": "785326948be4b1cc2ce77435c806521565e9af45", "type": "github" }, "original": { - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", + "owner": "kreisys", + "ref": "hydra-server-includes", + "repo": "hydra", "type": "github" } }, - "mdbook-kroki-preprocessor_3": { - "flake": false, + "hydra_3": { + "inputs": { + "nix": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "nix" + ], + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1661755005, - "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", - "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "lastModified": 1631062883, + "narHash": "sha256-JZ6/gjHyX50fHCYpXy/FrX9C0e9k8X9In5Jb/SQYlT8=", + "owner": "kreisys", + "repo": "hydra", + "rev": "785326948be4b1cc2ce77435c806521565e9af45", "type": "github" }, "original": { - "owner": "JoelCourtney", - "repo": "mdbook-kroki-preprocessor", + "owner": "kreisys", + "ref": "hydra-server-includes", + "repo": "hydra", "type": "github" } }, - "membench": { + "hydra_4": { "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_2", - "cardano-node-measured": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot" - ], - "cardano-node-process": [ + "nix": [ "ctl", - "ogmios", - "cardano-node", - "node-snapshot" + "db-sync", + "cardano-world", + "capsules", + "bitte", + "nix" ], - "cardano-node-snapshot": "cardano-node-snapshot", "nixpkgs": [ "ctl", - "ogmios", - "cardano-node", - "node-snapshot", + "db-sync", + "cardano-world", + "capsules", + "bitte", "nixpkgs" - ], - "ouroboros-network": "ouroboros-network_2" + ] }, "locked": { - "lastModified": 1645070579, - "narHash": "sha256-AxL6tCOnzYnE6OquoFzj+X1bLDr1PQx3d8/vXm+rbfA=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "65643e000186de1335e24ec89159db8ba85e1c1a", + "lastModified": 1631062883, + "narHash": "sha256-JZ6/gjHyX50fHCYpXy/FrX9C0e9k8X9In5Jb/SQYlT8=", + "owner": "kreisys", + "repo": "hydra", + "rev": "785326948be4b1cc2ce77435c806521565e9af45", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", + "owner": "kreisys", + "ref": "hydra-server-includes", + "repo": "hydra", "type": "github" } }, - "membench_2": { + "hydra_5": { "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_3", - "cardano-node-measured": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-process": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-snapshot": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], + "nix": "nix_12", "nixpkgs": [ "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", + "db-sync", + "cardano-world", + "cardano-wallet", + "haskellNix", + "hydra", + "nix", "nixpkgs" - ], - "ouroboros-network": "ouroboros-network" + ] }, "locked": { - "lastModified": 1644547122, - "narHash": "sha256-8nWK+ScMACvRQLbA27gwXNoZver+Wx/cF7V37044koY=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "9d8ff4b9394de0421ee95caa511d01163de88b77", + "lastModified": 1646878427, + "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", + "owner": "NixOS", + "repo": "hydra", + "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "type": "github" + "id": "hydra", + "type": "indirect" } }, - "membench_3": { + "hydra_6": { "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_5", - "cardano-node-measured": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot" - ], - "cardano-node-process": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot" - ], - "cardano-node-snapshot": "cardano-node-snapshot_2", + "nix": "nix_13", "nixpkgs": [ "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", + "db-sync", + "cardano-world", + "haskell-nix", + "hydra", + "nix", "nixpkgs" - ], - "ouroboros-network": "ouroboros-network_4" + ] }, "locked": { - "lastModified": 1645070579, - "narHash": "sha256-AxL6tCOnzYnE6OquoFzj+X1bLDr1PQx3d8/vXm+rbfA=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "65643e000186de1335e24ec89159db8ba85e1c1a", + "lastModified": 1646878427, + "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", + "owner": "NixOS", + "repo": "hydra", + "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "type": "github" + "id": "hydra", + "type": "indirect" } }, - "membench_4": { + "hydra_7": { "inputs": { - "cardano-mainnet-mirror": "cardano-mainnet-mirror_6", - "cardano-node-measured": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-process": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], - "cardano-node-snapshot": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot" - ], + "nix": "nix_14", "nixpkgs": [ "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "membench", - "cardano-node-snapshot", + "db-sync", + "haskellNix", + "hydra", + "nix", "nixpkgs" - ], - "ouroboros-network": "ouroboros-network_3" + ] }, "locked": { - "lastModified": 1644547122, - "narHash": "sha256-8nWK+ScMACvRQLbA27gwXNoZver+Wx/cF7V37044koY=", - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "rev": "9d8ff4b9394de0421ee95caa511d01163de88b77", + "lastModified": 1646878427, + "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", + "owner": "NixOS", + "repo": "hydra", + "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-memory-benchmark", - "type": "github" + "id": "hydra", + "type": "indirect" } }, - "n2c": { + "hydra_8": { "inputs": { - "flake-utils": "flake-utils_9", + "nix": "nix_15", "nixpkgs": [ "ctl", - "ogmios", "haskell-nix", - "tullia", - "std", + "hydra", + "nix", "nixpkgs" ] }, "locked": { - "lastModified": 1665039323, - "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", - "owner": "nlewo", - "repo": "nix2container", - "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "lastModified": 1671755331, + "narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=", + "owner": "NixOS", + "repo": "hydra", + "rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8", "type": "github" }, "original": { - "owner": "nlewo", - "repo": "nix2container", - "type": "github" + "id": "hydra", + "type": "indirect" } }, - "n2c_2": { + "hydra_9": { "inputs": { - "flake-utils": "flake-utils_17", + "nix": "nix_16", "nixpkgs": [ "ctl", - "ogmios-nixos", + "kupo-nixos", "haskell-nix", - "tullia", - "std", + "hydra", + "nix", "nixpkgs" ] }, "locked": { - "lastModified": 1665039323, - "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", - "owner": "nlewo", - "repo": "nix2container", - "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "lastModified": 1646878427, + "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", + "owner": "NixOS", + "repo": "hydra", + "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", "type": "github" }, "original": { - "owner": "nlewo", - "repo": "nix2container", - "type": "github" + "id": "hydra", + "type": "indirect" } }, - "n2c_3": { + "incl": { "inputs": { - "flake-utils": "flake-utils_21", - "nixpkgs": [ + "nixlib": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1665039323, - "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", - "owner": "nlewo", - "repo": "nix2container", - "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "lastModified": 1669263024, + "narHash": "sha256-E/+23NKtxAqYG/0ydYgxlgarKnxmDbg6rCMWnOBqn9Q=", + "owner": "divnix", + "repo": "incl", + "rev": "ce7bebaee048e4cd7ebdb4cee7885e00c4e2abca", "type": "github" }, "original": { - "owner": "nlewo", - "repo": "nix2container", + "owner": "divnix", + "repo": "incl", "type": "github" } }, - "nix": { + "inclusive": { "inputs": { - "lowdown-src": "lowdown-src", - "nixpkgs": "nixpkgs_2", - "nixpkgs-regression": "nixpkgs-regression" + "stdlib": "stdlib" }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "input-output-hk", + "repo": "nix-inclusive", "type": "github" } }, - "nix-nomad": { + "inclusive_10": { "inputs": { - "flake-compat": "flake-compat_6", - "flake-utils": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "nix2container", - "flake-utils" - ], - "gomod2nix": "gomod2nix", - "nixpkgs": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "nixpkgs" - ], - "nixpkgs-lib": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "nixpkgs" - ] + "stdlib": "stdlib_10" }, "locked": { - "lastModified": 1658277770, - "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", - "owner": "tristanpemble", - "repo": "nix-nomad", - "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { - "owner": "tristanpemble", - "repo": "nix-nomad", + "owner": "input-output-hk", + "repo": "nix-inclusive", "type": "github" } }, - "nix-nomad_2": { + "inclusive_11": { "inputs": { - "flake-compat": "flake-compat_10", - "flake-utils": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "nix2container", - "flake-utils" - ], - "gomod2nix": "gomod2nix_2", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "nixpkgs" - ], - "nixpkgs-lib": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "nixpkgs" - ] + "stdlib": "stdlib_11" }, "locked": { - "lastModified": 1658277770, - "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", - "owner": "tristanpemble", - "repo": "nix-nomad", - "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { - "owner": "tristanpemble", - "repo": "nix-nomad", + "owner": "input-output-hk", + "repo": "nix-inclusive", "type": "github" } }, - "nix-nomad_3": { + "inclusive_2": { "inputs": { - "flake-compat": "flake-compat_13", - "flake-utils": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "nix2container", - "flake-utils" - ], - "gomod2nix": "gomod2nix_3", - "nixpkgs": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "nixpkgs" - ], - "nixpkgs-lib": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "nixpkgs" - ] + "stdlib": "stdlib_2" }, "locked": { - "lastModified": 1658277770, - "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", - "owner": "tristanpemble", - "repo": "nix-nomad", - "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { - "owner": "tristanpemble", - "repo": "nix-nomad", + "owner": "input-output-hk", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools": { - "flake": false, + "inclusive_3": { + "inputs": { + "stdlib": "stdlib_3" + }, "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_2": { - "flake": false, + "inclusive_4": { + "inputs": { + "stdlib": "stdlib_4" + }, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_3": { - "flake": false, + "inclusive_5": { + "inputs": { + "stdlib": "stdlib_5" + }, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_4": { - "flake": false, + "inclusive_6": { + "inputs": { + "stdlib": "stdlib_6" + }, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_5": { - "flake": false, + "inclusive_7": { + "inputs": { + "stdlib": "stdlib_7" + }, "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_6": { - "flake": false, + "inclusive_8": { + "inputs": { + "stdlib": "stdlib_8" + }, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_7": { - "flake": false, + "inclusive_9": { + "inputs": { + "stdlib": "stdlib_9" + }, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "nix-inclusive", "type": "github" } }, - "nix-tools_8": { - "flake": false, + "iogo": { + "inputs": { + "devshell": "devshell_4", + "inclusive": "inclusive_3", + "nixpkgs": "nixpkgs_22", + "utils": "utils_8" + }, "locked": { - "lastModified": 1636018067, - "narHash": "sha256-ng306fkuwr6V/malWtt3979iAC4yMVDDH2ViwYB6sQE=", + "lastModified": 1652212694, + "narHash": "sha256-baAY5wKzccNsm7OCEYuySrkXRmlshokCHQjs4EdYShM=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "ed5bd7215292deba55d6ab7a4e8c21f8b1564dda", + "repo": "bitte-iogo", + "rev": "e465975aa368b2d919e865f71eeed02828e55471", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "bitte-iogo", "type": "github" } }, - "nix2container": { + "iogo_2": { "inputs": { - "flake-utils": "flake-utils_7", - "nixpkgs": "nixpkgs_9" + "devshell": "devshell_14", + "inclusive": "inclusive_11", + "nixpkgs": "nixpkgs_51", + "utils": "utils_22" }, "locked": { - "lastModified": 1658567952, - "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", - "owner": "nlewo", - "repo": "nix2container", - "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "lastModified": 1658302707, + "narHash": "sha256-E0FA1CEMQlfAsmtLBRoQE7IY4ItKlBdxZ44YX0tK5Hg=", + "owner": "input-output-hk", + "repo": "bitte-iogo", + "rev": "8751660009202bc95ea3a29e304c393c140a4231", "type": "github" }, "original": { - "owner": "nlewo", - "repo": "nix2container", + "owner": "input-output-hk", + "repo": "bitte-iogo", "type": "github" } }, - "nix2container_2": { + "iohk-nix": { "inputs": { - "flake-utils": "flake-utils_15", - "nixpkgs": "nixpkgs_17" + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "nixpkgs" + ] }, "locked": { - "lastModified": 1658567952, - "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", - "owner": "nlewo", - "repo": "nix2container", - "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "lastModified": 1658222743, + "narHash": "sha256-yFH01psqx30y5Ws4dBElLkxYpIxxqZx4G+jCVhsXpnA=", + "owner": "input-output-hk", + "repo": "iohk-nix", + "rev": "9a604d01bd4420ab7f396f14d1947fbe2ce7db8b", "type": "github" }, "original": { - "owner": "nlewo", - "repo": "nix2container", + "owner": "input-output-hk", + "repo": "iohk-nix", "type": "github" } }, - "nix2container_3": { + "iohk-nix_2": { "inputs": { - "flake-utils": "flake-utils_19", - "nixpkgs": "nixpkgs_21" + "blst": "blst_2", + "nixpkgs": [ + "ctl", + "nixpkgs" + ], + "secp256k1": "secp256k1_2", + "sodium": "sodium_2" }, "locked": { - "lastModified": 1658567952, - "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", - "owner": "nlewo", - "repo": "nix2container", - "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "lastModified": 1702362799, + "narHash": "sha256-cU8cZXNuo5GRwrSvWqdaqoW5tJ2HWwDEOvWwIVPDPmo=", + "owner": "input-output-hk", + "repo": "iohk-nix", + "rev": "b426fb9e0b109a9d1dd2e1476f9e0bd8bb715142", "type": "github" }, "original": { - "owner": "nlewo", - "repo": "nix2container", + "owner": "input-output-hk", + "repo": "iohk-nix", "type": "github" } }, - "nixTools": { - "flake": false, + "iohk-nix_3": { + "inputs": { + "nixpkgs": [ + "ctl", + "kupo-nixos", + "haskell-nix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1644395812, - "narHash": "sha256-BVFk/BEsTLq5MMZvdy3ZYHKfaS3dHrsKh4+tb5t5b58=", + "lastModified": 1653579289, + "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "d847c63b99bbec78bf83be2a61dc9f09b8a9ccc1", + "repo": "iohk-nix", + "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "iohk-nix", + "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", "type": "github" } }, - "nixTools_2": { - "flake": false, + "iohkNix": { + "inputs": { + "blst": "blst", + "nixpkgs": [ + "ctl", + "cardano-node", + "nixpkgs" + ], + "secp256k1": "secp256k1", + "sodium": "sodium" + }, "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "lastModified": 1684223806, + "narHash": "sha256-IyLoP+zhuyygLtr83XXsrvKyqqLQ8FHXTiySFf4FJOI=", "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "repo": "iohk-nix", + "rev": "86421fdd89b3af43fa716ccd07638f96c6ecd1e4", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "nix-tools", + "repo": "iohk-nix", "type": "github" } }, - "nix_2": { + "iohkNix_2": { "inputs": { - "lowdown-src": "lowdown-src_2", - "nixpkgs": "nixpkgs_4", - "nixpkgs-regression": "nixpkgs-regression_2" + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "cardano-wallet", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1653579289, + "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", + "owner": "input-output-hk", + "repo": "iohk-nix", + "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "input-output-hk", + "repo": "iohk-nix", "type": "github" } }, - "nix_3": { + "iohkNix_3": { "inputs": { - "lowdown-src": "lowdown-src_3", - "nixpkgs": "nixpkgs_7", - "nixpkgs-regression": "nixpkgs-regression_3" + "nixpkgs": [ + "ctl", + "db-sync", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1667394105, + "narHash": "sha256-YhS7zGd6jK/QM/+wWyj0zUBZmE3HOXAL/kpJptGYIWg=", + "owner": "input-output-hk", + "repo": "iohk-nix", + "rev": "7fc7625a9ab2ba137bc70ddbc89a13d3fdb78c8b", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "input-output-hk", + "repo": "iohk-nix", "type": "github" } }, - "nix_4": { - "inputs": { - "lowdown-src": "lowdown-src_4", - "nixpkgs": "nixpkgs_12", - "nixpkgs-regression": "nixpkgs-regression_4" + "iserv-proxy": { + "flake": false, + "locked": { + "lastModified": 1670983692, + "narHash": "sha256-avLo34JnI9HNyOuauK5R69usJm+GfW3MlyGlYxZhTgY=", + "ref": "hkm/remote-iserv", + "rev": "50d0abb3317ac439a4e7495b185a64af9b7b9300", + "revCount": 10, + "type": "git", + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" + }, + "original": { + "ref": "hkm/remote-iserv", + "type": "git", + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" + } + }, + "iserv-proxy_2": { + "flake": false, + "locked": { + "lastModified": 1691634696, + "narHash": "sha256-MZH2NznKC/gbgBu8NgIibtSUZeJ00HTLJ0PlWKCBHb0=", + "ref": "hkm/remote-iserv", + "rev": "43a979272d9addc29fbffc2e8542c5d96e993d73", + "revCount": 14, + "type": "git", + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" + }, + "original": { + "ref": "hkm/remote-iserv", + "type": "git", + "url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git" + } + }, + "kupo": { + "flake": false, + "locked": { + "lastModified": 1668678914, + "narHash": "sha256-XsbAFyUPmevGuoShEFlOVHt/7fFIpyCQuhulIrNzv80=", + "owner": "CardanoSolutions", + "repo": "kupo", + "rev": "c9bc18d99f9e8af1840a265907db82b180d5a4d8", + "type": "github" + }, + "original": { + "owner": "CardanoSolutions", + "ref": "v2.2.0", + "repo": "kupo", + "type": "github" + } + }, + "kupo-nixos": { + "inputs": { + "haskell-nix": "haskell-nix_4", + "iohk-nix": "iohk-nix_3", + "kupo": [ + "ctl", + "kupo" + ], + "nixpkgs": [ + "ctl", + "kupo-nixos", + "haskell-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1672905539, + "narHash": "sha256-B4vryG94L7WWn/tuIQdtg9eZHAH+FaFzv35Mancd2l8=", + "owner": "mlabs-haskell", + "repo": "kupo-nixos", + "rev": "6f89cbcc359893a2aea14dd380f9a45e04c6aa67", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "repo": "kupo-nixos", + "rev": "6f89cbcc359893a2aea14dd380f9a45e04c6aa67", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_10": { + "flake": false, + "locked": { + "lastModified": 1598695561, + "narHash": "sha256-gyH/5j+h/nWw0W8AcR2WKvNBUsiQ7QuxqSJNXAwV+8E=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "1705b4a26fbf065d9574dce47a94e8c7c79e052f", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_11": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_12": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_13": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_14": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_15": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_16": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_2": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_3": { + "flake": false, + "locked": { + "lastModified": 1598695561, + "narHash": "sha256-gyH/5j+h/nWw0W8AcR2WKvNBUsiQ7QuxqSJNXAwV+8E=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "1705b4a26fbf065d9574dce47a94e8c7c79e052f", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_4": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_5": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_6": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_7": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_8": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "lowdown-src_9": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "mdbook-kroki-preprocessor": { + "flake": false, + "locked": { + "lastModified": 1655670640, + "narHash": "sha256-JjqdxftHBjABTkOpFl3cWUJtc/KGwkQ3NRWGLjH2oUs=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "bb6e607437ecc3f22fd9036acee6b797a5b45dbc", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_2": { + "flake": false, + "locked": { + "lastModified": 1655670640, + "narHash": "sha256-JjqdxftHBjABTkOpFl3cWUJtc/KGwkQ3NRWGLjH2oUs=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "bb6e607437ecc3f22fd9036acee6b797a5b45dbc", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "n2c": { + "inputs": { + "flake-utils": [ + "ctl", + "cardano-node", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "ctl", + "cardano-node", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_2": { + "inputs": { + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1650568002, + "narHash": "sha256-CciO5C3k/a7sbA+lW4jeiU6WGletujMjWcRzc1513tI=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "2cd391fc65847ea54e3657a491c379854b556262", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_3": { + "inputs": { + "flake-utils": "flake-utils_28", + "nixpkgs": "nixpkgs_62" + }, + "locked": { + "lastModified": 1655533513, + "narHash": "sha256-MAqvv2AZbyNYGJMpV5l9ydN7k66jDErFpaKOvZ1Y7f8=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "2d47dbe633a059d75c7878f554420158712481cb", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": "nixpkgs_3", + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1661606874, + "narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=", + "owner": "NixOS", + "repo": "nix", + "rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.11.0", + "repo": "nix", + "type": "github" + } + }, + "nix-cache-proxy": { + "inputs": { + "devshell": "devshell_11", + "inclusive": [ + "ctl", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "inclusive" + ], + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ], + "utils": "utils_15" + }, + "locked": { + "lastModified": 1644317729, + "narHash": "sha256-R9R1XHv69VvZ/c7lXYs18PHcnEBXS+hDfhjdkZ96lgw=", + "owner": "input-output-hk", + "repo": "nix-cache-proxy", + "rev": "378617d6b9865be96f7dfa16e0ce3f329da844ec", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-cache-proxy", + "type": "github" + } + }, + "nix-inclusive": { + "inputs": { + "stdlib": "stdlib_12" + }, + "locked": { + "lastModified": 1628098927, + "narHash": "sha256-Ft4sdf7VPL8MQtu18AAPiN2s5pUsbv+3RxqzJSa/yzg=", + "owner": "input-output-hk", + "repo": "nix-inclusive", + "rev": "13123eb7a8c3359738a4756b8d645729e8655b27", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-inclusive", + "type": "github" + } + }, + "nix-nomad": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": [ + "ctl", + "cardano-node", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix", + "nixpkgs": [ + "ctl", + "cardano-node", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "ctl", + "cardano-node", + "tullia", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "type": "github" + }, + "original": { + "owner": "tristanpemble", + "repo": "nix-nomad", + "type": "github" + } + }, + "nix-tools": { + "flake": false, + "locked": { + "lastModified": 1644395812, + "narHash": "sha256-BVFk/BEsTLq5MMZvdy3ZYHKfaS3dHrsKh4+tb5t5b58=", + "owner": "input-output-hk", + "repo": "nix-tools", + "rev": "d847c63b99bbec78bf83be2a61dc9f09b8a9ccc1", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-tools", + "type": "github" + } + }, + "nix-tools_2": { + "flake": false, + "locked": { + "lastModified": 1649424170, + "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "owner": "input-output-hk", + "repo": "nix-tools", + "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-tools", + "type": "github" + } + }, + "nix-tools_3": { + "flake": false, + "locked": { + "lastModified": 1658968505, + "narHash": "sha256-UnbQ/Ig/23e9hUdDOBwYHwHgHmQawZ2uazpJ8DLIJgE=", + "owner": "input-output-hk", + "repo": "nix-tools", + "rev": "8a754bdcf20b20e116409c2341cf69065d083053", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-tools", + "type": "github" + } + }, + "nix-tools_4": { + "flake": false, + "locked": { + "lastModified": 1649424170, + "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "owner": "input-output-hk", + "repo": "nix-tools", + "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-tools", + "type": "github" + } + }, + "nix-tools_5": { + "flake": false, + "locked": { + "lastModified": 1649424170, + "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", + "owner": "input-output-hk", + "repo": "nix-tools", + "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "nix-tools", + "type": "github" + } + }, + "nix2container": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1671269339, + "narHash": "sha256-KR2SXh4c2Y+bgbCfXjTGJ74O9/u4CAPFA0KYZHhKf5Q=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "6800fff45afecc7e47c334d14cf2b2f4f25601a0", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_2": { + "inputs": { + "flake-utils": "flake-utils_4", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_3": { + "inputs": { + "flake-utils": "flake-utils_30", + "nixpkgs": "nixpkgs_65" + }, + "locked": { + "lastModified": 1653427219, + "narHash": "sha256-q6MzrIZq1BBFxYN+UQjW60LpQJXV6RIIUmO8gKRyMqg=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "11a0e14c2468720f42ca8dec3b82862abf96c837", + "type": "github" + }, + "original": { + "owner": "nlewo", + "ref": "init-nix-db", + "repo": "nix2container", + "type": "github" + } + }, + "nix_10": { + "inputs": { + "lowdown-src": "lowdown-src_10", + "nixpkgs": "nixpkgs_45" + }, + "locked": { + "lastModified": 1604400356, + "narHash": "sha256-PX1cSYv0Y6I2tidcuEwJTo8X5vAvf9vjdfHO51LD/J0=", + "owner": "NixOS", + "repo": "nix", + "rev": "cf82e14712b3be881b7c880468cd5486e8934638", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nix", + "type": "github" + } + }, + "nix_11": { + "inputs": { + "lowdown-src": "lowdown-src_11", + "nixpkgs": "nixpkgs_47", + "nixpkgs-regression": "nixpkgs-regression_9" + }, + "locked": { + "lastModified": 1645189081, + "narHash": "sha256-yZA+07JTG9Z610DceiYyzm+C08yHhcIgfl/Cp7lY3ho=", + "owner": "nixos", + "repo": "nix", + "rev": "9bc03adbba5334663901c1136203bc07e4776be9", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "type": "github" + } + }, + "nix_12": { + "inputs": { + "lowdown-src": "lowdown-src_12", + "nixpkgs": "nixpkgs_59", + "nixpkgs-regression": "nixpkgs-regression_10" + }, + "locked": { + "lastModified": 1643066034, + "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "owner": "NixOS", + "repo": "nix", + "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.6.0", + "repo": "nix", + "type": "github" + } + }, + "nix_13": { + "inputs": { + "lowdown-src": "lowdown-src_13", + "nixpkgs": "nixpkgs_61", + "nixpkgs-regression": "nixpkgs-regression_11" + }, + "locked": { + "lastModified": 1643066034, + "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "owner": "NixOS", + "repo": "nix", + "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.6.0", + "repo": "nix", + "type": "github" + } + }, + "nix_14": { + "inputs": { + "lowdown-src": "lowdown-src_14", + "nixpkgs": "nixpkgs_68", + "nixpkgs-regression": "nixpkgs-regression_12" + }, + "locked": { + "lastModified": 1643066034, + "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "owner": "NixOS", + "repo": "nix", + "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.6.0", + "repo": "nix", + "type": "github" + } + }, + "nix_15": { + "inputs": { + "lowdown-src": "lowdown-src_15", + "nixpkgs": "nixpkgs_69", + "nixpkgs-regression": "nixpkgs-regression_13" + }, + "locked": { + "lastModified": 1661606874, + "narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=", + "owner": "NixOS", + "repo": "nix", + "rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.11.0", + "repo": "nix", + "type": "github" + } + }, + "nix_16": { + "inputs": { + "lowdown-src": "lowdown-src_16", + "nixpkgs": "nixpkgs_71", + "nixpkgs-regression": "nixpkgs-regression_14" + }, + "locked": { + "lastModified": 1643066034, + "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "owner": "NixOS", + "repo": "nix", + "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.6.0", + "repo": "nix", + "type": "github" + } + }, + "nix_2": { + "inputs": { + "lowdown-src": "lowdown-src_2", + "nixpkgs": "nixpkgs_14", + "nixpkgs-regression": "nixpkgs-regression_2" + }, + "locked": { + "lastModified": 1646164353, + "narHash": "sha256-Nj3ARvplf0Xa+h4F5Cq1r9cc81C2UIpbAKDgJLsDmUc=", + "owner": "kreisys", + "repo": "nix", + "rev": "45677cae8d474270ecd797eb40eb1f8836981604", + "type": "github" + }, + "original": { + "owner": "kreisys", + "ref": "goodnix-maybe-dont-functor", + "repo": "nix", + "type": "github" + } + }, + "nix_3": { + "inputs": { + "lowdown-src": "lowdown-src_3", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1604400356, + "narHash": "sha256-PX1cSYv0Y6I2tidcuEwJTo8X5vAvf9vjdfHO51LD/J0=", + "owner": "NixOS", + "repo": "nix", + "rev": "cf82e14712b3be881b7c880468cd5486e8934638", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nix", + "type": "github" + } + }, + "nix_4": { + "inputs": { + "lowdown-src": "lowdown-src_4", + "nixpkgs": "nixpkgs_18", + "nixpkgs-regression": "nixpkgs-regression_3" + }, + "locked": { + "lastModified": 1645189081, + "narHash": "sha256-yZA+07JTG9Z610DceiYyzm+C08yHhcIgfl/Cp7lY3ho=", + "owner": "nixos", + "repo": "nix", + "rev": "9bc03adbba5334663901c1136203bc07e4776be9", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "type": "github" + } + }, + "nix_5": { + "inputs": { + "lowdown-src": "lowdown-src_5", + "nixpkgs": "nixpkgs_28", + "nixpkgs-regression": "nixpkgs-regression_4" + }, + "locked": { + "lastModified": 1652510778, + "narHash": "sha256-zldZ4SiwkISFXxrbY/UdwooIZ3Z/I6qKxtpc3zD0T/o=", + "owner": "nixos", + "repo": "nix", + "rev": "65cd26eebbbf80eaf0d74092f09b737606cb4b5a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "2.8.1", + "repo": "nix", + "type": "github" + } + }, + "nix_6": { + "inputs": { + "lowdown-src": "lowdown-src_6", + "nixpkgs": "nixpkgs_30", + "nixpkgs-regression": "nixpkgs-regression_5" + }, + "locked": { + "lastModified": 1645189081, + "narHash": "sha256-yZA+07JTG9Z610DceiYyzm+C08yHhcIgfl/Cp7lY3ho=", + "owner": "nixos", + "repo": "nix", + "rev": "9bc03adbba5334663901c1136203bc07e4776be9", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "type": "github" + } + }, + "nix_7": { + "inputs": { + "lowdown-src": "lowdown-src_7", + "nixpkgs": "nixpkgs_37", + "nixpkgs-regression": "nixpkgs-regression_6" + }, + "locked": { + "lastModified": 1644413094, + "narHash": "sha256-KLGaeSqvhuUFz6DxrB9r3w+lfp9bXIiCT9K1cqg7Ze8=", + "owner": "nixos", + "repo": "nix", + "rev": "52f52319ad21bdbd7a33bb85eccc83756648f110", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nix", + "rev": "52f52319ad21bdbd7a33bb85eccc83756648f110", + "type": "github" + } + }, + "nix_8": { + "inputs": { + "lowdown-src": "lowdown-src_8", + "nixpkgs": "nixpkgs_38", + "nixpkgs-regression": "nixpkgs-regression_7" + }, + "locked": { + "lastModified": 1645437800, + "narHash": "sha256-MAMIKi3sIQ0b3jzYyOb5VY29GRgv7JXl1VXoUM9xUZw=", + "owner": "NixOS", + "repo": "nix", + "rev": "f22b9e72f51f97f8f2d334748d3e97123940a146", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nix", + "rev": "f22b9e72f51f97f8f2d334748d3e97123940a146", + "type": "github" + } + }, + "nix_9": { + "inputs": { + "lowdown-src": "lowdown-src_9", + "nixpkgs": "nixpkgs_43", + "nixpkgs-regression": "nixpkgs-regression_8" + }, + "locked": { + "lastModified": 1646164353, + "narHash": "sha256-Nj3ARvplf0Xa+h4F5Cq1r9cc81C2UIpbAKDgJLsDmUc=", + "owner": "kreisys", + "repo": "nix", + "rev": "45677cae8d474270ecd797eb40eb1f8836981604", + "type": "github" + }, + "original": { + "owner": "kreisys", + "ref": "goodnix-maybe-dont-functor", + "repo": "nix", + "type": "github" + } + }, + "nixago": { + "inputs": { + "flake-utils": [ + "ctl", + "cardano-node", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "ctl", + "cardano-node", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "ctl", + "cardano-node", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago-exts": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago-exts_2": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago_2": { + "inputs": { + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "std", + "flake-utils" + ], + "nixago-exts": "nixago-exts", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1659153038, + "narHash": "sha256-g4npRU8YBR7CAqMF0SyXtkHnoY9q+NcxvZwcc6UvLBc=", + "owner": "nix-community", + "repo": "nixago", + "rev": "608abdd0fe6729d1f7244e03f1a7f8a5d6408898", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_3": { + "inputs": { + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "std", + "flake-utils" + ], + "nixago-exts": "nixago-exts_2", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1659153038, + "narHash": "sha256-g4npRU8YBR7CAqMF0SyXtkHnoY9q+NcxvZwcc6UvLBc=", + "owner": "nix-community", + "repo": "nixago", + "rev": "608abdd0fe6729d1f7244e03f1a7f8a5d6408898", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixlib": { + "locked": { + "lastModified": 1652576347, + "narHash": "sha256-52Wu7hkcIRcS4UenSSrt01J2sAbbQ6YqxZIDpuEPL/c=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "bdf553800c9c34ed00641785b02038f67f44d671", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixlib_2": { + "locked": { + "lastModified": 1644107864, + "narHash": "sha256-Wrbt6Gs+hjXD3HUICPBJHKnHEUqiyx8rzHCgvqC1Bok=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "58eabcf65e7dba189eb0013f86831c159e3b2be6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixlib_3": { + "locked": { + "lastModified": 1656809537, + "narHash": "sha256-pwXBYG3ThN4ccJjvcdNdonQ8Wyv0y/iYdnuesiFUY1U=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "40e271f69106323734b55e2ba74f13bebde324c0", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1687420147, + "narHash": "sha256-NILbmZVsoP2Aw0OAIXdbYXrWc/qggIDDyIwZ01yUx+Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d449a456ba7d81038fc9ec9141eae7ee3aaf2982", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003_2": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003_3": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003_4": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003_5": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003_6": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2003_7": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105": { + "locked": { + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105_2": { + "locked": { + "lastModified": 1642244250, + "narHash": "sha256-vWpUEqQdVP4srj+/YLJRTN9vjpTs4je0cdWKXPbDItc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0fd9ee1aa36ce865ad273f4f07fdc093adeb5c00", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105_3": { + "locked": { + "lastModified": 1645296114, + "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105_4": { + "locked": { + "lastModified": 1655034179, + "narHash": "sha256-rf1/7AbzuYDw6+8Xvvf3PtEOygymLBrFsFxvext5ZjI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "046ee4af7a9f016a364f8f78eeaa356ba524ac31", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105_5": { + "locked": { + "lastModified": 1645296114, + "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105_6": { + "locked": { + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105_7": { + "locked": { + "lastModified": 1645296114, + "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111": { + "locked": { + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111_2": { + "locked": { + "lastModified": 1644510859, + "narHash": "sha256-xjpVvL5ecbyi0vxtVl/Fh9bwGlMbw3S06zE5nUzFB8A=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0d1d5d7e3679fec9d07f2eb804d9f9fdb98378d3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111_3": { + "locked": { + "lastModified": 1648744337, + "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "type": "github" }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111_4": { + "locked": { + "lastModified": 1656782578, + "narHash": "sha256-1eMCBEqJplPotTo/SZ/t5HU6Sf2I8qKlZi9MX7jv9fw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "573603b7fdb9feb0eb8efc16ee18a015c667ab1b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111_5": { + "locked": { + "lastModified": 1648744337, + "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111_6": { + "locked": { + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111_7": { + "locked": { + "lastModified": 1648744337, + "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205": { + "locked": { + "lastModified": 1682600000, + "narHash": "sha256-ha4BehR1dh8EnXSoE1m/wyyYVvHI9txjW4w5/oxsW5Y=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "50fc86b75d2744e1ab3837ef74b53f103a9b55a0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_2": { + "locked": { + "lastModified": 1657876628, + "narHash": "sha256-URmf0O2cQ/3heg2DJOeLyU/JmfVMqG4X5t9crQXMaeY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "549d82bdd40f760a438c3c3497c1c61160f3de55", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_3": { + "locked": { + "lastModified": 1685573264, + "narHash": "sha256-Zffu01pONhs/pqH07cjlF10NnMDLok8ix5Uk4rhOnZQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "380be19fbd2d9079f677978361792cb25e8a3635", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2211": { + "locked": { + "lastModified": 1682682915, + "narHash": "sha256-haR0u/j/nUvlMloYlaOYq1FMXTvkNHw+wGxc+0qXisM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "09f1b33fcc0f59263137e23e935c1bb03ec920e4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2211_2": { + "locked": { + "lastModified": 1688392541, + "narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2305": { "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "lastModified": 1701362232, + "narHash": "sha256-GVdzxL0lhEadqs3hfRLuj+L1OJFGiL/L7gCcelgBlsw=", "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "repo": "nixpkgs", + "rev": "d2332963662edffacfddfad59ff4f709dde80ffe", "type": "github" }, "original": { "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "ref": "nixpkgs-23.05-darwin", + "repo": "nixpkgs", "type": "github" } }, - "nix_5": { - "inputs": { - "lowdown-src": "lowdown-src_5", - "nixpkgs": "nixpkgs_15", - "nixpkgs-regression": "nixpkgs-regression_5" - }, + "nixpkgs-2311": { "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "lastModified": 1701386440, + "narHash": "sha256-xI0uQ9E7JbmEy/v8kR9ZQan6389rHug+zOtZeZFiDJk=", "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "repo": "nixpkgs", + "rev": "293822e55ec1872f715a66d0eda9e592dc14419f", "type": "github" }, "original": { "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "ref": "nixpkgs-23.11-darwin", + "repo": "nixpkgs", "type": "github" } }, - "nix_6": { - "inputs": { - "lowdown-src": "lowdown-src_6", - "nixpkgs": "nixpkgs_19", - "nixpkgs-regression": "nixpkgs-regression_6" + "nixpkgs-docker": { + "locked": { + "lastModified": 1652739558, + "narHash": "sha256-znGkjGugajqF/sFS+H4+ENmGTaVPFE0uu1JjQZJLEaQ=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ff691ed9ba21528c1b4e034f36a04027e4522c58", + "type": "github" }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ff691ed9ba21528c1b4e034f36a04027e4522c58", + "type": "github" + } + }, + "nixpkgs-regression": { "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" } }, - "nixago": { - "inputs": { - "flake-utils": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "std", - "flake-utils" - ], - "nixago-exts": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "nixpkgs": [ - "ctl", - "ogmios", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] + "nixpkgs-regression_10": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-regression_11": { "locked": { - "lastModified": 1661824785, - "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", - "owner": "nix-community", - "repo": "nixago", - "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "nix-community", - "repo": "nixago", + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-regression_12": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" + }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixago_2": { - "inputs": { - "flake-utils": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "flake-utils" - ], - "nixago-exts": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] + "nixpkgs-regression_13": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-regression_14": { "locked": { - "lastModified": 1661824785, - "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", - "owner": "nix-community", - "repo": "nixago", - "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "nix-community", - "repo": "nixago", + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-regression_2": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" + }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixago_3": { - "inputs": { - "flake-utils": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "flake-utils" - ], - "nixago-exts": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "nixpkgs": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", - "nixpkgs" - ] + "nixpkgs-regression_3": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-regression_4": { "locked": { - "lastModified": 1661824785, - "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", - "owner": "nix-community", - "repo": "nixago", - "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "nix-community", - "repo": "nixago", + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-regression_5": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" + }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs": { + "nixpkgs-regression_6": { "locked": { - "lastModified": 1674487464, - "narHash": "sha256-Jgq50e4S4JVCYpWLqrabBzDp/1mfaxHCh8/OOorHTy0=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3954218cf613eba8e0dcefa9abe337d26bc48fd0", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "indirect" } }, - "nixpkgs-2003": { + "nixpkgs-regression_7": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-2003_10": { + "nixpkgs-regression_8": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-2003_11": { + "nixpkgs-regression_9": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" } }, - "nixpkgs-2003_12": { + "nixpkgs-unstable": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1682656005, + "narHash": "sha256-fYplYo7so1O+rSQ2/aS+SbTPwLTeoUXk4ekKNtSl4P8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "6806b63e824f84b0f0e60b6d660d4ae753de0477", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_2": { + "nixpkgs-unstable_2": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", + "lastModified": 1646331602, + "narHash": "sha256-cRuytTfel52z947yKfJcZU7zbQBgM16qqTf+oJkVwtg=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "ad267cc9cf3d5a6ae63940df31eb31382d6356e6", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_3": { + "nixpkgs-unstable_3": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", + "lastModified": 1656338871, + "narHash": "sha256-+LOvZFt3MpWtrxXLH4igQtRVzyD43VnuTJjDVbt7phY=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "819e4d63fc7f337a822a049fd055cd7615a5e0d6", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_4": { + "nixpkgs-unstable_4": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", + "lastModified": 1646331602, + "narHash": "sha256-cRuytTfel52z947yKfJcZU7zbQBgM16qqTf+oJkVwtg=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "ad267cc9cf3d5a6ae63940df31eb31382d6356e6", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_5": { + "nixpkgs-unstable_5": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1648219316, + "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_6": { + "nixpkgs-unstable_6": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1657888067, + "narHash": "sha256-GnwJoFBTPfW3+mz7QEeJEEQ9OMHZOiIJ/qDhZxrlKh8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "65fae659e31098ca4ac825a6fef26d890aaf3f4e", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_7": { + "nixpkgs-unstable_7": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1648219316, + "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_8": { + "nixpkgs-unstable_8": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1701336116, + "narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "f5c27c6136db4d76c30e533c20517df6864c46ee", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2003_9": { + "nixpkgs-unstable_9": { "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "lastModified": 1648219316, + "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105": { + "nixpkgs_10": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1644972330, + "narHash": "sha256-6V2JFpTUzB9G+KcqtUR1yl7f6rd9495YrFECslEmbGw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "19574af0af3ffaf7c9e359744ed32556f34536bd", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105_10": { + "nixpkgs_11": { "locked": { - "lastModified": 1630481079, - "narHash": "sha256-leWXLchbAbqOlLT6tju631G40SzQWPqaAXQG3zH1Imw=", + "lastModified": 1627969475, + "narHash": "sha256-MhVtkVt1MFfaDY3ObJu54NBcsaPk19vOBZ8ouhjO4qs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "110a2c9ebbf5d4a94486854f18a37a938cfacbbb", + "rev": "bd27e2e8316ac6eab11aa35c586e743286f23ecf", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "type": "indirect" } }, - "nixpkgs-2105_11": { + "nixpkgs_12": { "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "lastModified": 1644972330, + "narHash": "sha256-6V2JFpTUzB9G+KcqtUR1yl7f6rd9495YrFECslEmbGw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "rev": "19574af0af3ffaf7c9e359744ed32556f34536bd", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105_12": { + "nixpkgs_13": { "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105_2": { + "nixpkgs_14": { "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" } }, - "nixpkgs-2105_3": { + "nixpkgs_15": { "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", - "owner": "NixOS", + "lastModified": 1638452135, + "narHash": "sha256-5Il6hgrTgcWIsB7zug0yDFccYXx7pJCw8cwJdXMuLfM=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "owner": "nixos", "repo": "nixpkgs", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", "type": "github" } }, - "nixpkgs-2105_4": { + "nixpkgs_16": { "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", + "lastModified": 1602702596, + "narHash": "sha256-fqJ4UgOb4ZUnCDIapDb4gCrtAah5Rnr2/At3IzMitig=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", + "rev": "ad0d20345219790533ebe06571f82ed6b034db31", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-20.09-small", + "type": "indirect" } }, - "nixpkgs-2105_5": { + "nixpkgs_17": { "locked": { - "lastModified": 1630481079, - "narHash": "sha256-leWXLchbAbqOlLT6tju631G40SzQWPqaAXQG3zH1Imw=", + "lastModified": 1638887115, + "narHash": "sha256-emjtIeqyJ84Eb3X7APJruTrwcfnHQKs55XGljj62prs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "110a2c9ebbf5d4a94486854f18a37a938cfacbbb", + "rev": "1bd4bbd49bef217a3d1adea43498270d6e779d65", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "ref": "nixos-21.11", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105_6": { + "nixpkgs_18": { "locked": { - "lastModified": 1659914493, - "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" } }, - "nixpkgs-2105_7": { + "nixpkgs_19": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", + "lastModified": 1641909823, + "narHash": "sha256-Uxo+Wm6c/ijNhaJlYtFLJG9mh75FYZaBreMC2ZE0nEY=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "f0f67400bc49c44f305d6fe17698a2f1ce1c29a0", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2105_8": { + "nixpkgs_2": { "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", + "lastModified": 1642336556, + "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", + "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "type": "indirect" } }, - "nixpkgs-2105_9": { + "nixpkgs_20": { "locked": { - "lastModified": 1640283157, - "narHash": "sha256-6Ddfop+rKE+Gl9Tjp9YIrkfoYPzb8F80ergdjcq3/MY=", - "owner": "NixOS", + "lastModified": 1647350163, + "narHash": "sha256-OcMI+PFEHTONthXuEQNddt16Ml7qGvanL3x8QOl2Aao=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "dde1557825c5644c869c5efc7448dc03722a8f09", + "rev": "3eb07eeafb52bcbf02ce800f032f18d666a9498d", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111": { + "nixpkgs_21": { "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_10": { + "nixpkgs_22": { "locked": { - "lastModified": 1638410074, - "narHash": "sha256-MQYI4k4XkoTzpeRjq5wl+1NShsl1CKq8MISFuZ81sWs=", + "lastModified": 1646506091, + "narHash": "sha256-sWNAJE2m+HOh1jtXlHcnhxsj6/sXrHgbqVNcVRlveK4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5b80f23502f8e902612a8c631dfce383e1c56596", + "rev": "3e644bd62489b516292c816f70bf0052c693b3c7", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_11": { + "nixpkgs_23": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", - "owner": "NixOS", + "lastModified": 1658119717, + "narHash": "sha256-4upOZIQQ7Bc4CprqnHsKnqYfw+arJeAuU+QcpjYBXW0=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "rev": "9eb60f25aff0d2218c848dd4574a0ab5e296cabe", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_12": { + "nixpkgs_24": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_2": { + "nixpkgs_25": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "lastModified": 1652576347, + "narHash": "sha256-52Wu7hkcIRcS4UenSSrt01J2sAbbQ6YqxZIDpuEPL/c=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "bdf553800c9c34ed00641785b02038f67f44d671", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", + "owner": "nix-community", + "repo": "nixpkgs.lib", "type": "github" } }, - "nixpkgs-2111_3": { + "nixpkgs_26": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_4": { + "nixpkgs_27": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", + "lastModified": 1642451377, + "narHash": "sha256-hvAuYDUN8XIrcQKE6wDw4LjTCcwrTp2B1i1i/5vfDMQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "e5b47c5c21336e3fdd887d24c7e34363fa09c6d7", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_5": { + "nixpkgs_28": { "locked": { - "lastModified": 1638410074, - "narHash": "sha256-MQYI4k4XkoTzpeRjq5wl+1NShsl1CKq8MISFuZ81sWs=", + "lastModified": 1645296114, + "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5b80f23502f8e902612a8c631dfce383e1c56596", + "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" } }, - "nixpkgs-2111_6": { + "nixpkgs_29": { "locked": { - "lastModified": 1659446231, - "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "lastModified": 1652559422, + "narHash": "sha256-jPVTNImBTUIFdtur+d4IVot6eXmsvtOcBm0TzxmhWPk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "rev": "8b3398bc7587ebb79f93dfeea1b8c574d3c6dba1", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "owner": "nixos", + "ref": "nixos-21.11", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_7": { + "nixpkgs_3": { "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "lastModified": 1657693803, + "narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "rev": "365e1b3a859281cf11b94f87231adeabbdd878a2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "ref": "nixos-22.05-small", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2111_8": { + "nixpkgs_30": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" } }, - "nixpkgs-2111_9": { + "nixpkgs_31": { "locked": { - "lastModified": 1640283207, - "narHash": "sha256-SCwl7ZnCfMDsuSYvwIroiAlk7n33bW8HFfY8NvKhcPA=", - "owner": "NixOS", + "lastModified": 1641909823, + "narHash": "sha256-Uxo+Wm6c/ijNhaJlYtFLJG9mh75FYZaBreMC2ZE0nEY=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "64c7e3388bbd9206e437713351e814366e0c3284", + "rev": "f0f67400bc49c44f305d6fe17698a2f1ce1c29a0", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2205": { + "nixpkgs_32": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", - "owner": "NixOS", + "lastModified": 1647350163, + "narHash": "sha256-OcMI+PFEHTONthXuEQNddt16Ml7qGvanL3x8QOl2Aao=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "3eb07eeafb52bcbf02ce800f032f18d666a9498d", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2205_2": { + "nixpkgs_33": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2205_3": { + "nixpkgs_34": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", - "owner": "NixOS", + "lastModified": 1658311025, + "narHash": "sha256-GqagY5YmaZB3YaO41kKcQhe5RcpS83wnsW8iCu5Znqo=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "cd8d1784506a7c7eb0796772b73437e0b82fad57", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2205_4": { + "nixpkgs_35": { "locked": { - "lastModified": 1663981975, - "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", - "owner": "NixOS", + "lastModified": 1646331602, + "narHash": "sha256-cRuytTfel52z947yKfJcZU7zbQBgM16qqTf+oJkVwtg=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "rev": "ad267cc9cf3d5a6ae63940df31eb31382d6356e6", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-22.05-darwin", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-2211": { + "nixpkgs_36": { "locked": { - "lastModified": 1669997163, - "narHash": "sha256-vhjC0kZMFoN6jzK0GR+tBzKi5KgBXgehadfidW8+Va4=", + "lastModified": 1643381941, + "narHash": "sha256-pHTwvnN4tTsEKkWlXQ8JMY423epos8wUOhthpwJjtpc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "6f87491a54d8d64d30af6663cb3bf5d2ee7db958", + "rev": "5efc8ca954272c4376ac929f4c5ffefcc20551d5", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-22.11-darwin", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-regression": { + "nixpkgs_37": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "ref": "nixos-21.05-small", "type": "indirect" } }, - "nixpkgs-regression_2": { + "nixpkgs_38": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "ref": "nixos-21.05-small", "type": "indirect" } }, - "nixpkgs-regression_3": { + "nixpkgs_39": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1644486793, + "narHash": "sha256-EeijR4guVHgVv+JpOX3cQO+1XdrkJfGmiJ9XVsVU530=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "1882c6b7368fd284ad01b0a5b5601ef136321292", "type": "github" }, "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, - "nixpkgs-regression_4": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" } }, - "nixpkgs-regression_5": { + "nixpkgs_4": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs-regression_6": { + "nixpkgs_40": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1627969475, + "narHash": "sha256-MhVtkVt1MFfaDY3ObJu54NBcsaPk19vOBZ8ouhjO4qs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "bd27e2e8316ac6eab11aa35c586e743286f23ecf", "type": "github" }, "original": { "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "indirect" } }, - "nixpkgs-unstable": { + "nixpkgs_41": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1644972330, + "narHash": "sha256-6V2JFpTUzB9G+KcqtUR1yl7f6rd9495YrFECslEmbGw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "19574af0af3ffaf7c9e359744ed32556f34536bd", "type": "github" }, "original": { @@ -5845,141 +7480,170 @@ "type": "github" } }, - "nixpkgs-unstable_10": { + "nixpkgs_42": { "locked": { - "lastModified": 1635295995, - "narHash": "sha256-sGYiXjFlxTTMNb4NSkgvX+knOOTipE6gqwPUQpxNF+c=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "22a500a3f87bbce73bd8d777ef920b43a636f018", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_11": { + "nixpkgs_43": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" } }, - "nixpkgs-unstable_12": { + "nixpkgs_44": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", - "owner": "NixOS", + "lastModified": 1638452135, + "narHash": "sha256-5Il6hgrTgcWIsB7zug0yDFccYXx7pJCw8cwJdXMuLfM=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", "type": "github" }, "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "43cdc5b364511eabdcad9fde639777ffd9e5bab1", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1602702596, + "narHash": "sha256-fqJ4UgOb4ZUnCDIapDb4gCrtAah5Rnr2/At3IzMitig=", "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", + "rev": "ad0d20345219790533ebe06571f82ed6b034db31", "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-20.09-small", + "type": "indirect" } }, - "nixpkgs-unstable_2": { + "nixpkgs_46": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", + "lastModified": 1638887115, + "narHash": "sha256-emjtIeqyJ84Eb3X7APJruTrwcfnHQKs55XGljj62prs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "1bd4bbd49bef217a3d1adea43498270d6e779d65", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-21.11", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_3": { + "nixpkgs_47": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { - "owner": "NixOS", + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs_48": { + "locked": { + "lastModified": 1641909823, + "narHash": "sha256-Uxo+Wm6c/ijNhaJlYtFLJG9mh75FYZaBreMC2ZE0nEY=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "f0f67400bc49c44f305d6fe17698a2f1ce1c29a0", + "type": "github" + }, + "original": { + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_4": { + "nixpkgs_49": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", - "owner": "NixOS", + "lastModified": 1647350163, + "narHash": "sha256-OcMI+PFEHTONthXuEQNddt16Ml7qGvanL3x8QOl2Aao=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "3eb07eeafb52bcbf02ce800f032f18d666a9498d", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_5": { + "nixpkgs_5": { "locked": { - "lastModified": 1635295995, - "narHash": "sha256-sGYiXjFlxTTMNb4NSkgvX+knOOTipE6gqwPUQpxNF+c=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "22a500a3f87bbce73bd8d777ef920b43a636f018", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_6": { + "nixpkgs_50": { "locked": { - "lastModified": 1663905476, - "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_7": { + "nixpkgs_51": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1646506091, + "narHash": "sha256-sWNAJE2m+HOh1jtXlHcnhxsj6/sXrHgbqVNcVRlveK4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "3e644bd62489b516292c816f70bf0052c693b3c7", "type": "github" }, "original": { @@ -5989,61 +7653,61 @@ "type": "github" } }, - "nixpkgs-unstable_8": { + "nixpkgs_52": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", - "owner": "NixOS", + "lastModified": 1658119717, + "narHash": "sha256-4upOZIQQ7Bc4CprqnHsKnqYfw+arJeAuU+QcpjYBXW0=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "9eb60f25aff0d2218c848dd4574a0ab5e296cabe", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-unstable_9": { + "nixpkgs_53": { "locked": { - "lastModified": 1641285291, - "narHash": "sha256-KYaOBNGar3XWTxTsYPr9P6u74KAqNq0wobEC236U+0c=", - "owner": "NixOS", + "lastModified": 1644525281, + "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "0432195a4b8d68faaa7d3d4b355260a3120aeeae", + "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_10": { + "nixpkgs_54": { "locked": { - "lastModified": 1665087388, - "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "lastModified": 1646470760, + "narHash": "sha256-dQISyucVCCPaFioUhy5ZgfBz8rOMKGI8k13aPDFTqEs=", "owner": "nixos", "repo": "nixpkgs", - "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "rev": "1fc7212a2c3992eedc6eedf498955c321ad81cc2", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", + "rev": "1fc7212a2c3992eedc6eedf498955c321ad81cc2", "type": "github" } }, - "nixpkgs_11": { + "nixpkgs_55": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1619531122, + "narHash": "sha256-ovm5bo6PkZzNKh2YGXbRKYIjega0EjiEP0YDwyeXEYU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "bb80d578e8ad3cb5a607f468ac00cc546d0396dc", "type": "github" }, "original": { @@ -6051,28 +7715,29 @@ "type": "indirect" } }, - "nixpkgs_12": { + "nixpkgs_56": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "lastModified": 1656461576, + "narHash": "sha256-rlmmw6lIlkMQIiB+NsnO8wQYWTfle8TA41UREPLP5VY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "cf3ab54b4afe2b7477faa1dd0b65bf74c055d70c", + "type": "github" + }, + "original": { "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" } }, - "nixpkgs_13": { + "nixpkgs_57": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1655567057, + "narHash": "sha256-Cc5hQSMsTzOHmZnYm8OSJ5RNUp22bd5NADWLHorULWQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "e0a42267f73ea52adc061a64650fddc59906fc99", "type": "github" }, "original": { @@ -6080,13 +7745,13 @@ "type": "indirect" } }, - "nixpkgs_14": { + "nixpkgs_58": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1656401090, + "narHash": "sha256-bUS2nfQsvTQW2z8SK7oEFSElbmoBahOPtbXPm0AL3I4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "16de63fcc54e88b9a106a603038dd5dd2feb21eb", "type": "github" }, "original": { @@ -6094,7 +7759,7 @@ "type": "indirect" } }, - "nixpkgs_15": { + "nixpkgs_59": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -6109,23 +7774,7 @@ "type": "indirect" } }, - "nixpkgs_16": { - "locked": { - "lastModified": 1653581809, - "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_17": { + "nixpkgs_6": { "locked": { "lastModified": 1654807842, "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", @@ -6140,23 +7789,22 @@ "type": "github" } }, - "nixpkgs_18": { + "nixpkgs_60": { "locked": { - "lastModified": 1665087388, - "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "lastModified": 1656809537, + "narHash": "sha256-pwXBYG3ThN4ccJjvcdNdonQ8Wyv0y/iYdnuesiFUY1U=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "40e271f69106323734b55e2ba74f13bebde324c0", "type": "github" }, "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", + "owner": "nix-community", + "repo": "nixpkgs.lib", "type": "github" } }, - "nixpkgs_19": { + "nixpkgs_61": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -6171,44 +7819,60 @@ "type": "indirect" } }, - "nixpkgs_2": { + "nixpkgs_62": { "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_20": { + "nixpkgs_63": { "locked": { - "lastModified": 1653581809, - "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", + "lastModified": 1656947410, + "narHash": "sha256-htDR/PZvjUJGyrRJsVqDmXR8QeoswBaRLzHt13fd0iY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "rev": "e8d47977286a44955262adbc76f2c8a66e7419d5", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixos-22.05", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_21": { + "nixpkgs_64": { "locked": { - "lastModified": 1654807842, - "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "lastModified": 1658311025, + "narHash": "sha256-GqagY5YmaZB3YaO41kKcQhe5RcpS83wnsW8iCu5Znqo=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "cd8d1784506a7c7eb0796772b73437e0b82fad57", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1642451377, + "narHash": "sha256-hvAuYDUN8XIrcQKE6wDw4LjTCcwrTp2B1i1i/5vfDMQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "rev": "e5b47c5c21336e3fdd887d24c7e34363fa09c6d7", "type": "github" }, "original": { @@ -6217,37 +7881,39 @@ "type": "github" } }, - "nixpkgs_22": { + "nixpkgs_66": { "locked": { - "lastModified": 1665087388, - "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "lastModified": 1653920503, + "narHash": "sha256-BBeCZwZImtjP3oYy4WogkQYy5OxNyfNciVSc1AfZgLQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "rev": "a634c8f6c1fbf9b9730e01764999666f3436f10a", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", + "ref": "nixos-22.05", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_67": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", - "owner": "NixOS", + "lastModified": 1650469885, + "narHash": "sha256-BuILRZ6pzMnGey8/irbjGq1oo3vIvZa1pitSdZCmIXA=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "df78cc4e2a46fca75d14508a5d2ed3494add28ff", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_68": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -6262,35 +7928,55 @@ "type": "indirect" } }, - "nixpkgs_5": { + "nixpkgs_69": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1657693803, + "narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "365e1b3a859281cf11b94f87231adeabbdd878a2", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-22.05-small", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_6": { + "nixpkgs_7": { "locked": { - "lastModified": 1642336556, - "narHash": "sha256-QSPPbFEwy0T0DrIuSzAACkaANPQaR1lZR/nHZGz9z04=", + "lastModified": 1674407282, + "narHash": "sha256-2qwc8mrPINSFdWffPK+ji6nQ9aGnnZyHSItVcYDZDlk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ab1254087f4cdf4af74b552d7fc95175d9bdbb49", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1697723726, + "narHash": "sha256-SaTWPkI8a5xSHX/rrKzUe+/uVNy6zCGMXgoeMb7T9rg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f3d9d4bd898cca7d04af2ae4f6ef01f2219df3d6", + "rev": "7c9cc5a6e5d38010801741ac830a3f8fd667a7a0", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs_7": { + "nixpkgs_71": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -6307,278 +7993,297 @@ }, "nixpkgs_8": { "locked": { - "lastModified": 1653581809, - "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", - "owner": "NixOS", + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixos-unstable", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_9": { "locked": { - "lastModified": 1654807842, - "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "lastModified": 1627969475, + "narHash": "sha256-MhVtkVt1MFfaDY3ObJu54NBcsaPk19vOBZ8ouhjO4qs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "rev": "bd27e2e8316ac6eab11aa35c586e743286f23ecf", "type": "github" }, "original": { - "owner": "NixOS", - "repo": "nixpkgs", + "id": "nixpkgs", + "type": "indirect" + } + }, + "nomad": { + "inputs": { + "nix": "nix_3", + "nixpkgs": "nixpkgs_17", + "utils": "utils_4" + }, + "locked": { + "lastModified": 1648128770, + "narHash": "sha256-iv5Zjddi28OJH7Kh8/oGJ0k32PQXiY+56qXKiLIxSEI=", + "owner": "input-output-hk", + "repo": "nomad", + "rev": "beb504f6c8bd832e1d4509e4104187774b8ecfc0", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "release-1.2.6", + "repo": "nomad", "type": "github" } }, - "node-process": { - "flake": false, + "nomad-driver-nix": { + "inputs": { + "devshell": "devshell_2", + "inclusive": "inclusive", + "nix": "nix_4", + "nixpkgs": "nixpkgs_19", + "utils": "utils_5" + }, "locked": { - "lastModified": 1648681325, - "narHash": "sha256-6oWDYmMb+V4x0jCoYDzKfBJMpr7Mx5zA3WMpNHspuSw=", + "lastModified": 1648029666, + "narHash": "sha256-kShItLLtoWLqE+6Uzc8171a+NXST4arZgxEP0SYPp44=", "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "78675fbf8986c87c0d2356b727a0ec2060f1adba", + "repo": "nomad-driver-nix", + "rev": "0be4fea24e1b747389b2e79813891805fed521b6", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-node", + "repo": "nomad-driver-nix", "type": "github" } }, - "node-process_2": { - "flake": false, + "nomad-driver-nix_2": { + "inputs": { + "devshell": "devshell_5", + "inclusive": "inclusive_4", + "nix": "nix_6", + "nixpkgs": "nixpkgs_31", + "utils": "utils_10" + }, "locked": { - "lastModified": 1654323094, - "narHash": "sha256-zbmpZeBgUUly8QgR2mrVUN0A+0iLczufNvCCRxAo3GY=", + "lastModified": 1648029666, + "narHash": "sha256-kShItLLtoWLqE+6Uzc8171a+NXST4arZgxEP0SYPp44=", "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "ec20745f17cb4fa8824fdf341d1412c774bc94b9", + "repo": "nomad-driver-nix", + "rev": "0be4fea24e1b747389b2e79813891805fed521b6", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-node", + "repo": "nomad-driver-nix", "type": "github" } }, - "node-snapshot": { + "nomad-driver-nix_3": { "inputs": { - "customConfig": "customConfig_2", - "haskellNix": "haskellNix_2", - "iohkNix": "iohkNix_2", - "membench": "membench", - "nixpkgs": [ - "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "haskellNix", - "nixpkgs-2105" - ], - "plutus-example": "plutus-example", - "utils": "utils_3" + "devshell": "devshell_12", + "inclusive": "inclusive_9", + "nix": "nix_11", + "nixpkgs": "nixpkgs_48", + "utils": "utils_19" }, "locked": { - "lastModified": 1645120669, - "narHash": "sha256-2MKfGsYS5n69+pfqNHb4IH/E95ok1MD7mhEYfUpRcz4=", + "lastModified": 1648029666, + "narHash": "sha256-kShItLLtoWLqE+6Uzc8171a+NXST4arZgxEP0SYPp44=", "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "repo": "nomad-driver-nix", + "rev": "0be4fea24e1b747389b2e79813891805fed521b6", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "repo": "nomad-driver-nix", "type": "github" } }, - "node-snapshot_2": { + "nomad-follower": { "inputs": { - "customConfig": "customConfig_6", - "haskellNix": "haskellNix_6", - "iohkNix": "iohkNix_6", - "membench": "membench_3", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "haskellNix", - "nixpkgs-2105" - ], - "plutus-example": "plutus-example_2", - "utils": "utils_8" + "devshell": "devshell_3", + "inclusive": "inclusive_2", + "nixpkgs": "nixpkgs_20", + "utils": "utils_6" }, "locked": { - "lastModified": 1645120669, - "narHash": "sha256-2MKfGsYS5n69+pfqNHb4IH/E95ok1MD7mhEYfUpRcz4=", + "lastModified": 1649836589, + "narHash": "sha256-0mKWIfF7RtkwiJv2NlWKisdyivsSlHMTAQ3P72RSD3k=", "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "repo": "nomad-follower", + "rev": "18cafe87df773e61a6ce300d9ff91dee4aeae053", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "7f00e3ea5a61609e19eeeee4af35241571efdf5c", + "repo": "nomad-follower", "type": "github" } }, - "ogmios": { + "nomad-follower_2": { "inputs": { - "CHaP": "CHaP", - "blank": "blank", - "cardano-configurations": "cardano-configurations_2", - "cardano-node": "cardano-node", - "flake-compat": "flake-compat_4", - "haskell-nix": "haskell-nix_2", - "iohk-nix": "iohk-nix_2", - "nixpkgs": [ - "ctl", - "ogmios", - "haskell-nix", - "nixpkgs-unstable" - ] + "devshell": "devshell_6", + "inclusive": "inclusive_5", + "nixpkgs": "nixpkgs_32", + "utils": "utils_11" }, "locked": { - "lastModified": 1670513793, - "narHash": "sha256-A3qj7tUSjya+ZI4lFkdJbOxelQhgQLc9RNPhcNJLIkw=", - "owner": "mlabs-haskell", - "repo": "ogmios", - "rev": "a7687bc03b446bc74564abe1873fbabfa1aac196", + "lastModified": 1658244176, + "narHash": "sha256-oM+7WdbXcTiDEfuuiiVLlJi/MTRgSBwFdzVkFWsC8so=", + "owner": "input-output-hk", + "repo": "nomad-follower", + "rev": "bd8cc28c94ba8bd48c4d4be5ab14f3904328dde3", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "ogmios", - "rev": "a7687bc03b446bc74564abe1873fbabfa1aac196", + "owner": "input-output-hk", + "repo": "nomad-follower", "type": "github" } }, - "ogmios-nixos": { + "nomad-follower_3": { "inputs": { - "CHaP": "CHaP_3", - "blank": "blank_3", - "cardano-configurations": "cardano-configurations_3", - "cardano-node": "cardano-node_2", - "flake-compat": "flake-compat_8", - "haskell-nix": "haskell-nix_3", - "iohk-nix": "iohk-nix_3", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "nixpkgs-unstable" - ] + "devshell": "devshell_13", + "inclusive": "inclusive_10", + "nixpkgs": "nixpkgs_49", + "utils": "utils_20" }, "locked": { - "lastModified": 1668087435, - "narHash": "sha256-pbx/+mP2pu4vQuTV3YtFXrOZOVOBS9JH9eDqgjnHyZ4=", - "owner": "mlabs-haskell", - "repo": "ogmios", - "rev": "3b229c1795efa30243485730b78ea053992fdc7a", + "lastModified": 1649836589, + "narHash": "sha256-0mKWIfF7RtkwiJv2NlWKisdyivsSlHMTAQ3P72RSD3k=", + "owner": "input-output-hk", + "repo": "nomad-follower", + "rev": "18cafe87df773e61a6ce300d9ff91dee4aeae053", "type": "github" }, "original": { - "owner": "mlabs-haskell", - "repo": "ogmios", + "owner": "input-output-hk", + "repo": "nomad-follower", "type": "github" } }, - "old-ghc-nix": { - "flake": false, + "nomad_2": { + "inputs": { + "nix": "nix_10", + "nixpkgs": "nixpkgs_46", + "utils": "utils_18" + }, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1648128770, + "narHash": "sha256-iv5Zjddi28OJH7Kh8/oGJ0k32PQXiY+56qXKiLIxSEI=", + "owner": "input-output-hk", + "repo": "nomad", + "rev": "beb504f6c8bd832e1d4509e4104187774b8ecfc0", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "input-output-hk", + "ref": "release-1.2.6", + "repo": "nomad", "type": "github" } }, - "old-ghc-nix_10": { - "flake": false, + "nosys": { "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1667881534, + "narHash": "sha256-FhwJ15uPLRsvaxtt/bNuqE/ykMpNAPF0upozFKhTtXM=", + "owner": "divnix", + "repo": "nosys", + "rev": "2d0d5207f6a230e9d0f660903f8db9807b54814f", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "divnix", + "repo": "nosys", "type": "github" } }, - "old-ghc-nix_11": { + "ogmios": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1657544501, + "narHash": "sha256-fAQEj/toAIyKTQWgw/fTVe3wpCsBnCCJgcQ7+QiMpO4=", + "owner": "CardanoSolutions", + "repo": "ogmios", + "rev": "a0dfd03117afe4db5daa7ebb818310d6bcef2990", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "CardanoSolutions", + "ref": "v5.5.2", + "repo": "ogmios", "type": "github" } }, - "old-ghc-nix_12": { - "flake": false, + "ogmios-nixos": { + "inputs": { + "CHaP": "CHaP_3", + "blank": "blank_5", + "cardano-configurations": "cardano-configurations_2", + "cardano-node": [ + "ctl", + "cardano-node" + ], + "flake-compat": "flake-compat_13", + "haskell-nix": [ + "ctl", + "haskell-nix" + ], + "iohk-nix": [ + "ctl", + "iohk-nix" + ], + "nixpkgs": [ + "ctl", + "nixpkgs" + ], + "ogmios-src": [ + "ctl", + "ogmios" + ] + }, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1695289922, + "narHash": "sha256-WeZkYCyvOqnVx9zYgyO2rh0rd3O2DmxH0HZ4OJnf/aw=", + "owner": "mlabs-haskell", + "repo": "ogmios-nixos", + "rev": "78e829e9ebd50c5891024dcd1004c2ac51facd80", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "mlabs-haskell", + "repo": "ogmios-nixos", + "rev": "78e829e9ebd50c5891024dcd1004c2ac51facd80", "type": "github" } }, - "old-ghc-nix_2": { + "ogmios_2": { "flake": false, "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "lastModified": 1691769233, + "narHash": "sha256-7CLprKq3RwJfvy31LAPux+DYFLjEmbRBFgvtYDpJA8Q=", + "owner": "CardanoSolutions", + "repo": "ogmios", + "rev": "3d3f359b0987c009ef66fb4d4b4bddce92b9aeb3", "type": "github" }, "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", + "owner": "CardanoSolutions", + "ref": "v6.0.0", + "repo": "ogmios", "type": "github" } }, - "old-ghc-nix_3": { + "old-ghc-nix": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6595,7 +8300,7 @@ "type": "github" } }, - "old-ghc-nix_4": { + "old-ghc-nix_2": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6612,7 +8317,7 @@ "type": "github" } }, - "old-ghc-nix_5": { + "old-ghc-nix_3": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6629,7 +8334,7 @@ "type": "github" } }, - "old-ghc-nix_6": { + "old-ghc-nix_4": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6646,7 +8351,7 @@ "type": "github" } }, - "old-ghc-nix_7": { + "old-ghc-nix_5": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6663,7 +8368,7 @@ "type": "github" } }, - "old-ghc-nix_8": { + "old-ghc-nix_6": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6680,7 +8385,7 @@ "type": "github" } }, - "old-ghc-nix_9": { + "old-ghc-nix_7": { "flake": false, "locked": { "lastModified": 1631092763, @@ -6697,307 +8402,622 @@ "type": "github" } }, - "ouroboros-network": { + "ops-lib": { "flake": false, "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", + "lastModified": 1675186784, + "narHash": "sha256-HqDtrvk1l7YeREzCSEpUtChtlEgT6Tww9WrJiozjukc=", "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "repo": "ops-lib", + "rev": "5be29ed53b2a4cbbf4cf326fa2e9c1f2b754d26d", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "ouroboros-network", + "repo": "ops-lib", "type": "github" } }, - "ouroboros-network_2": { + "ops-lib_2": { "flake": false, "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", + "lastModified": 1649848729, + "narHash": "sha256-5zN9gpn+DwdB67bcHfDD8zgMnR0EaJd2JVNMyL6J1N0=", "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "repo": "ops-lib", + "rev": "517c747f4d5d56e626f62618803bfccb09f14019", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "ouroboros-network", + "repo": "ops-lib", "type": "github" } }, - "ouroboros-network_3": { + "ops-lib_3": { "flake": false, "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", + "lastModified": 1649848729, + "narHash": "sha256-5zN9gpn+DwdB67bcHfDD8zgMnR0EaJd2JVNMyL6J1N0=", "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "repo": "ops-lib", + "rev": "517c747f4d5d56e626f62618803bfccb09f14019", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "ouroboros-network", + "repo": "ops-lib", "type": "github" } }, - "ouroboros-network_4": { + "ops-lib_4": { "flake": false, "locked": { - "lastModified": 1643385024, - "narHash": "sha256-9R4Z1jBsTcEgBHxhzjCJnroEcdfMsTjf8kwg6uPue+Q=", + "lastModified": 1649848729, + "narHash": "sha256-5zN9gpn+DwdB67bcHfDD8zgMnR0EaJd2JVNMyL6J1N0=", "owner": "input-output-hk", - "repo": "ouroboros-network", - "rev": "8e97076176d465f5f4f86d5b5596220272630649", + "repo": "ops-lib", + "rev": "517c747f4d5d56e626f62618803bfccb09f14019", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "ouroboros-network", + "repo": "ops-lib", "type": "github" } }, "plutip": { "inputs": { - "CHaP": [ + "CHaP": "CHaP_4", + "cardano-node": [ "ctl", - "plutip", - "bot-plutus-interface", - "CHaP" + "cardano-node" ], - "bot-plutus-interface": "bot-plutus-interface", "flake-compat": "flake-compat_14", + "hackage-nix": [ + "ctl", + "hackage-nix" + ], "haskell-nix": [ "ctl", - "plutip", - "bot-plutus-interface", "haskell-nix" ], "iohk-nix": [ "ctl", - "plutip", - "bot-plutus-interface", "iohk-nix" ], "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1671024770, - "narHash": "sha256-IOH0eny/33gDe6JQUUnf/kL76eg1zrr9Tse/GGW6fPw=", + "lastModified": 1695131439, + "narHash": "sha256-7ZhZUDhlFvV2us4G27iAk6lHezKS/4WA07NQn88VtQU=", "owner": "mlabs-haskell", "repo": "plutip", - "rev": "8d1795d9ac3f9c6f31381104b25c71576eeba009", + "rev": "1bf0b547cd3689c727586abb8385c008fb2a3d1c", "type": "github" }, "original": { "owner": "mlabs-haskell", + "ref": "gergely/version-bump", "repo": "plutip", - "rev": "8d1795d9ac3f9c6f31381104b25c71576eeba009", "type": "github" } }, - "plutus-apps": { - "flake": false, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils_17", + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte-cells", + "cicero", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1641849362, + "narHash": "sha256-1K3NOM0ZoFRVxU3HJ2G8CMZEtyRn0RpuUjsws7jKsds=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "6b063a31bc8fea6c1d9fdc47e9078772b0ba283b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "fetched-projectdir-test", + "repo": "poetry2nix", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-utils": "flake-utils_23", + "nixpkgs": "nixpkgs_55" + }, + "locked": { + "lastModified": 1639823344, + "narHash": "sha256-jlsQb2y6A5dB1R0wVPLOfDGM0wLyfYqEJNzMtXuzCXw=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "ff9c0b459ddc4b79c06e19d44251daa8e9cd1746", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "ragenix": { + "inputs": { + "agenix": "agenix_3", + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_21", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1641119695, + "narHash": "sha256-fksD2ftdEdFfB4BiB9iQCJt2QJ/CJogqk4mBNy9rY/0=", + "owner": "yaxitech", + "repo": "ragenix", + "rev": "71147db3f221d0a5c86b393d5c60d51b70f39fe3", + "type": "github" + }, + "original": { + "owner": "yaxitech", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_2": { + "inputs": { + "agenix": "agenix_4", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_24", + "rust-overlay": "rust-overlay_2" + }, "locked": { - "lastModified": 1647347289, - "narHash": "sha256-dxKZ1Zvflyt6igYm39POV6X/0giKbfb4U7D1TvevQls=", + "lastModified": 1645147603, + "narHash": "sha256-xraqK0vwr+AF9om7b3xIaP5AqEQqMb1DLVuUjGzM+98=", "owner": "input-output-hk", - "repo": "plutus-apps", - "rev": "2a40552f4654d695f21783c86e8ae59243ce9dfa", + "repo": "ragenix", + "rev": "194a625a97262f704b619acfccf27a5b9e6faea8", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "plutus-apps", + "repo": "ragenix", "type": "github" } }, - "plutus-apps_2": { - "flake": false, + "ragenix_3": { + "inputs": { + "agenix": "agenix_5", + "flake-utils": "flake-utils_12", + "nixpkgs": "nixpkgs_33", + "rust-overlay": "rust-overlay_3" + }, "locked": { - "lastModified": 1654271253, - "narHash": "sha256-GQDPzyVtcbbESmckMvzoTEKa/UWWJH7djh1TWQjzFow=", + "lastModified": 1641119695, + "narHash": "sha256-fksD2ftdEdFfB4BiB9iQCJt2QJ/CJogqk4mBNy9rY/0=", + "owner": "yaxitech", + "repo": "ragenix", + "rev": "71147db3f221d0a5c86b393d5c60d51b70f39fe3", + "type": "github" + }, + "original": { + "owner": "yaxitech", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_4": { + "inputs": { + "agenix": "agenix_7", + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_50", + "rust-overlay": "rust-overlay_4" + }, + "locked": { + "lastModified": 1641119695, + "narHash": "sha256-fksD2ftdEdFfB4BiB9iQCJt2QJ/CJogqk4mBNy9rY/0=", + "owner": "yaxitech", + "repo": "ragenix", + "rev": "71147db3f221d0a5c86b393d5c60d51b70f39fe3", + "type": "github" + }, + "original": { + "owner": "yaxitech", + "repo": "ragenix", + "type": "github" + } + }, + "ragenix_5": { + "inputs": { + "agenix": "agenix_8", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_53", + "rust-overlay": "rust-overlay_5" + }, + "locked": { + "lastModified": 1645147603, + "narHash": "sha256-xraqK0vwr+AF9om7b3xIaP5AqEQqMb1DLVuUjGzM+98=", "owner": "input-output-hk", - "repo": "plutus-apps", - "rev": "61de89d33340279b8452a0dbb52a87111db87e82", + "repo": "ragenix", + "rev": "194a625a97262f704b619acfccf27a5b9e6faea8", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "plutus-apps", + "repo": "ragenix", "type": "github" } }, - "plutus-example": { + "root": { "inputs": { - "customConfig": "customConfig_4", - "haskellNix": "haskellNix_4", - "iohkNix": "iohkNix_4", + "ctl": "ctl", + "flake-compat": "flake-compat_15", "nixpkgs": [ "ctl", - "ogmios", - "cardano-node", - "node-snapshot", - "plutus-example", - "haskellNix", - "nixpkgs-2105" + "nixpkgs" + ] + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1645024434, + "narHash": "sha256-ZYwqOkx9MYKmbuqkLJdRhIn7IghMRclbUzxJgR7OOhA=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "89faff7477e904f6820990f130a3aed72c1d7e6b", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_2": { + "flake": false, + "locked": { + "lastModified": 1649178056, + "narHash": "sha256-dcf7vKAkpdNvjd243LTGkUD6zLaLPN5deM2WTysG/Zs=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "2366d8e05f5f3585f95058fa7427cbde079914ed", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_3": { + "flake": false, + "locked": { + "lastModified": 1645024434, + "narHash": "sha256-ZYwqOkx9MYKmbuqkLJdRhIn7IghMRclbUzxJgR7OOhA=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "89faff7477e904f6820990f130a3aed72c1d7e6b", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_4": { + "flake": false, + "locked": { + "lastModified": 1660579619, + "narHash": "sha256-2+V7SO3mBd9Copi5yiSHNFzSXMuTNi4OH8JnY1Z82ds=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "3903243192d2bd6c38b43d12ffa9d2fa1601c2ec", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_5": { + "flake": false, + "locked": { + "lastModified": 1645024434, + "narHash": "sha256-ZYwqOkx9MYKmbuqkLJdRhIn7IghMRclbUzxJgR7OOhA=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "89faff7477e904f6820990f130a3aed72c1d7e6b", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_6": { + "flake": false, + "locked": { + "lastModified": 1649178056, + "narHash": "sha256-dcf7vKAkpdNvjd243LTGkUD6zLaLPN5deM2WTysG/Zs=", + "owner": "rust-analyzer", + "repo": "rust-analyzer", + "rev": "2366d8e05f5f3585f95058fa7427cbde079914ed", + "type": "github" + }, + "original": { + "owner": "rust-analyzer", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "ragenix", + "flake-utils" ], - "utils": "utils_2" + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1640022647, - "narHash": "sha256-M+YnF7Zj/7QK2pu0T75xNVaX0eEeijtBH8yz+jEHIMM=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "lastModified": 1641017392, + "narHash": "sha256-xpsPFK67HRtlk+39l4I7vko7QKZLBg3AqbXK3MkQoDY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4000e09a515c0f046a1b8b067f7324111187b115", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "owner": "oxalica", + "repo": "rust-overlay", "type": "github" } }, - "plutus-example_2": { + "rust-overlay_2": { "inputs": { - "customConfig": "customConfig_8", - "haskellNix": "haskellNix_8", - "iohkNix": "iohkNix_8", + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "ragenix", + "flake-utils" + ], "nixpkgs": [ "ctl", - "ogmios-nixos", - "cardano-node", - "node-snapshot", - "plutus-example", - "haskellNix", - "nixpkgs-2105" + "db-sync", + "cardano-world", + "bitte", + "capsules", + "ragenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1644633594, + "narHash": "sha256-Te6mBYYirUwsoqENvVx1K1EEoRq2CKrTnNkWF42jNgE=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "14c48021a9a5fe6ea8ae6b21c15caa106afa9d19", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_3": { + "inputs": { + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "ragenix", + "flake-utils" + ], + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "bitte", + "ragenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1641017392, + "narHash": "sha256-xpsPFK67HRtlk+39l4I7vko7QKZLBg3AqbXK3MkQoDY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4000e09a515c0f046a1b8b067f7324111187b115", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_4": { + "inputs": { + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "capsules", + "bitte", + "ragenix", + "flake-utils" ], - "utils": "utils_7" + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", + "capsules", + "bitte", + "ragenix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1640022647, - "narHash": "sha256-M+YnF7Zj/7QK2pu0T75xNVaX0eEeijtBH8yz+jEHIMM=", - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "lastModified": 1641017392, + "narHash": "sha256-xpsPFK67HRtlk+39l4I7vko7QKZLBg3AqbXK3MkQoDY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4000e09a515c0f046a1b8b067f7324111187b115", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-node", - "rev": "814df2c146f5d56f8c35a681fe75e85b905aed5d", + "owner": "oxalica", + "repo": "rust-overlay", "type": "github" } }, - "root": { + "rust-overlay_5": { "inputs": { - "ctl": "ctl", - "flake-compat": "flake-compat_15", + "flake-utils": [ + "ctl", + "db-sync", + "cardano-world", + "capsules", + "ragenix", + "flake-utils" + ], "nixpkgs": [ "ctl", + "db-sync", + "cardano-world", + "capsules", + "ragenix", "nixpkgs" ] - } - }, - "stackage": { - "flake": false, + }, "locked": { - "lastModified": 1654219171, - "narHash": "sha256-5kp4VTlum+AMmoIbhtrcVSEfYhR4oTKSrwe1iysD8uU=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "6d1fc076976ce6c45da5d077bf882487076efe5c", + "lastModified": 1644633594, + "narHash": "sha256-Te6mBYYirUwsoqENvVx1K1EEoRq2CKrTnNkWF42jNgE=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "14c48021a9a5fe6ea8ae6b21c15caa106afa9d19", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "oxalica", + "repo": "rust-overlay", "type": "github" } }, - "stackage_10": { + "secp256k1": { "flake": false, "locked": { - "lastModified": 1639012797, - "narHash": "sha256-hiLyBa5XFBvxD+BcYPKyYd/0dNMccxAuywFNqYtIIvs=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "9ea6ea359da91c75a71e334b25aa7dc5ddc4b2c6", + "lastModified": 1683999695, + "narHash": "sha256-9nJJVENMXjXEJZzw8DHzin1DkFkF8h9m/c6PuM7Uk4s=", + "owner": "bitcoin-core", + "repo": "secp256k1", + "rev": "acf5c55ae6a94e5ca847e07def40427547876101", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "bitcoin-core", + "ref": "v0.3.2", + "repo": "secp256k1", "type": "github" } }, - "stackage_11": { + "secp256k1_2": { "flake": false, "locked": { - "lastModified": 1667610757, - "narHash": "sha256-H4dlMk5EW50xOtGo+5Srm3HGQV1+hY9ttgRQ+Sew5uA=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "01d8ea53f65b08910003a1990547bab75ed6068a", + "lastModified": 1683999695, + "narHash": "sha256-9nJJVENMXjXEJZzw8DHzin1DkFkF8h9m/c6PuM7Uk4s=", + "owner": "bitcoin-core", + "repo": "secp256k1", + "rev": "acf5c55ae6a94e5ca847e07def40427547876101", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "bitcoin-core", + "ref": "v0.3.2", + "repo": "secp256k1", "type": "github" } }, - "stackage_12": { + "sodium": { "flake": false, "locked": { - "lastModified": 1669338854, - "narHash": "sha256-D9WBn+cC8t8Xu+z+H0nDGoeOCcqsbDGXHsaO7qY45O4=", + "lastModified": 1675156279, + "narHash": "sha256-0uRcN5gvMwO7MCXVYnoqG/OmeBFi8qRVnDWJLnBb9+Y=", "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "e9c817e14342ebef9fcf433f6ba3aa00c6df3e3f", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "stackage.nix", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" } }, - "stackage_2": { + "sodium_2": { "flake": false, "locked": { - "lastModified": 1665537461, - "narHash": "sha256-60tLFJ0poKp3IIPMvIDx3yzmjwrX7CngypfCQqV+oXE=", + "lastModified": 1675156279, + "narHash": "sha256-0uRcN5gvMwO7MCXVYnoqG/OmeBFi8qRVnDWJLnBb9+Y=", "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "fbf47f75f32aedcdd97143ec59c578f403fae35f", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "stackage.nix", + "repo": "libsodium", + "rev": "dbb48cce5429cb6585c9034f002568964f1ce567", "type": "github" } }, - "stackage_3": { + "stackage": { "flake": false, "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", + "lastModified": 1685491814, + "narHash": "sha256-OQX+h5hcDptW6HVrYkBL7dtgqiaiz9zn6iMYv+0CDzc=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "rev": "678b4297ccef8bbcd83294e47e1a9042034bdbd0", "type": "github" }, "original": { @@ -7006,14 +9026,14 @@ "type": "github" } }, - "stackage_4": { + "stackage_2": { "flake": false, "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", + "lastModified": 1646010978, + "narHash": "sha256-NpioQiTXyYm+Gm111kcDEE/ghflmnTNwPhWff54GYA4=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "rev": "9cce3e0d420f6c38cdbbe1c5e5bbc07fd2adfc3a", "type": "github" }, "original": { @@ -7022,14 +9042,14 @@ "type": "github" } }, - "stackage_5": { + "stackage_3": { "flake": false, "locked": { - "lastModified": 1639012797, - "narHash": "sha256-hiLyBa5XFBvxD+BcYPKyYd/0dNMccxAuywFNqYtIIvs=", + "lastModified": 1655255731, + "narHash": "sha256-0C3RDc1Uoofcw3e1s+7Gj+KYQ2JiRiSNQB2BKzXI6Vo=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "9ea6ea359da91c75a71e334b25aa7dc5ddc4b2c6", + "rev": "3e945e88ffdf2d2251e56db002419627f32f17c9", "type": "github" }, "original": { @@ -7038,14 +9058,14 @@ "type": "github" } }, - "stackage_6": { + "stackage_4": { "flake": false, "locked": { - "lastModified": 1669857425, - "narHash": "sha256-pmGWQ8poIUqU0V02Zm8aMPimcW2JHqKCFOnLSYX22Ow=", + "lastModified": 1659402917, + "narHash": "sha256-zRDOtN4A2KmfzmZiqqxOAIw1YVPhnoIaszKKd+qCEcQ=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "76e7487150da63a6061c63fa83e69da97ec56ede", + "rev": "778df3c4b35eac853d57fac7bafc7c9f2dde917f", "type": "github" }, "original": { @@ -7054,14 +9074,14 @@ "type": "github" } }, - "stackage_7": { + "stackage_5": { "flake": false, "locked": { - "lastModified": 1656898145, - "narHash": "sha256-EMgMzdANg6r5gEUkMtv5ujDo2/Kx7JJXoXiDKjDVoLw=", + "lastModified": 1650936094, + "narHash": "sha256-9ibS+iszPXe3HQd8rexVfrQeO4JkXSPokhbPiJ/Lags=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "835a5f2d2a1acafb77add430fc8c2dd47282ef32", + "rev": "85f94546f85fb9b92080f958bec655a364b2f0e5", "type": "github" }, "original": { @@ -7070,14 +9090,14 @@ "type": "github" } }, - "stackage_8": { + "stackage_6": { "flake": false, "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", + "lastModified": 1702426166, + "narHash": "sha256-j7wjtnR3HjT+OOq4GOWQMG+LufhAmz7CNDTJDW7ouXE=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "rev": "8f4b266959e3087825631fb8c7b2ef2f4c915ed9", "type": "github" }, "original": { @@ -7086,14 +9106,14 @@ "type": "github" } }, - "stackage_9": { + "stackage_7": { "flake": false, "locked": { - "lastModified": 1643073493, - "narHash": "sha256-5cPd1+i/skvJY9vJO1BhVRPcJObqkxDSywBEppDmb1U=", + "lastModified": 1654219171, + "narHash": "sha256-5kp4VTlum+AMmoIbhtrcVSEfYhR4oTKSrwe1iysD8uU=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "48e1188855ca38f3b7e2a8dba5352767a2f0a8f7", + "rev": "6d1fc076976ce6c45da5d077bf882487076efe5c", "type": "github" }, "original": { @@ -7104,38 +9124,44 @@ }, "std": { "inputs": { - "blank": "blank_2", + "arion": [ + "ctl", + "cardano-node", + "tullia", + "std", + "blank" + ], + "blank": "blank", "devshell": "devshell", "dmerge": "dmerge", - "flake-utils": "flake-utils_8", + "flake-utils": "flake-utils_5", + "incl": "incl", "makes": [ "ctl", - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "blank" ], - "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor", "microvm": [ "ctl", - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "blank" ], "n2c": "n2c", "nixago": "nixago", - "nixpkgs": "nixpkgs_10", + "nixpkgs": "nixpkgs_8", + "nosys": "nosys", "yants": "yants" }, "locked": { - "lastModified": 1665513321, - "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "lastModified": 1674526466, + "narHash": "sha256-tMTaS0bqLx6VJ+K+ZT6xqsXNpzvSXJTmogkraBGzymg=", "owner": "divnix", "repo": "std", - "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "rev": "516387e3d8d059b50e742a2ff1909ed3c8f82826", "type": "github" }, "original": { @@ -7146,38 +9172,20 @@ }, "std_2": { "inputs": { - "blank": "blank_4", - "devshell": "devshell_2", + "devshell": "devshell_7", "dmerge": "dmerge_2", - "flake-utils": "flake-utils_16", - "makes": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_2", - "microvm": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", - "std", - "blank" - ], - "n2c": "n2c_2", + "flake-utils": "flake-utils_13", + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor", "nixago": "nixago_2", - "nixpkgs": "nixpkgs_18", - "yants": "yants_2" + "nixpkgs": "nixpkgs_34", + "yants": "yants_3" }, "locked": { - "lastModified": 1665513321, - "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "lastModified": 1661370377, + "narHash": "sha256-LBKuwWajbv8osh5doIh7H8MQJgcdqjCGY0pW5eI/0Zk=", "owner": "divnix", "repo": "std", - "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "rev": "92503146d322c0c1ec3f2567925711b5fb59f7e2", "type": "github" }, "original": { @@ -7188,92 +9196,393 @@ }, "std_3": { "inputs": { - "blank": "blank_5", - "devshell": "devshell_3", + "devshell": "devshell_15", "dmerge": "dmerge_3", - "flake-utils": "flake-utils_20", - "makes": [ + "flake-utils": "flake-utils_29", + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_2", + "nixago": "nixago_3", + "nixpkgs": "nixpkgs_64", + "yants": "yants_5" + }, + "locked": { + "lastModified": 1661367957, + "narHash": "sha256-5B94aTocy6Y6ZJFmzkGdPmg6L6gjNaMVAKcpsaw44Ns=", + "owner": "divnix", + "repo": "std", + "rev": "d39794e19e648b840e5a56aa1f354d43aee9abf7", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_4": { + "inputs": { + "devshell": "devshell_16", + "nixpkgs": "nixpkgs_67", + "yants": "yants_6" + }, + "locked": { + "lastModified": 1652784712, + "narHash": "sha256-ofwGapSWqzUVgIxwwmjlrOVogfjV4yd6WpY8fNfMc2o=", + "owner": "divnix", + "repo": "std", + "rev": "3667d2d868352b0bf47c83440da48bee9f2fab47", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "stdlib": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_10": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_11": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_12": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_2": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_3": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_4": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_5": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_6": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_7": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_8": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "stdlib_9": { + "locked": { + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", + "type": "github" + }, + "original": { + "owner": "manveru", + "repo": "nix-lib", + "type": "github" + } + }, + "tailwind-haskell": { + "inputs": { + "flake-utils": "flake-utils_24", + "nixpkgs": "nixpkgs_58" + }, + "locked": { + "lastModified": 1654211622, + "narHash": "sha256-N5Xa/JhF9PRgmt+ZVZFaHT7onezENxp7ktnGhhqOBaw=", + "owner": "srid", + "repo": "tailwind-haskell", + "rev": "8d08cda7a1cb67435de1ba1739f65e25b303364f", + "type": "github" + }, + "original": { + "owner": "srid", + "ref": "master", + "repo": "tailwind-haskell", + "type": "github" + } + }, + "terranix": { + "inputs": { + "bats-assert": "bats-assert", + "bats-support": "bats-support", + "flake-utils": "flake-utils_9", + "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", + "db-sync", + "cardano-world", + "bitte", + "capsules", + "bitte", "blank" ], - "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_3", - "microvm": [ + "terranix-examples": "terranix-examples" + }, + "locked": { + "lastModified": 1637158331, + "narHash": "sha256-x5LEKtSkVq+D3BXHDBOb2wdCLxAhVmXIWONRi9lxDPg=", + "owner": "terranix", + "repo": "terranix", + "rev": "34198bb154af86d2a559446f10d7339e53126abe", + "type": "github" + }, + "original": { + "owner": "terranix", + "repo": "terranix", + "type": "github" + } + }, + "terranix-examples": { + "locked": { + "lastModified": 1636300201, + "narHash": "sha256-0n1je1WpiR6XfCsvi8ZK7GrpEnMl+DpwhWaO1949Vbc=", + "owner": "terranix", + "repo": "terranix-examples", + "rev": "a934aa1cf88f6bd6c6ddb4c77b77ec6e1660bd5e", + "type": "github" + }, + "original": { + "owner": "terranix", + "repo": "terranix-examples", + "type": "github" + } + }, + "terranix-examples_2": { + "locked": { + "lastModified": 1636300201, + "narHash": "sha256-0n1je1WpiR6XfCsvi8ZK7GrpEnMl+DpwhWaO1949Vbc=", + "owner": "terranix", + "repo": "terranix-examples", + "rev": "a934aa1cf88f6bd6c6ddb4c77b77ec6e1660bd5e", + "type": "github" + }, + "original": { + "owner": "terranix", + "repo": "terranix-examples", + "type": "github" + } + }, + "terranix-examples_3": { + "locked": { + "lastModified": 1636300201, + "narHash": "sha256-0n1je1WpiR6XfCsvi8ZK7GrpEnMl+DpwhWaO1949Vbc=", + "owner": "terranix", + "repo": "terranix-examples", + "rev": "a934aa1cf88f6bd6c6ddb4c77b77ec6e1660bd5e", + "type": "github" + }, + "original": { + "owner": "terranix", + "repo": "terranix-examples", + "type": "github" + } + }, + "terranix_2": { + "inputs": { + "bats-assert": "bats-assert_2", + "bats-support": "bats-support_2", + "flake-utils": "flake-utils_14", + "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "tullia", - "std", + "db-sync", + "cardano-world", + "bitte", "blank" ], - "n2c": "n2c_3", - "nixago": "nixago_3", - "nixpkgs": "nixpkgs_22", - "yants": "yants_3" + "terranix-examples": "terranix-examples_2" }, "locked": { - "lastModified": 1665513321, - "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", - "owner": "divnix", - "repo": "std", - "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "lastModified": 1637158331, + "narHash": "sha256-x5LEKtSkVq+D3BXHDBOb2wdCLxAhVmXIWONRi9lxDPg=", + "owner": "terranix", + "repo": "terranix", + "rev": "34198bb154af86d2a559446f10d7339e53126abe", "type": "github" }, "original": { - "owner": "divnix", - "repo": "std", + "owner": "terranix", + "repo": "terranix", "type": "github" } }, - "tullia": { + "terranix_3": { "inputs": { - "nix-nomad": "nix-nomad", - "nix2container": "nix2container", + "bats-assert": "bats-assert_3", + "bats-support": "bats-support_3", + "flake-utils": "flake-utils_20", "nixpkgs": [ "ctl", - "ogmios", - "haskell-nix", - "nixpkgs" + "db-sync", + "cardano-world", + "capsules", + "bitte", + "blank" ], - "std": "std" + "terranix-examples": "terranix-examples_3" }, "locked": { - "lastModified": 1668711738, - "narHash": "sha256-CBjky16o9pqsGE1bWu6nRlRajgSXMEk+yaFQLibqXcE=", - "owner": "input-output-hk", - "repo": "tullia", - "rev": "ead1f515c251f0e060060ef0e2356a51d3dfe4b0", + "lastModified": 1637158331, + "narHash": "sha256-x5LEKtSkVq+D3BXHDBOb2wdCLxAhVmXIWONRi9lxDPg=", + "owner": "terranix", + "repo": "terranix", + "rev": "34198bb154af86d2a559446f10d7339e53126abe", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "tullia", + "owner": "terranix", + "repo": "terranix", "type": "github" } }, - "tullia_2": { + "tullia": { "inputs": { - "nix-nomad": "nix-nomad_2", + "nix-nomad": "nix-nomad", "nix2container": "nix2container_2", - "nixpkgs": [ - "ctl", - "ogmios-nixos", - "haskell-nix", - "nixpkgs" - ], - "std": "std_2" + "nixpkgs": "nixpkgs_7", + "std": "std" }, "locked": { - "lastModified": 1666200256, - "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", + "lastModified": 1675695930, + "narHash": "sha256-B7rEZ/DBUMlK1AcJ9ajnAPPxqXY6zW2SBX+51bZV0Ac=", "owner": "input-output-hk", "repo": "tullia", - "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "rev": "621365f2c725608f381b3ad5b57afef389fd4c31", "type": "github" }, "original": { @@ -7282,25 +9591,18 @@ "type": "github" } }, - "tullia_3": { + "tullia_2": { "inputs": { - "nix-nomad": "nix-nomad_3", "nix2container": "nix2container_3", - "nixpkgs": [ - "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", - "nixpkgs" - ], - "std": "std_3" + "nixpkgs": "nixpkgs_66", + "std": "std_4" }, "locked": { - "lastModified": 1666200256, - "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", + "lastModified": 1657811465, + "narHash": "sha256-KHNWwKuUIG08CUg/ol81zf26RRlnsQsyqMr63vXcCes=", "owner": "input-output-hk", "repo": "tullia", - "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "rev": "f025fcf3676d1d1281de184e89c5f7c8e7f74ebe", "type": "github" }, "original": { @@ -7311,11 +9613,11 @@ }, "utils": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -7326,11 +9628,41 @@ }, "utils_10": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_11": { + "locked": { + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_12": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", "type": "github" }, "original": { @@ -7339,13 +9671,88 @@ "type": "github" } }, - "utils_11": { + "utils_13": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_14": { + "locked": { + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_15": { + "locked": { + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_16": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_17": { + "locked": { + "lastModified": 1637014545, + "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_18": { + "locked": { + "lastModified": 1601282935, + "narHash": "sha256-WQAFV6sGGQxrRs3a+/Yj9xUYvhTpukQJIcMbIi7LCJ4=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "588973065fce51f4763287f0fda87a174d78bf48", "type": "github" }, "original": { @@ -7354,7 +9761,82 @@ "type": "github" } }, + "utils_19": { + "locked": { + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, "utils_2": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_20": { + "locked": { + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_21": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_22": { + "locked": { + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", + "repo": "flake-utils", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", + "type": "github" + }, + "original": { + "owner": "kreisys", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_23": { "locked": { "lastModified": 1638122382, "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", @@ -7371,11 +9853,11 @@ }, "utils_3": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1637014545, + "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "type": "github" }, "original": { @@ -7386,11 +9868,11 @@ }, "utils_4": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "lastModified": 1601282935, + "narHash": "sha256-WQAFV6sGGQxrRs3a+/Yj9xUYvhTpukQJIcMbIi7LCJ4=", "owner": "numtide", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "588973065fce51f4763287f0fda87a174d78bf48", "type": "github" }, "original": { @@ -7401,30 +9883,30 @@ }, "utils_5": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } }, "utils_6": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } @@ -7446,26 +9928,26 @@ }, "utils_8": { "locked": { - "lastModified": 1623875721, - "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", - "owner": "numtide", + "lastModified": 1633020561, + "narHash": "sha256-4uAiRqL9nP3d/NQ8VBqjQ5iZypHaM+X/FyWpXVXkwTA=", + "owner": "kreisys", "repo": "flake-utils", - "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "rev": "2923532a276a5595ee64376ec1b3db6ed8503c52", "type": "github" }, "original": { - "owner": "numtide", + "owner": "kreisys", "repo": "flake-utils", "type": "github" } }, "utils_9": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1637014545, + "narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "type": "github" }, "original": { @@ -7474,23 +9956,56 @@ "type": "github" } }, + "vulnix": { + "flake": false, + "locked": { + "lastModified": 1632431644, + "narHash": "sha256-iePIr+z/YxrST5pLKnhF666cAMme90dAOS5vgAiwmxg=", + "owner": "dermetfan", + "repo": "vulnix", + "rev": "cea4e8973a39377aa42541b9dbf3a13ab46d51db", + "type": "github" + }, + "original": { + "owner": "dermetfan", + "ref": "runtime-deps", + "repo": "vulnix", + "type": "github" + } + }, + "vulnix_2": { + "flake": false, + "locked": { + "lastModified": 1632431644, + "narHash": "sha256-iePIr+z/YxrST5pLKnhF666cAMme90dAOS5vgAiwmxg=", + "owner": "dermetfan", + "repo": "vulnix", + "rev": "cea4e8973a39377aa42541b9dbf3a13ab46d51db", + "type": "github" + }, + "original": { + "owner": "dermetfan", + "ref": "runtime-deps", + "repo": "vulnix", + "type": "github" + } + }, "yants": { "inputs": { "nixpkgs": [ "ctl", - "ogmios", - "haskell-nix", + "cardano-node", "tullia", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1660507851, - "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "lastModified": 1667096281, + "narHash": "sha256-wRRec6ze0gJHmGn6m57/zhz/Kdvp9HS4Nl5fkQ+uIuA=", "owner": "divnix", "repo": "yants", - "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "rev": "d18f356ec25cb94dc9c275870c3a7927a10f8c3c", "type": "github" }, "original": { @@ -7500,22 +10015,40 @@ } }, "yants_2": { + "inputs": { + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", + "owner": "divnix", + "repo": "yants", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_3": { "inputs": { "nixpkgs": [ "ctl", - "ogmios-nixos", - "haskell-nix", - "tullia", + "db-sync", + "cardano-world", + "bitte", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1660507851, - "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", "owner": "divnix", "repo": "yants", - "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", "type": "github" }, "original": { @@ -7524,24 +10057,65 @@ "type": "github" } }, - "yants_3": { + "yants_4": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "locked": { + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", + "owner": "divnix", + "repo": "yants", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_5": { "inputs": { "nixpkgs": [ "ctl", - "plutip", - "bot-plutus-interface", - "haskell-nix", + "db-sync", + "cardano-world", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", + "owner": "divnix", + "repo": "yants", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_6": { + "inputs": { + "nixpkgs": [ + "ctl", + "db-sync", + "cardano-world", "tullia", "std", "nixpkgs" ] }, "locked": { - "lastModified": 1660507851, - "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "lastModified": 1645126146, + "narHash": "sha256-XQ1eg4gzXoc7Tl8iXak1uCt3KnsTyxqPtLE+vOoDnrQ=", "owner": "divnix", "repo": "yants", - "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "rev": "77df2be1b3cce9f571c6cf451f786b266a6869cc", "type": "github" }, "original": { diff --git a/templates/ctl-scaffold/flake.nix b/templates/ctl-scaffold/flake.nix index 6dbc8dc06..c1104f2e7 100644 --- a/templates/ctl-scaffold/flake.nix +++ b/templates/ctl-scaffold/flake.nix @@ -1,6 +1,12 @@ { description = "ctl-scaffold"; + nixConfig = { + extra-substituters = [ "https://plutonomicon.cachix.org" ]; + extra-trusted-public-keys = [ "plutonomicon.cachix.org-1:evUxtNULjCjOipxwAnYhNFeF/lyYU1FeNGaVAnm+QQw=" ]; + bash-prompt = "[\\[\\e[0;1m\\]\\[\\033[33m\\]$(git rev-parse --abbrev-ref HEAD) \\[\\e[0;32m\\]\\w\\[\\e[0m\\]]\\[\\e[0m\\]$ \\[\\e[0m\\]"; + }; + inputs = { flake-compat = { url = "github:edolstra/flake-compat"; @@ -10,7 +16,7 @@ type = "github"; owner = "Plutonomicon"; repo = "cardano-transaction-lib"; - rev = "ee5233d556bce8aee7fd1c2934641b72eecae196"; + rev = "7d533241367081fa69ec5f0ec8f50e00c39430c2"; }; # To use the same version of `nixpkgs` as we do nixpkgs.follows = "ctl/nixpkgs"; @@ -118,13 +124,19 @@ in { default = self.packages.${system}.ctl-scaffold-bundle-web; - ctl-scaffold-bundle-web = (psProjectFor pkgs).bundlePursProject { + + ctl-scaffold-bundle-web-esbuild = (psProjectFor pkgs).bundlePursProjectEsbuild { + main = "Scaffold.Main"; + }; + + ctl-scaffold-bundle-web-webpack = (psProjectFor pkgs).bundlePursProjectWebpack { main = "Scaffold.Main"; - entrypoint = "index.js"; }; + ctl-scaffold-runtime = pkgs.buildCtlRuntime runtimeConfig; }); + # `launchCtlRuntime` will generate a Nix expression from the provided # config, build it into a JSON file, and then run it with Arion # @@ -136,6 +148,8 @@ { default = self.apps.${system}.ctl-scaffold-runtime; ctl-scaffold-runtime = pkgs.launchCtlRuntime runtimeConfig; + ctl-scaffold-blockfrost-runtime = pkgs.launchCtlRuntime + (pkgs.lib.recursiveUpdate runtimeConfig { blockfrost = { enable = true; }; }); docs = (psProjectFor pkgs).launchSearchablePursDocs { }; }); diff --git a/templates/ctl-scaffold/index.html b/templates/ctl-scaffold/index.html deleted file mode 100644 index 443f25804..000000000 --- a/templates/ctl-scaffold/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/templates/ctl-scaffold/index.js b/templates/ctl-scaffold/index.js deleted file mode 100644 index b9185a093..000000000 --- a/templates/ctl-scaffold/index.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -// This needs to be asynchronous to load the WASM from CSL -// -// You also need to call `spago bundle-module` to generate the module that is -// imported here. From the repository root, run: -// spago bundle-module -m
--to output.js -import("./output.js").then(m => m.main()); - -console.log("app starting"); diff --git a/templates/ctl-scaffold/package-lock.json b/templates/ctl-scaffold/package-lock.json index cc729a867..7b3db0184 100644 --- a/templates/ctl-scaffold/package-lock.json +++ b/templates/ctl-scaffold/package-lock.json @@ -1,8 +1,5524 @@ { "name": "ctl-scaffold", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "ctl-scaffold", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@emurgo/cardano-message-signing-browser": "1.0.1", + "@emurgo/cardano-message-signing-nodejs": "1.0.1", + "@mlabs-haskell/cardano-serialization-lib-gc-browser": "^1.0.6", + "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": "^1.0.6", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1", + "@mlabs-haskell/json-bigint": "2.0.0", + "@noble/secp256k1": "^1.7.0", + "apply-args-browser": "0.0.1", + "apply-args-nodejs": "0.0.1", + "base64-js": "^1.5.1", + "bignumber.js": "^9.1.1", + "bip39": "^3.1.0", + "blakejs": "1.2.1", + "bufferutil": "4.0.5", + "jssha": "3.2.0", + "puppeteer-core": "^15.3.2", + "reconnecting-websocket": "4.4.0", + "uniqid": "5.4.0", + "utf-8-validate": "^5.0.10", + "ws": "8.4.0", + "xhr2": "0.2.1" + }, + "devDependencies": { + "buffer": "6.0.3", + "esbuild": "0.18.11", + "esbuild-plugin-polyfill-node": "^0.3.0", + "esbuild-plugin-wasm": "^1.1.0", + "node-polyfill-webpack-plugin": "2.0.1", + "webpack": "5.88.1", + "webpack-cli": "5.1.4", + "webpack-dev-server": "4.15.1" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emurgo/cardano-message-signing-browser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-message-signing-browser/-/cardano-message-signing-browser-1.0.1.tgz", + "integrity": "sha512-yC4Ymq44WR0bXO1wzxCoyc2W/RD1KSAla0oYhin7IYoVkp2raGp8wt7QNF4pDdNnTcejn5fyPyYY9dL4666H1w==" + }, + "node_modules/@emurgo/cardano-message-signing-nodejs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-message-signing-nodejs/-/cardano-message-signing-nodejs-1.0.1.tgz", + "integrity": "sha512-PoKh1tQnJX18f8iEr8Jk1KXxKCn9eqaSslMI1pyOJvYRJhQVDLCh0+9YReufjp0oFJIY1ShcrR+4/WnECVZUKQ==" + }, + "node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.4.0.tgz", + "integrity": "sha512-VWMvLRBFo7MAYh42zledURFs5BpMTWvkP4DzsLNbyJxZlwjDS+bPyehJVyGc116d2gq8NHFmANbfdeuK8ffJ7A==" + }, + "node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.4.0.tgz", + "integrity": "sha512-dMiofDcqv+IrAITCgWBZmsMLqwv2xImDsJDSrKiYYG1zRKaL8XfMOxx6S0WEnKVj5/343Q5FFURYcSu3iBRNMQ==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", + "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", + "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", + "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", + "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", + "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", + "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", + "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", + "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", + "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", + "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", + "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", + "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", + "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", + "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", + "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", + "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", + "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", + "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", + "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", + "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", + "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", + "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jspm/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", + "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mlabs-haskell/cardano-serialization-lib-gc-browser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-browser/-/cardano-serialization-lib-gc-browser-1.0.6.tgz", + "integrity": "sha512-b7dLrrhjUJSdsmjzariCZO734NB+M/ONLGBiQ/TQzMRtsMydqSFQg6WbMdwYPustoNmQOg6a8bm9+RgllqdmFw==", + "dependencies": { + "@emurgo/cardano-serialization-lib-browser": "^11.2.1", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" + } + }, + "node_modules/@mlabs-haskell/cardano-serialization-lib-gc-nodejs": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-nodejs/-/cardano-serialization-lib-gc-nodejs-1.0.6.tgz", + "integrity": "sha512-I1FqhjEHgib+y0+6K1tSqvrtldRvqjrM5mL+TW9224ezEDScQeCroPWbgGBwwi6rjkN9YpS8Uz6gC0vo8lua1A==", + "dependencies": { + "@emurgo/cardano-serialization-lib-nodejs": "^11.4.0", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" + } + }, + "node_modules/@mlabs-haskell/csl-gc-wrapper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/csl-gc-wrapper/-/csl-gc-wrapper-1.0.1.tgz", + "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" + }, + "node_modules/@mlabs-haskell/json-bigint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-2.0.0.tgz", + "integrity": "sha512-JX9TON+nZbt+1TJ5MNV1Gcpxp3/m56x1/glDwzGtydrzQzyZbKg4XFw9Frib6fh89YVqjSFJ9xmVeIyDJ5DxTQ==" + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", + "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==", + "devOptional": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apply-args-browser": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/apply-args-browser/-/apply-args-browser-0.0.1.tgz", + "integrity": "sha512-gq4ldo4Fk5SEVpeW/0yBe0v5g3VDEWAm9LB80zGarYtDvojTD7ar0Y/WvIy9gYAkKmlE3USu5wYwKKCqOXfNkg==" + }, + "node_modules/apply-args-nodejs": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/apply-args-nodejs/-/apply-args-nodejs-0.0.1.tgz", + "integrity": "sha512-JwZPEvEDrL+4y16Un6FcNjDSITpsBykchgwPh8UtxnziYrbxKAc2BUfyC5uvA6ZVIhQjiO4r+Kg1MQ3nqWk+1Q==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/devtools-protocol": { + "version": "0.0.1019158", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1019158.tgz", + "integrity": "sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", + "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" + } + }, + "node_modules/esbuild-plugin-polyfill-node": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-polyfill-node/-/esbuild-plugin-polyfill-node-0.3.0.tgz", + "integrity": "sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==", + "dev": true, + "dependencies": { + "@jspm/core": "^2.0.1", + "import-meta-resolve": "^3.0.0" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/esbuild-plugin-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-wasm/-/esbuild-plugin-wasm-1.1.0.tgz", + "integrity": "sha512-0bQ6+1tUbySSnxzn5jnXHMDvYnT0cN/Wd4Syk8g/sqAIJUg7buTIi22svS3Qz6ssx895NT+TgLPb33xi1OkZig==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "individual", + "url": "https://ko-fi.com/tschrock" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/jssha": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.2.0.tgz", + "integrity": "sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==", + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.22.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^4.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-15.5.0.tgz", + "integrity": "sha512-5Q8EmF++MARczJD1JcRehVePlctxGG2TFHSxdCV8NqPOk44/cMySmZw2nETn+lwUOyp0L9afosMFTnT4KgmWgw==", + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1019158", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.0" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/reconnecting-websocket": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", + "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/uniqid": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", + "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.0.tgz", + "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, "dependencies": { "@discoveryjs/json-ext": { "version": "0.5.7", @@ -21,19 +5537,173 @@ "integrity": "sha512-PoKh1tQnJX18f8iEr8Jk1KXxKCn9eqaSslMI1pyOJvYRJhQVDLCh0+9YReufjp0oFJIY1ShcrR+4/WnECVZUKQ==" }, "@emurgo/cardano-serialization-lib-browser": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.2.1.tgz", - "integrity": "sha512-J9Pmeta7y1GYnMCxtb3GnGCRw6zk1wiQ8EdCYQRn/Yqa/ss1zoBjd41euVi02Eb58aLuOJS81nNU+BcMLGXvUg==" + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.4.0.tgz", + "integrity": "sha512-VWMvLRBFo7MAYh42zledURFs5BpMTWvkP4DzsLNbyJxZlwjDS+bPyehJVyGc116d2gq8NHFmANbfdeuK8ffJ7A==" }, "@emurgo/cardano-serialization-lib-nodejs": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.2.1.tgz", - "integrity": "sha512-+Rw35NW4Qv/9uFaPxhKtxiIPmoBEIFMAgdqQxZTw6hNT/wvBp2TvwTBPnOW8ODs7GUAA8nrO1rJJAaxF+mAG2w==" + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.4.0.tgz", + "integrity": "sha512-dMiofDcqv+IrAITCgWBZmsMLqwv2xImDsJDSrKiYYG1zRKaL8XfMOxx6S0WEnKVj5/343Q5FFURYcSu3iBRNMQ==" + }, + "@esbuild/android-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", + "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", + "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", + "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", + "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", + "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", + "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", + "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", + "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", + "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", + "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", + "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", + "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", + "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", + "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", + "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", + "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", + "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", + "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", + "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", + "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", + "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", + "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "dev": true, + "optional": true }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", @@ -42,9 +5712,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { @@ -53,30 +5723,60 @@ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@jspm/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", + "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", + "dev": true + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@mlabs-haskell/cardano-serialization-lib-gc-browser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-browser/-/cardano-serialization-lib-gc-browser-1.0.6.tgz", + "integrity": "sha512-b7dLrrhjUJSdsmjzariCZO734NB+M/ONLGBiQ/TQzMRtsMydqSFQg6WbMdwYPustoNmQOg6a8bm9+RgllqdmFw==", "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@emurgo/cardano-serialization-lib-browser": "^11.2.1", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "dev": true, + "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/cardano-serialization-lib-gc-nodejs/-/cardano-serialization-lib-gc-nodejs-1.0.6.tgz", + "integrity": "sha512-I1FqhjEHgib+y0+6K1tSqvrtldRvqjrM5mL+TW9224ezEDScQeCroPWbgGBwwi6rjkN9YpS8Uz6gC0vo8lua1A==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@emurgo/cardano-serialization-lib-nodejs": "^11.4.0", + "@mlabs-haskell/csl-gc-wrapper": "^1.0.1" } }, "@mlabs-haskell/csl-gc-wrapper": { @@ -85,43 +5785,19 @@ "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" }, "@mlabs-haskell/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-Opo07yXP/OU9mIoGmY5VVuDy5kxmb3fBAG3U9dbC15qK1OCpVLJAlxbdOfBmLOja94SnIfZINUU2xvYtVfk65w==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "@noble/secp256k1": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.0.tgz", - "integrity": "sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-2.0.0.tgz", + "integrity": "sha512-JX9TON+nZbt+1TJ5MNV1Gcpxp3/m56x1/glDwzGtydrzQzyZbKg4XFw9Frib6fh89YVqjSFJ9xmVeIyDJ5DxTQ==" }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==" }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" }, "@types/body-parser": { "version": "1.19.2", @@ -152,9 +5828,9 @@ } }, "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -162,9 +5838,9 @@ } }, "@types/eslint": { - "version": "8.4.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", - "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, "requires": { "@types/estree": "*", @@ -172,9 +5848,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "requires": { "@types/eslint": "*", @@ -182,53 +5858,54 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", "dev": true }, "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/mime": { @@ -238,9 +5915,10 @@ "dev": true }, "@types/node": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", - "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" + "version": "20.4.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", + "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==", + "devOptional": true }, "@types/qs": { "version": "6.9.7", @@ -260,6 +5938,16 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -270,12 +5958,13 @@ } }, "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "requires": { - "@types/mime": "^1", + "@types/http-errors": "*", + "@types/mime": "*", "@types/node": "*" } }, @@ -289,9 +5978,9 @@ } }, "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "requires": { "@types/node": "*" @@ -307,171 +5996,171 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} }, "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -485,6 +6174,15 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -496,16 +6194,17 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} }, "agent-base": { "version": "6.0.2", @@ -513,31 +6212,6 @@ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" } }, "ajv": { @@ -562,9 +6236,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -585,7 +6259,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-html-community": { "version": "0.0.8", @@ -593,16 +6268,10 @@ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -625,16 +6294,11 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -645,7 +6309,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -653,6 +6318,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, "requires": { "es6-object-assign": "^1.1.0", "is-nan": "^1.2.1", @@ -660,19 +6326,11 @@ "util": "^0.12.0" } }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true }, "balanced-match": { "version": "1.0.2", @@ -687,14 +6345,9 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - }, "bignumber.js": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", @@ -706,6 +6359,14 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "requires": { + "@noble/hashes": "^1.2.0" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -724,6 +6385,16 @@ "base64-js": "^1.3.1", "ieee754": "^1.1.13" } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } } } }, @@ -735,12 +6406,13 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { "bytes": "3.1.2", @@ -751,7 +6423,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -762,29 +6434,45 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -806,12 +6494,14 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -825,6 +6515,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -835,6 +6526,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -846,6 +6538,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -855,6 +6548,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -865,32 +6559,47 @@ "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "requires": { "pako": "~1.0.5" } }, "browserslist": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", - "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001358", - "electron-to-chromium": "^1.4.164", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.0" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" } }, "buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -907,16 +6616,11 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true }, "bufferutil": { "version": "4.0.5", @@ -929,37 +6633,29 @@ "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "caniuse-lite": { - "version": "1.0.30001358", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz", - "integrity": "sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw==", + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", "dev": true }, "chokidar": { @@ -993,26 +6689,12 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, - "clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -1025,15 +6707,9 @@ } }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "compressible": { @@ -1060,6 +6736,21 @@ "vary": "~1.1.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1074,20 +6765,22 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true }, "content-disposition": { "version": "0.5.4", @@ -1099,9 +6792,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "cookie": { @@ -1113,7 +6806,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "core-util-is": { @@ -1126,6 +6819,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -1134,7 +6828,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -1142,6 +6837,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -1154,6 +6850,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -1186,6 +6883,7 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -1200,46 +6898,12 @@ "randomfill": "^1.0.3" } }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "ms": "2.1.2" } }, "default-gateway": { @@ -1258,30 +6922,15 @@ "dev": true }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1289,9 +6938,10 @@ "dev": true }, "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -1310,14 +6960,15 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.1011705", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1011705.tgz", - "integrity": "sha512-OKvTvu9n3swmgYshvsyVHYX0+aPzCoYUnyXUacfQMmFtBtBKewV/gT4I9jkAbpTqtTi2E4S9MXLlvzBDUlqg0Q==" + "version": "0.0.1019158", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1019158.tgz", + "integrity": "sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -1327,19 +6978,11 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -1347,85 +6990,20 @@ "dev": true }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "domain-browser": { "version": "4.22.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==" - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", "dev": true }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1433,15 +7011,16 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.167", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.167.tgz", - "integrity": "sha512-lPHuHXBwpkr4RcfaZBKm6TKOWG/1N9mVggUpP4fY3l1JIUU2x4fkM8928smYdZ5lF+6KCTAxo1aK9JmqT+X71Q==", + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", "dev": true }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -1455,7 +7034,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -1474,77 +7054,78 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "tapable": "^2.2.0" } }, + "envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true + }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "esbuild": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", + "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" + } + }, + "esbuild-plugin-polyfill-node": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-polyfill-node/-/esbuild-plugin-polyfill-node-0.3.0.tgz", + "integrity": "sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@jspm/core": "^2.0.1", + "import-meta-resolve": "^3.0.0" } }, - "es6-object-assign": { + "esbuild-plugin-wasm": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + "resolved": "https://registry.npmjs.org/esbuild-plugin-wasm/-/esbuild-plugin-wasm-1.1.0.tgz", + "integrity": "sha512-0bQ6+1tUbySSnxzn5jnXHMDvYnT0cN/Wd4Syk8g/sqAIJUg7buTIi22svS3Qz6ssx895NT+TgLPb33xi1OkZig==", + "dev": true }, "escalade": { "version": "3.1.1", @@ -1597,6 +7178,12 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -1606,12 +7193,14 @@ "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -1632,17 +7221,25 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -1661,7 +7258,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -1678,6 +7275,30 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -1690,29 +7311,6 @@ "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "fast-deep-equal": { @@ -1721,19 +7319,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1741,20 +7326,11 @@ "dev": true }, "fastest-levenshtein": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", - "integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -1784,7 +7360,8 @@ "filter-obj": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==" + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true }, "finalhandler": { "version": "1.2.0", @@ -1799,6 +7376,23 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } } }, "find-up": { @@ -1811,15 +7405,16 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -1842,9 +7437,9 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "fs.realpath": { @@ -1862,47 +7457,27 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "pump": "^3.0.0" } }, "glob": { @@ -1933,24 +7508,19 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "get-intrinsic": "^1.1.3" } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "handle-thing": { @@ -1963,15 +7533,11 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1982,19 +7548,28 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -2003,31 +7578,41 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -2047,9 +7632,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -2079,51 +7664,11 @@ } }, "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -2144,9 +7689,9 @@ } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "http-proxy": { @@ -2171,12 +7716,21 @@ "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + } } }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true }, "https-proxy-agent": { "version": "5.0.1", @@ -2185,21 +7739,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "human-signals": { @@ -2222,12 +7761,6 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2238,10 +7771,10 @@ "resolve-cwd": "^3.0.0" } }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "import-meta-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", "dev": true }, "inflight": { @@ -2258,51 +7791,28 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2312,37 +7822,21 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -2359,6 +7853,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -2376,48 +7871,18 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2427,63 +7892,19 @@ "isobject": "^3.0.1" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, "requires": { - "call-bind": "^1.0.2" + "which-typed-array": "^1.1.11" } }, "is-wsl": { @@ -2524,10 +7945,10 @@ "supports-color": "^8.0.0" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema-traverse": { @@ -2547,6 +7968,16 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2561,25 +7992,11 @@ "p-locate": "^4.1.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -2593,12 +8010,12 @@ "dev": true }, "memfs": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.6.tgz", - "integrity": "sha512-rH9mjopto6Wkr7RFuH9l9dk3qb2XGOcYKr7xMhaYqfzuJqOqhRrcFvfD7JMuPj6SLmPreh5+6eAuv36NFAU+Mw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" } }, "merge-descriptors": { @@ -2613,12 +8030,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2639,6 +8050,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -2647,7 +8059,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -2681,12 +8094,14 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true }, "minimatch": { "version": "3.1.2", @@ -2696,48 +8111,26 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2750,43 +8143,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } } }, "node-forge": { @@ -2796,14 +8158,15 @@ "dev": true }, "node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" }, "node-polyfill-webpack-plugin": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", - "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "dev": true, "requires": { "assert": "^2.0.0", "browserify-zlib": "^0.2.0", @@ -2811,7 +8174,7 @@ "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^4.22.0", "events": "^3.3.0", "filter-obj": "^2.0.2", "https-browserify": "^1.0.0", @@ -2820,21 +8183,22 @@ "process": "^0.11.10", "punycode": "^2.1.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^4.0.0", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", "url": "^0.11.0", "util": "^0.12.4", "vm-browserify": "^1.1.2" } }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-path": { @@ -2852,24 +8216,17 @@ "path-key": "^3.0.0" } }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, "object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -2878,18 +8235,8 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "obuf": { "version": "1.1.2", @@ -2930,9 +8277,9 @@ } }, "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -2943,7 +8290,8 @@ "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true }, "p-limit": { "version": "2.3.0", @@ -2961,15 +8309,6 @@ "p-limit": "^2.2.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -2988,22 +8327,14 @@ "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -3018,20 +8349,11 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, "path-exists": { "version": "4.0.0", @@ -3061,16 +8383,11 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -3104,48 +8421,11 @@ "find-up": "^4.0.0" } }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -3185,6 +8465,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -3197,7 +8478,8 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, @@ -3211,18 +8493,19 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true }, "puppeteer-core": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-15.3.2.tgz", - "integrity": "sha512-Fmca9UzXmJkRrvGBgUmrffGD2BlulUTfsVefV1+vqfNm4PnlZ/U1bfD6X8XQ0nftyyg520tmSKd81yH3Z2tszg==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-15.5.0.tgz", + "integrity": "sha512-5Q8EmF++MARczJD1JcRehVePlctxGG2TFHSxdCV8NqPOk44/cMySmZw2nETn+lwUOyp0L9afosMFTnT4KgmWgw==", "requires": { "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.1011705", + "devtools-protocol": "0.0.1019158", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", "pkg-dir": "4.2.0", @@ -3234,55 +8517,34 @@ "ws": "8.8.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "ws": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", - "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==" + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "requires": {} } } }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "requires": { "side-channel": "^1.0.4" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" - }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "dev": true }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -3291,6 +8553,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -3323,13 +8586,16 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "readdirp": { @@ -3342,12 +8608,12 @@ } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" } }, "reconnecting-websocket": { @@ -3355,35 +8621,6 @@ "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3397,12 +8634,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -3428,12 +8665,6 @@ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3446,20 +8677,12 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3468,12 +8691,13 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -3488,9 +8712,9 @@ "dev": true }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "requires": { "node-forge": "^1" @@ -3517,6 +8741,23 @@ "statuses": "2.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3526,9 +8767,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -3549,6 +8790,15 @@ "parseurl": "~1.3.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3573,6 +8823,12 @@ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -3602,7 +8858,8 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "setprototypeof": { "version": "1.2.0", @@ -3614,6 +8871,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -3643,10 +8901,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -3659,12 +8924,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -3703,23 +8962,6 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "spdy-transport": { @@ -3736,20 +8978,16 @@ "wbuf": "^1.7.3" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { - "ms": "2.1.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -3763,40 +9001,48 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "string_decoder": { @@ -3807,15 +9053,6 @@ "safe-buffer": "~5.2.0" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -3864,16 +9101,28 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -3887,16 +9136,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" } }, "through": { @@ -3914,6 +9163,7 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, "requires": { "setimmediate": "^1.0.4" } @@ -3933,16 +9183,22 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -3954,17 +9210,6 @@ "mime-types": "~2.1.24" } }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -3997,9 +9242,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.3.tgz", - "integrity": "sha512-ufSazemeh9Gty0qiWtoRpJ9F5Q5W3xdIPm1UZQqYQv/q0Nyb9EMHUB2lu+O9x1re9WsorpMAUu4Y6Lxcs5n+XQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -4016,31 +9261,41 @@ } }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true } } }, + "utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -4049,12 +9304,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -4076,12 +9325,13 @@ "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -4097,62 +9347,68 @@ "minimalistic-assert": "^1.0.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" } }, "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } @@ -4171,9 +9427,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4198,61 +9454,61 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } } } }, "webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4270,12 +9526,6 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4283,38 +9533,30 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" + "ajv-keywords": "^5.1.0" } }, "ws": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", - "dev": true + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} } } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -4344,6 +9586,15 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4353,46 +9604,35 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.0.tgz", - "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==" + "integrity": "sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==", + "requires": {} }, "xhr2": { "version": "0.2.1", @@ -4402,7 +9642,8 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "yauzl": { "version": "2.10.0", diff --git a/templates/ctl-scaffold/package.json b/templates/ctl-scaffold/package.json index ae06e407a..1997e2065 100644 --- a/templates/ctl-scaffold/package.json +++ b/templates/ctl-scaffold/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "ctl-scaffold", "version": "0.1.0", "description": "", @@ -7,9 +8,12 @@ "test": "test" }, "scripts": { - "blockfrost-test": "source ./test/blockfrost.env && spago run --main Scaffold.Test.Blockfrost", + "start-blockfrost-runtime": "nix run -L .#ctl-scaffold-blockfrost-runtime", "test": "spago run --main Test.Scaffold.Main", + "blockfrost-test": "source ./test/blockfrost.env && spago run --main Scaffold.Test.Blockfrost", + "blockfrost-local-test": "source ./test/blockfrost-local.env && spago run --main Scaffold.Test.Blockfrost", "e2e-serve": "make e2e-serve", + "start-runtime": "nix run -L .#ctl-scaffold-runtime", "e2e-test": "source ./test/e2e.env && spago test --main Scaffold.Test.E2E -a 'e2e-test run'", "e2e-test-debug": "source ./test/e2e.env && spago test --main Scaffold.Test.E2E -a 'e2e-test run --no-headless'", "e2e-browser": "source ./test/e2e.env && spago run --main Scaffold.Test.E2E -a 'e2e-test browser'", @@ -23,32 +27,35 @@ "dependencies": { "@emurgo/cardano-message-signing-browser": "1.0.1", "@emurgo/cardano-message-signing-nodejs": "1.0.1", - "@emurgo/cardano-serialization-lib-browser": "11.2.1", - "@emurgo/cardano-serialization-lib-nodejs": "11.2.1", + "@mlabs-haskell/cardano-serialization-lib-gc-browser": "^1.0.6", + "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": "^1.0.6", "@mlabs-haskell/csl-gc-wrapper": "^1.0.1", - "@mlabs-haskell/json-bigint": " 1.0.0", + "@mlabs-haskell/json-bigint": "2.0.0", "@noble/secp256k1": "^1.7.0", "apply-args-browser": "0.0.1", "apply-args-nodejs": "0.0.1", "base64-js": "^1.5.1", - "big-integer": "1.6.51", "bignumber.js": "^9.1.1", + "bip39": "^3.1.0", "blakejs": "1.2.1", "bufferutil": "4.0.5", "jssha": "3.2.0", - "node-polyfill-webpack-plugin": "1.1.4", "puppeteer-core": "^15.3.2", "reconnecting-websocket": "4.4.0", "uniqid": "5.4.0", + "utf-8-validate": "^5.0.10", "ws": "8.4.0", "xhr2": "0.2.1" }, "devDependencies": { "buffer": "6.0.3", - "html-webpack-plugin": "5.5.0", - "webpack": "5.67.0", - "webpack-cli": "4.10", - "webpack-dev-server": "4.7.4" + "esbuild": "0.18.11", + "esbuild-plugin-polyfill-node": "^0.3.0", + "esbuild-plugin-wasm": "^1.1.0", + "node-polyfill-webpack-plugin": "2.0.1", + "webpack": "5.88.1", + "webpack-cli": "5.1.4", + "webpack-dev-server": "4.15.1" }, "prettier": { "arrowParens": "avoid" diff --git a/templates/ctl-scaffold/packages.dhall b/templates/ctl-scaffold/packages.dhall index 01290d1ca..d6d88c4d7 100644 --- a/templates/ctl-scaffold/packages.dhall +++ b/templates/ctl-scaffold/packages.dhall @@ -105,8 +105,8 @@ in upstream ------------------------------- -} let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.14.5-20220224/packages.dhall - sha256:67cc3d4f0e8fb72bb1413ba94ddd72a3ceb0783eb725e3b22ad7568b3b581163 + https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20230105/packages.dhall + sha256:3e9fbc9ba03e9a1fcfd895f65e2d50ee2f5e86c4cd273f3d5c841b655a0e1bda let additions = { aeson = @@ -117,8 +117,6 @@ let additions = , "argonaut-core" , "arrays" , "bifunctors" - , "bigints" - , "bignumber" , "const" , "control" , "effect" @@ -127,6 +125,7 @@ let additions = , "foldable-traversable" , "foreign-object" , "integers" + , "js-bigints" , "lists" , "maybe" , "mote" @@ -136,7 +135,6 @@ let additions = , "prelude" , "quickcheck" , "record" - , "sequences" , "spec" , "strings" , "tuples" @@ -146,30 +144,22 @@ let additions = , "untagged-union" ] , repo = "https://github.com/mlabs-haskell/purescript-aeson.git" - , version = "bfd8f4dcd0522a076320f9dc710c24817438e02e" + , version = "v2.0.0" } - , sequences = + , bignumber = { dependencies = - [ "arrays" - , "assert" - , "console" + [ "console" , "effect" - , "lazy" - , "maybe" - , "newtype" - , "nonempty" + , "either" + , "exceptions" + , "functions" + , "integers" , "partial" , "prelude" - , "profunctor" - , "psci-support" - , "quickcheck" - , "quickcheck-laws" , "tuples" - , "unfoldable" - , "unsafe-coerce" ] - , repo = "https://github.com/hdgarrood/purescript-sequences" - , version = "v3.0.2" + , repo = "https://github.com/mlabs-haskell/purescript-bignumber" + , version = "760d11b41ece31b8cdd3c53349c5c2fd48d3ff89" } , properties = { dependencies = [ "prelude", "console" ] @@ -186,52 +176,7 @@ let additions = , repo = "https://github.com/garyb/purescript-mote" , version = "v1.1.0" } - , medea = - { dependencies = - [ "aff" - , "argonaut" - , "arrays" - , "bifunctors" - , "control" - , "effect" - , "either" - , "enums" - , "exceptions" - , "foldable-traversable" - , "foreign-object" - , "free" - , "integers" - , "lists" - , "maybe" - , "mote" - , "naturals" - , "newtype" - , "node-buffer" - , "node-fs-aff" - , "node-path" - , "nonempty" - , "ordered-collections" - , "parsing" - , "partial" - , "prelude" - , "psci-support" - , "quickcheck" - , "quickcheck-combinators" - , "safely" - , "spec" - , "strings" - , "these" - , "transformers" - , "typelevel" - , "tuples" - , "unicode" - , "unordered-collections" - , "unsafe-coerce" - ] - , repo = "https://github.com/juspay/medea-ps.git" - , version = "8b215851959aa8bbf33e6708df6bd683c89d1a5a" - } - , purescript-toppokki = + , toppokki = { dependencies = [ "prelude" , "record" @@ -241,23 +186,22 @@ let additions = , "node-buffer" , "node-fs-aff" ] - , repo = "https://github.com/firefrorefiddle/purescript-toppokki" - , version = "6983e07bf0aa55ab779bcef12df3df339a2b5bd9" + , repo = "https://github.com/mlabs-haskell/purescript-toppokki" + , version = "5992e93396a734c980ef61c74df5b6ab46108920" } - , bignumber = + , noble-secp256k1 = { dependencies = - [ "console" + [ "aff" + , "aff-promise" , "effect" - , "either" - , "exceptions" - , "functions" - , "integers" - , "partial" , "prelude" + , "spec" , "tuples" + , "unsafe-coerce" ] - , repo = "https://github.com/mlabs-haskell/purescript-bignumber" - , version = "705923edd892a3397b90d28ce7db9a7181dcd599" + , repo = + "https://github.com/mlabs-haskell/purescript-noble-secp256k1.git" + , version = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd" } , cardano-transaction-lib = { dependencies = @@ -266,15 +210,18 @@ let additions = , "aff-promise" , "aff-retry" , "affjax" + , "ansi" , "argonaut" , "argonaut-codecs" , "arraybuffer-types" , "arrays" , "avar" , "bifunctors" - , "bigints" + , "js-bigints" , "bignumber" , "checked-exceptions" + , "cip30" + , "cip30-typesafe" , "console" , "control" , "crypto" @@ -298,9 +245,7 @@ let additions = , "js-date" , "lattice" , "lists" - , "math" , "maybe" - , "medea" , "media-types" , "monad-logger" , "mote" @@ -326,10 +271,11 @@ let additions = , "prelude" , "profunctor" , "profunctor-lenses" - , "purescript-toppokki" + , "toppokki" , "quickcheck" , "quickcheck-combinators" , "quickcheck-laws" + , "random" , "rationals" , "record" , "refs" @@ -345,31 +291,55 @@ let additions = , "typelevel" , "typelevel-prelude" , "uint" - , "undefined" , "unfoldable" , "untagged-union" , "variant" - , "web-storage" , "web-html" + , "web-storage" ] , repo = "https://github.com/Plutonomicon/cardano-transaction-lib.git" - , version = "ee5233d556bce8aee7fd1c2934641b72eecae196" + , version = "7d533241367081fa69ec5f0ec8f50e00c39430c2" } - , noble-secp256k1 = + , js-bigints = + { dependencies = [ "integers", "maybe", "prelude" ] + , repo = "https://github.com/purescript-contrib/purescript-js-bigints" + , version = "36a7d8ac75a7230043ae511f3145f9ed130954a9" + } + , cip30 = { dependencies = [ "aff" , "aff-promise" + , "arrays" + , "console" , "effect" + , "literals" + , "maybe" + , "newtype" + , "nullable" + , "prelude" + , "untagged-union" + ] + , repo = "https://github.com/mlabs-haskell/purescript-cip30" + , version = "8f1b34b48825fcec5e9c67f33e255770b1e0bc45" + } + , cip30-typesafe = + { dependencies = + [ "aff" + , "bifunctors" + , "cip30" + , "control" + , "effect" + , "either" + , "exceptions" + , "maybe" , "prelude" , "spec" - , "tuples" - , "unsafe-coerce" + , "transformers" + , "variant" ] - , repo = - "https://github.com/mlabs-haskell/purescript-noble-secp256k1.git" - , version = "710c15c48c5afae5e0623664d982a587ff2bd177" + , repo = "https://github.com/mlabs-haskell/purescript-cip30-typesafe" + , version = "d72e51fbc0255eb3246c9132d295de7f65e16a99" } } -in (upstream // additions) - with parsing.version = "v7.0.1" +in upstream // additions diff --git a/templates/ctl-scaffold/scripts/README.md b/templates/ctl-scaffold/scripts/README.md new file mode 100644 index 000000000..4715e3825 --- /dev/null +++ b/templates/ctl-scaffold/scripts/README.md @@ -0,0 +1,7 @@ +Keep your compiled scripts here. They can be accessed from JS like this, thanks to WebPack setup: + +```js +exports.myscript = require("Scripts/myscript.plutus"); +``` + +See docs on scripts importing in CTL for more info (`doc/importing-scripts.md`) diff --git a/templates/ctl-scaffold/spago-packages.nix b/templates/ctl-scaffold/spago-packages.nix index afb4c0444..5c9a5b894 100644 --- a/templates/ctl-scaffold/spago-packages.nix +++ b/templates/ctl-scaffold/spago-packages.nix @@ -7,11 +7,11 @@ let "aeson" = pkgs.stdenv.mkDerivation { name = "aeson"; - version = "bfd8f4dcd0522a076320f9dc710c24817438e02e"; + version = "v2.0.0"; src = pkgs.fetchgit { url = "https://github.com/mlabs-haskell/purescript-aeson.git"; - rev = "bfd8f4dcd0522a076320f9dc710c24817438e02e"; - sha256 = "1ywm51wqvwjqfrmhav6m4hyl9il3h77yyhzgyhvkvg0lkc0nn575"; + rev = "4fddd518a143de563299d484272a0ef18daa7dcd"; + sha256 = "1bz1z9l6nwf5yk45sbbjllmqvci0n1l92cvk3lgmni19g9silbrl"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -19,11 +19,11 @@ let "aff" = pkgs.stdenv.mkDerivation { name = "aff"; - version = "v6.0.0"; + version = "v7.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-aff.git"; - rev = "d0eb009f2f47cb1f5ba1d8592d90c95e8e7ff75d"; - sha256 = "1780sgqyvbdgh8ynxmxn5d44vvhaz7kn9sv3l44c2s9q8xfjkfgm"; + rev = "6adec6ff048a7876f74c294c440374cd21342d39"; + sha256 = "1viplap030ym9ya033xl6x41hvdc12v9ngwp1v64ayl40a5m1d47"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -31,11 +31,11 @@ let "aff-promise" = pkgs.stdenv.mkDerivation { name = "aff-promise"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/nwolverson/purescript-aff-promise.git"; - rev = "45cfba7f663fce12fe69285fe5acaa4ff025144c"; - sha256 = "12fnlwcrj5p6kc5rls7qxwg53zd83gkdpklpmp8jyav945hlgbj2"; + rev = "3aa74e68e3e4c3e38d821375703e0b2f49d831eb"; + sha256 = "10gv3b05dxnlmr9zmigqs1hz4xqrx7da30aqh12kqg3zrg49k9cc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -43,11 +43,11 @@ let "aff-retry" = pkgs.stdenv.mkDerivation { name = "aff-retry"; - version = "v1.2.1"; + version = "v2.0.0"; src = pkgs.fetchgit { url = "https://github.com/Unisay/purescript-aff-retry.git"; - rev = "936fad803e3610f149df724ead288657a905cb84"; - sha256 = "08651ly153ywzviab0ipd0zrhwdr8nz4xfym45dlpbgabgrh8pra"; + rev = "4464f4bf62151651c8a86b33fc3c3149f7c71580"; + sha256 = "00xmfrx41giflrbdxm6hzmr23iqzr34x656kjpbmk3zvm49n6726"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -55,11 +55,11 @@ let "affjax" = pkgs.stdenv.mkDerivation { name = "affjax"; - version = "v12.0.0"; + version = "v13.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-affjax.git"; - rev = "5be197edc213fbededb8da908f77b69908eaa6f8"; - sha256 = "1f2snaimnl9ry8f3kankfcyy50wkba54vvin4wsrglahqgs1nrgb"; + rev = "87a8ffce89a476c1425370eb4b2b7e15408e0d1c"; + sha256 = "02hd0pfa1lb06a8qg2mqmkhyn3cz8hbvh6r9h2i6xcfqh0r8jg7s"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -67,11 +67,11 @@ let "ansi" = pkgs.stdenv.mkDerivation { name = "ansi"; - version = "v6.1.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/hdgarrood/purescript-ansi.git"; - rev = "e89e6fede616bd16b001841cf30ac320c95313a6"; - sha256 = "1jsll0h7nz13zgscs036cnkkc6frnlcnk6fwjdwsyp6wbmjri2zm"; + rev = "7d898732d643a977a78004851112a4417909e126"; + sha256 = "1aml84m5p1s14kj29m39182byg44nf275p4cinx3kgwhv1gj0qcp"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -79,11 +79,11 @@ let "argonaut" = pkgs.stdenv.mkDerivation { name = "argonaut"; - version = "v8.0.0"; + version = "v9.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut.git"; - rev = "e5137df76065c14e5de70c4e2820222bd7c78fc2"; - sha256 = "05sq1102rl1phm2gadx0gp966yvk9q1r492bb30q1m0nz762q4v2"; + rev = "7505a47f2edb0c9cacaac4f11dcedf4723a3e9c8"; + sha256 = "18yxhlrwri6q858krz1klyq29fx8nvfm16c04wm2rn91mgyasn6x"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -91,11 +91,11 @@ let "argonaut-codecs" = pkgs.stdenv.mkDerivation { name = "argonaut-codecs"; - version = "v8.1.0"; + version = "v9.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-codecs.git"; - rev = "b0a041d92bfd548e2cd793cc7c02363464325a13"; - sha256 = "11vmlq98s4jmg5grvdrrlfkqj9vk3la44ky8158a440ipcpinjkq"; + rev = "f8fdc1e34142fa84e66022ea5d417a008d709146"; + sha256 = "1ncpl512k2xdaf7r5ixwxkm6i4vym7a6a3ih71z489h9ad781q73"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -103,11 +103,11 @@ let "argonaut-core" = pkgs.stdenv.mkDerivation { name = "argonaut-core"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-core.git"; - rev = "673971dee79667882a83f9fda7097e50530726f1"; - sha256 = "13ka4xybc8ql54xlkkhy4919nnapfigdlk51ja85f8xwhr64x9kq"; + rev = "68da81dd80ec36d3b013eff46dc067a972c22e5d"; + sha256 = "0hxl17ddbflkk0hchjgk5xj6j9fwp3b182w4g073p0dwscdl4f08"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -115,11 +115,11 @@ let "argonaut-traversals" = pkgs.stdenv.mkDerivation { name = "argonaut-traversals"; - version = "v9.0.0"; + version = "v10.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-traversals.git"; - rev = "36f2e368ceea1ed681bd8e2884eaca451945fc44"; - sha256 = "0bj88s7rz50jfhyawq4h97lvbr3h7pksbqnz4lmh714f5fda6ncx"; + rev = "8d2403d8d57afb568933dbb36063d5670ce770a0"; + sha256 = "0v965bcl1hdp1hacbzxcm35kxxclixj0kpsdm816gs7m548z6l43"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -127,11 +127,11 @@ let "arraybuffer-types" = pkgs.stdenv.mkDerivation { name = "arraybuffer-types"; - version = "v3.0.1"; + version = "v3.0.2"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-arraybuffer-types.git"; - rev = "48cd7f4887791db1d9c2daf5fd98b62ba00e15bd"; - sha256 = "09r6bhsiq9iqdsjf9p8m3p31qkszsipsafvy836mfdi8af6h5fv6"; + rev = "9b0b7a0f9ee034e039f3d3a2a9c3f74eb7c9264a"; + sha256 = "1q3111jk6jj64bxy86lc7ik6q5mgdz87bc086wj5rm57dmlivlxx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -139,11 +139,11 @@ let "arrays" = pkgs.stdenv.mkDerivation { name = "arrays"; - version = "v6.0.1"; + version = "v7.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-arrays.git"; - rev = "c0aa3176b077ad7a46b11ef34487485c28142e53"; - sha256 = "0lm0m5hapimchzgfywr648pkw1hpggr6qibh8d19p2impbnc94c0"; + rev = "bb1b821530d368110eebf8a3541af90823e8af65"; + sha256 = "1mb9a4pb1bd7fj4vqj6msv5z27jbb5f89w3nczgjjhs02909phk9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -151,11 +151,11 @@ let "assert" = pkgs.stdenv.mkDerivation { name = "assert"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-assert.git"; - rev = "71a3b1f3b9917c23691fdbb1858de171be871a10"; - sha256 = "0r1l7j67an8dy1w4xdpr8nc30lsxv31xwqph9mkfh3nd49jlyyd3"; + rev = "27c0edb57d2ee497eb5fab664f5601c35b613eda"; + sha256 = "02qpcsijil64qq4kcikv2ynxl85zkryvv0vmzjm6752956ymzi0j"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -163,11 +163,11 @@ let "avar" = pkgs.stdenv.mkDerivation { name = "avar"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-avar.git"; - rev = "ac3cbbb8d4b71ff19a78a3178355c089e44d3b4d"; - sha256 = "005046wl61w6r5v3qwd16srhcx82vdz3yvp4xzad2xaasb6iq55l"; + rev = "d00f5784d9cc8f079babd62740f5c52b87e5caa5"; + sha256 = "132g0ccmjr8328xpaycww8b5wmx1vi3li4irxxqcjk5wi47i8c9h"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -175,23 +175,11 @@ let "bifunctors" = pkgs.stdenv.mkDerivation { name = "bifunctors"; - version = "v5.0.0"; - src = pkgs.fetchgit { - url = "https://github.com/purescript/purescript-bifunctors.git"; - rev = "a31d0fc4bbebf19d5e9b21b65493c28b8d3fba62"; - sha256 = "0xc2hf8ccdgqw3m9qcmr38kmzv05fsxvakd07wyrqshvkzg3xn0d"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "bigints" = pkgs.stdenv.mkDerivation { - name = "bigints"; version = "v6.0.0"; src = pkgs.fetchgit { - url = "https://github.com/sharkdp/purescript-bigints.git"; - rev = "d5151e04db7e18641fbb2b5892f4198b1cab5907"; - sha256 = "0x8s6d6q2rpfkk56bmayg57a7hl2h7sq9ljrxfc8sjnwd7mfs193"; + url = "https://github.com/purescript/purescript-bifunctors.git"; + rev = "16ba2fb6dd7f05528ebd9e2f9ca3a068b325e5b3"; + sha256 = "1qz5aaiq5w4g1rhjb63z47h6nqhw8hw23x1zw5alam047pq4vfkg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -199,11 +187,11 @@ let "bignumber" = pkgs.stdenv.mkDerivation { name = "bignumber"; - version = "705923edd892a3397b90d28ce7db9a7181dcd599"; + version = "760d11b41ece31b8cdd3c53349c5c2fd48d3ff89"; src = pkgs.fetchgit { url = "https://github.com/mlabs-haskell/purescript-bignumber"; - rev = "705923edd892a3397b90d28ce7db9a7181dcd599"; - sha256 = "0wddkx161xk457r1mb1f1r79l8qgxja0xhdvxjd1ai43nwp9cgkf"; + rev = "760d11b41ece31b8cdd3c53349c5c2fd48d3ff89"; + sha256 = "03py821gnkgi5p7zaxwr4rqsiv67v83y5c04i6x4v15nr6aaf7vz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -211,11 +199,11 @@ let "cardano-transaction-lib" = pkgs.stdenv.mkDerivation { name = "cardano-transaction-lib"; - version = "ee5233d556bce8aee7fd1c2934641b72eecae196"; + version = "7d533241367081fa69ec5f0ec8f50e00c39430c2"; src = pkgs.fetchgit { url = "https://github.com/Plutonomicon/cardano-transaction-lib.git"; - rev = "ee5233d556bce8aee7fd1c2934641b72eecae196"; - sha256 = "1cwv1zyhkjbvrks7v1x0scl8bv1p5n1k50ca91yxh4vk8hxfz9qk"; + rev = "7d533241367081fa69ec5f0ec8f50e00c39430c2"; + sha256 = "0wpcjrajyfn53ijpdv1w2kg6rmifsz3p8gxx88zin1wv0437cmxh"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -223,11 +211,11 @@ let "catenable-lists" = pkgs.stdenv.mkDerivation { name = "catenable-lists"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-catenable-lists.git"; - rev = "ee03395f2c5d59a7fd8529a0faac6ec1ebcbb682"; - sha256 = "1lz06fx0za5sl65wccn5fl37mw3x4jnvrriz1gg0aqsmm9lag7ss"; + rev = "09abe1f4888bc00841ad2b59e56a9e7ce7ebd4ab"; + sha256 = "0fn6caspdnb0nrlj31sy7d5hxrhndfz7a2b9wfkxf5bv5vpjyawb"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -245,13 +233,37 @@ let installPhase = "ln -s $src $out"; }; + "cip30" = pkgs.stdenv.mkDerivation { + name = "cip30"; + version = "8f1b34b48825fcec5e9c67f33e255770b1e0bc45"; + src = pkgs.fetchgit { + url = "https://github.com/mlabs-haskell/purescript-cip30"; + rev = "8f1b34b48825fcec5e9c67f33e255770b1e0bc45"; + sha256 = "1rb7kv99rd50b6vhl90sirmzh43wgnyafpmn7w45n3d4nrvf1046"; + }; + phases = "installPhase"; + installPhase = "ln -s $src $out"; + }; + + "cip30-typesafe" = pkgs.stdenv.mkDerivation { + name = "cip30-typesafe"; + version = "d72e51fbc0255eb3246c9132d295de7f65e16a99"; + src = pkgs.fetchgit { + url = "https://github.com/mlabs-haskell/purescript-cip30-typesafe"; + rev = "d72e51fbc0255eb3246c9132d295de7f65e16a99"; + sha256 = "0mlmifd1svi0havf2wgxzq23ycsqbhlvh4n35g3z7nqr7hhwh8s3"; + }; + phases = "installPhase"; + installPhase = "ln -s $src $out"; + }; + "console" = pkgs.stdenv.mkDerivation { name = "console"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-console.git"; - rev = "d7cb69ef8fed8a51466afe1b623868bb29e8586e"; - sha256 = "0fzzzqjgrz33pb2jf7cdqpg09ilxb7bsrc7sbfq52wjg0sx9aq6g"; + rev = "3b83d7b792d03872afeea5e62b4f686ab0f09842"; + sha256 = "0fr5l1myhscp910mybp04cg6g8f2hy3ikjfc8fkqlb2dm2cqzdfs"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -259,11 +271,11 @@ let "const" = pkgs.stdenv.mkDerivation { name = "const"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-const.git"; - rev = "3a3a4bdc44f71311cf27de9bd22039b110277540"; - sha256 = "0aq9qjbrvf8mf8hmas6imv4mg6n3zi13hkf449ns1hn12lw8qv4g"; + rev = "ab9570cf2b6e67f7e441178211db1231cfd75c37"; + sha256 = "0mcpwqqf5bcwxlzk53smvsjjz1ymlnq0ypphg6sc83ibw70g64f6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -271,11 +283,11 @@ let "contravariant" = pkgs.stdenv.mkDerivation { name = "contravariant"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-contravariant.git"; - rev = "ae1a765f7ddbfd96ae1f12e399e46d554d8e3b38"; - sha256 = "029hb8i3n4759x4gc06wkfgr7wim5x1w5jy2bsiy42n0g731h5qc"; + rev = "9ad3e105b8855bcc25f4e0893c784789d05a58de"; + sha256 = "1xkd3rfs8v20w7mj6sj6dmhfb2vb1zpmjv245xj1rahk3g16qm7m"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -283,11 +295,11 @@ let "control" = pkgs.stdenv.mkDerivation { name = "control"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-control.git"; - rev = "18d582e311f1f8523f9eb55fb93c91bd21e22837"; - sha256 = "06dc06yli4g5yr8fb9sdpqbhiaff37g977qcsbds9q2mlhnjgfx9"; + rev = "a6033808790879a17b2729e73747a9ed3fb2264e"; + sha256 = "05sdgywprwpav62d2bvlb80yd39brxhnmhhl1f116mm9hw5clqia"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -295,11 +307,11 @@ let "crypto" = pkgs.stdenv.mkDerivation { name = "crypto"; - version = "v4.0.0"; + version = "v5.0.1"; src = pkgs.fetchgit { url = "https://github.com/oreshinya/purescript-crypto.git"; - rev = "cbc19e06c5e4d528e7733633e50c070b1aa0f77e"; - sha256 = "142p9f0mg1yi4bccg3jwhhyn4k4yy5fskh08p05n9sfym27ss126"; + rev = "c72b4b789e52a1fb31c65cd318ea82bf295af1ec"; + sha256 = "07p7153j3brsfyc1pik4y760g054zx1kwy2ap67pfs41zv982s03"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -307,11 +319,11 @@ let "datetime" = pkgs.stdenv.mkDerivation { name = "datetime"; - version = "v5.0.2"; + version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-datetime.git"; - rev = "e110462829ea656d2bc0924266d4edff222108d4"; - sha256 = "1mhzn2ymdkzki7wjlr9xrdbngm0886wmfbh2c46flnf9lmfyw54y"; + rev = "7f6062346055e654942caed6c44612b59031f059"; + sha256 = "0z5f62arrli0dgmggv6z2qkv1qc9isdivcn7njywsa8wmc4vd47n"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -319,11 +331,11 @@ let "debug" = pkgs.stdenv.mkDerivation { name = "debug"; - version = "v5.0.0"; + version = "v6.0.2"; src = pkgs.fetchgit { url = "https://github.com/garyb/purescript-debug.git"; - rev = "144305842dba81169a93b3a3cc75429d5c8389e9"; - sha256 = "09j69bgrq8nzw1l3aj1hka3y5ycmcsn9dlgf22k5ifrd74iic60y"; + rev = "a37b82f62c89734934c0962ece3412913020460a"; + sha256 = "0q3r21zh0kjy9aq8q2siaf8841q63cmxjl2fbk0z3r0z4cfihccg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -331,11 +343,11 @@ let "distributive" = pkgs.stdenv.mkDerivation { name = "distributive"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-distributive.git"; - rev = "11f3f87ca5720899e1739cedb58dd6227cae6ad5"; - sha256 = "0788znmdyh6b1c9pln624ah397l88xmd3fxlxiy3z1qy8bzr4r54"; + rev = "6005e513642e855ebf6f884d24a35c2803ca252a"; + sha256 = "0x6cfsx9ff66kvw9l10pxd5vv16r91mmfxrfc68w1xfdfi81lhdx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -343,11 +355,11 @@ let "effect" = pkgs.stdenv.mkDerivation { name = "effect"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-effect.git"; - rev = "985d97bd5721ddcc41304c55a7ca2bb0c0bfdc2a"; - sha256 = "1n9qr85knvpm4i0qhm8xbgfk46v9y843p76j278phfs9l6aywzsn"; + rev = "a192ddb923027d426d6ea3d8deb030c9aa7c7dda"; + sha256 = "0aa10lc6h9mlf4xf3g3ziig7v6kxdqvbh20kma8ay59w0b1bhmj1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -355,11 +367,11 @@ let "either" = pkgs.stdenv.mkDerivation { name = "either"; - version = "v5.0.0"; + version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-either.git"; - rev = "c1a1af35684f10eecaf6ac7d38dbf6bd48af2ced"; - sha256 = "18dk159yyv7vs0xsnh9m5fajd7zy6zw5b2mpyd6nqdh3c6bb9wh6"; + rev = "af655a04ed2fd694b6688af39ee20d7907ad0763"; + sha256 = "05zps4klvgmvlm06f4hrycssm8q0pysbqnjsrk26lfvmid6mmg63"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -367,11 +379,11 @@ let "encoding" = pkgs.stdenv.mkDerivation { name = "encoding"; - version = "v0.0.7"; + version = "v0.0.8"; src = pkgs.fetchgit { url = "https://github.com/menelaos/purescript-encoding.git"; - rev = "0a4187136f9ea4ea51ddf635e3b3c2cd2461faac"; - sha256 = "1rsnn8g2lx24k9wflr1jj12281i0smprb76nfm2f61yqqiwgij4d"; + rev = "a9d1913de736821c133ecd7944a08b2ab07ad774"; + sha256 = "0c23bpfw67ik1n821bq3s0w036sk7yqi4fy5fd7dgf4325abk6zn"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -379,11 +391,11 @@ let "enums" = pkgs.stdenv.mkDerivation { name = "enums"; - version = "v5.0.0"; + version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-enums.git"; - rev = "170d959644eb99e0025f4ab2e38f5f132fd85fa4"; - sha256 = "1lci5iy6s6cmh93bpkfcmp0j4n5dnij7dswb0075bk0kzd9xp7rs"; + rev = "cd373c580b69fdc00e412bddbc299adabe242cc5"; + sha256 = "1wk98ddmgyii1ifqawnhqkiqlrs405qcp3m12jsg1yp8jv6ppv47"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -391,11 +403,11 @@ let "exceptions" = pkgs.stdenv.mkDerivation { name = "exceptions"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-exceptions.git"; - rev = "410d0b8813592bda3c25028540eeb2cda312ddc9"; - sha256 = "1yjbrx34a0rnxgpvywb63n9jzhkdgb2q2acyzbwh290mrrggc95x"; + rev = "afab3c07c820bb49b6c5be50049db46a964a6161"; + sha256 = "04xrbrcjwsv8gj465ygrlqhv1majxmr6m242iazg6apxlr89hgvg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -403,11 +415,11 @@ let "exists" = pkgs.stdenv.mkDerivation { name = "exists"; - version = "v5.1.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-exists.git"; - rev = "c34820f8b2d15be29abdd5097c3d636f5df8f28c"; - sha256 = "15qp52cpp2yvxihkzfmn6gabyvx5s6iz5lafvqhyfgp4wfnz0bds"; + rev = "f765b4ace7869c27b9c05949e18c843881f9173b"; + sha256 = "0xnxi8fsmi15wrpq5d99gg94glk8a45hpx7pf4pmxg5r6rn1vjvx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -427,11 +439,11 @@ let "fixed-points" = pkgs.stdenv.mkDerivation { name = "fixed-points"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-fixed-points.git"; - rev = "3b643d948479aee7cd3e36c95258f1f84df0c35f"; - sha256 = "0w2j0sarylzsmg8b228pmn3qndif0bzw2vmxrx30ar15qy7jdb5d"; + rev = "2b7f480038a15c707adf49178181cefed167afb2"; + sha256 = "1iib0yxl749lg4m7ysqmb9aby67a9829x38xc2rma5fk9fv30cw7"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -439,11 +451,11 @@ let "foldable-traversable" = pkgs.stdenv.mkDerivation { name = "foldable-traversable"; - version = "v5.0.1"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foldable-traversable.git"; - rev = "d581caf260772b1b446c11ac3c8be807b290b220"; - sha256 = "182na4np7hk2dqyxywy4jij2csrzx4bz02m6bq8yx1j27hlgjvsd"; + rev = "b3926f870532d287ea59e2d5cd3873b81ef2a93a"; + sha256 = "0xg8qvyc6r9wqgy7wnw1rjqljl4wpgdrkxsm5x9rsagj2k5brxip"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -451,11 +463,11 @@ let "foreign" = pkgs.stdenv.mkDerivation { name = "foreign"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foreign.git"; - rev = "7ee18c6689c56c89755172ea53326f948da10bd3"; - sha256 = "16j7712cck79p8q53xbhn4hs886bm0ls5wvmchrhqnaghj48m85g"; + rev = "2dd222d1ec7363fa0a0a7adb0d8eaf81bb7006dd"; + sha256 = "0ycjaal8b2rsg3zl3b7acv166vjfdvziiza3fs8nhfw0rx0xmm1m"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -463,11 +475,11 @@ let "foreign-object" = pkgs.stdenv.mkDerivation { name = "foreign-object"; - version = "v3.0.0"; + version = "v4.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foreign-object.git"; - rev = "c9a7b7bb8bed1b87c5545c4ebe85a70f86c0e6b1"; - sha256 = "0accw6qd93qqry19rskjgl7y54xi2wd70rglbqyjx6c5ybcjnavr"; + rev = "9bfb4eb6271b151414594cfec669fb4b18b91bd1"; + sha256 = "1fr5hwzkan7yv2kbgvii2b8kanhjkqrbixcyj7kyv9fwkk8dk96a"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -475,11 +487,11 @@ let "fork" = pkgs.stdenv.mkDerivation { name = "fork"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-fork.git"; - rev = "153cc29e6e51fb1108368efc622d41d9f80bd707"; - sha256 = "1hyvaixza8151zbylk2kv859x48yyhla536lcjghcwd62vzfwmdn"; + rev = "a5c3bc6f357e97669e8c29c6f79f5f55be0d42c0"; + sha256 = "0yzh55vfrhrr660ni3sbbljypjirbka5jlks4zibqmhwrmy3wnj9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -487,11 +499,11 @@ let "form-urlencoded" = pkgs.stdenv.mkDerivation { name = "form-urlencoded"; - version = "v6.0.2"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-form-urlencoded.git"; - rev = "860b2c4bf0a848322d2077faaefbeb98762cb8d6"; - sha256 = "1pi3vxix10crisisnd94li1vmmgiawlh5lgl51z7ssd9azygg0b0"; + rev = "e0e3eebc76f62f2594a0e823e8d6241ca00b2459"; + sha256 = "1ay946w7gkgqrxxv5qf28w83mh59r1q4j8kk6pndhripz9pby68w"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -499,11 +511,11 @@ let "formatters" = pkgs.stdenv.mkDerivation { name = "formatters"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-formatters.git"; - rev = "b2e65b2bccd09a3c17a396f07e13e5cdca90e4e4"; - sha256 = "02c43sv6ci2698mjkmvkv3cjv99ilxv8ii8x7n9wqf18r4hlmk0y"; + rev = "0b4deda4c6664209173e3e21b8fcbc6151a4549c"; + sha256 = "0z3w5qbfd8z8bakir3rwanq6dcf554f3apacxw5l2vxscvikyra3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -511,23 +523,11 @@ let "free" = pkgs.stdenv.mkDerivation { name = "free"; - version = "v6.2.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-free.git"; - rev = "c185c0b2144ddfb2bc3ac2b345df32e33221b21d"; - sha256 = "10zsw49wzlzz78882b3grl19gpca5llpdk3ph608075h0ygk3q3k"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "freet" = pkgs.stdenv.mkDerivation { - name = "freet"; - version = "v6.0.0"; - src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-freet.git"; - rev = "507c2edd9173cda5ad44dd0638133edd69fd9acd"; - sha256 = "0f5bibw604sd9ffmp51b3jppka88r54mh7sdz91zy5b92wgsy5yr"; + rev = "e2d8fa8023a864363857834e11393483bced5e38"; + sha256 = "0gyy0k297m26gw76w7kx8k1zjczlqbqb3nmh2h4gb3r84gl05g6r"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -535,11 +535,11 @@ let "functions" = pkgs.stdenv.mkDerivation { name = "functions"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-functions.git"; - rev = "691b3345bc2feaf914e5299796c606b6a6bf9ca9"; - sha256 = "1gnk6xh5x04zcahn82gwp49qpglxd5jkfqn0i58m27jfihvblaxd"; + rev = "f626f20580483977c5b27a01aac6471e28aff367"; + sha256 = "1bsf2y8hx103a92yrc6m05q2dv51ckag1srd7q5n9vaf2k9byrj9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -547,11 +547,11 @@ let "functors" = pkgs.stdenv.mkDerivation { name = "functors"; - version = "v4.1.1"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-functors.git"; - rev = "e936f7a8d2ec53a344c478ccada5add93273848c"; - sha256 = "0i1x14r54758s5jx5d7zy4l07mg6gabljadgybldnbpmdqk6b966"; + rev = "022ffd7a2a7ec12080314f3d217b400674a247b4"; + sha256 = "1pnw3r1nk0rx8mrw3ajjml40zvx9v26qrqwj77pz7hpwxigxfbff"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -559,11 +559,11 @@ let "gen" = pkgs.stdenv.mkDerivation { name = "gen"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-gen.git"; - rev = "85c369f56545a3de834b7e7475a56bc9193bb4b4"; - sha256 = "1h396rqn1fc2c155i58vnaksqjrpajly128ah6wq1w426vwr1vrf"; + rev = "9fbcc2a1261c32e30d79c5418edef4d96fe76931"; + sha256 = "0kajzcp9a8dmqvb3ga27hlf18m2smbp98a0bmzzb9vv156ckw0b4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -571,11 +571,11 @@ let "heterogeneous" = pkgs.stdenv.mkDerivation { name = "heterogeneous"; - version = "v0.5.1"; + version = "v0.6.0"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-heterogeneous.git"; - rev = "550445cf7932e158395423fc087cdc05bab41c40"; - sha256 = "08bpgm9p8ib1jzrmssqpa1bqqzfmba43lsih1xvr3pf1jfizayxg"; + rev = "5b7542bdd9547c5aef95b8878f103f0ce4ee1383"; + sha256 = "0ff1wjq2ayhy67ydggbb2qlzbhvmv1m1z8dcp48p9zhxiq9fpfsz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -583,11 +583,11 @@ let "http-methods" = pkgs.stdenv.mkDerivation { name = "http-methods"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-http-methods.git"; - rev = "d373066a45017e886d1580cd359372368231de47"; - sha256 = "1g0ywd5zpckmhq28mr14yr4k28hiii1px8r8xbdx8nv45ryw69l3"; + rev = "99b48d54b978e4e6438d850015d59e57ac64824e"; + sha256 = "126x1cqr1769a3yzigpp8sp33n6s4fadai7w30mb2nk9dbxy0hw5"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -595,11 +595,11 @@ let "identity" = pkgs.stdenv.mkDerivation { name = "identity"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-identity.git"; - rev = "5c150ac5ee4fa6f145932f6322a1020463dae8e9"; - sha256 = "0a58y71ihvb5b7plnn2sxsbphqzd9nzfafak4d5a576agn76q0ql"; + rev = "ef6768f8a52ab0bc943a85f5761ba07c257f639f"; + sha256 = "1lh0pkwwdyd8q9bgf4l1m96gdnardki4r2s359cnhrwp94b43fyr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -607,11 +607,11 @@ let "integers" = pkgs.stdenv.mkDerivation { name = "integers"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-integers.git"; - rev = "8a783f2d92596c43afca53066ac18eb389d15981"; - sha256 = "1rrygw0ai61brnvgap7dfhdzacyhg5439pz6yrmmyg32cvf0znhv"; + rev = "54d712b25c594833083d15dc9ff2418eb9c52822"; + sha256 = "04j9sqvkgyxxvbm8jfc2118wzmgswn8jva9fysgbsnmsg9vcxfm6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -619,35 +619,35 @@ let "invariant" = pkgs.stdenv.mkDerivation { name = "invariant"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-invariant.git"; - rev = "c421b49dec7a1511073bb408a08bdd8c9d17d7b1"; - sha256 = "0vwkbh7kv00g50xjgvxc0mv5b99mrj6q0sxznxwk32hb9hkbhy5l"; + rev = "1d2a196d51e90623adb88496c2cfd759c6736894"; + sha256 = "07rqag47ykdiqc5yfbc1a64ijaqliljhcw1vgbv81m7ljzzd2xna"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "js-date" = pkgs.stdenv.mkDerivation { - name = "js-date"; - version = "v7.0.0"; + "js-bigints" = pkgs.stdenv.mkDerivation { + name = "js-bigints"; + version = "36a7d8ac75a7230043ae511f3145f9ed130954a9"; src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-js-date.git"; - rev = "a6834eef986e3af0490cb672dc4a8b4b089dcb15"; - sha256 = "1dpiwn65qww862ilpfbd06gwfazpxvz3jwvsjsdrcxqqfcbjp8n8"; + url = "https://github.com/purescript-contrib/purescript-js-bigints"; + rev = "36a7d8ac75a7230043ae511f3145f9ed130954a9"; + sha256 = "0q3j7jl6ga63ygw2hmfigxjq8nbj56p3bn94x7vnhnhq7996bkpd"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "js-timers" = pkgs.stdenv.mkDerivation { - name = "js-timers"; - version = "v5.0.1"; + "js-date" = pkgs.stdenv.mkDerivation { + name = "js-date"; + version = "v8.0.0"; src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-js-timers.git"; - rev = "86afef13f457b9506acdfe88559ee18f1cd2c2d8"; - sha256 = "0008paz0qkz5n1pfrzagkkac6jny9z2rd1ij10ww2k1pkb9cy59z"; + url = "https://github.com/purescript-contrib/purescript-js-date.git"; + rev = "1ea020316946cc4b87195bca9c54d0c16abaa490"; + sha256 = "03535g8hc4bzyzig25hf75dls9ypsgrdk2nc45h8zw4xyy4ha0gz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -655,11 +655,11 @@ let "js-uri" = pkgs.stdenv.mkDerivation { name = "js-uri"; - version = "v2.0.0"; + version = "v3.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-js-uri.git"; - rev = "6145d5e631be3d57d8a4a9cf976ae140713dee35"; - sha256 = "1q34ir93cqbcl9g49vv1qfj8jxbbdj7f85a14y4mzd7yjq0a042g"; + rev = "06f7ae755ccb36bfa80bc3702533165af5c7ef06"; + sha256 = "0c9k1fpf4ljlqsnb07i3gwa6jiwlli0046pnglmk56ls53l6d4aj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -679,11 +679,11 @@ let "lazy" = pkgs.stdenv.mkDerivation { name = "lazy"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lazy.git"; - rev = "2f73f61e7ac1ae1cfe05564112e3313530e673ff"; - sha256 = "1wxfx019911gbkifq266hgn67zwm89pxhi83bai77mva5n9j3f6l"; + rev = "48347841226b27af5205a1a8ec71e27a93ce86fd"; + sha256 = "0dxlc3b2bdqsri45i7a9bvwvv0gg43cc1gq61zi41f290a29ny2q"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -691,11 +691,11 @@ let "lcg" = pkgs.stdenv.mkDerivation { name = "lcg"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lcg.git"; - rev = "8fb2eb16bbba2cee1d115a6729659ac649da811b"; - sha256 = "04r9bmx9kc3jqx59hh9yqqkl95mf869la9as5h36jv85ynn464dx"; + rev = "67c6c6483a563a59ae036d9dca0f1be2835326a5"; + sha256 = "1shzn6zvc1cxd7v0bvfsk7x3xf59vxby8c5lfjvd746r6396zn65"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -703,11 +703,11 @@ let "lists" = pkgs.stdenv.mkDerivation { name = "lists"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lists.git"; - rev = "6383c4f202b3f69474f9f7da182c2d42fcc3111c"; - sha256 = "0xmg918s3mqvfvwgjfqcs1yvcz6hy2n7h3ygqz2iyvk868gz25qs"; + rev = "b113451e5b41cad87d669a3165f955c71cd863e2"; + sha256 = "1mg7vy44k8jlqkri7x4ikciixx92b17wi35887x09dwdsicjf0sx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -715,23 +715,11 @@ let "literals" = pkgs.stdenv.mkDerivation { name = "literals"; - version = "v0.2.0"; - src = pkgs.fetchgit { - url = "https://github.com/jvliwanag/purescript-literals.git"; - rev = "11457380e1b28c9526c41381eeb0ee840982db5c"; - sha256 = "1jjnpfmh9qfmffyrmcfnn9p25irmsmaji6lwrsrd2r9xdhpzmqg7"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "math" = pkgs.stdenv.mkDerivation { - name = "math"; - version = "v3.0.0"; + version = "v1.0.2"; src = pkgs.fetchgit { - url = "https://github.com/purescript/purescript-math.git"; - rev = "59746cc74e23fb1f04e09342884c5d1e3943a04f"; - sha256 = "0hkf0vyiga21992d9vbvdbnzdkvgljmsi497jjas1rk3vhblx8sq"; + url = "https://github.com/rowtype-yoga/purescript-literals.git"; + rev = "ae3ef4e9c1ae7c57ec77bd13906fa60ae8abba4a"; + sha256 = "1dvzi3qx6jbfw2g28wgbh1s9zv8z59wrf7r7jhib4g5ibgzq5r8q"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -739,23 +727,11 @@ let "maybe" = pkgs.stdenv.mkDerivation { name = "maybe"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-maybe.git"; - rev = "8e96ca0187208e78e8df6a464c281850e5c9400c"; - sha256 = "0vyk3r9gklvv7awzpph7ra53zxxbin1ngmqflb5vvr2365v5xyqy"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "medea" = pkgs.stdenv.mkDerivation { - name = "medea"; - version = "8b215851959aa8bbf33e6708df6bd683c89d1a5a"; - src = pkgs.fetchgit { - url = "https://github.com/juspay/medea-ps.git"; - rev = "8b215851959aa8bbf33e6708df6bd683c89d1a5a"; - sha256 = "05gnar9l1li0v1vv12kga0sssskfm4f1x9y6smpmqbqg9396pmsq"; + rev = "c6f98ac1088766287106c5d9c8e30e7648d36786"; + sha256 = "0n33g8c579vcs06ii0r7f14jjdwzjw7p583w4nmrv9h442q2cvlz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -763,11 +739,11 @@ let "media-types" = pkgs.stdenv.mkDerivation { name = "media-types"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-media-types.git"; - rev = "b6efa4c1e6808b31f399d8030b5938acec87cb48"; - sha256 = "0l51nd1w52756pyy3zliwmhfbin0px4pxr7d2h5vchl1wq895fja"; + rev = "af853de226592f319a953637069a943dd261cba3"; + sha256 = "0bxpsd2yw3zg58ay649v3xld7n17n7j7n9y8l841cjih9bc7ccxx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -775,11 +751,11 @@ let "mmorph" = pkgs.stdenv.mkDerivation { name = "mmorph"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/Thimoteus/purescript-mmorph.git"; - rev = "ebe16afbfa16dd600f3379ccedc7529417402393"; - sha256 = "0ds88hray8v0519n9k546qsc4qs8bj1k5h5az7nwfp0gaq0r5wpk"; + rev = "94bc558ac34184d5236a7a9b2463dcc7551ced8e"; + sha256 = "0m3m1kjy4i9lwzj8l5qlafxawyhbdxj035wa5ys4j8v4013a92xg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -809,25 +785,13 @@ let installPhase = "ln -s $src $out"; }; - "naturals" = pkgs.stdenv.mkDerivation { - name = "naturals"; - version = "v3.0.0"; - src = pkgs.fetchgit { - url = "https://github.com/LiamGoodacre/purescript-naturals.git"; - rev = "53aaa11516cd1bb8429f33032802bf43a5b04644"; - sha256 = "0jaly95g46rbb7xwfv655pgm2bsp11p1iriasa0w79ryv0p488hi"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - "newtype" = pkgs.stdenv.mkDerivation { name = "newtype"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-newtype.git"; - rev = "7b292fcd2ac7c4a25d7a7a8d3387d0ee7de89b13"; - sha256 = "1fgzbxslckva2psn0sia30hfakx8xchz3wx2kkh3w8rr4nn2py8v"; + rev = "29d8e6dd77aec2c975c948364ec3faf26e14ee7b"; + sha256 = "0kfc644zn2f9rpx8fy4gjvmz04k9mv1c2xrqis8m3s0ydnhbffd7"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -835,11 +799,11 @@ let "noble-secp256k1" = pkgs.stdenv.mkDerivation { name = "noble-secp256k1"; - version = "710c15c48c5afae5e0623664d982a587ff2bd177"; + version = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd"; src = pkgs.fetchgit { url = "https://github.com/mlabs-haskell/purescript-noble-secp256k1.git"; - rev = "710c15c48c5afae5e0623664d982a587ff2bd177"; - sha256 = "014wapsgg6xa76i3f368aag4kps644g8qqqha9xbgyxmrhxsln6q"; + rev = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd"; + sha256 = "0n2q83n210ih5l54p6wrrjqmy40xhhdd3mam5mzixgr2hszm8969"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -847,11 +811,11 @@ let "node-buffer" = pkgs.stdenv.mkDerivation { name = "node-buffer"; - version = "v7.0.1"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-buffer.git"; - rev = "0721f1e8d768df48ae429547c8c60b121ca120cb"; - sha256 = "14bf3llsa20ivkwp5hlyk8v8zfzpzhhsni9pd8rfqdyzp6zrdx3b"; + rev = "7be7bd082b7d3e15de2ed5a626d43af746bdb35e"; + sha256 = "1l1j4ml0lyhnxs1zcy3jchlc0mbsn40g1pxyb4lv6slhp0qdhjhp"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -859,11 +823,11 @@ let "node-child-process" = pkgs.stdenv.mkDerivation { name = "node-child-process"; - version = "v7.1.0"; + version = "v9.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-child-process.git"; - rev = "5c4e560eceead04efc1d5a3ec1f6de91bb1d512e"; - sha256 = "18va367xims00hmjwiasiifdfak3cbs0sp4sr52ihb20n19n6h5b"; + rev = "ceaa5dcd21697da24a916b81c73ba013592cf378"; + sha256 = "1h93r8q0gpdp3vz89b9aazdr0dc99kyx0wx8xb1ap8v2img8xid1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -871,11 +835,11 @@ let "node-fs" = pkgs.stdenv.mkDerivation { name = "node-fs"; - version = "v6.2.0"; + version = "v8.1.1"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-fs.git"; - rev = "3cb63cc55a02e506fe07d3940a50d6f0eb6ca2f2"; - sha256 = "1b89sxr6asxvgx59myhfbahiiz1z6sg2qfrm9bqd46h93ai8bhn1"; + rev = "a9da8b9860f8a1f67e38701f5cce72a0f2c3901d"; + sha256 = "0ywv0d8w2fbqnj9z1dxbm2a9na10g960b5gznjcf7d70gs22ixhj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -883,11 +847,11 @@ let "node-fs-aff" = pkgs.stdenv.mkDerivation { name = "node-fs-aff"; - version = "v7.0.0"; + version = "v9.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-fs-aff.git"; - rev = "1da5d326573c3b17c6d4dba3d0e0157e60869f91"; - sha256 = "10aglq89gbchykwlckmg5xsln705qha76f125snkmk056kq2w89h"; + rev = "ac9b6fd272eb52c906b490be1c714423dd36a5bf"; + sha256 = "0mi91kd1b0ix8ygaaj5jspw0m53b8rv5mingrk2lvxhimsxa3f81"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -895,11 +859,11 @@ let "node-http" = pkgs.stdenv.mkDerivation { name = "node-http"; - version = "v6.0.0"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-http.git"; - rev = "48a4da07051f0cc9a9d08fbfe8179ebf55aff39a"; - sha256 = "1521ab70jx7a9d7kk4gn1sk4w6knfi13pai1kanhrvwp5lfys5wl"; + rev = "9baab9d9b45064e8cc1d53913bb1668bfa799b16"; + sha256 = "1bi7kwai15l4lqcnaq14mi906cppcjm3iqax4qq3vjihf68b66r4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -907,11 +871,11 @@ let "node-net" = pkgs.stdenv.mkDerivation { name = "node-net"; - version = "v2.0.1"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-net.git"; - rev = "e25a2c538dfa524cd9b75bf12fd7a393efe2f7e9"; - sha256 = "17sx9r74kdjq85dafm5kisbvgdb0wn11lq9gaazpdirhshpm2wl5"; + rev = "812ce3142b67c33db225a0f94fabd6a6776bf0be"; + sha256 = "18z42zqinm357qzr8r7w7lwhjnmd2693ywqkb1ndjd2p3dz7x4zm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -919,11 +883,11 @@ let "node-path" = pkgs.stdenv.mkDerivation { name = "node-path"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-path.git"; - rev = "a2d7cf05e40b607ef7d048a3684cda788cd42890"; - sha256 = "1384qyf4v84wbahafzvqdxjllqy8qkd5dpkhsl3js444vsm2aplr"; + rev = "d5f08cfde829b831408c4c6587cec83f2cd6a58e"; + sha256 = "1d38ipij4lb1nq8wkv7kmpk77z5ac0spfc89hfc9yn6jnscl6sky"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -931,11 +895,11 @@ let "node-process" = pkgs.stdenv.mkDerivation { name = "node-process"; - version = "v8.2.0"; + version = "v10.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-process.git"; - rev = "e1e807ac7831d1a8a15e242964f7e5005e42f76b"; - sha256 = "0nl9r271s8f71a9wqfkadq9b490h8phwgqc61jbzhm4ags23pqpg"; + rev = "9d126d9d4f898723e7cab69895770bbac0c3a0b8"; + sha256 = "07gcg33g56f74ph2bqmj5lysy752f6y31y7mkrgd2m0jzi7wknn3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -943,11 +907,11 @@ let "node-readline" = pkgs.stdenv.mkDerivation { name = "node-readline"; - version = "v5.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-readline.git"; - rev = "c59deb30c7ff5cc91d6b062120c5a3979bd4ccff"; - sha256 = "0c299bvkhrdbij88fxb75sdm7bl4wpgv9fz7wsj0hw6gkxmplpj9"; + rev = "fbe80a949275f15643b80f9db7c01d5a6b4031ed"; + sha256 = "1gxldf016w8xjm6jj95mshglgb4gcs9scxfr5ckxry1rzk6fzz1d"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -955,11 +919,11 @@ let "node-streams" = pkgs.stdenv.mkDerivation { name = "node-streams"; - version = "v5.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-streams.git"; - rev = "886bb2045685e3b9031687d69ccfed29972147bb"; - sha256 = "1jc3d4x0v77h8qcwq7hpwprsdr3gqmdfiyr1ph0kiy7r9bbrqwfx"; + rev = "8395652f9f347101fe042f58726edc592ae5086c"; + sha256 = "1cgkh3dwnhv90r7dak3x4dq698gh30ghfxncrw0ngwrv5pismn0x"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -967,11 +931,11 @@ let "node-url" = pkgs.stdenv.mkDerivation { name = "node-url"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-url.git"; - rev = "d5671f5e38051f4fa7acacd9ec157ed9dc6ded46"; - sha256 = "0w78q23vxa2nldy0dfj4nb5kv0pcrc1yq7dp1mysz7cdi9f72zp9"; + rev = "de7b279df13a9eeef2455af561525f37568c190e"; + sha256 = "14qkni1138jn02s8hpchc0i73n7brj1j9d3gwc8kh1wz1ddhjypw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -979,11 +943,11 @@ let "nonempty" = pkgs.stdenv.mkDerivation { name = "nonempty"; - version = "v6.1.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-nonempty.git"; - rev = "7696eaf915da5333173bca7d779a51f91a525b83"; - sha256 = "0hhhw5x5xvs2bd9373gklja1545glnzi1xc2sj16kkznnayrmvsn"; + rev = "28150ecc7419238b187abd609a92a645273348bb"; + sha256 = "1mwdc2sny2ygp67kyk7h2493vq7syf7j18s3d9a5gwf1y7jlf7gh"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -991,11 +955,11 @@ let "now" = pkgs.stdenv.mkDerivation { name = "now"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-now.git"; - rev = "4c994dae8bb650787de1e4d9e709f2565fb354fb"; - sha256 = "1wa4j2h5rlw1lgfpm7rif3v6ksm8lplxl1x69zpk8hdf0cfyz4qm"; + rev = "b5ffed2381e5fefc063f484e607e8499e79eaf32"; + sha256 = "01khmqs4iz7dhlvd43zxj19q0c0vvqf1m128vgvgxz5mv430zfgr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1003,11 +967,11 @@ let "nullable" = pkgs.stdenv.mkDerivation { name = "nullable"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-nullable.git"; - rev = "8b19c16b16593102ae5d5d9f5b42eea0e213e2f5"; - sha256 = "0jbmks8kwhpb5fr2b9nb70fjwh6zdnwirycvzr77jafcny24yrnl"; + rev = "3202744c6c65e8d1fbba7f4256a1c482078e7fb5"; + sha256 = "10s3b54pjmr2rxlyzvc8yc99k1dpn0qrijnc4y65yj5z6bxf2791"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1015,11 +979,11 @@ let "numbers" = pkgs.stdenv.mkDerivation { name = "numbers"; - version = "v8.0.0"; + version = "v9.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-numbers.git"; - rev = "f5bbd96cbed58403c4445bd4c73df50fc8d86f46"; - sha256 = "00pm2x4kh4fm91r7nmik1v5jclkgh7gpxz13ambyqxbxbiqjq0vg"; + rev = "2a53528f18f9415334bae28e7bb3cf3be86342c2"; + sha256 = "1h4v6ir1hq6gvkk0kla38vlcd6bv73xkc8pv71jygwqxrdwfxxgw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1039,11 +1003,11 @@ let "options" = pkgs.stdenv.mkDerivation { name = "options"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-options.git"; - rev = "0309a42692251ce5e3d1d0be57d4f63f7143f858"; - sha256 = "04f70wfik1pi6nzfq2cn3la9z735akkadpx5cxbs4mx8xg032sjd"; + rev = "93e4eb4610975cb7b3bb290273396707e7384c38"; + sha256 = "1c8qkln40i1sf2lz8c6wn4ijj7jmfgzmgsrn9ax7m4ix9c05r5sq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1051,11 +1015,11 @@ let "optparse" = pkgs.stdenv.mkDerivation { name = "optparse"; - version = "v4.1.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/f-o-a-m/purescript-optparse.git"; - rev = "04f2ed818f32390a9feff04b892f23c96ccb84cb"; - sha256 = "0b05wczcjnann0xw6vdaq2c1a2n9rcgvq9l29wa5461b5mvjyb80"; + rev = "dbc4c385e6c436eed4299ae2c0bb2cc278cf2410"; + sha256 = "05sd1ziz6rx1k0wz1nnhfnl1gz3s6qld3whkkjz8lilrvycxxn47"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1063,11 +1027,11 @@ let "ordered-collections" = pkgs.stdenv.mkDerivation { name = "ordered-collections"; - version = "v2.0.2"; + version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-ordered-collections.git"; - rev = "1929b706b07e251995b6be51baa7995c61eb4d83"; - sha256 = "0g57043ylj3kldkm5vn233yd6hiamryhdfh72cxx9h3mn0ra8ghd"; + rev = "9826b7632d0d0a691173bde308a634195f42a419"; + sha256 = "1wk8mcn1zsxi0yk9ybas2v7m0drb492806gld1xxxic8x1i19ws0"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1075,11 +1039,11 @@ let "orders" = pkgs.stdenv.mkDerivation { name = "orders"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-orders.git"; - rev = "c25b7075426cf82bcb960495f28d2541c9a75510"; - sha256 = "0wwy3ycjll0s590ra35zf5gjvs86w97rln09bj428axhg7cvfl0a"; + rev = "f86db621ec5eef1274145f8b1fd8ebbfe0ed4a2c"; + sha256 = "14fjls3v14ia6fr2w4p0i5dqv10zk343wg28m4c77a17jmvbs9r4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1087,11 +1051,11 @@ let "parallel" = pkgs.stdenv.mkDerivation { name = "parallel"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-parallel.git"; - rev = "16b38a2e148639b04ae67e0ce63cc220da8857f7"; - sha256 = "0x8mvhgs8ygqj34xgyhk6gixqm32p2ymm00zg0zdw13g3lil9p4x"; + rev = "85290dca837771ac4870071008c933d315ef678f"; + sha256 = "0bpwvzq4dn7vx5mfj12w1zvvnamc6w2c45c2v54b9yw36snnwpcf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1099,11 +1063,11 @@ let "parsing" = pkgs.stdenv.mkDerivation { name = "parsing"; - version = "v7.0.1"; + version = "v10.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-parsing.git"; - rev = "a3e82c26ce2c74b5fa38ff7814d7c35bf9233af5"; - sha256 = "15yx51khg3niqiryc6qdii6lwdvni77ak7dkbf9w5zw4h1y51p9a"; + rev = "6dc1e9cab195f4af3394b48c508b4794328edeac"; + sha256 = "1i2idq5l7vanxrd8k6yg4fjp6l3cigrq266qyjs07ri5cc4k8879"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1111,11 +1075,11 @@ let "partial" = pkgs.stdenv.mkDerivation { name = "partial"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-partial.git"; - rev = "2f0a5239efab68179a684603263bcec8f1489b08"; - sha256 = "0acxf686hvaj793hyb7kfn9lf96kv3nk0lls2p9j095ylp55sldb"; + rev = "0fa0646f5ea1ec5f0c46dcbd770c705a6c9ad3ec"; + sha256 = "04s1h0r3slyd8kcamhqqrr6piksl9y76nmf2418j0ifhp16qwxmm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1123,11 +1087,11 @@ let "pipes" = pkgs.stdenv.mkDerivation { name = "pipes"; - version = "v7.0.1"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/felixschl/purescript-pipes.git"; - rev = "42e43f0961ad0fc3f1cef6986fe23ca9f48f6dda"; - sha256 = "0jzgzi34wqqdcfgznbpfv4b8al2prd36yshnndlvkqfv70smx3kh"; + rev = "e3bdc0b0db0a67e89a717b6118b23e78a380e23f"; + sha256 = "1jz3bfbl8b0hgbcm9y98bv2z29b072v1k8snp19vb2xql1zd40sx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1135,11 +1099,11 @@ let "posix-types" = pkgs.stdenv.mkDerivation { name = "posix-types"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-posix-types.git"; - rev = "e562680fce64b67e26741a61a51160a04fd3e7fb"; - sha256 = "1knhdnnmxx77qsjz3gk1ga7n713l303dxyn8zs46qh7p2hnkalkc"; + rev = "b79ff37f87846ca5caab2123cf84148e700d40d1"; + sha256 = "1zcm2hikfigh5fbwg12c61gvvjhmwgy6fplfcm6bc5aqb7w3czll"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1147,11 +1111,11 @@ let "prelude" = pkgs.stdenv.mkDerivation { name = "prelude"; - version = "v5.0.1"; + version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-prelude.git"; - rev = "68f8012bc2309d9bf5832cdf7316ad052d586905"; - sha256 = "1x0cacvv9mmw80vy6f40y0p959q1dz28fwjswhyd7ws6npbklcy0"; + rev = "f4cad0ae8106185c9ab407f43cf9abf05c256af4"; + sha256 = "0j6mb9w728ifcp10jdv7l9k7k5pw8j1f0fa7xyb8xmbxzc59xqpy"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1159,11 +1123,11 @@ let "profunctor" = pkgs.stdenv.mkDerivation { name = "profunctor"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-profunctor.git"; - rev = "4551b8e437a00268cc9b687cbe691d75e812e82b"; - sha256 = "0fvd2xiv77sp4jd4spgdp4i9812p6pdzzbg4pa96mbr0h19jf39c"; + rev = "0a966a14e7b0c827d44657dc1710cdc712d2e034"; + sha256 = "07rhk8micbc74my6s53xbj2smvvwah2w1drqrcmcnncxdks3lqg3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1171,11 +1135,11 @@ let "profunctor-lenses" = pkgs.stdenv.mkDerivation { name = "profunctor-lenses"; - version = "v7.0.1"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-profunctor-lenses.git"; - rev = "9c3d87a6dab8eb785a93bff11aa183796dc93183"; - sha256 = "1wknj7g6vwk2ga1rq57l470h322308ddjn5bd3x2hhfkiy039kc3"; + rev = "973d567afe458fd802cf4f0d9725b6dc35ad9297"; + sha256 = "0axz7nznn12iqh6sn9qjg6i8qglpdsqgkp30ndwdj98czcnbnybv"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1195,23 +1159,11 @@ let "psci-support" = pkgs.stdenv.mkDerivation { name = "psci-support"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-psci-support.git"; - rev = "f26fe8266a63494080476333e22f971404ea8846"; - sha256 = "16vhf8hapd7rcgmafmjpiq7smhzdh3300f2idk1q4kk01yxn8ddj"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "purescript-toppokki" = pkgs.stdenv.mkDerivation { - name = "purescript-toppokki"; - version = "6983e07bf0aa55ab779bcef12df3df339a2b5bd9"; - src = pkgs.fetchgit { - url = "https://github.com/firefrorefiddle/purescript-toppokki"; - rev = "6983e07bf0aa55ab779bcef12df3df339a2b5bd9"; - sha256 = "01arx2sp2k287cr4y96frnn6jlghcias9hwdr27yr28k4xa5bhfv"; + rev = "897cdb543548cb6078d69b6413b54841404eda72"; + sha256 = "1ix53r8avkn3fw72mngwzw7v6c6mv7j4miw5mrgjrh9hb8p2ydl1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1219,11 +1171,11 @@ let "quickcheck" = pkgs.stdenv.mkDerivation { name = "quickcheck"; - version = "v7.1.0"; + version = "v8.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-quickcheck.git"; - rev = "990fa1cf14b48b827d9b2d115b1c6977c4b0a76d"; - sha256 = "1dxchng3r2mad0505a0c7cc35vs1f7y2xb5i13p59jpdz6ijqa9k"; + rev = "bf5029f97e6c0d7552d3a08d2ab793a19e2c5e3d"; + sha256 = "142dvh57fl8b6i7mm37a38v7vkc1znbqz6l6wqa704m53hkikvyd"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1243,11 +1195,11 @@ let "quickcheck-laws" = pkgs.stdenv.mkDerivation { name = "quickcheck-laws"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-quickcheck-laws.git"; - rev = "464597522e5e001adc2619676584871f423b9ea0"; - sha256 = "1m397bh2w5a0wvms8rjgfxh71m7krmfkgk11j5krhz86b72k3izd"; + rev = "04f00fb78d88f38a2f2bb73b75f97ce5bf5624fc"; + sha256 = "0izp71wq253k9wih2hspfs4p1s36yins2a5mh13yl57pf1srbrky"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1255,11 +1207,11 @@ let "random" = pkgs.stdenv.mkDerivation { name = "random"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-random.git"; - rev = "3e02da113c7afbac37ea4e16188c39d3057314d5"; - sha256 = "1v6ykgp8jmx488hq8mgb0l0sf1nyhjs6wq0w279iyibk9jxc6nib"; + rev = "9540bc965a9596da02fefd9949418bb19c92533a"; + sha256 = "0qz14qviz5053j9h1jwpk0gnn692hcdx6fp90wckzrnw31d53174"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1267,11 +1219,11 @@ let "rationals" = pkgs.stdenv.mkDerivation { name = "rationals"; - version = "v5.0.0"; + version = "v5.0.1"; src = pkgs.fetchgit { - url = "https://github.com/anttih/purescript-rationals.git"; - rev = "8c52d8cc891d1223150a31416220aa9b99404442"; - sha256 = "1idvjvvx5kwmi8kj2ps95bcvlsgij1xgin4jfw3rmcqd930wqq6q"; + url = "https://github.com/purescript-contrib/purescript-rationals.git"; + rev = "b480bc41dbfc926977ebdf4e2a4b9fed253c91a1"; + sha256 = "06fczcfc937iwpj4r8qhprgw35ryn0hfqgjxmn2rcljx37q70xka"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1279,11 +1231,11 @@ let "record" = pkgs.stdenv.mkDerivation { name = "record"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-record.git"; - rev = "091495d61fcaa9d8d8232e7b800f403a3165a38f"; - sha256 = "0yidfvwiajiv8xflfsi2p8dqnp0qmmcz9jry58jyn9ga82z2pqn6"; + rev = "c89cd1ada6b636692571fc374196b1c39c4c9f70"; + sha256 = "1g7s2h1as5cz824wpm0jhjprrh66shha5i4gq37q73yw0s5p2ahm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1291,11 +1243,11 @@ let "refs" = pkgs.stdenv.mkDerivation { name = "refs"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-refs.git"; - rev = "f66d3cdf6a6bf4510e5181b3fac215054d8f1e2e"; - sha256 = "1jhc2v784jy8bvkqy4zsh2z7pnqrhwa8n5kx98xhxx73n1bf38sg"; + rev = "f8e6216da4cb9309fde1f20cd6f69ac3a3b7f9e8"; + sha256 = "09bvfxhjfwfwv55py45s71maazwrr68k0rk4v8ynfqv91h34319h"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1303,35 +1255,11 @@ let "safe-coerce" = pkgs.stdenv.mkDerivation { name = "safe-coerce"; - version = "v1.0.0"; + version = "v2.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-safe-coerce.git"; - rev = "e719defd227d932da067a1f0d62a60b3d3ff3637"; - sha256 = "0m942lc23317izspz1sxw957mwl9yb9bgk8dh23f7b3a8w9hh8ff"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "safely" = pkgs.stdenv.mkDerivation { - name = "safely"; - version = "v4.0.1"; - src = pkgs.fetchgit { - url = "https://github.com/paf31/purescript-safely.git"; - rev = "19f854737e17b4d058e5a1504a960821db36e4ab"; - sha256 = "1mrpz19smjsamz4cci287z89q715chzxna0gpbvdgivlca4z6879"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "sequences" = pkgs.stdenv.mkDerivation { - name = "sequences"; - version = "v3.0.2"; - src = pkgs.fetchgit { - url = "https://github.com/hdgarrood/purescript-sequences"; - rev = "1f1d828ef30070569c812d0af23eb7253bb1e990"; - sha256 = "0mc0jjs1119c2nyd08yhdmliq3s47lhrdknhziga3lnbzja889k4"; + rev = "7fa799ae80a38b8d948efcb52608e58e198b3da7"; + sha256 = "00m4l733gpl0153cbl6n5kly7jr8ids399apza2rbczif40brp9g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1339,11 +1267,11 @@ let "spec" = pkgs.stdenv.mkDerivation { name = "spec"; - version = "v5.0.1"; + version = "v7.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-spec/purescript-spec.git"; - rev = "2cfa11573dbb695c117efce0a8f76a3daba12e87"; - sha256 = "0hpca1sa738029ww74zpw31br5x339q35kzb10iqd55lp6611k80"; + rev = "1ae536c4d9848d26087fe5e0606409740aa421b7"; + sha256 = "1vyk0fn39qfwx4i7vanazr5v0q0w0sxsxzmlliwlpcb9kvd1b2b3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1351,11 +1279,11 @@ let "spec-quickcheck" = pkgs.stdenv.mkDerivation { name = "spec-quickcheck"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-spec/purescript-spec-quickcheck.git"; - rev = "c2991f475b8fa11de8b68bcb5895b36be04d1e82"; - sha256 = "01xcbfyqzax9c5najbfy12q0nvfklfm37llj2vkmi3wgkskg4prz"; + rev = "c83de337db1f74ff75e0d7c574a2f7407bc5f2b2"; + sha256 = "1y9rzb8kbahhchplswdxrjqm4qjkv1bnv9mzg8v62m1ipk3kdndj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1363,11 +1291,11 @@ let "st" = pkgs.stdenv.mkDerivation { name = "st"; - version = "v5.0.1"; + version = "v6.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-st.git"; - rev = "994eb5e650f3caedac385dcc61694f691df57983"; - sha256 = "14hz254f1y0k3v83z719np0ddrgbca0hdsd9dvv244i07vlvm2zj"; + rev = "fc2fe2972bb12e6a2bd3b295baf01577240c23ac"; + sha256 = "17syc11gxhi1law4lskrr4swr62n4r7irj5imdyjjp8z0p5c6p8z"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1375,11 +1303,11 @@ let "strings" = pkgs.stdenv.mkDerivation { name = "strings"; - version = "v5.0.0"; + version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-strings.git"; - rev = "157e372a23e4becd594d7e7bff6f372a6f63dd82"; - sha256 = "0hyaa4d8gyyvac2nxnwqkn2rvi5vax4bi4yv10mpk7rgb8rv7mb8"; + rev = "3d3e2f7197d4f7aacb15e854ee9a645489555fff"; + sha256 = "1dx6l4j4yw6w6nxa687gf04q4caa99ccl4cp4q22nda6ghsz7yjl"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1387,11 +1315,11 @@ let "stringutils" = pkgs.stdenv.mkDerivation { name = "stringutils"; - version = "v0.0.11"; + version = "v0.0.12"; src = pkgs.fetchgit { url = "https://github.com/menelaos/purescript-stringutils.git"; - rev = "e149d04cd5bcc25222c1807f2e1edafb36b5f70e"; - sha256 = "1hbr936bvnm5iil4cfr9qhkbzd1i00yrxf5jd0rnny29df5wsq1w"; + rev = "51d92cacd8c8102fc4e6137b4f709a2b11ca5186"; + sha256 = "0wdmishvnlfw8r6b3ivzr8d7300cxg1m77qd74ip4c0gd4zqvhs4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1399,35 +1327,35 @@ let "tailrec" = pkgs.stdenv.mkDerivation { name = "tailrec"; - version = "v5.0.1"; + version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-tailrec.git"; - rev = "5fbf0ac05dc6ab1a228b2897630195eb7483b962"; - sha256 = "1jjl2q2hyhjcdxpamzr1cdlxhmq2bl170x5p3jajb9zgwkqx0x22"; + rev = "5661a10afbd4849bd2e45139ea567beb40b20f9f"; + sha256 = "0snhrvkpd429r0d0bzs0mxwwz3am9bpa1m9f5a9hpmyjjkl7gddw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "test-unit" = pkgs.stdenv.mkDerivation { - name = "test-unit"; - version = "v16.0.0"; + "these" = pkgs.stdenv.mkDerivation { + name = "these"; + version = "v6.0.0"; src = pkgs.fetchgit { - url = "https://github.com/bodil/purescript-test-unit.git"; - rev = "56d06897b621df5d2f619433d19ababb5bb8ebd1"; - sha256 = "0qz903phxkgrn7qdz1xi49bydkf5cbxssyb4xk029zi4lshb35mw"; + url = "https://github.com/purescript-contrib/purescript-these.git"; + rev = "ad4de7d2bb9ce684a9dff5def6489630736985b8"; + sha256 = "1i73qz7pk11mbiymhfg21i3nq92hqjmqzj4gjp1n6l2zkm0lmql3"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; - "these" = pkgs.stdenv.mkDerivation { - name = "these"; - version = "v5.0.0"; + "toppokki" = pkgs.stdenv.mkDerivation { + name = "toppokki"; + version = "5992e93396a734c980ef61c74df5b6ab46108920"; src = pkgs.fetchgit { - url = "https://github.com/purescript-contrib/purescript-these.git"; - rev = "38dcf86a9bd772091e1153f2f1c13223703599b7"; - sha256 = "0d6yg3lwgralh1kcm5cd4myyz66k9qzld61hc5dg3z92d96zbvlr"; + url = "https://github.com/mlabs-haskell/purescript-toppokki"; + rev = "5992e93396a734c980ef61c74df5b6ab46108920"; + sha256 = "12sbs5x20rmr6xrh9y69aw7bmiwnmj8a0s5s9s1mh66fyh7gfh3s"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1435,11 +1363,11 @@ let "transformers" = pkgs.stdenv.mkDerivation { name = "transformers"; - version = "v5.2.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-transformers.git"; - rev = "1e5d4193b38c613c97ea1ebdb721c6b94cd8c50a"; - sha256 = "0lggimnq016v98ib6h68gnciraambxrfqm2s033wm34srcy8xs06"; + rev = "be72ab52357d9a665cbf93d73ba1c07c4b0957ee"; + sha256 = "0ijrdsppl8vx0rlbwc9p0vjbmvwlcy4ia7xymvk6y34zbxzjlzm6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1447,11 +1375,11 @@ let "tuples" = pkgs.stdenv.mkDerivation { name = "tuples"; - version = "v6.0.1"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-tuples.git"; - rev = "d4fe8ffe9e8c512111ee0bc18a6ba0fd056a6773"; - sha256 = "0s2ar2gih4r34km8r8dqngh21s8899yb93mb7mips08ndy3ajq3a"; + rev = "4f52da2729b448c8564369378f1232d8d2dc1d8b"; + sha256 = "1m1ng0xxicb73945jymcl1hn2y2hmynlnmhb2k0kkn1jrjwgcc3d"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1459,11 +1387,11 @@ let "type-equality" = pkgs.stdenv.mkDerivation { name = "type-equality"; - version = "v4.0.0"; + version = "v4.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-type-equality.git"; - rev = "f7644468f22ed267a15d398173d234fa6f45e2e0"; - sha256 = "126pg4zg3bsrn8dzvv75xp586nznxyswzgjlr7cag3ij3j1z0kl0"; + rev = "0525b7d39e0fbd81b4209518139fb8ab02695774"; + sha256 = "1ass38jdycsjisdimdc4drg2w8vkkwp6lkvz3kvy7q0h98vdmlbr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1483,11 +1411,11 @@ let "typelevel-prelude" = pkgs.stdenv.mkDerivation { name = "typelevel-prelude"; - version = "v6.0.0"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-typelevel-prelude.git"; - rev = "83ddcdb23d06c8d5ea6196596a70438f42cd4afd"; - sha256 = "1vwf3yhn8mir5y41wvlyszkgd5fxvrcyfd0l8cn20c8vfq36yzgk"; + rev = "dca2fe3c8cfd5527d4fe70c4bedfda30148405bf"; + sha256 = "0x86mrg33kpnrnsfp4p3c92j5lpyqzy87bxdynwf7smk3inqr2jc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1495,23 +1423,11 @@ let "uint" = pkgs.stdenv.mkDerivation { name = "uint"; - version = "v6.0.3"; + version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-uint.git"; - rev = "17fda2aff989ad7fa9f29171bf4c1196ca9ed504"; - sha256 = "1lwbkwc3yj0d5qmw7gni924wj47npgy1aqbc0ika4phc4q0shw8d"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "undefined" = pkgs.stdenv.mkDerivation { - name = "undefined"; - version = "v1.0.2"; - src = pkgs.fetchgit { - url = "https://github.com/bklaric/purescript-undefined.git"; - rev = "4012dc06b58feae301140bc081135d0f24c432b0"; - sha256 = "0kj504j3r9wr7m3yhm53bcfdzai0c2g99d2pdxlfinxk4pmixyrd"; + rev = "9e4f76ffd5192472f75583844172fe8ab3c0cb9f"; + sha256 = "173bhrd006q53s7agwyasxhfbr89x9jpz5b47vm2fr74l3jcw3lq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1519,11 +1435,11 @@ let "unfoldable" = pkgs.stdenv.mkDerivation { name = "unfoldable"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-unfoldable.git"; - rev = "bbcc2b062b9b7d3d61f123cfb32cc8c7fb811aa6"; - sha256 = "1v3bz04wj6hj7s6mcf49hajylg6w58n78q54sqi2ra2zq8h99kpw"; + rev = "493dfe04ed590e20d8f69079df2f58486882748d"; + sha256 = "15z2k639ph8wdkrc2y838m5am1z7szw2vqymmv021skzisyn7zwf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1531,23 +1447,11 @@ let "unicode" = pkgs.stdenv.mkDerivation { name = "unicode"; - version = "v5.0.1"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-unicode.git"; - rev = "2b66dcdb2ea533c7bc864574e860012c57ace2aa"; - sha256 = "0xh9wwyrl9nsw3h3wzalc1gaph39drj0i6k648cf9bnbb96nxa4z"; - }; - phases = "installPhase"; - installPhase = "ln -s $src $out"; - }; - - "unordered-collections" = pkgs.stdenv.mkDerivation { - name = "unordered-collections"; - version = "v2.1.4"; - src = pkgs.fetchgit { - url = "https://github.com/fehrenbach/purescript-unordered-collections.git"; - rev = "1be289188cef093520098e318ec910cf3ea5b40d"; - sha256 = "0vgfpdymxvgqf3sh8ji2w2b01w3s294v5mh04046s21qaywdi1jh"; + rev = "6454d59d9e1fd1bc5a72e80e985d8282022a567a"; + sha256 = "0w2gsmqcy7pj5vd22qzpig20bdgzmbagyqxrg9mm1njjfsmcm8cv"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1555,11 +1459,11 @@ let "unsafe-coerce" = pkgs.stdenv.mkDerivation { name = "unsafe-coerce"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-unsafe-coerce.git"; - rev = "ee24f0d3b94bf925d9c50fcc2b449579580178c0"; - sha256 = "0l2agnm1k910v4yp1hz19wrsrywsr5scb397762y7pigm3frzs8r"; + rev = "ab956f82e66e633f647fb3098e8ddd3ec58d689f"; + sha256 = "0r6d3dx8jalfzvrvkagz9v05yxwkkhgbzlpswg4w1cyl03zjcla4"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1567,11 +1471,11 @@ let "untagged-union" = pkgs.stdenv.mkDerivation { name = "untagged-union"; - version = "v0.3.0"; + version = "v1.0.0"; src = pkgs.fetchgit { - url = "https://github.com/jvliwanag/purescript-untagged-union.git"; - rev = "364e172e759ebe722bd7ec12a599d532b527c0ef"; - sha256 = "06013431acz8xry9dish8p2qyj18bi505fgfikpjiblxgjazl9zx"; + url = "https://github.com/rowtype-yoga/purescript-untagged-union.git"; + rev = "ed8262a966e15e751322c327e2759a9b9c0ef3f3"; + sha256 = "163blv01abd3dhcpqz499851lhwnmb4dlfbzkr3cs53d30w3yldx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1579,11 +1483,11 @@ let "variant" = pkgs.stdenv.mkDerivation { name = "variant"; - version = "v7.0.3"; + version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-variant.git"; - rev = "3f12411ede5edd342d25340c1babce9ae81d6793"; - sha256 = "1q2pky3gf177ihy2zjzqvp1cj18ycaki9vm4ghw18p7hf256lqmc"; + rev = "8b2bd73a4202257d80a955c4dd36f6055f149823"; + sha256 = "18nyxnaqqg1zzydwd2hh9hbzr31j509g5yb1lnd0m60bma4l9h5g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1591,11 +1495,11 @@ let "web-dom" = pkgs.stdenv.mkDerivation { name = "web-dom"; - version = "v5.0.0"; + version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-dom.git"; - rev = "03dfc2f512e124615ab183ade357e3d54007c79d"; - sha256 = "06g9cp9fkzyfwbz5cs0wxjxgdydm9hy7756p2w4vx94myki20hgx"; + rev = "568a1ee158b29e6e739e7a9aaed3e35ca4c4305a"; + sha256 = "0angs86ld0h3ld889ag55lh62101dfn3fknyqrfv0imgn40vwm44"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1603,11 +1507,11 @@ let "web-events" = pkgs.stdenv.mkDerivation { name = "web-events"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-events.git"; - rev = "c8a50893f04f54e2a59be7f885d25caef3589c57"; - sha256 = "1dxwrl2r39vazb3g1ka4dkpy6idyi17aq4hf9vvdsmcwf2jjwbn9"; + rev = "2124356117be7b764a2f3948032255ac4dab7051"; + sha256 = "0l47gsgj71x0gjbhjqwsar2y44ljhq3xa0nkgr1qvqxmcm00llqf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1615,11 +1519,11 @@ let "web-file" = pkgs.stdenv.mkDerivation { name = "web-file"; - version = "v3.0.0"; + version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-file.git"; - rev = "3e42263b4392d82c0e379b7a481bbee9b38b1308"; - sha256 = "11x1inhr5pvs2iyg818cywwdskb33q777592sd3b4g4jyczcb1li"; + rev = "023786ae62bbb8bf58156dd7f02011fa38221ef1"; + sha256 = "1wjf1m5y2qsba83is297icv9zyl7jilxdga0192mm1rp0j16jjln"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1627,11 +1531,11 @@ let "web-html" = pkgs.stdenv.mkDerivation { name = "web-html"; - version = "v3.2.0"; + version = "v4.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-html.git"; - rev = "3a249b966ee72c19874b4a2ec6db4059087500e4"; - sha256 = "1ds26vwyba0chhpa09m938brw9q8pxjk6z1n3d4nc30hvdkrjnbh"; + rev = "40e9a0c5c927e4d9f7ba7c1204e4792f4d24cc27"; + sha256 = "0ifvk7swjn58nbk19pi4f19r247d67zhl5xgvcwb56vlmrk2pk83"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1639,11 +1543,11 @@ let "web-storage" = pkgs.stdenv.mkDerivation { name = "web-storage"; - version = "v4.0.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-storage.git"; - rev = "22fa56bac204c708e521e746ad4ca2b5810f62c5"; - sha256 = "1viy027k9qyr7mckqkvizwbwkfskc6frppsa1v9a0hq6gc08mpjx"; + rev = "6b74461e136755db70c271dc898d51776363d7e2"; + sha256 = "0q1grh8cp6h1szsqg3xmwlzrc1bbz8yzlwxlcl1iym5mjiyzgkcs"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; @@ -1651,11 +1555,11 @@ let "web-xhr" = pkgs.stdenv.mkDerivation { name = "web-xhr"; - version = "v4.1.0"; + version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-web/purescript-web-xhr.git"; - rev = "997b87caa6dcdf66b6db22f29f522d722559956b"; - sha256 = "0hzmqga8l24l20kyd98bcpd8bmz7by14vl311m9yfdg5mjkjg42g"; + rev = "476122fe3ad19031aeb69186209b480e2fc9ef25"; + sha256 = "1swpprc000gfqid6r05pxs8wvlc5xjry5s2kk8lk3ah2dgv297sf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; diff --git a/templates/ctl-scaffold/spago.dhall b/templates/ctl-scaffold/spago.dhall index 38fe179f5..988099120 100644 --- a/templates/ctl-scaffold/spago.dhall +++ b/templates/ctl-scaffold/spago.dhall @@ -5,7 +5,7 @@ You can edit this file as you like. { name = "ctl-package-example" , dependencies = [ "aff" - , "bigints" + , "js-bigints" , "cardano-transaction-lib" , "datetime" , "effect" @@ -15,7 +15,6 @@ You can edit this file as you like. , "posix-types" , "prelude" , "spec" - , "uint" ] , packages = ./packages.dhall , sources = [ "src/**/*.purs", "exe/**/*.purs", "test/**/*.purs" ] diff --git a/templates/ctl-scaffold/src/Scaffold.purs b/templates/ctl-scaffold/src/Scaffold.purs index f6241b471..f3153ea82 100644 --- a/templates/ctl-scaffold/src/Scaffold.purs +++ b/templates/ctl-scaffold/src/Scaffold.purs @@ -4,11 +4,11 @@ module Scaffold (contract) where import Contract.Prelude -import Contract.Address (ownPaymentPubKeyHash) import Contract.Log (logInfo') import Contract.Monad (Contract) +import Contract.Wallet (ownPaymentPubKeyHashes) contract :: Contract Unit contract = do - logInfo' "Welcome to CTL! Your wallet's payment PubKey hash is:" - logInfo' <<< show =<< ownPaymentPubKeyHash + logInfo' "Welcome to CTL! Your wallet's payment PubKey hashes are:" + logInfo' <<< show =<< ownPaymentPubKeyHashes diff --git a/templates/ctl-scaffold/test/Blockfrost.purs b/templates/ctl-scaffold/test/Blockfrost.purs index 678568e5f..eb43193cb 100644 --- a/templates/ctl-scaffold/test/Blockfrost.purs +++ b/templates/ctl-scaffold/test/Blockfrost.purs @@ -8,7 +8,7 @@ import Prelude import Contract.Config (testnetConfig) import Contract.Monad (launchAff_) import Contract.Test.Blockfrost (executeContractTestsWithBlockfrost) -import Data.Maybe (Maybe(Nothing, Just)) +import Data.Maybe (Maybe(Just)) import Data.Time.Duration (Milliseconds(Milliseconds)) import Effect (Effect) import Test.Scaffold.Main (suite) @@ -19,5 +19,4 @@ main = launchAff_ do executeContractTestsWithBlockfrost TestSpec.defaultConfig { timeout = Just $ Milliseconds 1000000.0 } testnetConfig { suppressLogs = true } - Nothing suite diff --git a/templates/ctl-scaffold/test/Main.purs b/templates/ctl-scaffold/test/Main.purs index cda7a7fbb..1ea12ce4e 100644 --- a/templates/ctl-scaffold/test/Main.purs +++ b/templates/ctl-scaffold/test/Main.purs @@ -4,27 +4,24 @@ module Test.Scaffold.Main (main, suite) where import Contract.Prelude -import Contract.Config (emptyHooks) import Contract.Test.Mote (TestPlanM, interpretWithConfig) import Contract.Test.Plutip ( InitialUTxOs - , PlutipConfig , PlutipTest + , defaultPlutipConfig , testPlutipContracts , withKeyWallet , withWallets ) import Contract.Test.Utils (exitCode, interruptOnSignal) -import Data.BigInt (fromInt) as BigInt import Data.Posix.Signal (Signal(SIGINT)) -import Data.Time.Duration (Seconds(Seconds)) -import Data.UInt (fromInt) as UInt import Effect.Aff ( Milliseconds(Milliseconds) , cancelWith , effectCanceler , launchAff ) +import JS.BigInt (fromInt) as BigInt import Mote (group, test) import Scaffold (contract) import Test.Spec.Runner (defaultConfig) @@ -35,7 +32,7 @@ main = interruptOnSignal SIGINT =<< launchAff do flip cancelWith (effectCanceler (exitCode 1)) do interpretWithConfig defaultConfig { timeout = Just $ Milliseconds 70_000.0, exit = true } $ - testPlutipContracts config suite + testPlutipContracts defaultPlutipConfig suite suite :: TestPlanM PlutipTest Unit suite = do @@ -50,27 +47,3 @@ suite = do withWallets distribution \wallet -> do withKeyWallet wallet do contract - -config :: PlutipConfig -config = - { host: "127.0.0.1" - , port: UInt.fromInt 8082 - , logLevel: Trace - , ogmiosConfig: - { port: UInt.fromInt 1338 - , host: "127.0.0.1" - , secure: false - , path: Nothing - } - , kupoConfig: - { port: UInt.fromInt 1443 - , host: "127.0.0.1" - , secure: false - , path: Nothing - } - , customLogger: Nothing - , suppressLogs: true - , hooks: emptyHooks - , clusterConfig: - { slotLength: Seconds 0.05 } - } diff --git a/templates/ctl-scaffold/test/blockfrost-local.env b/templates/ctl-scaffold/test/blockfrost-local.env new file mode 100644 index 000000000..c82b6302c --- /dev/null +++ b/templates/ctl-scaffold/test/blockfrost-local.env @@ -0,0 +1,24 @@ +# Blockfrost test suite configuration that uses self-hosted (local) Blockfrost +# deployment. +# +# This file specifies some environment variables that can be read by +# `executePlutipTestsWithBlockfrost` function to run contract tests using +# Blockfrost. +# +# See https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/blockfrost.md for info on how to set it up + +export BLOCKFROST_API_KEY= +export PRIVATE_PAYMENT_KEY_FILE= +export PRIVATE_STAKE_KEY_FILE= +export BACKUP_KEYS_DIR=./test-data/keys/ +export TX_CONFIRMATION_DELAY_SECONDS=30 + +export BLOCKFROST_PORT=3000 +export BLOCKFROST_HOST=127.0.0.1 +export BLOCKFROST_SECURE=false +export BLOCKFROST_PATH="" + +export OGMIOS_PORT=1337 +export OGMIOS_HOST=127.0.0.1 +export OGMIOS_SECURE=false +export OGMIOS_PATH="" diff --git a/templates/ctl-scaffold/test/blockfrost.env b/templates/ctl-scaffold/test/blockfrost.env index c1cce9423..fa8e94340 100644 --- a/templates/ctl-scaffold/test/blockfrost.env +++ b/templates/ctl-scaffold/test/blockfrost.env @@ -1,7 +1,7 @@ -# Blockfrost test suite configuration. +# Blockfrost test suite configuration that uses public Blockfrost SaaS instance. # # This file specifies some environment variables that can be read by -# `executePlutipTestsWithBlockfrost` function to run plutip tests using +# `executePlutipTestsWithBlockfrost` function to run contract tests using # Blockfrost. # # See https://github.com/Plutonomicon/cardano-transaction-lib/blob/develop/doc/blockfrost.md for info on how to set it up diff --git a/templates/ctl-scaffold/webpack.config.cjs b/templates/ctl-scaffold/webpack.config.cjs new file mode 100644 index 000000000..d5fcdf1c6 --- /dev/null +++ b/templates/ctl-scaffold/webpack.config.cjs @@ -0,0 +1,116 @@ +"use strict"; + +const path = require("path"); +const webpack = require("webpack"); +const NodePolyfillPlugin = require("node-polyfill-webpack-plugin"); + +const isBrowser = !!process.env.BROWSER_RUNTIME; + +module.exports = env => { + const config = { + mode: "development", + experiments: { + asyncWebAssembly: false, + layers: false, + lazyCompilation: false, + outputModule: true, + syncWebAssembly: true, + topLevelAwait: true, + }, + + devtool: "eval-source-map", + + stats: { errorDetails: true }, + + devServer: { + static: { + directory: path.join(__dirname, "dist"), + }, + client: { + overlay: false, + }, + port: 4008, + proxy: { + "/kupo": { + // `KUPO_HOST` env variable must be set to the base URL of the Kupo + // service, otherwise all requests to Kupo will fail. + target: process.env.KUPO_HOST || "http://localhost:1442", + changeOrigin: true, + pathRewrite: { "^/kupo": "" }, + }, + }, + }, + + entry: env.entry, + + output: { + path: path.resolve(__dirname, "dist"), + filename: "index.js", + library: { + type: "module", + }, + }, + + resolve: { + // We use node_modules provided by Nix shell via an environment variable + modules: [process.env.NODE_PATH], + extensions: [".js"], + }, + + plugins: [ + new webpack.DefinePlugin({ + BROWSER_RUNTIME: isBrowser, + }), + new webpack.LoaderOptionsPlugin({ + debug: true, + }), + // ContextReplacementPlugin is used just to suppress a webpack warning: + // "Critical dependency: the request of a dependency is an expression" + // See https://stackoverflow.com/a/59235546/17365145 + new webpack.ContextReplacementPlugin(/cardano-serialization-lib-browser/), + new webpack.ContextReplacementPlugin(/cardano-serialization-lib-nodejs/), + ], + }; + + config.target = isBrowser ? "web" : "node18"; + config.node = isBrowser ? {} : { __dirname: true }; + config.resolve.fallback = isBrowser + ? { + buffer: require.resolve("buffer/"), + http: false, + url: false, + stream: false, + crypto: false, + https: false, + net: false, + tls: false, + zlib: false, + os: false, + path: false, + fs: false, + readline: false, + child_process: false, + } + : {}; + + // Preserves console.log calls in NodeJS + // https://stackoverflow.com/a/71024096/17365145 + config.optimization = isBrowser + ? {} + : { + minimize: false, + }; + + if (isBrowser) { + // Provide top-level `Buffer` + config.plugins.push( + new webpack.ProvidePlugin({ + Buffer: ["buffer", "Buffer"], + }), + ); + // Provide NodeJS polyfills + config.plugins.push(new NodePolyfillPlugin()); + } + + return config; +}; diff --git a/templates/ctl-scaffold/webpack.config.js b/templates/ctl-scaffold/webpack.config.js deleted file mode 100644 index e2d2c6471..000000000 --- a/templates/ctl-scaffold/webpack.config.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; - -const path = require("path"); -const webpack = require("webpack"); -const HtmlWebpackPlugin = require("html-webpack-plugin"); -const NodePolyfillPlugin = require("node-polyfill-webpack-plugin"); - -module.exports = { - mode: "development", - - experiments: { - asyncWebAssembly: false, - layers: false, - lazyCompilation: false, - outputModule: true, - syncWebAssembly: true, - topLevelAwait: true, - }, - - devtool: "eval-source-map", - - stats: { errorDetails: true }, - - devServer: { - port: 4008, - proxy: { - "/kupo": { - // `KUPO_HOST` env variable must be set to the base URL of the Kupo - // service, otherwise all requests to Kupo will fail. - target: process.env.KUPO_HOST || "http://localhost:1442", - changeOrigin: true, - pathRewrite: { "^/kupo": "" }, - }, - }, - }, - - // we can add more entrypoints as needed - entry: "./index.js", - - output: { - path: path.resolve(__dirname, "dist"), - filename: "bundle.js", - }, - - module: { - rules: [ - { - test: /\.(png|jpg|gif)$/i, - type: "asset", - }, - { - test: /\.plutus$/i, - type: "asset/source", - }, - ], - }, - - resolve: { - modules: [process.env.NODE_PATH], - extensions: [".js"], - fallback: { - buffer: require.resolve("buffer/"), - http: false, - url: false, - stream: false, - crypto: false, - https: false, - net: false, - tls: false, - zlib: false, - os: false, - path: false, - fs: false, - readline: false, - child_process: false, - }, - alias: { - // You should update this path to the location of your compiled scripts, - // relative to `webpack.config.js` - Scripts: path.resolve(__dirname, "fixtures/scripts"), - }, - }, - - plugins: [ - new webpack.DefinePlugin({ - BROWSER_RUNTIME: !!process.env.BROWSER_RUNTIME, - }), - new NodePolyfillPlugin(), - new webpack.LoaderOptionsPlugin({ - debug: true, - }), - new HtmlWebpackPlugin({ - title: "ctl-scaffold", - template: "./index.html", - inject: false, // See stackoverflow.com/a/38292765/3067181 - }), - new webpack.ProvidePlugin({ - Buffer: ["buffer", "Buffer"], - }), - new webpack.ContextReplacementPlugin(/cardano-serialization-lib-browser/), - new webpack.ContextReplacementPlugin(/cardano-serialization-lib-nodejs/), - ], -}; diff --git a/test/ApplyArgs.js b/test/ApplyArgs.js deleted file mode 100644 index b3ec19246..000000000 --- a/test/ApplyArgs.js +++ /dev/null @@ -1,167 +0,0 @@ -/* global BROWSER_RUNTIME */ - -let scripts = {}; -if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - scripts["always-fails"] = require("Scripts/always-fails.plutus"); - scripts["include-datum"] = require("Scripts/include-datum.plutus"); - scripts["one-shot-minting"] = require("Scripts/one-shot-minting.plutus"); - scripts[ - "redeemer1-validator" - ] = require("Scripts/redeemer1-validator.plutus"); - scripts["always-succeeds-v2"] = require("Scripts/always-succeeds-v2.plutus"); - scripts[ - "one-shot-minting-v2" - ] = require("Scripts/one-shot-minting-v2.plutus"); - scripts[ - "check-datum-is-inline" - ] = require("Scripts/check-datum-is-inline.plutus"); - - scripts[ - "always-fails-big-arg" - ] = require("Scripts/applied/always-fails-big-arg.plutus"); - scripts[ - "always-fails-no-args" - ] = require("Scripts/applied/always-fails-no-args.plutus"); - scripts[ - "always-fails-unit" - ] = require("Scripts/applied/always-fails-unit.plutus"); - scripts[ - "always-succeeds-v2-big-arg" - ] = require("Scripts/applied/always-succeeds-v2-big-arg.plutus"); - scripts[ - "always-succeeds-v2-no-args" - ] = require("Scripts/applied/always-succeeds-v2-no-args.plutus"); - scripts[ - "always-succeeds-v2-unit" - ] = require("Scripts/applied/always-succeeds-v2-unit.plutus"); - scripts[ - "check-datum-is-inline-big-arg" - ] = require("Scripts/applied/check-datum-is-inline-big-arg.plutus"); - scripts[ - "check-datum-is-inline-no-args" - ] = require("Scripts/applied/check-datum-is-inline-no-args.plutus"); - scripts[ - "check-datum-is-inline-unit" - ] = require("Scripts/applied/check-datum-is-inline-unit.plutus"); - scripts[ - "include-datum-big-arg" - ] = require("Scripts/applied/include-datum-big-arg.plutus"); - scripts[ - "include-datum-no-args" - ] = require("Scripts/applied/include-datum-no-args.plutus"); - scripts[ - "include-datum-unit" - ] = require("Scripts/applied/include-datum-unit.plutus"); - scripts[ - "one-shot-minting-big-arg" - ] = require("Scripts/applied/one-shot-minting-big-arg.plutus"); - scripts[ - "one-shot-minting-no-args" - ] = require("Scripts/applied/one-shot-minting-no-args.plutus"); - scripts[ - "one-shot-minting-unit" - ] = require("Scripts/applied/one-shot-minting-unit.plutus"); - scripts[ - "one-shot-minting-v2-big-arg" - ] = require("Scripts/applied/one-shot-minting-v2-big-arg.plutus"); - scripts[ - "one-shot-minting-v2-no-args" - ] = require("Scripts/applied/one-shot-minting-v2-no-args.plutus"); - scripts[ - "one-shot-minting-v2-unit" - ] = require("Scripts/applied/one-shot-minting-v2-unit.plutus"); - scripts[ - "redeemer1-validator-big-arg" - ] = require("Scripts/applied/redeemer1-validator-big-arg.plutus"); - scripts[ - "redeemer1-validator-no-args" - ] = require("Scripts/applied/redeemer1-validator-no-args.plutus"); - scripts[ - "redeemer1-validator-unit" - ] = require("Scripts/applied/redeemer1-validator-unit.plutus"); -} else { - const fs = require("fs"); - const path = require("path"); - const read_script = fp => { - return fs.readFileSync( - path.resolve(__dirname, "../../fixtures/scripts/".concat(fp)), - "utf8" - ); - }; - - scripts["always-fails"] = read_script("always-fails.plutus"); - scripts["include-datum"] = read_script("include-datum.plutus"); - scripts["one-shot-minting"] = read_script("one-shot-minting.plutus"); - scripts["redeemer1-validator"] = read_script("redeemer1-validator.plutus"); - scripts["always-succeeds-v2"] = read_script("always-succeeds-v2.plutus"); - scripts["one-shot-minting-v2"] = read_script("one-shot-minting-v2.plutus"); - scripts["check-datum-is-inline"] = read_script( - "check-datum-is-inline.plutus" - ); - - scripts["always-fails-big-arg"] = read_script( - "applied/always-fails-big-arg.plutus" - ); - scripts["always-fails-no-args"] = read_script( - "applied/always-fails-no-args.plutus" - ); - scripts["always-fails-unit"] = read_script( - "applied/always-fails-unit.plutus" - ); - scripts["always-succeeds-v2-big-arg"] = read_script( - "applied/always-succeeds-v2-big-arg.plutus" - ); - scripts["always-succeeds-v2-no-args"] = read_script( - "applied/always-succeeds-v2-no-args.plutus" - ); - scripts["always-succeeds-v2-unit"] = read_script( - "applied/always-succeeds-v2-unit.plutus" - ); - scripts["check-datum-is-inline-big-arg"] = read_script( - "applied/check-datum-is-inline-big-arg.plutus" - ); - scripts["check-datum-is-inline-no-args"] = read_script( - "applied/check-datum-is-inline-no-args.plutus" - ); - scripts["check-datum-is-inline-unit"] = read_script( - "applied/check-datum-is-inline-unit.plutus" - ); - scripts["include-datum-big-arg"] = read_script( - "applied/include-datum-big-arg.plutus" - ); - scripts["include-datum-no-args"] = read_script( - "applied/include-datum-no-args.plutus" - ); - scripts["include-datum-unit"] = read_script( - "applied/include-datum-unit.plutus" - ); - scripts["one-shot-minting-big-arg"] = read_script( - "applied/one-shot-minting-big-arg.plutus" - ); - scripts["one-shot-minting-no-args"] = read_script( - "applied/one-shot-minting-no-args.plutus" - ); - scripts["one-shot-minting-unit"] = read_script( - "applied/one-shot-minting-unit.plutus" - ); - scripts["one-shot-minting-v2-big-arg"] = read_script( - "applied/one-shot-minting-v2-big-arg.plutus" - ); - scripts["one-shot-minting-v2-no-args"] = read_script( - "applied/one-shot-minting-v2-no-args.plutus" - ); - scripts["one-shot-minting-v2-unit"] = read_script( - "applied/one-shot-minting-v2-unit.plutus" - ); - scripts["redeemer1-validator-big-arg"] = read_script( - "applied/redeemer1-validator-big-arg.plutus" - ); - scripts["redeemer1-validator-no-args"] = read_script( - "applied/redeemer1-validator-no-args.plutus" - ); - scripts["redeemer1-validator-unit"] = read_script( - "applied/redeemer1-validator-unit.plutus" - ); -} - -exports.scripts = scripts; diff --git a/test/ApplyArgs.purs b/test/ApplyArgs.purs index f0774d26e..da5048010 100644 --- a/test/ApplyArgs.purs +++ b/test/ApplyArgs.purs @@ -16,32 +16,273 @@ import Control.Monad.Error.Class (class MonadError) import Ctl.Internal.ApplyArgs (applyArgs) import Ctl.Internal.Cardano.TextEnvelope (TextEnvelope) import Ctl.Internal.Test.TestPlanM (TestPlanM, interpret) -import Data.BigInt (fromInt) import Data.List.Lazy (replicate) import Data.Profunctor.Choice (left) import Effect.Aff (Error, error, throwError) import Foreign.Object (Object) import Foreign.Object as Object +import JS.BigInt (fromInt) import Mote (group, test) import Test.Spec.Assertions (shouldEqual) -foreign import scripts :: Object String +scriptSources :: Object String +scriptSources = + Object.fromFoldable + [ "always-fails" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "581e581c01000033223232222350040071235002353003001498498480048005" +} + """ + , "always-fails-big-arg" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "58ff58fd0100003333333332232322223500400712350023530030014984984800480053010107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "always-fails-no-args" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "581e581c01000033223232222350040071235002353003001498498480048005" +} +""" + , "always-fails-unit" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "5826582401000033322323222235004007123500235300300149849848004800530103d879800001" +} +""" + + , "include-datum" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "include-datum", + "cborHex": "55540100002225333573466e1cdd6801a40a82930b01" +} +""" + , "include-datum-big-arg" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "58f658f401000033333332225333573466e1cdd6801a40a82930b2610107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "include-datum-no-args" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "55540100002225333573466e1cdd6801a40a82930b01" +} +""" + , "include-datum-unit" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "581d581b01000032225333573466e1cdd6801a40a82930b26103d879800001" +} +""" + + , "one-shot-minting" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "one-shot-minting", + "cborHex": "5908d75908d401000033232332233223232323232323232323232323232323232323222223232323232325335533533355300b120013232123300122333500522002002001002350012200112330012253350021022100101f2325335333573466e3cd400488008d4014880080840804ccd5cd19b873500122001350052200102102010203500122002355001222222222200a101e101f1326353357389201115574786f206e6f7420636f6e73756d65640001b0191533553355335323301d50220013550012222222222007101e22135002222533500415335333573466e3c00cd401c88cccd40048c98d4cd5ce2481024c680002302120012326353357389201024c68000230212326353357389201024c680002302102402315335333573466e3c00802409008c4ccd5cd19b870014800809008c408c408c8840944078407c4c98d4cd5ce24811357726f6e6720616d6f756e74206d696e7465640001b019101b135001220023333573466e1cd55cea8022400046644246600200600464646464646464646464646666ae68cdc39aab9d500a480008cccccccccc888888888848cccccccccc00402c02802402001c01801401000c008cd40648c8c8cccd5cd19b8735573aa0049000119910919800801801180d9aba15002301e357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854028cd4064068d5d0a804999aa80e3ae501b35742a010666aa038eb9406cd5d0a80399a80c8101aba15006335019335502302175a6ae854014c8c8c8cccd5cd19b8735573aa00490001199109198008018011919191999ab9a3370e6aae754009200023322123300100300233502675a6ae854008c09cd5d09aba2500223263533573805a05c05805626aae7940044dd50009aba150023232323333573466e1cd55cea8012400046644246600200600466a04ceb4d5d0a80118139aba135744a004464c6a66ae700b40b80b00ac4d55cf280089baa001357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854010cd4065d71aba15003335019335502375c40026ae854008c060d5d09aba2500223263533573804a04c04804626ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150043232323333573466e1d400520062321222230040053018357426aae79400c8cccd5cd19b875002480108c848888c008014c068d5d09aab9e500423333573466e1d400d20022321222230010053011357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6a66ae7008008407c07807407006c4d55cea80089baa001357426ae8940108c98d4cd5ce00c80d00c00b98048031bae006135573ca00226ea8004c8004d5406088448894cd40044d400c88004884ccd401488008c010008ccd54c01c480040140100048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931a99ab9c012013011010135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98d4cd5ce00800880780709baa0011232230023758002640026aa02c446666aae7c0049405c8cd4058c010d5d080118019aba200201023232323333573466e1cd55cea801a40004666444246660020080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c044d5d0a80119a8060081aba135744a004464c6a66ae7005005404c0484d55cf280089baa00135742a006666aa00eeb94018d5d0a80119a8043ae357426ae8940088c98d4cd5ce00800880780709aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02844646666aae7c008940588cd4054cd5405cc018d55cea80118029aab9e500230043574400601e26ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263533573801c01e01a01801626aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6a66ae7003803c03403002c0284d55cea80089baa0012323333573466e1d40052002200e23333573466e1d40092000200e23263533573801401601201000e26aae74dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6a66ae7004804c04404003c03803403002c0284d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263533573801601801401201026aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931a99ab9c008009007006005135573aa00226ea800444888c8c8cccd5cd19b8735573aa0049000119aa80818031aba150023005357426ae8940088c98d4cd5ce00400480380309aab9e5001137540029324903505431001200132001355007222533500110022213500222330073330080020060010033200135500622225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b1233300100800300200600312200212200111220021221223300100400311221233001003002112323001001223300330020020014c1074643544c4e46540001" +} +""" + , "one-shot-minting-big-arg" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "5909b75909b4010000333333333232332233223232323232323232323232323232323232323222223232323232325335533533355300b120013232123300122333500522002002001002350012200112330012253350021022100101f2325335333573466e3cd400488008d4014880080840804ccd5cd19b873500122001350052200102102010203500122002355001222222222200a101e101f132635335738921115574786f206e6f7420636f6e73756d65640001b0191533553355335323301d50220013550012222222222007101e22135002222533500415335333573466e3c00cd401c88cccd40048c98d4cd5ce2481024c680002302120012326353357389201024c68000230212326353357389201024c680002302102402315335333573466e3c00802409008c4ccd5cd19b870014800809008c408c408c8840944078407c4c98d4cd5ce24811357726f6e6720616d6f756e74206d696e7465640001b019101b135001220023333573466e1cd55cea8022400046644246600200600464646464646464646464646666ae68cdc39aab9d500a480008cccccccccc888888888848cccccccccc00402c02802402001c01801401000c008cd40648c8c8cccd5cd19b8735573aa0049000119910919800801801180d9aba15002301e357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854028cd4064068d5d0a804999aa80e3ae501b35742a010666aa038eb9406cd5d0a80399a80c8101aba15006335019335502302175a6ae854014c8c8c8cccd5cd19b8735573aa00490001199109198008018011919191999ab9a3370e6aae754009200023322123300100300233502675a6ae854008c09cd5d09aba2500223263533573805a05c05805626aae7940044dd50009aba150023232323333573466e1cd55cea8012400046644246600200600466a04ceb4d5d0a80118139aba135744a004464c6a66ae700b40b80b00ac4d55cf280089baa001357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854010cd4065d71aba15003335019335502375c40026ae854008c060d5d09aba2500223263533573804a04c04804626ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150043232323333573466e1d400520062321222230040053018357426aae79400c8cccd5cd19b875002480108c848888c008014c068d5d09aab9e500423333573466e1d400d20022321222230010053011357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6a66ae7008008407c07807407006c4d55cea80089baa001357426ae8940108c98d4cd5ce00c80d00c00b98048031bae006135573ca00226ea8004c8004d5406088448894cd40044d400c88004884ccd401488008c010008ccd54c01c480040140100048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931a99ab9c012013011010135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98d4cd5ce00800880780709baa0011232230023758002640026aa02c446666aae7c0049405c8cd4058c010d5d080118019aba200201023232323333573466e1cd55cea801a40004666444246660020080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c044d5d0a80119a8060081aba135744a004464c6a66ae7005005404c0484d55cf280089baa00135742a006666aa00eeb94018d5d0a80119a8043ae357426ae8940088c98d4cd5ce00800880780709aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02844646666aae7c008940588cd4054cd5405cc018d55cea80118029aab9e500230043574400601e26ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263533573801c01e01a01801626aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6a66ae7003803c03403002c0284d55cea80089baa0012323333573466e1d40052002200e23333573466e1d40092000200e23263533573801401601201000e26aae74dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6a66ae7004804c04404003c03803403002c0284d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263533573801601801401201026aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931a99ab9c008009007006005135573aa00226ea800444888c8c8cccd5cd19b8735573aa0049000119aa80818031aba150023005357426ae8940088c98d4cd5ce00400480380309aab9e5001137540029324903505431001200132001355007222533500110022213500222330073330080020060010033200135500622225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b1233300100800300200600312200212200111220021221223300100400311221233001003002112323001001223300330020020014c1074643544c4e4654004c010107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "one-shot-minting-no-args" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "5908d75908d401000033232332233223232323232323232323232323232323232323222223232323232325335533533355300b120013232123300122333500522002002001002350012200112330012253350021022100101f2325335333573466e3cd400488008d4014880080840804ccd5cd19b873500122001350052200102102010203500122002355001222222222200a101e101f1326353357389201115574786f206e6f7420636f6e73756d65640001b0191533553355335323301d50220013550012222222222007101e22135002222533500415335333573466e3c00cd401c88cccd40048c98d4cd5ce2481024c680002302120012326353357389201024c68000230212326353357389201024c680002302102402315335333573466e3c00802409008c4ccd5cd19b870014800809008c408c408c8840944078407c4c98d4cd5ce24811357726f6e6720616d6f756e74206d696e7465640001b019101b135001220023333573466e1cd55cea8022400046644246600200600464646464646464646464646666ae68cdc39aab9d500a480008cccccccccc888888888848cccccccccc00402c02802402001c01801401000c008cd40648c8c8cccd5cd19b8735573aa0049000119910919800801801180d9aba15002301e357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854028cd4064068d5d0a804999aa80e3ae501b35742a010666aa038eb9406cd5d0a80399a80c8101aba15006335019335502302175a6ae854014c8c8c8cccd5cd19b8735573aa00490001199109198008018011919191999ab9a3370e6aae754009200023322123300100300233502675a6ae854008c09cd5d09aba2500223263533573805a05c05805626aae7940044dd50009aba150023232323333573466e1cd55cea8012400046644246600200600466a04ceb4d5d0a80118139aba135744a004464c6a66ae700b40b80b00ac4d55cf280089baa001357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854010cd4065d71aba15003335019335502375c40026ae854008c060d5d09aba2500223263533573804a04c04804626ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150043232323333573466e1d400520062321222230040053018357426aae79400c8cccd5cd19b875002480108c848888c008014c068d5d09aab9e500423333573466e1d400d20022321222230010053011357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6a66ae7008008407c07807407006c4d55cea80089baa001357426ae8940108c98d4cd5ce00c80d00c00b98048031bae006135573ca00226ea8004c8004d5406088448894cd40044d400c88004884ccd401488008c010008ccd54c01c480040140100048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931a99ab9c012013011010135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98d4cd5ce00800880780709baa0011232230023758002640026aa02c446666aae7c0049405c8cd4058c010d5d080118019aba200201023232323333573466e1cd55cea801a40004666444246660020080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c044d5d0a80119a8060081aba135744a004464c6a66ae7005005404c0484d55cf280089baa00135742a006666aa00eeb94018d5d0a80119a8043ae357426ae8940088c98d4cd5ce00800880780709aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02844646666aae7c008940588cd4054cd5405cc018d55cea80118029aab9e500230043574400601e26ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263533573801c01e01a01801626aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6a66ae7003803c03403002c0284d55cea80089baa0012323333573466e1d40052002200e23333573466e1d40092000200e23263533573801401601201000e26aae74dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6a66ae7004804c04404003c03803403002c0284d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263533573801601801401201026aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931a99ab9c008009007006005135573aa00226ea800444888c8c8cccd5cd19b8735573aa0049000119aa80818031aba150023005357426ae8940088c98d4cd5ce00400480380309aab9e5001137540029324903505431001200132001355007222533500110022213500222330073330080020060010033200135500622225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b1233300100800300200600312200212200111220021221223300100400311221233001003002112323001001223300330020020014c1074643544c4e46540001" +} +""" + , "one-shot-minting-unit" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "5908de5908db010000333232332233223232323232323232323232323232323232323222223232323232325335533533355300b120013232123300122333500522002002001002350012200112330012253350021022100101f2325335333573466e3cd400488008d4014880080840804ccd5cd19b873500122001350052200102102010203500122002355001222222222200a101e101f132635335738921115574786f206e6f7420636f6e73756d65640001b0191533553355335323301d50220013550012222222222007101e22135002222533500415335333573466e3c00cd401c88cccd40048c98d4cd5ce2481024c680002302120012326353357389201024c68000230212326353357389201024c680002302102402315335333573466e3c00802409008c4ccd5cd19b870014800809008c408c408c8840944078407c4c98d4cd5ce24811357726f6e6720616d6f756e74206d696e7465640001b019101b135001220023333573466e1cd55cea8022400046644246600200600464646464646464646464646666ae68cdc39aab9d500a480008cccccccccc888888888848cccccccccc00402c02802402001c01801401000c008cd40648c8c8cccd5cd19b8735573aa0049000119910919800801801180d9aba15002301e357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854028cd4064068d5d0a804999aa80e3ae501b35742a010666aa038eb9406cd5d0a80399a80c8101aba15006335019335502302175a6ae854014c8c8c8cccd5cd19b8735573aa00490001199109198008018011919191999ab9a3370e6aae754009200023322123300100300233502675a6ae854008c09cd5d09aba2500223263533573805a05c05805626aae7940044dd50009aba150023232323333573466e1cd55cea8012400046644246600200600466a04ceb4d5d0a80118139aba135744a004464c6a66ae700b40b80b00ac4d55cf280089baa001357426ae8940088c98d4cd5ce01481501401389aab9e5001137540026ae854010cd4065d71aba15003335019335502375c40026ae854008c060d5d09aba2500223263533573804a04c04804626ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150043232323333573466e1d400520062321222230040053018357426aae79400c8cccd5cd19b875002480108c848888c008014c068d5d09aab9e500423333573466e1d400d20022321222230010053011357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6a66ae7008008407c07807407006c4d55cea80089baa001357426ae8940108c98d4cd5ce00c80d00c00b98048031bae006135573ca00226ea8004c8004d5406088448894cd40044d400c88004884ccd401488008c010008ccd54c01c480040140100048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931a99ab9c012013011010135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98d4cd5ce00800880780709baa0011232230023758002640026aa02c446666aae7c0049405c8cd4058c010d5d080118019aba200201023232323333573466e1cd55cea801a40004666444246660020080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c044d5d0a80119a8060081aba135744a004464c6a66ae7005005404c0484d55cf280089baa00135742a006666aa00eeb94018d5d0a80119a8043ae357426ae8940088c98d4cd5ce00800880780709aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02844646666aae7c008940588cd4054cd5405cc018d55cea80118029aab9e500230043574400601e26ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263533573801c01e01a01801626aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6a66ae7003803c03403002c0284d55cea80089baa0012323333573466e1d40052002200e23333573466e1d40092000200e23263533573801401601201000e26aae74dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6a66ae7004804c04404003c03803403002c0284d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263533573801601801401201026aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931a99ab9c008009007006005135573aa00226ea800444888c8c8cccd5cd19b8735573aa0049000119aa80818031aba150023005357426ae8940088c98d4cd5ce00400480380309aab9e5001137540029324903505431001200132001355007222533500110022213500222330073330080020060010033200135500622225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b1233300100800300200600312200212200111220021221223300100400311221233001003002112323001001223300330020020014c1074643544c4e4654004c0103d879800001" +} +""" + + , "always-succeeds-v2" /\ + """ +{ + "cborHex": "4e4d01000033222220051200120011", + "description": "always-succeeds", + "type": "PlutusScriptV2" +} +""" + , "always-succeeds-v2-big-arg" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "58f058ee010000333333333222220051200120014c010107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "always-succeeds-v2-no-args" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "4e4d01000033222220051200120011" +} +""" + , "always-succeeds-v2-unit" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "5655010000333222220051200120014c0103d879800001" +} +""" + + , "check-datum-is-inline" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59088859088501000032332232323233223232323232323232323322323232323232322223232533532325335001101b13357389211d556e657870656374656420646174756d206174206f776e20696e7075740001a323253335002153335001101c2101c2101c2153335002101c21333573466ebc00800407807484074854ccd400840708407484ccd5cd19b8f00200101e01d323500122220023235001220013553353500222350022222222222223333500d2501e2501e2501e233355302d12001321233001225335002210031001002501e2350012253355335333573466e3cd400888008d4010880080b40b04ccd5cd19b873500222001350042200102d02c102c1350220031502100d21123001002162001300a0053333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4054058d5d0a80619a80a80b1aba1500b33501501735742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02a0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01901881689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03203102d135573ca00226ea8004d5d09aba2500223263202b33573805c05a05226aae7940044dd50009aba1500533501575c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c02a029025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00460206ae84d5d1280111931900c99ab9c01c01b017101a132632018335738921035054350001a135573ca00226ea800448c88c008dd6000990009aa80d111999aab9f0012501c233501b30043574200460066ae8800805c8c8c8cccd5cd19b8735573aa004900011991091980080180118069aba150023005357426ae8940088c98c8054cd5ce00c00b80989aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180b1aba1500233500e015357426ae8940088c98c8068cd5ce00e80e00c09aab9e5001137540026ae854010ccd54025d728041aba150033232323333573466e1d400520042300b357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403866ae7007c0780680640604d55cea80089baa00135742a00466a014eb8d5d09aba2500223263201633573803203002826ae8940044d5d1280089aab9e500113754002424446004008266aa002eb9d6889119118011bab00132001355016223233335573e0044a032466a03066442466002006004600c6aae754008c014d55cf280118021aba200301413574200224464646666ae68cdc3a800a400046a00e600a6ae84d55cf280191999ab9a3370ea00490011280391931900919ab9c01501401000f135573aa00226ea800448488c00800c44880048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01301200e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00f00e00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00680600409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00b00a80880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae7003c0380280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801801600e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7003403002001c0184d55cea80089baa0012323333573466e1d40052002200623333573466e1d40092000200623263200633573801201000800626aae74dd5000a4c24400424400224002920103505431003200135500322112225335001135003220012213335005220023004002333553007120010050040011122002122122330010040031123230010012233003300200200101" +} +""" + , "check-datum-is-inline-big-arg" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "590969590966010000333333332332232323233223232323232323232323322323232323232322223232533532325335001101b133573892011d556e657870656374656420646174756d206174206f776e20696e7075740001a323253335002153335001101c2101c2101c2153335002101c21333573466ebc00800407807484074854ccd400840708407484ccd5cd19b8f00200101e01d323500122220023235001220013553353500222350022222222222223333500d2501e2501e2501e233355302d12001321233001225335002210031001002501e2350012253355335333573466e3cd400888008d4010880080b40b04ccd5cd19b873500222001350042200102d02c102c1350220031502100d21123001002162001300a0053333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4054058d5d0a80619a80a80b1aba1500b33501501735742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02a0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01901881689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03203102d135573ca00226ea8004d5d09aba2500223263202b33573805c05a05226aae7940044dd50009aba1500533501575c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c02a029025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00460206ae84d5d1280111931900c99ab9c01c01b017101a132632018335738921035054350001a135573ca00226ea800448c88c008dd6000990009aa80d111999aab9f0012501c233501b30043574200460066ae8800805c8c8c8cccd5cd19b8735573aa004900011991091980080180118069aba150023005357426ae8940088c98c8054cd5ce00c00b80989aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180b1aba1500233500e015357426ae8940088c98c8068cd5ce00e80e00c09aab9e5001137540026ae854010ccd54025d728041aba150033232323333573466e1d400520042300b357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403866ae7007c0780680640604d55cea80089baa00135742a00466a014eb8d5d09aba2500223263201633573803203002826ae8940044d5d1280089aab9e500113754002424446004008266aa002eb9d6889119118011bab00132001355016223233335573e0044a032466a03066442466002006004600c6aae754008c014d55cf280118021aba200301413574200224464646666ae68cdc3a800a400046a00e600a6ae84d55cf280191999ab9a3370ea00490011280391931900919ab9c01501401000f135573aa00226ea800448488c00800c44880048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01301200e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00f00e00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00680600409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00b00a80880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae7003c0380280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801801600e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7003403002001c0184d55cea80089baa0012323333573466e1d40052002200623333573466e1d40092000200623263200633573801201000800626aae74dd5000a4c2440042440022400292010350543100320013550032211222533500113500322001221333500522002300400233355300712001005004001112200212212233001004003112323001001223300330020020014c010107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "check-datum-is-inline-no-args" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59088859088501000032332232323233223232323232323232323322323232323232322223232533532325335001101b13357389211d556e657870656374656420646174756d206174206f776e20696e7075740001a323253335002153335001101c2101c2101c2153335002101c21333573466ebc00800407807484074854ccd400840708407484ccd5cd19b8f00200101e01d323500122220023235001220013553353500222350022222222222223333500d2501e2501e2501e233355302d12001321233001225335002210031001002501e2350012253355335333573466e3cd400888008d4010880080b40b04ccd5cd19b873500222001350042200102d02c102c1350220031502100d21123001002162001300a0053333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4054058d5d0a80619a80a80b1aba1500b33501501735742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02a0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01901881689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03203102d135573ca00226ea8004d5d09aba2500223263202b33573805c05a05226aae7940044dd50009aba1500533501575c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c02a029025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00460206ae84d5d1280111931900c99ab9c01c01b017101a132632018335738921035054350001a135573ca00226ea800448c88c008dd6000990009aa80d111999aab9f0012501c233501b30043574200460066ae8800805c8c8c8cccd5cd19b8735573aa004900011991091980080180118069aba150023005357426ae8940088c98c8054cd5ce00c00b80989aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180b1aba1500233500e015357426ae8940088c98c8068cd5ce00e80e00c09aab9e5001137540026ae854010ccd54025d728041aba150033232323333573466e1d400520042300b357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403866ae7007c0780680640604d55cea80089baa00135742a00466a014eb8d5d09aba2500223263201633573803203002826ae8940044d5d1280089aab9e500113754002424446004008266aa002eb9d6889119118011bab00132001355016223233335573e0044a032466a03066442466002006004600c6aae754008c014d55cf280118021aba200301413574200224464646666ae68cdc3a800a400046a00e600a6ae84d55cf280191999ab9a3370ea00490011280391931900919ab9c01501401000f135573aa00226ea800448488c00800c44880048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01301200e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00f00e00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00680600409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00b00a80880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae7003c0380280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801801600e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7003403002001c0184d55cea80089baa0012323333573466e1d40052002200623333573466e1d40092000200623263200633573801201000800626aae74dd5000a4c24400424400224002920103505431003200135500322112225335001135003220012213335005220023004002333553007120010050040011122002122122330010040031123230010012233003300200200101" +} +""" + , "check-datum-is-inline-unit" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59089059088d010000332332232323233223232323232323232323322323232323232322223232533532325335001101b133573892011d556e657870656374656420646174756d206174206f776e20696e7075740001a323253335002153335001101c2101c2101c2153335002101c21333573466ebc00800407807484074854ccd400840708407484ccd5cd19b8f00200101e01d323500122220023235001220013553353500222350022222222222223333500d2501e2501e2501e233355302d12001321233001225335002210031001002501e2350012253355335333573466e3cd400888008d4010880080b40b04ccd5cd19b873500222001350042200102d02c102c1350220031502100d21123001002162001300a0053333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4054058d5d0a80619a80a80b1aba1500b33501501735742a014666aa034eb94064d5d0a804999aa80d3ae501935742a01066a02a0426ae85401cccd54068089d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b1d69aba15002302d357426ae8940088c98c80bccd5ce01901881689aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8163ad35742a004605a6ae84d5d1280111931901799ab9c03203102d135573ca00226ea8004d5d09aba2500223263202b33573805c05a05226aae7940044dd50009aba1500533501575c6ae854010ccd540680788004d5d0a801999aa80d3ae200135742a00460406ae84d5d1280111931901399ab9c02a029025135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00460206ae84d5d1280111931900c99ab9c01c01b017101a132632018335738921035054350001a135573ca00226ea800448c88c008dd6000990009aa80d111999aab9f0012501c233501b30043574200460066ae8800805c8c8c8cccd5cd19b8735573aa004900011991091980080180118069aba150023005357426ae8940088c98c8054cd5ce00c00b80989aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180b1aba1500233500e015357426ae8940088c98c8068cd5ce00e80e00c09aab9e5001137540026ae854010ccd54025d728041aba150033232323333573466e1d400520042300b357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403866ae7007c0780680640604d55cea80089baa00135742a00466a014eb8d5d09aba2500223263201633573803203002826ae8940044d5d1280089aab9e500113754002424446004008266aa002eb9d6889119118011bab00132001355016223233335573e0044a032466a03066442466002006004600c6aae754008c014d55cf280118021aba200301413574200224464646666ae68cdc3a800a400046a00e600a6ae84d55cf280191999ab9a3370ea00490011280391931900919ab9c01501401000f135573aa00226ea800448488c00800c44880048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01301200e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00f00e00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00680600409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00b00a80880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae7003c0380280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801801600e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7003403002001c0184d55cea80089baa0012323333573466e1d40052002200623333573466e1d40092000200623263200633573801201000800626aae74dd5000a4c2440042440022400292010350543100320013550032211222533500113500322001221333500522002300400233355300712001005004001112200212212233001004003112323001001223300330020020014c0103d879800001" +} +""" + + , "one-shot-minting-v2" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "one-shot-minting", + "cborHex": "59092c59092901000033233223322323232323232323232323232323232323232323222223232323232325335533533355300b12001323212330012233350052200200200100235001220011233001225335002102310010202325335333573466e3cd400488008d4014880080880844ccd5cd19b87350012200135005220010220211021350012200235500122222222222200c101f102013263201b335738921115574786f206e6f7420636f6e73756d65640001c1533553355335323301e5023001355001222222222222008101f22135002222533500415335333573466e3c00cd401c88cccd40048c98c808ccd5ce2481024c680002420012326320233357389201024c68000242326320233357389201024c680002402502415335333573466e3c0080240940904ccd5cd19b870014800809409040904090884098407c40804c98c806ccd5ce24811357726f6e6720616d6f756e74206d696e7465640001c101c135001220023333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4064068d5d0a80619a80c80d1aba1500b33501901b35742a014666aa03aeb94070d5d0a804999aa80ebae501c35742a01066a0320446ae85401cccd5407408dd69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b5d69aba15002302e357426ae8940088c98c80c0cd5ce01801881709aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a816bad35742a004605c6ae84d5d1280111931901819ab9c03003102e135573ca00226ea8004d5d09aba2500223263202c33573805805a05426aae7940044dd50009aba1500533501975c6ae854010ccd5407407c8004d5d0a801999aa80ebae200135742a00460426ae84d5d1280111931901419ab9c028029026135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860226ae84d5d1280211931900d19ab9c01a01b0183010006375c00c26aae7940044dd5000990009aa80c1108911299a80089a80191000910999a802910011802001199aa9803890008028020008919118011bac001320013550182233335573e0024a034466a03260086ae84008c00cd5d1001009919191999ab9a3370e6aae7540092000233221233001003002300a35742a004600a6ae84d5d1280111931900919ab9c012013010135573ca00226ea80048c8c8c8c8cccd5cd19b8735573aa00890001199991110919998008028020018011919191999ab9a3370e6aae7540092000233221233001003002301335742a00466a01a0246ae84d5d1280111931900b99ab9c017018015135573ca00226ea8004d5d0a802199aa8043ae500735742a0066464646666ae68cdc3a800a4008464244460040086ae84d55cf280191999ab9a3370ea0049001119091118008021bae357426aae7940108cccd5cd19b875003480008488800c8c98c8064cd5ce00c80d00b80b00a89aab9d5001137540026ae854008cd4025d71aba135744a004464c6402666ae7004c0500444d5d1280089aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02a44646666aae7c008940608cd405ccc8848cc00400c008c018d55cea80118029aab9e500230043574400602226ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263201033573802002201c01a26aae7540044dd5000919191999ab9a3370ea002900311909111180200298039aba135573ca00646666ae68cdc3a8012400846424444600400a60126ae84d55cf280211999ab9a3370ea006900111909111180080298039aba135573ca00a46666ae68cdc3a8022400046424444600600a6eb8d5d09aab9e500623263201033573802002201c01a01801626aae7540044dd5000919191999ab9a3370e6aae7540092000233221233001003002300535742a0046eb4d5d09aba2500223263200c33573801801a01426aae7940044dd50009191999ab9a3370e6aae75400520002375c6ae84d55cf280111931900519ab9c00a00b00813754002464646464646666ae68cdc3a800a401842444444400646666ae68cdc3a8012401442444444400846666ae68cdc3a801a40104664424444444660020120106eb8d5d0a8029bad357426ae8940148cccd5cd19b875004480188cc8848888888cc008024020dd71aba15007375c6ae84d5d1280391999ab9a3370ea00a900211991091111111980300480418061aba15009375c6ae84d5d1280491999ab9a3370ea00c900111909111111180380418069aba135573ca01646666ae68cdc3a803a400046424444444600a010601c6ae84d55cf280611931900999ab9c01301401101000f00e00d00c00b135573aa00826aae79400c4d55cf280109aab9e5001137540024646464646666ae68cdc3a800a4004466644424466600200a0080066eb4d5d0a8021bad35742a0066eb4d5d09aba2500323333573466e1d4009200023212230020033008357426aae7940188c98c8030cd5ce00600680500489aab9d5003135744a00226aae7940044dd5000919191999ab9a3370ea002900111909118008019bae357426aae79400c8cccd5cd19b875002480008c8488c00800cdd71aba135573ca008464c6401266ae7002402801c0184d55cea80089baa00112232323333573466e1d400520042122200123333573466e1d40092002232122230030043006357426aae7940108cccd5cd19b87500348000848880088c98c8028cd5ce00500580400380309aab9d5001137540024646666ae68cdc3a800a4004401446666ae68cdc3a801240004014464c6400c66ae7001801c01000c4d55ce9baa001499240103505431001200132001355006222533500110022213500222330073330080020060010033200135500522225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b12333001008003002006003122002122001112200212212233001004003112323001001223300330020020014c01074643544c4e46540001" +} +""" + , "one-shot-minting-v2-big-arg" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "590a0d590a0a010000333333333233223322323232323232323232323232323232323232323222223232323232325335533533355300b12001323212330012233350052200200200100235001220011233001225335002102310010202325335333573466e3cd400488008d4014880080880844ccd5cd19b87350012200135005220010220211021350012200235500122222222222200c101f102013263201b3357389201115574786f206e6f7420636f6e73756d65640001c1533553355335323301e5023001355001222222222222008101f22135002222533500415335333573466e3c00cd401c88cccd40048c98c808ccd5ce2481024c680002420012326320233357389201024c68000242326320233357389201024c680002402502415335333573466e3c0080240940904ccd5cd19b870014800809409040904090884098407c40804c98c806ccd5ce24811357726f6e6720616d6f756e74206d696e7465640001c101c135001220023333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4064068d5d0a80619a80c80d1aba1500b33501901b35742a014666aa03aeb94070d5d0a804999aa80ebae501c35742a01066a0320446ae85401cccd5407408dd69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b5d69aba15002302e357426ae8940088c98c80c0cd5ce01801881709aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a816bad35742a004605c6ae84d5d1280111931901819ab9c03003102e135573ca00226ea8004d5d09aba2500223263202c33573805805a05426aae7940044dd50009aba1500533501975c6ae854010ccd5407407c8004d5d0a801999aa80ebae200135742a00460426ae84d5d1280111931901419ab9c028029026135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860226ae84d5d1280211931900d19ab9c01a01b0183010006375c00c26aae7940044dd5000990009aa80c1108911299a80089a80191000910999a802910011802001199aa9803890008028020008919118011bac001320013550182233335573e0024a034466a03260086ae84008c00cd5d1001009919191999ab9a3370e6aae7540092000233221233001003002300a35742a004600a6ae84d5d1280111931900919ab9c012013010135573ca00226ea80048c8c8c8c8cccd5cd19b8735573aa00890001199991110919998008028020018011919191999ab9a3370e6aae7540092000233221233001003002301335742a00466a01a0246ae84d5d1280111931900b99ab9c017018015135573ca00226ea8004d5d0a802199aa8043ae500735742a0066464646666ae68cdc3a800a4008464244460040086ae84d55cf280191999ab9a3370ea0049001119091118008021bae357426aae7940108cccd5cd19b875003480008488800c8c98c8064cd5ce00c80d00b80b00a89aab9d5001137540026ae854008cd4025d71aba135744a004464c6402666ae7004c0500444d5d1280089aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02a44646666aae7c008940608cd405ccc8848cc00400c008c018d55cea80118029aab9e500230043574400602226ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263201033573802002201c01a26aae7540044dd5000919191999ab9a3370ea002900311909111180200298039aba135573ca00646666ae68cdc3a8012400846424444600400a60126ae84d55cf280211999ab9a3370ea006900111909111180080298039aba135573ca00a46666ae68cdc3a8022400046424444600600a6eb8d5d09aab9e500623263201033573802002201c01a01801626aae7540044dd5000919191999ab9a3370e6aae7540092000233221233001003002300535742a0046eb4d5d09aba2500223263200c33573801801a01426aae7940044dd50009191999ab9a3370e6aae75400520002375c6ae84d55cf280111931900519ab9c00a00b00813754002464646464646666ae68cdc3a800a401842444444400646666ae68cdc3a8012401442444444400846666ae68cdc3a801a40104664424444444660020120106eb8d5d0a8029bad357426ae8940148cccd5cd19b875004480188cc8848888888cc008024020dd71aba15007375c6ae84d5d1280391999ab9a3370ea00a900211991091111111980300480418061aba15009375c6ae84d5d1280491999ab9a3370ea00c900111909111111180380418069aba135573ca01646666ae68cdc3a803a400046424444444600a010601c6ae84d55cf280611931900999ab9c01301401101000f00e00d00c00b135573aa00826aae79400c4d55cf280109aab9e5001137540024646464646666ae68cdc3a800a4004466644424466600200a0080066eb4d5d0a8021bad35742a0066eb4d5d09aba2500323333573466e1d4009200023212230020033008357426aae7940188c98c8030cd5ce00600680500489aab9d5003135744a00226aae7940044dd5000919191999ab9a3370ea002900111909118008019bae357426aae79400c8cccd5cd19b875002480008c8488c00800cdd71aba135573ca008464c6401266ae7002402801c0184d55cea80089baa00112232323333573466e1d400520042122200123333573466e1d40092002232122230030043006357426aae7940108cccd5cd19b87500348000848880088c98c8028cd5ce00500580400380309aab9d5001137540024646666ae68cdc3a800a4004401446666ae68cdc3a801240004014464c6400c66ae7001801c01000c4d55ce9baa001499240103505431001200132001355006222533500110022213500222330073330080020060010033200135500522225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b12333001008003002006003122002122001112200212212233001004003112323001001223300330020020014c01074643544c4e4654004c010107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "one-shot-minting-v2-no-args" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "59092c59092901000033233223322323232323232323232323232323232323232323222223232323232325335533533355300b12001323212330012233350052200200200100235001220011233001225335002102310010202325335333573466e3cd400488008d4014880080880844ccd5cd19b87350012200135005220010220211021350012200235500122222222222200c101f102013263201b335738921115574786f206e6f7420636f6e73756d65640001c1533553355335323301e5023001355001222222222222008101f22135002222533500415335333573466e3c00cd401c88cccd40048c98c808ccd5ce2481024c680002420012326320233357389201024c68000242326320233357389201024c680002402502415335333573466e3c0080240940904ccd5cd19b870014800809409040904090884098407c40804c98c806ccd5ce24811357726f6e6720616d6f756e74206d696e7465640001c101c135001220023333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4064068d5d0a80619a80c80d1aba1500b33501901b35742a014666aa03aeb94070d5d0a804999aa80ebae501c35742a01066a0320446ae85401cccd5407408dd69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b5d69aba15002302e357426ae8940088c98c80c0cd5ce01801881709aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a816bad35742a004605c6ae84d5d1280111931901819ab9c03003102e135573ca00226ea8004d5d09aba2500223263202c33573805805a05426aae7940044dd50009aba1500533501975c6ae854010ccd5407407c8004d5d0a801999aa80ebae200135742a00460426ae84d5d1280111931901419ab9c028029026135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860226ae84d5d1280211931900d19ab9c01a01b0183010006375c00c26aae7940044dd5000990009aa80c1108911299a80089a80191000910999a802910011802001199aa9803890008028020008919118011bac001320013550182233335573e0024a034466a03260086ae84008c00cd5d1001009919191999ab9a3370e6aae7540092000233221233001003002300a35742a004600a6ae84d5d1280111931900919ab9c012013010135573ca00226ea80048c8c8c8c8cccd5cd19b8735573aa00890001199991110919998008028020018011919191999ab9a3370e6aae7540092000233221233001003002301335742a00466a01a0246ae84d5d1280111931900b99ab9c017018015135573ca00226ea8004d5d0a802199aa8043ae500735742a0066464646666ae68cdc3a800a4008464244460040086ae84d55cf280191999ab9a3370ea0049001119091118008021bae357426aae7940108cccd5cd19b875003480008488800c8c98c8064cd5ce00c80d00b80b00a89aab9d5001137540026ae854008cd4025d71aba135744a004464c6402666ae7004c0500444d5d1280089aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02a44646666aae7c008940608cd405ccc8848cc00400c008c018d55cea80118029aab9e500230043574400602226ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263201033573802002201c01a26aae7540044dd5000919191999ab9a3370ea002900311909111180200298039aba135573ca00646666ae68cdc3a8012400846424444600400a60126ae84d55cf280211999ab9a3370ea006900111909111180080298039aba135573ca00a46666ae68cdc3a8022400046424444600600a6eb8d5d09aab9e500623263201033573802002201c01a01801626aae7540044dd5000919191999ab9a3370e6aae7540092000233221233001003002300535742a0046eb4d5d09aba2500223263200c33573801801a01426aae7940044dd50009191999ab9a3370e6aae75400520002375c6ae84d55cf280111931900519ab9c00a00b00813754002464646464646666ae68cdc3a800a401842444444400646666ae68cdc3a8012401442444444400846666ae68cdc3a801a40104664424444444660020120106eb8d5d0a8029bad357426ae8940148cccd5cd19b875004480188cc8848888888cc008024020dd71aba15007375c6ae84d5d1280391999ab9a3370ea00a900211991091111111980300480418061aba15009375c6ae84d5d1280491999ab9a3370ea00c900111909111111180380418069aba135573ca01646666ae68cdc3a803a400046424444444600a010601c6ae84d55cf280611931900999ab9c01301401101000f00e00d00c00b135573aa00826aae79400c4d55cf280109aab9e5001137540024646464646666ae68cdc3a800a4004466644424466600200a0080066eb4d5d0a8021bad35742a0066eb4d5d09aba2500323333573466e1d4009200023212230020033008357426aae7940188c98c8030cd5ce00600680500489aab9d5003135744a00226aae7940044dd5000919191999ab9a3370ea002900111909118008019bae357426aae79400c8cccd5cd19b875002480008c8488c00800cdd71aba135573ca008464c6401266ae7002402801c0184d55cea80089baa00112232323333573466e1d400520042122200123333573466e1d40092002232122230030043006357426aae7940108cccd5cd19b87500348000848880088c98c8028cd5ce00500580400380309aab9d5001137540024646666ae68cdc3a800a4004401446666ae68cdc3a801240004014464c6400c66ae7001801c01000c4d55ce9baa001499240103505431001200132001355006222533500110022213500222330073330080020060010033200135500522225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b12333001008003002006003122002122001112200212212233001004003112323001001223300330020020014c01074643544c4e46540001" +} +""" + , "one-shot-minting-v2-unit" /\ + """ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "590934590931010000333233223322323232323232323232323232323232323232323222223232323232325335533533355300b12001323212330012233350052200200200100235001220011233001225335002102310010202325335333573466e3cd400488008d4014880080880844ccd5cd19b87350012200135005220010220211021350012200235500122222222222200c101f102013263201b3357389201115574786f206e6f7420636f6e73756d65640001c1533553355335323301e5023001355001222222222222008101f22135002222533500415335333573466e3c00cd401c88cccd40048c98c808ccd5ce2481024c680002420012326320233357389201024c68000242326320233357389201024c680002402502415335333573466e3c0080240940904ccd5cd19b870014800809409040904090884098407c40804c98c806ccd5ce24811357726f6e6720616d6f756e74206d696e7465640001c101c135001220023333573466e1cd55cea80224000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4064068d5d0a80619a80c80d1aba1500b33501901b35742a014666aa03aeb94070d5d0a804999aa80ebae501c35742a01066a0320446ae85401cccd5407408dd69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40b5d69aba15002302e357426ae8940088c98c80c0cd5ce01801881709aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a816bad35742a004605c6ae84d5d1280111931901819ab9c03003102e135573ca00226ea8004d5d09aba2500223263202c33573805805a05426aae7940044dd50009aba1500533501975c6ae854010ccd5407407c8004d5d0a801999aa80ebae200135742a00460426ae84d5d1280111931901419ab9c028029026135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00860226ae84d5d1280211931900d19ab9c01a01b0183010006375c00c26aae7940044dd5000990009aa80c1108911299a80089a80191000910999a802910011802001199aa9803890008028020008919118011bac001320013550182233335573e0024a034466a03260086ae84008c00cd5d1001009919191999ab9a3370e6aae7540092000233221233001003002300a35742a004600a6ae84d5d1280111931900919ab9c012013010135573ca00226ea80048c8c8c8c8cccd5cd19b8735573aa00890001199991110919998008028020018011919191999ab9a3370e6aae7540092000233221233001003002301335742a00466a01a0246ae84d5d1280111931900b99ab9c017018015135573ca00226ea8004d5d0a802199aa8043ae500735742a0066464646666ae68cdc3a800a4008464244460040086ae84d55cf280191999ab9a3370ea0049001119091118008021bae357426aae7940108cccd5cd19b875003480008488800c8c98c8064cd5ce00c80d00b80b00a89aab9d5001137540026ae854008cd4025d71aba135744a004464c6402666ae7004c0500444d5d1280089aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa02a44646666aae7c008940608cd405ccc8848cc00400c008c018d55cea80118029aab9e500230043574400602226ae84004488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263201033573802002201c01a26aae7540044dd5000919191999ab9a3370ea002900311909111180200298039aba135573ca00646666ae68cdc3a8012400846424444600400a60126ae84d55cf280211999ab9a3370ea006900111909111180080298039aba135573ca00a46666ae68cdc3a8022400046424444600600a6eb8d5d09aab9e500623263201033573802002201c01a01801626aae7540044dd5000919191999ab9a3370e6aae7540092000233221233001003002300535742a0046eb4d5d09aba2500223263200c33573801801a01426aae7940044dd50009191999ab9a3370e6aae75400520002375c6ae84d55cf280111931900519ab9c00a00b00813754002464646464646666ae68cdc3a800a401842444444400646666ae68cdc3a8012401442444444400846666ae68cdc3a801a40104664424444444660020120106eb8d5d0a8029bad357426ae8940148cccd5cd19b875004480188cc8848888888cc008024020dd71aba15007375c6ae84d5d1280391999ab9a3370ea00a900211991091111111980300480418061aba15009375c6ae84d5d1280491999ab9a3370ea00c900111909111111180380418069aba135573ca01646666ae68cdc3a803a400046424444444600a010601c6ae84d55cf280611931900999ab9c01301401101000f00e00d00c00b135573aa00826aae79400c4d55cf280109aab9e5001137540024646464646666ae68cdc3a800a4004466644424466600200a0080066eb4d5d0a8021bad35742a0066eb4d5d09aba2500323333573466e1d4009200023212230020033008357426aae7940188c98c8030cd5ce00600680500489aab9d5003135744a00226aae7940044dd5000919191999ab9a3370ea002900111909118008019bae357426aae79400c8cccd5cd19b875002480008c8488c00800cdd71aba135573ca008464c6401266ae7002402801c0184d55cea80089baa00112232323333573466e1d400520042122200123333573466e1d40092002232122230030043006357426aae7940108cccd5cd19b87500348000848880088c98c8028cd5ce00500580400380309aab9d5001137540024646666ae68cdc3a800a4004401446666ae68cdc3a801240004014464c6400c66ae7001801c01000c4d55ce9baa001499240103505431001200132001355006222533500110022213500222330073330080020060010033200135500522225335001100222135002225335333573466e1c005200000a0091333008007006003133300800733500b12333001008003002006003122002122001112200212212233001004003112323001001223300330020020014c01074643544c4e4654004c0103d879800001" +} +""" + + , "redeemer1-validator" /\ + """ +{ + "description": "validator that checks whether redeemer is 1", + "cborHex": "4e4d0100002223375e0046ea120021", + "type": "PlutusScriptV1" +} +""" + , "redeemer1-validator-big-arg" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "58f058ee01000033333332223375e0046ea120024c010107004c0103d87980004c01089fd87980424d5fff004c01465f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dff004c0107a20507424d5f08004c0154d9055f9f079fd87980424d5f5f58404d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d414dffffff004c0114d87e9f809f01ffa0a201d8798002d87b9f02ffff0001" +} +""" + , "redeemer1-validator-no-args" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "4e4d0100002223375e0046ea120021" +} +""" + , "redeemer1-validator-unit" /\ + """ +{ + "type": "PlutusScriptV1", + "description": "", + "cborHex": "565501000032223375e0046ea120024c0103d879800001" +} +""" + ] main :: Effect Unit main = launchAff_ $ interpret $ suite contract :: Contract Unit contract = do - traverse_ (uncurry $ compareApplied v1) $ Tuple <$> v1ScriptPaths <*> params - traverse_ (uncurry $ compareApplied v2) $ Tuple <$> v2ScriptPaths <*> params + traverse_ (uncurry $ compareApplied (v1 scriptSources)) $ Tuple + <$> v1ScriptPaths + <*> params + traverse_ (uncurry $ compareApplied (v2 scriptSources)) $ Tuple + <$> v2ScriptPaths + <*> params suite :: TestPlanM (Aff Unit) Unit suite = group "Applying params to scripts test" $ do - traverse_ (uncurry $ testCase v1) $ Tuple <$> v1ScriptPaths <*> params - traverse_ (uncurry $ testCase v2) $ Tuple <$> v2ScriptPaths <*> params - + traverse_ (uncurry $ testCase $ v1 scriptSources) + $ Tuple + <$> v1ScriptPaths + <*> params + traverse_ (uncurry $ testCase $ v2 scriptSources) + $ Tuple + <$> v2ScriptPaths + <*> params where - testCase lang scriptName (args /\ argsName) = test ("Apply " <> argsName <> " to " <> scriptName) @@ -109,19 +350,30 @@ longBytes :: PlutusData longBytes = Bytes $ hexToByteArrayUnsafe $ foldl (\x y -> x <> y) "" $ replicate 65 "4d" -v1 :: forall (m :: Type -> Type). MonadError Error m => String -> m PlutusScript -v1 = lookupAux plutusScriptV1FromEnvelope +v1 + :: forall (m :: Type -> Type) + . MonadError Error m + => Object String + -> String + -> m PlutusScript +v1 scripts name = lookupAux plutusScriptV1FromEnvelope scripts name -v2 :: forall (m :: Type -> Type). MonadError Error m => String -> m PlutusScript -v2 = lookupAux plutusScriptV2FromEnvelope +v2 + :: forall (m :: Type -> Type) + . MonadError Error m + => Object String + -> String + -> m PlutusScript +v2 scripts name = lookupAux plutusScriptV2FromEnvelope scripts name lookupAux :: forall (m :: Type -> Type) . MonadError Error m => (TextEnvelope -> Maybe PlutusScript) + -> Object String -> String -> m PlutusScript -lookupAux decodeScript name = +lookupAux decodeScript scripts name = maybe (throwError $ error $ "Can't find the script with name " <> name) pure $ do txt <- Object.lookup name scripts diff --git a/test/BalanceTx/ChangeGeneration.purs b/test/BalanceTx/ChangeGeneration.purs new file mode 100644 index 000000000..b0ae5eff2 --- /dev/null +++ b/test/BalanceTx/ChangeGeneration.purs @@ -0,0 +1,45 @@ +module Test.Ctl.BalanceTx.ChangeGeneration (suite) where + +import Prelude + +import Contract.Test (ContractTest, InitialUTxOs, withKeyWallet, withWallets) +import Ctl.Examples.ChangeGeneration (checkChangeOutputsDistribution) +import Ctl.Internal.Test.TestPlanM (TestPlanM) +import JS.BigInt (fromInt) as BigInt +import Mote (group, test) + +suite :: TestPlanM ContractTest Unit +suite = do + group "BalanceTx.ChangeGeneration" do + group + "The number of change outputs must equal the number of normal outputs going to our own address" + do + test "no outputs to own address" do + mkChangeOutputs 10 0 11 + test "1 output to own address" do + mkChangeOutputs 10 1 12 + test "2 outputs to own address" do + mkChangeOutputs 10 2 14 + test "2 outputs to own address" do + mkChangeOutputs 10 3 16 + test "0 outputs to script address, 10 outputs to own address" do + mkChangeOutputs 0 10 20 + test "1 / 1" do + mkChangeOutputs 1 1 3 + test "3 / 1" do + mkChangeOutputs 3 1 5 + test "1 / 3" do + mkChangeOutputs 1 3 7 + +mkChangeOutputs :: Int -> Int -> Int -> ContractTest +mkChangeOutputs outputsToScript outputsToSelf expectedOutputs = do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1000_000_000 + , BigInt.fromInt 2000_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + checkChangeOutputsDistribution outputsToScript outputsToSelf + expectedOutputs diff --git a/test/BalanceTx/Collateral.purs b/test/BalanceTx/Collateral.purs index 152a75946..4bad2e75a 100644 --- a/test/BalanceTx/Collateral.purs +++ b/test/BalanceTx/Collateral.purs @@ -24,7 +24,6 @@ import Ctl.Internal.Test.TestPlanM (TestPlanM) import Ctl.Internal.Types.ProtocolParameters (CoinsPerUtxoUnit) import Ctl.Internal.Types.Transaction (TransactionHash, TransactionInput) import Data.Array (length, range, replicate, zipWith) as Array -import Data.BigInt (fromInt) as BigInt import Data.List (singleton) as List import Data.Map (fromFoldable) as Map import Data.Maybe (Maybe(Just)) @@ -36,6 +35,7 @@ import Data.UInt (UInt) import Data.UInt (fromInt, toInt) as UInt import Effect.Aff (Aff) import Effect.Class (liftEffect) +import JS.BigInt (fromInt) as BigInt import Mote (group, test) import Test.Ctl.Fixtures ( currencySymbol1 diff --git a/test/BalanceTx/Time.purs b/test/BalanceTx/Time.purs index 7a1f9cce7..c1fe6e8dc 100644 --- a/test/BalanceTx/Time.purs +++ b/test/BalanceTx/Time.purs @@ -6,8 +6,7 @@ import Contract.Config (testnetConfig) import Contract.Monad (Contract, runContract) import Contract.ScriptLookups ( ScriptLookups - , UnattachedUnbalancedTx - , mkUnbalancedTx + , UnbalancedTx ) import Contract.Time ( POSIXTime @@ -24,17 +23,15 @@ import Contract.Time , to ) import Contract.TxConstraints (mustValidateIn) +import Contract.UnbalancedTx (mkUnbalancedTxE) import Control.Monad.Except (throwError) -import Ctl.Internal.Cardano.Types.Transaction (_body) import Ctl.Internal.Test.TestPlanM (TestPlanM) import Ctl.Internal.Types.BigNum (BigNum) import Ctl.Internal.Types.BigNum (fromInt, toInt) as BigNum import Ctl.Internal.Types.Interval (Interval) -import Ctl.Internal.Types.UnbalancedTransaction (_transaction) -import Data.BigInt (fromString) as BigInt -import Data.Lens (view) import Effect.Aff (Aff) import Effect.Exception (error) +import JS.BigInt (fromString) as BigInt import Mote (group, test) import Partial.Unsafe (unsafePartial) import Test.Spec.Assertions (fail, shouldEqual) @@ -85,7 +82,7 @@ mkTestFromSingleInterval :: Interval POSIXTime -> Contract Unit mkTestFromSingleInterval interval = do let constraint = mustValidateIn interval - mutx <- mkUnbalancedTx emptyLookup constraint + mutx <- mkUnbalancedTxE emptyLookup constraint case mutx of Left e -> fail $ show e Right utx -> @@ -97,7 +94,7 @@ testEmptyInterval :: Contract Unit testEmptyInterval = do let constraint = mustValidateIn never - mutx <- mkUnbalancedTx emptyLookup constraint + mutx <- mkUnbalancedTxE emptyLookup constraint case mutx of Left _ -> pure unit Right utx -> fail $ "Empty interval must fail : " <> show utx @@ -110,7 +107,7 @@ testEmptyMultipleIntervals = do , mkFiniteInterval (now + mkPosixTime "3000") (now + mkPosixTime "4000") ] constraint = foldMap mustValidateIn intervals - mutx <- mkUnbalancedTx emptyLookup constraint + mutx <- mkUnbalancedTxE emptyLookup constraint case mutx of Left _ -> pure unit Right utx -> fail $ "Empty interval must fail : " <> show utx @@ -120,7 +117,7 @@ mkTestMultipleInterval mkTestMultipleInterval intervals expected = do let constraint = foldMap mustValidateIn intervals - mutx <- mkUnbalancedTx emptyLookup constraint + mutx <- mkUnbalancedTxE emptyLookup constraint case mutx of Left e -> fail $ show e Right utx -> @@ -132,7 +129,7 @@ mkTestMultipleInterval intervals expected = do -- Fixtures -------------------------------------------------------------------------------- -emptyLookup :: ScriptLookups Void +emptyLookup :: ScriptLookups emptyLookup = mempty now :: POSIXTime @@ -149,17 +146,16 @@ unsafeSubtractOne value = wrap <<< fromJust -------------------------------------------------------------------------------- getTimeFromUnbalanced - :: UnattachedUnbalancedTx -> Contract (Interval POSIXTime) + :: UnbalancedTx -> Contract (Interval POSIXTime) getTimeFromUnbalanced utx = validityToPosixTime $ unwrap body where - body = (_transaction <<< _body) `view` (unwrap utx).unbalancedTx + body = (unwrap utx) # _.transaction >>> unwrap >>> _.body toPosixTime :: Slot -> Contract POSIXTime toPosixTime time = do eraSummaries <- getEraSummaries systemStart <- getSystemStart - eitherTime <- liftEffect $ slotToPosixTime eraSummaries systemStart time - case eitherTime of + case slotToPosixTime eraSummaries systemStart time of Left e -> (throwError <<< error <<< show) e Right value -> pure value @@ -167,9 +163,7 @@ toPosixTimeRange :: Interval Slot -> Contract (Interval POSIXTime) toPosixTimeRange range = do eraSummaries <- getEraSummaries systemStart <- getSystemStart - eitherRange <- liftEffect $ - slotRangeToPosixTimeRange eraSummaries systemStart range - case eitherRange of + case slotRangeToPosixTimeRange eraSummaries systemStart range of Left e -> (throwError <<< error <<< show) e Right value -> pure value @@ -206,4 +200,3 @@ validityToPosixTime { validityStartInterval, ttl: timeToLive } = mkPosixTime :: String -> POSIXTime mkPosixTime = wrap <<< unsafePartial fromJust <<< BigInt.fromString - diff --git a/test/Base64.purs b/test/Base64.purs deleted file mode 100644 index 4100ba884..000000000 --- a/test/Base64.purs +++ /dev/null @@ -1,26 +0,0 @@ -module Test.Ctl.Base64 (suite) where - -import Prelude - -import Ctl.Internal.Base64 - ( fromByteArray - , mkBase64String - , toByteArray - , unBase64String - ) -import Ctl.Internal.Test.TestPlanM (TestPlanM) -import Data.Maybe (Maybe(Just)) -import Effect.Aff (Aff) -import Effect.Class (liftEffect) -import Mote (group, test) -import Test.QuickCheck (quickCheck, (===)) - -suite :: TestPlanM (Aff Unit) Unit -suite = do - group "Base64" do - test "toByteArray . fromByteArray = id" $ liftEffect do - quickCheck \bytes -> - toByteArray (fromByteArray bytes) === bytes - test "mkBase64String <<< unBase64String = Just" $ liftEffect do - quickCheck \base64Str -> - mkBase64String (unBase64String base64Str) === Just base64Str diff --git a/test/Blockfrost.purs b/test/Blockfrost.purs index 287373ac8..fb3d84732 100644 --- a/test/Blockfrost.purs +++ b/test/Blockfrost.purs @@ -29,7 +29,6 @@ import Ctl.Internal.Service.Blockfrost import Ctl.Internal.Service.Blockfrost as Blockfrost import Data.Array ((!!)) import Data.Bifunctor (lmap) -import Data.BigInt as BigInt import Data.Either (Either(Left, Right), fromRight, isRight) import Data.FoldableWithIndex (forWithIndex_) import Data.Log.Formatter.Pretty (prettyFormatter) @@ -40,6 +39,7 @@ import Data.Tuple.Nested ((/\)) import Effect (Effect) import Effect.Aff (Aff, error, launchAff_) import Effect.Class.Console (log) +import JS.BigInt as BigInt import Mote (group, test) import Node.Process (argv) import Partial.Unsafe (unsafePartial) diff --git a/test/Blockfrost/Contract.purs b/test/Blockfrost/Contract.purs index 7d1e1a2e1..138afc2cd 100644 --- a/test/Blockfrost/Contract.purs +++ b/test/Blockfrost/Contract.purs @@ -9,7 +9,7 @@ import Prelude import Contract.Config (testnetConfig) import Contract.Monad (launchAff_) import Contract.Test.Blockfrost (executeContractTestsWithBlockfrost) -import Data.Maybe (Maybe(Nothing, Just)) +import Data.Maybe (Maybe(Just)) import Data.Time.Duration (Milliseconds(Milliseconds)) import Effect (Effect) import Test.Ctl.Integration as IntegrationTest @@ -21,7 +21,6 @@ main = launchAff_ do executeContractTestsWithBlockfrost TestSpec.defaultConfig { timeout = Just $ Milliseconds 1000000.0 } testnetConfig { suppressLogs = true } - Nothing do Plutip.suite IntegrationTest.stakingSuite diff --git a/test/Blockfrost/GenerateFixtures/Helpers.purs b/test/Blockfrost/GenerateFixtures/Helpers.purs index a5effdce4..5adb2fdbc 100644 --- a/test/Blockfrost/GenerateFixtures/Helpers.purs +++ b/test/Blockfrost/GenerateFixtures/Helpers.purs @@ -29,7 +29,8 @@ import Data.Maybe (Maybe(Just, Nothing), maybe) import Data.String (take) as String import Effect.Exception (throw) import Node.Encoding (Encoding(UTF8)) -import Node.FS.Aff (exists, writeTextFile) +import Node.FS.Aff (writeTextFile) +import Node.FS.Sync (exists) import Node.Path (concat) import Node.Process (lookupEnv) @@ -90,7 +91,7 @@ storeBlockfrostFixture i query resp = do let filename = query <> "-" <> respHash <> ".json" fp = concat [ "fixtures", "test", "blockfrost", query, filename ] - exists fp >>= flip unless + liftEffect (exists fp) >>= flip unless ( writeTextFile UTF8 fp resp *> log ("Successfully saved fixture #" <> show i <> " to: " <> fp) ) diff --git a/test/Blockfrost/GenerateFixtures/NativeScript.purs b/test/Blockfrost/GenerateFixtures/NativeScript.purs index 533a3e9b5..5d2c45a1a 100644 --- a/test/Blockfrost/GenerateFixtures/NativeScript.purs +++ b/test/Blockfrost/GenerateFixtures/NativeScript.purs @@ -2,7 +2,6 @@ module Test.Ctl.Blockfrost.GenerateFixtures.NativeScript (main) where import Contract.Prelude -import Contract.Address (ownPaymentPubKeyHash, ownStakePubKeyHash) import Contract.Config ( ContractParams , PrivatePaymentKeySource(PrivatePaymentKeyFile) @@ -14,7 +13,6 @@ import Contract.Config ) import Contract.Hashing (scriptRefHash) as Hashing import Contract.Monad (Contract, launchAff_, liftedM, runContract) -import Contract.ScriptLookups (ScriptLookups) as Lookups import Contract.Scripts (NativeScript, ScriptHash) import Contract.Transaction ( ScriptRef(NativeScriptRef) @@ -23,6 +21,7 @@ import Contract.Transaction ) import Contract.TxConstraints (TxConstraints) as Constraints import Contract.Value (lovelaceValueOf) as Value +import Contract.Wallet (ownPaymentPubKeyHash, ownStakePubKeyHash) import Ctl.Examples.Helpers (mustPayToPubKeyStakeAddressWithScriptRef) import Ctl.Internal.Contract.QueryBackend (BlockfrostBackend) import Ctl.Internal.Service.Blockfrost @@ -32,8 +31,8 @@ import Ctl.Internal.Service.Blockfrost ) import Ctl.Internal.Service.Blockfrost (getScriptByHash) as Blockfrost import Data.Array (mapWithIndex) -import Data.BigInt (fromInt) as BigInt import Data.UInt (fromInt) as UInt +import JS.BigInt (fromInt) as BigInt import Test.Ctl.Blockfrost.GenerateFixtures.Helpers ( blockfrostBackend , getSkeyFilepathFromEnv @@ -85,15 +84,12 @@ generateFixtures numFixtures = do pkh <- liftedM "Failed to get own PKH" ownPaymentPubKeyHash skh <- ownStakePubKeyHash let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mustPayToPubKeyStakeAddressWithScriptRef pkh skh nativeScriptRef (Value.lovelaceValueOf $ BigInt.fromInt 2_000_000) - lookups :: Lookups.ScriptLookups Void - lookups = mempty - - txHash <- submitTxFromConstraints lookups constraints + txHash <- submitTxFromConstraints mempty constraints awaitTxConfirmed txHash -- TODO: @@ -121,4 +117,3 @@ generateFixtures numFixtures = do NativeScriptByHash h | h == nativeScriptHash -> storeBlockfrostFixture i "getNativeScriptByHash" rawResponse _ -> pure unit - diff --git a/test/Blockfrost/GenerateFixtures/ScriptInfo.purs b/test/Blockfrost/GenerateFixtures/ScriptInfo.purs index 4f07847f6..46421748f 100644 --- a/test/Blockfrost/GenerateFixtures/ScriptInfo.purs +++ b/test/Blockfrost/GenerateFixtures/ScriptInfo.purs @@ -2,7 +2,6 @@ module Test.Ctl.Blockfrost.GenerateFixtures.ScriptInfo (main) where import Contract.Prelude -import Contract.Address (ownPaymentPubKeyHash, ownStakePubKeyHash) import Contract.Config ( ContractParams , PrivatePaymentKeySource(PrivatePaymentKeyFile) @@ -24,6 +23,7 @@ import Contract.Transaction import Contract.TxConstraints (TxConstraints) as Constraints import Contract.Value (Value) import Contract.Value (lovelaceValueOf) as Value +import Contract.Wallet (ownPaymentPubKeyHash, ownStakePubKeyHash) import Ctl.Examples.AlwaysSucceeds (alwaysSucceedsScript) import Ctl.Examples.Helpers (mustPayToPubKeyStakeAddressWithScriptRef) import Ctl.Examples.PlutusV2.Scripts.AlwaysSucceeds (alwaysSucceedsScriptV2) @@ -35,9 +35,9 @@ import Ctl.Internal.Service.Blockfrost ) import Ctl.Internal.Service.Blockfrost (getScriptInfo) as Blockfrost import Data.Array (zip) as Array -import Data.BigInt (fromInt) as BigInt import Data.FoldableWithIndex (forWithIndex_) import Data.UInt (fromInt) as UInt +import JS.BigInt (fromInt) as BigInt import Test.Ctl.Blockfrost.GenerateFixtures.Helpers ( blockfrostBackend , getSkeyFilepathFromEnv @@ -96,12 +96,12 @@ generateFixtures = do value :: Value value = Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat $ scriptRefs <#> flip (mustPayToPubKeyStakeAddressWithScriptRef pkh skh) value - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty txHash <- submitTxFromConstraints lookups constraints @@ -126,4 +126,3 @@ generateFixtures = do ScriptInfo h | h == scriptHash -> storeBlockfrostFixture i "getScriptInfo" rawResponse _ -> pure unit - diff --git a/test/Blockfrost/ProtocolParameters.purs b/test/Blockfrost/ProtocolParameters.purs index a7bb5c0d1..ec9e596c8 100644 --- a/test/Blockfrost/ProtocolParameters.purs +++ b/test/Blockfrost/ProtocolParameters.purs @@ -25,11 +25,11 @@ import Test.Spec.Runner (defaultConfig) blockfrostFixture :: String blockfrostFixture = - "blockfrost/getProtocolParameters/getProtocolParameters-7fe834fd628aa322eedeb3d8c7c1dd61.json" + "blockfrost/getProtocolParameters/getProtocolParameters-2d2ce3159a465c84058d7eab67b1b345.json" ogmiosFixture :: String ogmiosFixture = - "ogmios/currentProtocolParameters-9f10850f285b1493955267e900008841.json" + "ogmios/queryLedgerState-protocolParameters-68ba1141d17af9326cad70407ea3d7fb.json" loadFixture :: forall (a :: Type). DecodeAeson a => String -> Aff a loadFixture fixture = @@ -48,6 +48,7 @@ suite = group "Blockfrost" do test "ProtocolParameter parsing verification" do BlockfrostProtocolParameters blockfrostFixture' <- loadFixture blockfrostFixture - OgmiosProtocolParameters ogmiosFixture' <- loadFixture ogmiosFixture + { result: OgmiosProtocolParameters ogmiosFixture' } + :: { result :: OgmiosProtocolParameters } <- loadFixture ogmiosFixture blockfrostFixture' `shouldEqual` ogmiosFixture' diff --git a/test/CoinSelection/CoinSelection.purs b/test/CoinSelection/CoinSelection.purs index 6059a383e..499db9afa 100644 --- a/test/CoinSelection/CoinSelection.purs +++ b/test/CoinSelection/CoinSelection.purs @@ -29,7 +29,6 @@ import Ctl.Internal.Types.ByteArray (byteArrayFromAscii) import Ctl.Internal.Types.OutputDatum (OutputDatum(NoOutputDatum)) import Ctl.Internal.Types.TokenName (TokenName, mkTokenName) import Ctl.Internal.Types.Transaction (TransactionInput) -import Data.BigInt (fromInt) as BigInt import Data.Foldable (fold, foldMap) import Data.Generic.Rep (class Generic) import Data.Map (fromFoldable, values) as Map @@ -44,6 +43,7 @@ import Effect.Aff (Aff) import Effect.Class (class MonadEffect, liftEffect) import Effect.Exception (throw) import Effect.Unsafe (unsafePerformEffect) +import JS.BigInt (fromInt) as BigInt import Mote (group, test) import Partial.Unsafe (unsafePartial) import Test.Ctl.CoinSelection.Arbitrary diff --git a/test/Data.purs b/test/Data.purs index fb13b6781..8271ca5a6 100644 --- a/test/Data.purs +++ b/test/Data.purs @@ -33,20 +33,20 @@ import Ctl.Internal.TypeLevel.RowList.Unordered.Indexed import Ctl.Internal.Types.BigNum as BigNum import Ctl.Internal.Types.ByteArray (hexToByteArrayUnsafe) import Ctl.Internal.Types.PlutusData (PlutusData(Constr, Integer)) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt +import Data.Array.NonEmpty (fromNonEmpty) as NEArray import Data.Either (Either(Left, Right)) import Data.Generic.Rep as G -import Data.List as List import Data.Maybe (Maybe(Just, Nothing), fromJust, maybe) import Data.Newtype (wrap) import Data.NonEmpty ((:|)) import Data.Show.Generic (genericShow) import Data.Traversable (for_, traverse_) -import Data.Tuple (Tuple, uncurry) +import Data.Tuple (Tuple(Tuple), uncurry) import Data.Tuple.Nested ((/\)) import Effect.Aff (Aff) import Effect.Exception (Error) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Mote (group, test) import Partial.Unsafe (unsafePartial) import Test.QuickCheck ((===)) @@ -408,9 +408,9 @@ instance ToData FType' where instance Arbitrary CType where arbitrary = - (frequency <<< wrap) $ + (frequency <<< NEArray.fromNonEmpty) $ (0.25 /\ pure C0) - :| List.fromFoldable + :| [ 0.25 /\ (C1 <$> arbitrary) , 0.25 /\ (C2 <$> arbitrary <*> arbitrary) , 0.25 /\ (C3 <$> arbitrary <*> arbitrary <*> arbitrary) @@ -420,17 +420,17 @@ instance Arbitrary EType where arbitrary = genericArbitrary instance Arbitrary DType where - arbitrary = fix \_ -> (frequency <<< wrap) $ + arbitrary = fix \_ -> frequency $ NEArray.fromNonEmpty $ 0.4 /\ (D0 <$> arbitrary <*> arbitrary <*> arbitrary) - :| List.fromFoldable + :| [ 0.4 /\ (D2 <$> arbitrary) , 0.2 /\ (D1 <$> arbitrary) ] instance Arbitrary FType where - arbitrary = fix \_ -> (frequency <<< wrap) $ + arbitrary = fix \_ -> frequency $ NEArray.fromNonEmpty $ 0.4 /\ (F0 <$> ({ f0A: _ } <<< unwrap <$> arbitrary)) - :| List.fromFoldable + :| [ 0.4 /\ ( F1 <$> ( { f1A: _, f1B: _, f1C: _ } <$> arbitrary <*> arbitrary <*> @@ -536,6 +536,10 @@ data Tree a = Node a (Tuple (Tree a) (Tree a)) | Leaf a derive instance G.Generic (Tree a) _ +instance Functor Tree where + map f (Leaf a) = Leaf (f a) + map f (Node a (ltree /\ rtree)) = Node (f a) (map f ltree /\ map f rtree) + instance HasPlutusSchema (Tree a) ( "Node" := PNil @@ Z @@ -546,10 +550,17 @@ instance ) instance (ToData a) => ToData (Tree a) where - toData x = genericToData x -- https://github.com/purescript/documentation/blob/master/guides/Type-Class-Deriving.md#avoiding-stack-overflow-errors-with-recursive-types + -- https://github.com/purescript/documentation/blob/master/guides/Type-Class-Deriving.md#avoiding-stack-overflow-errors-with-recursive-types + toData t = genericToData $ map toData t instance (FromData a) => FromData (Tree a) where - fromData x = genericFromData x + fromData pd = worker =<< (genericFromData pd :: _ (Tree PlutusData)) + where + worker :: Tree PlutusData -> Maybe (Tree a) + worker = case _ of + Leaf a -> Leaf <$> fromData a + Node a (ltree /\ rtree) -> + Node <$> fromData a <*> (Tuple <$> worker ltree <*> worker rtree) fromBytesFromData :: forall a. FromData a => String -> Maybe a fromBytesFromData binary = fromData <<< PDD.convertPlutusData =<< fromBytes diff --git a/test/Data/Interval.purs b/test/Data/Interval.purs index 8d313a46b..8808d9ad4 100644 --- a/test/Data/Interval.purs +++ b/test/Data/Interval.purs @@ -33,11 +33,11 @@ import Ctl.Internal.Types.Interval , genUpperRay , mkFiniteInterval ) -import Data.BigInt (BigInt) -import Data.BigInt as BigInt import Data.Generic.Rep (class Generic) import Data.Newtype (class Newtype) import Data.Show.Generic (genericShow) +import JS.BigInt (BigInt) +import JS.BigInt as BigInt import Mote (group, test) import Test.QuickCheck (Result, arbitrary, quickCheck, (===)) import Test.QuickCheck.Gen (Gen) diff --git a/test/Deserialization.purs b/test/Deserialization.purs index fe15d425f..d3af68ab9 100644 --- a/test/Deserialization.purs +++ b/test/Deserialization.purs @@ -2,21 +2,21 @@ module Test.Ctl.Deserialization (suite) where import Prelude -import Contract.Address (ByteArray) +import Contract.Prim.ByteArray (ByteArray) import Contract.TextEnvelope ( TextEnvelope(TextEnvelope) , TextEnvelopeType(Other) , decodeTextEnvelope ) import Control.Monad.Error.Class (class MonadThrow, liftMaybe) -import Ctl.Examples.OtherTypeTextEnvelope (otherTypeTextEnvelope) import Ctl.Internal.Cardano.Types.NativeScript (NativeScript(ScriptAny)) as T import Ctl.Internal.Cardano.Types.Transaction (Transaction, TransactionOutput) as T +import Ctl.Internal.Cardano.Types.Transaction (Vkeywitness) import Ctl.Internal.Cardano.Types.TransactionUnspentOutput ( TransactionUnspentOutput(TransactionUnspentOutput) ) as T import Ctl.Internal.Deserialization.BigInt as DB -import Ctl.Internal.Deserialization.FromBytes (fromBytes) +import Ctl.Internal.Deserialization.FromBytes (fromBytes, fromBytesEffect) import Ctl.Internal.Deserialization.NativeScript as NSD import Ctl.Internal.Deserialization.PlutusData as DPD import Ctl.Internal.Deserialization.Transaction (convertTransaction) as TD @@ -30,21 +30,26 @@ import Ctl.Internal.Serialization (convertTxInput, convertTxOutput) as Serializa import Ctl.Internal.Serialization.BigInt as SB import Ctl.Internal.Serialization.NativeScript (convertNativeScript) as NSS import Ctl.Internal.Serialization.PlutusData as SPD +import Ctl.Internal.Serialization.ToBytes (toBytes) import Ctl.Internal.Serialization.ToBytes (toBytes) as Serialization import Ctl.Internal.Serialization.Types (TransactionUnspentOutput) +import Ctl.Internal.Serialization.Types (Vkeywitness) as Serialization +import Ctl.Internal.Serialization.WitnessSet (convertVkeywitness) as Serialization import Ctl.Internal.Serialization.WitnessSet as SW import Ctl.Internal.Test.TestPlanM (TestPlanM) import Ctl.Internal.Types.BigNum (fromBigInt, toBigInt) as BigNum import Ctl.Internal.Types.Transaction (TransactionInput) as T import Data.Array as Array -import Data.BigInt as BigInt import Data.Either (hush) +import Data.Foldable (fold) import Data.Maybe (isJust, isNothing) import Data.Newtype (unwrap, wrap) +import Data.Traversable (traverse) import Effect (Effect) import Effect.Aff (Aff) import Effect.Class (class MonadEffect, liftEffect) import Effect.Exception (Error, error) +import JS.BigInt as BigInt import Mote (group, skip, test) import Test.Ctl.Fixtures ( nativeScriptFixture1 @@ -150,7 +155,7 @@ suite = do group "WitnessSet - deserialization" do group "fixture #1" do res <- errMaybe "Failed deserialization 5" do - fromBytes (wrap witnessSetFixture1) >>= convertWitnessSet + fromBytes (wrap witnessSetFixture1) <#> convertWitnessSet test "has vkeys" do (unwrap res).vkeys `shouldSatisfy` isJust test "has plutusData" do @@ -165,15 +170,15 @@ suite = do (unwrap res).nativeScripts `shouldSatisfy` isNothing test "fixture #2" do res <- errMaybe "Failed deserialization 6" do - fromBytes (wrap witnessSetFixture2) >>= convertWitnessSet + fromBytes (wrap witnessSetFixture2) <#> convertWitnessSet res `shouldEqual` witnessSetFixture2Value test "fixture #3" do res <- errMaybe "Failed deserialization 7" do - fromBytes (wrap witnessSetFixture3) >>= convertWitnessSet + fromBytes (wrap witnessSetFixture3) <#> convertWitnessSet res `shouldEqual` witnessSetFixture3Value group "fixture #4" do res <- errMaybe "Failed deserialization 8" $ - fromBytes (wrap witnessSetFixture4) >>= convertWitnessSet + fromBytes (wrap witnessSetFixture4) <#> convertWitnessSet test "has nativeScripts" do (unwrap res).nativeScripts `shouldSatisfy` isJust group "NativeScript - deserializaton is inverse to serialization" do @@ -203,6 +208,21 @@ suite = do liftEffect $ testNativeScript longNativeScript group "WitnessSet - deserialization is inverse to serialization" do let + vkeyWitnessesRoundtrip + :: ∀ (m :: Type -> Type) + . MonadEffect m + => MonadThrow Error m + => Array Vkeywitness + -> m Unit + vkeyWitnessesRoundtrip vks = do + cslVks <- traverse (liftEffect <<< Serialization.convertVkeywitness) + vks + let cslVksBytes = toBytes <$> cslVks + (_ :: Array Serialization.Vkeywitness) <- traverse + (liftEffect <<< fromBytesEffect) + cslVksBytes + pure unit + witnessSetRoundTrip :: ∀ (m :: Type -> Type) . MonadEffect m @@ -211,9 +231,12 @@ suite = do -> m Unit witnessSetRoundTrip fixture = do ws0 <- errMaybe "Failed deserialization" $ - fromBytes (wrap fixture) >>= convertWitnessSet + fromBytes (wrap fixture) <#> convertWitnessSet ws1 <- liftEffect $ SW.convertWitnessSet ws0 - ws2 <- errMaybe "Failed deserialization" $ convertWitnessSet ws1 + let + ws2 = convertWitnessSet ws1 + vkeys = fold (unwrap ws2).vkeys + vkeyWitnessesRoundtrip vkeys ws0 `shouldEqual` ws2 -- value representation let wsBytes = unwrap $ Serialization.toBytes ws1 wsBytes `shouldEqual` fixture -- byte representation @@ -224,6 +247,15 @@ suite = do test "fixture #4" $ witnessSetRoundTrip witnessSetFixture4 group "TextEnvelope decoding" do test "Decoding TestEnvelope with some other type" do + let + otherTypeTextEnvelope = + """ + { + "cborHex": "484701000022120011", + "description": "other-type-text-envelope", + "type": "SomeOtherType" + } + """ TextEnvelope envelope <- liftMaybe (error "Unexpected parsing error") $ decodeTextEnvelope otherTypeTextEnvelope envelope.type_ `shouldEqual` (Other "SomeOtherType") diff --git a/test/E2E/Route.purs b/test/E2E/Route.purs index 856295b08..8d20e4166 100644 --- a/test/E2E/Route.purs +++ b/test/E2E/Route.purs @@ -2,7 +2,7 @@ module Test.Ctl.E2E.Route where import Prelude -import Ctl.Internal.E2E.Route (parseRoute) +import Ctl.Internal.Test.E2E.Route (parseRoute) import Ctl.Internal.Test.TestPlanM (TestPlanM) import Data.Either (isRight) import Effect.Aff (Aff) diff --git a/test/Fixtures.purs b/test/Fixtures.purs index 7a87697d1..32872c707 100644 --- a/test/Fixtures.purs +++ b/test/Fixtures.purs @@ -19,6 +19,7 @@ module Test.Ctl.Fixtures , cip25MetadataJsonFixture2 , cip25MetadataJsonFixture3 , currencySymbol1 + , ed25519KeyHash1 , ed25519KeyHashFixture1 , fullyAppliedScriptFixture , mkSampleTx @@ -30,6 +31,9 @@ module Test.Ctl.Fixtures , nativeScriptFixture5 , nativeScriptFixture6 , nativeScriptFixture7 + , nullPaymentPubKeyHash + , ogmiosEvaluateTxFailScriptErrorsFixture + , ogmiosEvaluateTxFailIncompatibleEraFixture , ogmiosEvaluateTxInvalidPointerFormatFixture , ogmiosEvaluateTxValidRespFixture , partiallyAppliedScriptFixture @@ -72,7 +76,7 @@ module Test.Ctl.Fixtures , witnessSetFixture3 , witnessSetFixture3Value , witnessSetFixture4 - , ed25519KeyHash1 + , utxoMapFixture ) where import Prelude @@ -128,6 +132,7 @@ import Ctl.Internal.Cardano.Types.Transaction , TransactionWitnessSet(TransactionWitnessSet) , TxBody(TxBody) , URL(URL) + , UtxoMap , Vkey(Vkey) , Vkeywitness(Vkeywitness) , mkEd25519Signature @@ -144,6 +149,7 @@ import Ctl.Internal.Cardano.Types.Value , mkNonAdaAsset , mkSingletonNonAdaAsset ) +import Ctl.Internal.Deserialization.FromBytes (fromBytes) import Ctl.Internal.Metadata.Cip25.Cip25String (Cip25String, mkCip25String) import Ctl.Internal.Metadata.Cip25.Common (Cip25TokenName(Cip25TokenName)) import Ctl.Internal.Metadata.Cip25.V2 @@ -175,9 +181,14 @@ import Ctl.Internal.Types.ByteArray , hexToByteArray , hexToByteArrayUnsafe ) +import Ctl.Internal.Types.CborBytes (CborBytes(CborBytes)) import Ctl.Internal.Types.Int as Int import Ctl.Internal.Types.OutputDatum (OutputDatum(NoOutputDatum, OutputDatum)) import Ctl.Internal.Types.PlutusData as PD +import Ctl.Internal.Types.PubKeyHash + ( PaymentPubKeyHash(PaymentPubKeyHash) + , PubKeyHash(PubKeyHash) + ) import Ctl.Internal.Types.RedeemerTag (RedeemerTag(Spend)) import Ctl.Internal.Types.RewardAddress (RewardAddress(RewardAddress)) import Ctl.Internal.Types.Scripts @@ -198,7 +209,6 @@ import Ctl.Internal.Types.TransactionMetadata , TransactionMetadatumLabel(TransactionMetadatumLabel) ) import Data.Array as Array -import Data.BigInt as BigInt import Data.Either (fromRight, hush) import Data.Map as Map import Data.Maybe (Maybe(Just, Nothing), fromJust) @@ -208,6 +218,7 @@ import Data.Set (singleton) as Set import Data.Tuple.Nested ((/\)) import Data.UInt as UInt import Effect (Effect) +import JS.BigInt as BigInt import Node.Encoding (Encoding(UTF8)) import Node.FS.Sync (readTextFile) import Partial.Unsafe (unsafePartial) @@ -575,9 +586,10 @@ txFixture4 = , certs: Just [ StakeRegistration stake1 , StakeDeregistration stake1 - , StakeDelegation stake1 (wrap ed25519KeyHash1) + , StakeDelegation stake1 + (PoolPubKeyHash $ PubKeyHash ed25519KeyHash1) , PoolRegistration - { operator: wrap ed25519KeyHash1 + { operator: PoolPubKeyHash $ PubKeyHash ed25519KeyHash1 , vrfKeyhash: unsafePartial $ fromJust $ hexToByteArray "fbf6d41985670b9041c5bf362b5262cf34add5d265975de176d613ca05f37096" @@ -610,7 +622,7 @@ txFixture4 = } } , PoolRetirement - { poolKeyHash: PoolPubKeyHash ed25519KeyHash1 + { poolKeyHash: PoolPubKeyHash $ PubKeyHash ed25519KeyHash1 , epoch: Epoch one } , GenesisKeyDelegation @@ -830,7 +842,7 @@ txBinaryFixture4 = \02ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea78\ \18dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a000142\ \5b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618\ - \201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0a0198af\ + \201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0a0198af\ \1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928\ \eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959\ \d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a00\ @@ -842,14 +854,13 @@ txBinaryFixture4 = \92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc\ \0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a0004\ \0c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f418\ - \20197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8\ - \001a009063b91903fd0a1b00000004a817c800001b00000004a817c8001382d81e820101d81e\ - \8201011482010115820101160117188c18180a01075820000000000000000000000000000000\ - \000000000000000000000000000000000008187c09a1581c1d6445ddeda578117f393848e685\ - \128f1e78ad0c4e48129c5964dc2ea14a4974657374546f6b656e010e81581c1c12f03c1ef2e9\ - \35acc35ec2e6f96c650fd3bfba3e96550504d533610f01108258390030fb3b8539951e26f034\ - \910a5a37f22cb99d94d1d409f69ddbaea9711c12f03c1ef2e935acc35ec2e6f96c650fd3bfba\ - \3e96550504d5336100111a004c4b40a0f5f6" + \20197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02\ + \515e841980b30a1382d81e820101d81e8201011482010115820101160117188c18180a010758\ + \20000000000000000000000000000000000000000000000000000000000000000008187c09a1\ + \581c1d6445ddeda578117f393848e685128f1e78ad0c4e48129c5964dc2ea14a497465737454\ + \6f6b656e010e81581c1c12f03c1ef2e935acc35ec2e6f96c650fd3bfba3e96550504d533610f\ + \01108258390030fb3b8539951e26f034910a5a37f22cb99d94d1d409f69ddbaea9711c12f03c\ + \1ef2e935acc35ec2e6f96c650fd3bfba3e96550504d5336100111a004c4b40a0f5f6" txBinaryFixture5 :: String txBinaryFixture5 = @@ -871,127 +882,134 @@ utxoFixture1 = hexToByteArrayUnsafe \583900f33ffa84fdf20a003443a5e2768e12e92db31535dca62088b153df243903103ae70681\ \439b5476fef59f439b8bc86d84bfb2d376fc3f56171a004c4b40" -utxoFixture1' :: TransactionUnspentOutput -utxoFixture1' = - TransactionUnspentOutput - { input: - ( TransactionInput - { index: UInt.fromInt 0 - , transactionId: TransactionHash +input :: TransactionInput +input = TransactionInput + { index: UInt.fromInt 0 + , transactionId: TransactionHash + ( byteArrayFromIntArrayUnsafe + [ 198 + , 181 + , 74 + , 163 + , 1 + , 136 + , 122 + , 243 + , 144 + , 189 + , 52 + , 73 + , 131 + , 62 + , 76 + , 214 + , 111 + , 246 + , 27 + , 94 + , 104 + , 177 + , 247 + , 124 + , 132 + , 168 + , 192 + , 135 + , 59 + , 119 + , 111 + , 249 + ] + ) + } + +output :: TransactionOutput +output = + ( TransactionOutput + { address: baseAddressToAddress $ baseAddress + { network: TestnetId + , paymentCred: keyHashCredential $ unsafePartial $ fromJust + $ ed25519KeyHashFromBytes + $ + byteArrayFromIntArrayUnsafe + [ 243 + , 63 + , 250 + , 132 + , 253 + , 242 + , 10 + , 0 + , 52 + , 67 + , 165 + , 226 + , 118 + , 142 + , 18 + , 233 + , 45 + , 179 + , 21 + , 53 + , 220 + , 166 + , 32 + , 136 + , 177 + , 83 + , 223 + , 36 + ] + , delegationCred: keyHashCredential $ unsafePartial $ fromJust + $ ed25519KeyHashFromBytes + $ ( byteArrayFromIntArrayUnsafe - [ 198 - , 181 - , 74 - , 163 - , 1 - , 136 - , 122 - , 243 - , 144 - , 189 - , 52 - , 73 - , 131 - , 62 - , 76 - , 214 - , 111 - , 246 - , 27 - , 94 - , 104 - , 177 - , 247 - , 124 + [ 57 + , 3 + , 16 + , 58 + , 231 + , 6 + , 129 + , 67 + , 155 + , 84 + , 118 + , 254 + , 245 + , 159 + , 67 + , 155 + , 139 + , 200 + , 109 , 132 - , 168 - , 192 - , 135 - , 59 - , 119 - , 111 - , 249 + , 191 + , 178 + , 211 + , 118 + , 252 + , 63 + , 86 + , 23 ] ) - } - ) - , output: - ( TransactionOutput - { address: baseAddressToAddress $ baseAddress - { network: TestnetId - , paymentCred: keyHashCredential $ unsafePartial $ fromJust - $ ed25519KeyHashFromBytes - $ - byteArrayFromIntArrayUnsafe - [ 243 - , 63 - , 250 - , 132 - , 253 - , 242 - , 10 - , 0 - , 52 - , 67 - , 165 - , 226 - , 118 - , 142 - , 18 - , 233 - , 45 - , 179 - , 21 - , 53 - , 220 - , 166 - , 32 - , 136 - , 177 - , 83 - , 223 - , 36 - ] - , delegationCred: keyHashCredential $ unsafePartial $ fromJust - $ ed25519KeyHashFromBytes - $ - ( byteArrayFromIntArrayUnsafe - [ 57 - , 3 - , 16 - , 58 - , 231 - , 6 - , 129 - , 67 - , 155 - , 84 - , 118 - , 254 - , 245 - , 159 - , 67 - , 155 - , 139 - , 200 - , 109 - , 132 - , 191 - , 178 - , 211 - , 118 - , 252 - , 63 - , 86 - , 23 - ] - ) - } - , amount: Value (Coin (BigInt.fromInt 5000000)) mempty - , datum: NoOutputDatum - , scriptRef: Nothing - } - ) + } + , amount: Value (Coin (BigInt.fromInt 5000000)) mempty + , datum: NoOutputDatum + , scriptRef: Nothing + } + ) + +utxoMapFixture :: UtxoMap +utxoMapFixture = Map.singleton input output + +utxoFixture1' :: TransactionUnspentOutput +utxoFixture1' = + TransactionUnspentOutput + { input + , output } witnessSetFixture1 :: ByteArray @@ -1436,6 +1454,16 @@ ogmiosEvaluateTxInvalidPointerFormatFixture = readJsonFixtureFile "test/Fixtures/OgmiosEvaluateTxInvalidPointerFormatFixture.json" +ogmiosEvaluateTxFailIncompatibleEraFixture :: Effect Aeson +ogmiosEvaluateTxFailIncompatibleEraFixture = + readJsonFixtureFile + "test/Fixtures/OgmiosEvaluateTxFailIncompatibleEraFixture.json" + +ogmiosEvaluateTxFailScriptErrorsFixture :: Effect Aeson +ogmiosEvaluateTxFailScriptErrorsFixture = + readJsonFixtureFile + "test/Fixtures/OgmiosEvaluateTxFailScriptErrorsFixture.json" + redeemerFixture1 :: Redeemer redeemerFixture1 = Redeemer { tag: Spend @@ -1470,3 +1498,12 @@ fullyAppliedScriptFixture = \2333573466e1c00800404003c0152002333500b22333573466e3c00800404003c011220100\ \10091326353008009498cd4015d680119a802bae0011200120011200112001122002122001\ \20014c01021820004c010544746573740001" + +nullPaymentPubKeyHash :: PaymentPubKeyHash +nullPaymentPubKeyHash = PaymentPubKeyHash $ PubKeyHash + $ unsafePartial + $ fromJust + $ fromBytes + $ CborBytes + $ hexToByteArrayUnsafe + "f9dca21a6c826ec8acb4cf395cbc24351937bfe6560b2683ab8b415f" diff --git a/test/Fixtures/OgmiosEvaluateTxFailIncompatibleEraFixture.json b/test/Fixtures/OgmiosEvaluateTxFailIncompatibleEraFixture.json new file mode 100644 index 000000000..fdf9ca16e --- /dev/null +++ b/test/Fixtures/OgmiosEvaluateTxFailIncompatibleEraFixture.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","method":"evaluateTransaction","error":{"code":3000,"message":"Trying to evaluate a transaction from an old era (prior to Alonzo).","data":{"incompatibleEra":"shelley"}},"id":"some id blabla"} diff --git a/test/Fixtures/OgmiosEvaluateTxFailScriptErrorsFixture.json b/test/Fixtures/OgmiosEvaluateTxFailScriptErrorsFixture.json new file mode 100644 index 000000000..ead071bbe --- /dev/null +++ b/test/Fixtures/OgmiosEvaluateTxFailScriptErrorsFixture.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","method":"evaluateTransaction","error":{"code":3010,"message":"Some scripts of the transactions terminated with error(s).","data":[{"validator":"certificate:11","error":{"code":3117,"message":"The transaction contains unknown UTxO references as inputs. This can happen if the inputs you're trying to spend have already been spent, or if you've simply referred to non-existing UTxO altogether. The field 'data.unknownOutputReferences' indicates all unknown inputs.","data":{"unknownOutputReferences":[{"transaction":{"id":"731392618255aff0cd24712e6bd234db958cc065f8eff4f5e4476d4825cda180"},"index":1}]}}},{"validator":"certificate:15","error":{"code":3011,"message":"An associated script witness is missing. Indeed, any script used in a transaction (when spending, minting, withdrawing or publishing certificates) must be provided in full with the transaction. Scripts must therefore be added either to the witness set or provided as a reference inputs should you use Plutus V2+ and a format from Babbage and beyond.","data":{"missingScripts":["mint:11"]}}},{"validator":"withdrawal:16","error":{"code":3111,"message":"Transaction failed because some Plutus scripts are missing their associated datums. 'data.missingDatums' contains a set of data hashes for the missing datums. Ensure all Plutus scripts have an associated datum in the transaction's witness set or, are provided through inline datums in reference inputs.","data":{"missingDatums":["342ab6aef80f619bb09dfe2e8a24f8937734d4150d00cb1aa93222ce808c290f"]}}}]},"id":"mK9IYY6GandR"} diff --git a/test/Fixtures/OgmiosEvaluateTxInvalidPointerFormatFixture.json b/test/Fixtures/OgmiosEvaluateTxInvalidPointerFormatFixture.json index b91cff1ac..57a1e3507 100644 --- a/test/Fixtures/OgmiosEvaluateTxInvalidPointerFormatFixture.json +++ b/test/Fixtures/OgmiosEvaluateTxInvalidPointerFormatFixture.json @@ -1,12 +1,28 @@ { - "EvaluationResult": { - "spend": { - "memory": 1700, - "steps": 476468 - }, - "mint:0": { - "memory": 1685698, - "steps": 609724445 - } - } + "jsonrpc": "2.0", + "method": "evaluateTransaction", + "result": [ + { + "validator": "spend", + "budget": { + "memory": 2766916028110716146, + "cpu": 6325731070934221229 + } + }, + { + "validator": "certificate:3", + "budget": { + "memory": 4926587050210136942, + "cpu": 2982577810151428748 + } + }, + { + "validator": "withdrawal:8", + "budget": { + "memory": 3603965291794951667, + "cpu": 937555587227912939 + } + } + ], + "id": "kuOpGfqeiHbY" } diff --git a/test/Fixtures/OgmiosEvaluateTxValidRespFixture.json b/test/Fixtures/OgmiosEvaluateTxValidRespFixture.json index a368a459e..dd82d93ad 100644 --- a/test/Fixtures/OgmiosEvaluateTxValidRespFixture.json +++ b/test/Fixtures/OgmiosEvaluateTxValidRespFixture.json @@ -1,12 +1,28 @@ { - "EvaluationResult": { - "spend:1": { - "memory": 1700, - "steps": 476468 - }, - "mint:0": { - "memory": 1685698, - "steps": 609724445 - } - } + "jsonrpc": "2.0", + "method": "evaluateTransaction", + "result": [ + { + "validator": "spend:1", + "budget": { + "memory": 2766916028110716146, + "cpu": 6325731070934221229 + } + }, + { + "validator": "certificate:3", + "budget": { + "memory": 4926587050210136942, + "cpu": 2982577810151428748 + } + }, + { + "validator": "withdrawal:0", + "budget": { + "memory": 3603965291794951667, + "cpu": 937555587227912939 + } + } + ], + "id": "kuOpGfqeiHbY" } diff --git a/test/Hashing.purs b/test/Hashing.purs index d762a8a23..11c92b5a2 100644 --- a/test/Hashing.purs +++ b/test/Hashing.purs @@ -22,10 +22,10 @@ import Ctl.Internal.Types.ByteArray import Ctl.Internal.Types.PlutusData (PlutusData(Integer)) import Ctl.Internal.Types.Scripts (PlutusScript, plutusV1Script, plutusV2Script) import Ctl.Internal.Types.Transaction (DataHash) -import Data.BigInt (fromInt) import Data.Maybe (fromJust) import Data.Newtype (wrap) import Effect.Aff (Aff) +import JS.BigInt (fromInt) import Mote (group, test) import Partial.Unsafe (unsafePartial) import Test.Ctl.Fixtures (plutusDataFixture7) diff --git a/test/Main.purs b/test/Main.purs index 37baf6a9e..f8c801fd7 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -2,7 +2,7 @@ module Test.Ctl.Main (main) where import Prelude -import Ctl.Internal.Test.TestPlanM (interpret) +import Contract.Test.Mote (interpret) import Effect (Effect) import Effect.Aff (launchAff_) import Test.Ctl.Integration as Integration diff --git a/test/MustSpendTotal.purs b/test/MustSpendTotal.purs index 1846e31b6..4de25b9b4 100644 --- a/test/MustSpendTotal.purs +++ b/test/MustSpendTotal.purs @@ -43,9 +43,8 @@ suite = do -- Properties prop_roundtripOverMonoid - :: forall i o - . (Value.Value -> TxConstraints i o) - -> (TxConstraints i o -> Value.Value) + :: (Value.Value -> TxConstraints) + -> (TxConstraints -> Value.Value) -> Value.Value -> Value.Value -> Result @@ -54,9 +53,8 @@ prop_roundtripOverMonoid must total x y = "On value 1 " <> show x <> " and value 2 " <> show y prop_roundtrip - :: forall i o - . (Value.Value -> TxConstraints i o) - -> (TxConstraints i o -> Value.Value) + :: (Value.Value -> TxConstraints) + -> (TxConstraints -> Value.Value) -> Value.Value -> Result prop_roundtrip must total x = (must >>> total) x === x diff --git a/test/Ogmios/Aeson.purs b/test/Ogmios/Aeson.purs index acd685fbf..783e027e4 100644 --- a/test/Ogmios/Aeson.purs +++ b/test/Ogmios/Aeson.purs @@ -1,37 +1,45 @@ module Test.Ctl.Ogmios.Aeson ( main , suite - , printEvaluateTxFailures ) where import Prelude -import Aeson (class DecodeAeson, Aeson, printJsonDecodeError) +import Aeson (Aeson, JsonDecodeError, encodeAeson, printJsonDecodeError) import Aeson as Aeson +import Contract.Backend.Ogmios.Mempool (MempoolSizeAndCapacity) import Control.Monad.Error.Class (liftEither) import Control.Monad.Trans.Class (lift) import Control.Parallel (parTraverse) -import Ctl.Internal.BalanceTx (printTxEvaluationFailure) +import Ctl.Internal.QueryM.JsonRpc2 + ( class DecodeOgmios + , OgmiosDecodeError(ErrorResponse) + , decodeOgmios + ) +import Ctl.Internal.QueryM.Ogmios + ( HasTxR + , SubmitTxR + , TxEvaluationR + , aesonObject + ) import Ctl.Internal.QueryM.Ogmios as O import Ctl.Internal.Test.TestPlanM (TestPlanM, interpret) -import Data.Array (catMaybes, elem, filter, groupAllBy, nubBy) +import Data.Array (catMaybes, groupAllBy, nubBy) import Data.Array.NonEmpty (NonEmptyArray, head, length, tail) -import Data.Bifunctor (bimap, lmap) -import Data.Either (either, hush) +import Data.Bifunctor (lmap) +import Data.Either (Either(Left, Right), hush) import Data.Map as Map import Data.Maybe (Maybe(Just, Nothing), maybe) -import Data.Newtype (unwrap, wrap) +import Data.String (toLower) import Data.String.Regex (match, regex) import Data.String.Regex.Flags (noFlags) -import Data.Traversable (for_, traverse) -import Data.Tuple (fst, snd) +import Data.Traversable (for_) import Data.Tuple.Nested (type (/\), (/\)) import Effect (Effect) import Effect.Aff (Aff, error, launchAff_) import Effect.Class (liftEffect) -import Effect.Class.Console (log) import Effect.Exception (throw) -import Foreign.Object (Object) +import Foreign.Object (update) as Object import Mote (group, skip, test) import Node.Encoding (Encoding(UTF8)) import Node.FS.Aff (readTextFile, readdir) @@ -39,49 +47,61 @@ import Node.Path (FilePath, basename, concat) import Node.Process (lookupEnv) import Type.Proxy (Proxy(Proxy)) -supported :: Array String -supported = - [ "chainTip" - , "currentEpoch" - , "systemStart" - , "eraSummaries" - , "currentProtocolParameters" - , "poolIds" - , "poolParameters" - , "delegationsAndRewards" - , "SubmitTx" - , "EvaluateTx" - -- TODO Support plutus:v2 parameters - -- https://github.com/Plutonomicon/cardano-transaction-lib/issues/567 - -- , "currentProtocolParameters-noPlutusV1" +type Check = String -> Aeson -> Aff Unit + +-- These fixtures are tested to decode to given types. +-- Pay attention to update this if fixture filenames change, otherwise tests are going to be ignored. +tested :: Array (String /\ Check) +tested = + [ ("queryNetwork/tip" /\ check (Proxy :: _ O.ChainTipQR)) + , ("queryNetwork/startTime" /\ check (Proxy :: _ O.CurrentEpoch)) + , ("queryLedgerState/epoch" /\ check (Proxy :: _ O.OgmiosSystemStart)) + , ("queryLedgerState/eraSummaries" /\ check (Proxy :: _ O.OgmiosEraSummaries)) + , ( "queryLedgerState/protocolParameters" /\ check + (Proxy :: _ O.OgmiosProtocolParameters) + ) + , ("queryLedgerState/stakePools" /\ check (Proxy :: _ O.PoolParametersR)) + , ( "queryLedgerState/rewardAccountSummaries" /\ check + (Proxy :: _ O.DelegationsAndRewardsR) + ) + , ("evaluateTransaction" /\ check (Proxy :: _ TxEvaluationR)) + , ("submitTransaction" /\ check (Proxy :: _ SubmitTxR)) + , ("hasTransaction" /\ check (Proxy :: _ HasTxR)) + , ("sizeOfMempool" /\ check (Proxy :: _ MempoolSizeAndCapacity)) + -- ignoring because response may lack tx cbor if not run with flag + -- This endpoint is tested with "fetchMempoolTXs" test (Test.Ctl.Plutip.Contract.OgmiosMempool) + -- , ("nextTransaction" /\ (Proxy :: _ MaybeMempoolTransaction )) ] -getField - :: forall (a :: Type). DecodeAeson a => String -> Object Aeson -> Maybe a -getField f o = join $ hush $ Aeson.getFieldOptional' o f +-- Fixtures from ogmios repo have id set to "null", but we require it as string. +addIdFieldHack :: Aeson -> Either JsonDecodeError Aeson +addIdFieldHack = aesonObject $ + ( pure <<< encodeAeson <<< Object.update + (const $ pure $ encodeAeson "My favourite id") + "id" + ) + +-- Fail if we can't decode positive result +check + :: forall (a :: Type) + . DecodeOgmios a + => Proxy a + -> String + -> Aeson + -> Aff Unit +check _ bn aeson = liftEither $ lmap + (error <<< ((bn <> "\n ") <> _)) + ( do + aeson' <- lmap show (addIdFieldHack aeson) + case decodeOgmios aeson' of + -- we don't decode every error response, that's an expected fail + Left (ErrorResponse (Just _)) -> pure unit + Right (_ :: a) -> pure unit + Left e -> Left $ show e + ) type Query = String --- Given a query and a response of the query, create a special case query -specialize :: Query -> Aeson -> Query -specialize query a - | Just _ :: _ Aeson <- getField "eraMismatch" =<< Aeson.toObject a = query - <> "-" - <> "eraMismatch" - | "currentProtocolParameters" <- query - , Just costModels <- getField "costModels" =<< Aeson.toObject a - , Nothing :: _ Aeson <- getField "plutus:v1" costModels = query <> "-" <> - "noPlutusV1" - | "currentProtocolParameters" <- query - , Just costModels <- getField "costModels" =<< Aeson.toObject a - , Nothing :: _ Aeson <- getField "plutus:v2" costModels = query <> "-" <> - "noPlutusV2" - | "SubmitTx" <- query - , Just _ :: _ Aeson <- getField "SubmitFail" =<< Aeson.toObject a = query - <> "-" - <> "SubmitFail" -specialize query _ = query - readdir' :: FilePath -> Aff (Array FilePath) readdir' fp = (map <<< map) (\fn -> concat [ fp, fn ]) (readdir fp) @@ -112,7 +132,7 @@ loadFixtures = do (Aeson.parseJsonStringToAeson contents) pure case pattern >>= flip match bn >>> map tail of Just [ Just query ] -> Just - { query: specialize query aeson + { query , bn , aeson } @@ -126,56 +146,26 @@ loadFixtures = do pure groupedFiles -printEvaluateTxFailures :: Effect Unit -printEvaluateTxFailures = launchAff_ do - fixtures <- loadFixtures <#> filter (fst >>> (_ == "EvaluateTx")) >>> map snd - flip (traverse >>> traverse) fixtures \{ aeson } -> do - let - response = hush $ Aeson.decodeAeson aeson :: _ O.TxEvaluationR - mbFailure = response >>= unwrap >>> either pure (const Nothing) - for_ mbFailure - ( log <<< printTxEvaluationFailure - ( wrap - { datums: [] - , redeemersTxIns: [] - , unbalancedTx: wrap { transaction: mempty, utxoIndex: Map.empty } - } - ) - ) - suite :: TestPlanM (Aff Unit) Unit suite = group "Ogmios Aeson tests" do groupedFiles <- lift loadFixtures + let + (tested' :: Map.Map String Check) = Map.fromFoldable $ map + (\(q /\ c) -> (toLower q /\ c)) + tested for_ groupedFiles \(query /\ files') -> - (if query `elem` supported then identity else skip) - $ test (query <> " (" <> show (length files') <> ")") - $ - for_ files' \{ aeson, bn } -> do - let - handle :: forall (a :: Type). DecodeAeson a => Proxy a -> Aff Unit - handle _ = liftEither $ bimap - ( error <<< ((bn <> "\n ") <> _) <<< - printJsonDecodeError - ) - (const unit) - (Aeson.decodeAeson aeson :: _ a) - case query of - "chainTip" -> handle (Proxy :: _ O.ChainTipQR) - "currentEpoch" -> handle (Proxy :: _ O.CurrentEpoch) - "systemStart" -> handle (Proxy :: _ O.OgmiosSystemStart) - "eraSummaries" -> handle (Proxy :: _ O.OgmiosEraSummaries) - "currentProtocolParameters" -> handle - (Proxy :: _ O.OgmiosProtocolParameters) - "poolIds" -> handle - (Proxy :: _ O.PoolIdsR) - "poolParameters" -> handle - (Proxy :: _ O.PoolParametersR) - "delegationsAndRewards" -> handle - (Proxy :: _ O.DelegationsAndRewardsR) - "EvaluateTx" -> handle (Proxy :: _ O.TxEvaluationR) - "SubmitTx" -> handle (Proxy :: _ O.SubmitTxR) - _ -> liftEffect $ throw $ "Unknown case " <> bn + let + query' = toLower query + in + let + test' ch = test (query <> " (" <> show (length files') <> ")") $ for_ + files' + \{ aeson, bn } -> ch bn aeson + in + case Map.lookup query' tested' of + Nothing -> skip $ test' (\_ _ -> pure unit) + Just check' -> test' check' main :: Effect Unit main = launchAff_ do diff --git a/test/Ogmios/EvaluateTx.purs b/test/Ogmios/EvaluateTx.purs index 9f2a32821..3047dc4d9 100644 --- a/test/Ogmios/EvaluateTx.purs +++ b/test/Ogmios/EvaluateTx.purs @@ -2,49 +2,94 @@ module Test.Ctl.Ogmios.EvaluateTx (suite) where import Prelude -import Aeson (JsonDecodeError(TypeMismatch), decodeAeson) +import Aeson (JsonDecodeError(TypeMismatch)) +import Contract.Numeric.Natural (Natural, fromBigInt') +import Ctl.Internal.QueryM.JsonRpc2 + ( OgmiosDecodeError(ResultDecodingError) + , decodeOgmios + ) import Ctl.Internal.QueryM.Ogmios ( ExecutionUnits , RedeemerPointer - , TxEvaluationResult + , TxEvaluationFailure(UnparsedError, ScriptFailures) + , TxEvaluationR(TxEvaluationR) + , TxEvaluationResult(TxEvaluationResult) ) import Ctl.Internal.Test.TestPlanM (TestPlanM) -import Ctl.Internal.Types.Natural (fromInt') -import Ctl.Internal.Types.RedeemerTag (RedeemerTag(Mint, Spend)) +import Ctl.Internal.Types.RedeemerTag (RedeemerTag(Spend, Cert, Reward)) import Data.Either (Either(Left, Right)) -import Data.Map (toUnfoldable) as Map -import Data.Newtype (unwrap) +import Data.Map as Map +import Data.Maybe (fromJust) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Aff (Aff) import Effect.Class (liftEffect) +import JS.BigInt as BigInt import Mote (group, test) +import Partial.Unsafe (unsafePartial) import Test.Ctl.Fixtures - ( ogmiosEvaluateTxInvalidPointerFormatFixture + ( ogmiosEvaluateTxFailIncompatibleEraFixture + , ogmiosEvaluateTxFailScriptErrorsFixture + , ogmiosEvaluateTxInvalidPointerFormatFixture , ogmiosEvaluateTxValidRespFixture ) -import Test.Spec.Assertions (shouldEqual, shouldSatisfy) +import Test.Spec.Assertions (shouldSatisfy) suite :: TestPlanM (Aff Unit) Unit suite = do group "Ogmios EvaluateTx endpoint" do group "Decoding EvaluateTx response" do test "Successfully decodes a valid response" do - txEvalR :: Either JsonDecodeError TxEvaluationResult <- - decodeAeson <$> liftEffect ogmiosEvaluateTxValidRespFixture - (Map.toUnfoldable <<< unwrap <$> txEvalR) `shouldEqual` - Right ogmiosEvaluateTxValidRespDecoded + txEvalR :: Either OgmiosDecodeError TxEvaluationR <- + decodeOgmios <$> liftEffect ogmiosEvaluateTxValidRespFixture + txEvalR `shouldSatisfy` case _ of + Right (TxEvaluationR (Right (TxEvaluationResult map))) -> + Map.toUnfoldable map == + ogmiosEvaluateTxValidRespDecoded + _ -> false test "Fails to decode a response with invalid redeemer pointer format" do - txEvalR :: Either JsonDecodeError TxEvaluationResult <- - decodeAeson <$> liftEffect ogmiosEvaluateTxInvalidPointerFormatFixture + txEvalR :: Either OgmiosDecodeError TxEvaluationR <- + decodeOgmios <$> liftEffect + ogmiosEvaluateTxInvalidPointerFormatFixture + txEvalR `shouldSatisfy` case _ of + Left (ResultDecodingError (TypeMismatch _)) -> true + _ -> false + + test "Successfully decodes a failed execution response (Incompatible era)" + do + txEvalR :: Either OgmiosDecodeError TxEvaluationR <- + decodeOgmios <$> liftEffect + ogmiosEvaluateTxFailIncompatibleEraFixture + txEvalR `shouldSatisfy` case _ of + Right (TxEvaluationR (Left (UnparsedError _))) -> true + _ -> false + + test "Successfully decodes a failed execution response (Script errors)" do + txEvalR :: Either OgmiosDecodeError TxEvaluationR <- + decodeOgmios <$> liftEffect + ogmiosEvaluateTxFailScriptErrorsFixture txEvalR `shouldSatisfy` case _ of - Left (TypeMismatch _) -> true + Right (TxEvaluationR (Left (ScriptFailures _))) -> true _ -> false ogmiosEvaluateTxValidRespDecoded :: Array (RedeemerPointer /\ ExecutionUnits) -ogmiosEvaluateTxValidRespDecoded = - [ { redeemerTag: Mint, redeemerIndex: zero } - /\ { memory: fromInt' 1685698, steps: fromInt' 609724445 } +ogmiosEvaluateTxValidRespDecoded = Map.toUnfoldable $ Map.fromFoldable + [ { redeemerTag: Cert, redeemerIndex: one + one + one } + /\ + { memory: naturalLiteral "4926587050210136942" + , steps: naturalLiteral "2982577810151428748" + } , { redeemerTag: Spend, redeemerIndex: one } - /\ { memory: fromInt' 1700, steps: fromInt' 476468 } + /\ + { memory: naturalLiteral "2766916028110716146" + , steps: naturalLiteral "6325731070934221229" + } + , { redeemerTag: Reward, redeemerIndex: zero } + /\ + { memory: naturalLiteral "3603965291794951667" + , steps: naturalLiteral "937555587227912939" + } ] + +naturalLiteral :: String -> Natural +naturalLiteral x = fromBigInt' $ unsafePartial $ fromJust $ BigInt.fromString x diff --git a/test/Ogmios/GenerateFixtures.purs b/test/Ogmios/GenerateFixtures.purs index 3b06818f6..d8c001f3c 100644 --- a/test/Ogmios/GenerateFixtures.purs +++ b/test/Ogmios/GenerateFixtures.purs @@ -4,7 +4,7 @@ module Test.Ctl.Ogmios.GenerateFixtures import Prelude -import Aeson (class DecodeAeson, class EncodeAeson, Aeson, stringifyAeson) +import Aeson (class EncodeAeson, Aeson, encodeAeson, stringifyAeson) import Control.Parallel (parTraverse) import Ctl.Internal.Hashing (md5HashHex) import Ctl.Internal.Helpers (logString) @@ -26,12 +26,15 @@ import Ctl.Internal.QueryM , mkRequestAff , mkWebsocketDispatch ) -import Ctl.Internal.QueryM.JsonWsp (JsonWspCall) +import Ctl.Internal.QueryM.JsonRpc2 (class DecodeOgmios, JsonRpc2Call) import Ctl.Internal.QueryM.Ogmios (mkOgmiosCallType) import Ctl.Internal.ServerConfig (ServerConfig, mkWsUrl) import Data.Either (Either(Left, Right)) import Data.Log.Level (LogLevel(Trace, Debug)) import Data.Map as Map +import Data.Newtype (class Newtype, unwrap, wrap) +import Data.String.Common (replace) +import Data.String.Pattern (Pattern(Pattern), Replacement(Replacement)) import Data.Traversable (for_, traverse_) import Effect (Effect) import Effect.Aff (Aff, Canceler(Canceler), launchAff_, makeAff) @@ -46,8 +49,7 @@ import Node.Path (concat) -- A simple websocket for testing mkWebSocket :: forall (a :: Type) (b :: Type) - . DecodeAeson b - => Show b + . DecodeOgmios b => LogLevel -> ServerConfig -> (Either Error (WebSocket (ListenerSet a b)) -> Effect Unit) @@ -79,26 +81,36 @@ mkWebSocket lvl serverCfg cb = do mkWebSocketAff :: forall (a :: Type) (b :: Type) - . DecodeAeson b - => Show b + . DecodeOgmios b => LogLevel -> ServerConfig -> Aff (WebSocket (ListenerSet a b)) mkWebSocketAff lvl = makeAff <<< map (map (Canceler <<< map liftEffect)) <<< mkWebSocket lvl -data Query = Query (JsonWspCall Unit Aeson) String +data Query = Query (JsonRpc2Call Aeson AesonResponse) String Aeson -mkQuery :: forall (query :: Type). EncodeAeson query => query -> String -> Query -mkQuery query shown = Query queryCall shown - where - queryCall = mkOgmiosCallType - { methodname: "Query" - , args: const { query } - } +newtype AesonResponse = AesonResponse Aeson + +derive instance Newtype AesonResponse _ +instance Show AesonResponse where + show = show <<< unwrap + +instance DecodeOgmios AesonResponse where + decodeOgmios = pure <<< wrap + +mkQueryWithArgs' :: forall a. EncodeAeson a => String -> a -> Query +mkQueryWithArgs' method a = Query + (mkOgmiosCallType { method, params: identity }) + (sanitiseMethod method) + (encodeAeson a) mkQuery' :: String -> Query -mkQuery' query = mkQuery query query +mkQuery' method = mkQueryWithArgs' method {} + +-- | To avoid creating directories, replace slashes with dashes +sanitiseMethod :: String -> String +sanitiseMethod = replace (Pattern "/") (Replacement "-") main :: Effect Unit main = @@ -106,40 +118,29 @@ main = let logLevel = Trace WebSocket ws listeners <- mkWebSocketAff logLevel defaultOgmiosWsConfig - let - addresses = - [ "addr_test1vpfwv0ezc5g8a4mkku8hhy3y3vp92t7s3ul8g778g5yegsgalc6gc" - , "addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla" - , "addr_test1vz5rd5hsead7gcgn6zx6nalqxz6zlvdmg89kswl935dfh8cqn5kcy" - , "addr_test1vrx0w7gndt6gk9svrksmpg23lmwmlcx2w2fre7rk27r8gdcyazwxm" - , "addr_test1vp842vatdp6qxqnhcfhh6w83t6c8c5udhua999slgzwcq2gvgpvm9" - , "addr_test1vrmet2lzexpmw78jpyqkuqs8ktg80x457h6wcnkp3z63etsx3pg70" - , "addr_test1qpsfwsr4eqjfe49md9wpnyp3ws5emf4z3k6xqagvm880zgnk2wgk4" - <> "wl2rz04eaqmq9fnxhyn56az0c4d3unvcvg2yw4qmkmv4t" - , "addr1q9d34spgg2kdy47n82e7x9pdd6vql6d2engxmpj20jmhuc2047yqd4xnh7" - <> "u6u5jp4t0q3fkxzckph4tgnzvamlu7k5psuahzcp" - ] let queries = - [ mkQuery' "currentProtocolParameters" - , mkQuery' "eraSummaries" - , mkQuery' "currentEpoch" - , mkQuery' "systemStart" - , mkQuery' "chainTip" - ] <> flip map addresses \addr -> mkQuery { utxo: [ addr ] } "utxo" - resps <- flip parTraverse queries \(Query qc shown) -> do - resp <- mkRequestAff listeners ws (\_ _ -> pure unit) qc identity unit - pure { resp, query: shown } + [ mkQuery' "queryNetwork/tip" + , mkQuery' "queryNetwork/startTime" + , mkQuery' "queryLedgerState/epoch" + , mkQuery' "queryLedgerState/eraSummaries" + , mkQuery' "queryLedgerState/protocolParameters" + , mkQuery' "queryLedgerState/stakePools" + ] + + resps <- flip parTraverse queries \(Query qc method args) -> do + resp <- mkRequestAff listeners ws (\_ _ -> pure unit) qc identity args + pure { resp, method } - for_ resps \{ resp, query } -> do - let resp' = stringifyAeson resp + for_ resps \{ resp, method } -> do + let resp' = stringifyAeson $ unwrap resp respMd5 <- liftEffect $ md5HashHex resp' let fp = concat [ "fixtures" , "test" , "ogmios" - , query <> "-" <> respMd5 <> ".json" + , method <> "-" <> respMd5 <> ".json" ] writeTextFile UTF8 fp resp' log ("Written " <> fp) diff --git a/test/Parser.purs b/test/Parser.purs deleted file mode 100644 index 934ea1a1a..000000000 --- a/test/Parser.purs +++ /dev/null @@ -1,74 +0,0 @@ -module Test.Ctl.Parser where - -import Prelude - -import Aeson - ( Aeson - , JsonDecodeError - , caseAesonArray - , parseJsonStringToAeson - , stringifyAeson - ) -import Control.Monad.Error.Class (throwError) -import Control.Monad.Except.Trans (ExceptT, runExceptT) -import Control.Monad.Trans.Class (lift) -import Ctl.Internal.QueryM.JsonWsp (JsonWspResponse, parseJsonWspResponse) -import Ctl.Internal.QueryM.Ogmios (UtxoQR) -import Ctl.Internal.Test.TestPlanM (TestPlanM) -import Data.Array as Array -import Data.Either (Either, either, isRight) -import Data.Medea (validate) -import Data.Medea.Loader (LoaderError, loadSchemaFromFile) -import Data.Medea.Schema (Schema) -import Data.Traversable (traverse, traverse_) -import Effect.Aff (Aff) -import Effect.Class (liftEffect) -import Effect.Exception (error, throw) -import Mote (group, test) -import Node.Encoding (Encoding(UTF8)) -import Node.FS.Aff (readTextFile) -import Test.Ctl.Utils (ValidationM, runValidationM) -import Test.Spec.Assertions (shouldNotSatisfy, shouldSatisfy) - -suite :: TestPlanM (Aff Unit) Unit -suite = do - str <- lift $ readTextFile UTF8 - "./fixtures/test/parsing/JsonWsp/UtxoQueryResponse.json" - let - eJson = parseJsonStringToAeson str - json <- either - (\e -> liftEffect $ throw ("json parsed incorrectly " <> show e)) - pure - eJson - let - stringArray = caseAesonArray [] convertJsonArray json :: Array String - jsonStrArray = caseAesonArray [] identity json :: Array Aeson - schema <- lift $ getSchema - "./fixtures/schemata/JsonWsp/UtxoQueryResponse.medea" - group "Parser tests" $ do - group "Schemata parse tests" $ do - test "fixture array should not be empty" $ - stringArray `shouldNotSatisfy` Array.null - test "fixtures match schema - utxoQueryResponse" $ - -- TODO: add a helper function or something so that the error displays the index it occured on, logs out the offending JSON string from the array. - runValidationM (validateJsonArray schema stringArray) `shouldSatisfy` - isRight - group "Type parsing" $ do - test "fixtures parse correctly - UtxoQueryResponse" $ - traverseJsonWsps jsonStrArray `shouldSatisfy` isRight - -traverseJsonWsps - :: Array Aeson -> Either JsonDecodeError (Array (JsonWspResponse UtxoQR)) -traverseJsonWsps arr = traverse parseJsonWspResponse arr - -convertJsonArray :: Array Aeson -> Array String -convertJsonArray arr = map stringifyAeson arr - -getSchema :: String -> Aff Schema -getSchema file = do - (eSchema :: Either LoaderError Schema) <- runExceptT $ - (loadSchemaFromFile file :: ExceptT LoaderError Aff Schema) - either (throwError <<< error <<< show) pure eSchema - -validateJsonArray :: Schema -> Array String -> ValidationM Unit -validateJsonArray scm arr = traverse_ (validate scm) arr diff --git a/test/Partition.purs b/test/Partition.purs index 77b86eb1a..b636be400 100644 --- a/test/Partition.purs +++ b/test/Partition.purs @@ -12,8 +12,6 @@ import Ctl.Internal.Test.TestPlanM (TestPlanM) import Data.Array (elem) as Array import Data.Array.NonEmpty (NonEmptyArray, (:)) import Data.Array.NonEmpty (length, singleton, sort, zip) as NEArray -import Data.BigInt (BigInt) -import Data.BigInt (fromInt) as BigInt import Data.Foldable (all, foldMap, sum) import Data.Maybe (Maybe(Just, Nothing), isNothing) import Data.Newtype (class Newtype, unwrap) @@ -21,10 +19,12 @@ import Data.Ord.Max (Max(Max)) import Data.Ord.Min (Min(Min)) import Data.Tuple.Nested ((/\)) import Effect.Aff (Aff) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt) as BigInt import Mote (group, test) import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary) import Test.QuickCheck.Gen (suchThat) -import Test.Spec.QuickCheck (quickCheck) +import Test.Spec.QuickCheck (quickCheck, quickCheck') suite :: TestPlanM (Aff Unit) Unit suite = @@ -53,13 +53,13 @@ suite = (quickCheck prop_equipartitionBigInt_length) test "prop_equipartitionBigInt_sum" - (quickCheck prop_equipartitionBigInt_sum) + (quickCheck' 10 prop_equipartitionBigInt_sum) test "prop_equipartitionBigInt_order" - (quickCheck prop_equipartitionBigInt_order) + (quickCheck' 10 prop_equipartitionBigInt_order) test "prop_equipartitionBigInt_fair" - (quickCheck prop_equipartitionBigInt_fair) + (quickCheck' 10 prop_equipartitionBigInt_fair) prop_partitionBigInt_pos_weights :: BigInt' -> BigIntNeg -> NonEmptyArray BigIntGeqOne -> Boolean @@ -183,4 +183,3 @@ derive instance Newtype IntGeqOne _ instance Arbitrary IntGeqOne where arbitrary = IntGeqOne <$> suchThat arbitrary (_ >= one) - diff --git a/test/Plutip.purs b/test/Plutip.purs index 0fa163606..d80ff7408 100644 --- a/test/Plutip.purs +++ b/test/Plutip.purs @@ -4,7 +4,7 @@ module Test.Ctl.Plutip import Prelude -import Contract.Test.Plutip (noWallet, testPlutipContracts) +import Contract.Test.Plutip (PlutipConfig, noWallet, testPlutipContracts) import Contract.Test.Utils (exitCode, interruptOnSignal) import Ctl.Internal.Contract.Monad (wrapQueryM) import Ctl.Internal.Plutip.Server @@ -30,10 +30,14 @@ import Effect.Aff ) import Mote (group, test) import Mote.Monad (mapTest) +import Test.Ctl.BalanceTx.ChangeGeneration as ChangeGeneration import Test.Ctl.Plutip.Common (config) import Test.Ctl.Plutip.Contract as Contract import Test.Ctl.Plutip.Contract.Assert as Assert +import Test.Ctl.Plutip.Contract.Mnemonics as Mnemonics import Test.Ctl.Plutip.Contract.NetworkId as NetworkId +import Test.Ctl.Plutip.Contract.OgmiosMempool as OgmiosMempool +import Test.Ctl.Plutip.ExUnits as ExUnits import Test.Ctl.Plutip.Logging as Logging import Test.Ctl.Plutip.UtxoDistribution as UtxoDistribution import Test.Ctl.QueryM.AffInterface as QueryM.AffInterface @@ -47,16 +51,27 @@ main = interruptOnSignal SIGINT =<< launchAff do Utils.interpretWithConfig defaultConfig { timeout = Just $ Milliseconds 70_000.0, exit = true } $ group "Plutip" do + testPlutipContracts config Mnemonics.suite + group "ExUnits - normal limits" do + testPlutipContracts config $ ExUnits.mkFailingSuite 3000 + testPlutipContracts config $ ExUnits.mkSuite 2550 + group "ExUnits - relaxed limits" do + testPlutipContracts configWithMaxExUnits $ ExUnits.mkSuite 3000 testPlutipContracts config Assert.suite Logging.suite testStartPlutipCluster testPlutipContracts config $ do flip mapTest QueryM.AffInterface.suite (noWallet <<< wrapQueryM) - NetworkId.suite + ChangeGeneration.suite Contract.suite UtxoDistribution.suite + testPlutipContracts config OgmiosMempool.suite + +configWithMaxExUnits :: PlutipConfig +configWithMaxExUnits = config + { clusterConfig = config.clusterConfig { raiseExUnitsToMax = true } } testStartPlutipCluster :: TestPlanM (Aff Unit) Unit testStartPlutipCluster = group "Server" do diff --git a/test/Plutip/Common.purs b/test/Plutip/Common.purs index 1f7c7987e..267dc89a7 100644 --- a/test/Plutip/Common.purs +++ b/test/Plutip/Common.purs @@ -5,42 +5,17 @@ module Test.Ctl.Plutip.Common import Prelude -import Contract.Config (emptyHooks) +import Contract.Test.Plutip (defaultPlutipConfig) import Contract.Wallet (privateKeyFromBytes) import Ctl.Internal.Plutip.Types (PlutipConfig) import Ctl.Internal.Types.RawBytes (hexToRawBytes) import Ctl.Internal.Wallet.Key (PrivateStakeKey) -import Data.Log.Level (LogLevel(Trace)) -import Data.Maybe (Maybe(Nothing), fromJust) +import Data.Maybe (fromJust) import Data.Newtype (wrap) -import Data.Time.Duration (Seconds(Seconds)) -import Data.UInt (fromInt) as UInt import Partial.Unsafe (unsafePartial) config :: PlutipConfig -config = - { host: "127.0.0.1" - , port: UInt.fromInt 8082 - , logLevel: Trace - -- Server configs are used to deploy the corresponding services. - , ogmiosConfig: - { port: UInt.fromInt 1338 - , host: "127.0.0.1" - , secure: false - , path: Nothing - } - , kupoConfig: - { port: UInt.fromInt 1443 - , host: "127.0.0.1" - , secure: false - , path: Nothing - } - , suppressLogs: true - , customLogger: Nothing - , hooks: emptyHooks - , clusterConfig: - { slotLength: Seconds 0.1 } - } +config = defaultPlutipConfig privateStakeKey :: PrivateStakeKey privateStakeKey = wrap $ unsafePartial $ fromJust diff --git a/test/Plutip/Contract.purs b/test/Plutip/Contract.purs index df9daf084..703d1b6dd 100644 --- a/test/Plutip/Contract.purs +++ b/test/Plutip/Contract.purs @@ -9,10 +9,6 @@ import Contract.Address , PubKeyHash(PubKeyHash) , StakePubKeyHash , getNetworkId - , getWalletAddresses - , getWalletCollateral - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes , scriptHashAddress ) import Contract.AuxiliaryData (setGeneralTxMetadata) @@ -20,7 +16,11 @@ import Contract.BalanceTxConstraints ( BalanceTxConstraintsBuilder , mustUseAdditionalUtxos ) as BalanceTxConstraints -import Contract.Chain (currentTime) +import Contract.BalanceTxConstraints + ( mustNotSpendUtxosWithOutRefs + , mustUseCollateralUtxos + ) +import Contract.Chain (currentTime, waitUntilSlot) import Contract.Hashing (datumHash, nativeScriptHash) import Contract.Log (logInfo') import Contract.Metadata @@ -28,7 +28,8 @@ import Contract.Metadata , TransactionMetadatum(Text) , TransactionMetadatumLabel(TransactionMetadatumLabel) ) -import Contract.Monad (Contract, liftContractE, liftContractM, liftedE, liftedM) +import Contract.Monad (Contract, liftContractE, liftContractM, liftedM) +import Contract.Numeric.BigNum as BigNum import Contract.PlutusData ( Datum(Datum) , PlutusData(Bytes, Integer, List) @@ -38,8 +39,12 @@ import Contract.PlutusData , getDatumsByHashesWithErrors , unitRedeemer ) -import Contract.Prelude (mconcat) -import Contract.Prim.ByteArray (byteArrayFromAscii, hexToByteArrayUnsafe) +import Contract.Prelude (liftM, mconcat) +import Contract.Prim.ByteArray + ( byteArrayFromAscii + , hexToByteArrayUnsafe + , hexToRawBytes + ) import Contract.ScriptLookups as Lookups import Contract.Scripts ( ValidatorHash @@ -57,11 +62,10 @@ import Contract.Test.Plutip , withStakeKey , withWallets ) -import Contract.Time (getEraSummaries) +import Contract.Time (Slot(Slot), getEraSummaries) import Contract.Transaction - ( BalanceTxError(BalanceInsufficientError) + ( BalanceTxError(BalanceInsufficientError, InsufficientCollateralUtxos) , DataHash - , InvalidInContext(InvalidInContext) , NativeScript(ScriptPubkey, ScriptNOfK, ScriptAll) , OutputDatum(OutputDatumHash, NoOutputDatum, OutputDatum) , ScriptRef(PlutusScriptRef, NativeScriptRef) @@ -70,7 +74,9 @@ import Contract.Transaction , TransactionOutput(TransactionOutput) , awaitTxConfirmed , balanceTx + , balanceTxE , balanceTxWithConstraints + , balanceTxWithConstraintsE , createAdditionalUtxos , getTxMetadata , signTransaction @@ -81,13 +87,25 @@ import Contract.Transaction ) import Contract.TxConstraints (TxConstraints) import Contract.TxConstraints as Constraints -import Contract.Utxos (UtxoMap, getWalletBalance, utxosAt) +import Contract.UnbalancedTx (mkUnbalancedTx, mkUnbalancedTxE) +import Contract.Utxos (UtxoMap, utxosAt) import Contract.Value (Coin(Coin), Value, coinToValue) import Contract.Value as Value -import Contract.Wallet (getWalletUtxos, isWalletAvailable, withKeyWallet) +import Contract.Wallet + ( getWalletAddresses + , getWalletBalance + , getWalletCollateral + , getWalletUtxos + , isWalletAvailable + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + , privateKeyFromBytes + , withKeyWallet + ) import Control.Monad.Error.Class (try) import Control.Monad.Trans.Class (lift) import Control.Parallel (parallel, sequential) +import Ctl.Examples.AdditionalUtxos (contract) as AdditionalUtxos import Ctl.Examples.AlwaysMints (alwaysMintsPolicy) import Ctl.Examples.AlwaysSucceeds as AlwaysSucceeds import Ctl.Examples.AwaitTxConfirmedWithTimeout as AwaitTxConfirmedWithTimeout @@ -102,6 +120,7 @@ import Ctl.Examples.Helpers ) import Ctl.Examples.IncludeDatum as IncludeDatum import Ctl.Examples.Lose7Ada as AlwaysFails +import Ctl.Examples.ManyAssets as ManyAssets import Ctl.Examples.MintsMultipleTokens ( mintingPolicyRdmrInt1 , mintingPolicyRdmrInt2 @@ -139,24 +158,25 @@ import Ctl.Internal.Wallet ( WalletExtension(NamiWallet, GeroWallet, FlintWallet, NuFiWallet) ) import Ctl.Internal.Wallet.Cip30Mock - ( WalletMock(MockNami, MockGero, MockFlint, MockNuFi) + ( WalletMock(MockNami, MockGero, MockFlint, MockNuFi, MockGenericCip30) , withCip30Mock ) import Data.Array (head, (!!)) -import Data.BigInt as BigInt -import Data.Either (Either(Left, Right), isLeft, isRight) +import Data.Either (Either(Left, Right), hush, isLeft, isRight) import Data.Foldable (fold, foldM, length) import Data.Lens (view) import Data.Map as Map -import Data.Maybe (Maybe(Just, Nothing), isJust) +import Data.Maybe (Maybe(Just, Nothing), fromJust, fromMaybe, isJust) import Data.Newtype (unwrap, wrap) import Data.Traversable (traverse, traverse_) import Data.Tuple (Tuple(Tuple)) import Data.Tuple.Nested (type (/\), (/\)) import Data.UInt (UInt) import Effect.Class (liftEffect) -import Effect.Exception (throw) -import Mote (group, test) +import Effect.Exception (error, throw) +import JS.BigInt as BigInt +import Mote (group, skip, test) +import Partial.Unsafe (unsafePartial) import Safe.Coerce (coerce) import Test.Ctl.Fixtures ( cip25MetadataFixture1 @@ -178,7 +198,181 @@ import Test.Spec.Assertions (shouldEqual, shouldNotEqual, shouldSatisfy) suite :: TestPlanM ContractTest Unit suite = do + group "WaitUntilSlot" do + test "wait for slot far in the future" do + withWallets unit \_ -> do + -- Plutip increases last known slot by 80 at a time + void $ waitUntilSlot $ Slot $ BigNum.fromInt 10 + void $ waitUntilSlot $ Slot $ BigNum.fromInt 160 + void $ waitUntilSlot $ Slot $ BigNum.fromInt 161 + void $ waitUntilSlot $ Slot $ BigNum.fromInt 241 + group "Regressions" do + skip $ test + "#1441 - Mint many assets at once - fails with TooManyAssetsInOutput" + do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1000_000_000 + , BigInt.fromInt 2000_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice ManyAssets.contract + test + "#1509 - Collateral set to one of the inputs in mustNotSpendUtxosWithOutRefs " + do + let + someUtxos = + [ BigInt.fromInt 5_000_000 + , BigInt.fromInt 5_000_000 + ] + + withWallets someUtxos \alice -> do + withKeyWallet alice do + pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet alice + ownPaymentPubKeyHashes + stakePkh <- join <<< head <$> withKeyWallet alice + ownStakePubKeyHashes + utxos <- fromMaybe Map.empty <$> getWalletUtxos + let + constraints :: Constraints.TxConstraints + constraints = mustPayToPubKeyStakeAddress pkh stakePkh + $ Value.lovelaceValueOf + $ BigInt.fromInt 2_000_000 + + lookups :: Lookups.ScriptLookups + lookups = mempty + ubTx <- mkUnbalancedTx lookups constraints + res <- + ( balanceTxWithConstraintsE ubTx + (mustNotSpendUtxosWithOutRefs $ Map.keys utxos) + ) + res `shouldSatisfy` isLeft + + test "#1480 - test that does nothing but fails" do + let + someUtxos = + [ BigInt.fromInt 2_000_000 + , BigInt.fromInt 3_000_000 + ] + + privateStakeKey1 = + wrap $ unsafePartial $ fromJust + $ privateKeyFromBytes =<< hexToRawBytes + "63361c4c4a075a538d37e062c1ed0706d3f0a94b013708e8f5ab0a0ca1df163d" + + privateStakeKey2 = + wrap $ unsafePartial $ fromJust + $ privateKeyFromBytes =<< hexToRawBytes + "6ffb1c4c4a075a538d37e062c1ed0706d3f0a94b013708e8f5ab0a0ca1df163d" + + distribution = + [ withStakeKey privateStakeKey someUtxos + , withStakeKey privateStakeKey1 someUtxos + , withStakeKey privateStakeKey2 someUtxos + ] + + withWallets distribution \_ → pure unit + group "Contract interface" do + test + "mustUseCollateralUtxos should not fail if enough UTxOs are provided" + do + let + someUtxos = + [ BigInt.fromInt 5_000_000 + , BigInt.fromInt 5_000_000 + ] + withWallets (someUtxos /\ someUtxos) \(alice /\ bob) -> do + bobsCollateral <- withKeyWallet bob do + fromMaybe Map.empty <$> getWalletUtxos + withKeyWallet alice do + + validator <- AlwaysSucceeds.alwaysSucceedsScript + let vhash = validatorHash validator + logInfo' "Attempt to lock value" + txId <- AlwaysSucceeds.payToAlwaysSucceeds vhash + awaitTxConfirmed txId + logInfo' "Try to spend locked values" + + let + scriptAddress = scriptHashAddress vhash Nothing + utxos <- utxosAt scriptAddress + txInput <- + liftM + ( error + ( "The id " + <> show txId + <> " does not have output locked at: " + <> show scriptAddress + ) + ) + (view _input <$> head (lookupTxHash txId utxos)) + let + lookups :: Lookups.ScriptLookups + lookups = Lookups.validator validator + <> Lookups.unspentOutputs utxos + + constraints :: TxConstraints + constraints = + Constraints.mustSpendScriptOutput txInput unitRedeemer + + ubTx <- mkUnbalancedTx lookups constraints + res <- + ( balanceTxWithConstraintsE ubTx + $ mustUseCollateralUtxos bobsCollateral + ) + res `shouldSatisfy` isRight + + test + "mustUseCollateralUtxos should fail if not enough UTxOs are provided" + do + let + someUtxos = + [ BigInt.fromInt 5_000_000 + , BigInt.fromInt 5_000_000 + ] + withWallets someUtxos \alice -> do + withKeyWallet alice do + + validator <- AlwaysSucceeds.alwaysSucceedsScript + let vhash = validatorHash validator + logInfo' "Attempt to lock value" + txId <- AlwaysSucceeds.payToAlwaysSucceeds vhash + awaitTxConfirmed txId + logInfo' "Try to spend locked values" + + let + scriptAddress = scriptHashAddress vhash Nothing + utxos <- utxosAt scriptAddress + txInput <- + liftM + ( error + ( "The id " + <> show txId + <> " does not have output locked at: " + <> show scriptAddress + ) + ) + (view _input <$> head (lookupTxHash txId utxos)) + let + lookups :: Lookups.ScriptLookups + lookups = Lookups.validator validator + <> Lookups.unspentOutputs utxos + + constraints :: TxConstraints + constraints = + Constraints.mustSpendScriptOutput txInput unitRedeemer + + ubTx <- mkUnbalancedTx lookups constraints + res <- + ( balanceTxWithConstraintsE ubTx + $ mustUseCollateralUtxos Map.empty + ) + res `shouldSatisfy` case _ of + Left (InsufficientCollateralUtxos mp) -> Map.isEmpty mp + _ -> false + test "Collateral selection: UTxO with lower amount is selected" do let distribution :: InitialUTxOs /\ InitialUTxOs @@ -214,8 +408,8 @@ suite = do withWallets distribution \alice -> do checkUtxoDistribution distribution alice pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet alice - ownPaymentPubKeysHashes - stakePkh <- join <<< head <$> withKeyWallet alice ownStakePubKeysHashes + ownPaymentPubKeyHashes + stakePkh <- join <<< head <$> withKeyWallet alice ownStakePubKeyHashes withKeyWallet alice $ pkh2PkhContract pkh stakePkh test @@ -231,9 +425,9 @@ suite = do withWallets distribution \alice -> do checkUtxoDistribution distribution alice pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet alice - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes stakePkh <- join <<< head <$> withKeyWallet alice - ownStakePubKeysHashes + ownStakePubKeyHashes stakePkh `shouldSatisfy` isJust withKeyWallet alice $ pkh2PkhContract pkh stakePkh @@ -258,15 +452,15 @@ suite = do sequential ado parallel $ withKeyWallet alice do pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet bob - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes stakePkh <- join <<< head <$> withKeyWallet bob - ownStakePubKeysHashes + ownStakePubKeyHashes pkh2PkhContract pkh stakePkh parallel $ withKeyWallet bob do pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet alice - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes stakePkh <- join <<< head <$> withKeyWallet alice - ownStakePubKeysHashes + ownStakePubKeyHashes pkh2PkhContract pkh stakePkh in unit @@ -291,16 +485,16 @@ suite = do sequential ado parallel $ withKeyWallet alice do pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet bob - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes stakePkh <- join <<< head <$> withKeyWallet bob - ownStakePubKeysHashes + ownStakePubKeyHashes pkh2PkhContract pkh stakePkh parallel $ withKeyWallet bob do pkh <- liftedM "Failed to get PKH" $ head <$> withKeyWallet alice - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes stakePkh <- join <<< head <$> withKeyWallet alice - ownStakePubKeysHashes + ownStakePubKeyHashes pkh2PkhContract pkh stakePkh in unit @@ -334,14 +528,14 @@ suite = do withWallets distribution \(alice /\ bob /\ charlie /\ dan) -> do alicePaymentPKH <- liftedM "Unable to get Alice's PKH" $ - (coerce <<< head) <$> withKeyWallet alice ownPaymentPubKeysHashes + (coerce <<< head) <$> withKeyWallet alice ownPaymentPubKeyHashes bobPaymentPKH <- liftedM "Unable to get Bob's PKH" $ - (coerce <<< head) <$> withKeyWallet bob ownPaymentPubKeysHashes + (coerce <<< head) <$> withKeyWallet bob ownPaymentPubKeyHashes charliePaymentPKH <- liftedM "Unable to get Charlie's PKH" $ (coerce <<< head) <$> withKeyWallet charlie - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes danPaymentPKH <- liftedM "Unable to get Dan's PKH" $ - (coerce <<< head) <$> withKeyWallet dan ownPaymentPubKeysHashes + (coerce <<< head) <$> withKeyWallet dan ownPaymentPubKeyHashes let nativeScript = ScriptAll [ ScriptPubkey alicePaymentPKH @@ -354,16 +548,16 @@ suite = do -- Alice locks 10 ADA at mutlisig script txId <- withKeyWallet alice do let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToNativeScript nsHash $ Value.lovelaceValueOf $ BigInt.fromInt 10_000_000 - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - bsTx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + bsTx <- signTransaction =<< balanceTx ubTx txId <- submit bsTx awaitTxConfirmed txId pure txId @@ -379,7 +573,7 @@ suite = do txInput <- liftContractM "Unable to get UTxO" $ view _input <$> lookupTxHash txId utxos !! 0 let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToPubKey (coerce alicePaymentPKH) (Value.lovelaceValueOf $ BigInt.fromInt 10_000_000) @@ -397,11 +591,11 @@ suite = do -- the script itself, so we know how much space to allocate -- for signatures on fee calculation stage. - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.unspentOutputs utxos - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - tx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + tx <- signTransaction =<< balanceTx ubTx let signWithWallet txToSign wallet = withKeyWallet wallet (signTransaction txToSign) @@ -431,14 +625,14 @@ suite = do withWallets distribution \(alice /\ bob /\ charlie /\ dan) -> do alicePaymentPKH <- liftedM "Unable to get Alice's PKH" $ - (coerce <<< head) <$> withKeyWallet alice ownPaymentPubKeysHashes + (coerce <<< head) <$> withKeyWallet alice ownPaymentPubKeyHashes bobPaymentPKH <- liftedM "Unable to get Bob's PKH" $ - (coerce <<< head) <$> withKeyWallet bob ownPaymentPubKeysHashes + (coerce <<< head) <$> withKeyWallet bob ownPaymentPubKeyHashes charliePaymentPKH <- liftedM "Unable to get Charlie's PKH" $ (coerce <<< head) <$> withKeyWallet charlie - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes danPaymentPKH <- liftedM "Unable to get Dan's PKH" $ - (coerce <<< head) <$> withKeyWallet dan ownPaymentPubKeysHashes + (coerce <<< head) <$> withKeyWallet dan ownPaymentPubKeyHashes let nativeScript = ScriptNOfK 2 [ ScriptPubkey alicePaymentPKH @@ -451,16 +645,16 @@ suite = do -- Alice locks 10 ADA at mutlisig script txId <- withKeyWallet alice do let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToNativeScript nsHash $ Value.lovelaceValueOf $ BigInt.fromInt 10_000_000 - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - bsTx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + bsTx <- signTransaction =<< balanceTx ubTx txId <- submit bsTx awaitTxConfirmed txId pure txId @@ -477,19 +671,19 @@ suite = do txInput <- liftContractM "Unable to get UTxO" $ view _input <$> lookupTxHash txId utxos !! 0 let - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = Constraints.mustPayToPubKey (coerce alicePaymentPKH) (Value.lovelaceValueOf $ BigInt.fromInt 10_000_000) <> Constraints.mustSpendNativeScriptOutput txInput nativeScript - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.unspentOutputs utxos - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + ubTx <- mkUnbalancedTx lookups constraints -- Bob signs the tx - tx <- signTransaction =<< liftedE (balanceTx ubTx) + tx <- signTransaction =<< balanceTx ubTx let signWithWallet txToSign wallet = withKeyWallet wallet (signTransaction txToSign) @@ -507,22 +701,22 @@ suite = do withWallets distribution \alice -> do withKeyWallet alice do mp <- alwaysMintsPolicy - cs <- liftContractM "Cannot get cs" $ Value.scriptCurrencySymbol mp + let cs = Value.scriptCurrencySymbol mp tn <- liftContractM "Cannot make token name" $ Value.mkTokenName =<< byteArrayFromAscii "TheToken" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue $ Value.singleton cs tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - bsTx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + bsTx <- signTransaction =<< balanceTx ubTx submitAndLog bsTx test "mustProduceAtLeast spends native token" do @@ -541,12 +735,12 @@ suite = do -- Minting let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue $ Value.singleton cs tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txHash <- submitTxFromConstraints lookups constraints @@ -555,10 +749,10 @@ suite = do -- Spending same amount pkh <- - liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes let - constraints' :: Constraints.TxConstraints Void Void + constraints' :: Constraints.TxConstraints constraints' = Constraints.mustProduceAtLeast $ Value.singleton cs tn $ BigInt.fromInt 100 @@ -583,12 +777,12 @@ suite = do -- Minting let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue $ Value.singleton cs tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txHash <- submitTxFromConstraints lookups constraints @@ -597,17 +791,17 @@ suite = do -- Spending more than minted amount pkh <- - liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes let - constraints' :: Constraints.TxConstraints Void Void + constraints' :: Constraints.TxConstraints constraints' = Constraints.mustProduceAtLeast $ Value.singleton cs tn $ BigInt.fromInt 101 lookups' = lookups <> Lookups.ownPaymentPubKeyHash pkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups' constraints' - result <- balanceTx ubTx + ubTx <- mkUnbalancedTx lookups' constraints' + result <- balanceTxE ubTx result `shouldSatisfy` isLeft test "mustSpendAtLeast succeeds to spend" do @@ -626,12 +820,12 @@ suite = do -- Minting let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue $ Value.singleton cs tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txHash <- submitTxFromConstraints lookups constraints @@ -640,10 +834,10 @@ suite = do -- Spending same amount pkh <- - liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes let - constraints' :: Constraints.TxConstraints Void Void + constraints' :: Constraints.TxConstraints constraints' = Constraints.mustSpendAtLeast $ Value.singleton cs tn $ BigInt.fromInt 100 @@ -668,12 +862,12 @@ suite = do -- Minting let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue $ Value.singleton cs tn $ BigInt.fromInt 100 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp txHash <- submitTxFromConstraints lookups constraints @@ -682,17 +876,17 @@ suite = do -- Spending more than minted amount pkh <- - liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes + liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes let - constraints' :: Constraints.TxConstraints Void Void + constraints' :: Constraints.TxConstraints constraints' = Constraints.mustSpendAtLeast $ Value.singleton cs tn $ BigInt.fromInt 101 lookups' = lookups <> Lookups.ownPaymentPubKeyHash pkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups' constraints' - result <- balanceTx ubTx + ubTx <- mkUnbalancedTx lookups' constraints' + result <- balanceTxE ubTx result `shouldSatisfy` isLeft test "Minting using NativeScript (multisig) as a policy" do @@ -763,7 +957,7 @@ suite = do Constraints.DatumWitness (Value.lovelaceValueOf $ BigInt.fromInt 1_000_000) - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = mempty submitTxFromConstraints lookups constraints @@ -840,17 +1034,17 @@ suite = do withWallets distribution \alice -> do withKeyWallet alice do let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mempty - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty givenMetadata = GeneralTransactionMetadata $ Map.fromFoldable [ TransactionMetadatumLabel (BigInt.fromInt 8) /\ Text "foo" ] - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + ubTx <- mkUnbalancedTx lookups constraints ubTx' <- setGeneralTxMetadata ubTx givenMetadata - bsTx <- signTransaction =<< liftedE (balanceTx ubTx') + bsTx <- signTransaction =<< balanceTx ubTx' txId <- submit bsTx awaitTxConfirmed txId @@ -872,16 +1066,16 @@ suite = do mp2 /\ _ <- mkCurrencySymbol alwaysMintsPolicyV2 let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustMintCurrency (mintingPolicyHash mp1) tn1 zero , Constraints.mustMintCurrency (mintingPolicyHash mp2) tn1 one ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp1 <> Lookups.mintingPolicy mp2 - result <- Lookups.mkUnbalancedTx lookups constraints + result <- mkUnbalancedTxE lookups constraints result `shouldSatisfy` isLeft test "Minting multiple tokens in a single transaction" do @@ -900,7 +1094,7 @@ suite = do mp3 /\ cs3 <- mkCurrencySymbol mintingPolicyRdmrInt3 let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mconcat [ Constraints.mustMintValueWithRedeemer (Redeemer $ Integer (BigInt.fromInt 1)) @@ -913,14 +1107,14 @@ suite = do (Value.singleton cs3 tn1 one <> Value.singleton cs3 tn2 one) ] - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp1 <> Lookups.mintingPolicy mp2 <> Lookups.mintingPolicy mp3 - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - bsTx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + bsTx <- signTransaction =<< balanceTx ubTx submitAndLog bsTx test "Multi-signature transaction" do @@ -945,6 +1139,26 @@ suite = do checkUtxoDistribution distribution alice withKeyWallet alice signMultipleContract + test "AdditionalUtxos example" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 10_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> + withKeyWallet alice $ AdditionalUtxos.contract false + + test "Handles AdditionalUtxoOverlap exception (AdditionalUtxos example)" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 10_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> + withKeyWallet alice $ AdditionalUtxos.contract true + test "Locking & unlocking on an always succeeding script (AlwaysSucceeds example)" do @@ -1006,7 +1220,7 @@ suite = do withWallets distribution \alice -> do alicePkh <- withKeyWallet alice do - liftedM "Could not get own PKH" (head <$> ownPaymentPubKeysHashes) + liftedM "Could not get own PKH" (head <$> ownPaymentPubKeyHashes) validator <- AlwaysSucceeds.alwaysSucceedsScript @@ -1070,7 +1284,7 @@ suite = do value :: Value.Value value = Value.lovelaceValueOf $ BigInt.fromInt 50_000_000 - constraints :: TxConstraints Unit Unit + constraints :: TxConstraints constraints = fold [ Constraints.mustSpendScriptOutput (view _input alwaysSucceedsUtxo) @@ -1078,7 +1292,7 @@ suite = do , Constraints.mustPayToPubKey alicePkh value ] - lookups :: Lookups.ScriptLookups PlutusData + lookups :: Lookups.ScriptLookups lookups = Lookups.validator validator <> Lookups.unspentOutputs additionalUtxos @@ -1089,16 +1303,14 @@ suite = do balanceTxConstraints = BalanceTxConstraints.mustUseAdditionalUtxos additionalUtxos - unbalancedTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - balanceTxWithConstraints unbalancedTx balanceTxConstraints + unbalancedTx <- mkUnbalancedTx lookups constraints + balanceTxWithConstraintsE unbalancedTx balanceTxConstraints let hasInsufficientBalance :: forall (a :: Type). Either BalanceTxError a -> Boolean hasInsufficientBalance = case _ of - Left (BalanceInsufficientError _ _ (InvalidInContext amount)) - | amount == Value.lovelaceValueOf (BigInt.fromInt 50_000_000) -> - true + Left (BalanceInsufficientError _ _) -> true _ -> false balanceWithDatum NoOutputDatum >>= flip shouldSatisfy isRight @@ -1279,12 +1491,12 @@ suite = do withWallets distribution \(alice /\ seed) -> do alicePkh /\ aliceStakePkh <- withKeyWallet alice do pkh <- liftedM "Failed to get PKH" $ head <$> - ownPaymentPubKeysHashes - stakePkh <- join <<< head <$> ownStakePubKeysHashes + ownPaymentPubKeyHashes + stakePkh <- join <<< head <$> ownStakePubKeyHashes pure $ pkh /\ stakePkh mp <- alwaysMintsPolicy - cs <- liftContractM "Cannot get cs" $ Value.scriptCurrencySymbol mp + let cs = Value.scriptCurrencySymbol mp tn <- liftContractM "Cannot make token name" $ byteArrayFromAscii "TheToken" >>= Value.mkTokenName let asset = Value.singleton cs tn $ BigInt.fromInt 50 @@ -1295,7 +1507,7 @@ suite = do txId <- withKeyWallet seed do logInfo' "Minting asset to Alice" let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = Constraints.mustMintValue (asset <> asset) <> mustPayToPubKeyStakeAddress alicePkh aliceStakePkh ( asset <> @@ -1306,11 +1518,11 @@ suite = do (Value.lovelaceValueOf $ BigInt.fromInt 50_000_000) ) - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.mintingPolicy mp - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - bsTx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + bsTx <- signTransaction =<< balanceTx ubTx submit bsTx >>= awaitTxConfirmed logInfo' "Attempt to lock value" @@ -1398,8 +1610,8 @@ suite = do withWallets distribution \(alice /\ bob) -> do receiverPkh <- liftedM "Unable to get Bob's PKH" $ - head <$> withKeyWallet bob ownPaymentPubKeysHashes - receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeysHashes + head <$> withKeyWallet bob ownPaymentPubKeyHashes + receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeyHashes mintingPolicy /\ cs <- mkCurrencySymbol alwaysMintsPolicyV2 @@ -1459,10 +1671,10 @@ suite = do withWallets distribution \alice -> do withKeyWallet alice do pkh <- liftedM "Failed to get PKH" $ head <$> - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes let - constraints0 :: TxConstraints Unit Unit + constraints0 :: TxConstraints constraints0 = Constraints.mustPayToPubKeyWithScriptRef pkh @@ -1499,11 +1711,10 @@ suite = do (NativeScriptRef nativeScriptFixture7) (Value.lovelaceValueOf $ BigInt.fromInt 10_000_000) - lookups0 :: Lookups.ScriptLookups PlutusData + lookups0 :: Lookups.ScriptLookups lookups0 = mempty - unbalancedTx0 <- - liftedE $ Lookups.mkUnbalancedTx lookups0 constraints0 + unbalancedTx0 <- mkUnbalancedTx lookups0 constraints0 withBalancedTx unbalancedTx0 \balancedTx0 -> do balancedSignedTx0 <- signTransaction balancedTx0 @@ -1514,12 +1725,12 @@ suite = do length additionalUtxos `shouldNotEqual` 0 let - constraints1 :: TxConstraints Unit Unit + constraints1 :: TxConstraints constraints1 = Constraints.mustPayToPubKey pkh (Value.lovelaceValueOf $ BigInt.fromInt 70_000_000) - lookups1 :: Lookups.ScriptLookups PlutusData + lookups1 :: Lookups.ScriptLookups lookups1 = Lookups.unspentOutputs additionalUtxos balanceTxConstraints @@ -1527,11 +1738,9 @@ suite = do balanceTxConstraints = BalanceTxConstraints.mustUseAdditionalUtxos additionalUtxos - unbalancedTx1 <- - liftedE $ Lookups.mkUnbalancedTx lookups1 constraints1 - balancedTx1 <- - liftedE $ balanceTxWithConstraints unbalancedTx1 - balanceTxConstraints + unbalancedTx1 <- mkUnbalancedTx lookups1 constraints1 + balancedTx1 <- balanceTxWithConstraints unbalancedTx1 + balanceTxConstraints balancedSignedTx1 <- signTransaction balancedTx1 txId0 <- submit balancedSignedTx0 @@ -1554,13 +1763,13 @@ suite = do withWallets distribution \alice -> do withKeyWallet alice do pkh <- liftedM "Failed to get PKH" $ head <$> - ownPaymentPubKeysHashes + ownPaymentPubKeyHashes wUtxos0 <- liftedM "Failed to get wallet UTXOs" getWalletUtxos logInfo' $ "wUtxos0 " <> show wUtxos0 mp <- alwaysMintsPolicyV2 - cs <- liftContractM "Cannot get cs" $ Value.scriptCurrencySymbol mp + let cs = Value.scriptCurrencySymbol mp tn <- liftContractM "Cannot make token name" $ byteArrayFromAscii "TheToken" >>= Value.mkTokenName @@ -1599,7 +1808,7 @@ suite = do , Integer $ BigInt.fromInt 7295143 ] - constraints0 :: TxConstraints Unit Unit + constraints0 :: TxConstraints constraints0 = Constraints.mustPayToPubKeyWithDatumAndScriptRef pkh @@ -1622,11 +1831,10 @@ suite = do let datumLookup = Lookups.datum datum' let - lookups0 :: Lookups.ScriptLookups PlutusData + lookups0 :: Lookups.ScriptLookups lookups0 = Lookups.mintingPolicy mp <> datumLookup - unbalancedTx0 <- - liftedE $ Lookups.mkUnbalancedTx lookups0 constraints0 + unbalancedTx0 <- mkUnbalancedTx lookups0 constraints0 withBalancedTx unbalancedTx0 \balancedTx0 -> do balancedSignedTx0 <- signTransaction balancedTx0 @@ -1637,13 +1845,13 @@ suite = do length additionalUtxos `shouldNotEqual` 0 let - constraints1 :: TxConstraints Unit Unit + constraints1 :: TxConstraints constraints1 = Constraints.mustPayToPubKey pkh $ Value.lovelaceValueOf (BigInt.fromInt 60_000_000) <> Value.singleton cs tn (BigInt.fromInt 50) - lookups1 :: Lookups.ScriptLookups PlutusData + lookups1 :: Lookups.ScriptLookups lookups1 = Lookups.unspentOutputs additionalUtxos balanceTxConstraints @@ -1651,11 +1859,9 @@ suite = do balanceTxConstraints = BalanceTxConstraints.mustUseAdditionalUtxos additionalUtxos - unbalancedTx1 <- - liftedE $ Lookups.mkUnbalancedTx lookups1 constraints1 - balancedTx1 <- - liftedE $ balanceTxWithConstraints unbalancedTx1 - balanceTxConstraints + unbalancedTx1 <- mkUnbalancedTx lookups1 constraints1 + balancedTx1 <- balanceTxWithConstraints unbalancedTx1 + balanceTxConstraints balancedSignedTx1 <- signTransaction balancedTx1 txId0 <- submit balancedSignedTx0 @@ -1691,154 +1897,158 @@ suite = do args result `shouldEqual` (unwrap fullyAppliedScriptFixture) - group "CIP-30 mock interface" do - test "Wallet cleanup" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - try (liftEffect $ isWalletAvailable NamiWallet) >>= flip shouldSatisfy - isLeft - try (liftEffect $ isWalletAvailable GeroWallet) >>= flip shouldSatisfy - isLeft - try (liftEffect $ isWalletAvailable FlintWallet) >>= flip - shouldSatisfy - isLeft - try (liftEffect $ isWalletAvailable NuFiWallet) >>= flip shouldSatisfy - isLeft - - withCip30Mock alice MockNami do - (liftEffect $ isWalletAvailable NamiWallet) >>= shouldEqual true - try (liftEffect $ isWalletAvailable NamiWallet) >>= flip shouldSatisfy - isLeft - - withCip30Mock alice MockGero do - (liftEffect $ isWalletAvailable GeroWallet) >>= shouldEqual true - try (liftEffect $ isWalletAvailable GeroWallet) >>= flip shouldSatisfy - isLeft - - withCip30Mock alice MockFlint do - (liftEffect $ isWalletAvailable FlintWallet) >>= shouldEqual true - try (liftEffect $ isWalletAvailable FlintWallet) >>= flip - shouldSatisfy - isLeft - - withCip30Mock alice MockNuFi do - (liftEffect $ isWalletAvailable NuFiWallet) >>= shouldEqual true - try (liftEffect $ isWalletAvailable NuFiWallet) >>= flip shouldSatisfy - isLeft - - test "Collateral selection returns UTxO with smaller amount" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - withCip30Mock alice MockNami do - getWalletCollateral >>= liftEffect <<< case _ of - Nothing -> throw "Unable to get collateral" - Just - [ TransactionUnspentOutput - { output: TransactionOutputWithRefScript { output } } - ] -> do - let amount = (unwrap output).amount - unless - (amount == lovelaceValueOf (BigInt.fromInt 50_000_000)) - $ throw "Wrong UTxO selected as collateral" - Just _ -> do - throw $ "More than one UTxO in collateral. " <> - "Not a bug, but unexpected in this test, please update it." - - test "Get own UTxOs" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - utxos <- withCip30Mock alice MockNami do - getWalletUtxos - utxos `shouldSatisfy` isJust + group "CIP-30 mock interface" do + test "Wallet cleanup" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do - test "Get own address" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - mockAddress <- withCip30Mock alice MockNami do - mbAddr <- head <$> getWalletAddresses - mbAddr `shouldSatisfy` isJust - pure mbAddr - kwAddress <- head <$> withKeyWallet alice do - getWalletAddresses - mockAddress `shouldEqual` kwAddress - - test "Payment key hash to payment key hash Tx" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - withCip30Mock alice MockNami do - pkh <- liftedM "Failed to get PKH" $ head <$> - ownPaymentPubKeysHashes - stakePkh <- join <<< head <$> ownStakePubKeysHashes - pkh2PkhContract pkh stakePkh + withCip30Mock alice MockNami do + (liftEffect $ isWalletAvailable NamiWallet) >>= shouldEqual true + try (liftEffect $ isWalletAvailable NamiWallet) >>= hush >>> shouldEqual + (Just false) - test "getWalletBalance works" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - withKeyWallet alice do - getWalletBalance >>= flip shouldSatisfy - ( eq $ Just $ coinToValue $ Coin $ BigInt.fromInt 1_050_000_000 - ) - withCip30Mock alice MockNami do - getWalletBalance >>= flip shouldSatisfy - ( eq $ Just $ coinToValue $ Coin $ BigInt.fromInt 1_050_000_000 - ) + withCip30Mock alice MockGero do + (liftEffect $ isWalletAvailable GeroWallet) >>= shouldEqual true + try (liftEffect $ isWalletAvailable GeroWallet) >>= hush >>> shouldEqual + (Just false) - test "getWalletBalance works (2)" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 5_000_000 - , BigInt.fromInt 2_000_000 - , BigInt.fromInt 1_000_000 - ] - withWallets distribution \alice -> do - withCip30Mock alice MockNami do - getWalletBalance >>= flip shouldSatisfy - (eq $ Just $ coinToValue $ Coin $ BigInt.fromInt 8_000_000) + withCip30Mock alice MockFlint do + (liftEffect $ isWalletAvailable FlintWallet) >>= shouldEqual true + try (liftEffect $ isWalletAvailable FlintWallet) >>= hush >>> + shouldEqual + (Just false) - test "CIP-30 utilities" do - let - distribution :: InitialUTxOs - distribution = - [ BigInt.fromInt 1_000_000_000 - , BigInt.fromInt 50_000_000 - ] - withWallets distribution \alice -> do - withCip30Mock alice MockNami do - Cip30.contract + withCip30Mock alice MockNuFi do + (liftEffect $ isWalletAvailable NuFiWallet) >>= shouldEqual true + try (liftEffect $ isWalletAvailable NuFiWallet) >>= hush >>> shouldEqual + (Just false) + + test "Collateral selection returns UTxO with smaller amount" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do + withCip30Mock alice MockNami do + getWalletCollateral >>= liftEffect <<< case _ of + Nothing -> throw "Unable to get collateral" + Just + [ TransactionUnspentOutput + { output: TransactionOutputWithRefScript { output } } + ] -> do + let amount = (unwrap output).amount + unless + (amount == lovelaceValueOf (BigInt.fromInt 50_000_000)) + $ throw "Wrong UTxO selected as collateral" + Just _ -> do + throw $ "More than one UTxO in collateral. " <> + "Not a bug, but unexpected in this test, please update it." + + test "Get own UTxOs" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do + utxos <- withCip30Mock alice MockNami do + getWalletUtxos + utxos `shouldSatisfy` isJust + + test "Get own address" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do + mockAddress <- withCip30Mock alice MockNami do + mbAddr <- head <$> getWalletAddresses + mbAddr `shouldSatisfy` isJust + pure mbAddr + kwAddress <- head <$> withKeyWallet alice do + getWalletAddresses + mockAddress `shouldEqual` kwAddress + + test "Payment key hash to payment key hash Tx" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do + withCip30Mock alice MockNami do + pkh <- liftedM "Failed to get PKH" $ head <$> + ownPaymentPubKeyHashes + stakePkh <- join <<< head <$> ownStakePubKeyHashes + pkh2PkhContract pkh stakePkh + + test "getWalletBalance works" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + getWalletBalance >>= shouldEqual + ( Just $ coinToValue $ Coin $ BigInt.fromInt 1_050_000_000 + ) + withCip30Mock alice MockNami do + getWalletBalance >>= shouldEqual + ( Just $ coinToValue $ Coin $ BigInt.fromInt 1_050_000_000 + ) + + test "getWalletBalance works (2)" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 5_000_000 + , BigInt.fromInt 2_000_000 + , BigInt.fromInt 1_000_000 + ] + withWallets distribution \alice -> do + withCip30Mock alice MockNami do + getWalletBalance >>= flip shouldSatisfy + (eq $ Just $ coinToValue $ Coin $ BigInt.fromInt 8_000_000) + + test "CIP-30 utilities" do + let + distribution :: InitialUTxOsWithStakeKey + distribution = withStakeKey privateStakeKey + [ BigInt.fromInt 1_000_000_000 + , BigInt.fromInt 50_000_000 + ] + withWallets distribution \alice -> do + withCip30Mock alice MockNami do + Cip30.contract + withCip30Mock alice (MockGenericCip30 "nami") do + Cip30.contract + test "ECDSA example" do + let + distribution = withStakeKey privateStakeKey + [ BigInt.fromInt 2_000_000_000 * BigInt.fromInt 100 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 100 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 100 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 100 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 100 + ] + withWallets distribution \alice -> do + withCip30Mock alice MockNami $ ECDSA.contract group "CIP-49 Plutus Crypto Primitives" do - test "ECDSA: a script that checks a signature works" do + test "ECDSA: a script that checks if a signature is correct" do let distribution :: InitialUTxOs distribution = @@ -1848,7 +2058,7 @@ suite = do withWallets distribution \alice -> do withKeyWallet alice do ECDSA.contract - test "Schnorr: a script that checks a signature works" do + test "Schnorr: a script that checks if a signature is correct" do let distribution :: InitialUTxOs distribution = @@ -1861,19 +2071,19 @@ suite = do signMultipleContract :: Contract Unit signMultipleContract = do - pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeysHashes - stakePkh <- join <<< head <$> ownStakePubKeysHashes + pkh <- liftedM "Failed to get own PKH" $ head <$> ownPaymentPubKeyHashes + stakePkh <- join <<< head <$> ownStakePubKeyHashes let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mustPayToPubKeyStakeAddress pkh stakePkh $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty - ubTx1 <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - ubTx2 <- liftedE $ Lookups.mkUnbalancedTx lookups constraints + ubTx1 <- mkUnbalancedTx lookups constraints + ubTx2 <- mkUnbalancedTx lookups constraints withBalancedTxs [ ubTx1, ubTx2 ] $ \txs -> do locked <- getLockedInputs @@ -1893,13 +2103,13 @@ pkh2PkhContract -> Contract Unit pkh2PkhContract pkh stakePkh = do let - constraints :: Constraints.TxConstraints Void Void + constraints :: Constraints.TxConstraints constraints = mustPayToPubKeyStakeAddress pkh stakePkh $ Value.lovelaceValueOf $ BigInt.fromInt 2_000_000 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = mempty - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - bsTx <- signTransaction =<< liftedE (balanceTx ubTx) + ubTx <- mkUnbalancedTx lookups constraints + bsTx <- signTransaction =<< balanceTx ubTx submitAndLog bsTx diff --git a/test/Plutip/Contract/Assert.purs b/test/Plutip/Contract/Assert.purs index e15da2f9c..14fb3e5ef 100644 --- a/test/Plutip/Contract/Assert.purs +++ b/test/Plutip/Contract/Assert.purs @@ -3,7 +3,6 @@ module Test.Ctl.Plutip.Contract.Assert (suite) where import Prelude -import Contract.Address (ownPaymentPubKeysHashes, ownStakePubKeysHashes) import Contract.Monad (liftedM) import Contract.PlutusData (PlutusData(Integer)) import Contract.Test (ContractTest) @@ -14,18 +13,22 @@ import Contract.Test.Assert ) import Contract.Test.Mote (TestPlanM) import Contract.Test.Plutip (InitialUTxOs, withWallets) -import Contract.Wallet (withKeyWallet) +import Contract.Wallet + ( ownPaymentPubKeyHashes + , ownStakePubKeyHashes + , withKeyWallet + ) import Control.Monad.Trans.Class (lift) import Ctl.Examples.ContractTestUtils as ContractTestUtils import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) import Ctl.Examples.PlutusV2.Scripts.AlwaysMints (alwaysMintsPolicyV2) import Data.Array (head) -import Data.BigInt as BigInt import Data.Either (isLeft, isRight) import Data.Newtype (wrap) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Class (liftEffect) import Effect.Exception (throw) +import JS.BigInt as BigInt import Mote (group, test) import Test.Ctl.Fixtures (cip25MetadataFixture1) import Test.Spec.Assertions (shouldEqual, shouldSatisfy) @@ -45,8 +48,8 @@ suite = do withWallets distribution \(alice /\ bob) -> do receiverPkh <- liftedM "Unable to get Bob's PKH" $ - head <$> withKeyWallet bob ownPaymentPubKeysHashes - receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeysHashes + head <$> withKeyWallet bob ownPaymentPubKeyHashes + receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeyHashes mintingPolicy /\ cs <- mkCurrencySymbol alwaysMintsPolicyV2 @@ -74,8 +77,8 @@ suite = do withWallets distribution \(alice /\ bob) -> do receiverPkh <- liftedM "Unable to get Bob's PKH" $ - head <$> withKeyWallet bob ownPaymentPubKeysHashes - receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeysHashes + head <$> withKeyWallet bob ownPaymentPubKeyHashes + receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeyHashes mintingPolicy /\ cs <- mkCurrencySymbol alwaysMintsPolicyV2 @@ -99,17 +102,14 @@ suite = do ContractTestUtils.mkContract params eiResult `shouldSatisfy` isRight printContractAssertionFailures failures `shouldEqual` - "The following `Contract` assertions have failed: \n 1.\ - \ Unexpected token delta (TokenName (hexToRawBytesUnsafe\ - \ \"546865546f6b656e\")) at address Sender (Expected: fromString\ - \ \"2\", Actual: fromString \"1\")" + "In addition to the error above, the following `Contract` assertions have failed:\n\n 1. Unexpected token delta (TokenName (hexToRawBytesUnsafe \"546865546f6b656e\")) at address Sender Expected: 2, Actual: 1" test "ExUnits limit reached" do withWallets distribution \(alice /\ bob) -> do receiverPkh <- liftedM "Unable to get Bob's PKH" $ - head <$> withKeyWallet bob ownPaymentPubKeysHashes - receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeysHashes + head <$> withKeyWallet bob ownPaymentPubKeyHashes + receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeyHashes mintingPolicy /\ cs <- mkCurrencySymbol alwaysMintsPolicyV2 @@ -137,17 +137,14 @@ suite = do ContractTestUtils.mkContract params eiResult `shouldSatisfy` isRight printContractAssertionFailures failures `shouldEqual` - "The following `Contract` assertions have failed: \n \ - \1. ExUnits limit exceeded: (Expected: { mem: fromString \"800\",\ - \ steps: fromString \"16110\" }, Actual: { mem: fromString \"800\",\ - \ steps: fromString \"161100\" })" + "In addition to the error above, the following `Contract` assertions have failed:\n\n 1. ExUnits limit exceeded: Expected: { mem: 800, steps: 16110 }, Actual: { mem: 800, steps: 161100 }" test "An exception is thrown - everything is reported" do withWallets distribution \(alice /\ bob) -> do receiverPkh <- liftedM "Unable to get Bob's PKH" $ - head <$> withKeyWallet bob ownPaymentPubKeysHashes - receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeysHashes + head <$> withKeyWallet bob ownPaymentPubKeyHashes + receiverSkh <- join <<< head <$> withKeyWallet bob ownStakePubKeyHashes mintingPolicy /\ cs <- mkCurrencySymbol alwaysMintsPolicyV2 @@ -179,18 +176,4 @@ suite = do eiResult `shouldSatisfy` isLeft printContractAssertionFailures failures `shouldEqual` - "The following `Contract` assertions have failed: \n\ - \ 1. Unexpected lovelace delta at address Sender (Expected: \ - \fromString \"0\", Actual: fromString \"-5195758\")\n\n\ - \ 2. Unexpected token delta (TokenName (hexToRawBytesUnsafe\ - \ \"546865546f6b656e\")) at address Sender (Expected: \ - \fromString \"2\", Actual: fromString \"1\")\n\n\ - \ 3. ExUnits limit exceeded: (Expected: { mem: fromString\ - \ \"800\", steps: fromString \"16110\" }, Actual: { \ - \mem: fromString \"800\", steps: fromString \"161100\" \ - \})\n\n\ - \The following `Contract` checks have been skipped due to an \ - \exception: \n\n\ - \ 1. Sender's output has a datum\n\n\ - \ 2. Output has a reference script\n\n\ - \ 3. Contains CIP-25 metadata" + "In addition to the error above, the following `Contract` assertions have failed:\n\n 1. Error while trying to get expected value: Unable to estimate expected loss in wallet\n\n 2. Unexpected token delta (TokenName (hexToRawBytesUnsafe \"546865546f6b656e\")) at address Sender Expected: 2, Actual: 1 \n\n 3. ExUnits limit exceeded: Expected: { mem: 800, steps: 16110 }, Actual: { mem: 800, steps: 161100 } \n\nThe following `Contract` checks have been skipped due to an exception: \n\n 1. Sender's output has a datum\n\n 2. Output has a reference script\n\n 3. Contains CIP-25 metadata" diff --git a/test/Plutip/Contract/Mnemonics.purs b/test/Plutip/Contract/Mnemonics.purs new file mode 100644 index 000000000..c6445c161 --- /dev/null +++ b/test/Plutip/Contract/Mnemonics.purs @@ -0,0 +1,48 @@ +module Test.Ctl.Plutip.Contract.Mnemonics (suite) where + +import Prelude + +import Contract.Address (addressFromBech32) +import Contract.Test (ContractTest) +import Contract.Test.Mote (TestPlanM) +import Contract.Test.Plutip (withWallets) +import Contract.Wallet (getWalletAddresses, withKeyWalletFromMnemonic) +import Contract.Wallet.Key (StakeKeyPresence(WithStakeKey)) +import Data.Array (head) +import Data.UInt as UInt +import Mote (group, test) +import Test.Spec.Assertions (shouldEqual) + +suite :: TestPlanM ContractTest Unit +suite = do + group "CIP-1852 mnemonics" do + test "Allows to build multiple KeyWallets" do + withWallets unit \_ -> do + do + addr1 <- withKeyWalletFromMnemonic + phrase1 + { accountIndex: UInt.fromInt 0 + , addressIndex: UInt.fromInt 0 + } + WithStakeKey + do + head <$> getWalletAddresses + addrExpected <- addressFromBech32 + "addr1q8day0u0gtx3302u5mmgmw20q67s9mkglte8y8kqk75jge5mvvhnhsjfj5jfpt7dv4tu6wlz7z032cmmp9ljftjmkzfswlmg44" + addr1 `shouldEqual` pure addrExpected + do + addr1 <- withKeyWalletFromMnemonic + phrase1 + { accountIndex: UInt.fromInt 1 + , addressIndex: UInt.fromInt 1 + } + WithStakeKey + do + head <$> getWalletAddresses + addrExpected <- addressFromBech32 + "addr1q9mmg8l2w7ar4cj89jte699dxuu0u3partkjt7fqdga5a7u6w4gzwu7mms8sn7rd0apcwtyu2xjzflvm7sc5vd3vtvpqnux32a" + addr1 `shouldEqual` pure addrExpected + + where + phrase1 = + "what abstract myself forum setup leader series maximum home abuse shadow wreck inflict dust basket cycle involve quick abstract eagle staff town voyage raven" diff --git a/test/Plutip/Contract/OgmiosMempool.purs b/test/Plutip/Contract/OgmiosMempool.purs new file mode 100644 index 000000000..269ec587a --- /dev/null +++ b/test/Plutip/Contract/OgmiosMempool.purs @@ -0,0 +1,91 @@ +module Test.Ctl.Plutip.Contract.OgmiosMempool + ( suite + ) where + +import Prelude + +import Contract.Backend.Ogmios.Mempool + ( MempoolSizeAndCapacity(MempoolSizeAndCapacity) + , acquireMempoolSnapshot + , fetchMempoolTxs + , mempoolSnapshotHasTx + , mempoolSnapshotSizeAndCapacity + , withMempoolSnapshot + ) +import Contract.Scripts (validatorHash) +import Contract.Test (ContractTest, InitialUTxOs, withKeyWallet, withWallets) +import Contract.Test.Mote (TestPlanM) +import Contract.Transaction (awaitTxConfirmed) +import Ctl.Examples.PlutusV2.InlineDatum as InlineDatum +import Data.Array (length) +import JS.BigInt as BigInt +import Mote (group, skip, test) +import Test.Spec.Assertions (shouldEqual) + +suite :: TestPlanM ContractTest Unit +suite = group "Ogmios mempool test" do + test "acquireMempoolSnapshot" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1000_000_000 + , BigInt.fromInt 2000_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + void acquireMempoolSnapshot + test "fetchMempoolTXs" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1000_000_000 + , BigInt.fromInt 2000_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + validator <- InlineDatum.checkDatumIsInlineScript + let vhash = validatorHash validator + txId <- InlineDatum.payToCheckDatumIsInline vhash + mpTxs <- fetchMempoolTxs =<< acquireMempoolSnapshot + length mpTxs `shouldEqual` 1 + awaitTxConfirmed txId + mpTxs' <- fetchMempoolTxs =<< acquireMempoolSnapshot + length mpTxs' `shouldEqual` 0 + skip $ test + "mempoolSnapshotHasTx - skipped because HasTx always returns false for some reason" + do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1000_000_000 + , BigInt.fromInt 2000_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + validator <- InlineDatum.checkDatumIsInlineScript + let vhash = validatorHash validator + txId <- InlineDatum.payToCheckDatumIsInline vhash + withMempoolSnapshot (flip mempoolSnapshotHasTx txId) >>= shouldEqual + true + snapshot <- acquireMempoolSnapshot + _mpTxs' <- fetchMempoolTxs snapshot + -- for_ mpTxs' \tx -> do + -- liftEffect <<< Console.log <<< show =<< liftEffect + -- (transactionHash tx) + awaitTxConfirmed txId + mempoolSnapshotHasTx snapshot txId >>= shouldEqual false + test "mempoolSnapshotSizeAndCapacity" do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 1000_000_000 + , BigInt.fromInt 2000_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + validator <- InlineDatum.checkDatumIsInlineScript + let vhash = validatorHash validator + void $ InlineDatum.payToCheckDatumIsInline vhash + MempoolSizeAndCapacity { numberOfTxs } <- + withMempoolSnapshot (mempoolSnapshotSizeAndCapacity) + numberOfTxs `shouldEqual` 1 diff --git a/test/Plutip/ExUnits.purs b/test/Plutip/ExUnits.purs new file mode 100644 index 000000000..b05bc9373 --- /dev/null +++ b/test/Plutip/ExUnits.purs @@ -0,0 +1,61 @@ +module Test.Ctl.Plutip.ExUnits + ( mkSuite + , mkFailingSuite + ) where + +import Prelude + +import Contract.Log (logInfo') +import Contract.Scripts (validatorHash) +import Contract.Test (ContractTest, InitialUTxOs, withKeyWallet, withWallets) +import Contract.Transaction (awaitTxConfirmed) +import Ctl.Examples.ExUnits as ExUnits +import Ctl.Internal.Test.TestPlanM (TestPlanM) +import Data.Either (isLeft) +import Effect.Aff (try) +import JS.BigInt as BigInt +import Mote (test) +import Test.Spec.Assertions (shouldSatisfy) + +mkSuite :: Int -> TestPlanM ContractTest Unit +mkSuite n = do + test ("ExUnits.plutus script with " <> show n <> " iterations - must succeed") + do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 500_000_000 + , BigInt.fromInt 500_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + validator <- ExUnits.exUnitsScript + let vhash = validatorHash validator + logInfo' "Attempt to lock value" + txId <- ExUnits.payToExUnits vhash + awaitTxConfirmed txId + logInfo' "Try to spend locked values" + ExUnits.spendFromExUnits (BigInt.fromInt n) vhash validator txId + +mkFailingSuite :: Int -> TestPlanM ContractTest Unit +mkFailingSuite n = do + test ("ExUnits.plutus script with " <> show n <> " iterations - must fail") + do + let + distribution :: InitialUTxOs + distribution = + [ BigInt.fromInt 500_000_000 + , BigInt.fromInt 500_000_000 + ] + withWallets distribution \alice -> do + withKeyWallet alice do + validator <- ExUnits.exUnitsScript + let vhash = validatorHash validator + logInfo' "Attempt to lock value" + txId <- ExUnits.payToExUnits vhash + awaitTxConfirmed txId + logInfo' "Try to spend locked values" + res <- try $ ExUnits.spendFromExUnits (BigInt.fromInt n) vhash + validator + txId + res `shouldSatisfy` isLeft diff --git a/test/Plutip/Staking.purs b/test/Plutip/Staking.purs index 03e43cde2..8674bcf21 100644 --- a/test/Plutip/Staking.purs +++ b/test/Plutip/Staking.purs @@ -7,16 +7,13 @@ import Prelude import Contract.Address ( PaymentPubKeyHash(PaymentPubKeyHash) - , PubKeyHash(PubKeyHash) , getNetworkId - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes ) import Contract.Backend.Ogmios (getPoolParameters) import Contract.Credential (Credential(ScriptCredential)) import Contract.Hashing (plutusScriptStakeValidatorHash, publicKeyHash) import Contract.Log (logInfo') -import Contract.Monad (Contract, liftedE, liftedM) +import Contract.Monad (Contract, liftedM) import Contract.Numeric.BigNum as BigNum import Contract.PlutusData (unitDatum, unitRedeemer) import Contract.Prelude (liftM) @@ -36,6 +33,7 @@ import Contract.Staking , getPubKeyHashDelegationsAndRewards , getValidatorHashDelegationsAndRewards ) +import Contract.Test.Mote (TestPlanM, interpretWithConfig) import Contract.Test.Plutip (runPlutipContract, withStakeKey) import Contract.Test.Utils (exitCode, interruptOnSignal) import Contract.Time (getCurrentEpoch) @@ -65,15 +63,18 @@ import Contract.TxConstraints , mustWithdrawStakePlutusScript , mustWithdrawStakePubKey ) +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Value (lovelaceValueOf) -import Contract.Wallet (withKeyWallet) +import Contract.Wallet + ( ownPaymentPubKeyHashes + , ownStakePubKeyHashes + , withKeyWallet + ) import Contract.Wallet.Key (keyWalletPrivateStakeKey, publicKeyFromPrivateKey) import Ctl.Examples.AlwaysSucceeds (alwaysSucceedsScript) import Ctl.Examples.IncludeDatum (only42Script) -import Ctl.Internal.Test.TestPlanM (TestPlanM, interpretWithConfig) import Data.Array (head, (!!)) import Data.Array as Array -import Data.BigInt as BigInt import Data.Foldable (for_) import Data.Maybe (Maybe(Just, Nothing), fromJust) import Data.Newtype (unwrap) @@ -94,7 +95,8 @@ import Effect.Aff import Effect.Aff.Class (liftAff) import Effect.Class (liftEffect) import Effect.Exception (error) -import Mote (group, test) +import JS.BigInt as BigInt +import Mote (group, skip, test) import Partial.Unsafe (unsafePartial) import Test.Ctl.Plutip.Common (config) as Common import Test.Ctl.Plutip.Common (privateStakeKey) @@ -141,36 +143,36 @@ suite = do runPlutipContract config distribution $ flip withKeyWallet do alicePkh /\ aliceStakePkh <- do Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) + (join <<< head <$> ownStakePubKeyHashes) -- Register do let constraints = mustRegisterStakePubKey aliceStakePkh - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- Deregister stake key do let constraints = mustDeregisterStakePubKey aliceStakePkh - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog test "PlutusScript" do let @@ -181,10 +183,10 @@ suite = do runPlutipContract config distribution $ flip withKeyWallet do alicePkh /\ aliceStakePkh <- do Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) + (join <<< head <$> ownStakePubKeyHashes) validator1 <- alwaysSucceedsScript <#> unwrap >>> PlutusScriptStakeValidator validator2 <- only42Script <#> unwrap >>> @@ -196,16 +198,16 @@ suite = do -- Register do let - constraints = mustRegisterStakeScript validatorHash1 <> - mustRegisterStakeScript validatorHash2 + constraints = mustRegisterStakeScript validatorHash1 + <> mustRegisterStakeScript validatorHash2 - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- Deregister stake key do @@ -216,13 +218,13 @@ suite = do <> mustDeregisterStakePlutusScript validator2 unitRedeemer - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog test "NativeScript" do let @@ -233,10 +235,10 @@ suite = do runPlutipContract config distribution $ flip withKeyWallet do alicePkh /\ aliceStakePkh <- do Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) + (join <<< head <$> ownStakePubKeyHashes) let nativeScript = ScriptAny [ ScriptPubkey $ unwrap $ unwrap alicePkh ] @@ -249,26 +251,26 @@ suite = do let constraints = mustRegisterStakeScript stakeValidatorHash - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- Deregister stake key do let constraints = mustDeregisterStakeNativeScript validator - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog test "Pool registration & retirement" do let @@ -278,22 +280,22 @@ suite = do ] runPlutipContract config distribution \alice -> withKeyWallet alice do alicePkh /\ aliceStakePkh <- Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) + (join <<< head <$> ownStakePubKeyHashes) -- Register stake key do let constraints = mustRegisterStakePubKey aliceStakePkh - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog privateStakeKey <- liftM (error "Failed to get private stake key") $ keyWalletPrivateStakeKey alice @@ -326,7 +328,7 @@ suite = do } , rewardAccount , poolOwners: - [ PaymentPubKeyHash $ PubKeyHash $ publicKeyHash $ + [ PaymentPubKeyHash $ publicKeyHash $ publicKeyFromPrivateKey (unwrap privateStakeKey) ] @@ -336,13 +338,13 @@ suite = do constraints = mustRegisterPool poolParams - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- List pools: the pool must appear in the list do @@ -363,13 +365,13 @@ suite = do let constraints = mustRetirePool poolOperator retirementEpoch - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog let waitEpoch :: Epoch -> Contract Epoch @@ -387,226 +389,232 @@ suite = do pools <- getPoolIds pools `shouldSatisfy` Array.notElem poolOperator - test "Plutus Stake script: delegate to existing pool & withdraw rewards" do - let - distribution = withStakeKey privateStakeKey - [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 - , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 1_000 - ] - runPlutipContract config distribution \alice -> - withKeyWallet alice do - alicePkh /\ aliceStakePkh <- Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) - <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) - validator <- alwaysSucceedsScript <#> unwrap >>> - PlutusScriptStakeValidator - let - stakeValidatorHash = plutusScriptStakeValidatorHash validator - validatorHash = ValidatorHash $ unwrap stakeValidatorHash - - -- Lock funds on the stake script - do - let - constraints = - mustPayToScriptAddress validatorHash - (ScriptCredential validatorHash) - unitDatum - DatumWitness - $ lovelaceValueOf - $ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 100 - - lookups :: Lookups.ScriptLookups Void - lookups = mempty - - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Register stake script - do + skip $ test + "Plutus Stake script: delegate to existing pool & withdraw rewards" + do + let + distribution = withStakeKey privateStakeKey + [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 1_000 + ] + runPlutipContract config distribution \alice -> + withKeyWallet alice do + alicePkh /\ aliceStakePkh <- Tuple + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) + <*> liftedM "Failed to get Stake PKH" + (join <<< head <$> ownStakePubKeyHashes) + validator <- alwaysSucceedsScript <#> unwrap >>> + PlutusScriptStakeValidator let - constraints = - mustRegisterStakeScript stakeValidatorHash - - lookups :: Lookups.ScriptLookups Void - lookups = mempty - - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Select a pool - poolId <- selectPoolId - - -- Delegate - do + stakeValidatorHash = plutusScriptStakeValidatorHash validator + validatorHash = ValidatorHash $ unwrap stakeValidatorHash + + -- Lock funds on the stake script + do + let + constraints = + mustPayToScriptAddress validatorHash + (ScriptCredential validatorHash) + unitDatum + DatumWitness + $ lovelaceValueOf + $ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 100 + + lookups :: Lookups.ScriptLookups + lookups = mempty + + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Register stake script + do + let + constraints = + mustRegisterStakeScript stakeValidatorHash + + lookups :: Lookups.ScriptLookups + lookups = mempty + + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Select a pool + poolId <- selectPoolId + + -- Delegate + do + let + constraints = + mustDelegateStakePlutusScript validator unitRedeemer poolId + + lookups :: Lookups.ScriptLookups + lookups = + Lookups.ownPaymentPubKeyHash alicePkh <> + Lookups.ownStakePubKeyHash aliceStakePkh + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Wait until rewards let - constraints = - mustDelegateStakePlutusScript validator unitRedeemer poolId - - lookups :: Lookups.ScriptLookups Void - lookups = - Lookups.ownPaymentPubKeyHash alicePkh <> - Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Wait until rewards - let - -- No need for limit on number of retries, because we have a - -- timeout for tests. - waitUntilRewards = do - mbDelegationsAndRewards <- + -- No need for limit on number of retries, because we have a + -- timeout for tests. + waitUntilRewards = do + mbDelegationsAndRewards <- + getValidatorHashDelegationsAndRewards stakeValidatorHash + case mbDelegationsAndRewards of + Just dels@{ rewards } | unwrap <$> rewards > Just zero -> + pure dels + _ -> do + liftAff $ delay $ Milliseconds 5000.0 + waitUntilRewards + + { rewards: rewardsBefore, delegate } <- waitUntilRewards + delegate `shouldEqual` Just poolId + + -- Withdraw + do + let + constraints = + mustWithdrawStakePlutusScript validator unitRedeemer + + lookups :: Lookups.ScriptLookups + lookups = + Lookups.ownPaymentPubKeyHash alicePkh <> + Lookups.ownStakePubKeyHash aliceStakePkh + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Check rewards. + -- Not going to deregister here, because the rewards are added too + -- soon, and we can't deregister the stake key if there are rewards + -- left. + -- This will not happen in real life scenarios, because epoch are + -- (usually) significantly longer. + do + { rewards: rewardsAfter } <- liftedM "Unable to get rewards" $ getValidatorHashDelegationsAndRewards stakeValidatorHash - case mbDelegationsAndRewards of - Just dels@{ rewards } | unwrap <$> rewards > Just zero -> - pure dels - _ -> do - liftAff $ delay $ Milliseconds 5000.0 - waitUntilRewards + rewardsAfter `shouldSatisfy` \after -> after < rewardsBefore - { rewards: rewardsBefore, delegate } <- waitUntilRewards - delegate `shouldEqual` Just poolId - - -- Withdraw - do - let - constraints = - mustWithdrawStakePlutusScript validator unitRedeemer - - lookups :: Lookups.ScriptLookups Void - lookups = - Lookups.ownPaymentPubKeyHash alicePkh <> - Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Check rewards. - -- Not going to deregister here, because the rewards are added too - -- soon, and we can't deregister the stake key if there are rewards - -- left. - -- This will not happen in real life scenarios, because epoch are - -- (usually) significantly longer. - do - { rewards: rewardsAfter } <- liftedM "Unable to get rewards" $ - getValidatorHashDelegationsAndRewards stakeValidatorHash - rewardsAfter `shouldSatisfy` \after -> after < rewardsBefore - - test "Native Stake script: delegate to existing pool & withdraw rewards" do - let - distribution = - [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 - , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 1_000 - ] /\ - withStakeKey privateStakeKey - [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 - , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 1_000 - ] - runPlutipContract config distribution \(alice /\ bob) -> do - bobPkh /\ bobStakePkh <- withKeyWallet bob do - Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) - <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) + skip $ test + "Native Stake script: delegate to existing pool & withdraw rewards" + do let - nativeScript = ScriptAny - [ ScriptPubkey $ unwrap $ unwrap bobStakePkh ] - validator = NativeScriptStakeValidator nativeScript - stakeValidatorHash = - nativeScriptStakeValidatorHash validator - - -- Alice - withKeyWallet alice do - -- She locks funds on the stake script (no need for her to validate - -- the script in order to do that) - do - let - constraints = - mustPayToNativeScriptAddress - (NativeScriptHash $ unwrap stakeValidatorHash) - (ScriptCredential $ ValidatorHash $ unwrap stakeValidatorHash) - $ lovelaceValueOf - $ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 100 - - lookups :: Lookups.ScriptLookups Void - lookups = mempty - - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Alice registers stake script (again, no need to validate it) - do - let - constraints = - mustRegisterStakeScript stakeValidatorHash - - lookups :: Lookups.ScriptLookups Void - lookups = mempty - - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Bob performs operations with the stake script that require his - -- (and only his) signature. - withKeyWallet bob do - - -- Select first pool - poolId <- selectPoolId - - -- Delegate - do - let - constraints = - mustDelegateStakeNativeScript validator poolId - - lookups :: Lookups.ScriptLookups Void - lookups = - Lookups.ownPaymentPubKeyHash bobPkh <> - Lookups.ownStakePubKeyHash bobStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Wait until rewards + distribution = + [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 1_000 + ] /\ + withStakeKey privateStakeKey + [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 + , BigInt.fromInt 2_000_000_000 * BigInt.fromInt 1_000 + ] + runPlutipContract config distribution \(alice /\ bob) -> do + bobPkh /\ bobStakePkh <- withKeyWallet bob do + Tuple + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) + <*> liftedM "Failed to get Stake PKH" + (join <<< head <$> ownStakePubKeyHashes) let - -- No need for limit on number of retries, because we have a - -- timeout for tests. - waitUntilRewards = do - mbDelegationsAndRewards <- - getValidatorHashDelegationsAndRewards stakeValidatorHash - case mbDelegationsAndRewards of - Just dels@{ rewards } | unwrap <$> rewards > Just zero -> - pure dels - _ -> do - liftAff $ delay $ Milliseconds 5000.0 - waitUntilRewards - - { rewards: rewardsBefore, delegate } <- waitUntilRewards - delegate `shouldEqual` Just poolId + nativeScript = ScriptAny + [ ScriptPubkey $ unwrap $ unwrap bobStakePkh ] + validator = NativeScriptStakeValidator nativeScript + stakeValidatorHash = + nativeScriptStakeValidatorHash validator - -- Withdraw - do + -- Alice + withKeyWallet alice do + -- She locks funds on the stake script (no need for her to validate + -- the script in order to do that) + do + let + constraints = + mustPayToNativeScriptAddress + (NativeScriptHash $ unwrap stakeValidatorHash) + ( ScriptCredential $ ValidatorHash $ unwrap + stakeValidatorHash + ) + $ lovelaceValueOf + $ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 100 + + lookups :: Lookups.ScriptLookups + lookups = mempty + + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Alice registers stake script (again, no need to validate it) + do + let + constraints = + mustRegisterStakeScript stakeValidatorHash + + lookups :: Lookups.ScriptLookups + lookups = mempty + + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Bob performs operations with the stake script that require his + -- (and only his) signature. + withKeyWallet bob do + + -- Select first pool + poolId <- selectPoolId + + -- Delegate + do + let + constraints = + mustDelegateStakeNativeScript validator poolId + + lookups :: Lookups.ScriptLookups + lookups = + Lookups.ownPaymentPubKeyHash bobPkh <> + Lookups.ownStakePubKeyHash bobStakePkh + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Wait until rewards let - constraints = - mustWithdrawStakeNativeScript validator - - lookups :: Lookups.ScriptLookups Void - lookups = - Lookups.ownPaymentPubKeyHash bobPkh <> - Lookups.ownStakePubKeyHash bobStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog - - -- Check rewards. - -- Not going to deregister here, because the rewards are added too - -- soon, and we can't deregister the stake key if there are rewards - -- left. - -- This will not happen in real life scenarios, because epoch are - -- (usually) significantly longer. - do - { rewards: rewardsAfter } <- liftedM "Unable to get rewards" $ - getValidatorHashDelegationsAndRewards stakeValidatorHash - rewardsAfter `shouldSatisfy` \after -> after < rewardsBefore + -- No need for limit on number of retries, because we have a + -- timeout for tests. + waitUntilRewards = do + mbDelegationsAndRewards <- + getValidatorHashDelegationsAndRewards stakeValidatorHash + case mbDelegationsAndRewards of + Just dels@{ rewards } | unwrap <$> rewards > Just zero -> + pure dels + _ -> do + liftAff $ delay $ Milliseconds 5000.0 + waitUntilRewards + + { rewards: rewardsBefore, delegate } <- waitUntilRewards + delegate `shouldEqual` Just poolId + + -- Withdraw + do + let + constraints = + mustWithdrawStakeNativeScript validator + + lookups :: Lookups.ScriptLookups + lookups = + Lookups.ownPaymentPubKeyHash bobPkh <> + Lookups.ownStakePubKeyHash bobStakePkh + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog + + -- Check rewards. + -- Not going to deregister here, because the rewards are added too + -- soon, and we can't deregister the stake key if there are rewards + -- left. + -- This will not happen in real life scenarios, because epoch are + -- (usually) significantly longer. + do + { rewards: rewardsAfter } <- liftedM "Unable to get rewards" $ + getValidatorHashDelegationsAndRewards stakeValidatorHash + rewardsAfter `shouldSatisfy` \after -> after < rewardsBefore - test "PubKey: delegate to existing pool & withdraw rewards" do + skip $ test "PubKey: delegate to existing pool & withdraw rewards" do let distribution = withStakeKey privateStakeKey [ BigInt.fromInt 1_000_000_000 * BigInt.fromInt 1_000 @@ -615,21 +623,21 @@ suite = do runPlutipContract config distribution \alice -> withKeyWallet alice do alicePkh /\ aliceStakePkh <- Tuple - <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeysHashes) + <$> liftedM "Failed to get PKH" (head <$> ownPaymentPubKeyHashes) <*> liftedM "Failed to get Stake PKH" - (join <<< head <$> ownStakePubKeysHashes) + (join <<< head <$> ownStakePubKeyHashes) -- Register stake key do let constraints = mustRegisterStakePubKey aliceStakePkh - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- Select a pool ID poolId <- selectPoolId @@ -640,12 +648,12 @@ suite = do constraints = mustDelegateStakePubKey aliceStakePkh poolId - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- Wait until rewards let @@ -673,12 +681,12 @@ suite = do constraints = mustWithdrawStakePubKey aliceStakePkh - lookups :: Lookups.ScriptLookups Void + lookups :: Lookups.ScriptLookups lookups = Lookups.ownPaymentPubKeyHash alicePkh <> Lookups.ownStakePubKeyHash aliceStakePkh - ubTx <- liftedE $ Lookups.mkUnbalancedTx lookups constraints - liftedE (balanceTx ubTx) >>= signTransaction >>= submitAndLog + ubTx <- mkUnbalancedTx lookups constraints + balanceTx ubTx >>= signTransaction >>= submitAndLog -- Check rewards. -- Not going to deregister here, because the rewards are added too @@ -692,4 +700,13 @@ suite = do $ getPubKeyHashDelegationsAndRewards aliceStakePkh rewardsAfter `shouldSatisfy` \after -> after < rewardsBefore where - config = Common.config { clusterConfig = { slotLength: Seconds 0.05 } } + config = + Common.config + { clusterConfig = + Common.config.clusterConfig + -- changing these constants breaks rewards + -- https://github.com/mlabs-haskell/plutip/issues/149 + { slotLength = Seconds 0.05 + , epochSize = Just $ UInt.fromInt 80 + } + } diff --git a/test/Plutip/UtxoDistribution.purs b/test/Plutip/UtxoDistribution.purs index 19bcab669..fcc796eb1 100644 --- a/test/Plutip/UtxoDistribution.purs +++ b/test/Plutip/UtxoDistribution.purs @@ -17,9 +17,6 @@ import Prelude import Contract.Address ( Address , getNetworkId - , getWalletAddresses - , ownPaymentPubKeysHashes - , ownStakePubKeysHashes , payPubKeyHashEnterpriseAddress ) import Contract.Monad (Contract, liftedM) @@ -36,25 +33,31 @@ import Contract.Transaction ) import Contract.Utxos (UtxoMap, utxosAt) import Contract.Value (Value, lovelaceValueOf) -import Contract.Wallet (KeyWallet, withKeyWallet) +import Contract.Wallet + ( KeyWallet + , getWalletAddresses + , ownPaymentPubKeyHashes + , ownStakePubKeyHashes + , withKeyWallet + ) import Control.Lazy (fix) import Ctl.Internal.Test.TestPlanM (TestPlanM) import Ctl.Internal.Test.UtxoDistribution (encodeDistribution, keyWallets) import Data.Array (foldl, head, replicate, zip) -import Data.BigInt (BigInt) -import Data.BigInt (fromInt, toString) as BigInt +import Data.Array.NonEmpty (fromNonEmpty) as NEArray import Data.Foldable (intercalate) import Data.FoldableWithIndex (foldlWithIndex) -import Data.List (fromFoldable) as List import Data.Map (empty, insert, isEmpty) as Map import Data.Maybe (isJust) -import Data.Newtype (unwrap, wrap) +import Data.Newtype (unwrap) import Data.NonEmpty ((:|)) import Data.Traversable (for_) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Aff (Aff) import Effect.Class (liftEffect) import Effect.Exception (throw) +import JS.BigInt (BigInt) +import JS.BigInt (fromInt, toString) as BigInt import Mote (group, test) import Test.Ctl.Plutip.Common (config, privateStakeKey) import Test.QuickCheck (class Arbitrary, arbitrary) @@ -134,9 +137,9 @@ genInitialUtxo = map (BigInt.fromInt >>> (_ * BigInt.fromInt 1_000_000)) <$> arrayOf (chooseInt 1 1000) instance Arbitrary ArbitraryUtxoDistr where - arbitrary = fix \_ -> sized $ \size -> resize size $ frequency <<< wrap $ - (1.0 /\ pure UDUnit) :| - List.fromFoldable + arbitrary = + fix \_ -> sized $ \size -> resize size $ frequency $ NEArray.fromNonEmpty $ + (1.0 /\ pure UDUnit) :| [ 2.0 /\ (UDInitialUtxos <$> genInitialUtxo) , 2.0 /\ ( UDInitialUtxosWithStake <$> @@ -196,7 +199,7 @@ assertContract msg cond = if cond then pure unit else liftEffect $ throw msg assertUtxosAtPlutipWalletAddress :: KeyWallet -> Contract Unit assertUtxosAtPlutipWalletAddress wallet = withKeyWallet wallet do - maybeStake <- join <<< head <$> ownStakePubKeysHashes + maybeStake <- join <<< head <$> ownStakePubKeyHashes when (isJust maybeStake) $ assertNoUtxosAtEnterpriseAddress wallet assertNoUtxosAtEnterpriseAddress @@ -206,7 +209,7 @@ assertNoUtxosAtEnterpriseAddress wallet = withKeyWallet wallet $ ( payPubKeyHashEnterpriseAddress <$> getNetworkId <*> liftedM "Could not get payment pubkeyhash" - (head <$> ownPaymentPubKeysHashes) + (head <$> ownPaymentPubKeyHashes) ) assertNoUtxosAtAddress :: Address -> Contract Unit diff --git a/test/Plutus/Conversion/Value.purs b/test/Plutus/Conversion/Value.purs index 6cce4c950..36d8a4438 100644 --- a/test/Plutus/Conversion/Value.purs +++ b/test/Plutus/Conversion/Value.purs @@ -11,12 +11,12 @@ import Ctl.Internal.Plutus.Types.Value (Value) as Plutus import Ctl.Internal.Plutus.Types.Value as Plutus.Value import Ctl.Internal.Test.TestPlanM (TestPlanM) import Data.Array (length, range, zip) -import Data.BigInt (fromInt) import Data.Maybe (fromJust) import Data.Traversable (for_) import Data.Tuple (fst, snd) import Data.Tuple.Nested (type (/\), (/\)) import Effect.Aff (Aff) +import JS.BigInt (fromInt) import Mote (group, test) import Partial.Unsafe (unsafePartial) import Test.Ctl.Fixtures (currencySymbol1, tokenName1, tokenName2) diff --git a/test/Plutus/Time.purs b/test/Plutus/Time.purs index 0187c9c08..41e92e977 100644 --- a/test/Plutus/Time.purs +++ b/test/Plutus/Time.purs @@ -28,7 +28,6 @@ import Ctl.Internal.Types.Interval , POSIXTime(POSIXTime) , PosixTimeToSlotError ( CannotFindTimeInEraSummaries - , CannotGetBigIntFromNumber' , EndSlotLessThanSlotOrModNonZero , PosixTimeBeforeSystemStart , StartTimeGreaterThanTime @@ -44,11 +43,11 @@ import Ctl.Internal.Types.Interval , ToOnChainPosixTimeRangeError(PosixTimeToSlotError', SlotToPosixTimeError') ) import Ctl.Internal.Types.SystemStart (sysStartFromOgmiosTimestampUnsafe) -import Data.BigInt as BigInt import Data.Int as Int import Data.Maybe (Maybe(Just, Nothing)) import Data.Newtype (unwrap, wrap) import Effect.Aff (Aff) +import JS.BigInt as BigInt import Mote (group) import Test.Ctl.Utils (toFromAesonTest, toFromAesonTestWith) @@ -251,7 +250,6 @@ suite = do absTimeFixture toFromAesonTest "EndSlotLessThanSlotOrModNonZero" $ EndSlotLessThanSlotOrModNonZero slotFixture modTimeFixture - toFromAesonTest "CannotGetBigIntFromNumber'" $ CannotGetBigIntFromNumber' group "ToOnChainPosixTimeRangeError" do toFromAesonTest "PosixTimeToSlotError'" $ PosixTimeToSlotError' posixTimeToSlotErrFixture diff --git a/test/ProtocolParams.purs b/test/ProtocolParams.purs index efdfc08df..d5918bc36 100644 --- a/test/ProtocolParams.purs +++ b/test/ProtocolParams.purs @@ -16,8 +16,9 @@ import Test.Spec.Assertions (shouldSatisfy) suite :: TestPlanM (Aff Unit) Unit suite = do aeson <- Utils.readAeson - "./fixtures/test/ogmios/currentProtocolParameters.json" + "./fixtures/test/ogmios/queryLedgerState-protocolParameters-68ba1141d17af9326cad70407ea3d7fb.json" group "ProtocolParameters parser" $ do test "is able to parse ogmios response fixture" $ - (decodeAeson aeson :: Either _ OgmiosProtocolParameters) `shouldSatisfy` - isRight + (decodeAeson aeson :: Either _ { result :: OgmiosProtocolParameters }) + `shouldSatisfy` + isRight diff --git a/test/QueryM/AffInterface.purs b/test/QueryM/AffInterface.purs index 93af890c5..0403920f9 100644 --- a/test/QueryM/AffInterface.purs +++ b/test/QueryM/AffInterface.purs @@ -39,7 +39,8 @@ suite = do void $ throwError $ error $ "Unexpected success in testSubmitTxFailure" Left error -> do - (Pattern "Server responded with `fault`" `indexOf` show error) + (Pattern "Ogmios responded with error: " `indexOf` show error) + -- Error: (TypeMismatch "Expected error code in a range [3000, 3999]") `shouldSatisfy` isJust testGetChainTip :: QueryM Unit diff --git a/test/Serialization.purs b/test/Serialization.purs index aabb3f997..64c3a6fb3 100644 --- a/test/Serialization.purs +++ b/test/Serialization.purs @@ -22,7 +22,6 @@ import Ctl.Internal.Types.BigNum (fromString, one) as BN import Ctl.Internal.Types.ByteArray (byteArrayToHex, hexToByteArrayUnsafe) import Ctl.Internal.Types.CborBytes (cborBytesToHex) import Ctl.Internal.Types.PlutusData as PD -import Data.BigInt as BigInt import Data.Either (hush) import Data.Maybe (Maybe, isJust, isNothing) import Data.Newtype (unwrap, wrap) @@ -30,6 +29,7 @@ import Data.Tuple.Nested ((/\)) import Effect.Aff (Aff) import Effect.Class (liftEffect) import Effect.Exception (error) +import JS.BigInt as BigInt import Mote (group, test) import Test.Ctl.Fixtures ( txBinaryFixture1 diff --git a/test/Transaction.purs b/test/Transaction.purs index e5226eb86..6a144d9b6 100644 --- a/test/Transaction.purs +++ b/test/Transaction.purs @@ -14,7 +14,6 @@ import Ctl.Internal.Cardano.Types.Transaction , mkPublicKey ) import Ctl.Internal.Deserialization.WitnessSet as Deserialization.WitnessSet -import Ctl.Internal.Helpers (fromRightEff) import Ctl.Internal.Serialization.WitnessSet as Serialization.WitnessSet import Ctl.Internal.Test.TestPlanM (TestPlanM) import Ctl.Internal.Transaction @@ -31,8 +30,6 @@ import Ctl.Internal.Types.Scripts ( Language(PlutusV1, PlutusV2) , PlutusScript(PlutusScript) ) -import Data.BigInt as BigInt -import Data.Either (Either(Left, Right)) import Data.Maybe (Maybe(Just, Nothing), fromJust) import Data.Newtype (over, unwrap) import Data.Tuple.Nested ((/\)) @@ -40,6 +37,7 @@ import Effect (Effect) import Effect.Aff (Aff) import Effect.Class (liftEffect) import Effect.Exception (throw) +import JS.BigInt as BigInt import Mote (group, test) import Partial.Unsafe (unsafePartial) import Test.Ctl.Fixtures.CostModels (costModelsFixture1) @@ -59,8 +57,7 @@ suite = group "attach datums to tx" $ do testAttachDatum :: Aff Unit testAttachDatum = liftEffect $ attachDatum datum tx >>= case _ of - Left e -> throw $ "Failed to attach datum: " <> show e - Right (Transaction { witnessSet: TransactionWitnessSet ws }) -> + Transaction { witnessSet: TransactionWitnessSet ws } -> case ws.plutusData of Just [ pd ] -> do pd `shouldEqual` unwrap datum @@ -77,8 +74,7 @@ testAttachRedeemer :: Aff Unit testAttachRedeemer = liftEffect $ do redeemer <- mkRedeemer datum attachRedeemer redeemer tx >>= case _ of - Left e -> throw $ "Failed to attach redeemer: " <> show e - Right (Transaction { witnessSet: TransactionWitnessSet ws }) -> do + Transaction { witnessSet: TransactionWitnessSet ws } -> do case ws.redeemers of Just [ r ] -> r `shouldEqual` redeemer Just _ -> throw "Incorrect number of redeemers attached" @@ -93,8 +89,7 @@ testAttachRedeemer = liftEffect $ do testAttachScript :: Language -> Aff Unit testAttachScript language = liftEffect $ attachPlutusScript script tx >>= case _ of - Left e -> throw $ "Failed to attach script: " <> show e - Right (Transaction { witnessSet: TransactionWitnessSet ws }) -> + Transaction { witnessSet: TransactionWitnessSet ws } -> case ws.plutusScripts of Just [ ps ] -> ps `shouldEqual` script Just _ -> throw "Incorrect number of scripts attached" @@ -119,7 +114,7 @@ testSetScriptDataHash = liftEffect $ do -- Verify the hash with some external tool byteArrayToHex sdh `shouldEqual` - "e371f3cfb7be11ad70a88072dabdddef06f656efdaa52da2f68b8df4cac01d3a" + "dde4d4f89151fdbcea51fa4e9edcac89d69febe036a4976b643c713c19b0cad1" where tx :: Transaction tx = mempty @@ -133,7 +128,7 @@ testSetScriptDataHash = liftEffect $ do testPreserveWitness :: Aff Unit testPreserveWitness = liftEffect $ do Transaction { witnessSet: TransactionWitnessSet { plutusData, vkeys } } <- - fromRightEff =<< attachDatum datum tx + attachDatum datum tx case plutusData /\ vkeys of Just [ pd ] /\ Just vs@[ _ ] -> do pd `shouldEqual` unwrap datum diff --git a/test/TxOutput.purs b/test/TxOutput.purs deleted file mode 100644 index f4effd84e..000000000 --- a/test/TxOutput.purs +++ /dev/null @@ -1,119 +0,0 @@ -module Test.Ctl.TxOutput (suite, main) where - -import Prelude - -import Aeson (decodeJsonString, printJsonDecodeError) -import Control.Monad.Error.Class (liftEither, liftMaybe, throwError) -import Ctl.Internal.Cardano.Types.Transaction (TransactionOutput) -import Ctl.Internal.QueryM.Ogmios as O -import Ctl.Internal.Test.TestPlanM (TestPlanM, interpret) -import Ctl.Internal.TxOutput (ogmiosTxOutToTransactionOutput) -import Ctl.Internal.Types.OutputDatum - ( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum) - ) -import Data.Bifunctor (bimap) -import Data.FoldableWithIndex (traverseWithIndex_) -import Data.Map as Map -import Data.Newtype (unwrap) -import Data.Tuple.Nested ((/\)) -import Data.UInt as UInt -import Effect (Effect) -import Effect.Aff (Aff, launchAff_) -import Effect.Class (liftEffect) -import Effect.Exception (error) -import Mote (group, test) -import Node.Encoding (Encoding(UTF8)) -import Node.FS.Sync (readTextFile) -import Node.Path (concat) - --- Run with `spago test --main Test.Ctl.TxOutput` -main :: Effect Unit -main = launchAff_ do - interpret suite - -suite :: TestPlanM (Aff Unit) Unit -suite = do - group "TxOutput ogmiosTxOutToTransactionOutput datums are correctly preserved" - $ test "Fixture #1" - $ liftEffect - $ loadQueryResultFixture >>= traverseWithIndex_ \input output -> do - check <- liftMaybe (error "Missing fixture check") - $ Map.lookup input fixtureChecks - output' <- liftMaybe (error "Failed to convert output") - $ ogmiosTxOutToTransactionOutput output - check output' - -loadQueryResultFixture - :: Effect O.UtxoQueryResult -loadQueryResultFixture = do - contents <- readTextFile UTF8 path - liftEither $ bimap - (error <<< printJsonDecodeError) - unwrap - (decodeJsonString contents :: _ O.UtxoQR) - where - path :: String - path = concat - [ "fixtures" - , "test" - , "ogmios" - , "utxo-681f7f01fe06ae75d83187cda28c376e.json" - ] - -expect :: TransactionOutput -> String -> String -> Effect Unit -expect to expected got = throwError $ error $ - "Expected " - <> expected - <> " but got " - <> got - <> ": " - <> show to - -hasInlineDatum :: TransactionOutput -> Effect Unit -hasInlineDatum to = to # unwrap >>> _.datum >>> case _ of - OutputDatum _ -> pure unit - OutputDatumHash _ -> expect to "inline datum" "datum" - NoOutputDatum -> expect to "inline datum" "no datum" - -hasDatum :: TransactionOutput -> Effect Unit -hasDatum to = to # unwrap >>> _.datum >>> case _ of - OutputDatumHash _ -> pure unit - NoOutputDatum -> expect to "datum" "no datum" - OutputDatum _ -> expect to "datum" "inline datum" - -hasNoDatum :: TransactionOutput -> Effect Unit -hasNoDatum to = to # unwrap >>> _.datum >>> case _ of - NoOutputDatum -> pure unit - OutputDatum _ -> expect to "no datum" "inline datum" - OutputDatumHash _ -> expect to "no datum" "datum" - -fixtureChecks :: Map.Map O.OgmiosTxOutRef (TransactionOutput -> Effect Unit) -fixtureChecks = Map.fromFoldable - [ { "txId": "2208e439244a1d0ef238352e3693098aba9de9dd0154f9056551636c8ed15dc1" - , "index": UInt.fromInt 6 - } /\ hasDatum - , { "txId": "4f539156bfbefc070a3b61cad3d1cedab3050e2b2a62f0ffe16a43eb0edc1ce8" - , "index": UInt.fromInt 2 - } /\ hasDatum - , { "txId": "e88bd757ad5b9bedf372d8d3f0cf6c962a469db61a265f6418e1ffed86da29ec" - , "index": UInt.fromInt 4 - } /\ hasDatum - , { "txId": "ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25" - , "index": UInt.fromInt 7 - } /\ hasInlineDatum - , { "txId": "e88bd757ad5b9bedf372d8d3f0cf6c962a469db61a265f6418e1ffed86da29ec" - , "index": UInt.fromInt 5 - } /\ hasInlineDatum - , { "txId": "0268be9dbd0446eaa217e1dec8f399249305e551d7fc1437dd84521f74aa621c" - , "index": UInt.fromInt 6 - } /\ hasInlineDatum - , { "txId": "bb30a42c1e62f0afda5f0a4e8a562f7a13a24cea00ee81917b86b89e801314aa" - , "index": UInt.fromInt 5 - } /\ hasNoDatum - , { "txId": "bfa726c3c149165b108e6ff550cb1a1c4f0fdc2e9f26a9a16f48babe73b600ce" - , "index": UInt.fromInt 4 - } /\ hasNoDatum - , { "txId": "0268be9dbd0446eaa217e1dec8f399249305e551d7fc1437dd84521f74aa621c" - , "index": UInt.fromInt 7 - } /\ hasNoDatum - ] diff --git a/test/Types/Interval.purs b/test/Types/Interval.purs index c06af813e..3ec7e5b9c 100644 --- a/test/Types/Interval.purs +++ b/test/Types/Interval.purs @@ -33,13 +33,13 @@ import Ctl.Internal.Types.Interval ) import Ctl.Internal.Types.SystemStart (SystemStart) import Data.Bifunctor (lmap) -import Data.BigInt (fromInt, fromString) as BigInt import Data.Either (Either(Left, Right), either) import Data.Maybe (fromJust) import Data.Newtype (unwrap) import Data.Traversable (traverse_) import Effect (Effect) import Effect.Exception (error) +import JS.BigInt (fromInt, fromString) as BigInt import Mote (group, test) import Node.Encoding (Encoding(UTF8)) import Node.FS.Sync (readTextFile) @@ -84,14 +84,18 @@ loadOgmiosFixture query hash = do -- newly generated fixtures are stored in source control, i.e. git. eraSummariesFixture :: Effect EraSummaries -eraSummariesFixture = - (unwrap :: OgmiosEraSummaries -> EraSummaries) <$> - loadOgmiosFixture "eraSummaries" "bbf8b1d7d2487e750104ec2b5a31fa86" +eraSummariesFixture = do + { result } :: { result :: OgmiosEraSummaries } <- loadOgmiosFixture + "queryLedgerState-eraSummaries" + "d8b19110b9580cddfa3895eea34c2139" + pure $ unwrap result systemStartFixture :: Effect SystemStart -systemStartFixture = - (unwrap :: OgmiosSystemStart -> SystemStart) <$> - loadOgmiosFixture "systemStart" "ed0caad81f6936e0c122ef6f3c7de5e8" +systemStartFixture = do + { result } :: { result :: OgmiosSystemStart } <- loadOgmiosFixture + "queryNetwork-startTime" + "02fa6f9e7ed04ebfe3294c7648be54d5" + pure $ unwrap result testPosixTimeToSlot :: EraSummaries -> SystemStart -> Effect Unit testPosixTimeToSlot eraSummaries sysStart = do @@ -141,21 +145,21 @@ testPosixTimeToSlot eraSummaries sysStart = do -- Notice also how 93312000 - 92880000 is a relatively small period of -- time so I expect this will change to `null` once things stabilise. posixTimes = mkPosixTime <$> - [ "1603636353000" - , "1613636755000" + [ "1678100000000" + , "1698191999000" ] traverse_ (idTest eraSummaries sysStart identity) posixTimes -- With Milliseconds, we generally round down, provided the aren't at the -- end with non-zero excess: idTest eraSummaries sysStart - (const $ mkPosixTime "1613636754000") - (mkPosixTime "1613636754999") + (const $ mkPosixTime "1666656000000") + (mkPosixTime "1666656000999") idTest eraSummaries sysStart - (const $ mkPosixTime "1613636754000") - (mkPosixTime "1613636754500") + (const $ mkPosixTime "1666656000000") + (mkPosixTime "1666656000500") idTest eraSummaries sysStart - (const $ mkPosixTime "1613636754000") - (mkPosixTime "1613636754499") + (const $ mkPosixTime "1666656000000") + (mkPosixTime "1666656000499") where idTest :: EraSummaries @@ -164,12 +168,11 @@ testPosixTimeToSlot eraSummaries sysStart = do -> POSIXTime -> Effect Unit idTest es ss transf posixTime = do - posixTimeToSlot es ss posixTime >>= case _ of + case posixTimeToSlot es ss posixTime of Left err -> throwError $ error $ show err Right slot -> do - ePosixTime <- slotToPosixTime es ss slot either (throwError <<< error <<< show) (shouldEqual $ transf posixTime) - ePosixTime + $ slotToPosixTime es ss slot testSlotToPosixTime :: EraSummaries -> SystemStart -> Effect Unit testSlotToPosixTime eraSummaries sysStart = do @@ -177,10 +180,11 @@ testSlotToPosixTime eraSummaries sysStart = do -- how far into the future we test with slots when a hardfork occurs. let slots = mkSlot <$> - [ 58278567 - , 48272312 - , 39270783 + [ 31535999 + , 31535000 , 957323 + , 259200 + , 258200 , 34952 , 7532 , 232 @@ -190,11 +194,11 @@ testSlotToPosixTime eraSummaries sysStart = do where idTest :: EraSummaries -> SystemStart -> Slot -> Effect Unit idTest es ss slot = do - slotToPosixTime es ss slot >>= case _ of + case slotToPosixTime es ss slot of Left err -> throwError $ error $ show err Right posixTime -> do - eSlot <- posixTimeToSlot es ss posixTime - either (throwError <<< error <<< show) (shouldEqual slot) eSlot + either (throwError <<< error <<< show) (shouldEqual slot) + $ posixTimeToSlot es ss posixTime mkSlot :: Int -> Slot mkSlot = Slot <<< BigNum.fromInt @@ -215,7 +219,7 @@ testPosixTimeToSlotError eraSummaries sysStart = do -> PosixTimeToSlotError -> Effect Unit errTest es ss posixTime expectedErr = do - posixTimeToSlot es ss posixTime >>= case _ of + case posixTimeToSlot es ss posixTime of Left err -> err `shouldEqual` expectedErr Right _ -> throwError $ error $ "Test should have failed giving: " <> show diff --git a/test/Unit.purs b/test/Unit.purs index 858b9ce11..a1b7daf91 100644 --- a/test/Unit.purs +++ b/test/Unit.purs @@ -12,7 +12,6 @@ import Effect.Aff (Aff, cancelWith, effectCanceler, launchAff) import Effect.Class (liftEffect) import Mote.Monad (mapTest) import Test.Ctl.ApplyArgs as ApplyArgs -import Test.Ctl.Base64 as Base64 import Test.Ctl.Blockfrost.Aeson.Suite as Blockfrost.Aeson import Test.Ctl.Blockfrost.ProtocolParameters as Blockfrost.ProtocolParameters import Test.Ctl.ByteArray as ByteArray @@ -31,19 +30,18 @@ import Test.Ctl.NativeScript as NativeScript import Test.Ctl.Ogmios.Address as Ogmios.Address import Test.Ctl.Ogmios.Aeson as Ogmios.Aeson import Test.Ctl.Ogmios.EvaluateTx as Ogmios.EvaluateTx -import Test.Ctl.Parser as Parser import Test.Ctl.Partition as Partition import Test.Ctl.ProtocolParams as ProtocolParams import Test.Ctl.Serialization as Serialization import Test.Ctl.Serialization.Address as Serialization.Address import Test.Ctl.Serialization.Hash as Serialization.Hash import Test.Ctl.Transaction as Transaction -import Test.Ctl.TxOutput as TxOutput import Test.Ctl.Types.Interval as Types.Interval import Test.Ctl.Types.Ipv6 as Ipv6 import Test.Ctl.Types.TokenName as Types.TokenName import Test.Ctl.Types.Transaction as Types.Transaction import Test.Ctl.UsedTxOuts as UsedTxOuts +import Test.Ctl.Wallet.Bip32 as Bip32 import Test.Ctl.Wallet.Cip30.SignData as Cip30SignData import Test.Spec.Runner (defaultConfig) @@ -60,14 +58,13 @@ testPlan = do ApplyArgs.suite Ipv6.suite NativeScript.suite - Base64.suite + Bip32.suite ByteArray.suite Cip25.suite Cip30SignData.suite Data.suite Deserialization.suite Hashing.suite - Parser.suite Partition.suite Plutus.Conversion.Address.suite Plutus.Conversion.Value.suite @@ -76,7 +73,6 @@ testPlan = do Serialization.Address.suite Serialization.Hash.suite Transaction.suite - TxOutput.suite UsedTxOuts.suite Ogmios.Address.suite Ogmios.Aeson.suite diff --git a/test/Utils.purs b/test/Utils.purs index 01278d474..fe5040630 100644 --- a/test/Utils.purs +++ b/test/Utils.purs @@ -1,6 +1,5 @@ module Test.Ctl.Utils - ( ValidationM(ValidationM) - , aesonRoundTrip + ( aesonRoundTrip , assertTrue , assertTrue_ , errEither @@ -9,7 +8,6 @@ module Test.Ctl.Utils , measure' , measureWithTimeout , readAeson - , runValidationM , toFromAesonTest , toFromAesonTestWith ) where @@ -25,23 +23,10 @@ import Aeson , encodeAeson , parseJsonStringToAeson ) -import Control.Alt (class Alt) -import Control.Alternative (class Alternative) -import Control.Monad.Error.Class - ( class MonadError - , class MonadThrow - , throwError - ) -import Control.Monad.Except.Trans (ExceptT, runExceptT) -import Control.MonadPlus (class MonadPlus) -import Control.MonadZero (class MonadZero) -import Control.Plus (class Plus) import Ctl.Internal.Test.TestPlanM (TestPlanM) import Data.DateTime.Instant (unInstant) -import Data.Either (Either(Left, Right), either) -import Data.Identity (Identity(Identity)) +import Data.Either (Either(Right), either) import Data.Maybe (Maybe(Just, Nothing), maybe) -import Data.Medea (ValidationError(EmptyError)) import Data.Newtype (unwrap, wrap) import Data.Time.Duration (class Duration, Milliseconds, Seconds) import Data.Time.Duration (fromDuration, toDuration) as Duration @@ -56,42 +41,6 @@ import Node.FS.Sync (readTextFile) import Node.Path (FilePath) import Test.Spec.Assertions (shouldEqual) --- this silly thing is needed because Medea's `validate` needs both --- MonadPlus and MonadError, there must be a better way --- or it should be upstreamed to medea-ps as a default -newtype ValidationM a = ValidationM (ExceptT ValidationError Identity a) - -derive newtype instance functorValidationM :: Functor ValidationM -derive newtype instance applyValidationM :: Apply ValidationM -derive newtype instance applicativeValidationM :: Applicative ValidationM -derive newtype instance bindValidationM :: Bind ValidationM -derive newtype instance monadValidationM :: Monad ValidationM -derive newtype instance monadThrowValidationM :: - MonadThrow ValidationError ValidationM - -derive newtype instance monadErrorValidationM :: - MonadError ValidationError ValidationM - --- note: MonadZero is being deprecated -derive newtype instance monadZeroValidationM :: MonadZero ValidationM -derive newtype instance monadPlusValidationM :: MonadPlus ValidationM -instance altValidationM :: Alt ValidationM where - alt (ValidationM first) (ValidationM second) = case runExceptT first of - (Identity (Right a)) -> pure a - (Identity (Left _)) -> case runExceptT second of - (Identity (Right a)) -> pure a - (Identity (Left e)) -> throwError e - -instance plusValidationM :: Plus ValidationM where - empty = throwError EmptyError - -instance alternativeValidationM :: Alternative ValidationM - -runValidationM :: forall (a :: Type). ValidationM a -> Either ValidationError a -runValidationM (ValidationM etvia) = do - let (Identity eva) = runExceptT etvia - eva - measure :: forall (m :: Type -> Type) (a :: Type). MonadEffect m => m a -> m a measure = measure' (Nothing :: Maybe Seconds) diff --git a/test/Utils/DrainWallets.purs b/test/Utils/DrainWallets.purs index c52521b21..6e61639c4 100644 --- a/test/Utils/DrainWallets.purs +++ b/test/Utils/DrainWallets.purs @@ -2,7 +2,6 @@ module Test.Ctl.Utils.DrainWallets (main) where import Prelude -import Contract.Address (getWalletAddresses, ownPaymentPubKeysHashes) import Contract.Config ( PrivatePaymentKeySource(PrivatePaymentKeyFile) , WalletSpec(UseKeys) @@ -10,8 +9,8 @@ import Contract.Config , mkCtlBackendParams , testnetConfig ) -import Contract.Monad (liftedE, runContract) -import Contract.ScriptLookups (ScriptLookups, mkUnbalancedTx, unspentOutputs) +import Contract.Monad (runContract) +import Contract.ScriptLookups (unspentOutputs) import Contract.Transaction ( awaitTxConfirmed , balanceTx @@ -19,8 +18,14 @@ import Contract.Transaction , submit ) import Contract.TxConstraints (mustBeSignedBy, mustSpendPubKeyOutput) +import Contract.UnbalancedTx (mkUnbalancedTx) import Contract.Utxos (utxosAt) -import Contract.Wallet (privateKeysToKeyWallet, withKeyWallet) +import Contract.Wallet + ( getWalletAddresses + , ownPaymentPubKeyHashes + , privateKeysToKeyWallet + , withKeyWallet + ) import Contract.Wallet.KeyFile ( privatePaymentKeyFromFile , privateStakeKeyFromFile @@ -88,7 +93,7 @@ run privateKey walletsDir = runContract config do do address <- getWalletAddresses >>= head >>> liftMaybe (error "no addresses") - pkh <- ownPaymentPubKeysHashes >>= head >>> liftMaybe (error "no PKH") + pkh <- ownPaymentPubKeyHashes >>= head >>> liftMaybe (error "no PKH") utxos <- utxosAt address pure { utxos @@ -115,10 +120,9 @@ run privateKey walletsDir = runContract config do <> foldMap (_.pkh >>> mustBeSignedBy) usedWallets lookups = unspentOutputs utxos - unbalancedTx <- liftedE $ mkUnbalancedTx (lookups :: ScriptLookups Void) - constraints + unbalancedTx <- mkUnbalancedTx lookups constraints - balancedTx <- liftedE $ balanceTx unbalancedTx + balancedTx <- balanceTx unbalancedTx balancedSignedTx <- Array.foldM (\tx wallet -> withKeyWallet wallet $ signTransaction tx) (wrap $ unwrap balancedTx) diff --git a/test/Wallet/Bip32.purs b/test/Wallet/Bip32.purs new file mode 100644 index 000000000..22e5e1ac1 --- /dev/null +++ b/test/Wallet/Bip32.purs @@ -0,0 +1,77 @@ +module Test.Ctl.Wallet.Bip32 + ( suite + ) where + +import Contract.Prelude + +import Contract.Wallet.Key + ( StakeKeyPresence(WithStakeKey) + , mkKeyWalletFromMnemonic + ) +import Ctl.Internal.Serialization.Address + ( NetworkId(MainnetId) + , addressFromBech32 + ) +import Ctl.Internal.Test.TestPlanM (TestPlanM) +import Ctl.Internal.Wallet.Key (KeyWallet(KeyWallet)) +import Data.Lens (_Left, preview) +import Data.UInt as UInt +import Effect.Aff (Aff) +import Mote (group, test) +import Test.Spec.Assertions (shouldEqual) + +suite :: TestPlanM (Aff Unit) Unit +suite = do + group "BIP32/BIP39/CIP1852 wallets" do + group "generates valid wallets for valid phrases" do + for_ accs \(accountIndex /\ addressIndex /\ addressStr) -> do + test + ( "Account index produces correct wallet (m/1852'/1815'/" + <> show accountIndex + <> "'/" + <> show addressIndex + <> ")" + ) + do + addressFromBech32 addressStr `shouldEqual` + hush + ( mkKeyWalletFromMnemonic phrase1 + { accountIndex: UInt.fromInt accountIndex + , addressIndex: UInt.fromInt addressIndex + } + WithStakeKey <#> + \(KeyWallet wallet) -> wallet.address MainnetId + ) + group "Invalid mnemonics" do + test "handles errors for invalid phrases" do + blush (mkKeyWalletFromMnemonic invalidPhrase zero WithStakeKey) + `shouldEqual` Just "Error: Invalid mnemonic" + blush (mkKeyWalletFromMnemonic invalidChecksum zero WithStakeKey) + `shouldEqual` Just "Error: Invalid mnemonic checksum" + where + blush = preview _Left + invalidPhrase = + "twelve twelve twelve twelve twelve twelve twelve twelve twelve twelve twelve" + invalidChecksum = + "twelve twelve twelve twelve twelve twelve twelve twelve twelve twelve twelve zebra" + phrase1 = + "what abstract myself forum setup leader series maximum home abuse shadow wreck inflict dust basket cycle involve quick abstract eagle staff town voyage raven" + -- these fixtures are from Eternl wallet + accs = + [ 0 /\ 0 /\ + "addr1q8day0u0gtx3302u5mmgmw20q67s9mkglte8y8kqk75jge5mvvhnhsjfj5jfpt7dv4tu6wlz7z032cmmp9ljftjmkzfswlmg44" + , 0 /\ 1 /\ + "addr1qyp2qjzpq6mg3yd4uxnfl40pr7z7l9fl64tuuce45e00ejumvvhnhsjfj5jfpt7dv4tu6wlz7z032cmmp9ljftjmkzfszpjxxa" + , 0 /\ 2 /\ + "addr1q94zxqrq57c8j05gdz2vq06gdejxlngpyezeyxask8w5j9umvvhnhsjfj5jfpt7dv4tu6wlz7z032cmmp9ljftjmkzfskqdfjm" + , 0 /\ 3 /\ + "addr1q8rpcfpamcdw3ldhz65st3sh2artdv0vtpqafelz9a0nt3umvvhnhsjfj5jfpt7dv4tu6wlz7z032cmmp9ljftjmkzfs7zugcf" + , 0 /\ 4 /\ + "addr1qyn58rgkzd9jlw8ay7hz34lwdaa0u8l2ww7qkxp2s08y88ymvvhnhsjfj5jfpt7dv4tu6wlz7z032cmmp9ljftjmkzfsx84jh7" + , 1 /\ 0 /\ + "addr1qyka9awkxtcm4py0yf9qnzdeh786zjqp6lt37purjrxtaju6w4gzwu7mms8sn7rd0apcwtyu2xjzflvm7sc5vd3vtvpq4xgxpq" + , 1 /\ 1 /\ + "addr1q9mmg8l2w7ar4cj89jte699dxuu0u3partkjt7fqdga5a7u6w4gzwu7mms8sn7rd0apcwtyu2xjzflvm7sc5vd3vtvpqnux32a" + , 1 /\ 2 /\ + "addr1q8eddt79d4nt3hazvjdwa3cy27nukxnvv0j5x7g28atn3ey6w4gzwu7mms8sn7rd0apcwtyu2xjzflvm7sc5vd3vtvpq66x2a8" + ] diff --git a/test/Wallet/Cip30/SignData.js b/test/Wallet/Cip30/SignData.js index 69ce9d44b..7d99800c5 100644 --- a/test/Wallet/Cip30/SignData.js +++ b/test/Wallet/Cip30/SignData.js @@ -2,14 +2,15 @@ let lib, csl; if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) { - lib = require("@emurgo/cardano-message-signing-browser"); - csl = require("@emurgo/cardano-serialization-lib-browser"); + lib = await import("@emurgo/cardano-message-signing-browser"); + csl = await import("@mlabs-haskell/cardano-serialization-lib-gc-browser"); } else { - lib = require("@emurgo/cardano-message-signing-nodejs"); - csl = require("@emurgo/cardano-serialization-lib-nodejs"); + lib = await import("@emurgo/cardano-message-signing-nodejs"); + csl = await import("@mlabs-haskell/cardano-serialization-lib-gc-nodejs"); } -lib = require("@mlabs-haskell/csl-gc-wrapper")(lib); -csl = require("@mlabs-haskell/csl-gc-wrapper")(csl); +// import gcWrapper from "@mlabs-haskell/csl-gc-wrapper"; +// lib = gcWrapper(lib); +// csl = gcWrapper(csl); function opt_chain(maybe, obj) { const isNothing = x => x === null || x === undefined; @@ -33,22 +34,26 @@ const fromBytes = name => bytes => () => { // ----------------------------------------------------------------------------- // verifySignature :: COSESign1 -> PublicKey -> CborBytes -> Effect Boolean -exports.verifySignature = coseSign1 => publicKey => sigStructBytes => () => { - const signature = csl.Ed25519Signature.from_bytes(coseSign1.signature()); - return publicKey.verify(sigStructBytes, signature); -}; +export function verifySignature(coseSign1) { + return publicKey => sigStructBytes => () => { + const signature = csl.Ed25519Signature.from_bytes(coseSign1.signature()); + return publicKey.verify(sigStructBytes, signature); + }; +} // ----------------------------------------------------------------------------- // COSESign1 // ----------------------------------------------------------------------------- // _fromBytesCoseSign1 :: CborBytes -> Effect COSESign1 -exports.fromBytesCoseSign1 = fromBytes("COSESign1"); +export const fromBytesCoseSign1 = fromBytes("COSESign1"); // getSignedData :: COSESign1 -> Effect CborBytes -exports.getSignedData = coseSign1 => () => { - return coseSign1.signed_data(null, null).to_bytes(); -}; +export function getSignedData(coseSign1) { + return () => { + return coseSign1.signed_data(null, null).to_bytes(); + }; +} // getCoseSign1ProtectedHeaders :: COSESign1 -> HeaderMap const getCoseSign1ProtectedHeaders = coseSign1 => { @@ -56,64 +61,86 @@ const getCoseSign1ProtectedHeaders = coseSign1 => { }; // getCoseSign1ProtectedHeaderAlg :: MaybeFfiHelper -> COSESign1 -> Maybe Int -exports._getCoseSign1ProtectedHeaderAlg = maybe => coseSign1 => { - const protectedHeaders = getCoseSign1ProtectedHeaders(coseSign1); - return opt_chain(maybe, protectedHeaders, "algorithm_id", "as_int", "as_i32"); -}; +export function _getCoseSign1ProtectedHeaderAlg(maybe) { + return coseSign1 => { + const protectedHeaders = getCoseSign1ProtectedHeaders(coseSign1); + return opt_chain( + maybe, + protectedHeaders, + "algorithm_id", + "as_int", + "as_i32" + ); + }; +} // _getCoseSign1ProtectedHeaderAddress // :: MaybeFfiHelper -> COSESign1 -> Maybe CborBytes -exports._getCoseSign1ProtectedHeaderAddress = maybe => coseSign1 => { - const protectedHeaders = getCoseSign1ProtectedHeaders(coseSign1); - const cborValue = protectedHeaders.header(lib.Label.new_text("address")); - return opt_chain(maybe, cborValue, "as_bytes"); -}; +export function _getCoseSign1ProtectedHeaderAddress(maybe) { + return coseSign1 => { + const protectedHeaders = getCoseSign1ProtectedHeaders(coseSign1); + const cborValue = protectedHeaders.header(lib.Label.new_text("address")); + return opt_chain(maybe, cborValue, "as_bytes"); + }; +} // _getCoseSign1ProtectedHeaderKid // :: MaybeFfiHelper -> COSESign1 -> Maybe RawBytes -exports._getCoseSign1ProtectedHeaderKid = maybe => coseSign1 => { - const protectedHeaders = getCoseSign1ProtectedHeaders(coseSign1); - return opt_chain(maybe, protectedHeaders, "key_id"); -}; +export function _getCoseSign1ProtectedHeaderKid(maybe) { + return coseSign1 => { + const protectedHeaders = getCoseSign1ProtectedHeaders(coseSign1); + return opt_chain(maybe, protectedHeaders, "key_id"); + }; +} // ----------------------------------------------------------------------------- // COSEKey // ----------------------------------------------------------------------------- // _fromBytesCoseKey :: CborBytes -> Effect COSEKey -exports.fromBytesCoseKey = fromBytes("COSEKey"); +export const fromBytesCoseKey = fromBytes("COSEKey"); // _getCoseKeyHeaderKty :: MaybeFfiHelper -> COSEKey -> Maybe Int -exports._getCoseKeyHeaderKty = maybe => coseKey => { - return opt_chain(maybe, coseKey.key_type(), "as_int", "as_i32"); -}; +export function _getCoseKeyHeaderKty(maybe) { + return coseKey => { + return opt_chain(maybe, coseKey.key_type(), "as_int", "as_i32"); + }; +} // _getCoseKeyHeaderAlg :: MaybeFfiHelper -> COSEKey -> Maybe Int -exports._getCoseKeyHeaderAlg = maybe => coseKey => { - return opt_chain(maybe, coseKey, "algorithm_id", "as_int", "as_i32"); -}; +export function _getCoseKeyHeaderAlg(maybe) { + return coseKey => { + return opt_chain(maybe, coseKey, "algorithm_id", "as_int", "as_i32"); + }; +} // _getCoseKeyHeaderCrv :: MaybeFfiHelper -> COSEKey -> Maybe Int -exports._getCoseKeyHeaderCrv = maybe => coseKey => { - const cborValue = coseKey.header( - lib.Label.new_int( - lib.Int.new_negative(lib.BigNum.from_str("1")) // crv (-1) - ) - ); - return opt_chain(maybe, cborValue, "as_int", "as_i32"); -}; +export function _getCoseKeyHeaderCrv(maybe) { + return coseKey => { + const cborValue = coseKey.header( + lib.Label.new_int( + lib.Int.new_negative(lib.BigNum.from_str("1")) // crv (-1) + ) + ); + return opt_chain(maybe, cborValue, "as_int", "as_i32"); + }; +} // _getCoseKeyHeaderX :: MaybeFfiHelper -> COSEKey -> Maybe RawBytes -exports._getCoseKeyHeaderX = maybe => coseKey => { - const cborValue = coseKey.header( - lib.Label.new_int( - lib.Int.new_negative(lib.BigNum.from_str("2")) // x (-2) - ) - ); - return opt_chain(maybe, cborValue, "as_bytes"); -}; +export function _getCoseKeyHeaderX(maybe) { + return coseKey => { + const cborValue = coseKey.header( + lib.Label.new_int( + lib.Int.new_negative(lib.BigNum.from_str("2")) // x (-2) + ) + ); + return opt_chain(maybe, cborValue, "as_bytes"); + }; +} // _getCoseKeyHeaderKid :: MaybeFfiHelper -> COSESign1 -> Maybe RawBytes -exports._getCoseKeyHeaderKid = maybe => coseKey => { - return opt_chain(maybe, coseKey, "key_id"); -}; +export function _getCoseKeyHeaderKid(maybe) { + return coseKey => { + return opt_chain(maybe, coseKey, "key_id"); + }; +} diff --git a/test/blockfrost-local.env b/test/blockfrost-local.env new file mode 100644 index 000000000..fb36806c2 --- /dev/null +++ b/test/blockfrost-local.env @@ -0,0 +1,24 @@ +# Blockfrost test suite configuration that uses self-hosted (local) Blockfrost +# deployment. +# +# This file specifies some environment variables that can be read by +# `executePlutipTestsWithBlockfrost` function to run contract tests using +# Blockfrost. +# +# See ../doc/blockfrost.md for info on how to set it up + +export BLOCKFROST_API_KEY= +export PRIVATE_PAYMENT_KEY_FILE= +export PRIVATE_STAKE_KEY_FILE= +export BACKUP_KEYS_DIR=./test-data/keys/ +export TX_CONFIRMATION_DELAY_SECONDS=30 + +export BLOCKFROST_PORT=3000 +export BLOCKFROST_HOST=127.0.0.1 +export BLOCKFROST_SECURE=false +export BLOCKFROST_PATH="" + +export OGMIOS_PORT=1337 +export OGMIOS_HOST=127.0.0.1 +export OGMIOS_SECURE=false +export OGMIOS_PATH="" diff --git a/test/blockfrost.env b/test/blockfrost.env index d53965fa3..546b49228 100644 --- a/test/blockfrost.env +++ b/test/blockfrost.env @@ -1,4 +1,4 @@ -# Blockfrost test suite configuration. +# Blockfrost test suite configuration that uses public Blockfrost SaaS instance. # # This file specifies some environment variables that can be read by # `executePlutipTestsWithBlockfrost` function to run plutip tests using diff --git a/test/e2e.env b/test/e2e.env index 9ffb8615f..7b8163794 100755 --- a/test/e2e.env +++ b/test/e2e.env @@ -31,7 +31,7 @@ nami:http://localhost:4008/?nami:OneShotMinting # Uncomment these to test with Blockfrost. -# Run `npm run e2e-browser` for instructions on how to set up the API key +# Run 'npm run e2e-browser' for instructions on how to set up the API key # nami:http://localhost:4008/?blockfrost-nami-preview:Schnorr # nami:http://localhost:4008/?blockfrost-nami-preview:ECDSA # nami:http://localhost:4008/?blockfrost-nami-preview:SignMultiple diff --git a/webpack.config.cjs b/webpack.config.cjs new file mode 100644 index 000000000..31f7f3ba7 --- /dev/null +++ b/webpack.config.cjs @@ -0,0 +1,116 @@ +"use strict"; + +const path = require("path"); +const webpack = require("webpack"); +const NodePolyfillPlugin = require("node-polyfill-webpack-plugin"); + +const isBrowser = !!process.env.BROWSER_RUNTIME; + +module.exports = env => { + const config = { + mode: "development", + experiments: { + asyncWebAssembly: false, + layers: false, + lazyCompilation: false, + outputModule: true, + syncWebAssembly: true, + topLevelAwait: true + }, + + devtool: "eval-source-map", + + stats: { errorDetails: true }, + + devServer: { + static: { + directory: path.join(__dirname, "dist") + }, + client: { + overlay: false + }, + port: 4008, + proxy: { + "/kupo": { + // `KUPO_HOST` env variable must be set to the base URL of the Kupo + // service, otherwise all requests to Kupo will fail. + target: process.env.KUPO_HOST || "http://localhost:1442", + changeOrigin: true, + pathRewrite: { "^/kupo": "" } + } + } + }, + + entry: env.entry, + + output: { + path: path.resolve(__dirname, "dist"), + filename: "index.js", + library: { + type: "module" + } + }, + + resolve: { + // We use node_modules provided by Nix shell via an environment variable + modules: [process.env.NODE_PATH], + extensions: [".js"] + }, + + plugins: [ + new webpack.DefinePlugin({ + BROWSER_RUNTIME: isBrowser + }), + new webpack.LoaderOptionsPlugin({ + debug: true + }), + // ContextReplacementPlugin is used just to suppress a webpack warning: + // "Critical dependency: the request of a dependency is an expression" + // See https://stackoverflow.com/a/59235546/17365145 + new webpack.ContextReplacementPlugin(/cardano-serialization-lib-browser/), + new webpack.ContextReplacementPlugin(/cardano-serialization-lib-nodejs/) + ] + }; + + config.target = isBrowser ? "web" : "node18"; + config.node = isBrowser ? {} : { __dirname: true }; + config.resolve.fallback = isBrowser + ? { + buffer: require.resolve("buffer/"), + http: false, + url: false, + stream: false, + crypto: false, + https: false, + net: false, + tls: false, + zlib: false, + os: false, + path: false, + fs: false, + readline: false, + child_process: false + } + : {}; + + // Preserves console.log calls in NodeJS + // https://stackoverflow.com/a/71024096/17365145 + config.optimization = isBrowser + ? {} + : { + minimize: false + }; + + if (isBrowser) { + // Provide top-level `Buffer` + config.plugins.push( + new webpack.ProvidePlugin({ + Buffer: ["buffer", "Buffer"] + }) + ); + // Provide NodeJS polyfills + config.plugins.push(new NodePolyfillPlugin()); + } + + return config; +}; diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index e29b5b2df..000000000 --- a/webpack.config.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; - -const path = require("path"); -const webpack = require("webpack"); -const HtmlWebpackPlugin = require("html-webpack-plugin"); -const NodePolyfillPlugin = require("node-polyfill-webpack-plugin"); - -module.exports = { - mode: "development", - - experiments: { - asyncWebAssembly: false, - layers: false, - lazyCompilation: false, - outputModule: true, - syncWebAssembly: true, - topLevelAwait: true, - }, - - devtool: "eval-source-map", - - stats: { errorDetails: true }, - - devServer: { - port: 4008, - proxy: { - "/kupo": { - // `KUPO_HOST` env variable must be set to the base URL of the Kupo - // service, otherwise all requests to Kupo will fail. - target: process.env.KUPO_HOST || "http://localhost:1442", - changeOrigin: true, - pathRewrite: { "^/kupo": "" }, - }, - }, - }, - - // we can add more entrypoints as needed - entry: "./examples/index.js", - - output: { - path: path.resolve(__dirname, "dist"), - filename: "bundle.js", - }, - - module: { - rules: [ - { - test: /\.(png|jpg|gif)$/i, - type: "asset", - }, - { - test: /\.plutus$/i, - type: "asset/source", - }, - ], - }, - - resolve: { - modules: [process.env.NODE_PATH], - extensions: [".js"], - fallback: { - buffer: require.resolve("buffer/"), - http: false, - url: false, - stream: false, - crypto: false, - https: false, - net: false, - tls: false, - zlib: false, - os: false, - path: false, - fs: false, - readline: false, - child_process: false, - }, - alias: { - // You should update this path to the location of your compiled scripts, - // relative to `webpack.config.js` - Scripts: path.resolve(__dirname, "fixtures/scripts"), - }, - }, - - plugins: [ - new webpack.DefinePlugin({ - BROWSER_RUNTIME: !!process.env.BROWSER_RUNTIME, - }), - new NodePolyfillPlugin(), - new webpack.LoaderOptionsPlugin({ - debug: true, - }), - new HtmlWebpackPlugin({ - title: "cardano-transaction-lib-examples", - template: "./examples/index.html", - inject: false, // See stackoverflow.com/a/38292765/3067181 - }), - new webpack.ProvidePlugin({ - Buffer: ["buffer", "Buffer"], - }), - new webpack.ContextReplacementPlugin(/cardano-serialization-lib-browser/), - new webpack.ContextReplacementPlugin(/cardano-serialization-lib-nodejs/), - ], -};